|
|
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 - metrics - downloadIndex: B T
Length: 35584 (0x8b00)
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 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;