blob: 0dc6f71ab70696b74f95be42f6894ba0992930fb [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 atomicComponentTemplate_sanmodel('http://www.polarsys.org/chess/SAN')/]
[import org::polarsys::chess::mobius::templates::projectFileTemplate_sanmodel /]
[template public atomicComponentTemplate_sanmodel(sanModel : SANModel, componentQN : String)]
[comment @main /]
[let componentName : String = componentQN]
[file (componentName.replaceAll('\\.', '_').concat('.san'), false, 'UTF-8')]
[let globalvars : Set(String) = getEmptyStringSet()]
[let placeX : Integer = 0]
[let placeY : Integer = 75]
[let activityX : Integer = 50]
[let activityY : Integer = 150]
[let attackX : Integer = 100]
[let attackY : Integer = 200]
<?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">[componentName.replaceAll('\\.', '_')/]</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">900</int>
<int id="y">400</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>
[comment] [let atomicBlocks : Sequence(Classifier) = getAtomicBlocks(model)]
[let atomicBlock : Classifier = getBlockFromQN(atomicBlocks, componentQN)]
[if(atomicBlock.getAppliedStereotype(ErrorModelBehaviorQN)->notEmpty())]
[let places : Sequence(State) = getPlaces(atomicBlock)]
[for (place : State | places)][/comment]
[comment places /]
[let nodes : Sequence(Node) = sanModel.getAllNodes()->asSequence()]
[let atomicNode : Node = getNodeFromQN(nodes, componentQN)]
[for (place : Place | atomicNode.oclAsType(AtomicNode).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">[place.name.replaceAll('\\.', '_')/]</string>
<boolean id="ContainsLabel">true</boolean>
<boolean id="IsLabelShown">true</boolean>
</class>
<point id="CenterPoint">
[comment: TODO save X and Y of the normal place/]
<int id="x">[place.x/]</int>
<int id="y">[place.y/]</int>
</point>
</class>
<boolean id="ReadOnly">false</boolean>
<boolean id="ConstantMarking">true</boolean>
<int id="InitialState">[place.initialState/]</int>
</class>
[/for]
[for (outputGate: OutputGate | atomicNode.oclAsType(AtomicNode).outputGate)]
<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">[outputGate.name/]</string>
<boolean id="ContainsLabel">true</boolean>
<boolean id="IsLabelShown">true</boolean>
</class>
<point id="CenterPoint">
<int id="x">[outputGate.x/]</int>
<int id="y">[outputGate.y/]</int>
</point>
</class>
<boolean id="MirrorImage">false</boolean>
<string id="Function">[outputGate.outputFunction/];</string>
</class>
[/for]
[for (timedActivity: TimedActivity | atomicNode.oclAsType(AtomicNode).timedActivity)]
[let timedActivityName : String = timedActivity.name]
<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">[timedActivity.name/]</string>
<boolean id="ContainsLabel">true</boolean>
<boolean id="IsLabelShown">true</boolean>
</class>
<point id="CenterPoint">
<int id="x">[timedActivity.x/]</int>
<int id="y">[timedActivity.y/]</int>
</point>
</class>
</class>
[if(timedActivity.case->isEmpty())]
<int id="NumberOfCases">1</int>
<vector id="CaseDistributions">
<string id="0"></string>
</vector>
[else]
<int id="NumberOfCases">[timedActivity.case->size()/]</int>
<vector id="CaseDistributions">
[for (case : String | timedActivity.case)]
<string id="[i/]">[case/]</string>
[/for]
</vector>
[/if]
</class>
[comment TODO? always Exponential for the moment/]
<class id="Mobius.BaseClasses.Distributions.DistributionFunction">
<int id="ClassVersion">1</int>
<string id="Name">Exponential</string>
<vector id="MetaParameters">
</vector>
<vector id="Parameters">
[if ( timedActivity.rate.oclIsUndefined() or timedActivity.rate.size() = 0)]
[comment global variable/]
[comment addToGlobalVars(timedActivityName.concat('Rate'), globalvars)/]
<string id="0">[timedActivityName/]Rate</string>
[else]
<string id="0">[timedActivity.rate/]</string>
[/if]
</vector>
</class>
<string id="Activation"></string>
<string id="Reactivation"></string>
</class>
[/let]
[/for]
[for (instActivity: InstantaneousActivity | atomicNode.oclAsType(AtomicNode).instantaneousActivity)]
[let instActivityName : String = instActivity.name]
<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">[instActivityName/]</string>
<boolean id="ContainsLabel">true</boolean>
<boolean id="IsLabelShown">true</boolean>
</class>
<point id="CenterPoint">
<int id="x">[instActivity.x/]</int>
<int id="y">[instActivity.y/]</int>
</point>
</class>
</class>
[if(instActivity.case->isEmpty())]
<int id="NumberOfCases">1</int>
<vector id="CaseDistributions">
<string id="0"></string>
</vector>
[else]
<int id="NumberOfCases">[instActivity.case->size()/]</int>
<vector id="CaseDistributions">
[for (case : String | instActivity.case)]
<string id="[i/]">[case/]</string>
[/for]
</vector>
[/if]
</class>
</class>
[/let]
[/for]
[for (sourcePlace : Place | atomicNode.oclAsType(AtomicNode).place)]
[for (activity : Activity | sourcePlace.activity)]
[for (targetPlace : Place | activity.place)]
[comment activity with case = 1/]
<class id="Mobius.BaseClasses.BaseEdgeClass">
<int id="ClassVersion">3</int>
<int id="LineType">0</int>
<string id="StartVertex">[activity.name.replaceAll('\\.', '_')/]</string>
<string id="FinishVertex">[targetPlace.name.replaceAll('\\.', '_')/]</string>
<boolean id="Arrows">true</boolean>
<vector id="PointList">
<point id="0">
<int id="x">[activity.x/]</int>
<int id="y">[activity.y/]</int>
</point>
<point id="1">
<int id="x">[targetPlace.x/]</int>
<int id="y">[targetPlace.y/]</int>
</point>
</vector>
</class>
<class id="Mobius.BaseClasses.BaseEdgeClass">
<int id="ClassVersion">3</int>
<int id="LineType">0</int>
<string id="StartVertex">[sourcePlace.name.replaceAll('\\.', '_')/]</string>
<string id="FinishVertex">[activity.name.replaceAll('\\.', '_')/]</string>
<boolean id="Arrows">true</boolean>
<vector id="PointList">
<point id="0">
<int id="x">[sourcePlace.x/]</int>
<int id="y">[sourcePlace.y/]</int>
</point>
<point id="1">
<int id="x">[activity.x/]</int>
<int id="y">[activity.y/]</int>
</point>
</vector>
</class>
[/for]
[/for]
[/for]
[for (sourcePlace : Place | atomicNode.oclAsType(AtomicNode).place)]
[for (activity : Activity | sourcePlace.activity)]
<class id="Mobius.BaseClasses.BaseEdgeClass">
<int id="ClassVersion">3</int>
<int id="LineType">0</int>
<string id="StartVertex">[sourcePlace.name.replaceAll('\\.', '_')/]</string>
<string id="FinishVertex">[activity.name.replaceAll('\\.', '_')/]</string>
<boolean id="Arrows">true</boolean>
<vector id="PointList">
<point id="0">
<int id="x">[sourcePlace.x/]</int>
<int id="y">[sourcePlace.y/]</int>
</point>
<point id="1">
<int id="x">[activity.x/]</int>
<int id="y">[activity.y/]</int>
</point>
</vector>
</class>
[/for]
[/for]
[comment code for links in case of ActivityPlaceCase, activity's case > 1/]
[for (instActivity: InstantaneousActivity | atomicNode.oclAsType(AtomicNode).instantaneousActivity)]
[for (placecase : SAN::ActivityPlaceCase | instActivity.placecase)]
[for (targetPlace : SAN::Primitive | placecase.place)]
<class id="Mobius.BaseClasses.BaseEdgeClass">
<int id="ClassVersion">3</int>
<int id="LineType">0</int>
<string id="StartVertex">[instActivity.name.replaceAll('\\.', '_')/]</string>
<string id="FinishVertex">[targetPlace.name.replaceAll('\\.', '_')/]</string>
<boolean id="Arrows">true</boolean>
<vector id="PointList">
<point id="0">
<int id="x">[placecase.x/]</int>
<int id="y">[placecase.y/]</int>
</point>
<point id="1">
<int id="x">[targetPlace.x/]</int>
<int id="y">[targetPlace.y/]</int>
</point>
</vector>
</class>
[/for]
[/for]
[/for]
[for (timedActivity: TimedActivity | atomicNode.oclAsType(AtomicNode).timedActivity)]
[for (placecase : SAN::ActivityPlaceCase | timedActivity.placecase)]
[for (targetPlace : SAN::Primitive | placecase.place)]
<class id="Mobius.BaseClasses.BaseEdgeClass">
<int id="ClassVersion">3</int>
<int id="LineType">0</int>
<string id="StartVertex">[timedActivity.name.replaceAll('\\.', '_')/]</string>
<string id="FinishVertex">[targetPlace.name.replaceAll('\\.', '_')/]</string>
<boolean id="Arrows">true</boolean>
<vector id="PointList">
<point id="0">
<int id="x">[placecase.x/]</int>
<int id="y">[placecase.y/]</int>
</point>
<point id="1">
<int id="x">[targetPlace.x/]</int>
<int id="y">[targetPlace.y/]</int>
</point>
</vector>
</class>
[/for]
[/for]
[/for]
[comment end code for links in case of ActivityPlaceCase, activity's case > 1/]
[for (inputGate: InputGate | atomicNode.oclAsType(AtomicNode).inputGate)]
<class id="Mobius.AtomicModels.San.InputGatePanelObject">
<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">[inputGate.name/]</string>
<boolean id="ContainsLabel">true</boolean>
<boolean id="IsLabelShown">true</boolean>
</class>
<point id="CenterPoint">
<int id="x">[inputGate.x/]</int>
<int id="y">[inputGate.y/]</int>
</point>
</class>
<boolean id="MirrorImage">false</boolean>
<string id="Predicate">
[comment predicate and function/]
[inputGate.inputPredicated/];
</string>
<string id="Function">[inputGate.inputFunction/];</string>
</class>
[/for]
[comment TODO WIP: for each attack success:
add one place for attack_success,
add one place for attack_confirmed,
add an input attack_gate,
connect attack_success with attack_gate,
connect OK(normal state) with attack_gate,
connect attack_confirmed with attack_gate,
connect attack_confirmed with instActivityName/]
[for (sourcePlace : Place | atomicNode.oclAsType(AtomicNode).place)]
[for (gate : InputGate | sourcePlace.inputGate)]
<class id="Mobius.BaseClasses.BaseEdgeClass">
<int id="ClassVersion">3</int>
<int id="LineType">0</int>
<string id="StartVertex">[sourcePlace.name/]</string>
<string id="FinishVertex">[gate.name/]</string>
<boolean id="Arrows">false</boolean>
<vector id="PointList">
<point id="0">
<int id="x">[sourcePlace.x/]</int>
<int id="y">[sourcePlace.y /]</int>
</point>
<point id="1">
<int id="x">[gate.x/]</int>
<int id="y">[gate.y/]</int>
</point>
</vector>
</class>
[/for]
[/for]
[for (timedActivity: TimedActivity | atomicNode.oclAsType(AtomicNode).timedActivity)]
[for (outgate : SAN::OutputGate | timedActivity.outputGate)]
<class id="Mobius.BaseClasses.BaseEdgeClass">
<int id="ClassVersion">3</int>
<int id="LineType">0</int>
<string id="StartVertex">[timedActivity.name.replaceAll('\\.', '_')/]</string>
<string id="FinishVertex">[outgate.name/]</string>
<boolean id="Arrows">false</boolean>
<vector id="PointList">
<point id="0">
<int id="x">[timedActivity.x/]</int>
<int id="y">[timedActivity.y/]</int>
</point>
<point id="1">
<int id="x">[outgate.x/]</int>
<int id="y">[outgate.y/]/</int>
</point>
</vector>
</class>
[/for]
[/for]
[for (instantActivity: InstantaneousActivity | atomicNode.oclAsType(AtomicNode).instantaneousActivity)]
[for (outgate : SAN::OutputGate | instantActivity.outputGate)]
<class id="Mobius.BaseClasses.BaseEdgeClass">
<int id="ClassVersion">3</int>
<int id="LineType">0</int>
<string id="StartVertex">[instantActivity.name.replaceAll('\\.', '_')/]</string>
<string id="FinishVertex">[outgate.name/]</string>
<boolean id="Arrows">false</boolean>
<vector id="PointList">
<point id="0">
<int id="x">[instantActivity.x/]</int>
<int id="y">[instantActivity.y/]</int>
</point>
<point id="1">
<int id="x">[outgate.x/]</int>
<int id="y">[outgate.y/]/</int>
</point>
</vector>
</class>
[/for]
[/for]
</class>
<vector id="LocalGlobalNamesList">
[for (globalvar : String | globalvars)]
<string id="[i/]">[globalvar/]</string>
[/for]
[for (globVar : SAN::GlobalVariable | atomicNode.oclAsType(AtomicNode).globalVariable)]
<string id="[i/]">[globVar.name/]</string>
[/for]
</vector>
<vector id="LocalGlobalTypesList">
[for (globalvar : String | globalvars)]
<string id="[i/]">double</string>
[/for]
[for (globVar : SAN::GlobalVariable | atomicNode.oclAsType(AtomicNode).globalVariable)]
<string id="[i/]">[globVar.type/]</string>
[/for]
[/let] [comment atomic node/]
[/let]
</vector>
<boolean id="DisplayToolTips">true</boolean>
</class>
</class>
<boolean id="Valid">true</boolean>
</class>
</class>
[/let]
[/let]
[/let]
[/let]
[/let]
[/let]
[/let]
[/file]
[/let]
[/template]
[query public getOkX(ctx : OclAny) : Integer =
invoke('org.polarsys.chess.mobius.utils.TransformationUtil', 'getOkX()', Sequence{})/]
[query public getOkY(ctx : OclAny) : Integer =
invoke('org.polarsys.chess.mobius.utils.TransformationUtil', 'getOkY()', Sequence{})/]
[query public setOkX(okX : Integer) : OclAny =
invoke('org.polarsys.chess.mobius.utils.TransformationUtil', 'setOkX(java.lang.Integer)', Sequence{okX})/]
[query public setOkY(okY : Integer) : OclAny =
invoke('org.polarsys.chess.mobius.utils.TransformationUtil', 'setOkY(java.lang.Integer)', Sequence{okY})/]
[query public getNodeFromQN(blocks : Sequence(Node), qualifiedName : String) : Node =
invoke('org.polarsys.chess.mobius.utils.TransformationUtil', 'getNodeFromQN(java.util.List, java.lang.String)', Sequence{blocks, qualifiedName})/]