| [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->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->Mark()--;\nif([loopFragmentName/]Counter->Mark() > 0) |
| \n {\n [attack.name/]_success->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->Mar |
| k() = 1;\t// Continue with the loop\n }\nelse\n End[loopFragmentName/] |
| ->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->Mark()--;\nif([loopFragmentName/]Counter->Mark() > 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->Mark() = 1;\t// Continue |
| with the loop\n }\nelse\n End[loopFragmentName/]->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})/] |