blob: 48b7120ddbcf9a4e4c79d190fd71436f8262a123 [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 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-&gt;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})/]