[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}) /]