[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 ComponentImplementationAda('http://www.eclipse.org/uml2/3.0.0/UML')/]
[import org::polarsys::chess::codegen::ada::main::Copyright /]

[template public generateComponentImplementationAda(model : Model, procNode: InstanceSpecification, cImpl : Component, rType : Component ) {
	ptList : Sequence(OclAny) = cImpl.ownedAttribute->filter("Port")->asSequence();
    procNodeName : String = procNode.name;
    clSvPortStName : String = 'MARTE::MARTE_DesignModel::GCM::ClientServerPort';
    pkgName : String = rType.name.concat('s.').concat(cImpl.name).concat('s');
}
]

[file (procNodeName.concat('/src/component_repository/impl/ada/').concat(rType.name).concat('s-').concat(cImpl.name).
                                 concat('s.ads').toLower(), false, 'UTF-8')]
[generateCopyrightAda(model)/]

-- Comment the with below if you do not use user-defined datatypes
with Datatype; use Datatype;

package [pkgName/] is

 -- Declaration of the component implementation
   type [cImpl.name/] is new [rType.name /] with private;
 
 -- Declaration of the component implementation operation
   [for (op: Operation | cImpl.ownedOperation)]

	[if (isFunction(op))]
		[if (op.ownedParameter->size() = 1)]
   overriding	
   function [op.name/] (Self : in out [cImpl.name/]) return [getReturnParam(op).type.name/];
   		[else]
   overriding
   function [op.name/] (Self : in out [cImpl.name/] [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 [cImpl.name/]);
		[else]
   overriding
   procedure [op.name/] (Self : in out [cImpl.name/] [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]

private

   type [cImpl.name/] is new [rType.name /] with null record;

--/ ** Insert below your private declarations
--/ ** [protected (pkgName.concat('_PrivateDeclarations'))]

--/ ** [/protected]

end [pkgName/];

[/file]

[comment Package body/]
[file (procNodeName.concat('/src/component_repository/impl/ada/').concat(rType.name).concat('s-').concat(cImpl.name).
                                 concat('s.adb').toLower(), false, 'UTF-8')]
[generateReducedCopyrightAda(model)/]

--/ ** Insert below your with'ed packages
--/ ** [protected ('with packages')]

--/ ** [/protected]

package body [pkgName/] is

--/ ** Insert below your package local definitions
--/ ** [protected (pkgName.concat('_pkgDefinitions'))]

--/ ** [/protected]

   [for (op: Operation | cImpl.ownedOperation)]

	[if (isFunction(op))]
		[if (op.ownedParameter->size() = 1)]
   overriding   
   function [op.name/] (Self : in out [cImpl.name/]) return [getReturnParam(op).type.name/] is
		[else]
   overriding
   function [op.name/] (Self : in out [cImpl.name/] [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/] is
		[/if]
	[else]
		[if (op.ownedParameter->size() = 0)]
   overriding 
   procedure [op.name/] (Self : in out [cImpl.name/]) is
		[else]
   overriding 
   procedure [op.name/] (Self: in out [cImpl.name/][for (par : Parameter | op.ownedParameter)];
                          [par.name/] : [if(par.direction.toString().equalsIgnoreCase('return'))]out[else][par.direction/][/if] [par.type.name/][/for]) is
		[/if]
	[/if]
   pragma Warnings (Off, Self);
   --/ ** Insert below your local variables declarations;
   --/ ** [protected (op.name.concat('_LocalVariables'))]

   --/ ** [/protected]
	[if (isFunction(op))]
      [getReturnParam(op).name/] : [getReturnParam(op).type.name/];
	[/if]

   begin
   --/ ** Summary of calls to Required Interfaces (Worst-case scenario) **

     		[if op.method->size() > 0]
     			[let act : Activity = op.method->filter(Activity)->asSequence()->first()]
					[for (coa: CallOperationAction | act.node->filter(CallOperationAction))]
   --/ 1 call to -> Self.[coa.onPort.name/].[coa.operation.name/]
   					[/for]
     			[/let]
            [else]
   --/ No calls to Required Interfaces
			[/if]

   --/ ** End of calls to Required Interfaces **
   
      null; -- Remove in your final build
   --/ ** [protected (op.name)]

   --/ ** [/protected]
	[if (isFunction(op))]
      return [getReturnParam(op).name/];
	[/if]
   end [op.name/];
   [/for]

end [pkgName/];
[/file]

[/template]

[query public getOperationSignature(arg0 : Component, arg1 : Operation) : String
	= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'getOperationSignature(org.eclipse.uml2.uml.Component, org.eclipse.uml2.uml.Operation)', Sequence{arg0, arg1}) /]

[query public getCalledOperation(arg0 : Operation) : Sequence(OclAny)
	= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'getCalledOperation(org.eclipse.uml2.uml.Operation)', Sequence{arg0}) /]

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