<
From version < 13.1 >
edited by Alexander Schulz-Rosengarten
on 2014/01/23 11:36
To version < 11.1 >
edited by Alexander Schulz-Rosengarten
on 2014/01/10 11:28
>
Change comment: update according to metamodel changes

Summary

Details

Page properties
Content
... ... @@ -70,36 +70,29 @@
70 70  
71 71  == Example ==
72 72  
73 -In this example we will perform some transformations on SCCharts.
74 -
75 -The source chart is a ABO, the "Hello World" of SCCharts.
76 -
77 -ABO is already a CoreSCChart, so we will perform normalization and a transformation to SCG.
78 -
79 79  === Creating Mapping during Transformation ===
80 80  
81 -In order to note every single element transformation of a model transformation, we use the TransformationMapping extension.
75 +The following code is a modifcation of the tranformation "Spilt Trigger and Effects" of SCCharts.
82 82  
83 -After each creation of new Objects for transformed model the mapping must be updated with it's origin information.
84 -
85 -The codeblock blow show a snipped of SCChartCoreTransformation with additional mapping registration.
86 -
87 -
88 -
89 -{{code title="transformTriggerEffect CodeSnipped" theme="Eclipse" linenumbers="true" language="java" firstline="1" collapse="true"}}
90 -...
91 -  @Inject
77 +{{code title="Modified SCChart Transformation" theme="Eclipse" linenumbers="true" language="java" firstline="1" collapse="true"}}
78 +package de.cau.cs.kieler.ktm.test.transformations
79 +import com.google.inject.Inject
80 +import de.cau.cs.kieler.ktm.extensions.TransformationMapping
81 +import de.cau.cs.kieler.sccharts.Region
82 +import de.cau.cs.kieler.sccharts.Transition
83 +import de.cau.cs.kieler.sccharts.extensions.SCChartsExtension
84 +/**
85 + * @author als
86 + */
87 +class SCChartTestTransformation {
88 + @Inject
92 92   extension TransformationMapping
93 -
94 -...
95 -
90 + @Inject
91 + extension SCChartsExtension
96 96   // NEW - Mapping access delegation
97 97   def extractMapping() {
98 98   extractMappingData;
99 99   }
100 -
101 -...
102 -
103 103   //-------------------------------------------------------------------------
104 104   //-- S P L I T T R A N S I T I O N --
105 105   //-------------------------------------------------------------------------
... ... @@ -117,124 +117,70 @@
117 117   for (targetTransition : targetRootRegion.getAllContainedTransitions) {
118 118   targetTransition.transformTriggerEffect(targetRootRegion);
119 119   }
120 - val completeness = checkMappingCompleteness(rootRegion, targetRootRegion); //NEW - DEBUG
121 - targetRootRegion;
113 + //check if mapping is complete (only for test proposes)
114 + val diff = rootRegion.checkMappingCompleteness(targetRootRegion);
115 + if (diff.key.empty && diff.value.empty) {
116 + targetRootRegion;
117 + } else {
118 + null
119 + }
122 122   }
123 123   def void transformTriggerEffect(Transition transition, Region targetRootRegion) {
124 - // Only apply this to transition that have both, a trigger (or is a termination) and one or more effects
125 - if (((transition.trigger != null || !transition.immediate || transition.typeTermination) && !transition.effects.nullOrEmpty) ||
122 + // Only apply this to transition that have both, a trigger and one or more effects
123 + if (((transition.trigger != null || !transition.immediate) && !transition.effects.nullOrEmpty) ||
126 126   transition.effects.size > 1) {
127 127   val targetState = transition.targetState
128 128   val parentRegion = targetState.parentRegion
129 129   val transitionOriginalTarget = transition.targetState
130 130   var Transition lastTransition = transition
131 - val firstEffect = transition.effects.head
132 132   for (effect : transition.effects.immutableCopy) {
133 - // Optimization: Prevent transitions without a trigger
134 - if(transition.immediate && transition.trigger == null && firstEffect == effect) {
135 - // skip
136 - } else {
137 - val effectState = parentRegion.createState(GENERATED_PREFIX + "S")
138 - effectState.mapParents(transition.mappedParents); //NEW - mapping information
139 - effectState.uniqueName
140 - val effectTransition = createImmediateTransition.addEffect(effect)
141 - effectTransition.mapParents(transition.mappedParents); //NEW - mapping information
142 -
143 - effectTransition.setSourceState(effectState)
144 - lastTransition.setTargetState(effectState)
145 - lastTransition = effectTransition
146 - }
130 + val effectState = parentRegion.createState(targetState.id + effect.id)
131 + effectState.mapParents(transition.mappedParents); //NEW - mapping information
132 + effectState.setTypeConnector
133 + val effectTransition = createImmediateTransition.addEffect(effect)
134 + effectTransition.mapParents(transition.mappedParents); //NEW - mapping information
135 + effectTransition.setSourceState(effectState)
136 + lastTransition.setTargetState(effectState)
137 + lastTransition = effectTransition
147 147   }
148 148   lastTransition.setTargetState(transitionOriginalTarget)
149 149   }
150 150   }
142 +}
151 151  {{/code}}
152 152  
153 -=== Create TransformationTree ===
145 +=== Create TransformationTree with Mapping ===
154 154  
155 -The following code will now perform each transformation stepwise and updates a transformation tree each step.
147 +To test the transformation and mapping we will transform th following ABO-SCChart.
156 156  
157 -
149 +[[image:attach:example_abo.jpeg]]
158 158  
151 +The following code snipped performs the transformation on our ABO-example, extracts the mapping and creates a transformation tree.
152 +
159 159  {{code title="Transform and create TranformationTree" theme="Eclipse" linenumbers="true" language="java" firstline="1" collapse="true"}}
160 -aboSplitTE = SCCtransformation.transformTriggerEffect(abo);
154 +aboSplitTE = transformation.transformTriggerEffect(abo);
161 161  
162 -ModelWrapper aboSplitTEModel =
163 - transformationTree.initializeTransformationTree(SCCtransformation.extractMapping(), "TriggerEffect", abo, "coreSCChart", aboSplitTE, "coreSCChart-splitTriggerEffect");
156 +Model aboSplitTEModel = transformationTreeExtensions.initializeTransformationTree(
157 + transformation.extractMapping(),
158 + "splitTriggerEffect",
159 + abo, "coreSCChart",
160 + aboSplitTE, "coreSCChart-splitTriggerEffect");
164 164  
165 -aboNormalized = SCCtransformation.transformSurfaceDepth(aboSplitTE);
166 -
167 -ModelWrapper aboNormalizedModel =
168 - transformationTree.addTransformationToTree(SCCtransformation.extractMapping(), aboSplitTEModel, "SurfaceDepth", aboSplitTE, aboNormalized, "normalizedCoreSCChart");
169 -
170 -aboSCG = SCGtransformation.transformSCG(aboNormalized);
171 -
172 -ModelWrapper aboSCGModel =
173 - transformationTree.addTransformationToTree(SCGtransformation.extractMapping(), aboNormalizedModel, "SCC2SCG", aboNormalized, aboSCG,"SCG");
174 -
175 -tree = transformationTree.root(aboSCGModel);
162 +tranformationTree = transformationTreeExtensions.root(aboSplitTEModel);
176 176  {{/code}}
177 177  
178 -
165 +The result of transformation is the following SCChart. ABO-splitTriggerEffect.
179 179  
180 -The resulting TransformationTree has following structure and representing each step and model of the transformation.
167 +[[image:attach:example_abo_splitTE.jpeg]]
181 181  
182 -
169 +Resulting TransformationTree has following structure.
183 183  
184 -|=(% colspan="4" style="text-align: center;" %)(% colspan="4" style="text-align: center;" %)
185 -(((
186 186  [[image:attach:example_tree.jpeg]]
187 -)))
188 -|(% colspan="1" style="text-align: center;" %)(% colspan="1" style="text-align: center;" %)
189 -(((
190 -[[image:attach:example_abo.jpeg]]
191 -)))|(% colspan="1" style="text-align: center;" %)(% colspan="1" style="text-align: center;" %)
192 -(((
193 -[[image:attach:example_abo_splitTE.jpeg]]
194 -)))|(% colspan="1" style="text-align: center;" %)(% colspan="1" style="text-align: center;" %)
195 -(((
196 -[[image:attach:example_abo_norm.jpeg]]
197 -)))|(% colspan="1" style="text-align: center;" %)(% colspan="1" style="text-align: center;" %)
198 -(((
199 -[[image:attach:example_abo_scg.jpeg]]
200 -)))
201 201  
202 -
173 +Furthermore the TransformationTree now contains the following mapping information.
203 203  
204 -Furthermore the TransformationTree now contains mapping information for the whole transformation chain.
175 +[[image:attach:example_tree_transformation.jpeg]]
205 205  
206 -Now we can use an additional feature of KTM, the resolving of mappings between arbitary models.
177 +Here you can see the effect of the transformation causing the transformation to split up.
207 207  
208 -The following code has starts with an instance of the initial ABO SCChart and SCG, along with the TranformationTree above.
209 -
210 -
211 -
212 -{{code title="resolveMapping" theme="Eclipse" linenumbers="true" language="java" firstline="1" collapse="true"}}
213 -@Inject
214 -extension TransformationTreeExtensions
215 -
216 -//Find nodes of model instances in tree
217 -val aboSCCModelWrapper = transformationTree.findModel(aboSCC,"coreSCChart");
218 -val aboSCGModelWrapper = transformationTree.findModel(aboSCG,"SCG");
219 -
220 -//resolve
221 -val mapping = resolvemapping(aboSCCModelWrapper, aboSCC, aboSCGModelWrapper, aboSCG);
222 -{{/code}}
223 -
224 -
225 -
226 -The returned mapping is a multi mapping between all object in aboSCC and their resulting objects in aboSCG.
227 -
228 -This mapping can now partially displayed in models or used for various information propagation between elements of the models.
229 -
230 -[[image:attach:example_abo_resolved.jpeg]]
231 -
232 -
233 -
234 -In cippled view blow you can see model object relations more abstract.
235 -
236 -
237 -
238 -[[image:attach:example_abo_resolved_elements.jpeg]]
239 -
240 -
179 +[[image:attach:als-ktm-splitTriggerEffect-detail.jpg]]
Confluence.Code.ConfluencePageClass[0]
Id
... ... @@ -1,1 +1,1 @@
1 -8651617
1 +8651594
URL
... ... @@ -1,1 +1,1 @@
1 -https://rtsys.informatik.uni-kiel.de/confluence//wiki/spaces/KIELER/pages/8651617/Transformation Mapping (KTM)
1 +https://rtsys.informatik.uni-kiel.de/confluence//wiki/spaces/KIELER/pages/8651594/Transformation Mapping (KTM)