|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ B T ┃
Length: 29227 (0x722b) Types: TextFile Names: »B«
└─⟦a7d1ea751⟧ Bits:30000550 8mm tape, Rational 1000, !users!projects 94_04_11 └─ ⟦129cab021⟧ »DATA« └─⟦bb25a46d4⟧ └─⟦f64eaa120⟧ Bits:30000752 8mm tape, Rational 1000, !projects 93 02 16 └─ ⟦6f12a12be⟧ »DATA« └─⟦bb25a46d4⟧ └─⟦2f6cfab89⟧ Bits:30000547 8mm tape, Rational 1000, !projects 94-01-04 └─ ⟦d65440be7⟧ »DATA« └─⟦bb25a46d4⟧ └─⟦this⟧
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;