| [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 AttackScenarioTemplate('http://www.eclipse.org/uml2/3.0.0/UML')/] |
| [import org::polarsys::chess::mobius::templates::projectFileTemplate /] |
| [import org::polarsys::chess::mobius::templates::SingleAttackTemplate /] |
| [import org::polarsys::chess::mobius::templates::AltFragmentTemplate /] |
| [import org::polarsys::chess::mobius::templates::OptFragmentTemplate /] |
| [import org::polarsys::chess::mobius::templates::LoopFragmentTemplate /] |
| [import org::polarsys::chess::mobius::templates::DelayTemplate /] |
| |
| [template public AttackScenarioTemplate(model : Model, scenarioQN : String)] |
| [comment @main /] |
| [let scenarioName : String = getNameFromQN(scenarioQN)] |
| [file (scenarioName.concat('.san'), false, 'UTF-8')] |
| [let globalvars : Set(String) = getEmptyStringSet()] |
| [let x : Integer = 50] |
| [let y : Integer = 100] |
| [comment the first part is the "start" attack fragment /] |
| <?xml version="1.0" encoding="ISO-8859-1"?> |
| <class id="Mobius.AtomicModels.San.SanInterface"> |
| <int id="ClassVersion">1</int> |
| <class id="Mobius.BaseClasses.BaseInterfaceClass"> |
| <int id="ClassVersion">3</int> |
| <string id="ModelName">[scenarioName/]</string> |
| <class id="Mobius.AtomicModels.San.SanInfoClass"> |
| <int id="ClassVersion">5</int> |
| <class id="Mobius.BaseClasses.BaseInfoClass"> |
| <int id="ClassVersion">2</int> |
| </class> |
| <class id="Mobius.AtomicModels.San.SanTypeManager"> |
| <int id="ClassVersion">1</int> |
| <int id="typeListModelSize">0</int> |
| </class> |
| <string id="CustomInitialization"></string> |
| </class> |
| <class id="Mobius.AtomicModels.San.SanEditor"> |
| <int id="ClassVersion">3</int> |
| <class id="Mobius.BaseClasses.BaseEditorClass"> |
| <int id="ClassVersion">3</int> |
| <boolean id="HasPanel">true</boolean> |
| <class id="Mobius.BaseClasses.BasePanelClass"> |
| <int id="ClassVersion">2</int> |
| <point id="Size of Panel"> |
| <int id="x">1000</int> |
| <int id="y">1000</int> |
| </point> |
| <double id="ZoomFactor">1.0</double> |
| <boolean id="ShowGridEnabled">true</boolean> |
| <int id="ShowGridStep">10</int> |
| <boolean id="SnapGridEnabled">true</boolean> |
| <int id="SnapGridStep">10</int> |
| <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">Idle</string> |
| <boolean id="ContainsLabel">true</boolean> |
| <boolean id="IsLabelShown">true</boolean> |
| </class> |
| <point id="CenterPoint"> |
| <int id="x">[x/]</int> |
| <int id="y">[y/]</int> |
| </point> |
| </class> |
| <boolean id="ReadOnly">false</boolean> |
| <boolean id="ConstantMarking">true</boolean> |
| <int id="InitialState">1</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">[scenarioName/]Attempted</string> |
| <boolean id="ContainsLabel">true</boolean> |
| <boolean id="IsLabelShown">true</boolean> |
| </class> |
| <point id="CenterPoint"> |
| <int id="x">[x + 300/]</int> |
| <int id="y">[y/]</int> |
| </point> |
| </class> |
| <boolean id="ReadOnly">false</boolean> |
| <boolean id="ConstantMarking">true</boolean> |
| <int id="InitialState">0</int> |
| </class> |
| [comment the "launched" place is the end/] |
| <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">[scenarioName/]Launched</string>[setStartPlace(scenarioName.concat('Launched'))/] |
| <boolean id="ContainsLabel">true</boolean> |
| <boolean id="IsLabelShown">true</boolean> |
| </class> |
| <point id="CenterPoint"> |
| <int id="x">[x + 600/]</int>[setStartX(x+600)/] |
| <int id="y">[y - 50/]</int>[setStartY(y+50)/] |
| </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">[scenarioName/]Blocked</string> |
| <boolean id="ContainsLabel">true</boolean> |
| <boolean id="IsLabelShown">true</boolean> |
| </class> |
| <point id="CenterPoint"> |
| <int id="x">[x + 600/]</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.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">[scenarioName/]OutputGate</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> |
| <boolean id="MirrorImage">false</boolean> |
| <string id="Function"> |
| Idle->Mark() = 1;\t// Implies continuous attacks with giv |
| en intensity; |
| </string> |
| </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">[scenarioName/]_AttackActivity</string> |
| <boolean id="ContainsLabel">true</boolean> |
| <boolean id="IsLabelShown">true</boolean> |
| </class> |
| <point id="CenterPoint"> |
| <int id="x">[x + 150/]</int> |
| <int id="y">[y/]</int> |
| </point> |
| </class> |
| </class> |
| <int id="NumberOfCases">1</int> |
| <vector id="CaseDistributions"> |
| <string id="0"></string> |
| </vector> |
| </class> |
| <class id="Mobius.BaseClasses.Distributions.DistributionFunction"> |
| <int id="ClassVersion">1</int> |
| <string id="Name">Exponential</string> |
| <vector id="MetaParameters"> |
| </vector> |
| <vector id="Parameters"> |
| [let attack_scenario_freq : String = getAttackScenarioFrequency(model, scenarioName)] |
| [if (attack_scenario_freq.size() = 0)] |
| <string id="0">return([scenarioName/]_intensity);</string>[addToGlobalVars(scenarioName.concat('_intensity'), globalvars)/] |
| [else] |
| <string id="0">return([attack_scenario_freq/]);</string> |
| [/if] |
| [/let] |
| </vector> |
| </class> |
| <string id="Activation"></string> |
| <string id="Reactivation"></string> |
| </class> |
| <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">[scenarioName/]_BlockActivity</string> |
| <boolean id="ContainsLabel">true</boolean> |
| <boolean id="IsLabelShown">true</boolean> |
| </class> |
| <point id="CenterPoint"> |
| <int id="x">[x + 450/]</int> |
| <int id="y">[y/]</int> |
| </point> |
| </class> |
| </class> |
| <int id="NumberOfCases">2</int> |
| <vector id="CaseDistributions"> |
| [let attack_scenario_prob : String = getAttackScenarioProbSuccess(model, scenarioName)] |
| [if (attack_scenario_prob.size() = 0)] |
| <string id="0">return([scenarioName/]_succ_prob);</string> |
| <string id="1">return(1.0 - [scenarioName/]_succ_prob);\t\t// Attacked blocked.</string>[addToGlobalVars(scenarioName.concat('_succ_prob'), globalvars)/] |
| [else] |
| <string id="0">return([attack_scenario_prob/]);</string> |
| <string id="1">return([getAttackScenarioProbUnsuccess(model, attack_scenario_prob)/]);\t\t// Attacked blocked.</string> |
| [/if] |
| [/let] |
| </vector> |
| </class> |
| </class> |
| <class id="Mobius.BaseClasses.BaseEdgeClass"> |
| <int id="ClassVersion">3</int> |
| <int id="LineType">0</int> |
| <string id="StartVertex">[scenarioName/]_AttackActivity</string> |
| <string id="FinishVertex">[scenarioName/]Attempted</string> |
| <boolean id="Arrows">true</boolean> |
| <vector id="PointList"> |
| <point id="0"> |
| <int id="x">[x+150/]</int> |
| <int id="y">[y/]</int> |
| </point> |
| <point id="1"> |
| <int id="x">[x+300/]</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">[scenarioName/]_BlockActivity</string> |
| <string id="FinishVertex">[scenarioName/]Launched</string> |
| <boolean id="Arrows">true</boolean> |
| <vector id="PointList"> |
| <point id="0"> |
| <int id="x">[x+450/]</int> |
| <int id="y">[y-15/]</int> |
| </point> |
| <point id="1"> |
| <int id="x">[x+600/]</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">[scenarioName/]_BlockActivity</string> |
| <string id="FinishVertex">[scenarioName/]Blocked</string> |
| <boolean id="Arrows">true</boolean> |
| <vector id="PointList"> |
| <point id="0"> |
| <int id="x">[x+450/]</int> |
| <int id="y">[y/]</int> |
| </point> |
| <point id="1"> |
| <int id="x">[x+600/]</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">[scenarioName/]_AttackActivity</string> |
| <string id="FinishVertex">[scenarioName/]OutputGate</string> |
| <boolean id="Arrows">false</boolean> |
| <vector id="PointList"> |
| <point id="0"> |
| <int id="x">[x+150/]</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">Idle</string> |
| <string id="FinishVertex">[scenarioName/]_AttackActivity</string> |
| <boolean id="Arrows">true</boolean> |
| <vector id="PointList"> |
| <point id="0"> |
| <int id="x">[x/]</int> |
| <int id="y">[y/]</int> |
| </point> |
| <point id="1"> |
| <int id="x">[x+150/]</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">[scenarioName/]Attempted</string> |
| <string id="FinishVertex">[scenarioName/]_BlockActivity</string> |
| <boolean id="Arrows">true</boolean> |
| <vector id="PointList"> |
| <point id="0"> |
| <int id="x">[x+300/]</int> |
| <int id="y">[y/]</int> |
| </point> |
| <point id="1"> |
| <int id="x">[x+450/]</int> |
| <int id="y">[y/]</int> |
| </point> |
| </vector> |
| </class> |
| [comment now read the ordered list of element and generate the fragments accordingly /] |
| [let scenario : Interaction = getScenario(model, scenarioName)] |
| [let orderedList : Sequence(NamedElement) = getOrderedAttacksAndFragments(scenario)] |
| [for (elem : NamedElement | orderedList)] |
| [comment compute current start place x and y/] |
| [let startPlace : String = getStartPlace()] |
| [let startX : Integer = getStartX()] |
| [let startY : Integer = getStartY()] |
| [comment a Message -> single attack /] |
| [if (elem.oclIsTypeOf(Message))] |
| [SingleAttackTemplate(elem.oclAsType(Message), i, globalvars, startPlace, startX, startY)/] |
| [/if] |
| [comment a CombinedFragment -> alt/opt/loop fragment /] |
| [if (elem.oclIsTypeOf(CombinedFragment))] |
| [let combFrag : CombinedFragment = elem.oclAsType(CombinedFragment)] |
| [let operator : String = combFrag.interactionOperator.toString()] |
| [if (operator.equalsIgnoreCase('alt'))] |
| [AltFragmentTemplate(combFrag, i, globalvars, startPlace, startX, startY)/] |
| [elseif (operator.equalsIgnoreCase('opt'))] |
| [OptFragmentTemplate(combFrag, i, globalvars, startPlace, startX, startY)/] |
| [elseif (operator.equalsIgnoreCase('loop'))] |
| [LoopFragmentTemplate(combFrag, i, globalvars, startPlace, startX, startY)/] |
| [/if] |
| [/let] |
| [/let] |
| [/if] |
| [comment a DurationConstraint -> delay /] |
| [if (elem.oclIsTypeOf(DurationConstraint))] |
| [DelayTemplate(elem.oclAsType(DurationConstraint), i, globalvars, startPlace, startX, startY)/] |
| [/if] |
| [/let] |
| [/let] |
| [/let] |
| [/for] |
| [/let] |
| [/let] |
| </class> |
| <vector id="LocalGlobalNamesList"> |
| [for (globalvar : String | globalvars)] |
| <string id="[i-1/]">[globalvar/]</string> |
| [/for] |
| </vector> |
| <vector id="LocalGlobalTypesList"> |
| [for (globalvar : String | globalvars)] |
| <string id="[i-1/]">[getVarType(model, globalvar)/]</string> |
| [/for] |
| </vector> |
| <boolean id="DisplayToolTips">true</boolean> |
| </class> |
| </class> |
| <boolean id="Valid">true</boolean> |
| </class> |
| </class> |
| [/let] |
| [/let] |
| [/let] |
| [/file] |
| [/let] |
| [/template] |
| |
| [query public getPlaces(block : Classifier) : Sequence(State) = |
| invoke('org.polarsys.chess.mobius.utils.TransformationUtil', 'getPlaces(org.eclipse.uml2.uml.Classifier)', Sequence{block})/] |
| |
| [query public getActivities(block : Classifier) : Sequence(Transition) = |
| invoke('org.polarsys.chess.mobius.utils.TransformationUtil', 'getActivities(org.eclipse.uml2.uml.Classifier)', Sequence{block})/] |
| |
| [query public getActivityName(tr : Transition) : String = tr.source.name + '__' + tr.target.name/] |
| |
| [query public getRate(tr : Transition) : String = |
| invoke('org.polarsys.chess.mobius.utils.TransformationUtil', 'getRate(org.eclipse.uml2.uml.Transition)', Sequence{tr})/] |
| |
| [query public getScenario(model : Model, scenarioName : String) : Interaction = |
| invoke('org.polarsys.chess.mobius.utils.TransformationUtil', 'getScenario(org.eclipse.uml2.uml.Model, java.lang.String)', Sequence{model, scenarioName})/] |
| |
| [query public getOrderedAttacksAndFragments(scenario : Interaction) : Sequence(NamedElement) = |
| invoke('org.polarsys.chess.mobius.utils.TransformationUtil', 'getOrderedAttacksAndFragments(org.eclipse.uml2.uml.Interaction)', Sequence{scenario})/] |
| |
| [query public addToCurrentAlt(attack : Message) : String = |
| invoke('org.polarsys.chess.mobius.utils.TransformationUtil', 'addToCurrentAlt(org.eclipse.uml2.uml.Message)', Sequence{attack})/] |
| |
| [query public clearCurrentAlt(ctx : OclAny) : String = |
| invoke('org.polarsys.chess.mobius.utils.TransformationUtil', 'clearCurrentAlt()', Sequence{})/] |
| |
| [query public isCurrentAltEmpty(ctx : OclAny) : Boolean = |
| invoke('org.polarsys.chess.mobius.utils.TransformationUtil', 'isCurrentAltEmpty()', Sequence{})/] |
| |
| [query public getAttackScenarioFrequency(model : Model, scenarioName : String) : String = |
| invoke('org.polarsys.chess.mobius.utils.TransformationUtil', 'getAttackScenarioFrequency(org.eclipse.uml2.uml.Model, java.lang.String)', Sequence{model, scenarioName})/] |
| |
| [query public getAttackScenarioProbSuccess(model : Model, scenarioName : String) : String = |
| invoke('org.polarsys.chess.mobius.utils.TransformationUtil', 'getAttackScenarioProbSuccess(org.eclipse.uml2.uml.Model, java.lang.String)', Sequence{model, scenarioName})/] |
| |
| [query public getAttackScenarioProbUnsuccess(model : Model, probSuccess : String) : String = |
| invoke('org.polarsys.chess.mobius.utils.TransformationUtil', 'getAttackScenarioProbUnsuccess(org.eclipse.uml2.uml.Model, java.lang.String)', Sequence{model, probSuccess})/] |
| |
| [query public getVarType(model : Model, globalvar : String) : String = |
| invoke('org.polarsys.chess.mobius.utils.TransformationUtil', 'getVarType(org.eclipse.uml2.uml.Model, java.lang.String)', Sequence{model, globalvar})/] |