blob: 261c7028c97da79cd07dec1e331328fe19b45c8c [file] [log] [blame]
[comment
/*********************************************************************
* Copyright (c) 2019 Intecs Solutions SpA
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Intecs Solutions - Initial API and implementation
*
**********************************************************************/
/]
[comment encoding = UTF-8 /]
[module LoopFragmentTemplate('http://www.eclipse.org/uml2/3.0.0/UML')/]
[import org::polarsys::chess::mobius::templates::projectFileTemplate /]
[import org::polarsys::chess::mobius::templates::AltFragmentTemplate /]
[template public LoopFragmentTemplate(combFrag : CombinedFragment, index : Integer, globalvars : Set(String), startPlace : String, startX : Integer, startY : Integer)]
[let loopFragmentName : String = combFrag.name]
[let operand : InteractionOperand = combFrag.operand->first()]
[let attack : Message = getOperandAttack(operand)]
[let x : Integer = 50]
[let y : Integer = 300*index]
[comment places, activities and gates /]
<class id="Mobius.AtomicModels.San.InstantaneousActivityPanelObject">
<int id="ClassVersion">1</int>
<class id="Mobius.AtomicModels.San.ActivityPanelObject">
<int id="ClassVersion">1</int>
<class id="Mobius.BaseClasses.ExtendedBaseVertexClass">
<int id="ClassVersion">1</int>
<class id="Mobius.BaseClasses.BaseVertexClass">
<int id="ClassVersion">3</int>
<class id="Mobius.BaseClasses.BasePanelObjectClass">
<int id="ClassVersion">5</int>
<string id="Name">SetUp[loopFragmentName/]</string>
<boolean id="ContainsLabel">true</boolean>
<boolean id="IsLabelShown">true</boolean>
</class>
<point id="CenterPoint">
<int id="x">[x+200/]</int>
<int id="y">[y/]</int>
</point>
</class>
</class>
<int id="NumberOfCases">1</int>
<vector id="CaseDistributions">
<string id="0"></string>
</vector>
</class>
</class>
<class id="Mobius.AtomicModels.San.OutputGatePanelObject">
<int id="ClassVersion">1</int>
<class id="Mobius.BaseClasses.BaseVertexClass">
<int id="ClassVersion">3</int>
<class id="Mobius.BaseClasses.BasePanelObjectClass">
<int id="ClassVersion">5</int>
<string id="Name">[loopFragmentName/]SetCounter</string>
<boolean id="ContainsLabel">true</boolean>
<boolean id="IsLabelShown">true</boolean>
</class>
<point id="CenterPoint">
<int id="x">[x+250/]</int>
<int id="y">[y-50/]</int>
</point>
</class>
[let counter : String = getLoopCounter(operand)]
<boolean id="MirrorImage">false</boolean>[addToGlobalVars(counter, globalvars)/]
<string id="Function">[loopFragmentName/]Counter-&gt;Mark() = [counter/];</string>
[/let]
</class>
<class id="Mobius.AtomicModels.San.PlacePanelObject">
<int id="ClassVersion">1</int>
<class id="Mobius.BaseClasses.BaseVertexClass">
<int id="ClassVersion">3</int>
<class id="Mobius.BaseClasses.BasePanelObjectClass">
<int id="ClassVersion">5</int>
<string id="Name">[loopFragmentName/]Counter</string>
<boolean id="ContainsLabel">true</boolean>
<boolean id="IsLabelShown">true</boolean>
</class>
<point id="CenterPoint">
<int id="x">[x+475/]</int>
<int id="y">[y-50/]</int>
</point>
</class>
<boolean id="ReadOnly">false</boolean>
<boolean id="ConstantMarking">true</boolean>
<int id="InitialState">0</int>
</class>
<class id="Mobius.AtomicModels.San.PlacePanelObject">
<int id="ClassVersion">1</int>
<class id="Mobius.BaseClasses.BaseVertexClass">
<int id="ClassVersion">3</int>
<class id="Mobius.BaseClasses.BasePanelObjectClass">
<int id="ClassVersion">5</int>
<string id="Name">[loopFragmentName/]_loop</string>
<boolean id="ContainsLabel">true</boolean>
<boolean id="IsLabelShown">true</boolean>
</class>
<point id="CenterPoint">
<int id="x">[x+350/]</int>
<int id="y">[y/]</int>
</point>
</class>
<boolean id="ReadOnly">false</boolean>
<boolean id="ConstantMarking">true</boolean>
<int id="InitialState">0</int>
</class>
<class id="Mobius.AtomicModels.San.TimedActivityPanelObject">
<int id="ClassVersion">2</int>
<class id="Mobius.AtomicModels.San.ActivityPanelObject">
<int id="ClassVersion">1</int>
<class id="Mobius.BaseClasses.ExtendedBaseVertexClass">
<int id="ClassVersion">1</int>
<class id="Mobius.BaseClasses.BaseVertexClass">
<int id="ClassVersion">3</int>
<class id="Mobius.BaseClasses.BasePanelObjectClass">
<int id="ClassVersion">5</int>
<string id="Name">[loopFragmentName/]_loop_delay</string>
<boolean id="ContainsLabel">true</boolean>
<boolean id="IsLabelShown">true</boolean>
</class>
<point id="CenterPoint">
<int id="x">[x+525/]</int>
<int id="y">[y/]</int>
</point>
</class>
</class>
[comment TODO: is it possible to model success prob?/]
<int id="NumberOfCases">2</int>
<vector id="CaseDistributions">
<string id="0">return([attack.name/]_success_prob);\t// Attack succeeds</string>
<string id="1">return(1.0 - [attack.name/]_success_prob);\t// Attack fails</string>
</vector>[addToGlobalVars(attack.name.concat('_success_prob'), globalvars)/]
</class>
<class id="Mobius.BaseClasses.Distributions.DistributionFunction">
<int id="ClassVersion">1</int>
<string id="Name">Exponential</string>
<vector id="MetaParameters">
</vector>
<vector id="Parameters">
<string id="0">return([loopFragmentName/]_attack_delay);</string>
</vector>[addToGlobalVars(loopFragmentName.concat('_attack_delay'), globalvars)/]
</class>
<string id="Activation"></string>
<string id="Reactivation"></string>
</class>
[comment this is the end place /]
<class id="Mobius.AtomicModels.San.PlacePanelObject">
<int id="ClassVersion">1</int>
<class id="Mobius.BaseClasses.BaseVertexClass">
<int id="ClassVersion">3</int>
<class id="Mobius.BaseClasses.BasePanelObjectClass">
<int id="ClassVersion">5</int>
<string id="Name">End[loopFragmentName/]</string>[setStartPlace('End'.concat(loopFragmentName))/]
<boolean id="ContainsLabel">true</boolean>
<boolean id="IsLabelShown">true</boolean>
</class>
<point id="CenterPoint">
<int id="x">[x+800/]</int>[setStartX(x+800)/]
<int id="y">[y/]</int>[setStartY(y)/]
</point>
</class>
<boolean id="ReadOnly">false</boolean>
<boolean id="ConstantMarking">true</boolean>
<int id="InitialState">0</int>
</class>
<class id="Mobius.AtomicModels.San.OutputGatePanelObject">
<int id="ClassVersion">1</int>
<class id="Mobius.BaseClasses.BaseVertexClass">
<int id="ClassVersion">3</int>
<class id="Mobius.BaseClasses.BasePanelObjectClass">
<int id="ClassVersion">5</int>
<string id="Name">[loopFragmentName/]_success</string>
<boolean id="ContainsLabel">true</boolean>
<boolean id="IsLabelShown">true</boolean>
</class>
<point id="CenterPoint">
<int id="x">[x+675/]</int>
<int id="y">[y-25/]</int>
</point>
</class>
<boolean id="MirrorImage">false</boolean>
<string id="Function">
[loopFragmentName/]Counter-&gt;Mark()--;\nif([loopFragmentName/]Counter-&gt;Mark() &gt; 0)
\n {\n [attack.name/]_success-&gt;Mark()++;\t// Add an attack.
This place may be shared among many instances.\n\t\t\t\t\t
// The token will be taken by one of the instances:
they will compete for the token.\n [loopFragmentName/]_loop-&gt;Mar
k() = 1;\t// Continue with the loop\n }\nelse\n End[loopFragmentName/]
-&gt;Mark() = 1;\t// Exit from the loop
</string>
</class>
<class id="Mobius.AtomicModels.San.OutputGatePanelObject">
<int id="ClassVersion">1</int>
<class id="Mobius.BaseClasses.BaseVertexClass">
<int id="ClassVersion">3</int>
<class id="Mobius.BaseClasses.BasePanelObjectClass">
<int id="ClassVersion">5</int>
<string id="Name">[loopFragmentName/]_blocked</string>
<boolean id="ContainsLabel">true</boolean>
<boolean id="IsLabelShown">true</boolean>
</class>
<point id="CenterPoint">
<int id="x">[x+675/]</int>
<int id="y">[y+25/]</int>
</point>
</class>
<boolean id="MirrorImage">false</boolean>
<string id="Function">
[loopFragmentName/]Counter-&gt;Mark()--;\nif([loopFragmentName/]Counter-&gt;Mark() &gt; 0)
\n {\n// This is the branch which corresponds to unsuccessf
ul attacks on component.\n// Hence no token is added to att
ack place \n [loopFragmentName/]_loop-&gt;Mark() = 1;\t// Continue
with the loop\n }\nelse\n End[loopFragmentName/]-&gt;Mark() = 1;\t/
/ Exit from the loop
</string>
</class>
<class id="Mobius.AtomicModels.San.PlacePanelObject">
<int id="ClassVersion">1</int>
<class id="Mobius.BaseClasses.BaseVertexClass">
<int id="ClassVersion">3</int>
<class id="Mobius.BaseClasses.BasePanelObjectClass">
<int id="ClassVersion">5</int>
<string id="Name">[attack.name/]_success</string>
<boolean id="ContainsLabel">true</boolean>
<boolean id="IsLabelShown">true</boolean>
</class>
<point id="CenterPoint">
<int id="x">[x+800/]</int>
<int id="y">[y-50/]</int>
</point>
</class>
<boolean id="ReadOnly">false</boolean>
<boolean id="ConstantMarking">true</boolean>
<int id="InitialState">0</int>
</class>
[comment edges /]
<class id="Mobius.BaseClasses.BaseEdgeClass">
<int id="ClassVersion">3</int>
<int id="LineType">0</int>
<string id="StartVertex">SetUp[loopFragmentName/]</string>
<string id="FinishVertex">[loopFragmentName/]SetCounter</string>
<boolean id="Arrows">false</boolean>
<vector id="PointList">
<point id="0">
<int id="x">[x+200/]</int>
<int id="y">[y/]</int>
</point>
<point id="1">
<int id="x">[x+250/]</int>
<int id="y">[y-50/]</int>
</point>
</vector>
</class>
<class id="Mobius.BaseClasses.BaseEdgeClass">
<int id="ClassVersion">3</int>
<int id="LineType">0</int>
<string id="StartVertex">SetUp[loopFragmentName/]</string>
<string id="FinishVertex">[loopFragmentName/]_loop</string>
<boolean id="Arrows">true</boolean>
<vector id="PointList">
<point id="0">
<int id="x">[x+200/]</int>
<int id="y">[y/]</int>
</point>
<point id="1">
<int id="x">[x+350/]</int>
<int id="y">[y/]</int>
</point>
</vector>
</class>
<class id="Mobius.BaseClasses.BaseEdgeClass">
<int id="ClassVersion">3</int>
<int id="LineType">0</int>
<string id="StartVertex">[loopFragmentName/]_loop</string>
<string id="FinishVertex">[loopFragmentName/]_loop_delay</string>
<boolean id="Arrows">true</boolean>
<vector id="PointList">
<point id="0">
<int id="x">[x+350/]</int>
<int id="y">[y/]</int>
</point>
<point id="1">
<int id="x">[x+525/]</int>
<int id="y">[y/]</int>
</point>
</vector>
</class>
<class id="Mobius.BaseClasses.BaseEdgeClass">
<int id="ClassVersion">3</int>
<int id="LineType">0</int>
<string id="StartVertex">[loopFragmentName/]_loop_delay</string>
<string id="FinishVertex">[loopFragmentName/]_success</string>
<boolean id="Arrows">false</boolean>
<vector id="PointList">
<point id="0">
<int id="x">[x+525/]</int>
<int id="y">[y-15/]</int>
</point>
<point id="1">
<int id="x">[x+675/]</int>
<int id="y">[y+25/]</int>
</point>
</vector>
</class>
<class id="Mobius.BaseClasses.BaseEdgeClass">
<int id="ClassVersion">3</int>
<int id="LineType">0</int>
<string id="StartVertex">[loopFragmentName/]_loop_delay</string>
<string id="FinishVertex">[loopFragmentName/]_blocked</string>
<boolean id="Arrows">false</boolean>
<vector id="PointList">
<point id="0">
<int id="x">[x+525/]</int>
<int id="y">[y/]</int>
</point>
<point id="1">
<int id="x">[x+675/]</int>
<int id="y">[y+25/]</int>
</point>
</vector>
</class>
[comment: start place is previous fragment end place/]
<class id="Mobius.BaseClasses.BaseEdgeClass">
<int id="ClassVersion">3</int>
<int id="LineType">0</int>
<string id="StartVertex">[startPlace/]</string>
<string id="FinishVertex">SetUp[loopFragmentName/]</string>
<boolean id="Arrows">true</boolean>
<vector id="PointList">
<point id="0">
<int id="x">[startX/]</int>
<int id="y">[startY/]</int>
</point>
<point id="1">
<int id="x">[x+200/]</int>
<int id="y">[y/]</int>
</point>
</vector>
</class>
[/let]
[/let]
[/let]
[/let]
[/let]
[/template]
[query public getLoopCounter(operand : InteractionOperand) : String =
invoke('org.polarsys.chess.mobius.utils.TransformationUtil', 'getLoopCounter(org.eclipse.uml2.uml.InteractionOperand)', Sequence{operand})/]