blob: 842a2b5e48647acf18962ef3d55cac09c2f28470 [file] [log] [blame]
[comment encoding = UTF-8 /]
[comment
-----------------------------------------------------------------------
-- Ada infrastructural code generator --
-- for the CHESS component model --
-- --
-- Copyright (C) 2011-2012 --
-- University of Padova, ITALY --
-- --
-- Author: Marco Panunzio panunzio@math.unipd.it --
-- --
-- All rights reserved. This program and the accompanying materials --
-- are made available under the terms of the Eclipse Public License --
-- v1.0 which accompanies this distribution, and is available at --
-- http://www.eclipse.org/legal/epl-v20.html --
-----------------------------------------------------------------------
/]
[module Container('http://www.eclipse.org/uml2/3.0.0/UML',
'http://CHESS/Predictability/RTComponentModel')/]
[import org::polarsys::chess::codegen::ada::main::Copyright /]
[template public generateContainer(model : Model, procNode: InstanceSpecification, instSpec : InstanceSpecification, cImpl : Component) {
pkgName : String = 'CT_'.concat(instSpec.name.replaceAll('\\.','_')).replaceAll('\\.', '_').concat('s');
procNodeName : String = procNode.name;
ptList : Sequence(Port) = instSpec.classifier.oclAsType(Component).ownedAttribute->asSequence()->filter(Port);
clSvPortStName : String = 'MARTE::MARTE_DesignModel::GCM::ClientServerPort';
CHRtPortStName : String = 'CHESS::Dependability::RTComponentModel::CHRtPortSlot';
CHRtSpecificationStName : String = 'CHESS::Dependability::RTComponentModel::CHRtSpecification';
cType : Component = cImpl.clientDependency.supplier->asSequence()->first().oclAsType(Component);
instTypePkg : String = cType.name.concat('s.').concat(cImpl.name).concat('s');
slotSeq : Sequence(OclAny) = instSpec.slot->asSequence();
cyclicOpList : Sequence(Operation) = getCyclicOperationList(slotSeq, CHRtPortStName)->filter(Operation);
sporadicOpList : Sequence(Operation) = getSporadicOperationList(slotSeq, CHRtPortStName)->filter(Operation);
protectedOpList : Sequence(Operation) = getProtectedOperationList(slotSeq, CHRtPortStName)->filter(Operation);
unprotectedOpList : Sequence(Operation) = getUnprotectedOperationList(slotSeq, CHRtPortStName)->filter(Operation);
providedIntList : Sequence(Interface) = getProvidedInterfaceList(ptList, clSvPortStName)
}
]
[file (procNodeName.concat('/src/container/').concat(pkgName).concat('.ads').toLower(), false, 'UTF-8')]
[generateCopyrightAda(model) /]
[comment With section /]
-- Comment the with below if you do not use user-defined datatypes
with Datatype; use Datatype;
[comment With of interface packages/]
-- with of interface and component implementation packages
[for (aInterface: Interface | getProvidedInterfaceList(ptList, clSvPortStName)->filter(Interface))]
with [aInterface.name/];
[/for]
[for (aInterface: Interface | getRequiredInterfaceList(ptList, clSvPortStName)->filter(Interface))]
with [aInterface.name/];
[/for]
[comment With of the component implementation/]
with [cType.name/]s.[cImpl.name/]s;
[comment With of packages to enforce extra-functional properties/]
--with of packages for enforcement of extra-functional properties
[for (str: String | getPackageToWithSpec(slotSeq, CHRtPortStName, CHRtSpecificationStName)->filter(String))]
[str/]
[/for]
package [pkgName/] is
procedure Initialize_Container;
-- Getter subprograms for provided interfaces
[for (aInterface: Interface | getProvidedInterfaceList(ptList, clSvPortStName)->filter(Interface))]
function Get_[aInterface.name/] return [aInterface.name/].[aInterface.name/]_ptr;
[/for]
-- Setter subprograms for required interfaces
[for (pt : Port | ptList)]
[if (isRequiredPort(pt, clSvPortStName))]
procedure Set_[pt.name/] (ptr : in [getRequiredInterface(pt, clSvPortStName).name/].[getRequiredInterface(pt, clSvPortStName).name/]_ptr);
[/if]
[/for]
private
-- Component instance
[instSpec.name.replaceAll('\\.','_')/]: aliased [instTypePkg/].[cImpl.name/];
-- Access pointers to the instance (1 x PI)
[for (aInterface: Interface | getProvidedInterfaceList(ptList, clSvPortStName)->filter(Interface))]
[instSpec.name.replaceAll('\\.','_')/]_as_[aInterface.name/]_ptr : [aInterface.name/].[aInterface.name/]_ptr := [instSpec.name.replaceAll('\\.','_')/]'access;
[/for]
-- Type definition for the container
type ['CT_'.concat(instSpec.name.replaceAll('\\.','_'))/]_T is new [getProvidedInterfaceListAsQualifiedString(ptList, clSvPortStName)/] with null record;
-- Overriding of operations of interfaces
[for (op: Operation | cImpl.ownedOperation)]
[if (isFunction(op))]
[if (op.ownedParameter->size() = 1)]
overriding
function [op.name/] (Self : in out ['CT_'.concat(instSpec.name.replaceAll('\\.','_'))/]_T) return [getReturnParam(op).type.name/];
[else]
overriding
function [op.name/] (Self : in out ['CT_'.concat(instSpec.name.replaceAll('\\.','_'))/]_T [for (par : Parameter | op.ownedParameter)][if(not par.direction.toString().equalsIgnoreCase('return'))];
[par.name/] : [par.direction/] [par.type.name/][/if][/for]) return [getReturnParam(op).type.name/];
[/if]
[else]
[if (op.ownedParameter->size() = 0)]
overriding
procedure [op.name /] (Self : in out ['CT_'.concat(instSpec.name.replaceAll('\\.','_'))/]_T)[if (isCyclicOperation(slotSeq, op, CHRtPortStName))] is null[/if];
[else]
overriding
procedure [op.name/] (Self: in out ['CT_'.concat(instSpec.name.replaceAll('\\.','_'))/]_T[for (par : Parameter | op.ownedParameter)];
[par.name/] : [if(par.direction.toString().equalsIgnoreCase('return'))]out[else][par.direction/][/if] [par.type.name/][/for]);
[/if]
[/if]
[/for]
-- Instantiation of the container
['CT_'.concat(instSpec.name.replaceAll('\\.','_'))/]_T_inst_0 : aliased ['CT_'.concat(instSpec.name.replaceAll('\\.','_'))/]_T;
-- Entities for the enforcement of extra-functional properties --
[comment Cyclic operations /]
[for (op : Operation | cyclicOpList)]
-- Wrapper procedure for the cyclic operation
procedure [op.name/];
procedure Enqueueing_Procedure_My_Thread_[i-1/] (Release : out Time);
My_CPA_[i-1/] : aliased Release_Control_OBCS([getCeiling(slotSeq, op, CHRtPortStName)/]);
[if (isMonitored(slotSeq, op, CHRtPortStName))]
Name : constant access String := new String'("[getMonitoredTaskName(slotSeq, op, CHRtPortStName)/]");
My_Thread_[i-1/] : aliased Cyclic_Task_Monitored.Thread_T(Data_Structure.Generate_Task_ID, [getPriority(slotSeq, op, CHRtPortStName)/], 0, [getPeriodOrMIAT(slotSeq, op, CHRtPortStName)/],
Enqueueing_Procedure_My_Thread_[i-1/]'access, [op.name/]'access, Name);
[else]
My_Thread_[i-1/] : aliased Cyclic_Task.Thread_T(Data_Structure.Generate_Task_ID, [getPriority(slotSeq, op, CHRtPortStName)/], 0, [getPeriodOrMIAT(slotSeq, op, CHRtPortStName)/],
Enqueueing_Procedure_My_Thread_[i-1/]'access, [op.name/]'access);
[/if]
[/for]
[comment end Cyclic operations /]
[comment Sporadic operations /]
[if (sporadicOpList->notEmpty()) ]
-- Configuration parameters for all queues and OBCS
Param_Queue_Size : constant Integer := 3;
OBCS_Queue_Size : constant Integer := Param_Queue_Size * 2;
-- Instantiation of queues and OBCS
[/if]
[for (op : Operation | sporadicOpList)]
[let aInterface : Interface = getInterface(op, ptList, clSvPortStName)]
[op.name/]_OBCS_Ceiling : System.Priority := [getCeiling(slotSeq, op, CHRtPortStName)/];
type [op.name/]_Param_T is new Data_Structure.Param_Type with record
OPCS_Instance : [aInterface.name/].[aInterface.name/]_ptr;
[for (par : Parameter | op.ownedParameter)]
[par.name/] : [par.type.name/];
[/for]
end record;
type [op.name/]_Param_T_Ref is access all [op.name/]_Param_T;
type [op.name/]_Param_Arr is array(Integer range <>) of aliased [op.name/]_Param_T;
overriding
procedure My_OPCS(Self : in out [op.name/]_Param_T);
-- create an OBCS that matches the interface of the OPCS
protected type [op.name/]_OBCS(Ceiling : System.Any_Priority;
[op.name/]_Params_Arr_Ref_P : Data_Structure.Param_Arr_Ref) is
pragma Priority(Ceiling);
entry Get_Request(Req : out Data_Structure.Request_Descriptor_T;
Release : out Time);
-- Subprograms
[if (op.ownedParameter->size() = 0)] [comment 0 parameters/]
procedure [op.name/];
[else]
[let parList : OrderedSet(Parameter) = op.ownedParameter]
[if (parList->size() = 1)] [comment 1 parameter /]
procedure [op.name/] ([parList->first().name/] : [if(parList->first().direction.toString().equalsIgnoreCase('return'))]out[else][parList->first().direction/][/if] [parList->first().type.name/]);
[else] [comment more than 1 parameter/]
procedure [op.name/] ([for (par : Parameter | parList)]
[par.name/] : [if(par.direction.toString().equalsIgnoreCase('return'))]out[else][par.direction/][/if] [par.type.name/][if not(par = parList->last())];[/if][/for]);
[/if]
[/let]
[/if]
private
-- The queue system for [op.name/]_OBCS
[op.name/]_OBCS_Queue : Data_Structure.Request_Queue(OBCS_Queue_Size);
-- Arrays to store a set of reified invocations for [op.name/]
[op.name/]_Params : Data_Structure.Param_Buffer_T(Param_Queue_Size) :=
(Size => Param_Queue_Size, Index => 1, Buffer => [op.name/]_Params_Arr_Ref_P.all);
Pending : Standard.Boolean := False;
end [op.name/]_OBCS;
[/let]
[/for]
[comment End Sporadic operations /]
[comment Protected operations /]
[for (sl : Slot | slotSeq->filter(Slot))]
[let protectedOpList : Sequence(Operation) = getSlotProtectedOperation(sl, CHRtPortStName)]
[if (protectedOpList->notEmpty())]
[instSpec.name.replaceAll('\\.','_')/]_[sl.definingFeature.name/]_PO_Ceiling : System.Priority := [getCeiling(slotSeq, protectedOpList->first(), CHRtPortStName)/];
protected type [instSpec.name.replaceAll('\\.','_')/]_[sl.definingFeature.name/]_PO is
pragma Priority([instSpec.name.replaceAll('\\.','_')/]_[sl.definingFeature.name/]_PO_Ceiling);
-- Subprograms
[for (op : Operation | protectedOpList)]
[let parList : OrderedSet(Parameter) = op.ownedParameter]
[if (isFunction(op))]
[if (op.ownedParameter->size() = 1)]
function [op.name/] return [getReturnParam(op).type.name/];
[else]
[let parmListNoReturn : OrderedSet(Parameter) = parList->excluding(getReturnParam(op))]
function [op.name/]([for (par : Parameter | parmListNoReturn)][par.name/] : [par.direction/] [par.type.name/][if (not(par = parmListNoReturn->last()))]; [/if][/for]) return [getReturnParam(op).type.name/];
[/let]
[/if]
[else]
[if (op.ownedParameter->size() = 0)] [comment 0 parameters/]
procedure [op.name/];
[else]
procedure [op.name/] ([for (par : Parameter | parList)][par.name/] : [if(par.direction.toString().equalsIgnoreCase('return'))]out[else][par.direction/][/if] [par.type.name/][if not( par = parList->last())]; [/if][/for]);
[/if]
[/if]
[/let]
[/for]
private
end [instSpec.name.replaceAll('\\.','_')/]_[sl.definingFeature.name/]_PO;
[/if]
[/let]
[/for]
[comment end Protected Operations /]
end [pkgName/];
[/file]
[file (procNodeName.concat('/src/container/').concat(pkgName).concat('.adb').toLower(), false, 'UTF-8')]
[generateCopyrightAda(model)/]
[comment Package "Sporadic_Task" is to be with'ed if there is at
least one sporadic operation to be supported /]
[if (sporadicOpList->notEmpty())]
-- with Sporadic_Task;
with Sporadic_Task_Monitored;
-- With of data types and Default Values.
-- Remove it if it is already included in the spec.
with Datatype; use Datatype;
[/if]
--with Ada.Text_IO;
package body [pkgName/] is
procedure Initialize_Container is
begin
--Ada.Text_IO.Put_Line("-- Container [pkgName/].Initialize_Container -- ");
null;
end Initialize_Container;
[comment getters for Provided Interfaces /]
-- Getter subprograms for Provided Interfaces
[for (aInterface: Interface | getProvidedInterfaceList(ptList, clSvPortStName)->filter(Interface))]
function Get_[aInterface.name/] return [aInterface.name/].[aInterface.name/]_ptr is
begin
return ['CT_'.concat(instSpec.name.replaceAll('\\.','_'))/]_T_inst_0'access;
end Get_[aInterface.name/];
[/for]
[comment setters for Required Interfaces /]
-- Setter subprograms for Required Interfaces
[for (pt : Port | ptList)]
[if (isRequiredPort(pt, clSvPortStName))]
procedure Set_[pt.name/] (ptr : in [getRequiredInterface(pt, clSvPortStName).name/].[getRequiredInterface(pt, clSvPortStName).name/]_ptr) is
use type [getRequiredInterface(pt, clSvPortStName).name/].[getRequiredInterface(pt, clSvPortStName).name/]_ptr;
begin
if ptr /= null then
[instSpec.name.replaceAll('\\.','_')/].Set_[pt.name/](ptr);
end if;
end Set_[pt.name/];
[/if]
[/for]
[comment Cyclic operations BODY /]
[for (op : Operation | cyclicOpList)]
procedure Enqueueing_Procedure_My_Thread_[i-1/] (Release : out Time) is
begin
My_CPA_[i-1/].Enqueue_for_Release(Release);
end Enqueueing_Procedure_My_Thread_[i-1/];
-- Wrapper procedure for the cyclic operation
procedure [op.name/] is
begin
[instSpec.name.replaceAll('\\.','_')/].[op.name/];
end [op.name/];
[/for]
[comment end Cyclic operations BODY /]
[comment Sporadic operations BODY /]
[for (op : Operation | sporadicOpList)]
[let aInterface : Interface = getInterface(op, ptList, clSvPortStName)]
-- Redefinition of My_OPCS.
-- Call [op.name/] and set In_Use to false.
procedure My_OPCS(Self : in out [op.name/]_Param_T) is
begin
[if (op.ownedParameter->size() = 0)] [comment 0 parameters/]
Self.OPCS_Instance.[op.name/];
[else]
[let parList : OrderedSet(Parameter) = op.ownedParameter]
[if (parList->size() = 1)] [comment 1 parameter /]
Self.OPCS_Instance.[op.name/](Self.[parList->first().name/]);
[else] [comment more than 1 parameter/]
Self.OPCS_Instance.[op.name/](Self.[parList->first().name/],[for (par : Parameter | parList->excluding(parList->first())->asOrderedSet())]Self.[par.name/][/for]);
[/if]
[/let]
[/if]
Self.In_Use := False;
end My_OPCS;
protected body [op.name/]_OBCS is
procedure Update_Barrier is
begin
Pending := ([op.name/]_OBCS_Queue.Request_Pending) > 0;
end Update_Barrier;
-- Get_Request stores the time of the release of the task,
-- gets the next request (according to the OBCS queueing policy),
-- and updates the guard.
entry Get_Request (Req : out Data_Structure.Request_Descriptor_T;
Release : out Time)
when Pending is
begin
-- Ada.Text_IO.Put_Line("OBCS: Executing entry Get_Request");
Release := Clock;
Data_Structure.Get([op.name/]_OBCS_Queue, Req);
Update_Barrier;
end Get_Request;
-- When a client calls [op.name/], the request is reified and put in the OBCS queue.
[if (op.ownedParameter->size() = 0)] [comment 0 parameters/]
procedure [op.name/] is
[else]
[let parList : OrderedSet(Parameter) = op.ownedParameter]
[if (parList->size() = 1)] [comment 1 parameter /]
procedure [op.name/] ([parList->first().name/] : [parList->first().direction/] [parList->first().type.name/]) is
[else] [comment more than 1 parameter/]
procedure [op.name/] ([parList->first().name/] : [parList->first().direction/] [parList->first().type.name/][for (par : Parameter | parList->excluding(parList->first())->asOrderedSet())];
[par.name/] : [par.direction/] [par.type.name/][/for]) is
[/if]
[/let]
[/if]
begin
--Ada.Text_IO.Put_Line("OBCS: [op.name/]");
if [op.name/]_Params.Buffer([op.name/]_Params.Index).In_Use then
Data_Structure.Increase_Index([op.name/]_Params);
end if;
[for (par : Parameter | op.ownedParameter)]
[op.name/]_Param_T_Ref([op.name/]_Params.Buffer([op.name/]_Params.Index)).[par.name/] := [par.name/];
[/for]
Data_Structure.Put([op.name/]_OBCS_Queue, [op.name/]_Params.Buffer([op.name/]_Params.Index));
Data_Structure.Increase_Index([op.name/]_Params);
Update_Barrier;
end [op.name/];
end [op.name/]_OBCS;
[op.name/]_Par_Arr : [op.name/]_Param_Arr(1..Param_Queue_Size):=
(others => (In_Use => false,
OPCS_Instance => [instSpec.name.replaceAll('\\.','_')/]'access,
[let parList : OrderedSet(Parameter) = op.ownedParameter]
[if (parList->size() > 0)]
[parList->first().name/] => [parList->first().type.name/]_Default_Value[for (par : Parameter | parList->excluding(parList->first())->asOrderedSet())],
[par.name/] => [par.type.name/]_Default_Value [/for]));
[/if]
[/let]
[op.name/]_Ref_Par_Arr : aliased Data_Structure.Param_Arr :=
([op.name/]_Par_Arr(1)'access,
[op.name/]_Par_Arr(2)'access,
[op.name/]_Par_Arr(3)'access);
-- Instance of OBCS
[op.name/]_OBCS_inst : aliased [op.name/]_OBCS([op.name/]_OBCS_Ceiling, [op.name/]_Ref_Par_Arr'access);
-- Wrapper for OBCS_inst entry
procedure Enqueue_in_Entry_[op.name/](Req : out Data_Structure.Request_Descriptor_T;
Release : out Time) is
begin
[op.name/]_OBCS_inst.Get_Request(Req, Release);
end Enqueue_in_Entry_[op.name/];
-- Sporadic Task
[if (isMonitored(slotSeq, op, CHRtPortStName))]
Name : constant access String := new String'("[getMonitoredTaskName(slotSeq, op, CHRtPortStName)/]");
My_Thread_[i-1/] : aliased Sporadic_Task_Monitored.Thread_T(Data_Structure.Generate_Task_ID, [getPriority(slotSeq, op, CHRtPortStName)/], [getPeriodOrMIAT(slotSeq, op, CHRtPortStName)/],
Enqueue_In_Entry_[op.name/]'access, Name);
[else]
My_Thread_[i-1/] : aliased Sporadic_Task.Thread_T(Data_Structure.Generate_Task_ID, [getPriority(slotSeq, op, CHRtPortStName)/], [getPeriodOrMIAT(slotSeq, op, CHRtPortStName)/],
Enqueue_In_Entry_[op.name/]'access);
[/if]
[if (op.ownedParameter->size() = 0)]
procedure [op.name/] (Self : in out ['CT_'.concat(instSpec.name.replaceAll('\\.','_'))/]_T) is
[else]
procedure [op.name/] (Self: in out ['CT_'.concat(instSpec.name.replaceAll('\\.','_'))/]_T[for (par : Parameter | op.ownedParameter)];
[par.name/] : [par.direction/] [par.type.name/][/for]) is
[/if]
pragma Warnings (Off, Self);
begin
--Ada.Text_IO.Put_Line("Container ['CT_'.concat(instSpec.name.replaceAll('\\.','_'))/] : Reifiying [op.name/] call to OBCS ");
[if (op.ownedParameter->size() = 0)] [comment 0 parameters/]
[op.name/]_OBCS_inst.[op.name/];
[else]
[let parList : OrderedSet(Parameter) = op.ownedParameter]
[op.name/]_OBCS_inst.[op.name/]([parList->first().name/][for (par : Parameter | parList->excluding(parList->first())->asOrderedSet())], [par.name/][/for]);
[/let]
[/if]
end [op.name/];
[/let]
[/for]
[comment End Sporadic operations BODY /]
[comment Protected operations BODY /]
[for (sl : Slot | slotSeq->filter(Slot))]
[let protectedOpList : Sequence(Operation) = getSlotProtectedOperation(sl, CHRtPortStName)]
[if (protectedOpList->notEmpty())]
-- Instance of [instSpec.name.replaceAll('\\.','_')/]_[sl.definingFeature.name/] protected object
[instSpec.name.replaceAll('\\.','_')/]_[sl.definingFeature.name/]_PO_inst : aliased [instSpec.name.replaceAll('\\.','_')/]_[sl.definingFeature.name/]_PO;
protected body [instSpec.name.replaceAll('\\.','_')/]_[sl.definingFeature.name/]_PO is
[for (op : Operation | protectedOpList)]
[let parList : OrderedSet(Parameter) = op.ownedParameter]
[if (isFunction(op))]
[if (op.ownedParameter->size() = 1)]
function [op.name/] return [getReturnParam(op).type.name/] is
[else]
[let parmListNoReturn : OrderedSet(Parameter) = parList->excluding(getReturnParam(op))]
function [op.name/]([for (par : Parameter | parmListNoReturn)][par.name/] : [par.direction/] [par.type.name/][if (not(par = parmListNoReturn->last()))]; [/if][/for]) return [getReturnParam(op).type.name/] is
[/let]
[/if]
[else]
[if (op.ownedParameter->size() = 0)] [comment 0 parameters/]
procedure [op.name/] is
[else]
procedure [op.name/] ([for (par : Parameter | parList)][par.name/] : [if(par.direction.toString().equalsIgnoreCase('return'))]out[else][par.direction/][/if] [par.type.name/][if not( par = parList->last())]; [/if][/for]) is
[/if]
[/if]
[/let]
begin
--Ada.Text_IO.Put_Line("PO.[op.name/]");
[if (isFunction(op))]
[if (op.ownedParameter->size() = 1)]
return [instSpec.name.replaceAll('\\.','_')/].[op.name/];
[else]
[let parmListNoReturn : OrderedSet(Parameter) = op.ownedParameter->excluding(getReturnParam(op))]
return [instSpec.name.replaceAll('\\.','_')/].[op.name/]([for (par : Parameter | parmListNoReturn)][par.name/][if not(par = parmListNoReturn->last())], [/if][/for]);
[/let]
[/if]
[else]
[if (op.ownedParameter->size() = 0)] [comment 0 parameters/]
[instSpec.name.replaceAll('\\.','_')/].[op.name/];
[else]
[let parList : OrderedSet(Parameter) = op.ownedParameter]
[instSpec.name.replaceAll('\\.','_')/].[op.name/]([for (par : Parameter | parList)][par.name/][if not(par = parList->last())], [/if][/for]);
[/let]
[/if]
[/if]
end [op.name/];
[/for]
end [instSpec.name.replaceAll('\\.','_')/]_[sl.definingFeature.name/]_PO;
-- Redefinition of procedures of the container
[for (op : Operation | protectedOpList)]
[if (isFunction(op))]
[if (op.ownedParameter->size() = 1)]
function [op.name/] (Self : in out ['CT_'.concat(instSpec.name.replaceAll('\\.','_'))/]_T) return [getReturnParam(op).type.name/] is
[else]
[let parmListNoReturn : OrderedSet(Parameter) = op.ownedParameter->excluding(getReturnParam(op))]
function [op.name/] (Self : in out ['CT_'.concat(instSpec.name.replaceAll('\\.','_'))/]_T[for (par : Parameter | parmListNoReturn)];
[par.name/] : [par.direction/] [par.type.name/][/for]) return [getReturnParam(op).type.name/] is
[/let]
[/if]
[else]
[if (op.ownedParameter->size() = 0)]
procedure [op.name/] (Self : in out ['CT_'.concat(instSpec.name.replaceAll('\\.','_'))/]_T) is
[else]
procedure [op.name/] (Self: in out ['CT_'.concat(instSpec.name.replaceAll('\\.','_'))/]_T[for (par : Parameter | op.ownedParameter)];
[par.name/] : [par.direction/] [par.type.name/][/for]) is
[/if]
[/if]
pragma Warnings (Off, Self);
begin
--Ada.Text_IO.Put_Line("Container ['CT_'.concat(instSpec.name.replaceAll('\\.','_'))/] : Indirection to PO.[op.name/]");
[if (isFunction(op))]
[if (op.ownedParameter->size() = 1)]
return [instSpec.name.replaceAll('\\.','_')/]_[sl.definingFeature.name/]_PO_inst.[op.name/];
[else]
[let parmListNoReturn : OrderedSet(Parameter) = op.ownedParameter->excluding(getReturnParam(op))]
return [instSpec.name.replaceAll('\\.','_')/]_[sl.definingFeature.name/]_PO_inst.[op.name/]([for (par : Parameter | parmListNoReturn)][par.name/][if not(par = parmListNoReturn->last())], [/if][/for]);
[/let]
[/if]
[else]
[if (op.ownedParameter->size() = 0)] [comment 0 parameters/]
[instSpec.name.replaceAll('\\.','_')/]_[sl.definingFeature.name/]_PO_inst.[op.name/];
[else]
[let parList : OrderedSet(Parameter) = op.ownedParameter]
[instSpec.name.replaceAll('\\.','_')/]_[sl.definingFeature.name/]_PO_inst.[op.name/]([for (par : Parameter | parList)][par.name/][if not(par = parList->last())], [/if][/for]);
[/let]
[/if]
[/if]
end [op.name/];
[/for]
[/if]
[/let]
[/for]
[comment End protected operations /]
[comment Unprotected Operations /]
[for (op: Operation | unprotectedOpList)]
[if (isFunction(op))]
[if (op.ownedParameter->size() = 1)]
function [op.name/] (Self : in out ['CT_'.concat(instSpec.name.replaceAll('\\.','_'))/]_T) return [getReturnParam(op).type.name/] is
[else]
[let parmListNoReturn : OrderedSet(Parameter) = op.ownedParameter->excluding(getReturnParam(op))]
function [op.name/] (Self : in out ['CT_'.concat(instSpec.name.replaceAll('\\.','_'))/]_T [for (par : Parameter | parmListNoReturn)]; [par.name/] : [par.direction/] [par.type.name/][/for]) return [getReturnParam(op).type.name/] is
[/let]
[/if]
[else]
[if (op.ownedParameter->size() = 0)]
procedure [op.name/] (Self : in out ['CT_'.concat(instSpec.name.replaceAll('\\.','_'))/]_T) is
[else]
procedure [op.name/] (Self: in out ['CT_'.concat(instSpec.name.replaceAll('\\.','_'))/]_T[for (par : Parameter | op.ownedParameter)];
[par.name/] : [par.direction/] [par.type.name/][/for]) is
[/if]
[/if]
pragma Warnings (Off, Self);
begin
--Ada.Text_IO.Put_Line("Container ['CT_'.concat(instSpec.name.replaceAll('\\.','_'))/] : Unprotected execution of [op.name/]");
[if (isFunction(op))]
[if (op.ownedParameter->size() = 1)]
return [instSpec.name.replaceAll('\\.','_')/].[op.name/];
[else]
[let parmListNoReturn : OrderedSet(Parameter) = op.ownedParameter->excluding(getReturnParam(op))]
return [instSpec.name.replaceAll('\\.','_')/].[op.name/]([for (par : Parameter | parmListNoReturn)][par.name/][if not(par = parmListNoReturn->last())], [/if][/for]);
[/let]
[/if]
[else]
[if (op.ownedParameter->size() = 0)] [comment 0 parameters/]
[instSpec.name.replaceAll('\\.','_')/].[op.name/];
[else]
[let parList : OrderedSet(Parameter) = op.ownedParameter]
[instSpec.name.replaceAll('\\.','_')/].[op.name/]([for (par : Parameter | parList)][par.name/][if not(par = parList->last())], [/if][/for]);
[/let]
[/if]
[/if]
end [op.name/];
[/for]
[comment end Unprotected Operations /]
end [pkgName/];
[/file]
[/template]
[query public getRequiredInterface(arg0 : Port, arg1 : String) : Interface
= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'getRequiredInterface(org.eclipse.uml2.uml.Port, java.lang.String)', Sequence{arg0, arg1}) /]
[query public isRequiredPort(arg0 : Port, arg1 : String) : Boolean
= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'isRequiredPort(org.eclipse.uml2.uml.Port, java.lang.String)', Sequence{arg0, arg1}) /]
[query public getProvidedInterfaceList(arg0 : Sequence(OclAny), arg1 : String) : Sequence(OclAny)
= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'getProvidedInterfaceList(java.util.List, java.lang.String)', Sequence{arg0, arg1}) /]
[query public getProvidedInterfaceListAsQualifiedString(arg0 : Sequence(OclAny), arg1 : String) : String
= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'getProvidedInterfaceListAsQualifiedString(java.util.List, java.lang.String)', Sequence{arg0, arg1}) /]
[query public getRequiredInterfaceList(arg0 : Sequence(OclAny), arg1 : String) : Sequence(OclAny)
= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'getRequiredInterfaceList(java.util.List, java.lang.String)', Sequence{arg0, arg1}) /]
[query public getPackageToWithSpec(arg0 : Sequence(OclAny), arg1 : String, arg2 : String) : Sequence(OclAny)
= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'getPackageToWithSpec(java.util.List, java.lang.String, java.lang.String)', Sequence{arg0, arg1, arg2}) /]
[query public getPriority(arg0 : Sequence(OclAny), arg1 : Operation, arg2 : String) : String
= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'getPriority(java.util.List, org.eclipse.uml2.uml.Operation, java.lang.String)', Sequence{arg0, arg1, arg2}) /]
[query public isMonitored(arg0 : Sequence(OclAny), arg1 : Operation, arg2 : String) : Boolean
= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'isMonitored(java.util.List, org.eclipse.uml2.uml.Operation, java.lang.String)', Sequence{arg0, arg1, arg2}) /]
[query public getMonitoredTaskName(arg0 : Sequence(OclAny), arg1 : Operation, arg2 : String) : String
= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'getMonitoredTaskName(java.util.List, org.eclipse.uml2.uml.Operation, java.lang.String)', Sequence{arg0, arg1, arg2}) /]
[query public getPeriodOrMIAT(arg0 : Sequence(OclAny), arg1 : Operation, arg2 : String) : String
= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'getPeriodOrMIAT(java.util.List, org.eclipse.uml2.uml.Operation, java.lang.String)', Sequence{arg0, arg1, arg2}) /]
[query public getCeiling(arg0 : Sequence(OclAny), arg1 : Operation, arg2 : String) : String
= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'getCeiling(java.util.List, org.eclipse.uml2.uml.Operation, java.lang.String)', Sequence{arg0, arg1, arg2}) /]
[query public getCyclicOperationList(arg0 : Sequence(OclAny), arg1 : String) : Sequence(OclAny)
= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'getCyclicOperationList(java.util.List, java.lang.String)', Sequence{arg0, arg1}) /]
[query public getSporadicOperationList(arg0 : Sequence(OclAny), arg1 : String) : Sequence(OclAny)
= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'getSporadicOperationList(java.util.List, java.lang.String)', Sequence{arg0, arg1}) /]
[query public getProtectedOperationList(arg0 : Sequence(OclAny), arg1 : String) : Sequence(OclAny)
= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'getProtectedOperationList(java.util.List, java.lang.String)', Sequence{arg0, arg1}) /]
[query public getUnprotectedOperationList(arg0 : Sequence(OclAny), arg1 : String) : Sequence(OclAny)
= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'getUnprotectedOperationList(java.util.List, java.lang.String)', Sequence{arg0, arg1}) /]
[query public getSlotProtectedOperation(arg0 : Slot, arg1 : String) : Sequence(OclAny)
= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'getSlotProtectedOperation(org.eclipse.uml2.uml.Slot, java.lang.String)', Sequence{arg0, arg1}) /]
[query public isCyclicOperation(arg0 : Sequence(OclAny), arg1 : Operation, arg2 : String) : Boolean
= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'isCyclicOperation(java.util.List, org.eclipse.uml2.uml.Operation, java.lang.String)', Sequence{arg0, arg1, arg2}) /]
[query public getInterface(arg0 : Operation, arg1 : Sequence(OclAny), arg2 : String) : Interface
= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'getInterface(org.eclipse.uml2.uml.Operation, java.util.List, java.lang.String)', Sequence{arg0, arg1, arg2}) /]
[query public isFunction(arg : Operation) : Boolean
= invoke ('org.polarsys.chess.codegen.ada.service.UML2Service', 'isFunction(org.eclipse.uml2.uml.Operation)', Sequence{arg}) /]
[query public getReturnParam(arg : Operation) : Parameter
= invoke ('org.polarsys.chess.codegen.ada.service.UML2Service', 'getReturnParam(org.eclipse.uml2.uml.Operation)', Sequence{arg}) /]