|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 241048 (0x3ad98) Types: TextFile Notes: R1k Text-file segment
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000 └─⟦5a81ac88f⟧ »Space Info Vol 1« └─⟦a7b39883d⟧ └─⟦this⟧
%LSAMODULE: requirement_1, requirement_2, requirement_3, requirement_4, requirement_5, requirement_6, requirement_7, requirement_8, requirement_9; ENDANNOTATION_TYPES ANNOTATION requirement_1 : string; requirement_2 : string; requirement_3 : string; requirement_4 : string; requirement_5 : string; requirement_6 : string; requirement_7 : string; requirement_8 : string; requirement_9 : string; END-- -- This script returns an output file describing the files associated to -- the specified model. -- outfile : output; root : Tmodule; -- feature (Tmodule) associated () is local sons : set [Tmodule]; son : Tmodule; do outfile.fprint_f ("%s ", current.bodyf); if current.is_valued ("description") then outfile.fprint_f ("%s ", current.descf); end; sons := current.sons; for son in sons do son.associated; end; end; -- outfile.create ("**OUTPUT**"); outfile.open_write; root := modelc_load ("**MODEL**", "**ANNOTATIONS**", "**ANNOTATION_TYPES**", "M", false); root.associated; outfile.fprint_f ("\n"); outfile.close; -- -- This script returns an output file describing the hierarchy of the -- specified model. The syntax of this file is as follows: -- -- A -- model identifier -- M -- A's node number -- ... -- A's comments -- ... -- requirements 1 to 9 for A -- 2 -- number of sons of A -- B -- identifier of A's first son -- M1 -- B's node number -- ... -- B's comments -- ... -- requirements 1 to 9 for B -- 0 -- number of sons of B -- C -- identifier of A's second son -- M2 -- C's node number -- ... -- C's comments -- ... -- requirements 1 to 9 for C -- 1 -- number of sons of C -- D -- identifier of C's unique son -- M21 -- D's node number -- ... -- D's comments -- ... -- requirements 1 to 9 for D -- 0 -- number of sons of D -- -- This syntax has been chosen to make sure that we can parse the module -- identifiers even if they contain funny characters. This information -- will be used to create the following gateway structure: -- -- A -- .B -- .C -- .D -- outfile : output; root : Tmodule; -- feature (Tmodule) annotation (s : string) is local do if current.is_valued (s) then outfile.fprint_f ("%s\n", current.stgann (s)); else outfile.fprint_f ("\n"); end; end; -- feature (Tmodule) hierarchy () is local sons : set [Tmodule]; son : Tmodule; do outfile.fprint_f ("%s\n", current.ident); outfile.fprint_f ("%s\n", current.node); outfile.fprint_f ("%s\n", current.comment); current.annotation ("requirement_1"); current.annotation ("requirement_2"); current.annotation ("requirement_3"); current.annotation ("requirement_4"); current.annotation ("requirement_5"); current.annotation ("requirement_6"); current.annotation ("requirement_7"); current.annotation ("requirement_8"); current.annotation ("requirement_9"); sons := current.sons; outfile.fprint_f ("%d\n", sons.card); for son in sons do son.hierarchy; end; end; -- outfile.create ("**OUTPUT**"); outfile.open_write; root := modelc_load ("**MODEL**", "**ANNOTATIONS**", "**ANNOTATION_TYPES**", "M", false); root.hierarchy; outfile.close; class ASA_MODEL (4668792) is type EDIT_ACTION (1) is (WS_ONLY, WS_ELSE_LOCAL, WS_ELSE_MESSAGE, LOCAL, MESSAGE_ONLY); PARENT_NAME : STRING (editable); CONNECTED : BOOLEAN (editable; default => TRUE); ACTIVATION.SERVER_NAME : STRING (constant; non_display; default => """!Projects.Asa_Integration.Gateways'Spec_View.Units"".Asa_Integration_Server"); CREATE.DIRECTORY_SUBCLASS : STRING (constant; non_display; default => "Diagram"); CREATE.INITIAL_SUBOBJECTS : STRING (constant; non_display; default => ""); EDIT.BANNER : STRING (constant; non_display; default => "Text"); EDIT.HEADER : STRING (constant; non_display; default => ""); EDIT.OBJECT : STRING (constant; non_display; default => "Null"); EDIT.WS_MESSAGE_TEXT : STRING (constant; non_display; default => ""); EDIT.MESSAGE_TEXT : STRING (constant; non_display; default => ""); EDIT.DISPLAY_ACTION : EDIT_ACTION (non_display; default => WS_ONLY); DATA.CONTEXT : STRING (editable; default => ""); DATA.HOST : STRING (editable; default => ""); DATA.NAME : STRING (editable; default => ""); ASA.COMMENT : STRING (default => ""); ASA.DEPENDENTS_1 : STRING (non_display; default => ""); ASA.DEPENDENTS_2 : STRING (non_display; default => ""); ASA.DEPENDENTS_3 : STRING (non_display; default => ""); ASA.DEPENDENTS_4 : STRING (non_display; default => ""); ASA.DEPENDENTS_5 : STRING (non_display; default => ""); ASA.DEPENDENTS_6 : STRING (non_display; default => ""); ASA.DEPENDENTS_7 : STRING (non_display; default => ""); ASA.DEPENDENTS_8 : STRING (non_display; default => ""); ASA.DEPENDENTS_9 : STRING (non_display; default => ""); ASA.ID : NATURAL (default => 1); ASA.LAST_ID : NATURAL (non_display; default => 0); ASA.LAST_REQUIREMENT_ID : NATURAL (non_display; default => 9); ASA.NODE_NUMBER : STRING (constant; default => "M"); ASA.REQUIREMENT_1 : STRING (editable; default => ""); ASA.REQUIREMENT_2 : STRING (editable; default => ""); ASA.REQUIREMENT_3 : STRING (editable; default => ""); ASA.REQUIREMENT_4 : STRING (editable; default => ""); ASA.REQUIREMENT_5 : STRING (editable; default => ""); ASA.REQUIREMENT_6 : STRING (editable; default => ""); ASA.REQUIREMENT_7 : STRING (editable; default => ""); ASA.REQUIREMENT_8 : STRING (editable; default => ""); ASA.REQUIREMENT_9 : STRING (editable; default => ""); ASA.UPDATE_TIME : DATE (non_display); IO.FORM_MAP : STRING (constant; non_display; default => "others => raise USE_ERROR;"); DISPATCH.MAP : STRING (non_display; constant; default => "Image_Name => External;" & "Build_Image => External;" & "Post_Commit => Not_Supported;" & "Semanticize => Not_Supported;" & "Complete => Not_Supported;" & "Edit => Not_Supported;" & "Definition => Default;" & "Enclosing => Not_Supported;" & "Elide => Not_Supported;" & "Expand => Not_Supported;" & "Undo => Not_Supported;" & "Redo => Not_Supported;" & "Promote => Not_Supported;" & "Demote => Not_Supported;" & "Format => Not_Supported;" & "Revert => Not_Supported;" & "Sort_Image => Not_Supported;" & "Delete => External;" & "Pre_Check_In => External;" & "Post_Check_In => Default;" & "Pre_Check_Out => Default;" & "Post_Check_Out => Default;" & "Pre_Cmvc_Copy => External;" & "Post_Cmvc_Copy => External;" & "Pre_Make_Controlled => External;" & "Output => Not_Supported;" & "Input => External;"); end ASA_MODELclass ASA_MODULE (4668791) is type EDIT_ACTION (1) is (WS_ONLY, WS_ELSE_LOCAL, WS_ELSE_MESSAGE, LOCAL, MESSAGE_ONLY); PARENT_NAME : STRING (editable); CONNECTED : BOOLEAN (editable; default => TRUE); CREATE.DIRECTORY_SUBCLASS : STRING (constant; non_display; default => "Diagram"); CREATE.INITIAL_SUBOBJECTS : STRING (constant; non_display; default => ""); EDIT.BANNER : STRING (constant; non_display; default => "Text"); EDIT.HEADER : STRING (constant; non_display; default => ""); EDIT.OBJECT : STRING (constant; non_display; default => "Null"); EDIT.WS_MESSAGE_TEXT : STRING (constant; non_display; default => ""); EDIT.MESSAGE_TEXT : STRING (constant; non_display; default => ""); EDIT.DISPLAY_ACTION : EDIT_ACTION (non_display; default => WS_ONLY); DATA.CONTEXT : STRING (constant; non_display; default => "<PARENT>"); DATA.HOST : STRING (constant; non_display; default => "<PARENT>"); DATA.NAME : STRING (constant; non_display; default => "<PARENT>"); ASA.COMMENT : STRING (default => ""); ASA.DEPENDENTS_1 : STRING (non_display; default => ""); ASA.DEPENDENTS_2 : STRING (non_display; default => ""); ASA.DEPENDENTS_3 : STRING (non_display; default => ""); ASA.DEPENDENTS_4 : STRING (non_display; default => ""); ASA.DEPENDENTS_5 : STRING (non_display; default => ""); ASA.DEPENDENTS_6 : STRING (non_display; default => ""); ASA.DEPENDENTS_7 : STRING (non_display; default => ""); ASA.DEPENDENTS_8 : STRING (non_display; default => ""); ASA.DEPENDENTS_9 : STRING (non_display; default => ""); ASA.ID : NATURAL (default => 1); ASA.LAST_REQUIREMENT_ID : NATURAL (non_display; default => 9); ASA.NODE_NUMBER : STRING (editable; default => ""); ASA.REQUIREMENT_1 : STRING (editable; default => ""); ASA.REQUIREMENT_2 : STRING (editable; default => ""); ASA.REQUIREMENT_3 : STRING (editable; default => ""); ASA.REQUIREMENT_4 : STRING (editable; default => ""); ASA.REQUIREMENT_5 : STRING (editable; default => ""); ASA.REQUIREMENT_6 : STRING (editable; default => ""); ASA.REQUIREMENT_7 : STRING (editable; default => ""); ASA.REQUIREMENT_8 : STRING (editable; default => ""); ASA.REQUIREMENT_9 : STRING (editable; default => ""); ASA.UPDATE_TIME : DATE (constant; non_display; default => "<PARENT>"); IO.FORM_MAP : STRING (constant; non_display; default => "others => raise USE_ERROR;"); DISPATCH.MAP : STRING (non_display; constant; default => "Image_Name => External;" & "Build_Image => External;" & "Post_Commit => Not_Supported;" & "Semanticize => Not_Supported;" & "Complete => Not_Supported;" & "Edit => Not_Supported;" & "Definition => Default;" & "Enclosing => Not_Supported;" & "Elide => Not_Supported;" & "Expand => Not_Supported;" & "Undo => Not_Supported;" & "Redo => Not_Supported;" & "Promote => Not_Supported;" & "Demote => Not_Supported;" & "Format => Not_Supported;" & "Revert => Not_Supported;" & "Sort_Image => Not_Supported;" & "Delete => External;" & "Pre_Check_In => External;" & "Post_Check_In => Default;" & "Pre_Check_Out => Default;" & "Post_Check_Out => Default;" & "Pre_Cmvc_Copy => Default;" & "Post_Cmvc_Copy => Default;" & "Pre_Make_Controlled => External;" & "Output => Not_Supported;" & "Input => External;"); end ASA_MODULE class ASA_REQUIREMENT (4668793) is type EDIT_ACTION (1) is (WS_ONLY, WS_ELSE_LOCAL, WS_ELSE_MESSAGE, LOCAL, MESSAGE_ONLY); type KIND (2) is (FUNCTIONAL, PERFORMANCE, EXTERNAL_INTERFACE, OPERATIONAL, RESOURCE, QUALIFICATION_TESTING, ACCEPTANCE_TESTING, DOCUMENTATION, QUALITY, SAFETY, RELIABILITY, MAINTAINABILITY, DEVELOPMENT_AND_VERIFICATION, DESIGN_AND_PROGRAMMING, REUSE_AND_COMMONALITY); PARENT_NAME : STRING (editable); CONNECTED : BOOLEAN (editable; default => TRUE); CREATE.DIRECTORY_SUBCLASS : STRING (constant; non_display; default => "Text"); CREATE.INITIAL_SUBOBJECTS : STRING (constant; non_display; default => ""); EDIT.ALLOW_EDIT : BOOLEAN (constant; non_display; default => TRUE); EDIT.BANNER : STRING (constant; non_display; default => "Text"); EDIT.HEADER : STRING (constant; non_display; default => ""); EDIT.OBJECT : STRING (constant; non_display; default => ""); EDIT.WS_MESSAGE_TEXT : STRING (constant; non_display; default => ""); EDIT.MESSAGE_TEXT : STRING (constant; non_display; default => ""); EDIT.DISPLAY_ACTION : EDIT_ACTION (non_display; default => LOCAL); DATA.CONTEXT : STRING (constant; non_display; default => "<PARENT>"); DATA.HOST : STRING (constant; non_display; default => "<PARENT>"); DATA.NAME : STRING (constant; non_display; default => "<PARENT>"); ASA.DEPENDENTS : STRING (non_display; default => ""); ASA.ID : NATURAL (default => 1); ASA.REQUIREMENT_KIND : KIND (default => PERFORMANCE); ASA.REQUIREMENT_TEXT : STRING (editable; default => ""); ASA.UPDATE_TIME : DATE (constant; non_display; default => "<PARENT>"); IO.FORM_MAP : STRING (constant; non_display; default => "Io_Open (Input) => External;" & "Io_Read_Bytes (Input) => External;" & "Io_Read_String (Input) => External;" & "Io_End_Of_File (Input) => External;" & "Io_Reset (Input) => External;" & "Io_Close (Input) => External;" & "Io_Create => raise USE_ERROR;" & "Io_Delete => raise USE_ERROR;" & "Io_Write_Bytes => raise USE_ERROR;" & "Io_Write_String => raise USE_ERROR;" & "others => External;"); DISPATCH.MAP : STRING (non_display; constant; default => "Image_Name => External;" & "Build_Image => External;" & "Post_Commit => External;" & "Semanticize => Default;" & "Complete => Default;" & "Edit => External;" & "Definition => Default;" & "Enclosing => Default;" & "Elide => Default;" & "Expand => Default;" & "Undo => Default;" & "Redo => Default;" & "Promote => Default;" & "Demote => Default;" & "Format => Default;" & "Revert => Default;" & "Sort_Image => Default;" & "Delete => Default;" & "Pre_Check_In => Default;" & "Post_Check_In => Default;" & "Pre_Check_Out => Default;" & "Post_Check_Out => Default;" & "Pre_Cmvc_Copy => Default;" & "Post_Cmvc_Copy => Default;" & "Pre_Make_Controlled => Default;" & "Output => Default;" & "Input => Default;"); end ASA_REQUIREMENT procedure INSTALL (RESPONSE : in STRING := "<PROFILE>");with ARCHIVE; with ASA_DEFINITIONS; with DIRECTORY_TOOLS; with IO; with GATEWAY_CLASS; procedure INSTALL (RESPONSE : in STRING := "<PROFILE>") is PROCEDURE_NAME : constant STRING := "INSTALL"; package DNA renames DIRECTORY_TOOLS.NAMING; package DTO renames DIRECTORY_TOOLS; ACTIVATE_FILE : IO.FILE_TYPE; GATEWAY_CLASS_DEFINITIONS : constant STRING := DNA.FULL_NAME ("\" & PROCEDURE_NAME & "$$^$$'VIEW.UNITS.GATEWAY_DEFINITIONS"); GATEWAY_CLASSES : constant STRING := "!MACHINE.GATEWAY_CLASSES"; FILE_DEFINITIONS : constant STRING := DNA.FULL_NAME ("\" & PROCEDURE_NAME & "$$^$$'VIEW.UNITS.FILES"); begin for C in ASA_DEFINITIONS.GATEWAY_CLASS loop GATEWAY_CLASS.DEACTIVATE (GATEWAY_CLASS_NAME => ASA_DEFINITIONS.GATEWAY_CLASS'IMAGE (C), RESPONSE => RESPONSE); end loop; for C in ASA_DEFINITIONS.GATEWAY_CLASS loop ARCHIVE.COPY (OBJECTS => GATEWAY_CLASS_DEFINITIONS & '.' & ASA_DEFINITIONS.GATEWAY_CLASS'IMAGE (C), USE_PREFIX => GATEWAY_CLASSES & '.' & ASA_DEFINITIONS.GATEWAY_CLASS'IMAGE (C) & ".GATEWAY_DEFINITION", FOR_PREFIX => GATEWAY_CLASS_DEFINITIONS & '.' & ASA_DEFINITIONS.GATEWAY_CLASS'IMAGE (C), OPTIONS => "REPLACE", RESPONSE => RESPONSE); GATEWAY_CLASS.BUILD (GATEWAY_CLASS_DIRECTORY => GATEWAY_CLASSES & '.' & ASA_DEFINITIONS.GATEWAY_CLASS'IMAGE (C), GATEWAY_TEXT_DESCRIPTION => "GATEWAY_DEFINITION", GATEWAY_BINARY_DESCRIPTION => "GATEWAY_CLASS", RESPONSE => RESPONSE); end loop; for C in ASA_DEFINITIONS.GATEWAY_CLASS loop IO.CREATE (FILE => ACTIVATE_FILE, MODE => IO.OUT_FILE, NAME => GATEWAY_CLASSES & '.' & ASA_DEFINITIONS.GATEWAY_CLASS'IMAGE (C) & ".ACTIVATE_ON_BOOT"); IO.CLOSE (ACTIVATE_FILE); GATEWAY_CLASS.ACTIVATE (GATEWAY_CLASS_NAME => ASA_DEFINITIONS.GATEWAY_CLASS'IMAGE (C), RESPONSE => RESPONSE); end loop; ARCHIVE.COPY (OBJECTS => FILE_DEFINITIONS & ".@", USE_PREFIX => ASA_DEFINITIONS.MAIN_CLASS_DIRECTORY, FOR_PREFIX => FILE_DEFINITIONS, OPTIONS => "REPLACE", RESPONSE => RESPONSE); end INSTALL; with ACTION; with DEVICE_INDEPENDENT_IO; with DIRECTORY; with DTIA_CLIENT; with PROFILE; package ACTIONS is package DC renames DTIA_CLIENT; package MODEL is procedure IMAGE_NAME (HANDLE : DC.GATEWAY_HANDLE; VISIBLE : BOOLEAN; READ_ONLY : BOOLEAN; NO_IMAGE : out BOOLEAN; SHOW_PROPERTY_IMAGE : out BOOLEAN; ID : out DC.IMAGE_IDENTITY); procedure BUILD_IMAGE (HANDLE : DC.GATEWAY_HANDLE; VISIBLE : BOOLEAN; IN_PLACE : BOOLEAN; FIRST_TIME : BOOLEAN; READ_ONLY : in out BOOLEAN; IMAGE : DC.IMAGE_ID; NO_IMAGE : out BOOLEAN; UNDERLYING_OBJECT : out DIRECTORY.OBJECT); procedure PRE_CHECK_IN (HANDLE : DC.GATEWAY_HANDLE; SUBOBJECT : DIRECTORY.OBJECT; RESPONSE : PROFILE.RESPONSE_PROFILE; ACTION_ID : ACTION.ID; ERRORS : in out DC.ERROR_COUNTS); procedure PRE_MAKE_CONTROLLED (HANDLE : DC.GATEWAY_HANDLE; SUBOBJECT : DIRECTORY.OBJECT; SAVE_SOURCE : BOOLEAN; ALLOW_CONTROLLED : out BOOLEAN; RESPONSE : PROFILE.RESPONSE_PROFILE; ACTION_ID : ACTION.ID; ERRORS : in out DC.ERROR_COUNTS); procedure PRE_CMVC_COPY (HANDLE : DC.GATEWAY_HANDLE; SUBOBJECT : DIRECTORY.OBJECT; RELEASE : BOOLEAN; CONTROLLED : BOOLEAN; JOINED : BOOLEAN; SOURCE_VIEW : DIRECTORY.OBJECT; DESTINATION_VIEW : DIRECTORY.OBJECT; FIRST_CALL : BOOLEAN; DO_NOT_COPY : out BOOLEAN; RESPONSE : PROFILE.RESPONSE_PROFILE; ACTION_ID : ACTION.ID; ERRORS : in out DC.ERROR_COUNTS); procedure POST_CMVC_COPY (HANDLE : DC.GATEWAY_HANDLE; SUBOBJECT : DIRECTORY.OBJECT; SOURCE_OBJECT : DIRECTORY.OBJECT; RELEASE : BOOLEAN; CONTROLLED : BOOLEAN; JOINED : BOOLEAN; SOURCE_VIEW : DIRECTORY.OBJECT; DESTINATION_VIEW : DIRECTORY.OBJECT; FIRST_CALL : BOOLEAN; RESPONSE : PROFILE.RESPONSE_PROFILE; ACTION_ID : ACTION.ID; ERRORS : in out DC.ERROR_COUNTS); procedure TERMINATE_SERVER (REASON : in DC.TERMINATION_CONDITION); end MODEL; package MODULE is procedure IMAGE_NAME (HANDLE : DC.GATEWAY_HANDLE; VISIBLE : BOOLEAN; READ_ONLY : BOOLEAN; NO_IMAGE : out BOOLEAN; SHOW_PROPERTY_IMAGE : out BOOLEAN; ID : out DC.IMAGE_IDENTITY); procedure BUILD_IMAGE (HANDLE : DC.GATEWAY_HANDLE; VISIBLE : BOOLEAN; IN_PLACE : BOOLEAN; FIRST_TIME : BOOLEAN; READ_ONLY : in out BOOLEAN; IMAGE : DC.IMAGE_ID; NO_IMAGE : out BOOLEAN; UNDERLYING_OBJECT : out DIRECTORY.OBJECT); procedure PRE_CHECK_IN (HANDLE : DC.GATEWAY_HANDLE; SUBOBJECT : DIRECTORY.OBJECT; RESPONSE : PROFILE.RESPONSE_PROFILE; ACTION_ID : ACTION.ID; ERRORS : in out DC.ERROR_COUNTS); procedure PRE_MAKE_CONTROLLED (HANDLE : DC.GATEWAY_HANDLE; SUBOBJECT : DIRECTORY.OBJECT; SAVE_SOURCE : BOOLEAN; ALLOW_CONTROLLED : out BOOLEAN; RESPONSE : PROFILE.RESPONSE_PROFILE; ACTION_ID : ACTION.ID; ERRORS : in out DC.ERROR_COUNTS); end MODULE; package REQUIREMENT is procedure IMAGE_NAME (HANDLE : DC.GATEWAY_HANDLE; VISIBLE : BOOLEAN; READ_ONLY : BOOLEAN; NO_IMAGE : out BOOLEAN; SHOW_PROPERTY_IMAGE : out BOOLEAN; ID : out DC.IMAGE_IDENTITY); procedure BUILD_IMAGE (HANDLE : DC.GATEWAY_HANDLE; VISIBLE : BOOLEAN; IN_PLACE : BOOLEAN; FIRST_TIME : BOOLEAN; READ_ONLY : in out BOOLEAN; IMAGE : DC.IMAGE_ID; NO_IMAGE : out BOOLEAN; UNDERLYING_OBJECT : out DIRECTORY.OBJECT); procedure POST_COMMIT (HANDLE : DC.GATEWAY_HANDLE; IMAGE : DC.IMAGE_ID); procedure EDIT (HANDLE : DC.GATEWAY_HANDLE; IMAGE : DC.IMAGE_ID; S : DC.SELECTION; C : DC.CURSOR; VISIBLE : BOOLEAN; ALLOW_EDIT : out BOOLEAN); procedure IO_OPEN (FILE : in out DEVICE_INDEPENDENT_IO.FILE_TYPE; MODE : DEVICE_INDEPENDENT_IO.FILE_MODE; HANDLE : DC.GATEWAY_HANDLE; FORM : STRING; ACTION_ID : ACTION.ID); end REQUIREMENT; end ACTIONS;with ACTION; with ASA_DEFINITIONS; with CALENDAR; with DIRECTORY; with GATEWAY_OBJECT; with GATEWAYS; with HIERARCHY; with LOGGER; with OBJECT_CLASS; with PROFILE; with REMOTE_OPERATIONS; with SIMPLE_STATUS; with STRING_UTILITIES; with UNIX_DEFINITIONS; pragma ELABORATE (ASA_DEFINITIONS); package body ACTIONS is package ASAS renames ASA_DEFINITIONS.SWITCHES; package ASAP renames ASA_DEFINITIONS.PROPERTIES; package DIR renames DIRECTORY; package DNA renames DIRECTORY.NAMING; package GWO renames GATEWAY_OBJECT; package HCHY renames HIERARCHY; package RO renames REMOTE_OPERATIONS; package SS renames SIMPLE_STATUS; package SU renames STRING_UTILITIES; package UNIX renames UNIX_DEFINITIONS; -- -- The following task keeps this package elaborated as long as its -- STOP entry is not called. -- SWITCH_REGISTRATION : ASAS.REGISTER; DEFAULT_TIMEOUT : constant := 60.0; -- --------------------- -- ( ) Gateway utilities -- --------------------- function ROOT_OF (GATEWAY : in DIR.OBJECT; ACTION_ID : in ACTION.ID) return DIR.OBJECT is E : DIR.ERROR_STATUS; GATEWAY_DATA : DIR.STATISTICS.OBJECT_DATA; RESULT : DIR.OBJECT; use DIR; begin RESULT := GATEWAY; loop DIR.STATISTICS.GET_OBJECT_DATA (THE_OBJECT => RESULT, THE_DATA => GATEWAY_DATA, STATUS => E, ACTION_ID => ACTION_ID); exit when DIR.GET_CLASS (DIR.STATISTICS.OBJECT_PARENT (GATEWAY_DATA)) = OBJECT_CLASS.LIBRARY; RESULT := DIR.STATISTICS.OBJECT_PARENT (GATEWAY_DATA); end loop; return RESULT; end ROOT_OF; -- ------------ -- ( ) Currency -- ------------ procedure ACCEPT_CHANGES (GATEWAY_OBJECT : in DIR.OBJECT; IN_CONTEXT : in RO.CONTEXT; MODEL : in STRING; COMMENTS : in STRING; WORK_ORDER : in STRING; ACTION_ID : in ACTION.ID; HAS_DESTROYED_GATEWAY : out BOOLEAN) is BUILD_TIME : CALENDAR.TIME; ROOT_GATEWAY : DIR.OBJECT; ROOT_ITERATOR : HCHY.MODULE_ITERATOR; ROOT_MODULE : HCHY.MODULE; THE_STATE : GATEWAYS.STATE; begin -- -- Compute module hierarchy for the associated model. -- LOGGER.NOTE ("Building module hierarchy for model " & MODEL); HCHY.BUILD (MODEL => MODEL, IN_CONTEXT => IN_CONTEXT, ROOT => ROOT_MODULE, BUILD_TIME => BUILD_TIME); ROOT_ITERATOR := HCHY.MAKE (ROOT_MODULE); ROOT_GATEWAY := ROOT_OF (GATEWAY_OBJECT, ACTION_ID => ACTION_ID); GATEWAYS.INITIALIZE (THE_STATE => THE_STATE, ACTION_ID => ACTION_ID, WORK_ORDER => WORK_ORDER); -- -- Delete those gateways that no longer have corresponding -- modules. -- GATEWAYS.REDUCE (GATEWAY_NAME => DIR.NAMING.GET_FULL_NAME (ROOT_GATEWAY), CANDIDATE_MODULES => ROOT_ITERATOR, COMMENTS => COMMENTS, THE_STATE => THE_STATE); -- -- Create gateways for the new modules. -- GATEWAYS.AUGMENT (FOR_MODULE => ROOT_MODULE, IN_LIBRARY => DIR.NAMING.GET_FULL_NAME (DIR.CONTROL_POINT.ASSOCIATED_CONTROL_POINT (ROOT_GATEWAY)), HOST => RO.MACHINE (IN_CONTEXT), MODEL => MODEL, UPDATE_TIME => BUILD_TIME, COMMENTS => COMMENTS, THE_STATE => THE_STATE); GATEWAYS.FINALIZE (THE_STATE); HAS_DESTROYED_GATEWAY := DIR.NAMING.GET_FULL_NAME (GATEWAY_OBJECT) = '[' & DIR.ERROR_STATUS'IMAGE (DIR.VERSION_ERROR) & ']'; end ACCEPT_CHANGES; function IS_UP_TO_DATE (HANDLE : DC.GATEWAY_HANDLE; IN_CONTEXT : in RO.CONTEXT) return BOOLEAN is REMOTE_UPDATE_TIME : CALENDAR.TIME; S : SS.CONDITION; use CALENDAR; begin RO.UPDATE_TIME (OF_FILE => ASAP.DATA_CONTEXT (HANDLE) & UNIX.CONTEXT_SEPARATOR & ASAP.DATA_NAME (HANDLE), IN_CONTEXT => IN_CONTEXT, RESULT => REMOTE_UPDATE_TIME, STATUS => S, OPTIONS => ""); if SS.ERROR (S) then -- -- If the remote file does not exist, we assume that the -- gateway is up to date. -- return TRUE; end if; return REMOTE_UPDATE_TIME <= ASAP.ASA_UPDATE_TIME (HANDLE); end IS_UP_TO_DATE; -- --------------------- -- ( ) Command execution -- --------------------- procedure EXECUTE (COMMAND : in STRING; INTERACTIVE : in BOOLEAN; IN_CONTEXT : in RO.CONTEXT; TIMEOUT : in RO.COMMAND_TIMEOUT := DEFAULT_TIMEOUT) is -- -- Interactive commands do require the definition of the X Window -- display. Also, it is not necessary to log messages indicating -- what is going on during such commands. -- type STATE_RECORD is record null; end record; THE_DISPLAY : constant STRING := ASAS.REMOTE_DISPLAY; SETENV_DISPLAY : constant STRING := UNIX.SETENV & ' ' & UNIX.DISPLAY & ' ' & THE_DISPLAY; S : SS.CONDITION; THE_STATE : STATE_RECORD; procedure PROCESS_OUTPUT (TEXT : STRING; SEVERITY : PROFILE.MSG_KIND; STATE : in out STATE_RECORD; RESPONSE : in out RO.COMMAND_RESPONSE) is begin if INTERACTIVE then LOGGER.DEBUG (TEXT); else LOGGER.NOTE (TEXT); end if; RESPONSE := RO.NIL; end PROCESS_OUTPUT; procedure READ_INPUT (STATE : in out STATE_RECORD; BUFFER : out STRING; LAST : out NATURAL; RESPONSE : in out RO.COMMAND_RESPONSE) is begin LAST := 0; RESPONSE := RO.ABORT_COMMAND; LOGGER.ERROR ("Attempt to read input during command execution"); end READ_INPUT; procedure TIMEOUT_HANDLER (STATE : in out STATE_RECORD; RESPONSE : in out RO.COMMAND_RESPONSE) is begin RESPONSE := RO.ABORT_COMMAND; LOGGER.ERROR ("Timeout expired during command execution"); end TIMEOUT_HANDLER; procedure EXECUTE is new RO.EXECUTION_GENERIC (EXECUTION_STATE => STATE_RECORD, PROCESS_OUTPUT => PROCESS_OUTPUT, READ_INPUT => READ_INPUT, TIMEOUT_HANDLER => TIMEOUT_HANDLER); begin if INTERACTIVE then if THE_DISPLAY /= "" then LOGGER.DEBUG ("Executing command """ & SETENV_DISPLAY & '"'); EXECUTE (COMMAND => SETENV_DISPLAY, IN_CONTEXT => IN_CONTEXT, STATE => THE_STATE, STATUS => S, TIMEOUT => DEFAULT_TIMEOUT); LOGGER.STATUS (S, INTERACTIVE => TRUE); end if; end if; if INTERACTIVE then LOGGER.DEBUG ("Executing command """ & COMMAND & '"'); else LOGGER.NOTE ("Executing command """ & COMMAND & '"'); end if; EXECUTE (COMMAND => COMMAND, IN_CONTEXT => IN_CONTEXT, STATE => THE_STATE, STATUS => S, TIMEOUT => TIMEOUT); LOGGER.STATUS (S, INTERACTIVE => INTERACTIVE); end EXECUTE; -- ------------------ -- ( ) Image creation -- ------------------ function CHECK_WRITEABLE (H : in GWO.HANDLE) return SS.CONDITION is GATEWAY_OBJECT : constant DIR.OBJECT := GWO.DIRECTORY_OBJECT (H); GATEWAY_FULL_NAME : constant STRING := DNA.GET_FULL_NAME (GATEWAY_OBJECT); S : SS.CONDITION; THE_HANDLE : DC.GATEWAY_HANDLE := H; begin case GATEWAYS.CMVC_CONTROL (GATEWAY_FULL_NAME) is when GATEWAYS.NOT_CONTROLLED | GATEWAYS.CONTROLLED_CHECKED_OUT => if GWO.IS_MAIN_OBJECT_OPEN_FOR_UPDATE (H) then SS.INITIALIZE (S); else GWO.RE_OPEN_MAIN_OBJECT_FOR_UPDATE (THE_HANDLE, ERRORS => S); end if; return S; when GATEWAYS.CONTROLLED_CHECKED_IN => SS.CREATE_CONDITION (STATUS => S, ERROR_TYPE => "", MESSAGE => "Unable to obtain gateway object " & GATEWAY_FULL_NAME & "; it must be checked-out before it can be edited", SEVERITY => SS.PROBLEM); return S; end case; end CHECK_WRITEABLE; -- --------- -- ( ) Stubs -- --------- package body MODEL is separate; package body MODULE is separate; package body REQUIREMENT is separate; end ACTIONS;with ASAOPEN; with DEVICE_INDEPENDENT_IO; with JOB_SEGMENT; with GATEWAY_OBJECT; separate (ACTIONS) package body MODEL is package ASAC renames ASA_DEFINITIONS.COMMANDS; package DIIO renames DEVICE_INDEPENDENT_IO; ANNOTATIONS : constant STRING := ASA_DEFINITIONS.MAIN_CLASS_DIRECTORY & ".ANNOTATIONS"; ANNOTATION_TYPES : constant STRING := ASA_DEFINITIONS.MAIN_CLASS_DIRECTORY & ".ANNOTATION_TYPES"; ASSOCIATED : constant STRING := ASA_DEFINITIONS.MAIN_CLASS_DIRECTORY & ".ASSOCIATED"; procedure IMAGE_NAME (HANDLE : DC.GATEWAY_HANDLE; VISIBLE : BOOLEAN; READ_ONLY : BOOLEAN; NO_IMAGE : out BOOLEAN; SHOW_PROPERTY_IMAGE : out BOOLEAN; ID : out DC.IMAGE_IDENTITY) is GATEWAY_OBJECT : constant DIR.OBJECT := GWO.DIRECTORY_OBJECT (HANDLE); S : SS.CONDITION; begin SHOW_PROPERTY_IMAGE := FALSE; ID := (I1 => DIR.UNIQUE (GATEWAY_OBJECT), I2 => 0); NO_IMAGE := TRUE; if not READ_ONLY then S := CHECK_WRITEABLE (HANDLE); LOGGER.STATUS (S); end if; exception when PROFILE.ERROR => LOGGER.ERROR ("Image construction is quitting after errors", RAISE_ERROR => FALSE); end IMAGE_NAME; procedure BUILD_IMAGE (HANDLE : DC.GATEWAY_HANDLE; VISIBLE : BOOLEAN; IN_PLACE : BOOLEAN; FIRST_TIME : BOOLEAN; READ_ONLY : in out BOOLEAN; IMAGE : DC.IMAGE_ID; NO_IMAGE : out BOOLEAN; UNDERLYING_OBJECT : out DIRECTORY.OBJECT) is ACTION_ID : ACTION.ID; C : RO.CONTEXT; DIRECTORY_EXISTS : BOOLEAN; FILE_EXISTS : BOOLEAN; HAS_DESTROYED_GATEWAY : BOOLEAN; S : SS.CONDITION; GATEWAY_OBJECT : constant DIR.OBJECT := GWO.DIRECTORY_OBJECT (HANDLE); GATEWAY_FULL_NAME : constant STRING := DIR.NAMING.GET_FULL_NAME (GATEWAY_OBJECT); HOST : constant STRING := ASAP.DATA_HOST (HANDLE); MODEL : constant STRING := ASAP.DATA_CONTEXT (HANDLE) & UNIX.CONTEXT_SEPARATOR & ASAP.DATA_NAME (HANDLE); use GATEWAYS; begin NO_IMAGE := TRUE; UNDERLYING_OBJECT := GATEWAY_OBJECT; if not READ_ONLY then if SS.ERROR (CHECK_WRITEABLE (HANDLE)) then return; end if; end if; RO.ACQUIRE (A_CONTEXT => C, STATUS => S, MACHINE => HOST, INSTANCE => ASA_DEFINITIONS.ASA); LOGGER.STATUS (S, INTERACTIVE => TRUE); if not IS_UP_TO_DATE (HANDLE, IN_CONTEXT => C) then case ASAS.ACTION_WHEN_OUT_OF_DATE is when ASAS.ABANDON => LOGGER.NEGATIVE ("The gateway object " & GATEWAY_FULL_NAME & " may not be up-to-date. Use Asa.Accept_Changes " & "to update it"); when ASAS.ACCEPT_CHANGES => LOGGER.POSITIVE ("The gateway object " & GATEWAY_FULL_NAME & " may not be up-to-date. Changes are being accepted"); GWO.CLOSE (HANDLE, S); LOGGER.STATUS (S, INTERACTIVE => TRUE); ACTION_ID := ACTION.START; ACCEPT_CHANGES (GATEWAY_OBJECT => GATEWAY_OBJECT, IN_CONTEXT => C, MODEL => MODEL, COMMENTS => "Automatic Accept_Changes issued by " & "Build_Image from object " & GATEWAY_FULL_NAME, WORK_ORDER => "<DEFAULT>", ACTION_ID => ACTION_ID, HAS_DESTROYED_GATEWAY => HAS_DESTROYED_GATEWAY); ACTION.FINISH (THE_ACTION => ACTION_ID, DO_COMMIT => TRUE); if HAS_DESTROYED_GATEWAY then LOGGER.ERROR ("Gateway object " & GATEWAY_FULL_NAME & " has been destroyed while accepting changes. " & "Unable to create an image for it."); else GWO.OPEN_OBJECT (OBJECT => GATEWAY_FULL_NAME, SLOT => GWO.MAIN_SLOT, H => HANDLE, ERRORS => S); LOGGER.STATUS (S, INTERACTIVE => TRUE); end if; when ASAS.CONTINUE => LOGGER.WARNING ("The gateway object " & GATEWAY_FULL_NAME & " may not be up-to-date."); end case; end if; -- -- Before calling asaedit we check the existence of the file, -- because asaedit won't tell much it they do not exist. -- RO.FILE_EXISTS (THE_FILE => ASAP.DATA_CONTEXT (HANDLE), IN_CONTEXT => C, STATUS => S, EXISTS => DIRECTORY_EXISTS); LOGGER.STATUS (S); if DIRECTORY_EXISTS then if READ_ONLY then RO.FILE_EXISTS (THE_FILE => ASAP.DATA_CONTEXT (HANDLE) & UNIX.CONTEXT_SEPARATOR & ASAP.DATA_NAME (HANDLE), IN_CONTEXT => C, STATUS => S, EXISTS => FILE_EXISTS); LOGGER.STATUS (S); if not FILE_EXISTS then LOGGER.NEGATIVE ("Remote file " & ASAP.DATA_CONTEXT (HANDLE) & UNIX.CONTEXT_SEPARATOR & ASAP.DATA_NAME (HANDLE) & " does not exist"); end if; end if; else LOGGER.NEGATIVE ("Remote directory " & ASAP.DATA_CONTEXT (HANDLE) & " does not exist"); end if; declare REMOTE_ANNOTATIONS : constant STRING := UNIX.TEMPORARY_FILENAME (ASAC.ANNOTATIONS_EXTENSION); REMOTE_ANNOTATION_TYPES : constant STRING := UNIX.TEMPORARY_FILENAME (ASAC.ANNOTATION_TYPES_EXTENSION); ASAEDIT_COMMAND : constant STRING := ASAS.BIN_DIRECTORY (ASAP.DATA_HOST (HANDLE)) & UNIX.CONTEXT_SEPARATOR & ASAC.ASAEDIT & ' ' & ASAP.DATA_CONTEXT (HANDLE) & UNIX.CONTEXT_SEPARATOR & ASAP.DATA_NAME (HANDLE) & ' ' & ASAC.START_NODE & ' ' & ASAP.ASA_NODE_NUMBER (HANDLE) & ' ' & ASAC.NO_WARNINGS & ' ' & ASAC.ANNOTATIONS & ' ' & REMOTE_ANNOTATIONS & ' ' & ASAC.ANNOTATION_TYPES & ' ' & REMOTE_ANNOTATION_TYPES; RM_COMMAND : constant STRING := UNIX.REMOVE & ' ' & REMOTE_ANNOTATIONS & ' ' & REMOTE_ANNOTATION_TYPES; begin LOGGER.NOTE ("Copying file " & ANNOTATIONS & " to " & REMOTE_ANNOTATIONS); RO.PUT (FROM_FILE => ANNOTATIONS, TO_FILE => REMOTE_ANNOTATIONS, IN_CONTEXT => C, STATUS => S); LOGGER.STATUS (S, INTERACTIVE => TRUE); LOGGER.NOTE ("Copying file " & ANNOTATION_TYPES & " to " & REMOTE_ANNOTATION_TYPES); RO.PUT (FROM_FILE => ANNOTATION_TYPES, TO_FILE => REMOTE_ANNOTATION_TYPES, IN_CONTEXT => C, STATUS => S); LOGGER.STATUS (S, INTERACTIVE => TRUE); if READ_ONLY then EXECUTE (COMMAND => ASAEDIT_COMMAND & ' ' & ASAC.READ_ONLY & UNIX.COMMAND_SEPARATOR & RM_COMMAND, INTERACTIVE => TRUE, IN_CONTEXT => C, TIMEOUT => RO.WAIT_FOREVER); else EXECUTE (COMMAND => ASAEDIT_COMMAND & UNIX.COMMAND_SEPARATOR & RM_COMMAND, INTERACTIVE => TRUE, IN_CONTEXT => C, TIMEOUT => RO.WAIT_FOREVER); end if; end; RO.RELEASE (A_CONTEXT => C, STATUS => S); LOGGER.STATUS (S, INTERACTIVE => TRUE); exception when PROFILE.ERROR => LOGGER.ERROR ("Image construction is quitting after errors", RAISE_ERROR => FALSE); end BUILD_IMAGE; --[bug] -- Due to a bug in DISPATCH, the CMVC operations are called with an -- handle that it not open under the action used for the operation. -- To avoid locking problems, we immediately close the handle and -- reopen the same object with the appropriate action. However there -- is still an interesting issue: when the handle is reopen for the -- post operation (with a new action), a locking error may be -- detected, and the post operation may be called with a closed -- handle. We have to live with this... -- function REOPEN (HANDLE : in GWO.HANDLE; ACTION_ID : in ACTION.ID) return GWO.HANDLE is RESULT : GWO.HANDLE; S : SS.CONDITION; THE_OBJECT : constant DIR.OBJECT := GWO.DIRECTORY_OBJECT (HANDLE); begin GWO.CLOSE (HANDLE); GWO.OPEN_MAIN_OBJECT (OBJECT => THE_OBJECT, H => RESULT, UPDATE => FALSE, ACTION_ID => ACTION_ID, ERRORS => S); LOGGER.STATUS (S); return RESULT; end REOPEN; procedure PRE_CHECK_IN (HANDLE : DC.GATEWAY_HANDLE; SUBOBJECT : DIRECTORY.OBJECT; RESPONSE : PROFILE.RESPONSE_PROFILE; ACTION_ID : ACTION.ID; ERRORS : in out DC.ERROR_COUNTS) is THE_HANDLE : DC.GATEWAY_HANDLE := REOPEN (HANDLE, ACTION_ID); C : RO.CONTEXT; HAS_DESTROYED_GATEWAY : BOOLEAN; S : SS.CONDITION; THE_ACTION : ACTION.ID := ACTION_ID; GATEWAY_OBJECT : constant DIR.OBJECT := GWO.DIRECTORY_OBJECT (THE_HANDLE); GATEWAY_FULL_NAME : constant STRING := DIR.NAMING.GET_FULL_NAME (GATEWAY_OBJECT); HOST : constant STRING := ASAP.DATA_HOST (THE_HANDLE); MODEL : constant STRING := ASAP.DATA_CONTEXT (THE_HANDLE) & UNIX.CONTEXT_SEPARATOR & ASAP.DATA_NAME (THE_HANDLE); begin PROFILE.SET (RESPONSE); RO.ACQUIRE (A_CONTEXT => C, STATUS => S, MACHINE => HOST, INSTANCE => ASA_DEFINITIONS.ASA); LOGGER.STATUS (S, INTERACTIVE => TRUE); if not IS_UP_TO_DATE (THE_HANDLE, IN_CONTEXT => C) then LOGGER.POSITIVE ("Accepting changes from model " & MODEL); GWO.CLOSE (THE_HANDLE, S); LOGGER.STATUS (S, INTERACTIVE => TRUE); ACCEPT_CHANGES (GATEWAY_OBJECT => GATEWAY_OBJECT, IN_CONTEXT => C, MODEL => MODEL, COMMENTS => "Automatic Accept_Changes issued by " & "Check_In from object " & GATEWAY_FULL_NAME, WORK_ORDER => "<DEFAULT>", ACTION_ID => ACTION_ID, HAS_DESTROYED_GATEWAY => HAS_DESTROYED_GATEWAY); if HAS_DESTROYED_GATEWAY then LOGGER.WARNING ("The gateway object " & GATEWAY_FULL_NAME & " has been destroyed while accepting " & "changes. Cmvc.Check_In is unable to proceed"); ACTION.FINISH (THE_ACTION => THE_ACTION, DO_COMMIT => TRUE); ERRORS := (WARNINGS => 0, ERRORS => 0, FATAL => TRUE); return; end if; end if; RO.RELEASE (A_CONTEXT => C, STATUS => S); LOGGER.STATUS (S, INTERACTIVE => TRUE); ERRORS := (WARNINGS => 0, ERRORS => 0, FATAL => FALSE); exception when PROFILE.ERROR => ERRORS := (WARNINGS => 0, ERRORS => 1, FATAL => FALSE); end PRE_CHECK_IN; procedure PRE_CMVC_COPY (HANDLE : DC.GATEWAY_HANDLE; SUBOBJECT : DIRECTORY.OBJECT; RELEASE : BOOLEAN; CONTROLLED : BOOLEAN; JOINED : BOOLEAN; SOURCE_VIEW : DIRECTORY.OBJECT; DESTINATION_VIEW : DIRECTORY.OBJECT; FIRST_CALL : BOOLEAN; DO_NOT_COPY : out BOOLEAN; RESPONSE : PROFILE.RESPONSE_PROFILE; ACTION_ID : ACTION.ID; ERRORS : in out DC.ERROR_COUNTS) is THE_HANDLE : DC.GATEWAY_HANDLE := REOPEN (HANDLE, ACTION_ID); C : RO.CONTEXT; HAS_DESTROYED_GATEWAY : BOOLEAN; S : SS.CONDITION; THE_ACTION : ACTION.ID := ACTION_ID; GATEWAY_OBJECT : constant DIR.OBJECT := GWO.DIRECTORY_OBJECT (THE_HANDLE); GATEWAY_FULL_NAME : constant STRING := DIR.NAMING.GET_FULL_NAME (GATEWAY_OBJECT); HOST : constant STRING := ASAP.DATA_HOST (THE_HANDLE); MODEL : constant STRING := ASAP.DATA_CONTEXT (THE_HANDLE) & UNIX.CONTEXT_SEPARATOR & ASAP.DATA_NAME (THE_HANDLE); begin PROFILE.SET (RESPONSE); RO.ACQUIRE (A_CONTEXT => C, STATUS => S, MACHINE => HOST, INSTANCE => ASA_DEFINITIONS.ASA); LOGGER.STATUS (S, INTERACTIVE => TRUE); if not IS_UP_TO_DATE (THE_HANDLE, IN_CONTEXT => C) then LOGGER.POSITIVE ("Accepting changes from model " & MODEL); GWO.CLOSE (THE_HANDLE, S); LOGGER.STATUS (S, INTERACTIVE => TRUE); ACCEPT_CHANGES (GATEWAY_OBJECT => GATEWAY_OBJECT, IN_CONTEXT => C, MODEL => MODEL, COMMENTS => "Automatic Accept_Changes issued by " & "view copy" & GATEWAY_FULL_NAME, WORK_ORDER => "<DEFAULT>", ACTION_ID => ACTION_ID, HAS_DESTROYED_GATEWAY => HAS_DESTROYED_GATEWAY); end if; RO.RELEASE (A_CONTEXT => C, STATUS => S); LOGGER.STATUS (S, INTERACTIVE => TRUE); ERRORS := (WARNINGS => 0, ERRORS => 0, FATAL => FALSE); DO_NOT_COPY := FALSE; exception when PROFILE.ERROR => ERRORS := (WARNINGS => 0, ERRORS => 1, FATAL => FALSE); DO_NOT_COPY := TRUE; end PRE_CMVC_COPY; procedure POST_CMVC_COPY (HANDLE : DC.GATEWAY_HANDLE; SUBOBJECT : DIRECTORY.OBJECT; SOURCE_OBJECT : DIRECTORY.OBJECT; RELEASE : BOOLEAN; CONTROLLED : BOOLEAN; JOINED : BOOLEAN; SOURCE_VIEW : DIRECTORY.OBJECT; DESTINATION_VIEW : DIRECTORY.OBJECT; FIRST_CALL : BOOLEAN; RESPONSE : PROFILE.RESPONSE_PROFILE; ACTION_ID : ACTION.ID; ERRORS : in out DC.ERROR_COUNTS) is THE_HANDLE : DC.GATEWAY_HANDLE := REOPEN (HANDLE, ACTION_ID); ARCHIVE_FILE : DIIO.FILE_TYPE; C : RO.CONTEXT; S : SS.CONDITION; type ACCESS_STRING is access STRING; pragma SEGMENTED_HEAP (ACCESS_STRING); CONTEXT : constant STRING := ASAP.DATA_CONTEXT (THE_HANDLE); HOST : constant STRING := ASAP.DATA_HOST (THE_HANDLE); MODEL : constant STRING := CONTEXT & UNIX.CONTEXT_SEPARATOR & ASAP.DATA_NAME (THE_HANDLE); GATEWAY_OBJECT : constant DIR.OBJECT := GWO.DIRECTORY_OBJECT (THE_HANDLE); ARCHIVE_FILE_NAME : constant STRING := DNA.GET_FULL_NAME (GATEWAY_OBJECT) & ".Archive"; REMOTE_TARFILE : constant STRING := UNIX.TEMPORARY_FILENAME (UNIX.TARFILE_EXTENSION); CD_COMMAND : constant STRING := UNIX.CHANGE_DIRECTORY & ' ' & CONTEXT; TAR_COMMAND : constant STRING := UNIX.TAPE_ARCHIVE & ' ' & UNIX.CREATE & UNIX.ARCHIVE_FILE & ' ' & REMOTE_TARFILE & ' ' & MODEL; RM_COMMAND : constant STRING := UNIX.REMOVE & ' ' & REMOTE_TARFILE; MY_STATE : ACCESS_STRING; procedure PROCESS (STATE : in out ACCESS_STRING; LINE : in STRING) is begin pragma ASSERT (STATE = null); STATE := new STRING'(LINE); pragma HEAP (JOB_SEGMENT.GET); end PROCESS; procedure EXECUTE_SCRIPT is new ASAOPEN.EXECUTE (STATE_RECORD => ACCESS_STRING, PROCESS => PROCESS); begin if RELEASE then PROFILE.SET (RESPONSE); -- -- Acquire a connection. -- RO.ACQUIRE (A_CONTEXT => C, STATUS => S, MACHINE => HOST, INSTANCE => ASA_DEFINITIONS.ASA); LOGGER.STATUS (S); -- -- Find the associated files. -- EXECUTE_SCRIPT (IN_CONTEXT => C, MODEL => MODEL, TEMPLATE_NAME => ASSOCIATED, STATE => MY_STATE, STATUS => S); LOGGER.STATUS (S); -- -- Archive all the files, from the appropriate directory. -- EXECUTE (COMMAND => CD_COMMAND & UNIX.COMMAND_SEPARATOR & TAR_COMMAND & ' ' & MY_STATE.all, INTERACTIVE => FALSE, IN_CONTEXT => C, TIMEOUT => DEFAULT_TIMEOUT); -- -- Upload the tar file. -- DIIO.CREATE (FILE => ARCHIVE_FILE, MODE => DIIO.OUT_FILE, NAME => ARCHIVE_FILE_NAME, ACTION_ID => GWO.ACTION_ID (THE_HANDLE)); RO.GET (FROM_FILE => REMOTE_TARFILE, IN_CONTEXT => C, TO_FILE => ARCHIVE_FILE, STATUS => S); LOGGER.STATUS (S); DIIO.CLOSE (FILE => ARCHIVE_FILE); -- -- Delete the remote tarfile. -- EXECUTE (COMMAND => RM_COMMAND, INTERACTIVE => FALSE, IN_CONTEXT => C, TIMEOUT => DEFAULT_TIMEOUT); -- -- Release the connection. -- RO.RELEASE (A_CONTEXT => C, STATUS => S); LOGGER.STATUS (S); end if; ERRORS := (WARNINGS => 0, ERRORS => 0, FATAL => FALSE); exception when PROFILE.ERROR => ERRORS := (WARNINGS => 0, ERRORS => 1, FATAL => TRUE); end POST_CMVC_COPY; procedure PRE_MAKE_CONTROLLED (HANDLE : DC.GATEWAY_HANDLE; SUBOBJECT : DIRECTORY.OBJECT; SAVE_SOURCE : BOOLEAN; ALLOW_CONTROLLED : out BOOLEAN; RESPONSE : PROFILE.RESPONSE_PROFILE; ACTION_ID : ACTION.ID; ERRORS : in out DC.ERROR_COUNTS) is THE_HANDLE : DC.GATEWAY_HANDLE := REOPEN (HANDLE, ACTION_ID); C : RO.CONTEXT; HAS_DESTROYED_GATEWAY : BOOLEAN; S : SS.CONDITION; THE_ACTION : ACTION.ID := ACTION_ID; GATEWAY_OBJECT : constant DIR.OBJECT := GWO.DIRECTORY_OBJECT (THE_HANDLE); GATEWAY_FULL_NAME : constant STRING := DIR.NAMING.GET_FULL_NAME (GATEWAY_OBJECT); HOST : constant STRING := ASAP.DATA_HOST (THE_HANDLE); MODEL : constant STRING := ASAP.DATA_CONTEXT (THE_HANDLE) & UNIX.CONTEXT_SEPARATOR & ASAP.DATA_NAME (THE_HANDLE); begin PROFILE.SET (RESPONSE); ALLOW_CONTROLLED := TRUE; if SAVE_SOURCE then LOGGER.NEGATIVE (ASA_DEFINITIONS.ASA & " gateway objects cannot be source-controlled"); ERRORS := (WARNINGS => 0, ERRORS => 1, FATAL => FALSE); else RO.ACQUIRE (A_CONTEXT => C, STATUS => S, MACHINE => HOST, INSTANCE => ASA_DEFINITIONS.ASA); LOGGER.STATUS (S, INTERACTIVE => TRUE); if not IS_UP_TO_DATE (THE_HANDLE, IN_CONTEXT => C) then LOGGER.POSITIVE ("Accepting changes from model " & MODEL); GWO.CLOSE (THE_HANDLE, S); LOGGER.STATUS (S, INTERACTIVE => TRUE); ACCEPT_CHANGES (GATEWAY_OBJECT => GATEWAY_OBJECT, IN_CONTEXT => C, MODEL => MODEL, COMMENTS => "Automatic Accept_Changes issued by " & "Cmvc.Make_Controlled from object " & GATEWAY_FULL_NAME, WORK_ORDER => "<DEFAULT>", ACTION_ID => ACTION_ID, HAS_DESTROYED_GATEWAY => HAS_DESTROYED_GATEWAY); if HAS_DESTROYED_GATEWAY then LOGGER.WARNING ("The gateway object " & GATEWAY_FULL_NAME & " has been destroyed while accepting " & "changes. Cmvc.Make_Controlled is " & "unable to proceed"); ACTION.FINISH (THE_ACTION => THE_ACTION, DO_COMMIT => TRUE); ERRORS := (WARNINGS => 0, ERRORS => 0, FATAL => TRUE); return; end if; end if; RO.RELEASE (A_CONTEXT => C, STATUS => S); LOGGER.STATUS (S, INTERACTIVE => TRUE); ERRORS := (WARNINGS => 0, ERRORS => 0, FATAL => FALSE); end if; exception when PROFILE.ERROR => ERRORS := (WARNINGS => 0, ERRORS => 1, FATAL => FALSE); end PRE_MAKE_CONTROLLED; procedure TERMINATE_SERVER (REASON : in DC.TERMINATION_CONDITION) is begin if REASON = DC.GATEWAY_CLASS_DEACTIVATED then SWITCH_REGISTRATION.STOP; end if; end TERMINATE_SERVER; end MODEL; separate (ACTIONS) package body MODULE is procedure IMAGE_NAME (HANDLE : DC.GATEWAY_HANDLE; VISIBLE : BOOLEAN; READ_ONLY : BOOLEAN; NO_IMAGE : out BOOLEAN; SHOW_PROPERTY_IMAGE : out BOOLEAN; ID : out DC.IMAGE_IDENTITY) is begin MODEL.IMAGE_NAME (HANDLE => HANDLE, VISIBLE => VISIBLE, READ_ONLY => READ_ONLY, NO_IMAGE => NO_IMAGE, SHOW_PROPERTY_IMAGE => SHOW_PROPERTY_IMAGE, ID => ID); end IMAGE_NAME; procedure BUILD_IMAGE (HANDLE : DC.GATEWAY_HANDLE; VISIBLE : BOOLEAN; IN_PLACE : BOOLEAN; FIRST_TIME : BOOLEAN; READ_ONLY : in out BOOLEAN; IMAGE : DC.IMAGE_ID; NO_IMAGE : out BOOLEAN; UNDERLYING_OBJECT : out DIRECTORY.OBJECT) is begin MODEL.BUILD_IMAGE (HANDLE => HANDLE, VISIBLE => VISIBLE, IN_PLACE => IN_PLACE, FIRST_TIME => FIRST_TIME, READ_ONLY => READ_ONLY, IMAGE => IMAGE, NO_IMAGE => NO_IMAGE, UNDERLYING_OBJECT => UNDERLYING_OBJECT); end BUILD_IMAGE; procedure PRE_CHECK_IN (HANDLE : DC.GATEWAY_HANDLE; SUBOBJECT : DIRECTORY.OBJECT; RESPONSE : PROFILE.RESPONSE_PROFILE; ACTION_ID : ACTION.ID; ERRORS : in out DC.ERROR_COUNTS) is begin MODEL.PRE_CHECK_IN (HANDLE => HANDLE, SUBOBJECT => SUBOBJECT, RESPONSE => RESPONSE, ACTION_ID => ACTION_ID, ERRORS => ERRORS); end PRE_CHECK_IN; procedure PRE_MAKE_CONTROLLED (HANDLE : DC.GATEWAY_HANDLE; SUBOBJECT : DIRECTORY.OBJECT; SAVE_SOURCE : BOOLEAN; ALLOW_CONTROLLED : out BOOLEAN; RESPONSE : PROFILE.RESPONSE_PROFILE; ACTION_ID : ACTION.ID; ERRORS : in out DC.ERROR_COUNTS) is begin MODEL.PRE_MAKE_CONTROLLED (HANDLE => HANDLE, SUBOBJECT => SUBOBJECT, SAVE_SOURCE => SAVE_SOURCE, ALLOW_CONTROLLED => ALLOW_CONTROLLED, RESPONSE => RESPONSE, ACTION_ID => ACTION_ID, ERRORS => ERRORS); end PRE_MAKE_CONTROLLED; end MODULE; with IO_EXCEPTIONS; with LOGGER; with REQUIREMENTS; with STRING_UTILITIES; separate (ACTIONS) package body REQUIREMENT is package DCP renames DIRECTORY.CONTROL_POINT; package DIIO renames DEVICE_INDEPENDENT_IO; package DNA renames DIRECTORY.NAMING; package GWO renames GATEWAY_OBJECT; function FORMATTED_IMAGE (R : in REQUIREMENTS.REQUIREMENT_KIND) return STRING is CAPITALIZE_NEXT : BOOLEAN := TRUE; OFFSET : constant := CHARACTER'POS ('a') - CHARACTER'POS ('A'); THE_IMAGE : constant STRING := REQUIREMENTS.REQUIREMENT_KIND'IMAGE (R); THE_FORMATTED_IMAGE : STRING (THE_IMAGE'RANGE); begin for I in THE_IMAGE'RANGE loop if THE_IMAGE (I) = '_' then THE_FORMATTED_IMAGE (I) := ' '; CAPITALIZE_NEXT := TRUE; elsif CAPITALIZE_NEXT then THE_FORMATTED_IMAGE (I) := THE_IMAGE (I); CAPITALIZE_NEXT := FALSE; else THE_FORMATTED_IMAGE (I) := CHARACTER'VAL (CHARACTER'POS (THE_IMAGE (I)) + OFFSET); end if; end loop; return THE_FORMATTED_IMAGE; end FORMATTED_IMAGE; function IMAGE_CONTENTS (IMAGE : in DC.IMAGE_ID; CONTENTS_BEFORE : in STRING; FIRST_LINE_TO_EXAMINE : in POSITIVE; LAST_LINE_TO_EXAMINE : in NATURAL) return STRING is begin if FIRST_LINE_TO_EXAMINE > LAST_LINE_TO_EXAMINE then return CONTENTS_BEFORE; else return IMAGE_CONTENTS (IMAGE => IMAGE, CONTENTS_BEFORE => CONTENTS_BEFORE & ASCII.LF & DC.LINE_CONTENTS (ID => IMAGE, LINE => FIRST_LINE_TO_EXAMINE), FIRST_LINE_TO_EXAMINE => FIRST_LINE_TO_EXAMINE + 1, LAST_LINE_TO_EXAMINE => LAST_LINE_TO_EXAMINE); end if; end IMAGE_CONTENTS; function IMAGE_CONTENTS (IMAGE : in DC.IMAGE_ID) return STRING is LAST_LINE : NATURAL := DC.LAST_LINE (IMAGE); begin if LAST_LINE = 0 then return ""; else return IMAGE_CONTENTS (IMAGE => IMAGE, CONTENTS_BEFORE => DC.LINE_CONTENTS (ID => IMAGE, LINE => 1), FIRST_LINE_TO_EXAMINE => 2, LAST_LINE_TO_EXAMINE => LAST_LINE); end if; end IMAGE_CONTENTS; function RELATIVE_NAME (FULL_NAME : in STRING; RELATIVE_TO : in STRING) return STRING is begin pragma ASSERT (FULL_NAME'LENGTH >= RELATIVE_TO'LENGTH and then FULL_NAME (FULL_NAME'FIRST .. FULL_NAME'FIRST + RELATIVE_TO'LENGTH - 1) = RELATIVE_TO); return FULL_NAME (FULL_NAME'FIRST + RELATIVE_TO'LENGTH + 1 -- Skip the '.' .. FULL_NAME'LAST); end RELATIVE_NAME; procedure IMAGE_NAME (HANDLE : DC.GATEWAY_HANDLE; VISIBLE : BOOLEAN; READ_ONLY : BOOLEAN; NO_IMAGE : out BOOLEAN; SHOW_PROPERTY_IMAGE : out BOOLEAN; ID : out DC.IMAGE_IDENTITY) is GATEWAY_OBJECT : constant DIR.OBJECT := GWO.DIRECTORY_OBJECT (HANDLE); S : SS.CONDITION; begin SHOW_PROPERTY_IMAGE := FALSE; ID := (I1 => DIR.UNIQUE (GATEWAY_OBJECT), I2 => 0); NO_IMAGE := FALSE; if not READ_ONLY then S := CHECK_WRITEABLE (HANDLE); LOGGER.STATUS (S); end if; exception when PROFILE.ERROR => NO_IMAGE := TRUE; LOGGER.ERROR ("Image construction is quitting after errors", RAISE_ERROR => FALSE); end IMAGE_NAME; procedure BUILD_IMAGE (HANDLE : DC.GATEWAY_HANDLE; VISIBLE : BOOLEAN; IN_PLACE : BOOLEAN; FIRST_TIME : BOOLEAN; READ_ONLY : in out BOOLEAN; IMAGE : DC.IMAGE_ID; NO_IMAGE : out BOOLEAN; UNDERLYING_OBJECT : out DIRECTORY.OBJECT) is E : DIR.ERROR_STATUS; GATEWAY_OBJECT : constant DIR.OBJECT := GWO.DIRECTORY_OBJECT (HANDLE); GATEWAY_FULL_NAME : constant STRING := DNA.GET_FULL_NAME (GATEWAY_OBJECT); PARENT_LIBRARY : DIR.OBJECT; begin UNDERLYING_OBJECT := DIR.NIL; if not READ_ONLY then if SS.ERROR (CHECK_WRITEABLE (HANDLE)) then NO_IMAGE := TRUE; return; end if; end if; DCP.PARENT_LIBRARY (THE_OBJECT => GATEWAY_OBJECT, THE_LIBRARY => PARENT_LIBRARY, STATUS => E); LOGGER.STATUS (E); DC.REPLACE_HEADER (IMAGE => IMAGE, HEADER => STRING_UTILITIES.CAPITALIZE (RELATIVE_NAME (FULL_NAME => GATEWAY_FULL_NAME, RELATIVE_TO => DNA.GET_FULL_NAME (PARENT_LIBRARY))) & " : " & FORMATTED_IMAGE (ASAP.ASA_REQUIREMENT_KIND (HANDLE)) & ';'); DC.REPLACE_LINES (IMAGE => IMAGE, STARTING_LINE => 1, NUMBER_OF_LINES => DC.LAST_LINE (IMAGE), NEW_TEXT => ASAP.ASA_REQUIREMENT_TEXT (HANDLE)); NO_IMAGE := FALSE; exception when PROFILE.ERROR => NO_IMAGE := TRUE; LOGGER.ERROR ("Image construction is quitting after errors", RAISE_ERROR => FALSE); end BUILD_IMAGE; procedure POST_COMMIT (HANDLE : DC.GATEWAY_HANDLE; IMAGE : DC.IMAGE_ID) is S : SS.CONDITION; THE_HANDLE : DC.GATEWAY_HANDLE := HANDLE; begin if not GWO.IS_MAIN_OBJECT_OPEN_FOR_UPDATE (HANDLE) then GWO.RE_OPEN_MAIN_OBJECT_FOR_UPDATE (THE_HANDLE, ERRORS => S); LOGGER.STATUS (S); end if; ASAP.SET_ASA_REQUIREMENT_TEXT (THE_HANDLE, VALUE => IMAGE_CONTENTS (IMAGE)); exception when PROFILE.ERROR => LOGGER.ERROR ("Image has not been committed", RAISE_ERROR => FALSE); end POST_COMMIT; procedure EDIT (HANDLE : DC.GATEWAY_HANDLE; IMAGE : DC.IMAGE_ID; S : DC.SELECTION; C : DC.CURSOR; VISIBLE : BOOLEAN; ALLOW_EDIT : out BOOLEAN) is ST : SS.CONDITION; begin ST := CHECK_WRITEABLE (HANDLE); LOGGER.STATUS (ST); ALLOW_EDIT := TRUE; exception when PROFILE.ERROR => ALLOW_EDIT := FALSE; LOGGER.ERROR ("Edit is quitting after errors", RAISE_ERROR => FALSE); end EDIT; procedure IO_OPEN (FILE : in out DEVICE_INDEPENDENT_IO.FILE_TYPE; MODE : DEVICE_INDEPENDENT_IO.FILE_MODE; HANDLE : DC.GATEWAY_HANDLE; FORM : STRING; ACTION_ID : ACTION.ID) is use DIIO; begin pragma ASSERT (MODE = DIIO.IN_FILE); DIIO.CREATE (FILE, MODE => DIIO.OUT_FILE, NAME => "", ACTION_ID => ACTION_ID); DIIO.WRITE (FILE, ITEM => ASAP.ASA_REQUIREMENT_TEXT (HANDLE)); DIIO.RESET (FILE, MODE => DIIO.IN_FILE); end IO_OPEN; end REQUIREMENT;with REQUIREMENTS; package ASA is procedure CREATE_REQUIREMENT (FOR_OBJECT : in STRING := "<CURSOR>"; NAME : in STRING := ">>Requirement Name<<"; KIND : in REQUIREMENTS.NON_FUNCTIONAL := REQUIREMENTS.PERFORMANCE; COMMENTS : in STRING := ""; WORK_ORDER : in STRING := "<DEFAULT>"; RESPONSE : in STRING := "<PROFILE>"); procedure COPY_REQUIREMENT (REQUIREMENT : in STRING := "<REGION>"; TO_OBJECT : in STRING := "<CURSOR>"; COMMENTS : in STRING := ""; WORK_ORDER : in STRING := "<DEFAULT>"; RESPONSE : in STRING := "<PROFILE>"); procedure MOVE_REQUIREMENT (REQUIREMENT : in STRING := "<REGION>"; TO_OBJECT : in STRING := "<CURSOR>"; COMMENTS : in STRING := ""; WORK_ORDER : in STRING := "<DEFAULT>"; RESPONSE : in STRING := "<PROFILE>"); procedure ACCEPT_CHANGES (IN_OBJECT : in STRING := "<CURSOR>"; COMMENTS : in STRING := ""; WORK_ORDER : in STRING := "<DEFAULT>"; RESPONSE : in STRING := "<PROFILE>"); procedure CREATE_MODEL (MODEL : in STRING := ">>ASA Model Name<<"; HOST : in STRING := ">>Machine Name<<"; INTO_VIEW : in STRING := "<CURSOR>"; COMMENTS : in STRING := ""; WORK_ORDER : in STRING := "<DEFAULT>"; RESPONSE : in STRING := "<PROFILE>"); procedure IMPORT_MODEL (MODEL : in STRING := ">>ASA Model Name<<"; HOST : in STRING := ">>Machine Name<<"; INTO_VIEW : in STRING := "<CURSOR>"; COMMENTS : in STRING := ""; WORK_ORDER : in STRING := "<DEFAULT>"; RESPONSE : in STRING := "<PROFILE>"); end ASA;with ACTION; with ASA_DEFINITIONS; with CALENDAR; with DEBUG_TOOLS; with DIRECTORY; with GATEWAYS; with GATEWAY_OBJECT; with HIERARCHY; with LOGGER; with OBJECT_CLASS; with OBJECT_SUBCLASS; with PROFILE; with SIMPLE_STATUS; with UNIX_DEFINITIONS; package body ASA is PACKAGE_NAME : constant STRING := "Asa."; package ASAP renames ASA_DEFINITIONS.PROPERTIES; package DIR renames DIRECTORY; package DCP renames DIRECTORY.CONTROL_POINT; package DNA renames DIRECTORY.NAMING; package GWO renames GATEWAY_OBJECT; package HCHY renames HIERARCHY; package SS renames SIMPLE_STATUS; package UNIX renames UNIX_DEFINITIONS; function MUST_RAISE_ERROR return BOOLEAN is use PROFILE; begin return PROFILE.REACTION = PROFILE.PROPAGATE or else PROFILE.REACTION = PROFILE.RAISE_ERROR; end MUST_RAISE_ERROR; procedure CHECK_REQUIREMENT_NAME (REQUIREMENT_NAME : in STRING; ACTION_ID : in ACTION.ID; IS_A_REQUIREMENT : out BOOLEAN; REQUIREMENT_OBJECT : out DIR.OBJECT; REQUIREMENT_HANDLE : out GWO.HANDLE) is E : DIR.ERROR_STATUS; HANDLE : GWO.HANDLE; N : DNA.NAME_STATUS; OBJECT : DIR.OBJECT; S : SS.CONDITION; use ASA_DEFINITIONS; use DNA; begin DNA.RESOLVE (NAME => REQUIREMENT_NAME, THE_OBJECT => OBJECT, STATUS => N); if N /= DNA.SUCCESSFUL then IS_A_REQUIREMENT := FALSE; REQUIREMENT_OBJECT := DIR.NIL; REQUIREMENT_HANDLE := GWO.NULL_HANDLE; elsif DIR.IS_GATEWAY (OBJECT) then GWO.OPEN_MAIN_OBJECT (OBJECT => OBJECT, H => HANDLE, UPDATE => FALSE, ACTION_ID => ACTION_ID, ERRORS => S); if SS.ERROR (S) or else ASAP.CLASS (HANDLE) /= ASA_DEFINITIONS.ASA_REQUIREMENT then IS_A_REQUIREMENT := FALSE; REQUIREMENT_OBJECT := OBJECT; REQUIREMENT_HANDLE := GWO.NULL_HANDLE; else IS_A_REQUIREMENT := TRUE; REQUIREMENT_OBJECT := OBJECT; REQUIREMENT_HANDLE := HANDLE; end if; end if; end CHECK_REQUIREMENT_NAME; procedure CHECK_VIEW_NAME (VIEW_NAME : in STRING; ACTION_ID : in ACTION.ID; IS_A_COMBINED_VIEW : out BOOLEAN; VIEW_OBJECT : out DIR.OBJECT) is E : DIR.ERROR_STATUS; N : DNA.NAME_STATUS; OBJECT : DIR.OBJECT; VIEW : DIR.OBJECT; VIEW_SUBCLASS : DIR.SUBCLASS; use DIR; use DNA; begin DNA.RESOLVE (NAME => VIEW_NAME, THE_OBJECT => OBJECT, STATUS => N, ACTION_ID => ACTION_ID); if N /= DNA.SUCCESSFUL then IS_A_COMBINED_VIEW := FALSE; VIEW_OBJECT := DIR.NIL; else if DCP.IS_WORLD (OBJECT) then VIEW := OBJECT; else DCP.PARENT_WORLD (THE_OBJECT => OBJECT, THE_WORLD => VIEW, STATUS => E); if E /= SUCCESSFUL then IS_A_COMBINED_VIEW := FALSE; VIEW_OBJECT := DIR.NIL; end if; end if; VIEW_SUBCLASS := DIR.GET_SUBCLASS (VIEW); IS_A_COMBINED_VIEW := VIEW_SUBCLASS = OBJECT_SUBCLASS.COMBINED_VIEW_SUBCLASS; VIEW_OBJECT := VIEW; end if; end CHECK_VIEW_NAME; function ROOT_OF (GATEWAY : in DIR.OBJECT; ACTION_ID : in ACTION.ID) return DIR.OBJECT is E : DIR.ERROR_STATUS; GATEWAY_DATA : DIR.STATISTICS.OBJECT_DATA; RESULT : DIR.OBJECT; use DIR; begin RESULT := GATEWAY; loop DIR.STATISTICS.GET_OBJECT_DATA (THE_OBJECT => RESULT, THE_DATA => GATEWAY_DATA, STATUS => E, ACTION_ID => ACTION_ID); exit when DIR.GET_CLASS (DIR.STATISTICS.OBJECT_PARENT (GATEWAY_DATA)) = OBJECT_CLASS.LIBRARY; RESULT := DIR.STATISTICS.OBJECT_PARENT (GATEWAY_DATA); end loop; return RESULT; end ROOT_OF; procedure CREATE_REQUIREMENT (FOR_OBJECT : in STRING := "<CURSOR>"; NAME : in STRING := ">>Requirement Name<<"; KIND : in REQUIREMENTS.NON_FUNCTIONAL := REQUIREMENTS.PERFORMANCE; COMMENTS : in STRING := ""; WORK_ORDER : in STRING := "<DEFAULT>"; RESPONSE : in STRING := "<PROFILE>") is SUBPROGRAM_NAME : constant STRING := "Create_Requirement"; S : SS.CONDITION; THE_ACTION : ACTION.ID; THE_STATE : GATEWAYS.STATE; begin PROFILE.SET (RESPONSE, S); THE_ACTION := ACTION.START; GATEWAYS.INITIALIZE (THE_STATE => THE_STATE, ACTION_ID => THE_ACTION, WORK_ORDER => WORK_ORDER); GATEWAYS.CREATE (IN_GATEWAY => FOR_OBJECT, REQUIREMENT_NAME => NAME, REQUIREMENT_KIND => KIND, REQUIREMENT_TEXT => "", COMMENTS => COMMENTS, THE_STATE => THE_STATE); GATEWAYS.FINALIZE (THE_STATE); ACTION.FINISH (THE_ACTION, DO_COMMIT => TRUE); exception when PROFILE.ERROR => LOGGER.ERROR (PACKAGE_NAME & SUBPROGRAM_NAME & " is quitting after errors", RAISE_ERROR => MUST_RAISE_ERROR); when others => LOGGER.ERROR (PACKAGE_NAME & SUBPROGRAM_NAME & " aborted by exception " & DEBUG_TOOLS.GET_EXCEPTION_NAME, RAISE_ERROR => MUST_RAISE_ERROR); ACTION.FINISH (THE_ACTION, DO_COMMIT => FALSE); end CREATE_REQUIREMENT; procedure COPY_REQUIREMENT (REQUIREMENT : in STRING := "<REGION>"; TO_OBJECT : in STRING := "<CURSOR>"; COMMENTS : in STRING := ""; WORK_ORDER : in STRING := "<DEFAULT>"; RESPONSE : in STRING := "<PROFILE>") is SUBPROGRAM_NAME : constant STRING := "Copy_Requirement"; GATEWAY : GWO.HANDLE; GATEWAY_OBJECT : DIR.OBJECT; IS_A_REQUIREMENT : BOOLEAN; S : SS.CONDITION; THE_ACTION : ACTION.ID := ACTION.START; THE_STATE : GATEWAYS.STATE; begin PROFILE.SET (RESPONSE, S); CHECK_REQUIREMENT_NAME (REQUIREMENT_NAME => REQUIREMENT, ACTION_ID => THE_ACTION, IS_A_REQUIREMENT => IS_A_REQUIREMENT, REQUIREMENT_OBJECT => GATEWAY_OBJECT, REQUIREMENT_HANDLE => GATEWAY); if not IS_A_REQUIREMENT then if DIR.IS_NIL (GATEWAY_OBJECT) then LOGGER.NEGATIVE (REQUIREMENT & " is not a gateway of class " & ASA_DEFINITIONS.GATEWAY_CLASS'IMAGE (ASA_DEFINITIONS.ASA_REQUIREMENT)); else LOGGER.NEGATIVE (DNA.GET_FULL_NAME (GATEWAY_OBJECT) & " is not a gateway of class " & ASA_DEFINITIONS.GATEWAY_CLASS'IMAGE (ASA_DEFINITIONS.ASA_REQUIREMENT)); end if; end if; GATEWAYS.INITIALIZE (THE_STATE => THE_STATE, ACTION_ID => THE_ACTION, WORK_ORDER => WORK_ORDER); GATEWAYS.CREATE (IN_GATEWAY => TO_OBJECT, REQUIREMENT_NAME => DNA.GET_SIMPLE_NAME (GATEWAY_OBJECT), REQUIREMENT_KIND => ASAP.ASA_REQUIREMENT_KIND (GATEWAY), REQUIREMENT_TEXT => ASAP.ASA_REQUIREMENT_TEXT (GATEWAY), COMMENTS => COMMENTS, THE_STATE => THE_STATE); GATEWAYS.FINALIZE (THE_STATE); ACTION.FINISH (THE_ACTION, DO_COMMIT => TRUE); exception when PROFILE.ERROR => LOGGER.ERROR (PACKAGE_NAME & SUBPROGRAM_NAME & " is quitting after errors", RAISE_ERROR => MUST_RAISE_ERROR); when others => LOGGER.ERROR (PACKAGE_NAME & SUBPROGRAM_NAME & " aborted by exception " & DEBUG_TOOLS.GET_EXCEPTION_NAME, RAISE_ERROR => MUST_RAISE_ERROR); ACTION.FINISH (THE_ACTION, DO_COMMIT => FALSE); end COPY_REQUIREMENT; procedure MOVE_REQUIREMENT (REQUIREMENT : in STRING := "<REGION>"; TO_OBJECT : in STRING := "<CURSOR>"; COMMENTS : in STRING := ""; WORK_ORDER : in STRING := "<DEFAULT>"; RESPONSE : in STRING := "<PROFILE>") is SUBPROGRAM_NAME : constant STRING := "Move_Requirement"; GATEWAY : GWO.HANDLE; GATEWAY_OBJECT : DIR.OBJECT; IS_A_REQUIREMENT : BOOLEAN; S : SS.CONDITION; THE_ACTION : ACTION.ID := ACTION.START; THE_STATE : GATEWAYS.STATE; begin PROFILE.SET (RESPONSE, S); CHECK_REQUIREMENT_NAME (REQUIREMENT_NAME => REQUIREMENT, ACTION_ID => THE_ACTION, IS_A_REQUIREMENT => IS_A_REQUIREMENT, REQUIREMENT_OBJECT => GATEWAY_OBJECT, REQUIREMENT_HANDLE => GATEWAY); if not IS_A_REQUIREMENT then if DIR.IS_NIL (GATEWAY_OBJECT) then LOGGER.NEGATIVE (REQUIREMENT & " is not a gateway of class " & ASA_DEFINITIONS.GATEWAY_CLASS'IMAGE (ASA_DEFINITIONS.ASA_REQUIREMENT)); else LOGGER.NEGATIVE (DNA.GET_FULL_NAME (GATEWAY_OBJECT) & " is not a gateway of class " & ASA_DEFINITIONS.GATEWAY_CLASS'IMAGE (ASA_DEFINITIONS.ASA_REQUIREMENT)); end if; end if; GATEWAYS.INITIALIZE (THE_STATE => THE_STATE, ACTION_ID => THE_ACTION, WORK_ORDER => WORK_ORDER); GATEWAYS.CREATE (IN_GATEWAY => TO_OBJECT, REQUIREMENT_NAME => DNA.GET_SIMPLE_NAME (GATEWAY_OBJECT), REQUIREMENT_KIND => ASAP.ASA_REQUIREMENT_KIND (GATEWAY), REQUIREMENT_TEXT => ASAP.ASA_REQUIREMENT_TEXT (GATEWAY), COMMENTS => COMMENTS, THE_STATE => THE_STATE); GATEWAYS.DESTROY (GATEWAY_NAME => DNA.GET_FULL_NAME (GATEWAY_OBJECT), COMMENTS => COMMENTS, THE_STATE => THE_STATE); GATEWAYS.FINALIZE (THE_STATE); ACTION.FINISH (THE_ACTION, DO_COMMIT => TRUE); exception when PROFILE.ERROR => LOGGER.ERROR (PACKAGE_NAME & SUBPROGRAM_NAME & " is quitting after errors", RAISE_ERROR => MUST_RAISE_ERROR); when others => LOGGER.ERROR (PACKAGE_NAME & SUBPROGRAM_NAME & " aborted by exception " & DEBUG_TOOLS.GET_EXCEPTION_NAME, RAISE_ERROR => MUST_RAISE_ERROR); ACTION.FINISH (THE_ACTION, DO_COMMIT => FALSE); end MOVE_REQUIREMENT; procedure ACCEPT_CHANGES (IN_OBJECT : in STRING := "<CURSOR>"; COMMENTS : in STRING := ""; WORK_ORDER : in STRING := "<DEFAULT>"; RESPONSE : in STRING := "<PROFILE>") is SUBPROGRAM_NAME : constant STRING := "Accept_Changes"; BUILD_TIME : CALENDAR.TIME; E : DIR.ERROR_STATUS; ENCLOSING_LIBRARY : DIR.OBJECT; GATEWAY : GWO.HANDLE; GATEWAY_OBJECT : DIR.OBJECT; ROOT_ITERATOR : HCHY.MODULE_ITERATOR; ROOT_MODULE : HCHY.MODULE; S : SS.CONDITION; THE_ACTION : ACTION.ID := ACTION.START; THE_STATE : GATEWAYS.STATE; begin PROFILE.SET (RESPONSE, S); -- -- Open the specified gateway. -- GWO.OPEN_MAIN_OBJECT (OBJECT => IN_OBJECT, H => GATEWAY, UPDATE => FALSE, ACTION_ID => THE_ACTION, ERRORS => S); LOGGER.STATUS (S); GATEWAY_OBJECT := GWO.DIRECTORY_OBJECT (GATEWAY); DCP.PARENT_LIBRARY (THE_OBJECT => GATEWAY_OBJECT, THE_LIBRARY => ENCLOSING_LIBRARY, STATUS => E); LOGGER.STATUS (E); declare HOST : constant STRING := ASAP.DATA_HOST (GATEWAY); MODEL : constant STRING := ASAP.DATA_CONTEXT (GATEWAY) & UNIX.CONTEXT_SEPARATOR & ASAP.DATA_NAME (GATEWAY); begin -- -- Compute module hierarchy for the associated model. -- LOGGER.NOTE ("Building module hierarchy for model " & MODEL); HCHY.BUILD (MODEL => MODEL, HOST => HOST, ROOT => ROOT_MODULE, BUILD_TIME => BUILD_TIME); ROOT_ITERATOR := HCHY.MAKE (ROOT_MODULE); GWO.CLOSE (GATEWAY, ERRORS => S); LOGGER.STATUS (S); -- -- Find the root of the gateway tree. -- GATEWAY_OBJECT := ROOT_OF (GATEWAY => GATEWAY_OBJECT, ACTION_ID => THE_ACTION); GATEWAYS.INITIALIZE (THE_STATE => THE_STATE, ACTION_ID => THE_ACTION, WORK_ORDER => WORK_ORDER); -- -- Delete those gateways that no longer have corresponding -- modules. -- GATEWAYS.REDUCE (GATEWAY_NAME => DNA.GET_FULL_NAME (GATEWAY_OBJECT), CANDIDATE_MODULES => ROOT_ITERATOR, COMMENTS => COMMENTS, THE_STATE => THE_STATE); -- -- Create gateways for the new modules. -- GATEWAYS.AUGMENT (FOR_MODULE => ROOT_MODULE, IN_LIBRARY => DNA.GET_FULL_NAME (ENCLOSING_LIBRARY), HOST => HOST, MODEL => MODEL, UPDATE_TIME => BUILD_TIME, COMMENTS => COMMENTS, THE_STATE => THE_STATE); GATEWAYS.FINALIZE (THE_STATE); ACTION.FINISH (THE_ACTION, DO_COMMIT => TRUE); end; exception when PROFILE.ERROR => LOGGER.ERROR (PACKAGE_NAME & SUBPROGRAM_NAME & " is quitting after errors", RAISE_ERROR => MUST_RAISE_ERROR); when others => LOGGER.ERROR (PACKAGE_NAME & SUBPROGRAM_NAME & " aborted by exception " & DEBUG_TOOLS.GET_EXCEPTION_NAME, RAISE_ERROR => MUST_RAISE_ERROR); ACTION.FINISH (THE_ACTION, DO_COMMIT => FALSE); end ACCEPT_CHANGES; procedure CREATE_MODEL (MODEL : in STRING := ">>ASA Model Name<<"; HOST : in STRING := ">>Machine Name<<"; INTO_VIEW : in STRING := "<CURSOR>"; COMMENTS : in STRING := ""; WORK_ORDER : in STRING := "<DEFAULT>"; RESPONSE : in STRING := "<PROFILE>") is SUBPROGRAM_NAME : constant STRING := "Create_Model"; S : SS.CONDITION; BUILD_TIME : CALENDAR.TIME; IS_A_COMBINED_VIEW : BOOLEAN; ROOT_MODULE : HCHY.MODULE; THE_ACTION : ACTION.ID := ACTION.START; THE_STATE : GATEWAYS.STATE; VIEW : DIR.OBJECT; use DIR; begin PROFILE.SET (RESPONSE, S); CHECK_VIEW_NAME (VIEW_NAME => INTO_VIEW, ACTION_ID => THE_ACTION, IS_A_COMBINED_VIEW => IS_A_COMBINED_VIEW, VIEW_OBJECT => VIEW); if not IS_A_COMBINED_VIEW then if DIR.IS_NIL (VIEW) then LOGGER.NEGATIVE (INTO_VIEW & " is not a combined view"); else LOGGER.NEGATIVE (DNA.GET_FULL_NAME (VIEW) & " is not a combined view"); end if; end if; ROOT_MODULE := HCHY.MAKE (IDENTIFIER => UNIX.SIMPLE_NAME (MODEL)); GATEWAYS.INITIALIZE (THE_STATE => THE_STATE, ACTION_ID => THE_ACTION, WORK_ORDER => WORK_ORDER); GATEWAYS.CREATE (FOR_MODULE => ROOT_MODULE, IN_LIBRARY => DNA.GET_FULL_NAME (VIEW) & ".Units", HOST => HOST, MODEL => MODEL, UPDATE_TIME => BUILD_TIME, COMMENTS => COMMENTS, THE_STATE => THE_STATE); GATEWAYS.FINALIZE (THE_STATE); ACTION.FINISH (THE_ACTION, DO_COMMIT => TRUE); exception when PROFILE.ERROR => LOGGER.ERROR (PACKAGE_NAME & SUBPROGRAM_NAME & " is quitting after errors", RAISE_ERROR => MUST_RAISE_ERROR); when others => LOGGER.ERROR (PACKAGE_NAME & SUBPROGRAM_NAME & " aborted by exception " & DEBUG_TOOLS.GET_EXCEPTION_NAME, RAISE_ERROR => MUST_RAISE_ERROR); ACTION.FINISH (THE_ACTION, DO_COMMIT => FALSE); end CREATE_MODEL; procedure IMPORT_MODEL (MODEL : in STRING := ">>ASA Model Name<<"; HOST : in STRING := ">>Machine Name<<"; INTO_VIEW : in STRING := "<CURSOR>"; COMMENTS : in STRING := ""; WORK_ORDER : in STRING := "<DEFAULT>"; RESPONSE : in STRING := "<PROFILE>") is SUBPROGRAM_NAME : constant STRING := "Import_Model"; S : SS.CONDITION; BUILD_TIME : CALENDAR.TIME; IS_A_COMBINED_VIEW : BOOLEAN; ROOT_MODULE : HCHY.MODULE; THE_ACTION : ACTION.ID := ACTION.START; THE_STATE : GATEWAYS.STATE; VIEW : DIR.OBJECT; use DIR; begin PROFILE.SET (RESPONSE, S); CHECK_VIEW_NAME (VIEW_NAME => INTO_VIEW, ACTION_ID => THE_ACTION, IS_A_COMBINED_VIEW => IS_A_COMBINED_VIEW, VIEW_OBJECT => VIEW); if not IS_A_COMBINED_VIEW then if DIR.IS_NIL (VIEW) then LOGGER.NEGATIVE (INTO_VIEW & " is not a combined view"); else LOGGER.NEGATIVE (DNA.GET_FULL_NAME (VIEW) & " is not a combined view"); end if; end if; LOGGER.NOTE ("Building module hierarchy for model " & MODEL); HCHY.BUILD (MODEL => MODEL, HOST => HOST, ROOT => ROOT_MODULE, BUILD_TIME => BUILD_TIME); GATEWAYS.INITIALIZE (THE_STATE => THE_STATE, ACTION_ID => THE_ACTION, WORK_ORDER => WORK_ORDER); GATEWAYS.CREATE (FOR_MODULE => ROOT_MODULE, IN_LIBRARY => DNA.GET_FULL_NAME (VIEW) & ".Units", HOST => HOST, MODEL => MODEL, UPDATE_TIME => BUILD_TIME, COMMENTS => COMMENTS, THE_STATE => THE_STATE); GATEWAYS.FINALIZE (THE_STATE); ACTION.FINISH (THE_ACTION, DO_COMMIT => TRUE); exception when PROFILE.ERROR => LOGGER.ERROR (PACKAGE_NAME & SUBPROGRAM_NAME & " is quitting after errors", RAISE_ERROR => MUST_RAISE_ERROR); when others => LOGGER.ERROR (PACKAGE_NAME & SUBPROGRAM_NAME & " aborted by exception " & DEBUG_TOOLS.GET_EXCEPTION_NAME, RAISE_ERROR => MUST_RAISE_ERROR); ACTION.FINISH (THE_ACTION, DO_COMMIT => FALSE); end IMPORT_MODEL; end ASA;-- -- This package provides DTIA-based services to execute asaopen scripts -- and analyze their output. -- -- Given that it is not possible to pass parameters to asaopen when -- executing a script, a macro-expansion process is needed to substitute -- character strings in the asaopen scripts. -- -- Text files residing on the R1000 are thus template files that must be -- processed for symbol substitution before they can be sent to the -- remote machine for execution with asaopen. The type SYMBOL below -- specifies the symbols that can appear in asaopen scripts. To be -- processed by the macro-expander, symbols must be delimited by -- SEPARATOR, below. -- -- The generic procedure EXECUTE must be instantiated with a -- procedure PROCESS, called on each line of the result. The -- STATE_RECORD is used to propagate user-specific information. -- -- To easily distinguish the junk output produced by the activation of -- asaopen from the useful output of the script itself, it is expected -- that the script will write its output on a file whose name must be -- denoted by the symbol OUTPUT. The output file will then be uploaded -- for analysis on the R1000. -- with REMOTE_OPERATIONS; with SIMPLE_STATUS; package ASAOPEN is generic type STATE_RECORD is private; with procedure PROCESS (STATE : in out STATE_RECORD; LINE : in STRING); procedure EXECUTE (IN_CONTEXT : in REMOTE_OPERATIONS.CONTEXT; MODEL : in STRING; TEMPLATE_NAME : in STRING; STATE : in out STATE_RECORD; STATUS : out SIMPLE_STATUS.CONDITION); private type SYMBOL is (ANNOTATIONS, ANNOTATION_TYPES, MODEL, OUTPUT); SEPARATOR : constant STRING := "**"; end ASAOPEN;with ASA_DEFINITIONS; with DEBUG_TOOLS; with DEVICE_INDEPENDENT_IO; with DIRECTORY_TOOLS; with IO; with LOGGER; with PROFILE; with REMOTE_OPERATIONS; with STRING_UTILITIES; with UNIX_DEFINITIONS; pragma ELABORATE (ASA_DEFINITIONS); package body ASAOPEN is package ASAC renames ASA_DEFINITIONS.COMMANDS; package ASAS renames ASA_DEFINITIONS.SWITCHES; package DIO renames DEVICE_INDEPENDENT_IO; package DNA renames DIRECTORY_TOOLS.NAMING; package RO renames REMOTE_OPERATIONS; package SS renames SIMPLE_STATUS; package SU renames STRING_UTILITIES; package UNIX renames UNIX_DEFINITIONS; LOCAL_ANNOTATIONS : constant STRING := ASA_DEFINITIONS.MAIN_CLASS_DIRECTORY & ".ANNOTATIONS"; LOCAL_ANNOTATION_TYPES : constant STRING := ASA_DEFINITIONS.MAIN_CLASS_DIRECTORY & ".ANNOTATION_TYPES"; TEMPLATE_ERROR : exception; function "-" (S1 : in STRING; S2 : in STRING) return STRING is begin pragma ASSERT (S1'LENGTH >= S2'LENGTH and then S1 (S1'LAST - S2'LENGTH + 1 .. S1'LAST) = S2); return S1 (S1'FIRST .. S1'LAST - S2'LENGTH); end "-"; -- ------------------------------ -- ( ) Body of external procedure -- ------------------------------ procedure EXECUTE (IN_CONTEXT : in REMOTE_OPERATIONS.CONTEXT; MODEL : in STRING; TEMPLATE_NAME : in STRING; STATE : in out STATE_RECORD; STATUS : out SIMPLE_STATUS.CONDITION) is -- ---------------- -- ( . ) Local data -- ---------------- S : SS.CONDITION; ERROR_FILE : IO.FILE_TYPE; -- The remote stderr and stdout. NULL_INPUT_FILE : DIO.FILE_TYPE; OUTPUT_FILE : IO.FILE_TYPE; -- The result of executing the script. SCRIPT_FILE : IO.FILE_TYPE; TEMPLATE_FILE : IO.FILE_TYPE; REMOTE_ANNOTATIONS : constant STRING := UNIX.TEMPORARY_FILENAME (ASAC.ANNOTATIONS_EXTENSION); REMOTE_ANNOTATION_TYPES : constant STRING := UNIX.TEMPORARY_FILENAME (ASAC.ANNOTATION_TYPES_EXTENSION); REMOTE_OUTPUT : constant STRING := UNIX.TEMPORARY_FILENAME (""); REMOTE_PROCESSED_MODEL : constant STRING := UNIX.TEMPORARY_FILENAME (ASAC.MODEL_EXTENSION); REMOTE_SCRIPT : constant STRING := UNIX.TEMPORARY_FILENAME (ASAC.ASAOPEN_EXTENSION); --[bugs] -- Due to a bug in ASA, the .opn extension cannot be included on -- the command line. -- Due to a bug in REMOTE_OPERATIONS.EXECUTE, we put a leading -- space to make sure that the lower bound of the command string -- is 1. -- ASAOPEN_COMMAND : constant STRING := ' ' & ASAS.BIN_DIRECTORY (RO.MACHINE (IN_CONTEXT)) & UNIX.CONTEXT_SEPARATOR & ASAC.ASAOPEN & ' ' & (REMOTE_SCRIPT - ASAC.ASAOPEN_EXTENSION); RM_COMMAND : constant STRING := UNIX.REMOVE & ' ' & REMOTE_ANNOTATIONS & ' ' & REMOTE_ANNOTATION_TYPES & ' ' & REMOTE_OUTPUT & ' ' & REMOTE_SCRIPT & ' ' & REMOTE_PROCESSED_MODEL; SED_COMMAND : constant STRING := UNIX.STREAM_EDITOR & ' ' & UNIX.EDIT & ' ' & "'/&requirement_[1-9] '""'""'.*'""'""'/s/ /_/g'" & ' ' & UNIX.EDIT & ' ' & "'/&requirement_[1-9] '""'""'[^'""'""']*$/,/'""'""';/s/ /_/g'" & ' ' & UNIX.EDIT & ' ' & "'/&requirement_[1-9]/s/_*\(&requirement_[1-9]\)_*'""'""'/ \1 '""'""'/'" & ' ' & UNIX.EDIT & ' ' & """s/_*;/;/""" & ' ' & MODEL & ' ' & UNIX.OUTPUT_REDIRECT & ' ' & REMOTE_PROCESSED_MODEL; -- ------------------------ -- ( . ) Template expansion -- ------------------------ procedure EXPAND (TEMPLATE_FILE : in IO.FILE_TYPE; SCRIPT_FILE : in IO.FILE_TYPE) is use IO; pragma ASSERT (IO.IS_OPEN (TEMPLATE_FILE) and then IO.MODE (TEMPLATE_FILE) = IO.IN_FILE and then IO.IS_OPEN (SCRIPT_FILE) and then IO.MODE (SCRIPT_FILE) = IO.OUT_FILE); -- -- A line is decomposed into symbol fields and constant fields. -- Fields are separated by the separator. The first field of a -- line is always a constant field. BOUNDARY is the first -- character of the current field. -- type FIELD is (CONSTANT_FIELD, SYMBOL_FIELD); CURRENT_FIELD : FIELD; BOUNDARY : NATURAL; THE_SYMBOL : SYMBOL; begin while not IO.END_OF_FILE (TEMPLATE_FILE) loop declare LINE : constant STRING := IO.GET_LINE (TEMPLATE_FILE); begin CURRENT_FIELD := CONSTANT_FIELD; BOUNDARY := LINE'FIRST; for I in LINE'FIRST .. LINE'LAST - SEPARATOR'LENGTH + 1 loop if LINE (I .. I + SEPARATOR'LENGTH - 1) = SEPARATOR then case CURRENT_FIELD is when CONSTANT_FIELD => -- -- Found the initial symbol separator. First write -- the text preceding it. -- IO.PUT (SCRIPT_FILE, LINE (BOUNDARY .. I - 1)); CURRENT_FIELD := SYMBOL_FIELD; BOUNDARY := I + SEPARATOR'LENGTH; when SYMBOL_FIELD => -- -- Found the final symbol separator. Write the -- value of the symbol. -- THE_SYMBOL := SYMBOL'VALUE (LINE (BOUNDARY .. I - 1)); case THE_SYMBOL is when ANNOTATIONS => IO.PUT (SCRIPT_FILE, REMOTE_ANNOTATIONS); when ANNOTATION_TYPES => IO.PUT (SCRIPT_FILE, REMOTE_ANNOTATION_TYPES); when ASAOPEN.MODEL => IO.PUT (SCRIPT_FILE, REMOTE_PROCESSED_MODEL); when OUTPUT => IO.PUT (SCRIPT_FILE, REMOTE_OUTPUT); end case; CURRENT_FIELD := CONSTANT_FIELD; BOUNDARY := I + SEPARATOR'LENGTH; end case; end if; end loop; IO.PUT_LINE (SCRIPT_FILE, LINE (BOUNDARY .. LINE'LAST)); end; end loop; exception when others => raise TEMPLATE_ERROR; end EXPAND; begin -- -- Create a script file to hold the expanded asaopen text. Open -- the template, expand it, close it. Reset the script file to -- read mode. -- IO.CREATE (FILE => SCRIPT_FILE, MODE => IO.OUT_FILE, NAME => ""); IO.OPEN (FILE => TEMPLATE_FILE, MODE => IO.IN_FILE, NAME => TEMPLATE_NAME); LOGGER.NOTE ("Expanding template file " & IO.NAME (TEMPLATE_FILE) & " into " & IO.NAME (SCRIPT_FILE)); EXPAND (TEMPLATE_FILE => TEMPLATE_FILE, SCRIPT_FILE => SCRIPT_FILE); IO.CLOSE (TEMPLATE_FILE); IO.RESET (FILE => SCRIPT_FILE, MODE => IO.IN_FILE); -- -- Download the script file and close it. -- LOGGER.NOTE ("Copying file " & IO.NAME (SCRIPT_FILE) & " to " & REMOTE_SCRIPT); RO.PUT (FROM_FILE => IO.CONVERT (SCRIPT_FILE), TO_FILE => REMOTE_SCRIPT, IN_CONTEXT => IN_CONTEXT, STATUS => S); LOGGER.STATUS (S, INTERACTIVE => FALSE); IO.CLOSE (SCRIPT_FILE); -- -- Download the annotation files. -- LOGGER.NOTE ("Copying file " & LOCAL_ANNOTATIONS & " to " & REMOTE_ANNOTATIONS); RO.PUT (FROM_FILE => LOCAL_ANNOTATIONS, TO_FILE => REMOTE_ANNOTATIONS, IN_CONTEXT => IN_CONTEXT, STATUS => S); LOGGER.STATUS (S, INTERACTIVE => FALSE); LOGGER.NOTE ("Copying file " & LOCAL_ANNOTATION_TYPES & " to " & REMOTE_ANNOTATION_TYPES); RO.PUT (FROM_FILE => LOCAL_ANNOTATION_TYPES, TO_FILE => REMOTE_ANNOTATION_TYPES, IN_CONTEXT => IN_CONTEXT, STATUS => S); LOGGER.STATUS (S, INTERACTIVE => FALSE); -- -- Create error files. -- IO.CREATE (FILE => ERROR_FILE, MODE => IO.OUT_FILE, NAME => ""); --[bug] -- Due to a bug in asaopen, the blanks are stripped from the -- requirements' text. Before calling asaopen, we run sed on the -- model file to change every space into an underscore. The -- reverse transformation will be made by package HIERARCHY. -- LOGGER.NOTE ("Executing command """ & SED_COMMAND & '"'); RO.EXECUTE (COMMAND => SED_COMMAND, IN_CONTEXT => IN_CONTEXT, INPUT => NULL_INPUT_FILE, OUTPUT => IO.CONVERT (ERROR_FILE), ERROR => IO.CONVERT (ERROR_FILE), STATUS => S, TIMEOUT => RO.WAIT_FOREVER); LOGGER.STATUS (S, INTERACTIVE => FALSE); -- -- Execute asaopen on the downloaded script file. Do not separate -- output and error flows. -- LOGGER.NOTE ("Executing command """ & ASAOPEN_COMMAND & '"'); RO.EXECUTE (COMMAND => ASAOPEN_COMMAND, IN_CONTEXT => IN_CONTEXT, INPUT => NULL_INPUT_FILE, OUTPUT => IO.CONVERT (ERROR_FILE), ERROR => IO.CONVERT (ERROR_FILE), STATUS => S, TIMEOUT => RO.WAIT_FOREVER); -- -- Process the error file. -- IO.RESET (FILE => ERROR_FILE, MODE => IO.IN_FILE); while not IO.END_OF_FILE (ERROR_FILE) loop LOGGER.DEBUG (IO.GET_LINE (ERROR_FILE)); end loop; LOGGER.STATUS (S, INTERACTIVE => FALSE); -- -- Upload the result of execution. -- IO.CREATE (FILE => OUTPUT_FILE, MODE => IO.OUT_FILE, NAME => ""); LOGGER.NOTE ("Copying file " & REMOTE_OUTPUT & " to " & IO.NAME (OUTPUT_FILE)); RO.GET (FROM_FILE => REMOTE_OUTPUT, IN_CONTEXT => IN_CONTEXT, TO_FILE => IO.CONVERT (OUTPUT_FILE), STATUS => S); LOGGER.STATUS (S, INTERACTIVE => FALSE); -- -- Clean up temporary files. -- IO.RESET (FILE => ERROR_FILE, MODE => IO.OUT_FILE); LOGGER.NOTE ("Executing command """ & RM_COMMAND & '"'); RO.EXECUTE (COMMAND => RM_COMMAND, IN_CONTEXT => IN_CONTEXT, INPUT => NULL_INPUT_FILE, OUTPUT => IO.CONVERT (ERROR_FILE), ERROR => IO.CONVERT (ERROR_FILE), STATUS => S, TIMEOUT => RO.WAIT_FOREVER); -- -- Process the error file and close it. -- IO.RESET (FILE => ERROR_FILE, MODE => IO.IN_FILE); while not IO.END_OF_FILE (ERROR_FILE) loop declare THE_LINE : constant STRING := IO.GET_LINE (ERROR_FILE); begin if SU.LOCATE (FRAGMENT => "ERROR", WITHIN => THE_LINE) = 0 then LOGGER.DEBUG (THE_LINE); else LOGGER.ERROR (THE_LINE); end if; end; end loop; IO.CLOSE (ERROR_FILE); LOGGER.STATUS (S, INTERACTIVE => FALSE); -- -- Process the output file and close it. -- IO.RESET (FILE => OUTPUT_FILE, MODE => IO.IN_FILE); while not IO.END_OF_FILE (OUTPUT_FILE) loop PROCESS (STATE => STATE, LINE => IO.GET_LINE (OUTPUT_FILE)); end loop; IO.CLOSE (OUTPUT_FILE); STATUS := S; exception when PROFILE.ERROR => SS.CREATE_CONDITION (STATUS => S, ERROR_TYPE => "", MESSAGE => "asaopen execution is quitting after errors", SEVERITY => SS.PROBLEM); STATUS := S; when TEMPLATE_ERROR => SS.CREATE_CONDITION (STATUS => S, ERROR_TYPE => "Asaopen", MESSAGE => "syntax error in template or template not found", SEVERITY => SS.PROBLEM); STATUS := S; when others => SS.CREATE_CONDITION (STATUS => S, ERROR_TYPE => "Asaopen", MESSAGE => "execution aborted by exception " & DEBUG_TOOLS.GET_EXCEPTION_NAME, SEVERITY => SS.PROBLEM); STATUS := S; end EXECUTE; end ASAOPEN;with CALENDAR; with GATEWAY_OBJECT; with REQUIREMENTS; with UNIX_DEFINITIONS; package ASA_DEFINITIONS is -- Product name. ASA : constant STRING := "ASA"; -- Gateway classes. type GATEWAY_CLASS is (ASA_MODEL, ASA_MODULE, ASA_REQUIREMENT); MAIN_CLASS_DIRECTORY : constant STRING := "!MACHINE.GATEWAY_CLASSES." & GATEWAY_CLASS'IMAGE (ASA_MODEL); package COMMANDS is package UNIX renames UNIX_DEFINITIONS; -- Asaedit command and options. ASAEDIT : constant STRING := "asaedit"; ANNOTATIONS_EXTENSION : constant STRING := UNIX.EXTENSION_SEPARATOR & "ann"; ANNOTATION_TYPES_EXTENSION : constant STRING := UNIX.EXTENSION_SEPARATOR & "aty"; MODEL_EXTENSION : constant STRING := UNIX.EXTENSION_SEPARATOR & "lsa"; ANNOTATIONS : constant STRING := "-ann"; ANNOTATION_TYPES : constant STRING := "-aty"; ASA : constant STRING := "-asa"; COUPLING : constant STRING := "-mcag"; DEVICE : constant STRING := "-dev"; GEODE : constant STRING := "-geode"; NODE : constant STRING := "-node"; NO_COMMENTS : constant STRING := "-ncom"; NO_FACTORIZE : constant STRING := "-nfact"; NO_LABELS : constant STRING := "-nlabel"; NO_LIMITS : constant STRING := "-nlimit"; NO_WARNINGS : constant STRING := "-nw"; OPTIONS : constant STRING := "-config"; READ_ONLY : constant STRING := "-read"; SHOW_ANNOTATIONS : constant STRING := "-seeann"; START_NODE : constant STRING := "-startnode"; UNDO : constant STRING := "-undo"; -- Asaopen command and options. ASAOPEN : constant STRING := "asaopen"; ASAOPEN_EXTENSION : constant STRING := UNIX.EXTENSION_SEPARATOR & "opn"; LISTING : constant STRING := "-list"; end COMMANDS; package PROPERTIES is package GWO renames GATEWAY_OBJECT; function ASA_COMMENT (H : in GWO.HANDLE) return STRING; function ASA_DEPENDENTS (H : in GWO.HANDLE) return STRING; function ASA_DEPENDENTS (H : in GWO.HANDLE; NUMBER : in REQUIREMENTS.FUNCTIONAL_REQUIREMENT_NUMBER) return STRING; function ASA_ID (H : in GWO.HANDLE) return POSITIVE; function ASA_LAST_ID (H : in GWO.HANDLE) return NATURAL; function ASA_LAST_REQUIREMENT_ID (H : in GWO.HANDLE) return NATURAL; function ASA_NODE_NUMBER (H : in GWO.HANDLE) return STRING; function ASA_REQUIREMENT (H : in GWO.HANDLE; NUMBER : in REQUIREMENTS.FUNCTIONAL_REQUIREMENT_NUMBER) return STRING; function ASA_REQUIREMENT_KIND (H : in GWO.HANDLE) return REQUIREMENTS.NON_FUNCTIONAL; function ASA_REQUIREMENT_TEXT (H : in GWO.HANDLE) return STRING; function ASA_UPDATE_TIME (H : in GWO.HANDLE) return CALENDAR.TIME; function CLASS (H : in GWO.HANDLE) return GATEWAY_CLASS; function DATA_CONTEXT (H : in GWO.HANDLE) return STRING; function DATA_HOST (H : in GWO.HANDLE) return STRING; function DATA_NAME (H : in GWO.HANDLE) return STRING; procedure SET_ASA_COMMENT (H : in GWO.HANDLE; VALUE : in STRING); procedure SET_ASA_DEPENDENTS (H : in GWO.HANDLE; VALUE : in STRING); procedure SET_ASA_DEPENDENTS (H : in GWO.HANDLE; NUMBER : in REQUIREMENTS.FUNCTIONAL_REQUIREMENT_NUMBER; VALUE : in STRING); procedure SET_ASA_ID (H : in GWO.HANDLE; VALUE : in POSITIVE); procedure SET_ASA_LAST_ID (H : in GWO.HANDLE; VALUE : in NATURAL); procedure SET_ASA_LAST_REQUIREMENT_ID (H : in GWO.HANDLE; VALUE : in NATURAL); procedure SET_ASA_NODE_NUMBER (H : in GWO.HANDLE; VALUE : in STRING); procedure SET_ASA_REQUIREMENT (H : in GWO.HANDLE; NUMBER : in REQUIREMENTS.FUNCTIONAL_REQUIREMENT_NUMBER; VALUE : in STRING); procedure SET_ASA_REQUIREMENT_KIND (H : in GWO.HANDLE; VALUE : in REQUIREMENTS.NON_FUNCTIONAL); procedure SET_ASA_REQUIREMENT_TEXT (H : in GWO.HANDLE; VALUE : in STRING); procedure SET_ASA_UPDATE_TIME (H : in GWO.HANDLE; VALUE : in CALENDAR.TIME); procedure SET_DATA_CONTEXT (H : in GWO.HANDLE; VALUE : in STRING); procedure SET_DATA_HOST (H : in GWO.HANDLE; VALUE : in STRING); procedure SET_DATA_NAME (H : in GWO.HANDLE; VALUE : in STRING); procedure SET_PARENT_NAME (H : in GWO.HANDLE; VALUE : in STRING); private ASA_COMMENT_N : constant STRING := ASA & ".COMMENT"; ASA_DEPENDENTS_F_N : constant STRING := ASA & ".DEPENDENTS_"; ASA_DEPENDENTS_NF_N : constant STRING := ASA & ".DEPENDENTS"; ASA_ID_N : constant STRING := ASA & ".ID"; ASA_LAST_ID_N : constant STRING := ASA & ".LAST_ID"; ASA_LAST_REQUIREMENT_ID_N : constant STRING := ASA & ".LAST_REQUIREMENT_ID"; ASA_NODE_NUMBER_N : constant STRING := ASA & ".NODE_NUMBER"; ASA_REQUIREMENT_N : constant STRING := ASA & ".REQUIREMENT_"; ASA_REQUIREMENT_KIND_N : constant STRING := ASA & ".REQUIREMENT_KIND"; ASA_REQUIREMENT_TEXT_N : constant STRING := ASA & ".REQUIREMENT_TEXT"; ASA_UPDATE_TIME_N : constant STRING := ASA & ".UPDATE_TIME"; CLASS_NAME_N : constant STRING := "CLASS_NAME"; DATA_CONTEXT_N : constant STRING := "DATA.CONTEXT"; DATA_HOST_N : constant STRING := "DATA.HOST"; DATA_NAME_N : constant STRING := "DATA.NAME"; PARENT_NAME_N : constant STRING := "PARENT_NAME"; end PROPERTIES; package SWITCHES is type ACTION is (ABANDON, ACCEPT_CHANGES, CONTINUE); type CONTROL_LEVEL is (CONTROL_NONE, CONTROL_MODEL, CONTROL_MODULES, CONTROL_ALL); function ACTION_WHEN_OUT_OF_DATE return ACTION; function BIN_DIRECTORY (HOST : in STRING) return STRING; function CMVC_CONTROL_LEVEL return CONTROL_LEVEL; function REMOTE_DISPLAY return STRING; -- -- Exactly one task of the following type MUST be declared in a -- library package by the gateway server. This object declaration -- must NOT be part of the transitive closure of any user program: -- such a program would not terminate. -- task type REGISTER is entry STOP; end REGISTER; private ACTION_WHEN_OUT_OF_DATE_N : constant STRING := "ACTION_WHEN_OUT_OF_DATE"; BIN_DIRECTORIES_N : constant STRING := "BIN_DIRECTORIES"; CMVC_CONTROL_LEVEL_N : constant STRING := "CMVC_CONTROL_LEVEL"; REMOTE_DISPLAY_N : constant STRING := "REMOTE_DISPLAY"; end SWITCHES; end ASA_DEFINITIONS;package body ASA_DEFINITIONS is package body PROPERTIES is separate; package body SWITCHES is separate; end ASA_DEFINITIONS;with DIRECTORY; with GATEWAY_PROPERTY; with LOGGER; with TIME_UTILITIES; separate (ASA_DEFINITIONS) package body PROPERTIES is package DNA renames DIRECTORY.NAMING; package GWP renames GATEWAY_PROPERTY; package TU renames TIME_UTILITIES; procedure ERROR (H : in GWO.HANDLE; PROPERTY_NAME : in STRING) is begin LOGGER.ERROR ("Error detected while setting property " & PROPERTY_NAME & " of object " & DNA.GET_FULL_NAME (GWO.DIRECTORY_OBJECT (H))); end ERROR; function ASA_COMMENT (H : in GWO.HANDLE) return STRING is begin return GWO.VALUE (H, PROPERTY_NAME => ASA_COMMENT_N); end ASA_COMMENT; function ASA_DEPENDENTS (H : in GWO.HANDLE) return STRING is begin return GWP.VALUE (H, PROPERTY_NAME => ASA_DEPENDENTS_NF_N); end ASA_DEPENDENTS; function ASA_DEPENDENTS (H : in GWO.HANDLE; NUMBER : in REQUIREMENTS.FUNCTIONAL_REQUIREMENT_NUMBER) return STRING is NUMBER_IMAGE : constant STRING := REQUIREMENTS.FUNCTIONAL_REQUIREMENT_NUMBER'IMAGE (NUMBER); begin return GWP.VALUE (H, PROPERTY_NAME => ASA_DEPENDENTS_F_N & NUMBER_IMAGE (NUMBER_IMAGE'FIRST + 1 .. NUMBER_IMAGE'LAST)); end ASA_DEPENDENTS; function ASA_ID (H : in GWO.HANDLE) return POSITIVE is begin return POSITIVE'VALUE (GWP.VALUE (H, PROPERTY_NAME => ASA_ID_N)); end ASA_ID; function ASA_LAST_ID (H : in GWO.HANDLE) return NATURAL is begin return NATURAL'VALUE (GWP.VALUE (H, PROPERTY_NAME => ASA_LAST_ID_N)); end ASA_LAST_ID; function ASA_LAST_REQUIREMENT_ID (H : in GWO.HANDLE) return NATURAL is begin return NATURAL'VALUE (GWP.VALUE (H, PROPERTY_NAME => ASA_LAST_REQUIREMENT_ID_N)); end ASA_LAST_REQUIREMENT_ID; function ASA_NODE_NUMBER (H : in GWO.HANDLE) return STRING is begin return GWP.VALUE (H, PROPERTY_NAME => ASA_NODE_NUMBER_N); end ASA_NODE_NUMBER; function ASA_REQUIREMENT (H : in GWO.HANDLE; NUMBER : in REQUIREMENTS.FUNCTIONAL_REQUIREMENT_NUMBER) return STRING is NUMBER_IMAGE : constant STRING := REQUIREMENTS.FUNCTIONAL_REQUIREMENT_NUMBER'IMAGE (NUMBER); begin return GWO.VALUE (H, PROPERTY_NAME => ASA_REQUIREMENT_N & NUMBER_IMAGE (NUMBER_IMAGE'FIRST + 1 .. NUMBER_IMAGE'LAST)); end ASA_REQUIREMENT; function ASA_REQUIREMENT_KIND (H : in GWO.HANDLE) return REQUIREMENTS.NON_FUNCTIONAL is begin return REQUIREMENTS.REQUIREMENT_KIND'VALUE (GWP.VALUE (H, PROPERTY_NAME => ASA_REQUIREMENT_KIND_N)); end ASA_REQUIREMENT_KIND; function ASA_REQUIREMENT_TEXT (H : in GWO.HANDLE) return STRING is begin return GWO.VALUE (H, PROPERTY_NAME => ASA_REQUIREMENT_TEXT_N); end ASA_REQUIREMENT_TEXT; function ASA_UPDATE_TIME (H : in GWO.HANDLE) return CALENDAR.TIME is begin return TU.CONVERT_TIME (TU.VALUE (GWP.VALUE (H, PROPERTY_NAME => ASA_UPDATE_TIME_N))); end ASA_UPDATE_TIME; function CLASS (H : in GWO.HANDLE) return GATEWAY_CLASS is begin return GATEWAY_CLASS'VALUE (GWP.VALUE (H, PROPERTY_NAME => CLASS_NAME_N)); end CLASS; function DATA_CONTEXT (H : in GWO.HANDLE) return STRING is begin return GWP.VALUE (H, PROPERTY_NAME => DATA_CONTEXT_N); end DATA_CONTEXT; function DATA_HOST (H : in GWO.HANDLE) return STRING is begin return GWP.VALUE (H, PROPERTY_NAME => DATA_HOST_N); end DATA_HOST; function DATA_NAME (H : in GWO.HANDLE) return STRING is begin return GWP.VALUE (H, PROPERTY_NAME => DATA_NAME_N); end DATA_NAME; procedure SET_ASA_COMMENT (H : in GWO.HANDLE; VALUE : in STRING) is S : BOOLEAN; begin GWP.SET_VALUE (H, PROPERTY_NAME => ASA_COMMENT_N, NEW_VALUE => VALUE, SUCCESS => S); if not S then ERROR (H, ASA_DEPENDENTS_NF_N); end if; end SET_ASA_COMMENT; procedure SET_ASA_DEPENDENTS (H : in GWO.HANDLE; VALUE : in STRING) is S : BOOLEAN; begin GWP.SET_VALUE (H, PROPERTY_NAME => ASA_DEPENDENTS_NF_N, NEW_VALUE => VALUE, SUCCESS => S); if not S then ERROR (H, ASA_DEPENDENTS_NF_N); end if; end SET_ASA_DEPENDENTS; procedure SET_ASA_DEPENDENTS (H : in GWO.HANDLE; NUMBER : in REQUIREMENTS.FUNCTIONAL_REQUIREMENT_NUMBER; VALUE : in STRING) is NUMBER_IMAGE : constant STRING := REQUIREMENTS.FUNCTIONAL_REQUIREMENT_NUMBER'IMAGE (NUMBER); S : BOOLEAN; begin GWP.SET_VALUE (H, PROPERTY_NAME => ASA_DEPENDENTS_F_N & NUMBER_IMAGE (NUMBER_IMAGE'FIRST + 1 .. NUMBER_IMAGE'LAST), NEW_VALUE => VALUE, SUCCESS => S); if not S then ERROR (H, ASA_DEPENDENTS_F_N & NUMBER_IMAGE (NUMBER_IMAGE'FIRST + 1 .. NUMBER_IMAGE'LAST)); end if; end SET_ASA_DEPENDENTS; procedure SET_ASA_ID (H : in GWO.HANDLE; VALUE : in POSITIVE) is S : BOOLEAN; begin GWP.SET_VALUE (H, PROPERTY_NAME => ASA_ID_N, NEW_VALUE => POSITIVE'IMAGE (VALUE), SUCCESS => S); if not S then ERROR (H, ASA_ID_N); end if; end SET_ASA_ID; procedure SET_ASA_LAST_ID (H : in GWO.HANDLE; VALUE : in NATURAL) is S : BOOLEAN; begin GWP.SET_VALUE (H, PROPERTY_NAME => ASA_LAST_ID_N, NEW_VALUE => NATURAL'IMAGE (VALUE), SUCCESS => S); if not S then ERROR (H, ASA_LAST_ID_N); end if; end SET_ASA_LAST_ID; procedure SET_ASA_LAST_REQUIREMENT_ID (H : in GWO.HANDLE; VALUE : in NATURAL) is S : BOOLEAN; begin GWP.SET_VALUE (H, PROPERTY_NAME => ASA_LAST_REQUIREMENT_ID_N, NEW_VALUE => NATURAL'IMAGE (VALUE), SUCCESS => S); if not S then ERROR (H, ASA_LAST_REQUIREMENT_ID_N); end if; end SET_ASA_LAST_REQUIREMENT_ID; procedure SET_ASA_NODE_NUMBER (H : in GWO.HANDLE; VALUE : in STRING) is S : BOOLEAN; begin GWP.SET_VALUE (H, PROPERTY_NAME => ASA_NODE_NUMBER_N, NEW_VALUE => VALUE, SUCCESS => S); if not S then ERROR (H, ASA_NODE_NUMBER_N); end if; end SET_ASA_NODE_NUMBER; procedure SET_ASA_REQUIREMENT (H : in GWO.HANDLE; NUMBER : in REQUIREMENTS.FUNCTIONAL_REQUIREMENT_NUMBER; VALUE : in STRING) is NUMBER_IMAGE : constant STRING := REQUIREMENTS.FUNCTIONAL_REQUIREMENT_NUMBER'IMAGE (NUMBER); S : BOOLEAN; begin GWP.SET_VALUE (H, PROPERTY_NAME => ASA_REQUIREMENT_N & NUMBER_IMAGE (NUMBER_IMAGE'FIRST + 1 .. NUMBER_IMAGE'LAST), NEW_VALUE => VALUE, SUCCESS => S); if not S then ERROR (H, ASA_REQUIREMENT_N & NUMBER_IMAGE (NUMBER_IMAGE'FIRST + 1 .. NUMBER_IMAGE'LAST)); end if; end SET_ASA_REQUIREMENT; procedure SET_ASA_REQUIREMENT_KIND (H : in GWO.HANDLE; VALUE : in REQUIREMENTS.NON_FUNCTIONAL) is S : BOOLEAN; begin GWP.SET_VALUE (H, PROPERTY_NAME => ASA_REQUIREMENT_KIND_N, NEW_VALUE => REQUIREMENTS.REQUIREMENT_KIND'IMAGE (VALUE), SUCCESS => S); if not S then ERROR (H, ASA_REQUIREMENT_KIND_N); end if; end SET_ASA_REQUIREMENT_KIND; procedure SET_ASA_REQUIREMENT_TEXT (H : in GWO.HANDLE; VALUE : in STRING) is S : BOOLEAN; begin GWP.SET_VALUE (H, PROPERTY_NAME => ASA_REQUIREMENT_TEXT_N, NEW_VALUE => VALUE, SUCCESS => S); if not S then ERROR (H, ASA_REQUIREMENT_TEXT_N); end if; end SET_ASA_REQUIREMENT_TEXT; procedure SET_ASA_UPDATE_TIME (H : in GWO.HANDLE; VALUE : in CALENDAR.TIME) is S : BOOLEAN; begin GWP.SET_VALUE (H, PROPERTY_NAME => ASA_UPDATE_TIME_N, NEW_VALUE => TU.IMAGE (TU.CONVERT_TIME (VALUE)), SUCCESS => S); if not S then ERROR (H, ASA_UPDATE_TIME_N); end if; end SET_ASA_UPDATE_TIME; procedure SET_DATA_CONTEXT (H : in GWO.HANDLE; VALUE : in STRING) is S : BOOLEAN; begin GWP.SET_VALUE (H, PROPERTY_NAME => DATA_CONTEXT_N, NEW_VALUE => VALUE, SUCCESS => S); if not S then ERROR (H, DATA_CONTEXT_N); end if; end SET_DATA_CONTEXT; procedure SET_DATA_HOST (H : in GWO.HANDLE; VALUE : in STRING) is S : BOOLEAN; begin GWP.SET_VALUE (H, PROPERTY_NAME => DATA_HOST_N, NEW_VALUE => VALUE, SUCCESS => S); if not S then ERROR (H, DATA_HOST_N); end if; end SET_DATA_HOST; procedure SET_DATA_NAME (H : in GWO.HANDLE; VALUE : in STRING) is S : BOOLEAN; begin GWP.SET_VALUE (H, PROPERTY_NAME => DATA_NAME_N, NEW_VALUE => VALUE, SUCCESS => S); if not S then ERROR (H, DATA_NAME_N); end if; end SET_DATA_NAME; procedure SET_PARENT_NAME (H : in GWO.HANDLE; VALUE : in STRING) is S : BOOLEAN; begin GWP.SET_VALUE (H, PROPERTY_NAME => PARENT_NAME_N, NEW_VALUE => VALUE, SUCCESS => S); if not S then ERROR (H, PARENT_NAME_N); end if; end SET_PARENT_NAME; end PROPERTIES; with PARAMETER_PARSER; with STRING_UTILITIES; with SWITCH_IMPLEMENTATION; separate (ASA_DEFINITIONS) package body SWITCHES is package SI renames SWITCH_IMPLEMENTATION; type OPTION_ID is range 0 .. 1; -- --------------------------- -- ( ) Action when out-of-date -- --------------------------- package ACTION_WHEN_OUT_OF_DATE_FORMALS is new SI.DISCRETE_SWITCH_FORMALS (ACTION); function ACTION_WHEN_OUT_OF_DATE_IMAGE (VALUE : in ACTION) return SI.SWITCH_VALUE_IMAGE is begin return STRING_UTILITIES.CAPITALIZE (ACTION'IMAGE (VALUE)); end ACTION_WHEN_OUT_OF_DATE_IMAGE; function ACTION_WHEN_OUT_OF_DATE return ACTION is THE_HANDLE : SI.HANDLE; begin SI.SWITCH_FILE.OPEN_SESSION_SWITCHES (THE_HANDLE); declare VALUE : constant ACTION := ACTION'VALUE (SI.IMAGE (THE_HANDLE, NAME => ASA & '.' & ACTION_WHEN_OUT_OF_DATE_N)); begin SI.SWITCH_FILE.CLOSE (THE_HANDLE); return VALUE; end; end ACTION_WHEN_OUT_OF_DATE; -- ------------------- -- ( ) Bin directories -- ------------------- package PP is new PARAMETER_PARSER (OPTION_ID => OPTION_ID); function BIN_DIRECTORY (HOST : in STRING) return STRING is ITER : PP.ITERATOR; S : BOOLEAN; THE_HANDLE : SI.HANDLE; begin SI.SWITCH_FILE.OPEN_SESSION_SWITCHES (THE_HANDLE); PP.DEFINE (OPTION => OPTION_ID'LAST, NAME => HOST, KIND => PP.UNSPECIFIED, DEFAULT_VALUE => "", ALLOW_NAME_PREFIX => FALSE); PP.PARSE (PARAMETER => SI.VALUE (THE_HANDLE, NAME => ASA & '.' & BIN_DIRECTORIES_N), OPTIONS => ITER, SUCCESS => S); SI.SWITCH_FILE.CLOSE (THE_HANDLE); return PP.GET_IMAGE (ITER, NAME => OPTION_ID'LAST); end BIN_DIRECTORY; -- ----------------- -- ( ) Control level -- ----------------- package CMVC_CONTROL_LEVEL_FORMALS is new SI.DISCRETE_SWITCH_FORMALS (CONTROL_LEVEL); function CMVC_CONTROL_LEVEL_IMAGE (VALUE : in CONTROL_LEVEL) return SI.SWITCH_VALUE_IMAGE is begin return STRING_UTILITIES.CAPITALIZE (CONTROL_LEVEL'IMAGE (VALUE)); end CMVC_CONTROL_LEVEL_IMAGE; function CMVC_CONTROL_LEVEL return CONTROL_LEVEL is THE_HANDLE : SI.HANDLE; begin SI.SWITCH_FILE.OPEN_SESSION_SWITCHES (THE_HANDLE); declare VALUE : constant CONTROL_LEVEL := CONTROL_LEVEL'VALUE (SI.IMAGE (THE_HANDLE, NAME => ASA & '.' & CMVC_CONTROL_LEVEL_N)); begin SI.SWITCH_FILE.CLOSE (THE_HANDLE); return VALUE; end; end CMVC_CONTROL_LEVEL; -- ------------------ -- ( ) Remote display -- ------------------ function REMOTE_DISPLAY return STRING is THE_HANDLE : SI.HANDLE; begin SI.SWITCH_FILE.OPEN_SESSION_SWITCHES (THE_HANDLE); declare VALUE : constant STRING := SI.VALUE (THE_HANDLE, NAME => ASA & '.' & REMOTE_DISPLAY_N); begin SI.SWITCH_FILE.CLOSE (THE_HANDLE); return VALUE; end; end REMOTE_DISPLAY; -- ----------------------- -- ( ) Switch registration -- ----------------------- task body REGISTER is package ASA_SWITCHES is new SI.REGISTERED_CLASS (CLASS_NAME => ASA, ALLOW_REDEFINITION => TRUE); -- ----------------------------- -- ( . ) Action when out-of-date -- ----------------------------- function ACTION_WHEN_OUT_OF_DATE_HELP (NAME : SI.SWITCH_VALUE_NAME; IMAGE : SI.SWITCH_VALUE_IMAGE) return STRING is begin return "One of the literals " & ACTION'IMAGE (ABANDON) & ", " & ACTION'IMAGE (ACCEPT_CHANGES) & " or " & ACTION'IMAGE (CONTINUE) & ". Specifies what " & "must be the bevahiour of gateway operations when " & "the information contained in a gateway is " & "suspected to be obsolete"; end ACTION_WHEN_OUT_OF_DATE_HELP; package ASA_GENERIC_ACTION_WHEN_OUT_OF_DATE is new ASA_SWITCHES.GENERIC_SWITCH (SWITCH_TYPE => ACTION, SWITCH_TYPE_ACCESS => ACTION_WHEN_OUT_OF_DATE_FORMALS.ACCESS_TYPE, IMAGE => ACTION_WHEN_OUT_OF_DATE_IMAGE, VALUE => ACTION_WHEN_OUT_OF_DATE_FORMALS.VALUE, DIAGNOSIS => ACTION_WHEN_OUT_OF_DATE_FORMALS.DIAGNOSIS, TYPE_NAME => "Asa_Action", KIND => SI.GENERIC_VALUE); package ASA_ACTION_WHEN_OUT_OF_DATE is new ASA_GENERIC_ACTION_WHEN_OUT_OF_DATE.SWITCH (CATEGORY => 'S', SWITCH_NAME => ACTION_WHEN_OUT_OF_DATE_N, DEFAULT_VALUE => ABANDON, HELP => ACTION_WHEN_OUT_OF_DATE_HELP, ASSIGNED => SI.NOT_INTERESTING); -- --------------------- -- ( . ) Bin directories -- --------------------- function BIN_DIRECTORIES_HELP (NAME : SI.SWITCH_VALUE_NAME; IMAGE : SI.SWITCH_VALUE_IMAGE) return STRING is begin return "A comma separated list of pairs HOST => PATHNAME " & "specifying, for each remote host, the directory " & "holding the ASA executables"; end BIN_DIRECTORIES_HELP; procedure BIN_DIRECTORIES_ASSIGNED (FILE : STRING; IMAGE : SI.SWITCH_VALUE_IMAGE) is begin null; --[improve] -- Should be improved some day to check and normalize the -- switch value. -- end BIN_DIRECTORIES_ASSIGNED; package ASA_BIN_DIRECTORIES is new ASA_SWITCHES.TEXT_SWITCH (CATEGORY => 'S', SWITCH_NAME => BIN_DIRECTORIES_N, DEFAULT_VALUE => "", HELP => BIN_DIRECTORIES_HELP, ASSIGNED => BIN_DIRECTORIES_ASSIGNED); -- ---------------------- -- ( ) CMVC control level -- ---------------------- function CMVC_CONTROL_LEVEL_HELP (NAME : SI.SWITCH_VALUE_NAME; IMAGE : SI.SWITCH_VALUE_IMAGE) return STRING is begin return "One of the literals " & CONTROL_LEVEL'IMAGE (CONTROL_NONE) & ", " & CONTROL_LEVEL'IMAGE (CONTROL_MODEL) & ", " & CONTROL_LEVEL'IMAGE (CONTROL_MODULES) & " or " & CONTROL_LEVEL'IMAGE (CONTROL_ALL) & ". Specifies what " & "gateway objects are to be made controlled at creation"; end CMVC_CONTROL_LEVEL_HELP; package ASA_GENERIC_CMVC_CONTROL_LEVEL is new ASA_SWITCHES.GENERIC_SWITCH (SWITCH_TYPE => CONTROL_LEVEL, SWITCH_TYPE_ACCESS => CMVC_CONTROL_LEVEL_FORMALS.ACCESS_TYPE, IMAGE => CMVC_CONTROL_LEVEL_IMAGE, VALUE => CMVC_CONTROL_LEVEL_FORMALS.VALUE, DIAGNOSIS => CMVC_CONTROL_LEVEL_FORMALS.DIAGNOSIS, TYPE_NAME => "Asa_Control_Level", KIND => SI.GENERIC_VALUE); package ASA_CMVC_CONTROL_LEVEL is new ASA_GENERIC_CMVC_CONTROL_LEVEL.SWITCH (CATEGORY => 'S', SWITCH_NAME => CMVC_CONTROL_LEVEL_N, DEFAULT_VALUE => CONTROL_NONE, HELP => CMVC_CONTROL_LEVEL_HELP, ASSIGNED => SI.NOT_INTERESTING); -- -------------------- -- ( . ) Remote display -- -------------------- function REMOTE_DISPLAY_HELP (NAME : SI.SWITCH_VALUE_NAME; IMAGE : SI.SWITCH_VALUE_IMAGE) return STRING is begin return "Indicate on what X Window display the ASAEDIT editor is " & "to show its images."; end REMOTE_DISPLAY_HELP; package ASA_REMOTE_DISPLAY is new ASA_SWITCHES.TEXT_SWITCH (CATEGORY => 'S', SWITCH_NAME => REMOTE_DISPLAY_N, DEFAULT_VALUE => "", HELP => REMOTE_DISPLAY_HELP, ASSIGNED => SI.NOT_INTERESTING); begin accept STOP; end REGISTER; end SWITCHES; procedure ASA_INTEGRATION_SERVER (RESPONSE : in STRING := "<PROFILE>");with ASA_DEFINITIONS; with ACTIONS; with DEVICE_INDEPENDENT_IO; with DTIA_CLIENT; with JOB_MANAGER; with LOG; with LOGGER; with PROFILE; with SIMPLE_STATUS; procedure ASA_INTEGRATION_SERVER (RESPONSE : in STRING := "<PROFILE>") is package DC renames DTIA_CLIENT; S : SIMPLE_STATUS.CONDITION; task WAITER is entry STOP; end WAITER; task body WAITER is begin accept STOP; end WAITER; procedure TERMINATE_MODEL_SERVER (REASON : in DC.TERMINATION_CONDITION) is begin ACTIONS.MODEL.TERMINATE_SERVER (REASON); if REASON = DC.GATEWAY_CLASS_DEACTIVATED then WAITER.STOP; end if; end TERMINATE_MODEL_SERVER; procedure TERMINATE_NO_SERVER (REASON : in DC.TERMINATION_CONDITION) is begin null; end TERMINATE_NO_SERVER; package MODEL_REGISTRATION is new DC.DTIA_CLIENT_OPERATIONS (CLASS_NAME => ASA_DEFINITIONS.GATEWAY_CLASS'IMAGE (ASA_DEFINITIONS.ASA_MODEL), SESSION_SERVER => FALSE, IMAGE_NAME => ACTIONS.MODEL.IMAGE_NAME, BUILD_IMAGE => ACTIONS.MODEL.BUILD_IMAGE, PRE_CHECK_IN => ACTIONS.MODEL.PRE_CHECK_IN, PRE_MAKE_CONTROLLED => ACTIONS.MODEL.PRE_MAKE_CONTROLLED, PRE_CMVC_COPY => ACTIONS.MODEL.PRE_CMVC_COPY, POST_CMVC_COPY => ACTIONS.MODEL.POST_CMVC_COPY, TERMINATE_SERVER => TERMINATE_MODEL_SERVER); package MODULE_REGISTRATION is new DC.DTIA_CLIENT_OPERATIONS (CLASS_NAME => ASA_DEFINITIONS.GATEWAY_CLASS'IMAGE (ASA_DEFINITIONS.ASA_MODULE), SESSION_SERVER => FALSE, IMAGE_NAME => ACTIONS.MODULE.IMAGE_NAME, BUILD_IMAGE => ACTIONS.MODULE.BUILD_IMAGE, PRE_CHECK_IN => ACTIONS.MODULE.PRE_CHECK_IN, PRE_MAKE_CONTROLLED => ACTIONS.MODULE.PRE_MAKE_CONTROLLED, TERMINATE_SERVER => TERMINATE_NO_SERVER); package REQUIREMENT_REGISTRATION is new DC.DTIA_CLIENT_OPERATIONS (CLASS_NAME => ASA_DEFINITIONS.GATEWAY_CLASS'IMAGE (ASA_DEFINITIONS.ASA_REQUIREMENT), SESSION_SERVER => FALSE, IMAGE_NAME => ACTIONS.REQUIREMENT.IMAGE_NAME, BUILD_IMAGE => ACTIONS.REQUIREMENT.BUILD_IMAGE, POST_COMMIT => ACTIONS.REQUIREMENT.POST_COMMIT, EDIT => ACTIONS.REQUIREMENT.EDIT, IO_OPEN => ACTIONS.REQUIREMENT.IO_OPEN, IO_READ_BYTES => DEVICE_INDEPENDENT_IO.READ, IO_READ_STRING => DEVICE_INDEPENDENT_IO.READ, IO_END_OF_FILE => DEVICE_INDEPENDENT_IO.END_OF_FILE, IO_RESET => DEVICE_INDEPENDENT_IO.RESET, IO_CLOSE => DEVICE_INDEPENDENT_IO.CLOSE, TERMINATE_SERVER => TERMINATE_NO_SERVER); begin LOG.SET_OUTPUT ("!Machine.Error_Logs.Asa_Integration_Server_Log"); PROFILE.SET (RESPONSE, S); MODEL_REGISTRATION.CHECK_IF_REGISTRATION_SUCCEEDED (S); if SIMPLE_STATUS.ERROR (S) then LOGGER.ERROR ("Unable to register class " & ASA_DEFINITIONS.GATEWAY_CLASS'IMAGE (ASA_DEFINITIONS.ASA_MODEL) & " because " & SIMPLE_STATUS.DISPLAY_MESSAGE (S)); else LOGGER.POSITIVE ("Registration of class " & ASA_DEFINITIONS.GATEWAY_CLASS'IMAGE (ASA_DEFINITIONS.ASA_MODEL) & " succeeded"); end if; MODULE_REGISTRATION.CHECK_IF_REGISTRATION_SUCCEEDED (S); if SIMPLE_STATUS.ERROR (S) then LOGGER.ERROR ("Unable to register class " & ASA_DEFINITIONS.GATEWAY_CLASS'IMAGE (ASA_DEFINITIONS.ASA_MODULE) & " because " & SIMPLE_STATUS.DISPLAY_MESSAGE (S)); else LOGGER.POSITIVE ("Registration of class " & ASA_DEFINITIONS.GATEWAY_CLASS'IMAGE (ASA_DEFINITIONS.ASA_MODULE) & " succeeded"); end if; REQUIREMENT_REGISTRATION.CHECK_IF_REGISTRATION_SUCCEEDED (S); if SIMPLE_STATUS.ERROR (S) then LOGGER.ERROR ("Unable to register class " & ASA_DEFINITIONS.GATEWAY_CLASS'IMAGE (ASA_DEFINITIONS.ASA_REQUIREMENT) & " because " & SIMPLE_STATUS.DISPLAY_MESSAGE (S)); else LOGGER.POSITIVE ("Registration of class " & ASA_DEFINITIONS.GATEWAY_CLASS'IMAGE (ASA_DEFINITIONS.ASA_REQUIREMENT) & " succeeded"); end if; JOB_MANAGER.SET_NAME (NAME => ASA_DEFINITIONS.ASA & " Integration Server"); end ASA_INTEGRATION_SERVER;with ACTION; with CALENDAR; with HIERARCHY; with REQUIREMENTS; pragma PRIVATE_EYES_ONLY; with CMVC_IMPLEMENTATION; with STATE_OPERATIONS; package GATEWAYS is type CMVC_CONTROL_KIND is (NOT_CONTROLLED, CONTROLLED_CHECKED_IN, CONTROLLED_CHECKED_OUT); function CMVC_CONTROL (GATEWAY_NAME : in STRING) return CMVC_CONTROL_KIND; type STATE is private; procedure INITIALIZE (THE_STATE : out STATE; ACTION_ID : in ACTION.ID; WORK_ORDER : in STRING); procedure FINALIZE (THE_STATE : in out STATE); procedure AUGMENT (FOR_MODULE : in HIERARCHY.MODULE; IN_LIBRARY : in STRING; HOST : in STRING; MODEL : in STRING; UPDATE_TIME : in CALENDAR.TIME; COMMENTS : in STRING; THE_STATE : in out STATE); procedure CREATE (FOR_MODULE : in HIERARCHY.MODULE; IN_LIBRARY : in STRING; HOST : in STRING; MODEL : in STRING; UPDATE_TIME : in CALENDAR.TIME; COMMENTS : in STRING; THE_STATE : in out STATE); procedure CREATE (IN_GATEWAY : in STRING; REQUIREMENT_NAME : in STRING; REQUIREMENT_KIND : in REQUIREMENTS.NON_FUNCTIONAL; REQUIREMENT_TEXT : in STRING; COMMENTS : in STRING; THE_STATE : in out STATE); procedure DESTROY (GATEWAY_NAME : in STRING; COMMENTS : in STRING; THE_STATE : in out STATE); procedure REDUCE (GATEWAY_NAME : in STRING; CANDIDATE_MODULES : in out HIERARCHY.MODULE_ITERATOR; COMMENTS : in STRING; THE_STATE : in out STATE); private type STATE is record CMVC : STATE_OPERATIONS.STATE; CONFIGURATION : CMVC_IMPLEMENTATION.CONFIGURATION; end record; end GATEWAYS;with ACTION; with ASA_DEFINITIONS; with CALENDAR; with CMVC_IMPLEMENTATION_ERRORS; with DATABASE_OPERATIONS; with DIANA; with DIRECTORY_OPERATIONS; with DIRECTORY; with ERROR_MESSAGES; with HIERARCHY; with JOB_SEGMENT; with LOGGER; with PROFILE; with GATEWAY_OBJECT; with RELOCATION; with SIMPLE_STATUS; with STRING_UTILITIES; with SYSTEM; with UNIX_DEFINITIONS; package body GATEWAYS is package ASAP renames ASA_DEFINITIONS.PROPERTIES; package ASAS renames ASA_DEFINITIONS.SWITCHES; package CMVCE renames CMVC_IMPLEMENTATION_ERRORS; package CMVCI renames CMVC_IMPLEMENTATION; package DCP renames DIRECTORY.CONTROL_POINT; package DIR renames DIRECTORY; package DNA renames DIRECTORY.NAMING; package DOO renames DIRECTORY.OBJECT_OPERATIONS; package GWO renames GATEWAY_OBJECT; package HCHY renames HIERARCHY; package SS renames SIMPLE_STATUS; package SU renames STRING_UTILITIES; package UNIX renames UNIX_DEFINITIONS; function CREATION_MESSAGE (GATEWAY : in GWO.HANDLE) return STRING is begin return "Created gateway object " & DNA.GET_FULL_NAME (GWO.DIRECTORY_OBJECT (GATEWAY)) & " of class " & ASA_DEFINITIONS.GATEWAY_CLASS'IMAGE (ASAP.CLASS (GATEWAY)); end CREATION_MESSAGE; function SAME_PROPERTIES (MODULE : in HCHY.MODULE; GATEWAY : in GWO.HANDLE) return BOOLEAN is SAME_REQUIREMENTS : BOOLEAN := TRUE; begin for R in REQUIREMENTS.FUNCTIONAL_REQUIREMENT_NUMBER loop if ASAP.ASA_REQUIREMENT (H => GATEWAY, NUMBER => R) /= HCHY.REQUIREMENT (M => MODULE, NUMBER => R) then SAME_REQUIREMENTS := FALSE; exit; end if; end loop; return SAME_REQUIREMENTS and then ASAP.ASA_NODE_NUMBER (GATEWAY) = HCHY.NODE_NUMBER (MODULE) and then ASAP.ASA_COMMENT (GATEWAY) = HCHY.COMMENT (MODULE); end SAME_PROPERTIES; function TREE_SIZE (ROOTED_AT : in HCHY.MODULE) return POSITIVE is CHILDREN : HCHY.MODULE_ITERATOR := HCHY.CHILDREN_OF (ROOTED_AT); RESULT : POSITIVE := 1; begin while not HCHY.DONE (CHILDREN) loop RESULT := RESULT + TREE_SIZE (HCHY.VALUE (CHILDREN)); HCHY.NEXT (CHILDREN); end loop; return RESULT; end TREE_SIZE; -- ---------------- -- ( ) CMVC support -- ---------------- function RELATIVE_NAME (FULL_NAME : in STRING; RELATIVE_TO : in STRING) return STRING is begin pragma ASSERT (FULL_NAME'LENGTH >= RELATIVE_TO'LENGTH and then FULL_NAME (FULL_NAME'FIRST .. FULL_NAME'FIRST + RELATIVE_TO'LENGTH - 1) = RELATIVE_TO); return FULL_NAME (FULL_NAME'FIRST + RELATIVE_TO'LENGTH + 1 -- Skip the '.' .. FULL_NAME'LAST); end RELATIVE_NAME; procedure GET_CMVC_CONTROL (OBJECT : in DIR.OBJECT; THE_STATE : in out STATE; CONTROL : out CMVC_CONTROL_KIND) is E : DIR.ERROR_STATUS; N : DNA.NAME_STATUS; S : CMVCI.ERROR_STATUS; CONFIGURATION_OBJECT : DIR.OBJECT; ACTION_ID : ACTION.ID renames THE_STATE.CMVC.ACTION_ID; THE_CONFIGURATION : CMVCI.CONFIGURATION renames THE_STATE.CONFIGURATION; THE_ELEMENT : CMVCI.ELEMENT; THE_VERSION_SET : CMVCI.VERSION_SET; VIEW_OBJECT : DIR.OBJECT; use CMVCE; begin DCP.PARENT_WORLD (THE_OBJECT => OBJECT, THE_WORLD => VIEW_OBJECT, STATUS => E); LOGGER.STATUS (E); -- -- Make sure the configuration associated to the current view is -- open. -- if CMVCI.IS_NIL (THE_CONFIGURATION) then DNA.RESOLVE (NAME => DNA.GET_FULL_NAME (VIEW_OBJECT) & "^$$.Configurations." & DNA.GET_SIMPLE_NAME (VIEW_OBJECT), THE_OBJECT => CONFIGURATION_OBJECT, STATUS => N, ACTION_ID => ACTION_ID); LOGGER.STATUS (N); THE_CONFIGURATION := DATABASE_OPERATIONS.OPEN_CONFIGURATION (FOR_CONFIG_OBJECT => CONFIGURATION_OBJECT, S => THE_STATE.CMVC); end if; -- -- Look at the CMVC database to see if the object being operated -- on is controlled. -- CMVCI.ELEMENT_OPERATIONS.OPEN (ELEMENT_NAME => RELATIVE_NAME (FULL_NAME => DNA.GET_FULL_NAME (OBJECT), RELATIVE_TO => DNA.GET_FULL_NAME (VIEW_OBJECT)), ELEM => THE_ELEMENT, STATUS => S, DB => CMVCI.CONFIGURATION_OPERATIONS.DATABASE_OF (THE_CONFIGURATION)); if S = CMVCE.NO_SUCH_ELEMENT then CONTROL := NOT_CONTROLLED; return; elsif CMVCI.IS_BAD (S) then LOGGER.STATUS (S); end if; CMVCI.VERSION_SET_OPERATIONS.OPEN (ELEM => THE_ELEMENT, SET => THE_VERSION_SET, STATUS => S, CONFIG => THE_CONFIGURATION); if S = CMVCE.ELEMENT_NOT_IN_CONFIGURATION then CONTROL := NOT_CONTROLLED; elsif CMVCI.HISTORY_OPERATIONS.IS_CHECKED_OUT (THE_VERSION_SET) then CONTROL := CONTROLLED_CHECKED_OUT; else CONTROL := CONTROLLED_CHECKED_IN; end if; end GET_CMVC_CONTROL; procedure MAKE_CONTROLLED (GATEWAY : in out GWO.HANDLE; SAVE_SOURCE : in BOOLEAN; COMMENTS : in STRING; THE_STATE : in out STATE) is GATEWAY_OBJECT : constant DIR.OBJECT := GWO.DIRECTORY_OBJECT (GATEWAY); begin DATABASE_OPERATIONS.CONTROL_PARENT (THE_OBJECT => GATEWAY_OBJECT, SET => RELOCATION.NULL_PARAMETER, THE_STATE => THE_STATE.CMVC); DATABASE_OPERATIONS.CREATE_OR_ADD_ELEMENT (THE_OBJECT => GATEWAY_OBJECT, VERSION_SET_NAME => "<AUTO_GENERATE>", SAVE_SOURCE => SAVE_SOURCE, COMMENTS => COMMENTS, COMMAND => "MAKE_CONTROLLED", THE_STATE => THE_STATE.CMVC); exception when CONSTRAINT_ERROR => LOGGER.WARNING ("Gateway object " & DNA.GET_FULL_NAME (GATEWAY_OBJECT) & " could not be controlled because its parent isn't"); end MAKE_CONTROLLED; generic with procedure DO_UPDATE (GATEWAY : in GWO.HANDLE); procedure UPDATER (GATEWAY : in out GWO.HANDLE; COMMENTS : in STRING; THE_STATE : in out STATE); procedure UPDATER (GATEWAY : in out GWO.HANDLE; COMMENTS : in STRING; THE_STATE : in out STATE) is GATEWAY_OBJECT : constant DIR.OBJECT := GWO.DIRECTORY_OBJECT (GATEWAY); ACTION_ID : ACTION.ID renames THE_STATE.CMVC.ACTION_ID; GATEWAY_CMVC_CONTROL : CMVC_CONTROL_KIND; S : SS.CONDITION; begin GET_CMVC_CONTROL (OBJECT => GATEWAY_OBJECT, THE_STATE => THE_STATE, CONTROL => GATEWAY_CMVC_CONTROL); if GATEWAY_CMVC_CONTROL = CONTROLLED_CHECKED_IN then DATABASE_OPERATIONS.CHECK_OUT (OBJECTS => DIRECTORY_OPERATIONS.SINGLETON (GATEWAY_OBJECT, THE_STATE.CMVC), EXPECTED_CHECK_IN_TIME => CALENDAR.CLOCK, COMMENTS => COMMENTS, ALLOW_DEMOTION => FALSE, ALLOW_ACCEPT_CHANGES => TRUE, THE_STATE => THE_STATE.CMVC); end if; if not GWO.IS_MAIN_OBJECT_OPEN_FOR_UPDATE (GATEWAY) then GWO.CLOSE (GATEWAY, S); LOGGER.STATUS (S); GWO.OPEN_MAIN_OBJECT (OBJECT => GATEWAY_OBJECT, H => GATEWAY, UPDATE => TRUE, ACTION_ID => ACTION_ID, ERRORS => S); LOGGER.STATUS (S); end if; DO_UPDATE (GATEWAY); GWO.CLOSE (GATEWAY, S); LOGGER.STATUS (S); if GATEWAY_CMVC_CONTROL = CONTROLLED_CHECKED_IN then DATABASE_OPERATIONS.CHECK_IN (THE_OBJECT => GATEWAY_OBJECT, COMMENTS => COMMENTS, THE_STATE => THE_STATE.CMVC); end if; end UPDATER; -- ------------------------------- -- ( ) Individual gateway creation -- ------------------------------- procedure CREATE_MODEL_GATEWAY (GATEWAY_NAME : in STRING; LAST_ID : in NATURAL; FOR_MODULE : in HCHY.MODULE; HOST : in STRING; MODEL : in STRING; UPDATE_TIME : in CALENDAR.TIME; COMMENTS : in STRING; THE_STATE : in out STATE) is ACTION_ID : ACTION.ID renames THE_STATE.CMVC.ACTION_ID; S : SS.CONDITION; GATEWAY : GWO.HANDLE; use ASAS; begin GWO.CREATE (NAME => GATEWAY_NAME, H => GATEWAY, GATEWAY_CLASS => ASA_DEFINITIONS.GATEWAY_CLASS'IMAGE (ASA_DEFINITIONS.ASA_MODEL), ACTION_ID => ACTION_ID, ERRORS => S); LOGGER.STATUS (S); ASAP.SET_ASA_ID (H => GATEWAY, VALUE => 1); ASAP.SET_ASA_LAST_ID (H => GATEWAY, VALUE => LAST_ID); ASAP.SET_ASA_NODE_NUMBER (H => GATEWAY, VALUE => HCHY.NODE_NUMBER (FOR_MODULE)); ASAP.SET_ASA_COMMENT (H => GATEWAY, VALUE => HCHY.COMMENT (FOR_MODULE)); ASAP.SET_ASA_UPDATE_TIME (H => GATEWAY, VALUE => UPDATE_TIME); ASAP.SET_DATA_CONTEXT (H => GATEWAY, VALUE => UNIX.ENCLOSING_DIRECTORY (MODEL)); ASAP.SET_DATA_HOST (H => GATEWAY, VALUE => HOST); ASAP.SET_DATA_NAME (H => GATEWAY, VALUE => UNIX.LOCAL_NAME (MODEL)); for R in REQUIREMENTS.FUNCTIONAL_REQUIREMENT_NUMBER loop ASAP.SET_ASA_REQUIREMENT (H => GATEWAY, NUMBER => R, VALUE => HCHY.REQUIREMENT (FOR_MODULE, NUMBER => R)); end loop; LOGGER.POSITIVE (CREATION_MESSAGE (GATEWAY)); if ASAS.CMVC_CONTROL_LEVEL >= ASAS.CONTROL_MODEL then MAKE_CONTROLLED (GATEWAY => GATEWAY, SAVE_SOURCE => FALSE, COMMENTS => COMMENTS, THE_STATE => THE_STATE); end if; GWO.CLOSE (GATEWAY, S); LOGGER.STATUS (S); end CREATE_MODEL_GATEWAY; procedure CREATE_MODULE_GATEWAY (GATEWAY_NAME : in STRING; PARENT_NAME : in STRING; ID : in POSITIVE; FOR_MODULE : in HCHY.MODULE; COMMENTS : in STRING; THE_STATE : in out STATE) is ACTION_ID : ACTION.ID renames THE_STATE.CMVC.ACTION_ID; S : SS.CONDITION; GATEWAY : GWO.HANDLE; use ASAS; begin GWO.CREATE (NAME => GATEWAY_NAME, H => GATEWAY, GATEWAY_CLASS => ASA_DEFINITIONS.GATEWAY_CLASS'IMAGE (ASA_DEFINITIONS.ASA_MODULE), ACTION_ID => ACTION_ID, ERRORS => S); LOGGER.STATUS (S); ASAP.SET_ASA_ID (H => GATEWAY, VALUE => ID); ASAP.SET_ASA_NODE_NUMBER (H => GATEWAY, VALUE => HCHY.NODE_NUMBER (FOR_MODULE)); ASAP.SET_ASA_COMMENT (H => GATEWAY, VALUE => HCHY.COMMENT (FOR_MODULE)); ASAP.SET_PARENT_NAME (H => GATEWAY, VALUE => PARENT_NAME); for R in REQUIREMENTS.FUNCTIONAL_REQUIREMENT_NUMBER loop ASAP.SET_ASA_REQUIREMENT (H => GATEWAY, NUMBER => R, VALUE => HCHY.REQUIREMENT (FOR_MODULE, NUMBER => R)); end loop; LOGGER.POSITIVE (CREATION_MESSAGE (GATEWAY)); if ASAS.CMVC_CONTROL_LEVEL >= ASAS.CONTROL_MODULES then MAKE_CONTROLLED (GATEWAY => GATEWAY, SAVE_SOURCE => FALSE, COMMENTS => COMMENTS, THE_STATE => THE_STATE); end if; GWO.CLOSE (GATEWAY, S); LOGGER.STATUS (S); end CREATE_MODULE_GATEWAY; procedure CREATE_REQUIREMENT_GATEWAY (GATEWAY_NAME : in STRING; PARENT_NAME : in STRING; ID : in POSITIVE; REQUIREMENT_KIND : in REQUIREMENTS.NON_FUNCTIONAL; REQUIREMENT_TEXT : in STRING; COMMENTS : in STRING; THE_STATE : in out STATE) is ACTION_ID : ACTION.ID renames THE_STATE.CMVC.ACTION_ID; S : SS.CONDITION; GATEWAY : GWO.HANDLE; use ASAS; begin GWO.CREATE (NAME => GATEWAY_NAME, H => GATEWAY, GATEWAY_CLASS => ASA_DEFINITIONS.GATEWAY_CLASS'IMAGE (ASA_DEFINITIONS.ASA_REQUIREMENT), ACTION_ID => ACTION_ID, ERRORS => S); LOGGER.STATUS (S); ASAP.SET_ASA_ID (H => GATEWAY, VALUE => ID); ASAP.SET_PARENT_NAME (H => GATEWAY, VALUE => PARENT_NAME); ASAP.SET_ASA_REQUIREMENT_KIND (H => GATEWAY, VALUE => REQUIREMENT_KIND); ASAP.SET_ASA_REQUIREMENT_TEXT (H => GATEWAY, VALUE => REQUIREMENT_TEXT); LOGGER.POSITIVE (CREATION_MESSAGE (GATEWAY)); if ASAS.CMVC_CONTROL_LEVEL >= ASAS.CONTROL_ALL then MAKE_CONTROLLED (GATEWAY => GATEWAY, SAVE_SOURCE => TRUE, COMMENTS => COMMENTS, THE_STATE => THE_STATE); end if; GWO.CLOSE (GATEWAY, S); LOGGER.STATUS (S); end CREATE_REQUIREMENT_GATEWAY; -- -------------------- -- ( ) Module hierarchy -- -------------------- procedure CREATE (FOR_MODULE : in HCHY.MODULE; IN_LIBRARY : in STRING; ROOT_ID : in POSITIVE; COMMENTS : in STRING; THE_STATE : in out STATE) is ACTION_ID : ACTION.ID renames THE_STATE.CMVC.ACTION_ID; CHILDREN : HCHY.MODULE_ITERATOR := HCHY.CHILDREN_OF (FOR_MODULE); CHILD : HCHY.MODULE; PARENT : constant HCHY.MODULE := HCHY.PARENT_OF (FOR_MODULE); NB_OF_CHILDREN : constant NATURAL := HCHY.SIZE (CHILDREN); NEXT_ID : POSITIVE := ROOT_ID + 1; use HIERARCHY; begin CREATE_MODULE_GATEWAY (GATEWAY_NAME => IN_LIBRARY & '.' & HCHY.FULL_NAME (FOR_MODULE), PARENT_NAME => IN_LIBRARY & '.' & HCHY.FULL_NAME (PARENT), ID => ROOT_ID, FOR_MODULE => FOR_MODULE, COMMENTS => COMMENTS, THE_STATE => THE_STATE); for C in 1 .. NB_OF_CHILDREN loop CHILD := HCHY.VALUE (CHILDREN); CREATE (FOR_MODULE => CHILD, IN_LIBRARY => IN_LIBRARY, ROOT_ID => NEXT_ID, COMMENTS => COMMENTS, THE_STATE => THE_STATE); NEXT_ID := NEXT_ID + TREE_SIZE (CHILD); HCHY.NEXT (CHILDREN); end loop; end CREATE; procedure AUGMENT (FOR_MODULE : in HIERARCHY.MODULE; IN_LIBRARY : in STRING; COMMENTS : in STRING; THE_STATE : in out STATE) is GATEWAY_FULL_NAME : constant STRING := IN_LIBRARY & '.' & HCHY.FULL_NAME (FOR_MODULE); ACTION_ID : ACTION.ID renames THE_STATE.CMVC.ACTION_ID; CHILDREN : HCHY.MODULE_ITERATOR; GATEWAY : GWO.HANDLE; ROOT_GATEWAY : GWO.HANDLE; ROOT_MODULE : HCHY.MODULE; ID : POSITIVE; S : SS.CONDITION; procedure DO_SET_PROPERTIES (GATEWAY : in GWO.HANDLE) is begin ASAP.SET_ASA_NODE_NUMBER (GATEWAY, VALUE => HCHY.NODE_NUMBER (FOR_MODULE)); ASAP.SET_ASA_COMMENT (GATEWAY, VALUE => HCHY.COMMENT (FOR_MODULE)); for R in REQUIREMENTS.FUNCTIONAL_REQUIREMENT_NUMBER loop ASAP.SET_ASA_REQUIREMENT (H => GATEWAY, NUMBER => R, VALUE => HCHY.REQUIREMENT (FOR_MODULE, NUMBER => R)); end loop; LOGGER.POSITIVE ("Updated properties of " & IN_LIBRARY & '.' & HCHY.FULL_NAME (FOR_MODULE)); end DO_SET_PROPERTIES; procedure SET_PROPERTIES is new UPDATER (DO_SET_PROPERTIES); procedure DO_SET_LAST_ID (GATEWAY : in GWO.HANDLE) is begin ID := ASAP.ASA_LAST_ID (GATEWAY) + 1; ASAP.SET_ASA_LAST_ID (H => GATEWAY, VALUE => ID); end DO_SET_LAST_ID; procedure SET_LAST_ID is new UPDATER (DO_SET_LAST_ID); use HCHY; begin GWO.OPEN_MAIN_OBJECT (OBJECT => GATEWAY_FULL_NAME, H => GATEWAY, UPDATE => FALSE, ACTION_ID => ACTION_ID, ERRORS => S); if SS.ERROR (S) then -- -- This is a new module. Create a gateway object to represent -- it. Extract the id from the root and update the last id. -- ROOT_MODULE := FOR_MODULE; while HCHY.PARENT_OF (ROOT_MODULE) /= HCHY.NIL loop ROOT_MODULE := HCHY.PARENT_OF (ROOT_MODULE); end loop; declare ROOT_FULL_NAME : constant STRING := IN_LIBRARY & '.' & HCHY.FULL_NAME (ROOT_MODULE); begin GWO.OPEN_MAIN_OBJECT (OBJECT => ROOT_FULL_NAME, H => ROOT_GATEWAY, UPDATE => FALSE, ACTION_ID => ACTION_ID, ERRORS => S); LOGGER.STATUS (S); SET_LAST_ID (GATEWAY => ROOT_GATEWAY, COMMENTS => COMMENTS, THE_STATE => THE_STATE); GWO.CLOSE (ROOT_GATEWAY, S); LOGGER.STATUS (S); CREATE (FOR_MODULE => FOR_MODULE, IN_LIBRARY => IN_LIBRARY, ROOT_ID => ID, COMMENTS => COMMENTS, THE_STATE => THE_STATE); end; elsif not SAME_PROPERTIES (MODULE => FOR_MODULE, GATEWAY => GATEWAY) then -- -- There is already a gateway object representing this module, -- but same property has changed. -- SET_PROPERTIES (GATEWAY => GATEWAY, COMMENTS => COMMENTS, THE_STATE => THE_STATE); else GWO.CLOSE (GATEWAY, S); LOGGER.STATUS (S); end if; CHILDREN := HCHY.CHILDREN_OF (FOR_MODULE); while not HCHY.DONE (CHILDREN) loop AUGMENT (FOR_MODULE => HCHY.VALUE (CHILDREN), IN_LIBRARY => IN_LIBRARY, COMMENTS => COMMENTS, THE_STATE => THE_STATE); HCHY.NEXT (CHILDREN); end loop; end AUGMENT; procedure DESTROY (GATEWAY_OBJECT : in DIR.OBJECT; COMMENTS : in STRING; THE_STATE : in out STATE) is ACTION_ID : ACTION.ID renames THE_STATE.CMVC.ACTION_ID; CHANGE_IMPACT : DIR.ADA.ROOTS; E : DIR.ERROR_STATUS; ERRORS : ERROR_MESSAGES.ERRORS; GATEWAY_CMVC_CONTROL : CMVC_CONTROL_KIND; MODIFIED_UNITS : DIANA.TEMP_SEQ; begin GET_CMVC_CONTROL (OBJECT => GATEWAY_OBJECT, THE_STATE => THE_STATE, CONTROL => GATEWAY_CMVC_CONTROL); if GATEWAY_CMVC_CONTROL >= CONTROLLED_CHECKED_OUT then DATABASE_OPERATIONS.CHECK_IN (THE_OBJECT => GATEWAY_OBJECT, COMMENTS => COMMENTS, THE_STATE => THE_STATE.CMVC); end if; if GATEWAY_CMVC_CONTROL >= CONTROLLED_CHECKED_IN then DATABASE_OPERATIONS.MAKE_UNCONTROLLED (THE_OBJECT => GATEWAY_OBJECT, COMMENTS => COMMENTS, THE_STATE => THE_STATE.CMVC); end if; DOO.DESTROY (THE_OBJECT => GATEWAY_OBJECT, ERRORS => ERRORS, CHANGE_IMPACT => CHANGE_IMPACT, MODIFIED_UNITS => MODIFIED_UNITS, STATUS => E, LIMIT_TYPE => DIR.ANY_OBJECT, ACTION_ID => ACTION_ID); LOGGER.STATUS (E); end DESTROY; procedure REDUCE (GATEWAY_OBJECT : in DIR.OBJECT; CANDIDATE_MODULES : in out HIERARCHY.MODULE_ITERATOR; COMMENTS : in STRING; THE_STATE : in out STATE) is ACTION_ID : ACTION.ID renames THE_STATE.CMVC.ACTION_ID; HEAP : SYSTEM.SEGMENT renames THE_STATE.CMVC.HEAP; E : DIR.ERROR_STATUS; N : DNA.NAME_STATUS; CANDIDATE_CHILDREN : HCHY.MODULE_ITERATOR; CANDIDATE_MODULE : HCHY.MODULE; GATEWAY_CHILD : DIR.OBJECT; GATEWAY_CHILDREN : DNA.ITERATOR; GATEWAY_OBJECT_FULL_NAME : constant STRING := DNA.GET_FULL_NAME (GATEWAY_OBJECT); GATEWAY_OBJECT_SIMPLE_NAME : constant STRING := DNA.GET_SIMPLE_NAME (GATEWAY_OBJECT); MUST_REMAIN : BOOLEAN; use DNA; begin MUST_REMAIN := FALSE; while not HCHY.DONE (CANDIDATE_MODULES) loop CANDIDATE_MODULE := HCHY.VALUE (CANDIDATE_MODULES); if SU.EQUAL (GATEWAY_OBJECT_SIMPLE_NAME, HCHY.SIMPLE_NAME (CANDIDATE_MODULE)) then MUST_REMAIN := TRUE; exit; end if; HCHY.NEXT (CANDIDATE_MODULES); end loop; if MUST_REMAIN then -- -- There is a module for this gateway object, so it must be -- kept. -- LOGGER.NOTE ("Gateway " & GATEWAY_OBJECT_FULL_NAME & " corresponds to module " & HCHY.FULL_NAME (CANDIDATE_MODULE)); DNA.RESOLVE (ITER => GATEWAY_CHILDREN, SOURCE => GATEWAY_OBJECT_FULL_NAME & ".@'C(~Text)", STATUS => N, HEAP => HEAP, ACTION_ID => ACTION_ID); if N /= DNA.UNDEFINED then LOGGER.STATUS (N); while not DNA.DONE (GATEWAY_CHILDREN) loop CANDIDATE_CHILDREN := HCHY.CHILDREN_OF (CANDIDATE_MODULE); DNA.GET_OBJECT (ITER => GATEWAY_CHILDREN, THE_OBJECT => GATEWAY_CHILD, STATUS => E); LOGGER.STATUS (E); REDUCE (GATEWAY_OBJECT => GATEWAY_CHILD, CANDIDATE_MODULES => CANDIDATE_CHILDREN, COMMENTS => COMMENTS, THE_STATE => THE_STATE); DNA.NEXT (GATEWAY_CHILDREN); end loop; end if; else -- -- There is no longer a corresponding module for this gateway -- object. We first check that the object has no -- non-functional requirements, and then delete it. -- DNA.RESOLVE (ITER => GATEWAY_CHILDREN, SOURCE => GATEWAY_OBJECT_FULL_NAME & ".@'C(Text)", STATUS => N, HEAP => HEAP, ACTION_ID => ACTION_ID); if N = DNA.UNDEFINED then DESTROY (GATEWAY_OBJECT => GATEWAY_OBJECT, COMMENTS => COMMENTS, THE_STATE => THE_STATE); LOGGER.POSITIVE ("Gateway object " & GATEWAY_OBJECT_FULL_NAME & " has been destroyed because it has no longer " & "a corresponding module"); else LOGGER.WARNING ("The gateway object " & GATEWAY_OBJECT_FULL_NAME & " couldn't be destroyed because it has " & "subobjects representing non-functional " & "requirements. Use Asa.Move_Requirement " & "to move these objects, and then run " & "Asa.Accept_Changes again to complete " & "change propagation"); end if; end if; end REDUCE; -- ---------------------------------- -- ( ) Bodies of external subprograms -- ---------------------------------- function CMVC_CONTROL (GATEWAY_NAME : in STRING) return CMVC_CONTROL_KIND is GATEWAY_OBJECT : DIR.OBJECT; GATEWAY_CMVC_CONTROL : CMVC_CONTROL_KIND; N : DNA.NAME_STATUS; THE_ACTION : ACTION.ID; THE_STATE : STATE; begin THE_ACTION := ACTION.START; INITIALIZE (THE_STATE => THE_STATE, ACTION_ID => THE_ACTION, WORK_ORDER => ""); DNA.RESOLVE (NAME => GATEWAY_NAME, THE_OBJECT => GATEWAY_OBJECT, STATUS => N, ACTION_ID => THE_ACTION); LOGGER.STATUS (N); GET_CMVC_CONTROL (OBJECT => GATEWAY_OBJECT, THE_STATE => THE_STATE, CONTROL => GATEWAY_CMVC_CONTROL); FINALIZE (THE_STATE); ACTION.FINISH (THE_ACTION => THE_ACTION, DO_COMMIT => TRUE); return GATEWAY_CMVC_CONTROL; end CMVC_CONTROL; procedure INITIALIZE (THE_STATE : out STATE; ACTION_ID : in ACTION.ID; WORK_ORDER : in STRING) is RESULT : STATE; THE_FILTER : PROFILE.LOG_FILTER := PROFILE.FILTER; THE_HEAP : constant SYSTEM.SEGMENT := JOB_SEGMENT.GET; begin THE_FILTER (PROFILE.AUXILIARY_MSG) := FALSE; RESULT := (CMVC => new STATE_OPERATIONS.STATE_RECORD, CONFIGURATION => CMVCI.NIL); pragma HEAP (THE_HEAP); RESULT.CMVC.ACTION_ID := ACTION_ID; RESULT.CMVC.HEAP := THE_HEAP; RESULT.CMVC.CURRENT_PROFILE := PROFILE.RAISE_EXCEPTION (FILTER => THE_FILTER); STATE_OPERATIONS.OBJECT_TO_DATABASE.INITIALIZE (RESULT.CMVC.DATABASE_MAP, THE_HEAP); STATE_OPERATIONS.OBJECT_TO_STRING.INITIALIZE (RESULT.CMVC.STRING_MAP, THE_HEAP); --[should open work-order] THE_STATE := RESULT; end INITIALIZE; procedure FINALIZE (THE_STATE : in out STATE) is begin DATABASE_OPERATIONS.CLOSE (THE_STATE.CMVC); end FINALIZE; procedure AUGMENT (FOR_MODULE : in HIERARCHY.MODULE; IN_LIBRARY : in STRING; HOST : in STRING; MODEL : in STRING; UPDATE_TIME : in CALENDAR.TIME; COMMENTS : in STRING; THE_STATE : in out STATE) is GATEWAY_FULL_NAME : constant STRING := IN_LIBRARY & '.' & HCHY.FULL_NAME (FOR_MODULE); S : SS.CONDITION; ACTION_ID : ACTION.ID renames THE_STATE.CMVC.ACTION_ID; CHILDREN : HCHY.MODULE_ITERATOR; GATEWAY : GWO.HANDLE; procedure DO_SET_UPDATE_TIME_AND_PROPERTIES (GATEWAY : in GWO.HANDLE) is begin ASAP.SET_ASA_UPDATE_TIME (GATEWAY, VALUE => UPDATE_TIME); if not SAME_PROPERTIES (MODULE => FOR_MODULE, GATEWAY => GATEWAY) then ASAP.SET_ASA_NODE_NUMBER (GATEWAY, VALUE => HCHY.NODE_NUMBER (FOR_MODULE)); ASAP.SET_ASA_COMMENT (GATEWAY, VALUE => HCHY.COMMENT (FOR_MODULE)); for R in REQUIREMENTS.FUNCTIONAL_REQUIREMENT_NUMBER loop ASAP.SET_ASA_REQUIREMENT (H => GATEWAY, NUMBER => R, VALUE => HCHY.REQUIREMENT (FOR_MODULE, NUMBER => R)); end loop; LOGGER.POSITIVE ("Updated properties of " & IN_LIBRARY & '.' & HCHY.FULL_NAME (FOR_MODULE)); end if; end DO_SET_UPDATE_TIME_AND_PROPERTIES; procedure SET_UPDATE_TIME_AND_PROPERTIES is new UPDATER (DO_SET_UPDATE_TIME_AND_PROPERTIES); use HCHY; begin GWO.OPEN_MAIN_OBJECT (OBJECT => GATEWAY_FULL_NAME, H => GATEWAY, UPDATE => FALSE, ACTION_ID => ACTION_ID, ERRORS => S); if SS.ERROR (S) then -- -- This is a new model. Create a gateway object to represent -- it. -- CREATE (FOR_MODULE => FOR_MODULE, IN_LIBRARY => IN_LIBRARY, HOST => HOST, MODEL => MODEL, UPDATE_TIME => UPDATE_TIME, COMMENTS => COMMENTS, THE_STATE => THE_STATE); else SET_UPDATE_TIME_AND_PROPERTIES (GATEWAY => GATEWAY, COMMENTS => COMMENTS, THE_STATE => THE_STATE); GWO.CLOSE (GATEWAY, S); LOGGER.STATUS (S); end if; CHILDREN := HCHY.CHILDREN_OF (FOR_MODULE); while not HCHY.DONE (CHILDREN) loop AUGMENT (FOR_MODULE => HCHY.VALUE (M => CHILDREN), IN_LIBRARY => IN_LIBRARY, COMMENTS => COMMENTS, THE_STATE => THE_STATE); HCHY.NEXT (CHILDREN); end loop; end AUGMENT; procedure CREATE (FOR_MODULE : in HIERARCHY.MODULE; IN_LIBRARY : in STRING; HOST : in STRING; MODEL : in STRING; UPDATE_TIME : in CALENDAR.TIME; COMMENTS : in STRING; THE_STATE : in out STATE) is ACTION_ID : ACTION.ID renames THE_STATE.CMVC.ACTION_ID; CHILDREN : HCHY.MODULE_ITERATOR := HCHY.CHILDREN_OF (FOR_MODULE); CHILD : HCHY.MODULE; NEXT_ID : POSITIVE; SIZE : constant POSITIVE := TREE_SIZE (FOR_MODULE); use HIERARCHY; begin CREATE_MODEL_GATEWAY (GATEWAY_NAME => IN_LIBRARY & '.' & HCHY.FULL_NAME (FOR_MODULE), LAST_ID => SIZE, FOR_MODULE => FOR_MODULE, HOST => HOST, MODEL => MODEL, UPDATE_TIME => UPDATE_TIME, COMMENTS => COMMENTS, THE_STATE => THE_STATE); NEXT_ID := 2; for C in 1 .. HCHY.SIZE (CHILDREN) loop CHILD := HCHY.VALUE (CHILDREN); CREATE (FOR_MODULE => HCHY.VALUE (CHILDREN), IN_LIBRARY => IN_LIBRARY, ROOT_ID => NEXT_ID, COMMENTS => COMMENTS, THE_STATE => THE_STATE); NEXT_ID := NEXT_ID + TREE_SIZE (CHILD); HCHY.NEXT (CHILDREN); end loop; end CREATE; procedure CREATE (IN_GATEWAY : in STRING; REQUIREMENT_NAME : in STRING; REQUIREMENT_KIND : in REQUIREMENTS.NON_FUNCTIONAL; REQUIREMENT_TEXT : in STRING; COMMENTS : in STRING; THE_STATE : in out STATE) is ACTION_ID : ACTION.ID renames THE_STATE.CMVC.ACTION_ID; ID : POSITIVE; N : DNA.NAME_STATUS; PARENT : GWO.HANDLE; PARENT_OBJECT : DIR.OBJECT; S : SS.CONDITION; procedure DO_SET_LAST_REQUIREMENT_ID (GATEWAY : in GWO.HANDLE) is begin ID := ASAP.ASA_LAST_REQUIREMENT_ID (GATEWAY) + 1; ASAP.SET_ASA_LAST_REQUIREMENT_ID (H => GATEWAY, VALUE => ID); end DO_SET_LAST_REQUIREMENT_ID; procedure SET_LAST_REQUIREMENT_ID is new UPDATER (DO_SET_LAST_REQUIREMENT_ID); use ASA_DEFINITIONS; begin DNA.RESOLVE (NAME => IN_GATEWAY, THE_OBJECT => PARENT_OBJECT, STATUS => N, ACTION_ID => ACTION_ID); LOGGER.STATUS (N); GWO.OPEN_MAIN_OBJECT (OBJECT => PARENT_OBJECT, H => PARENT, UPDATE => FALSE, ACTION_ID => ACTION_ID, ERRORS => S); LOGGER.STATUS (S); if ASAP.CLASS (PARENT) = ASA_DEFINITIONS.ASA_REQUIREMENT then LOGGER.ERROR ("The gateway object " & DNA.GET_FULL_NAME (PARENT_OBJECT) & " does not represent an " & ASA_DEFINITIONS.ASA & " module, and thus " & "cannot host non-functional requirements"); end if; SET_LAST_REQUIREMENT_ID (GATEWAY => PARENT, COMMENTS => COMMENTS, THE_STATE => THE_STATE); GWO.CLOSE (PARENT, S); LOGGER.STATUS (S); declare PARENT_FULL_NAME : constant STRING := DNA.GET_FULL_NAME (PARENT_OBJECT); begin CREATE_REQUIREMENT_GATEWAY (GATEWAY_NAME => PARENT_FULL_NAME & '.' & REQUIREMENT_NAME, PARENT_NAME => PARENT_FULL_NAME, ID => ID, REQUIREMENT_KIND => REQUIREMENT_KIND, REQUIREMENT_TEXT => REQUIREMENT_TEXT, COMMENTS => COMMENTS, THE_STATE => THE_STATE); end; end CREATE; procedure DESTROY (GATEWAY_NAME : in STRING; COMMENTS : in STRING; THE_STATE : in out STATE) is ACTION_ID : ACTION.ID renames THE_STATE.CMVC.ACTION_ID; N : DNA.NAME_STATUS; GATEWAY_OBJECT : DIR.OBJECT; begin DNA.RESOLVE (NAME => GATEWAY_NAME, THE_OBJECT => GATEWAY_OBJECT, STATUS => N, ACTION_ID => ACTION_ID); LOGGER.STATUS (N); DESTROY (GATEWAY_OBJECT => GATEWAY_OBJECT, COMMENTS => COMMENTS, THE_STATE => THE_STATE); end DESTROY; procedure REDUCE (GATEWAY_NAME : in STRING; CANDIDATE_MODULES : in out HIERARCHY.MODULE_ITERATOR; COMMENTS : in STRING; THE_STATE : in out STATE) is ACTION_ID : ACTION.ID renames THE_STATE.CMVC.ACTION_ID; N : DNA.NAME_STATUS; GATEWAY_OBJECT : DIR.OBJECT; begin DNA.RESOLVE (NAME => GATEWAY_NAME, THE_OBJECT => GATEWAY_OBJECT, STATUS => N, ACTION_ID => ACTION_ID); LOGGER.STATUS (N); REDUCE (GATEWAY_OBJECT => GATEWAY_OBJECT, CANDIDATE_MODULES => CANDIDATE_MODULES, COMMENTS => COMMENTS, THE_STATE => THE_STATE); end REDUCE; end GATEWAYS;with CALENDAR; with REQUIREMENTS; with REMOTE_OPERATIONS; package HIERARCHY is type MODULE is private; NIL : constant MODULE; type MODULE_ITERATOR is private; procedure BUILD (MODEL : in STRING; HOST : in STRING; ROOT : out MODULE; BUILD_TIME : out CALENDAR.TIME); procedure BUILD (MODEL : in STRING; IN_CONTEXT : in REMOTE_OPERATIONS.CONTEXT; ROOT : out MODULE; BUILD_TIME : out CALENDAR.TIME); function MAKE (IDENTIFIER : in STRING) return MODULE; function CHILDREN_OF (M : in MODULE) return MODULE_ITERATOR; function PARENT_OF (M : in MODULE) return MODULE; function IDENTIFIER (M : in MODULE) return STRING; function SIMPLE_NAME (M : in MODULE) return STRING; function FULL_NAME (M : in MODULE) return STRING; function NODE_NUMBER (M : in MODULE) return STRING; function COMMENT (M : in MODULE) return STRING; function REQUIREMENT (M : in MODULE; NUMBER : in REQUIREMENTS.FUNCTIONAL_REQUIREMENT_NUMBER) return STRING; function DONE (M : in MODULE_ITERATOR) return BOOLEAN; function VALUE (M : in MODULE_ITERATOR) return MODULE; procedure NEXT (M : in out MODULE_ITERATOR); function SIZE (M : in MODULE_ITERATOR) return NATURAL; function MAKE (M : in MODULE) return MODULE_ITERATOR; private type ACCESS_STRING is access STRING; pragma SEGMENTED_HEAP (ACCESS_STRING); type REQUIREMENT_LIST is array (REQUIREMENTS.FUNCTIONAL_REQUIREMENT_NUMBER) of ACCESS_STRING; type MODULE_RECORD is record IDENTIFIER : ACCESS_STRING; NODE_NUMBER : ACCESS_STRING; COMMENT : ACCESS_STRING; REQUIREMENTS : REQUIREMENT_LIST; PARENT : MODULE; FIRST_CHILD : MODULE; NEXT_SIBLING : MODULE; REMAINING_CHILDREN : NATURAL; -- Used for construction only. end record; type MODULE is access MODULE_RECORD; pragma SEGMENTED_HEAP (MODULE); NIL : constant MODULE := null; type MODULE_ITERATOR is new MODULE; end HIERARCHY;with ASA_DEFINITIONS; with ASAOPEN; with JOB_SEGMENT; with LOGGER; with REMOTE_OPERATIONS; with SIMPLE_STATUS; with TIME_UTILITIES; with UNIX_DEFINITIONS; package body HIERARCHY is package RO renames REMOTE_OPERATIONS; package SS renames SIMPLE_STATUS; -- ---------- -- ( ) Naming -- ---------- HIERARCHY : constant STRING := ASA_DEFINITIONS.MAIN_CLASS_DIRECTORY & ".HIERARCHY"; function ADA_NAME (S : in STRING) return STRING is OFFSET : constant := CHARACTER'POS ('A') - CHARACTER'POS ('a'); RESULT : STRING (S'RANGE); NEXT : NATURAL := S'FIRST; begin for I in S'RANGE loop case S (I) is when 'A' .. 'Z' => RESULT (NEXT) := S (I); NEXT := NEXT + 1; when 'a' .. 'z' => RESULT (NEXT) := CHARACTER'VAL (CHARACTER'POS (S (I)) + OFFSET); NEXT := NEXT + 1; when '0' .. '9' => if NEXT = S'FIRST then -- An Ada name cannot start with a digit. null; else RESULT (NEXT) := S (I); NEXT := NEXT + 1; end if; when others => if NEXT = S'FIRST then -- An Ada name cannot start with an underscore. null; elsif RESULT (NEXT - 1) = '_' then -- An Ada name cannot have two consecutive -- underscores. null; else RESULT (NEXT) := '_'; NEXT := NEXT + 1; end if; end case; end loop; if NEXT > S'FIRST and then RESULT (NEXT - 1) = '_' then -- An Ada name cannot end with an underscore. return RESULT (S'FIRST .. NEXT - 2); else return RESULT (S'FIRST .. NEXT - 1); end if; end ADA_NAME; --[bug] -- Due to a bug in asaopen, the requirements arrive here with -- underscores instead of blanks. They must be converted back. -- function UNDERLINES_TO_SPACES (S : in STRING) return STRING is RESULT : STRING (S'RANGE); begin for I in S'RANGE loop if S (I) = '_' then RESULT (I) := ' '; else RESULT (I) := S (I); end if; end loop; return RESULT; end UNDERLINES_TO_SPACES; -- ---------------------------------- -- ( ) Bodies of external subprograms -- ---------------------------------- procedure BUILD (MODEL : in STRING; HOST : in STRING; ROOT : out MODULE; BUILD_TIME : out CALENDAR.TIME) is C : RO.CONTEXT; S : SIMPLE_STATUS.CONDITION; begin -- -- Acquire a connection. -- RO.ACQUIRE (A_CONTEXT => C, STATUS => S, MACHINE => HOST, INSTANCE => ASA_DEFINITIONS.ASA); LOGGER.STATUS (S); -- -- Do the actual build. -- BUILD (MODEL => MODEL, IN_CONTEXT => C, ROOT => ROOT, BUILD_TIME => BUILD_TIME); -- -- Release the connection. -- RO.RELEASE (A_CONTEXT => C, STATUS => S); LOGGER.STATUS (S); end BUILD; procedure BUILD (MODEL : in STRING; IN_CONTEXT : in REMOTE_OPERATIONS.CONTEXT; ROOT : out MODULE; BUILD_TIME : out CALENDAR.TIME) is S : SS.CONDITION; type LINE_KIND is (IDENTIFIER, NODE, COMMENT, REQUIREMENT_1, REQUIREMENT_2, REQUIREMENT_3, REQUIREMENT_4, REQUIREMENT_5, REQUIREMENT_6, REQUIREMENT_7, REQUIREMENT_8, REQUIREMENT_9, CHILDREN); type STATE_RECORD is record CURRENT : MODULE; EXPECTED : LINE_KIND; end record; MY_STATE : STATE_RECORD := (CURRENT => null, EXPECTED => IDENTIFIER); procedure PROCESS (STATE : in out STATE_RECORD; LINE : in STRING) is NEW_MODULE : MODULE; NB_OF_CHILDREN : NATURAL; begin case STATE.EXPECTED is when IDENTIFIER => if STATE.CURRENT /= null then NEW_MODULE := new MODULE_RECORD'(IDENTIFIER => new STRING'(LINE), NODE_NUMBER => null, COMMENT => null, REQUIREMENTS => (others => null), PARENT => STATE.CURRENT, FIRST_CHILD => null, NEXT_SIBLING => STATE.CURRENT.FIRST_CHILD, REMAINING_CHILDREN => 0); pragma HEAP (JOB_SEGMENT.GET); STATE.CURRENT.REMAINING_CHILDREN := STATE.CURRENT.REMAINING_CHILDREN - 1; STATE.CURRENT.FIRST_CHILD := NEW_MODULE; STATE.CURRENT := NEW_MODULE; else STATE.CURRENT := new MODULE_RECORD'(IDENTIFIER => new STRING'(LINE), NODE_NUMBER => null, COMMENT => null, REQUIREMENTS => (others => null), PARENT => null, FIRST_CHILD => null, NEXT_SIBLING => null, REMAINING_CHILDREN => 0); pragma HEAP (JOB_SEGMENT.GET); end if; when NODE => STATE.CURRENT.NODE_NUMBER := new STRING'(LINE); pragma HEAP (JOB_SEGMENT.GET); when COMMENT => -- -- Asaopen says "(null)" if there is no comment. -- if LINE = "(null)" then STATE.CURRENT.COMMENT := new STRING'(""); pragma HEAP (JOB_SEGMENT.GET); else STATE.CURRENT.COMMENT := new STRING'(LINE); pragma HEAP (JOB_SEGMENT.GET); end if; when REQUIREMENT_1 .. REQUIREMENT_9 => if LINE /= "" then STATE.CURRENT.REQUIREMENTS (REQUIREMENTS.FUNCTIONAL_REQUIREMENT_NUMBER (LINE_KIND'POS (STATE.EXPECTED) - LINE_KIND'POS (LINE_KIND'PRED (REQUIREMENT_1)))) := new STRING'(UNDERLINES_TO_SPACES (LINE)); pragma HEAP (JOB_SEGMENT.GET); end if; when CHILDREN => NB_OF_CHILDREN := NATURAL'VALUE (LINE); case NB_OF_CHILDREN is when 0 => while STATE.CURRENT.REMAINING_CHILDREN = 0 and then STATE.CURRENT.PARENT /= null loop STATE.CURRENT := STATE.CURRENT.PARENT; end loop; when POSITIVE => STATE.CURRENT.REMAINING_CHILDREN := NB_OF_CHILDREN; end case; end case; if STATE.EXPECTED = LINE_KIND'LAST then STATE.EXPECTED := LINE_KIND'FIRST; else STATE.EXPECTED := LINE_KIND'SUCC (STATE.EXPECTED); end if; end PROCESS; procedure EXECUTE_SCRIPT is new ASAOPEN.EXECUTE (STATE_RECORD => STATE_RECORD, PROCESS => PROCESS); begin -- -- Get the remote model's update time. -- RO.UPDATE_TIME (OF_FILE => MODEL, IN_CONTEXT => IN_CONTEXT, RESULT => BUILD_TIME, STATUS => S); if SS.ERROR (S) then LOGGER.ERROR ("Unable to open remote model " & MODEL, RAISE_ERROR => FALSE); LOGGER.STATUS (S); end if; -- -- Execute the script to extract the hierarchy information. -- EXECUTE_SCRIPT (IN_CONTEXT => IN_CONTEXT, MODEL => MODEL, TEMPLATE_NAME => HIERARCHY, STATE => MY_STATE, STATUS => S); LOGGER.STATUS (S); ROOT := MY_STATE.CURRENT; end BUILD; function MAKE (IDENTIFIER : in STRING) return MODULE is begin return new MODULE_RECORD'(IDENTIFIER => new STRING'(IDENTIFIER), NODE_NUMBER => new STRING'("M"), COMMENT => new STRING'(""), REQUIREMENTS => (others => null), PARENT => null, FIRST_CHILD => null, NEXT_SIBLING => null, REMAINING_CHILDREN => 0); pragma HEAP (JOB_SEGMENT.GET); end MAKE; function CHILDREN_OF (M : in MODULE) return MODULE_ITERATOR is begin return MODULE_ITERATOR (M.FIRST_CHILD); end CHILDREN_OF; function PARENT_OF (M : in MODULE) return MODULE is begin return M.PARENT; end PARENT_OF; function IDENTIFIER (M : in MODULE) return STRING is begin return M.IDENTIFIER.all; end IDENTIFIER; function SIMPLE_NAME (M : in MODULE) return STRING is begin return ADA_NAME (M.IDENTIFIER.all); end SIMPLE_NAME; function FULL_NAME (M : in MODULE) return STRING is begin if M.PARENT = null then return ADA_NAME (M.IDENTIFIER.all); else return FULL_NAME (M.PARENT) & '.' & ADA_NAME (M.IDENTIFIER.all); end if; end FULL_NAME; function NODE_NUMBER (M : in MODULE) return STRING is begin return M.NODE_NUMBER.all; end NODE_NUMBER; function COMMENT (M : in MODULE) return STRING is begin return M.COMMENT.all; end COMMENT; function REQUIREMENT (M : in MODULE; NUMBER : in REQUIREMENTS.FUNCTIONAL_REQUIREMENT_NUMBER) return STRING is begin if M.REQUIREMENTS (NUMBER) = null then return ""; else return M.REQUIREMENTS (NUMBER).all; end if; end REQUIREMENT; function DONE (M : in MODULE_ITERATOR) return BOOLEAN is begin return M = null; end DONE; function VALUE (M : in MODULE_ITERATOR) return MODULE is begin return MODULE (M); end VALUE; procedure NEXT (M : in out MODULE_ITERATOR) is begin M := MODULE_ITERATOR (M.NEXT_SIBLING); end NEXT; function SIZE (M : in MODULE_ITERATOR) return NATURAL is ITER : MODULE_ITERATOR := M; RESULT : NATURAL := 0; begin while ITER /= null loop RESULT := RESULT + 1; ITER := MODULE_ITERATOR (ITER.NEXT_SIBLING); end loop; return RESULT; end SIZE; function MAKE (M : in MODULE) return MODULE_ITERATOR is begin return MODULE_ITERATOR (M); end MAKE; end HIERARCHY;with CMVC_IMPLEMENTATION_ERRORS; with DIRECTORY; with SIMPLE_STATUS; package LOGGER is procedure STATUS (S : in SIMPLE_STATUS.CONDITION; INTERACTIVE : in BOOLEAN := FALSE); procedure STATUS (S : in DIRECTORY.ERROR_STATUS); procedure STATUS (S : in DIRECTORY.NAMING.NAME_STATUS); subtype CMVC_STATUS is CMVC_IMPLEMENTATION_ERRORS.STATUS; procedure STATUS (S : in CMVC_STATUS); procedure AUXILIARY (MESSAGE : in STRING); procedure DEBUG (MESSAGE : in STRING); procedure NEGATIVE (MESSAGE : in STRING; RAISE_ERROR : in BOOLEAN := TRUE); procedure ERROR (MESSAGE : in STRING; RAISE_ERROR : in BOOLEAN := TRUE); procedure NOTE (MESSAGE : in STRING); procedure POSITION (MESSAGE : in STRING); procedure POSITIVE (MESSAGE : in STRING); procedure WARNING (MESSAGE : in STRING); end LOGGER;with LOG; with PROFILE; package body LOGGER is package CMVCE renames CMVC_IMPLEMENTATION_ERRORS; package DIR renames DIRECTORY; function FORMAT (S : in STRING) return STRING is OFFSET : constant := CHARACTER'POS ('a') - CHARACTER'POS ('A'); RESULT : STRING (S'RANGE); begin for I in S'RANGE loop case S (I) is when 'A' .. 'Z' => RESULT (I) := CHARACTER'VAL (CHARACTER'POS (S (I)) + OFFSET); when '_' => RESULT (I) := ' '; when others => RESULT (I) := S (I); end case; end loop; return RESULT; end FORMAT; function STRIP (S : in STRING) return STRING is RESULT : STRING (S'RANGE) := S; begin for I in S'RANGE loop if S (I) not in ' ' .. '~' then RESULT (I) := ' '; end if; end loop; return RESULT; end STRIP; procedure STATUS (S : in SIMPLE_STATUS.CONDITION; INTERACTIVE : in BOOLEAN := FALSE) is begin case SIMPLE_STATUS.SEVERITY (S) is when SIMPLE_STATUS.NORMAL => null; when SIMPLE_STATUS.WARNING => if INTERACTIVE then DEBUG (SIMPLE_STATUS.DISPLAY_MESSAGE (S)); else WARNING (SIMPLE_STATUS.DISPLAY_MESSAGE (S)); end if; when SIMPLE_STATUS.PROBLEM => NEGATIVE (SIMPLE_STATUS.DISPLAY_MESSAGE (S)); when SIMPLE_STATUS.FATAL => ERROR (SIMPLE_STATUS.DISPLAY_MESSAGE (S)); end case; end STATUS; procedure STATUS (S : in DIRECTORY.ERROR_STATUS) is use DIR; begin if S /= DIR.SUCCESSFUL then LOGGER.ERROR ("Directory operation failed because of " & FORMAT (DIR.ERROR_STATUS'IMAGE (S))); end if; end STATUS; procedure STATUS (S : in DIRECTORY.NAMING.NAME_STATUS) is use DIR.NAMING; begin if S /= DIR.NAMING.SUCCESSFUL then LOGGER.ERROR ("Name resolution failed because of " & FORMAT (DIR.NAMING.NAME_STATUS'IMAGE (S))); end if; end STATUS; procedure STATUS (S : in CMVC_STATUS) is begin if CMVCE.IS_BAD (S) then LOGGER.ERROR (CMVCE.MESSAGE (S)); end if; end STATUS; procedure AUXILIARY (MESSAGE : in STRING) is begin LOG.PUT_LINE (STRIP (MESSAGE), KIND => PROFILE.AUXILIARY_MSG); end AUXILIARY; procedure DEBUG (MESSAGE : in STRING) is begin LOG.PUT_LINE (STRIP (MESSAGE), KIND => PROFILE.DEBUG_MSG); end DEBUG; procedure NEGATIVE (MESSAGE : in STRING; RAISE_ERROR : in BOOLEAN := TRUE) is begin LOG.PUT_LINE (STRIP (MESSAGE), KIND => PROFILE.NEGATIVE_MSG); if RAISE_ERROR then raise PROFILE.ERROR; end if; end NEGATIVE; procedure ERROR (MESSAGE : in STRING; RAISE_ERROR : in BOOLEAN := TRUE) is begin LOG.PUT_LINE (STRIP (MESSAGE), KIND => PROFILE.ERROR_MSG); if RAISE_ERROR then raise PROFILE.ERROR; end if; end ERROR; procedure NOTE (MESSAGE : in STRING) is begin LOG.PUT_LINE (STRIP (MESSAGE), KIND => PROFILE.NOTE_MSG); end NOTE; procedure POSITION (MESSAGE : in STRING) is begin LOG.PUT_LINE (STRIP (MESSAGE), KIND => PROFILE.POSITION_MSG); end POSITION; procedure POSITIVE (MESSAGE : in STRING) is begin LOG.PUT_LINE (STRIP (MESSAGE), KIND => PROFILE.POSITIVE_MSG); end POSITIVE; procedure WARNING (MESSAGE : in STRING) is begin LOG.PUT_LINE (STRIP (MESSAGE), KIND => PROFILE.WARNING_MSG); end WARNING; end LOGGER;with ACTION; pragma PRIVATE_EYES_ONLY; with DIRECTORY; with SIMPLE_STATUS; package REQUIREMENTS is subtype COUNT is NATURAL range 0 .. 127; type REQUIREMENT_KIND is (NOT_A_REQUIREMENT, FUNCTIONAL, PERFORMANCE, EXTERNAL_INTERFACE, OPERATIONAL, RESOURCE, QUALIFICATION_TESTING, ACCEPTANCE_TESTING, DOCUMENTATION, QUALITY, SAFETY, RELIABILITY, MAINTAINABILITY, DEVELOPMENT_AND_VERIFICATION, DESIGN_AND_PROGRAMMING, REUSE_AND_COMMONALITY); subtype NON_FUNCTIONAL is REQUIREMENT_KIND range REQUIREMENT_KIND'SUCC (FUNCTIONAL) .. REQUIREMENT_KIND'LAST; subtype VERIFICATION is REQUIREMENT_KIND range QUALIFICATION_TESTING .. ACCEPTANCE_TESTING; subtype DEPENDABILITY is REQUIREMENT_KIND range QUALITY .. MAINTAINABILITY; subtype IMPLEMENTATION is REQUIREMENT_KIND range DEVELOPMENT_AND_VERIFICATION .. REUSE_AND_COMMONALITY; type REQUIREMENT_NUMBER is new POSITIVE; subtype FUNCTIONAL_REQUIREMENT_NUMBER is REQUIREMENT_NUMBER range REQUIREMENT_NUMBER'FIRST .. 9; subtype NON_FUNCTIONAL_REQUIREMENT_NUMBER is REQUIREMENT_NUMBER range FUNCTIONAL_REQUIREMENT_NUMBER'LAST + 1 .. REQUIREMENT_NUMBER'LAST; -- --------------------------- -- ( ) Individual requirements -- --------------------------- type REQUIREMENT (KIND : REQUIREMENT_KIND := NOT_A_REQUIREMENT) is private; subtype FUNCTIONAL_REQUIREMENT is REQUIREMENT (FUNCTIONAL); function RESOLVE (MODEL_GATEWAY_NAME : in STRING; MODULE_ID : in POSITIVE; REQUIREMENT_ID : in REQUIREMENT_NUMBER; ACTION_ID : in ACTION.ID) return REQUIREMENT; function COMMENT (ASA_GATEWAY_NAME : in STRING; ACTION_ID : in ACTION.ID) return STRING; function DIAGNOSIS (REQ : in REQUIREMENT) return STRING; function GATEWAY_FULL_NAME (REQ : in REQUIREMENT) return STRING; function UNIQUE_ID (REQ : in REQUIREMENT) return STRING; function TEXT (REQ : in REQUIREMENT) return STRING; type PERMANENT_REPRESENTATION is array (POSITIVE range 1 .. 4) of INTEGER; function CONVERT (REQ : in REQUIREMENT) return PERMANENT_REPRESENTATION; function CONVERT (REP : in PERMANENT_REPRESENTATION; ACTION_ID : in ACTION.ID) return REQUIREMENT; -- -------------------------- -- ( ) Requirements hierarchy -- -------------------------- type REQUIREMENT_ITERATOR (SIZE : COUNT := 0) is private; function RESOLVE (ASA_GATEWAY_NAME : in STRING; KIND : in REQUIREMENT_KIND; ACTION_ID : ACTION.ID) return REQUIREMENT_ITERATOR; function VALUE (REQS : in REQUIREMENT_ITERATOR) return REQUIREMENT; function DONE (REQS : in REQUIREMENT_ITERATOR) return BOOLEAN; procedure NEXT (REQS : in out REQUIREMENT_ITERATOR); procedure ADD (REQ : in REQUIREMENT; REQS : in out REQUIREMENT_ITERATOR); procedure REMOVE (REQ : in REQUIREMENT; REQS : in out REQUIREMENT_ITERATOR); -- ---------------- -- ( ) Dependencies -- ---------------- type DEPENDENTS (IS_BAD : BOOLEAN) is private; function GET_DEPENDENTS (REQ : in REQUIREMENT) return DEPENDENTS; procedure SET_DEPENDENTS (REQ : in REQUIREMENT; DEP : in DEPENDENTS); procedure ADD (DEP : in out DEPENDENTS; ONTO : in STRING); procedure REMOVE (DEP : in out DEPENDENTS; ONTO : in STRING); function DIAGNOSIS (DEP : in DEPENDENTS) return STRING; -- -------------- -- ( ) Exceptions -- -------------- DEPENDENT_ERROR : exception; REQUIREMENT_ERROR : exception; private package DIR renames DIRECTORY; package DNA renames DIRECTORY.NAMING; type STATUS_KIND is (MODULE_ID_ERROR, DIRECTORY_ERROR, DIRECTORY_NAMING_ERROR, GENERAL_ERROR); type STATUS (KIND : STATUS_KIND := GENERAL_ERROR) is record case KIND is when MODULE_ID_ERROR => null; when DIRECTORY_ERROR => ERROR_STATUS : DIR.ERROR_STATUS; when DIRECTORY_NAMING_ERROR => NAME_STATUS : DNA.NAME_STATUS; when GENERAL_ERROR => CONDITION : SIMPLE_STATUS.CONDITION; end case; end record; type REQUIREMENT (KIND : REQUIREMENT_KIND := NOT_A_REQUIREMENT) is record case KIND is when NOT_A_REQUIREMENT => ERROR : STATUS; when FUNCTIONAL | NON_FUNCTIONAL => ACTION_ID : ACTION.ID; OBJECT : DIR.OBJECT; case KIND is when NOT_A_REQUIREMENT => null; when FUNCTIONAL => ID : FUNCTIONAL_REQUIREMENT_NUMBER; when NON_FUNCTIONAL => null; end case; end case; end record; type REQUIREMENT_LIST is array (COUNT range <>) of REQUIREMENT; type REQUIREMENT_ITERATOR (SIZE : COUNT := 0) is record POS : COUNT := 1; CONTENTS : REQUIREMENT_LIST (1 .. SIZE); end record; type OBJECT_LIST is array (COUNT range <>) of DIR.OBJECT; type OBJECT_LIST_ACCESS is access OBJECT_LIST; pragma SEGMENTED_HEAP (OBJECT_LIST_ACCESS); type DEPENDENTS (IS_BAD : BOOLEAN) is record case IS_BAD is when FALSE => OBJECTS : OBJECT_LIST_ACCESS; when TRUE => ERROR : STATUS; end case; end record; end REQUIREMENTS;with ASA_DEFINITIONS; with GATEWAY_OBJECT; with JOB_SEGMENT; with OBJECT_CLASS; with SIMPLE_STATUS; with STRING_UTILITIES; with SYSTEM; with TABLE_SORT_GENERIC; with UNCHECKED_CONVERSION; package body REQUIREMENTS is package ASAP renames ASA_DEFINITIONS.PROPERTIES; package DTR renames DIRECTORY.TRAVERSAL; package DST renames DIRECTORY.STATISTICS; package GWO renames GATEWAY_OBJECT; package SS renames SIMPLE_STATUS; -- --------------------------------------------- -- ( ) Declarations for permanent representation -- --------------------------------------------- type RECORD_PERMANENT_REPRESENTATION is record KIND : REQUIREMENT_KIND; OBJECT : DIR.OBJECT; ID : FUNCTIONAL_REQUIREMENT_NUMBER; end record; -- -- It is necessary to use a 31-bit integer internally, because -- unchecked conversion to a 30-bit integer may yield -2**31, -- which is the uninitialized value, and will raise NUMERIC_ERROR -- when read. -- type INTEGER31 is range -2 ** 30 .. 2 ** 30 - 1; for INTEGER31'SIZE use 31; pragma ASSERT (RECORD_PERMANENT_REPRESENTATION'SIZE <= PERMANENT_REPRESENTATION'LENGTH * INTEGER31'SIZE); type INTEGER31_PERMANENT_REPRESENTATION is array (PERMANENT_REPRESENTATION'RANGE) of INTEGER31; function TO_RECORD is new UNCHECKED_CONVERSION (SOURCE => INTEGER31_PERMANENT_REPRESENTATION, TARGET => RECORD_PERMANENT_REPRESENTATION); function FROM_RECORD is new UNCHECKED_CONVERSION (SOURCE => RECORD_PERMANENT_REPRESENTATION, TARGET => INTEGER31_PERMANENT_REPRESENTATION); -- ------------------ -- ( ) Error handling -- ------------------ function DIAGNOSIS (ERROR : in STATUS) return STRING is begin case ERROR.KIND is when MODULE_ID_ERROR => return "the specified requirement id could not be found"; when DIRECTORY_ERROR => return STRING_UTILITIES.LOWER_CASE (DIR.ERROR_STATUS'IMAGE (ERROR.ERROR_STATUS)); when DIRECTORY_NAMING_ERROR => return STRING_UTILITIES.LOWER_CASE (DNA.NAME_STATUS'IMAGE (ERROR.NAME_STATUS)); when GENERAL_ERROR => return SS.DISPLAY_MESSAGE (ERROR.CONDITION); end case; end DIAGNOSIS; function MODULE_ID_ERROR return REQUIREMENT is begin return (KIND => NOT_A_REQUIREMENT, ERROR => (KIND => STATUS_KIND'(MODULE_ID_ERROR))); end MODULE_ID_ERROR; function DIRECTORY_ERROR (E : in DIR.ERROR_STATUS) return REQUIREMENT is begin return (KIND => NOT_A_REQUIREMENT, ERROR => (KIND => DIRECTORY_ERROR, ERROR_STATUS => E)); end DIRECTORY_ERROR; function DIRECTORY_ERROR (E : in DIR.ERROR_STATUS) return DEPENDENTS is begin return (IS_BAD => TRUE, ERROR => (KIND => DIRECTORY_ERROR, ERROR_STATUS => E)); end DIRECTORY_ERROR; function DIRECTORY_NAMING_ERROR (N : in DNA.NAME_STATUS) return REQUIREMENT is begin return (KIND => NOT_A_REQUIREMENT, ERROR => (KIND => DIRECTORY_NAMING_ERROR, NAME_STATUS => N)); end DIRECTORY_NAMING_ERROR; function DIRECTORY_NAMING_ERROR (N : in DNA.NAME_STATUS) return DEPENDENTS is begin return (IS_BAD => TRUE, ERROR => (KIND => DIRECTORY_NAMING_ERROR, NAME_STATUS => N)); end DIRECTORY_NAMING_ERROR; function GENERAL_ERROR (S : in SS.CONDITION) return REQUIREMENT is begin return (KIND => NOT_A_REQUIREMENT, ERROR => (KIND => GENERAL_ERROR, CONDITION => S)); end GENERAL_ERROR; function GENERAL_ERROR (S : in SS.CONDITION) return DEPENDENTS is begin return (IS_BAD => TRUE, ERROR => (KIND => GENERAL_ERROR, CONDITION => S)); end GENERAL_ERROR; -- ------------- -- ( ) Utilities -- ------------- function NAME (OBJECTS : in OBJECT_LIST; BEFORE : in STRING) return STRING is begin if OBJECTS'FIRST > OBJECTS'LAST then return BEFORE; elsif BEFORE = "" then return NAME (OBJECTS => OBJECTS (OBJECTS'FIRST + 1 .. OBJECTS'LAST), BEFORE => DNA.GET_FULL_NAME (OBJECTS (OBJECTS'FIRST))); else return NAME (OBJECTS => OBJECTS (OBJECTS'FIRST + 1 .. OBJECTS'LAST), BEFORE => BEFORE & ',' & DNA.GET_FULL_NAME (OBJECTS (OBJECTS'FIRST))); end if; end NAME; procedure SEARCH_BY_ID (ROOT : in DIR.OBJECT; ID : in POSITIVE; ACTION_ID : in ACTION.ID; FOUND : out BOOLEAN; OBJECT : out DIR.OBJECT) is E : DIR.ERROR_STATUS; FOUND_IN_SUBOBJECT : BOOLEAN; OBJECT_IN_SUBOBJECT : DIR.OBJECT; GATEWAY : GWO.HANDLE; N : DNA.NAME_STATUS; S : SS.CONDITION; SUBOBJECT : DIR.OBJECT; SUBOBJECTS : DNA.ITERATOR; use DIR; use DNA; begin GWO.OPEN_MAIN_OBJECT (OBJECT => ROOT, H => GATEWAY, UPDATE => FALSE, ERRORS => S); if SS.ERROR (S) then FOUND := FALSE; OBJECT := DIR.NIL; return; end if; if ASAP.ASA_ID (GATEWAY) = ID then GWO.CLOSE (GATEWAY); FOUND := TRUE; OBJECT := ROOT; return; else GWO.CLOSE (GATEWAY); DNA.RESOLVE (ITER => SUBOBJECTS, SOURCE => DNA.GET_FULL_NAME (ROOT) & ".@'C(~TEXT)", STATUS => N, ACTION_ID => ACTION_ID); if N = DNA.SUCCESSFUL then while not DNA.DONE (SUBOBJECTS) loop DNA.GET_OBJECT (ITER => SUBOBJECTS, THE_OBJECT => SUBOBJECT, STATUS => E); if E /= DIR.SUCCESSFUL then FOUND := FALSE; OBJECT := DIR.NIL; return; end if; SEARCH_BY_ID (ROOT => SUBOBJECT, ID => ID, ACTION_ID => ACTION_ID, FOUND => FOUND_IN_SUBOBJECT, OBJECT => OBJECT_IN_SUBOBJECT); if FOUND_IN_SUBOBJECT then FOUND := FOUND_IN_SUBOBJECT; OBJECT := OBJECT_IN_SUBOBJECT; return; end if; DNA.NEXT (SUBOBJECTS); end loop; end if; FOUND := FALSE; OBJECT := DIR.NIL; end if; end SEARCH_BY_ID; -- ---------------------------------- -- ( ) Bodies of external subprograms -- ---------------------------------- -- ----------------------------- -- ( . ) Individual requirements -- ----------------------------- function RESOLVE (MODEL_GATEWAY_NAME : in STRING; MODULE_ID : in POSITIVE; REQUIREMENT_ID : in REQUIREMENT_NUMBER; ACTION_ID : in ACTION.ID) return REQUIREMENT is E : DIR.ERROR_STATUS; FOUND : BOOLEAN; GATEWAY : GWO.HANDLE; N : DNA.NAME_STATUS; S : SS.CONDITION; THE_MODULE : DIR.OBJECT; THE_OBJECT : DIR.OBJECT; THE_REQUIREMENT : DIR.OBJECT; THE_REQUIREMENTS : DNA.ITERATOR; use ASA_DEFINITIONS; use DIR; use DNA; begin DNA.RESOLVE (NAME => MODEL_GATEWAY_NAME, THE_OBJECT => THE_OBJECT, STATUS => N); if N /= DNA.SUCCESSFUL then return DIRECTORY_NAMING_ERROR (N); end if; SEARCH_BY_ID (ROOT => THE_OBJECT, ID => MODULE_ID, ACTION_ID => ACTION_ID, FOUND => FOUND, OBJECT => THE_MODULE); if FOUND then case REQUIREMENT_ID is when FUNCTIONAL_REQUIREMENT_NUMBER => return (KIND => FUNCTIONAL, ACTION_ID => ACTION_ID, OBJECT => THE_MODULE, ID => REQUIREMENT_ID); when NON_FUNCTIONAL_REQUIREMENT_NUMBER => DNA.RESOLVE (ITER => THE_REQUIREMENTS, SOURCE => DNA.GET_FULL_NAME (THE_MODULE) & ".@'C(TEXT)", STATUS => N, ACTION_ID => ACTION_ID); if N = DNA.SUCCESSFUL then while not DNA.DONE (THE_REQUIREMENTS) loop DNA.GET_OBJECT (ITER => THE_REQUIREMENTS, THE_OBJECT => THE_REQUIREMENT, STATUS => E); if E /= DIR.SUCCESSFUL then return DIRECTORY_ERROR (E); end if; GWO.OPEN_MAIN_OBJECT (OBJECT => THE_REQUIREMENT, H => GATEWAY, UPDATE => FALSE, ERRORS => S); if SS.ERROR (S) then return GENERAL_ERROR (S); end if; if REQUIREMENT_NUMBER (ASAP.ASA_ID (GATEWAY)) = REQUIREMENT_ID then declare RESULT : REQUIREMENT (ASAP.ASA_REQUIREMENT_KIND (GATEWAY)); begin RESULT.ACTION_ID := ACTION_ID; RESULT.OBJECT := THE_REQUIREMENT; GWO.CLOSE (GATEWAY); return RESULT; end; end if; GWO.CLOSE (GATEWAY); DNA.NEXT (THE_REQUIREMENTS); end loop; else return DIRECTORY_NAMING_ERROR (N); end if; end case; else return MODULE_ID_ERROR; end if; end RESOLVE; function COMMENT (ASA_GATEWAY_NAME : in STRING; ACTION_ID : in ACTION.ID) return STRING is GATEWAY : GWO.HANDLE; GATEWAY_OBJECT : DIR.OBJECT; S : SS.CONDITION; begin GWO.OPEN_MAIN_OBJECT (OBJECT => ASA_GATEWAY_NAME, H => GATEWAY, UPDATE => FALSE, ACTION_ID => ACTION_ID, ERRORS => S); if SS.ERROR (S) then return ""; end if; declare COMMENT : constant STRING := ASAP.ASA_COMMENT (GATEWAY); begin if COMMENT = "" then GATEWAY_OBJECT := GWO.DIRECTORY_OBJECT (GATEWAY); GWO.CLOSE (GATEWAY); return DNA.GET_SIMPLE_NAME (GATEWAY_OBJECT); else GWO.CLOSE (GATEWAY); return COMMENT; end if; end; end COMMENT; function DIAGNOSIS (REQ : in REQUIREMENT) return STRING is begin case REQ.KIND is when NOT_A_REQUIREMENT => return DIAGNOSIS (REQ.ERROR); when FUNCTIONAL | NON_FUNCTIONAL => return ""; end case; end DIAGNOSIS; function GATEWAY_FULL_NAME (REQ : in REQUIREMENT) return STRING is begin return DNA.GET_FULL_NAME (REQ.OBJECT); end GATEWAY_FULL_NAME; function UNIQUE_ID (REQ : in REQUIREMENT) return STRING is DATA : DST.OBJECT_DATA; E : DIR.ERROR_STATUS; GATEWAY : GWO.HANDLE; ID : POSITIVE; MODULE_ID : POSITIVE; S : SS.CONDITION; use DIR; begin case REQ.KIND is when NOT_A_REQUIREMENT => raise REQUIREMENT_ERROR; when FUNCTIONAL => GWO.OPEN_MAIN_OBJECT (OBJECT => REQ.OBJECT, H => GATEWAY, UPDATE => FALSE, ACTION_ID => REQ.ACTION_ID, ERRORS => S); if SS.ERROR (S) then raise REQUIREMENT_ERROR; end if; MODULE_ID := ASAP.ASA_ID (GATEWAY); GWO.CLOSE (GATEWAY); declare MODULE_ID_IMAGE : constant STRING := POSITIVE'IMAGE (MODULE_ID); ID_IMAGE : constant STRING := FUNCTIONAL_REQUIREMENT_NUMBER'IMAGE (REQ.ID); begin return MODULE_ID_IMAGE (MODULE_ID_IMAGE'FIRST + 1 .. MODULE_ID_IMAGE'LAST) & '.' & ID_IMAGE (ID_IMAGE'FIRST + 1 .. ID_IMAGE'LAST); end; when NON_FUNCTIONAL => DST.GET_OBJECT_DATA (THE_OBJECT => REQ.OBJECT, THE_DATA => DATA, ACTION_ID => REQ.ACTION_ID, STATUS => E); if E /= DIR.SUCCESSFUL then raise REQUIREMENT_ERROR; end if; GWO.OPEN_MAIN_OBJECT (OBJECT => DST.OBJECT_PARENT (DATA), H => GATEWAY, UPDATE => FALSE, ACTION_ID => REQ.ACTION_ID, ERRORS => S); if SS.ERROR (S) then raise REQUIREMENT_ERROR; end if; MODULE_ID := ASAP.ASA_ID (GATEWAY); GWO.CLOSE (GATEWAY); GWO.OPEN_MAIN_OBJECT (OBJECT => REQ.OBJECT, H => GATEWAY, UPDATE => FALSE, ACTION_ID => REQ.ACTION_ID, ERRORS => S); if SS.ERROR (S) then raise REQUIREMENT_ERROR; end if; ID := ASAP.ASA_ID (GATEWAY); GWO.CLOSE (GATEWAY); declare MODULE_ID_IMAGE : constant STRING := POSITIVE'IMAGE (MODULE_ID); ID_IMAGE : constant STRING := POSITIVE'IMAGE (ID); begin return MODULE_ID_IMAGE (MODULE_ID_IMAGE'FIRST + 1 .. MODULE_ID_IMAGE'LAST) & '.' & ID_IMAGE (ID_IMAGE'FIRST + 1 .. ID_IMAGE'LAST); end; end case; end UNIQUE_ID; function TEXT (REQ : in REQUIREMENT) return STRING is GATEWAY : GWO.HANDLE; S : SS.CONDITION; begin GWO.OPEN_MAIN_OBJECT (OBJECT => REQ.OBJECT, H => GATEWAY, UPDATE => FALSE, ACTION_ID => REQ.ACTION_ID, ERRORS => S); if SS.ERROR (S) then raise REQUIREMENT_ERROR; end if; case REQ.KIND is when NOT_A_REQUIREMENT => raise REQUIREMENT_ERROR; when FUNCTIONAL => declare THE_TEXT : constant STRING := ASAP.ASA_REQUIREMENT (GATEWAY, NUMBER => REQ.ID); begin GWO.CLOSE (GATEWAY); return THE_TEXT; end; when NON_FUNCTIONAL => declare THE_TEXT : constant STRING := ASAP.ASA_REQUIREMENT_TEXT (GATEWAY); begin GWO.CLOSE (GATEWAY); return THE_TEXT; end; end case; end TEXT; function CONVERT (REQ : in REQUIREMENT) return PERMANENT_REPRESENTATION is IREP : INTEGER31_PERMANENT_REPRESENTATION := (others => 0); REP : PERMANENT_REPRESENTATION; begin case REQ.KIND is when NOT_A_REQUIREMENT => raise REQUIREMENT_ERROR; when FUNCTIONAL => IREP := FROM_RECORD ((KIND => REQ.KIND, OBJECT => REQ.OBJECT, ID => REQ.ID)); when NON_FUNCTIONAL => IREP := FROM_RECORD ((KIND => REQ.KIND, OBJECT => REQ.OBJECT, ID => 1)); end case; for I in REP'RANGE loop REP (I) := INTEGER (IREP (I)); end loop; return REP; end CONVERT; function CONVERT (REP : in PERMANENT_REPRESENTATION; ACTION_ID : in ACTION.ID) return REQUIREMENT is IREP : INTEGER31_PERMANENT_REPRESENTATION; RREP : RECORD_PERMANENT_REPRESENTATION; begin for I in REP'RANGE loop IREP (I) := INTEGER31 (REP (I)); end loop; RREP := TO_RECORD (IREP); declare RESULT : REQUIREMENT (RREP.KIND); begin case RESULT.KIND is when NOT_A_REQUIREMENT => raise REQUIREMENT_ERROR; when FUNCTIONAL => RESULT.ACTION_ID := ACTION_ID; RESULT.OBJECT := RREP.OBJECT; RESULT.ID := RREP.ID; when NON_FUNCTIONAL => RESULT.ACTION_ID := ACTION_ID; RESULT.OBJECT := RREP.OBJECT; end case; return RESULT; end; end CONVERT; -- ---------------------------- -- ( . ) Requirements hierarchy -- ---------------------------- function RESOLVE (ASA_GATEWAY_NAME : in STRING; KIND : in REQUIREMENT_KIND; ACTION_ID : ACTION.ID) return REQUIREMENT_ITERATOR is type OBJECT_AND_ID is record OBJECT : DIR.OBJECT; ID : POSITIVE; end record; type OBJECTS_AND_IDS is array (COUNT range <>) of OBJECT_AND_ID; E : DIR.ERROR_STATUS; GATEWAY : GWO.HANDLE; GATEWAY_OBJECT : DIR.OBJECT; GATEWAY_OBJECTS : DNA.ITERATOR; N : DNA.NAME_STATUS; RESULT : REQUIREMENT_ITERATOR; S : SS.CONDITION; SIZE : COUNT := 0; THE_OBJECTS : OBJECTS_AND_IDS (COUNT range 1 .. COUNT'LAST); function "<" (LEFT : in OBJECT_AND_ID; RIGHT : in OBJECT_AND_ID) return BOOLEAN is begin return LEFT.ID < RIGHT.ID; end "<"; procedure SORT_BY_ID is new TABLE_SORT_GENERIC (ELEMENT => OBJECT_AND_ID, INDEX => COUNT, ELEMENT_ARRAY => OBJECTS_AND_IDS); use DIR; use DNA; begin case KIND is when NOT_A_REQUIREMENT => raise REQUIREMENT_ERROR; when FUNCTIONAL => DNA.RESOLVE (NAME => ASA_GATEWAY_NAME, THE_OBJECT => GATEWAY_OBJECT, STATUS => N, ACTION_ID => ACTION_ID); if N /= DNA.SUCCESSFUL then raise REQUIREMENT_ERROR; end if; GWO.OPEN_MAIN_OBJECT (OBJECT => GATEWAY_OBJECT, H => GATEWAY, UPDATE => FALSE, ACTION_ID => ACTION_ID, ERRORS => S); if SS.ERROR (S) then raise REQUIREMENT_ERROR; end if; for R in reverse FUNCTIONAL_REQUIREMENT_NUMBER loop if ASAP.ASA_REQUIREMENT (GATEWAY, NUMBER => R) /= "" then SIZE := COUNT (R); exit; end if; end loop; GWO.CLOSE (GATEWAY); RESULT := (SIZE => SIZE, POS => 1, CONTENTS => (others => (KIND => FUNCTIONAL, ACTION_ID => ACTION_ID, OBJECT => GATEWAY_OBJECT, ID => 1))); for I in RESULT.CONTENTS'RANGE loop RESULT.CONTENTS (I).ID := FUNCTIONAL_REQUIREMENT_NUMBER (I); end loop; return RESULT; when NON_FUNCTIONAL => DNA.RESOLVE (SOURCE => ASA_GATEWAY_NAME & ".@'C(Text)", ITER => GATEWAY_OBJECTS, STATUS => N, ACTION_ID => ACTION_ID); if N /= DNA.UNDEFINED then if N /= DNA.SUCCESSFUL then raise REQUIREMENT_ERROR; end if; while not DNA.DONE (GATEWAY_OBJECTS) loop DNA.GET_OBJECT (ITER => GATEWAY_OBJECTS, THE_OBJECT => GATEWAY_OBJECT, STATUS => E); if E /= DIR.SUCCESSFUL then raise REQUIREMENT_ERROR; end if; GWO.OPEN_MAIN_OBJECT (OBJECT => GATEWAY_OBJECT, H => GATEWAY, UPDATE => FALSE, ACTION_ID => ACTION_ID, ERRORS => S); if SS.ERROR (S) then raise REQUIREMENT_ERROR; end if; if ASAP.ASA_REQUIREMENT_KIND (GATEWAY) = KIND then SIZE := SIZE + 1; THE_OBJECTS (SIZE) := (OBJECT => GATEWAY_OBJECT, ID => ASAP.ASA_ID (GATEWAY)); end if; GWO.CLOSE (GATEWAY); DNA.NEXT (GATEWAY_OBJECTS); end loop; end if; SORT_BY_ID (THE_OBJECTS (THE_OBJECTS'FIRST .. SIZE)); declare NULL_REQUIREMENT : REQUIREMENT (KIND); begin NULL_REQUIREMENT.ACTION_ID := ACTION_ID; NULL_REQUIREMENT.OBJECT := DIR.NIL; RESULT := (SIZE => SIZE, POS => 1, CONTENTS => (others => NULL_REQUIREMENT)); end; for I in RESULT.CONTENTS'RANGE loop RESULT.CONTENTS (I).OBJECT := THE_OBJECTS (I).OBJECT; end loop; return RESULT; end case; end RESOLVE; function VALUE (REQS : in REQUIREMENT_ITERATOR) return REQUIREMENT is begin return REQS.CONTENTS (REQS.POS); end VALUE; function DONE (REQS : in REQUIREMENT_ITERATOR) return BOOLEAN is begin return REQS.POS > REQS.SIZE; end DONE; procedure NEXT (REQS : in out REQUIREMENT_ITERATOR) is begin REQS.POS := REQS.POS + 1; end NEXT; procedure ADD (REQ : in REQUIREMENT; REQS : in out REQUIREMENT_ITERATOR) is RESULT : REQUIREMENT_ITERATOR (REQS.SIZE + 1); begin RESULT.POS := REQS.POS; RESULT.CONTENTS := REQS.CONTENTS & REQ; REQS := RESULT; end ADD; procedure REMOVE (REQ : in REQUIREMENT; REQS : in out REQUIREMENT_ITERATOR) is RESULT : REQUIREMENT_ITERATOR (REQS.SIZE - 1); begin for I in REQS.CONTENTS'RANGE loop if REQS.CONTENTS (I) = REQ then RESULT.CONTENTS := REQS.CONTENTS (1 .. I - 1) & REQS.CONTENTS (I + 1 .. REQS.SIZE); end if; end loop; REQS := RESULT; end REMOVE; -- ---------------- -- ( ) Dependencies -- ---------------- function GET_DEPENDENTS (REQ : in REQUIREMENT) return DEPENDENTS is DEPENDENT_OBJECTS : DNA.ITERATOR; E : DIR.ERROR_STATUS; GATEWAY : GWO.HANDLE; N : DNA.NAME_STATUS; S : SS.CONDITION; SIZE : COUNT := 0; THE_OBJECTS : OBJECT_LIST (COUNT); function ASA_DEPENDENTS (REQ : in REQUIREMENT) return STRING is begin case REQ.KIND is when NOT_A_REQUIREMENT => raise REQUIREMENT_ERROR; when FUNCTIONAL => return ASAP.ASA_DEPENDENTS (GATEWAY, NUMBER => REQ.ID); when NON_FUNCTIONAL => return ASAP.ASA_DEPENDENTS (GATEWAY); end case; end ASA_DEPENDENTS; use DIR; use DNA; begin GWO.OPEN_MAIN_OBJECT (OBJECT => REQ.OBJECT, H => GATEWAY, UPDATE => FALSE, ACTION_ID => REQ.ACTION_ID, ERRORS => S); if SS.ERROR (S) then return GENERAL_ERROR (S); end if; declare THE_DEPENDENTS : constant STRING := ASA_DEPENDENTS (REQ); begin GWO.CLOSE (GATEWAY, S); if SS.ERROR (S) then return GENERAL_ERROR (S); end if; if THE_DEPENDENTS = "" then return (IS_BAD => FALSE, OBJECTS => new OBJECT_LIST'(1 .. 0 => DIR.NIL)); pragma HEAP (JOB_SEGMENT.GET); end if; DNA.RESOLVE (ITER => DEPENDENT_OBJECTS, SOURCE => '[' & THE_DEPENDENTS & "]'S(Installed,Coded)", STATUS => N, OBJECTS_ONLY => FALSE, ACTION_ID => REQ.ACTION_ID); end; if N = DNA.UNDEFINED then return (IS_BAD => FALSE, OBJECTS => new OBJECT_LIST'(1 .. 0 => DIR.NIL)); pragma HEAP (JOB_SEGMENT.GET); elsif N /= DNA.SUCCESSFUL then return DIRECTORY_NAMING_ERROR (N); end if; while not DNA.DONE (DEPENDENT_OBJECTS) loop SIZE := SIZE + 1; DNA.GET_OBJECT (ITER => DEPENDENT_OBJECTS, THE_OBJECT => THE_OBJECTS (SIZE), STATUS => E); if E /= DIR.SUCCESSFUL then return DIRECTORY_ERROR (E); end if; DNA.NEXT (DEPENDENT_OBJECTS); end loop; return (IS_BAD => FALSE, OBJECTS => new OBJECT_LIST'(THE_OBJECTS (1 .. SIZE))); pragma HEAP (JOB_SEGMENT.GET); end GET_DEPENDENTS; procedure SET_DEPENDENTS (REQ : in REQUIREMENT; DEP : in DEPENDENTS) is DEPENDENT_OBJECTS : DNA.ITERATOR; GATEWAY : GWO.HANDLE; S : SS.CONDITION; SIZE : COUNT := 0; THE_OBJECTS : OBJECT_LIST (COUNT); begin if DEP.IS_BAD then raise DEPENDENT_ERROR; end if; GWO.OPEN_MAIN_OBJECT (OBJECT => REQ.OBJECT, H => GATEWAY, UPDATE => FALSE, ACTION_ID => REQ.ACTION_ID, ERRORS => S); if SS.ERROR (S) then raise REQUIREMENT_ERROR; end if; case REQ.KIND is when NOT_A_REQUIREMENT => raise REQUIREMENT_ERROR; when FUNCTIONAL => ASAP.SET_ASA_DEPENDENTS (GATEWAY, NUMBER => REQ.ID, VALUE => NAME (OBJECTS => DEP.OBJECTS.all, BEFORE => "")); when NON_FUNCTIONAL => ASAP.SET_ASA_DEPENDENTS (GATEWAY, VALUE => NAME (OBJECTS => DEP.OBJECTS.all, BEFORE => "")); end case; GWO.CLOSE (GATEWAY); end SET_DEPENDENTS; procedure ADD (DEP : in out DEPENDENTS; ONTO : in STRING) is N : DNA.NAME_STATUS; THE_OBJECT : DIR.OBJECT; use DNA; begin if DEP.IS_BAD then raise DEPENDENT_ERROR; end if; DNA.RESOLVE (NAME => ONTO, THE_OBJECT => THE_OBJECT, STATUS => N, ACTION_ID => ACTION.NULL_ID); DEP := (IS_BAD => FALSE, OBJECTS => new OBJECT_LIST'(DEP.OBJECTS.all & THE_OBJECT)); pragma HEAP (JOB_SEGMENT.GET); end ADD; procedure REMOVE (DEP : in out DEPENDENTS; ONTO : in STRING) is N : DNA.NAME_STATUS; THE_OBJECT : DIR.OBJECT; use DIR; begin if DEP.IS_BAD then raise DEPENDENT_ERROR; end if; DNA.RESOLVE (NAME => ONTO, THE_OBJECT => THE_OBJECT, STATUS => N, ACTION_ID => ACTION.NULL_ID); for I in DEP.OBJECTS'RANGE loop if THE_OBJECT = DEP.OBJECTS (I) then DEP := (IS_BAD => FALSE, OBJECTS => new OBJECT_LIST' (DEP.OBJECTS (DEP.OBJECTS'FIRST .. I - 1) & DEP.OBJECTS (I + 1 .. DEP.OBJECTS'LAST))); pragma HEAP (JOB_SEGMENT.GET); end if; end loop; end REMOVE; function DIAGNOSIS (DEP : in DEPENDENTS) return STRING is begin case DEP.IS_BAD is when FALSE => return ""; when TRUE => return DIAGNOSIS (DEP.ERROR); end case; end DIAGNOSIS; end REQUIREMENTS;-- -- This function returns a 10-character string made of lowercase letter -- and digits, which is guaranteed to be different at each call, even if -- they are very close to each other. For any sensible machine date, -- the first character will be alphabetic. -- function UNIQUE return STRING;with CALENDAR; with UNCHECKED_CONVERSION; function UNIQUE return STRING is type INTEGER5 is range 0 .. 31; for INTEGER5'SIZE use 5; type TIME_STRING is array (POSITIVE range 1 .. (CALENDAR.TIME'SIZE + INTEGER5'SIZE - 1) / INTEGER5'SIZE) of INTEGER5; GOOD_CHARACTERS : constant array (INTEGER5) of CHARACTER := "012345abcdefghijklmnopqrstuvwxyz"; function TO_TIME_STRING is new UNCHECKED_CONVERSION (SOURCE => CALENDAR.TIME, TARGET => TIME_STRING); NOW : constant CALENDAR.TIME := CALENDAR.CLOCK; TS : constant TIME_STRING := TO_TIME_STRING (NOW); S : STRING (TS'RANGE); begin for I in TS'RANGE loop S (I) := GOOD_CHARACTERS (TS (I)); end loop; return S; end UNIQUE;package UNIX_DEFINITIONS is -- UNIX commands BACKGROUND : constant STRING := "&"; REMOVE : constant STRING := "rm"; SETENV : constant STRING := "setenv"; STREAM_EDITOR : constant STRING := "sed"; EDIT : constant STRING := "-e"; TAPE_ARCHIVE : constant STRING := "tar"; CREATE : constant STRING := "c"; ARCHIVE_FILE : constant STRING := "f"; OUTPUT_REDIRECT : constant STRING := ">"; CHANGE_DIRECTORY : constant STRING := "cd"; COMMAND_SEPARATOR : constant CHARACTER := ';'; -- UNIX environment variables DISPLAY : constant STRING := "DISPLAY"; -- UNIX filenames MINIMAL_FILENAME_LENGTH : constant := 14; CONTEXT_SEPARATOR : constant CHARACTER := '/'; EXTENSION_SEPARATOR : constant CHARACTER := '.'; TARFILE_EXTENSION : constant STRING := EXTENSION_SEPARATOR & "Z"; function ENCLOSING_DIRECTORY (NAME : in STRING) return STRING; function LOCAL_NAME (NAME : in STRING) return STRING; function SIMPLE_NAME (NAME : in STRING) return STRING; function TEMPORARY_FILENAME (EXTENSION : in STRING) return STRING; end UNIX_DEFINITIONS;with UNIQUE; package body UNIX_DEFINITIONS is function ENCLOSING_DIRECTORY (NAME : in STRING) return STRING is begin for I in reverse NAME'RANGE loop if NAME (I) = CONTEXT_SEPARATOR then return NAME (NAME'FIRST .. I - 1); end if; end loop; return ""; end ENCLOSING_DIRECTORY; function LOCAL_NAME (NAME : in STRING) return STRING is begin for I in reverse NAME'RANGE loop if NAME (I) = CONTEXT_SEPARATOR then return NAME (I + 1 .. NAME'LAST); end if; end loop; return NAME; end LOCAL_NAME; function SIMPLE_NAME (NAME : in STRING) return STRING is begin for I in reverse NAME'RANGE loop if NAME (I) = CONTEXT_SEPARATOR then for J in I + 1 .. NAME'LAST loop if NAME (J) = EXTENSION_SEPARATOR then return NAME (I + 1 .. J - 1); end if; end loop; return NAME (I + 1 .. NAME'LAST); end if; end loop; return NAME; end SIMPLE_NAME; function TEMPORARY_FILENAME (EXTENSION : in STRING) return STRING is UNIQUE_NAME : constant STRING := UNIQUE & EXTENSION; pragma ASSERT (UNIQUE_NAME'LENGTH <= MINIMAL_FILENAME_LENGTH); begin return CONTEXT_SEPARATOR & "tmp" & CONTEXT_SEPARATOR & UNIQUE_NAME; end TEMPORARY_FILENAME; end UNIX_DEFINITIONS;