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

[template public generateRemoteMsgServer(model : Model, procNode: InstanceSpecification, compInstInputList : Sequence(OclAny), connectorInstInputList: Sequence(OclAny)) {
    procNodeName : String = procNode.name;
    clSvPortStName : String = 'MARTE::MARTE_DesignModel::GCM::ClientServerPort';
    assignStName   : String = 'MARTE::MARTE_Foundations::Alloc::Assign';
    compImplStName : String = 'CHESS::ComponentModel::ComponentImplementation';
	chHwProcessorStName  : String = 'CHESS::Predictability::DeploymentConfiguration::HardwareBaseline::CH_HwProcessor';
    isSingleNodeSystem : Boolean = isSingleNodeSystem(InstanceSpecification.allInstances()->asSequence(), chHwProcessorStName);
    compInstList : Sequence(InstanceSpecification) = compInstInputList->filter(InstanceSpecification);
    requiredInterfaceSlotList : Sequence(Slot) = getRequiredInterfaceSlotList(compInstList, clSvPortStName)->filter(Slot);
    providedInterfaceSlotList : Sequence(Slot) = getProvidedInterfaceSlotList(compInstList, clSvPortStName)->filter(Slot);
    connectorInstList : Sequence(InstanceSpecification) = connectorInstInputList->filter(InstanceSpecification);
    isRemoteMsgServerNecessary : Boolean = isRemoteMsgServerNecessary(providedInterfaceSlotList, procNode, connectorInstList, Comment.allInstances()->asSequence(), assignStName);  
}
]

[comment RemoteMsgServer.ads /]
[if (isRemoteMsgServerNecessary)]
[file (procNodeName.concat('/middleware/src/remote_msg_server.ads').toLower(), false, 'UTF-8')]
[generateCopyrightAda(model)/]

with YAMI.Core.Closed_Connection_Handlers;
with YAMI.Core.Incoming_Message_Handlers;
with YAMI.Core.New_Connection_Handlers;
with Remote_Msg_Server_Task;
with Data_Structure;
with Middleware_Realtime_Attribute;
with Datatype; use Datatype;

-- with of RI to be called
[for (sl : Slot | providedInterfaceSlotList)]
   [let boundSlot : Sequence(Slot) = getBoundRIslotList(sl, connectorInstList)->filter(Slot)]
      [if (isRemoteCommNecessary(boundSlot, procNode, Comment.allInstances()->asSequence(), assignStName))]
with [getProvidedInterface(sl.definingFeature->filter(Port)->asSequence()->first(), clSvPortStName).name/];
      [/if]
   [/let]
[/for]

package Remote_Msg_Server is

   procedure Initialize_Remote_Msg_Server;
   procedure Run;

   type Incoming_Message_Handler is
     new YAMI.Core.Incoming_Message_Handlers.Handler with null record;

   type New_Connection_Handler is
     new YAMI.Core.New_Connection_Handlers.Handler with null record;

   type Closed_Connection_Handler is
     new YAMI.Core.Closed_Connection_Handlers.Handler with null record;

   overriding
   procedure New_Connection (H : in out New_Connection_Handler;
                             Source : in String;
                             Channel : in YAMI.Core.Channel_Descriptor);

   overriding
   procedure Closed_Connection (H : in out Closed_Connection_Handler;
                                Source : in String);

   overriding
   procedure Call (H : in out Incoming_Message_Handler;
         Source : in String;
         Header_Buffers : in YAMI.Core.Serialization_Buffers_Descriptor;
         Body_Buffers : in YAMI.Core.Serialization_Buffers_Descriptor);

-- Setters for PI redirectors
[for (sl : Slot | providedInterfaceSlotList)]
   [let boundSlot : Sequence(Slot) = getBoundRIslotList(sl, connectorInstList)->filter(Slot)]
      [if (isRemoteCommNecessary(boundSlot, procNode, Comment.allInstances()->asSequence(), assignStName))]
   procedure Set_[sl.definingFeature.name/](ptr : in [getProvidedInterface(sl.definingFeature->filter(Port)->asSequence()->first(), clSvPortStName).name/].[getProvidedInterface(sl.definingFeature->filter(Port)->asSequence()->first(), clSvPortStName).name/]_ptr);
      [/if]
   [/let]
[/for]

private

   procedure Resolve_Call;

         -- Instantiation of a thread for the server
   Remote_Msg_Server_Thread_0 : aliased
     Remote_Msg_Server_Task.Thread_T(Data_Structure.Generate_Task_ID,
                                     Middleware_Realtime_Attribute.Remote_Msg_Server_Priority,
                                     Middleware_Realtime_Attribute.Remote_Msg_Server_Period,
                                     Remote_Msg_Server.Initialize_Remote_Msg_Server'Access,
                                     Remote_Msg_Server.Run'Access);

   -- List of PI redirector
[for (sl : Slot | providedInterfaceSlotList)]
   [let boundSlot : Sequence(Slot) = getBoundRIslotList(sl, connectorInstList)->filter(Slot)]
      [if (isRemoteCommNecessary(boundSlot, procNode, Comment.allInstances()->asSequence(), assignStName))]
   [sl.definingFeature.name/]_ptr : [getRequiredInterface(boundSlot.definingFeature->filter(Port)->asSequence()->first(), clSvPortStName).name/].[getRequiredInterface(boundSlot.definingFeature->filter(Port)->asSequence()->first(), clSvPortStName).name/]_ptr;
      [/if]
   [/let]
[/for]

end Remote_Msg_Server;
[/file]

[comment RemoteMsgServer.adb /]
[file (procNodeName.concat('/middleware/src/remote_msg_server.adb').toLower(), false, 'UTF-8')]
[generateCopyrightAda(model)/]

with YAMI.Core.Agents;
with YAMI.Parameters;
with Ada.Text_IO;
with Distribution_Naming_Data; use Distribution_Naming_Data;
with CRC_lib;
with Interfaces;

package body Remote_Msg_Server is

   Client_Target : String (1 .. YAMI.Core.Agents.Max_Target_Length);
   Client_Target_Last : Natural;

   Server_Agent : YAMI.Core.Agents.Agent;
   --Server_Address : constant String := "tcp://localhost:12207";

   New_Connection_Called : Boolean := False;
   pragma Volatile (New_Connection_Called);
   pragma Warnings (Off, New_Connection_Called);

   Incoming_Header : YAMI.Parameters.Parameters_Collection;
   Incoming_Body : YAMI.Parameters.Parameters_Collection;

   Closed_Connection_Called : Boolean := False;
   pragma Volatile (Closed_Connection_Called);
      pragma Warnings (Off, Closed_Connection_Called);

   My_New_Connection_Handler : aliased New_Connection_Handler;
   My_Closed_Connection_Handler : aliased Closed_Connection_Handler;
   My_Incoming_Message_Handler : aliased Incoming_Message_Handler;

   procedure New_Connection (H : in out New_Connection_Handler;
                             Source : in String;
                             Channel : in YAMI.Core.Channel_Descriptor) is
      pragma Warnings(Off, H);
      pragma Warnings(Off, Channel);
   begin
      Client_Target_Last := Source'Length;
      Client_Target (1 .. Client_Target_Last) := Source;
      New_Connection_Called := True;
      Ada.Text_IO.Put_Line("New Connection called");
   end New_Connection;

   procedure Closed_Connection (H : in out Closed_Connection_Handler;
                                Source : in String) is
      pragma Warnings(Off, H);
   begin
      pragma Assert (Source = Client_Target (1 .. Client_Target_Last));
      Closed_Connection_Called := True;
      Ada.Text_IO.Put_Line("Closed_Connection called");
   end Closed_Connection;

   procedure Call
     (H : in out Incoming_Message_Handler;
      Source : in String;
      Header_Buffers : in YAMI.Core.Serialization_Buffers_Descriptor;
      Body_Buffers : in YAMI.Core.Serialization_Buffers_Descriptor) is
      --Destination_Instance : YAMI.Parameters.YAMI_Integer;
      --Operation_Name : Ada.Strings.Unbounded.Unbounded_String;
      pragma Warnings (Off, H);
   begin
      Ada.Text_IO.Put_Line("Remote msg server Call called");
      --    pragma Assert (Source = Client_Target (1 .. Client_Target_Last));
      Incoming_Header.Deserialize (Header_Buffers);
      Incoming_Body.Deserialize (Body_Buffers);

      Ada.Text_IO.Put_Line("Source: " & Source);
      Ada.Text_IO.Put_Line("Destination_Instance: " & Integer'Image(Integer(Incoming_Body.Get_Integer("Destination_Instance_Name"))));
      Ada.Text_IO.Put_Line("Instance_Operation_Name: " &  Integer'Image(Integer(Incoming_Body.Get_Integer("Instance_Operation_Name"))));
      Resolve_Call;
   end Call;

   procedure Initialize_Remote_Msg_Server is
      Resolved_Target : String (1 .. YAMI.Core.Agents.Max_Target_Length);
      Resolved_Target_Last : Natural;
      Timed_Out : Boolean;
   begin
 --     Ada.Text_IO.Put_Line("Remote_Msg_Server: Init called");
     YAMI.Core.Agents.Init_Agent
           (Server_Agent,
            My_Incoming_Message_Handler'Unchecked_Access,
            My_Closed_Connection_Handler'Unchecked_Access);
 --     Ada.Text_IO.Put_Line("Remote_Msg_Server: Agent initialized");

         YAMI.Parameters.Init_Parameters (Incoming_Header);
         YAMI.Parameters.Init_Parameters (Incoming_Body);

--      Ada.Text_IO.Put_Line("Remote_Msg_Server: Parameters initialized");
      Server_Agent.Do_Some_Work (0.0, Timed_Out);
      --  create listener
 --     Ada.Text_IO.Put_Line("Remote_Msg_Server: Creating listener...");
      Server_Agent.Add_Listener
           ("tcp://127.0.0.1:12207", Resolved_Target, Resolved_Target_Last,
            My_New_Connection_Handler'Unchecked_Access);

--      Ada.Text_IO.Put_Line("Remote_Msg_Server: Listener initialized");
         Server_Agent.Do_Some_Work (0.0, Timed_Out);
   end Initialize_Remote_Msg_Server;

   procedure Run is
      Timed_Out : Boolean;
   begin
      --Ada.Text_IO.Put_Line("Run called");
      Server_Agent.Do_Some_Work (100.0, Timed_Out);
   end Run;


[for (sl : Slot | providedInterfaceSlotList)]
   [let boundSlot : Sequence(Slot) = getBoundRIslotList(sl, connectorInstList)->filter(Slot)]
      [if (isRemoteCommNecessary(boundSlot, procNode, Comment.allInstances()->asSequence(), assignStName))]
   procedure Set_[sl.definingFeature.name/](ptr : in [getProvidedInterface(sl.definingFeature->filter(Port)->asSequence()->first(), clSvPortStName).name/].[getProvidedInterface(sl.definingFeature->filter(Port)->asSequence()->first(), clSvPortStName).name/]_ptr) is
   begin
      [sl.definingFeature.name/]_ptr := ptr;
   end Set_[sl.definingFeature.name/];

[for (op : Operation | getProvidedInterface((sl.definingFeature.oclAsType(Port)), clSvPortStName).ownedOperation)]
   [sl.definingFeature.name/]_[op.name/]_Sequence_ID : Integer := 0;
[/for]
      [/if]
   [/let]
[/for]

   procedure Resolve_Call is
      Destination_Instance : constant Integer := Integer(Incoming_Body.Get_Integer("Destination_Instance_Name"));
      Instance_Operation_Int : constant Integer := Integer(Incoming_Body.Get_Integer("Instance_Operation_Name"));
      Has_Sequence_ID : constant Boolean := Incoming_Header.Get_Boolean("Has_Sequence_ID");
      Has_Payload_CRC : constant Boolean := Incoming_Header.Get_Boolean("Has_Payload_CRC");
      Is_Sequence_ID_correct : Boolean := true;
      Is_Payload_CRC_correct : Boolean := true;
   begin
      case Destination_Instance is
[for (ci : InstanceSpecification | compInstList)]
         when Destination_Instance_Name'Pos([ci.name/]) =>
            Ada.Text_IO.Put_Line("DEST: [ci.name/]");
	[for (sl : Slot | providedInterfaceSlotList->select(mySl | mySl.owningInstance = ci))]
  		[let boundSlot : Sequence(Slot) = getBoundRIslotList(sl, connectorInstList)->filter(Slot)]
      		[if (isRemoteCommNecessary(boundSlot, procNode, Comment.allInstances()->asSequence(), assignStName))]
            case Instance_Operation_Int is
			   [for (op : Operation | getProvidedInterface(sl.definingFeature->filter(Port)->asSequence()->first(), clSvPortStName).ownedOperation)]
               when Instance_Operation_Name'Pos([op.name/]) =>
                  Ada.Text_IO.Put_Line("OP : [op.name/]");
                  Ada.Text_IO.Put_Line("Calling [ci.name/].[op.name/]");
                  Ada.Text_IO.Put_Line("Has Sequence ID: " & Boolean'Image(Has_Sequence_ID));
                  Ada.Text_IO.Put_Line("Has Payload CRC: " & Boolean'Image(Has_Payload_CRC));
                  
                  if (Has_Sequence_ID) then
                     Ada.Text_IO.Put_Line("Sequence ID: " & Integer'Image(Integer(Incoming_Header.Get_Integer("Sequence_ID"))));
                     if ([sl.definingFeature.name/]_[op.name/]_Sequence_ID = Integer(Incoming_Header.Get_Integer("Sequence_ID"))) then
                        Ada.Text_IO.Put_Line("Message Sequence ID matches the expected value");
                        [sl.definingFeature.name/]_[op.name/]_Sequence_ID := [sl.definingFeature.name/]_[op.name/]_Sequence_ID + 1;
                     else
                        Ada.Text_IO.Put_Line("Wrong Sequence ID in incoming message!");
                        -- Does not update the Sequence ID counter
                        -- Flag the failed Sequence ID
                        Is_Sequence_ID_correct := false;
                     end if;
                  end if;

                  [comment issuing the call to the operation /]
			      [if (op.ownedParameter->size() = 0) ]
                  if (Has_Payload_CRC) then
                        
                     --Calculating CRC from incoming message                        

                     CRC_lib.Init;
                     -- Updating CRC with values of destination and instance
                     CRC_lib.Update(Destination_Instance);
                     CRC_lib.Update(Instance_Operation_Int);
                     
                     -- Comparing fetched Payload CRC with calculated CRC
                     declare
                        use type Interfaces.Unsigned_32;
                        Fetched_Payload_CRC : constant Interfaces.Unsigned_32 := Interfaces.Unsigned_32'Value(Incoming_Header.Get_String("Payload_CRC"));
                        Calculated_Payload_CRC: constant Interfaces.Unsigned_32 := CRC_lib.Get_Value;
                     begin
                        Ada.Text_IO.Put_Line("Fetched Payload CRC: " & Incoming_Header.Get_String("Payload_CRC"));
                        Ada.Text_IO.Put_Line("Calculated Payload CRC: " & Interfaces.Unsigned_32'Image(Calculated_Payload_CRC));
                        if (Fetched_Payload_CRC = Calculated_Payload_CRC) then
                           Ada.Text_IO.Put_Line("CRC test passed.");
                        else 
                           Ada.Text_IO.Put_Line("CRC test failed.");
                           Is_Payload_CRC_correct := false;
                        end if;
                     end;

                  end if;

                  if (Is_Sequence_ID_correct and then Is_Payload_CRC_Correct) then
                     Ada.Text_IO.Put_Line("Message correctly received. Calling the requested operation.");
                     [sl.definingFeature.name/]_ptr.[op.name/];
                  else
                     Ada.Text_IO.Put_Line("Message discarded due to failed test");
                  end if;    
                  [else]
                  declare
                     [for (p : Parameter | op.ownedParameter)]
                        [if (p.type.name = 'Float')]
                     [p.name/] : constant Float := Float((Incoming_Body.Get_Long_Float("[p.name/]")));
                        [elseif (p.type.name = 'Integer')]
                     [p.name/] : constant Integer := Integer((Incoming_Body.Get_Integer("[p.name/]")));
                        [elseif (p.type.name = 'Boolean')]
                     [p.name/] : constant Boolean := Boolean((Incoming_Body.Get_Boolean("[p.name/]")));
                        [elseif (p.type->filter(Enumeration)->size() = 1)]
                     [p.name/] : constant [p.type.name/] := [p.type.name/]'Val(Integer((Incoming_Body.Get_Integer("[p.name/]"))));
                        [elseif (p.type->filter(DataType)->size() = 1)]
                           [for (pr : Property | p.type->filter(DataType).attribute)]
                              [if (p.type.name = 'Float')]
                     [p.name/]_[pr.name/] : constant Float := Float((Incoming_Body.Get_Long_Float("[p.name/].[pr.name/]")));
                              [elseif (p.type.name = 'Integer')]
                     [p.name/]_[pr.name/] : constant Integer := Integer((Incoming_Body.Get_Integer("[p.name/].[pr.name/]")));
                              [elseif (p.type.name = 'Boolean')]
                     [p.name/]_[pr.name/] : constant Boolean := Boolean((Incoming_Body.Get_Boolean("[p.name/].[pr.name/]")));
                              [elseif (pr.type->filter(Enumeration)->size() = 1)]
                     [p.name/]_[pr.name/] : constant [pr.type.name/] := [pr.type.name/]'Val(Integer((Incoming_Body.Get_Integer("[p.name/].[pr.name/]"))));                              
                              [else]
                     [p.name/]_[pr.name/] : constant [pr.type.name/] := [pr.type.name/]((Incoming_Body.Get_Long_Float("[p.name/].[pr.name/]")));
                              [/if]
                           [/for]
                     [p.name/] : constant [p.type.name/] := ([p.type->filter(DataType).attribute->asSequence()->first().name/] => [p.name/]_[p.type->filter(DataType).attribute->asSequence()->first().name/][for (prop : Property | p.type->filter(DataType).attribute->excluding(p.type->filter(DataType).attribute->asSequence()->first()))],
                                                      [prop.name/] => [p.name/]_[prop.name/][/for]);
                        [/if]
                     [/for]
                  begin
                     if (Has_Payload_CRC) then
                        
                        --Calculating CRC from incoming message                        

                        CRC_lib.Init;
                        -- Updating CRC with values of destination and instance
                        CRC_lib.Update(Destination_Instance);
                        CRC_lib.Update(Instance_Operation_Int);
                        -- Updating CRC with values of operation parameters
                     [for (p : Parameter | op.ownedParameter)]
                        [if (p.type.name = 'Float' or p.type.name = 'Integer' or p.type.name = 'Boolean')]
                        CRC_lib.Update([p.name/]);
   		                [elseif (p.type->filter(Enumeration)->size() = 1)]
                        CRC_lib.Update([p.type/]'Pos([p.name/]));
                        [elseif (p.type->filter(DataType)->size() = 1)]
                           [for (pr : Property | p.type->filter(DataType).attribute)]
                              [if ((pr.type.name = 'Float') or (pr.type.name = 'Integer') or (pr.type.name = 'Boolean')) ]
                        CRC_lib.Update([p.name/].[pr.name/]);
                              [elseif (pr.type->filter(Enumeration)->size() = 1)]
                        CRC_lib.Update([pr.type.name/]'Pos([p.name/].[pr.name/]));                              
                              [else]
                        CRC_lib.Update(Float([p.name/].[pr.name/]));
                              [/if]
                           [/for]
                        [/if]
                     [/for]
                        -- Comparing fetched Payload CRC with calculated CRC
                        declare
                           use type Interfaces.Unsigned_32;
                           Fetched_Payload_CRC : constant Interfaces.Unsigned_32 := Interfaces.Unsigned_32'Value(Incoming_Header.Get_String("Payload_CRC"));
                           Calculated_Payload_CRC: constant Interfaces.Unsigned_32 := CRC_lib.Get_Value;
                        begin
                           Ada.Text_IO.Put_Line("Fetched Payload CRC: " & Incoming_Header.Get_String("Payload_CRC"));
                           Ada.Text_IO.Put_Line("Calculated Payload CRC: " & Interfaces.Unsigned_32'Image(Calculated_Payload_CRC));
                           if (Fetched_Payload_CRC = Calculated_Payload_CRC) then
                              Ada.Text_IO.Put_Line("CRC test passed.");
                           else 
                              Ada.Text_IO.Put_Line("CRC test failed.");
                              Is_Payload_CRC_correct := false;
                           end if;
                        end;
                     end if;
                  
                     if (Is_Sequence_ID_correct and then Is_Payload_CRC_Correct) then
                        Ada.Text_IO.Put_Line("Message correctly received. Calling the requested operation.");
                           [sl.definingFeature.name/]_ptr.[op.name/]([op.ownedParameter->first().name/][for (p: Parameter | op.ownedParameter->excluding(op.ownedParameter->first()))], [p.name/][/for]);
                     else
                        Ada.Text_IO.Put_Line("Message discarded due to failed test");
                     end if;         
                  end;
			      [/if] [comment parameterNumber /]
               [/for] [comment operation/]
               when others =>
                  Ada.Text_IO.Put_Line("Operation not recognized");
            end case;
			[/if]
   		[/let]
	[/for]
[/for]
       when others =>
          Ada.Text_IO.Put_Line("Destination instance not recognized");
      end case;
   end Resolve_Call;

end Remote_Msg_Server;
[/file]
[/if]
[/template]

[query public isSingleNodeSystem(arg0 : Sequence(OclAny), arg1 : String) : Boolean
	= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'isSingleNodeSystem(java.util.List, java.lang.String)', Sequence{arg0, arg1}) /]

[query public getRequiredInterfaceSlotList(arg0 : Sequence(OclAny), arg1 : String) : Sequence(OclAny)
	= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'getRequiredInterfaceSlotList(java.util.List, java.lang.String)', Sequence{arg0, arg1}) /]

[query public getProvidedInterface(arg0 : Port, arg1 : String) : Interface
	= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'getProvidedInterface(org.eclipse.uml2.uml.Port, java.lang.String)', Sequence{arg0, arg1}) /]

[query public getProvidedInterfaceSlotList(arg0 : Sequence(OclAny), arg1 : String) : Sequence(OclAny)
	= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'getProvidedInterfaceSlotList(java.util.List, java.lang.String)', Sequence{arg0, arg1}) /]

[query public getBoundRIslotList(arg0 : Slot, arg1 : Sequence(OclAny)) : Sequence(OclAny)
	= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'getBoundRIslotList(org.eclipse.uml2.uml.Slot, java.util.List)', Sequence{arg0, arg1}) /]

[query public isRemoteCommNecessary(arg0: Sequence(OclAny), arg1 : InstanceSpecification, arg2 : Sequence(OclAny), arg3 : String) : Boolean
	= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'isRemoteCommNecessary(java.util.List, org.eclipse.uml2.uml.InstanceSpecification, java.util.List, java.lang.String)', Sequence{arg0, arg1, arg2, arg3}) /]

[query public isRemoteMsgServerNecessary(arg0: Sequence(OclAny), arg1 : InstanceSpecification, arg2 : Sequence(OclAny), arg3 : Sequence(OclAny), arg4 : String) : Boolean
	= invoke('org.polarsys.chess.codegen.ada.service.UML2Service', 'isRemoteMsgServerNecessary(java.util.List, org.eclipse.uml2.uml.InstanceSpecification, java.util.List, java.util.List, java.lang.String)', Sequence{arg0, arg1, arg2, arg3, arg4}) /]

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