<
From version < 38.1 >
edited by ssm
on 2016/04/22 16:59
To version < 21.1 >
edited by ssm
on 2016/04/22 14:56
>
Change comment: There is no comment for this version

Summary

Details

Page properties
Content
... ... @@ -1,7 +1,7 @@
1 1  {{layout}}
2 2  {{layout-section ac:type="single"}}
3 3  {{layout-cell}}
4 -is is a light-weight tutorial for developing transformations/additions for SCCharts in KIELER. It will use Eclipse, EMF, and Xtend and therefore, finishing the corresponding tutorials could prove useful. However, they are not a strict requirement for this tutorial.
4 +This is a light-weight tutorial for developing additions for SCCharts in KIELER. It will use Eclipse, EMF, and Xtend and therefore, finishing the corresponding tutorials could prove useful. However, they are not a strict requirement for this tutorial.
5 5  
6 6  
7 7  
... ... @@ -13,7 +13,7 @@
13 13  
14 14  == Required Software ==
15 15  
16 -As you're going to develop for KIELER SCCharts, we recommend to use the Oomph setup as described in [[doc:KIELER.Getting Eclipse]] (Oomph Setup). However, you could also install all componentes by yourself. Please consult the other tutorials if you want to do that. You would need to install the Modeling Tools and the Xtext SDK.
16 +As you're going to develop for KIELER SCCharts we recommend to use the semantic Oomph setup as described in [[doc:KIELER.Getting Eclipse]] (Oomph Setup). However, you could also install all componentes by yourself. Please consult the other tutorials if you want to do that. You would need to install the Modeling Tools and the Xtext SDK.
17 17  {{/layout-cell}}
18 18  {{/layout-section}}
19 19  
... ... @@ -102,30 +102,21 @@
102 102  
103 103  ==== Model Task ====
104 104  
105 -{{task-list}}
106 -{{task id="1" status="incomplete"}}
107 -(% style="line-height: 1.42857;" %)Answer the following questions
105 +1. Answer the following questions
106 +11. How do you describe a superstate in the model?
107 +11. Outline the relationship between states, regions, transitions, and valued objects.\\
108 +11. Name the class of the root element of an SCChart.
109 +11. What is a valued object?
110 +11. How do you get the type of an interface variable?
111 +11. What other metamodels are needed for the SCCharts metamodel and write down which one is needed for what?
112 +1. Write down (on paper, text editor, etc) how the following SCChart models look like
113 +11. Open the wiki page that explains the [[doc:KIELER.Textual SCCharts Language SCT]].
114 +11. Search the //SCChart, Initial State, State, Transition and Immediate Transition //example and ...
115 +111. write down (on paper or text editor, etc) how the model of that SCChart looks like.
116 +111. The user now marks C as final. What has to be changed in the model? What semantic problem do you see?
117 +11. Now, navigate to the //Super State: Strong Abort Transition //example. Write down (on paper) how the model of that SCCharts looks like.
118 +11. And finally a more sophisticated model: Write down the model of ABO (from [[doc:KIELER.Examples]]).
108 108  
109 -1. How do you describe a superstate in the model?
110 -1. Outline the relationship between states, regions, transitions, and valued objects.\\
111 -1. Name the class of the root element of an SCChart.
112 -1. What is a valued object?
113 -1. How do you get the type of an interface variable?
114 -1. What other metamodels are needed for the SCCharts metamodel and write down which one is needed for what?
115 -{{/task}}
116 -
117 -{{task id="2" status="incomplete"}}
118 -Write down (on paper, text editor, etc) how the following SCChart models look like
119 -
120 -1. Open the wiki page that explains the [[doc:KIELER.Textual SCCharts Language SCT]].
121 -1. Search the //SCChart, Initial State, State, Transition and Immediate Transition //example and ...
122 -11. write down (on paper or text editor, etc) how the model of that SCChart looks like.
123 -11. The user now marks C as final. What has to be changed in the model? What semantic problem do you see?
124 -1. Now, navigate to the //Super State: Strong Abort Transition //example. Write down (on paper) how the model of that SCCharts looks like.
125 -1. And finally a more sophisticated model: Write down the model of ABO (from [[doc:KIELER.Examples]]).
126 -{{/task}}
127 -{{/task-list}}
128 -
129 129  
130 130  
131 131  {{info title="KLighD Screenshots"}}
... ... @@ -248,42 +248,24 @@
248 248  
249 249  You are now equipped with the fundamentals you need to create models programmatically. Let's try it:
250 250  
251 -{{task-list}}
252 -{{task id="3" status="incomplete"}}
253 -(% style="line-height: 1.42857;" %)The code fragments listed above do not suffice to create a grammatically correct model. Try to generate a model that corresponds with the serialized model listed on the right side.
242 +1. The code fragments listed above do not suffice to create a grammatically correct model. Try to generate a model that corresponds with the serialized model listed on the right side.
243 +11. Run the {{code language="none"}}main(){{/code}} method by right-clicking its class and selecting (% style="line-height: 1.42857;" %)//Run as//(%%) -> (% style="line-height: 1.42857;" %)//Java Application//(%%). Note that this runs your {{code language="none"}}main(){{/code}} method as a simple Java program, not a complete Eclipse application. EMF models can be used in any simple Java context, not just in Eclipse applications.
244 +11. Execute the main method.
245 +11. (((
246 +Inspect your SCT file. (Press F5 to refresh your file view.)
254 254  
255 -1. (% style="line-height: 1.42857;" %)Run the {{code language="none"}}main(){{/code}} method by right-clicking its class and selecting //Run as// -> //Java Application//. Note that this runs your {{code language="none"}}main(){{/code}} method as a simple Java program, not a complete Eclipse application. EMF models can be used in any simple Java context, not just in Eclipse applications.
256 -1. Execute the main method.
257 -1. (((
258 -(% style="line-height: 1.42857;" %)Inspect your SCT file. (Press F5 to refresh your file view.)
259 -
260 260  {{note title="Kext Warning"}}
261 261  It is possible that kext generates a Null Pointer Exception when you save your model this way. This is a known issue. We're working on it. Just ignore it for now.
262 262  {{/note}}
263 263  )))
264 -{{/task}}
252 +1. Now, create a new Java class and proceed as before to generate a model of ABO in the {{code language="none"}}main(){{/code}} method.
253 +1. Start your SCChart Editor Eclipse instance and load your SCT file. KLighD should now be able to visualize your ABO correctly.
254 +11. For this, open tab //Run// and select// Run Configurations...//
255 +11. Create a new //Eclipse Application// and name it appropriately.
256 +11. As product select {{code language="none"}}de.cau.cs.kieler.core.product.product{{/code}}.
257 +11. Click //Run// (or //Debug// if you opened// Debug Configuration...//)
258 +11. Create a new project and add you generated model.
265 265  
266 -{{task id="4" status="incomplete"}}
267 -Now, create a new Java class and proceed as before to generate a model of ABO in the 
268 -
269 -{{code language="none"}}
270 -main()
271 -{{/code}}
272 -
273 - method.
274 -{{/task}}
275 -
276 -{{task id="5" status="incomplete"}}
277 -(% style="line-height: 1.42857;" %)Start your SCChart Editor Eclipse instance and load your SCT file. KLighD should now be able to visualize your ABO correctly.(%%)\\
278 -
279 -1. For this, open tab //Run// and select// Run Configurations...//
280 -1. Create a new //Eclipse Application// and name it appropriately.
281 -1. As product select {{code language="none"}}de.cau.cs.kieler.core.product.product{{/code}}.
282 -1. Click //Run// (or //Debug// if you opened// Debug Configuration...//)
283 -1. Create a new project and add you generated model.
284 -{{/task}}
285 -{{/task-list}}
286 -
287 287  
288 288  {{/layout-cell}}
289 289  
... ... @@ -301,33 +301,23 @@
301 301  
302 302  {{layout-section ac:type="two_right_sidebar"}}
303 303  {{layout-cell}}
304 -= Model-to-Model Transformations with KiCo =
277 += Model-to-Model Transformation with KiCo =
305 305  
306 -You can use the [[Kieler Compiler>>url:http://rtsys.informatik.uni-kiel.de/confluence/display/KIELER/Kieler+Compiler||shape="rect"]] (KiCo) to handle all the model input/output tasks and concentrate on the actual transformation. If you executed the **Model Creation Task correctly**, you should now have a complete running SCT Editor instance that looks like the one on the right. You should see the //KIELER Compiler Selection// n the lower right part of the working space. Here you can select specific transformations that will be applied to the actual model. Simply select a transformation to test it.
279 +You can use the [[Kieler Compiler>>url:http://rtsys.informatik.uni-kiel.de/confluence/display/KIELER/Kieler+Compiler||shape="rect"]] (KiCo) to handle all the model input/output tasks and concentrate on the actual transformation. If you executed the **Model Creation Task correctly**, you should now have a complete running SCT Editor instance that looks like the one on the right. You should see the //KIELER Compiler Selection// n the lower right part of the working space. Here you can select specific transformations that will be applied to the actual model. Simply select a transformation to test it.
307 307  
308 308  == Creating a new Transformation ==
309 309  
310 -Now, you're going to write your own transformation with **Xtend** *drumroll*, a programming language that looks very similar to Java, but which adds some very convenient features. Xtend code compiles to Java and and was developed using Xtext. In fact, once you gain experience working with Xtend you will probably appreciate the power of Xtext even more. Xtend is particularly useful to browse & modify EMF models. You get the point... we like it. :)
311 -{{/layout-cell}}
283 +Now, you're going to write your own transformation with **Xtend** *drumroll*, a programming language that looks very similar to Java, but which adds some very convenient features. Xtend code compiles to Java and and was developed using Xtext. In fact, once you gain experience working with Xtend you will probably appreciate the power of Xtext even more. Xtend is particularly useful to browse & modify EMF models. You get the point... we like it. :)
312 312  
313 -{{layout-cell}}
314 -[[image:attach:KielerSCTEditor.png]]
315 -{{/layout-cell}}
316 -{{/layout-section}}
285 +
317 317  
318 -{{layout-section ac:type="two_right_sidebar"}}
319 -{{layout-cell}}
320 -==== Transformation Creation Task ====
287 +Transformation Creation Task
321 321  
322 -{{task-list}}
323 -{{task id="6" status="incomplete"}}
324 -Create your first transformation...
325 -
326 -1. Create a new project within your tutorial working set as before.
327 -1. Add plugin dependencies to {{code language="none"}}de.cau.cs.kieler.kico{{/code}} and {{code language="none"}}de.cau.cs.kieler.sccharts{{/code}}.
328 -1. Create a new //Xtend class// in you package and name it "DoubleStates" and use {{code language="none"}}AbstractProductionTransformation{{/code}} as superclass.
329 -1. Here, you can automatically add the missing Xtend files by using the quickfix //Add Xtend lib to class path. //Alternatively you can simply add {{code language="none"}}com.google.guava{{/code}}, {{code language="none"}}org.eclipse.xtext.xbase.lib{{/code}}, {{code language="none"}}org.eclipse.xtend.lib{{/code}}, and {{code language="none"}}org.eclipse.xtend.lib.macro{{/code}} to you plugin dependencies.
330 -1. Click on //Add unimplemented methods//.
289 +1. Therefore, create a new project within your tutorial working set as before.
290 +1. Add plugin dependencies to {{code language="none"}}de.cau.cs.kieler.kico{{/code}} and {{code language="none"}}de.cau.cs.kieler.sccharts{{/code}}.
291 +1. Create a new //Xtend class// in you package and name it "DoubleStates" and use {{code language="none"}}AbstractProductionTransformation{{/code}} as superclass.
292 +1. Here, you can automatically add the missing Xtend files by using the quickfix //Add Xtend lib to class path. //Alternatively you can simply add {{code language="none"}}com.google.guava{{/code}}, {{code language="none"}}org.eclipse.xtext.xbase.lib{{/code}}, {{code language="none"}}org.eclipse.xtend.lib{{/code}}, and {{code language="none"}}org.eclipse.xtend.lib.macro{{/code}} to you plugin dependencies.
293 +1. Click on //Add unimplemented methods//.
331 331  1. (((
332 332  Now, you should have a class similar to the following one.
333 333  
... ... @@ -348,78 +348,32 @@
348 348  
349 349  }
350 350  {{/code}}
351 -
352 -{{info title="Xtend Infos"}}
353 -* Lines in Xtend code don't have to and with a semicolon.
354 -* We have been explicit about the method's return type, but we could have easily omitted it, letting Xtend infer the return type.
355 -* The keyword {{code language="none"}}val{{/code}} declares a constant, while {{code language="none"}}var{{/code}} declares a variable. Try to make do with constants where possible.
356 -* The methods you call should be declared as {{code language="none"}}def private{{/code}} since they are implementation details and shouldn't be called by other classes.
357 -* You may be tempted to add a few global variables that hold things like a global input variable or a pointer to the current state. While you could to that, {{code language="none"}}def create {{/code}}methods might offer a better alternative...
358 -{{/info}}
359 359  )))
360 -{{/task}}
315 +1. (((
316 +As you can see, it is mandatory to add an id for the transformation and another id of the feature that this transformation produces. Name your transformation **tutorial.doubleStates **and the id of feature you want to produce is **sccharts.doubleStates**.
361 361  
362 -{{task id="7" status="incomplete"}}
363 -As you can see, it is mandatory to add an id for the transformation and another id of the feature that this transformation produces. Name your transformation **tutorial.doubleStates **and the id of feature you want to produce is **sccharts.doubleStates**.
364 -
365 365  {{info title="Programming Guidelines"}}
366 366  You should really think about some constants here. You can also look at the sccharts transformation and features constants in the sccharts plugin.
367 367  {{/info}}
368 -{{/task}}
369 -{{/task-list}}
370 -{{/layout-cell}}
321 +)))
322 +1. KiCo must know about the new feature and also about your new transformation. 
323 +11. Add a new Xtend class with Feature as superclass. Add all unimplemented methods. Also set sccharts.doubleStates as Id.
324 +11. Go to the Extension tab inside your plugin configuration. 
325 +111. Add a new Extension Point de.cau.cs.kieler.kico.feature. Create a new featureClass and point it to your new feature class.
326 +111. Also add a new Extension Point de.cau.cs.kieler.kico.transformation. Create a new productionTransformationClass and point it to your transformation class.
327 +111. Finally, you have to link your transformation to the SCT Editor. Add the Extension point de.cau.cs.kieler.kico.ui.transformation. Create an editor link and fill in the following values:
328 +1111. editor: de.cau.cs.kieler.sccharts.text.sct.Sct
329 +1111. features: sccharts.doubleStates
330 +1111. label: Tutorial Compilation
331 +1111. priority: 101
332 +1111. preferred: (leave it blank)
333 +11. If you start your KIELER instance now, you should get a new compilation chain which has only one transformation: yours, which doesn't do anything.
334 +1. If you want to rename your feature in the Compiler Selection (without changing its Id), override the getName method and return a new name. Rename your feature appropriately.
335 +1. Now, fill your transformation with life:
336 +11. Inside your transformation class, add a new method with the following signature: def State transform(State rootState, KielerCompilerContext context). This transformation will be executed if the feature is selected in the Compiler Selection.
337 +11. (((
338 +Add thew following body to the function and try to understand the Xtend code.
371 371  
372 -{{layout-cell}}
373 -
374 -{{/layout-cell}}
375 -{{/layout-section}}
376 -
377 -{{layout-section ac:type="two_right_sidebar"}}
378 -{{layout-cell}}
379 -{{task-list}}
380 -{{task id="8" status="incomplete"}}
381 -KiCo must know about the new feature and also about your new transformation. 
382 -
383 -1. Add a new Xtend class with Feature as superclass. Add all unimplemented methods. Also set** sccharts.doubleStates** as Id.
384 -1. Go to the Extension tab inside your plugin configuration. 
385 -11. Add a new Extension Point de.cau.cs.kieler.kico.feature. Create a new featureClass and point it to your new feature class.
386 -11. Also add a new Extension Point de.cau.cs.kieler.kico.transformation. Create a new productionTransformationClass and point it to your transformation class.
387 -11. Finally, you have to link your transformation to the SCT Editor. Add the Extension point de.cau.cs.kieler.kico.ui.transformation. Create an editor link and fill in the following values:
388 -111. editor: {{code language="none"}}de.cau.cs.kieler.sccharts.text.sct.Sct{{/code}}
389 -111. features: sccharts.doubleStates
390 -111. label: Tutorial Compilation
391 -111. priority: 101
392 -111. preferred: (leave it blank)
393 -1. {{note title="Plugin Tasks"}}In general it is bad to mix non-ui plugins/tasks with ui plugin/tasks because (in the context of KiCo) even if you're not working with an active UI your transformations should work (e.g. a command line compiler). To keep this tutorial simple, you can add this dependency to your plugin nevertheless. However, you shouldn't do this in real products. Always keep the UI separated.{{/note}}If you start your KIELER instance now, you should get a new compilation chain which has only one transformation: yours, which doesn't do anything.
394 -{{/task}}
395 -
396 -{{task id="9" status="incomplete"}}
397 -If you want to rename your feature in the Compiler Selection (without changing its Id), override the
398 -
399 -{{code language="none"}}
400 -getName
401 -{{/code}}
402 -
403 - method and return a new name. Rename your feature appropriately.
404 -{{/task}}
405 -{{/task-list}}
406 -{{/layout-cell}}
407 -
408 -{{layout-cell}}
409 -[[image:attach:KielerSCTEditorOwnTransformation.png]]
410 -{{/layout-cell}}
411 -{{/layout-section}}
412 -
413 -{{layout-section ac:type="two_right_sidebar"}}
414 -{{layout-cell}}
415 -{{task-list}}
416 -{{task id="10" status="incomplete"}}
417 -Now, fill your transformation with life:
418 -
419 -1. Inside your transformation class, add a new method with the following signature: {{code language="none"}}def State transform(State rootState, KielerCompilerContext context){{/code}}. This transformation will be executed if the feature is selected in the Compiler Selection.
420 -1. (((
421 -Add thew following body to the function and try to understand the Xtend code. Import unknown class via code assist.
422 -
423 423  {{code language="java" title="transform"}}
424 424   def State transform(State rootState, KielerCompilerContext context) {
425 425   val newState = SCChartsFactory.eINSTANCE.createState => [
... ... @@ -433,56 +433,37 @@
433 433   }
434 434  {{/code}}
435 435  )))
436 -1. When selecting your transformation, the SCChart gets transformed and looks like the version on the right.
437 -{{/task}}
353 +11. When selecting your transformation, the SCChart gets transformed and looks like the version on the right.
354 +1. Extend the transformation so that each transition is split up in two and connected via a transient state meaning that the original transformation should point to the new state and a new immediate transformation then points to the original target state.
355 +1. Try your new transformation with ABO. The result should look like the example on the right.
438 438  
439 -{{task id="11" status="incomplete"}}
440 -Extend the transformation so that the transition is split up in two and connected via a transient state meaning that the original transformation should point to the new state and a new immediate transformation then points to the original target state. Try it out.
441 -{{/task}}
357 +
358 +{{/layout-cell}}
442 442  
443 -{{task id="12" status="incomplete"}}
444 -Xtend supports extensions that can be used to extend the function set of you classes (i.e. models). Add {{code language="none"}}com.google.inject{{/code}} to the dependencies of your plugin. Now, add the following code fragment to the beginning of your class.
360 +{{layout-cell}}
361 +[[image:attach:KielerSCTEditor.png]]
445 445  
446 -{{code language="java" title="Code injection"}}
447 - @Inject
448 - extension SCChartsExtension
449 -{{/code}}
363 +
450 450  
451 -There are several Extensions classes within the KIELER project that extend the functionality of various classes. Basically, there are one or more for each metamodel (e.g. SCCharts, SCG, KExpressions, etc). You don't want to invent the wheel again. Use these methods. For example: there is a method that gives you all contained states of a state in a list: {{code language="none"}}getAllContainedStatesList{{/code}}. You can use it on your {{code language="none"}}rootState{{/code}}: {{code language="none"}}rootState.allContainedStatesList{{/code}}. There are also several convenient methods for creating model elements so that you don't have to use the factories directly.
365 +
452 452  
453 -{{note title="Extensions Naming Scheme"}}
454 -Extensions are also just classes. You can add your own to improve the structure of your own projects. In KIELER all extensions end with "Extensions"; except SCChartsExtension for legacy reasons. This will be renamed in after the next snapshot to SCChartsExtensions. So, if you're going to add new extensions to the project, please name them accordingly.
455 -{{/note}}
456 -{{/task}}
457 -{{/task-list}}
458 -{{/layout-cell}}
367 +
459 459  
460 -{{layout-cell}}
461 -[[image:attach:KielerSCTEditorOwnTransformationOlolo.png]]
462 -{{/layout-cell}}
463 -{{/layout-section}}
369 +
464 464  
465 -{{layout-section ac:type="two_right_sidebar"}}
466 -{{layout-cell}}
467 -{{task-list}}
468 -{{task id="13" status="incomplete"}}
469 -Extend your transformation so that it is applied on all states (except the root state). Try your new transformation with ABO. The result should look like the example on the right.
470 -{{/task}}
471 -{{/task-list}}
371 +
472 472  
473 -== The existing Compilation Chain ==
373 +
474 474  
475 -Congratulations. You added and executed your own KiCo transformation. Nevertheless, often you want to extend the existing compilation chain. To do this, you proceed as before but instead of creating your own compilation chain, you must modify the existing chains (e.g. the netlist compilation in de.cau.cs.kieler.sccharts.ui). To add a specific transformation at a specific point in the chain, you must tell KiCo what features are required for the transformation. For that you must override the method getRequiredFeatureIds and return a set with all required features.
375 +
476 476  
477 -Also, if you're developing for the master chain, you should obey the package structure. Look at the sccharts plugins. All features, transformation, extensions, the metamodel, ui elements, etc are separated from each other. You should always do the same!
377 +
478 478  
479 -//We will add more content to this subsection in the future...//
379 +
480 480  
481 481  
482 -{{/layout-cell}}
483 483  
484 -{{layout-cell}}
485 -[[image:attach:ABODoubleStates.png]]
383 +
486 486  
487 487  
488 488  
... ... @@ -489,14 +489,34 @@
489 489  
490 490  
491 491  
390 +
391 +
392 +
393 +
394 +
395 +
396 +
397 +
398 +
399 +
400 +
401 +
402 +
403 +
404 +
405 +
406 +
407 +
408 +
409 +[[image:attach:KielerSCTEditorOwnTransformation.png]]
492 492  {{/layout-cell}}
493 493  {{/layout-section}}
494 494  
495 495  {{layout-section ac:type="single"}}
496 496  {{layout-cell}}
497 -= Model-to-Model Transformations between Metamodels =
415 += Transforming SCCharts =
498 498  
499 -Transformations from one model to another may be performed within the same metamodel or from metamodel to a different metamodel. Both methods are used in KIELER and in principle they do not really differ in implementation. Nevertheless, if working within the same metamodel you should keep in mind that you're potentially changing the actual model instead of changing another instance (after copying). When transforming to another metamodel, you're always generating a new model. So there is no in-place transformation. Both is possible. Just make sure that you know what you're doing.
417 +Transformations from one model to another may be performed within the same metamodel or from metamodel to a different metamodel. Both methods are used in KIELER and in principle they do not really differ in implementation. Nevertheless, if working within the same metamodel you should keep in mind that you're potentially changing the actual model instead of changing another instance (after copying). Both is possible. Just make sure that you know what you're doing.
500 500  
501 501  Now, you're going to transform the normalized form of HandleA from ABO to an SCG. The Sequentially Constructive Graph is a control-flow graph which can be seen as another representation of the same program. The SCG of the normalized version of ABO's HandleA is depicted on the right.
502 502  
... ... @@ -529,64 +529,213 @@
529 529  (((
530 530  [[image:attach:abo_scg_HandleA.png]]
531 531  )))
532 -{{/layout-cell}}
533 -{{/layout-section}}
534 534  
535 -{{layout-section ac:type="two_equal"}}
536 -{{layout-cell}}
537 537  The next figure depicts the direct mapping from normalized SCCharts to their corresponding SCG.
538 538  
539 -Inspect the metamodel of the SCGs in plugin de.cau.cs.kieler.scg. SCGs are used for analyses and optimization and include a lot of additional elements. However, for this tutorial it should be sufficient to look at the SCGraph class, its nodes attribute, the important node classes and the controlflow class. Important nodes for this SCG are entry, exit, assignment, conditional,
540 -{{/layout-cell}}
541 -
542 -{{layout-cell}}
543 543  [[image:attach:sccharts-scg.png]]
544 -{{/layout-cell}}
545 -{{/layout-section}}
546 546  
547 -{{layout-section ac:type="two_right_sidebar"}}
548 -{{layout-cell}}
549 -==== Transformation Creation Task 2 ====
455 +Inspect the metamodel of the SCGs in plugin de.cau.cs.kieler.scg. SCGs are used for analyses and optimization and include a lot of additional elements. However, for this tutorial it should be sufficient to look at the SCGraph class, its nodes attribute, the important node classes and the controlflow class. Important nodes for this SCG are entry, exit, assignment, conditional,
550 550  
457 +==== Transformation Task ====
458 +
551 551  Write a transformation that transforms your normalized version of ABO's HandleA into its corresponding SCG.
552 552  
553 -{{task-list}}
554 -{{task id="14" status="incomplete"}}
555 -Proceed as before. Create a new plugin (or copy your last one) Make sure, you also add de.cau.cs.kieler.scg to your dependencies.
556 -{{/task}}
461 +1. (((
462 +**Writing a Model Transformation**
557 557  
558 -{{task id="15" status="incomplete"}}
559 -Write a transformation that is able to transform 
464 +This time we want you to integrate your transformation into your SCCharts Editor instance. Therefore,...
465 +(% style="color: rgb(51,51,51);line-height: 1.66667;" %)\\
560 560  
467 +1. Add a new package 
468 +
561 561  {{code language="none"}}
562 -ABO_norm_HandleA
470 +<project>.transformations
471 +{{/code}} to your project.
472 +1. Add an //Xtend Class// to the new package.
473 +1. If you notice that your new class is marked with an error marker because of a missing dependency of the new plug-in project to 
474 +
475 +{{code language="none"}}
476 +org.eclipse.xtext.xbase.lib, 
477 +{{/code}}you can hover over the error with your mouse and have Eclipse add all libraries required by Xtend to your project.
478 +1.
479 +
480 +Define an entry method for the transformation that takes an SCChart program instance as an argument and returns an SCG {{code language="none"}}Program{{/code}}. You can use the following (incomplete) method as a starting point:
481 +
482 +(((
483 +(% class="syntaxhighlighter sh-confluence nogutter java" %)
484 +(((
485 +
486 +
487 +|(((
488 +(% class="container" title="Hint: double-click to select code" %)
489 +(((
490 +(% class="line number1 index0 alt2" %)
491 +(((
492 +{{code language="none"}}
493 +/**
563 563  {{/code}}
495 +)))
564 564  
565 - into its corresponding SCG.
566 -{{/task}}
497 +(% class="line number2 index1 alt1" %)
498 +(((
499 +{{code language="none"}}
500
501 +{{/code}}
567 567  
568 -{{task id="16" status="incomplete"}}
569 -**Verify your generated SCG**. If you added your transformation correctly, the SCG should be displayed automatically as soon as selected. If your SCG looks like the SCG depicted earlier, then everything is fine.
570 -{{/task}}
503 +{{code language="none"}}
504 +* Transforms a given SCCharts program into an SCG.
505 +{{/code}}
506 +)))
571 571  
572 -{{task id="17" status="complete"}}
573 -Check your SCG semantically. Is there anything you could improve/optimize? 
508 +(% class="line number3 index2 alt2" %)
509 +(((
510 +{{code language="none"}}
511
512 +{{/code}}
574 574  
575 -1. Write a second transformation (just as before) and add it to the transformation chain right after the transformation you already added.
576 -1. Optimize the given SCG and compare the result with the previous one.
577 -1. Make sure that the two SCGs are still semantically identical.
578 -{{/task}}
579 -{{/task-list}}
514 +{{code language="none"}}
515 +*
516 +{{/code}}
517 +)))
580 580  
519 +(% class="line number4 index3 alt1" %)
520 +(((
521 +{{code language="none"}}
522 +*/
523 +{{/code}}
524 +)))
525 +
526 +(% class="line number8 index7 alt1" %)
527 +(((
528 +{{code language="none"}}
529 +def SCGraph transform(State rootState) {
530 +{{/code}}
531 +)))
532 +
533 +(% class="line number9 index8 alt2" %)
534 +(((
535 +{{code language="none"}}
536 +    
537 +{{/code}}
538 +
539 +{{code language="none"}}
540 +// Create the SCG
541 +{{/code}}
542 +)))
543 +
544 +(% class="line number10 index9 alt1" %)
545 +(((
546 +{{code language="none"}}
547 +    
548 +{{/code}}
549 +
550 +{{code language="none"}}
551 +val scg = SCGraphFactory::eINSTANCE.createSCGraph()
552 +{{/code}}
553 +)))
554 +
555 +(% class="line number11 index10 alt2" %)
556 +(((
557 +{{code language="none"}}
558 +  
559 +{{/code}}
560 +)))
561 +
562 +(% class="line number12 index11 alt1" %)
563 +(((
564 +{{code language="none"}}
565 +    
566 +{{/code}}
567 +
568 +{{code language="none"}}
569 +// TODO: Your transformation code
570 +{{/code}}
571 +)))
572 +
573 +(% class="line number13 index12 alt2" %)
574 +(((
575 +{{code language="none"}}
576 +  
577 +{{/code}}
578 +)))
579 +
580 +(% class="line number14 index13 alt1" %)
581 +(((
582 +{{code language="none"}}
583 +    
584 +{{/code}}
585 +
586 +{{code language="none"}}
587 +// Return the transformed program
588 +{{/code}}
589 +)))
590 +
591 +(% class="line number15 index14 alt2" %)
592 +(((
593 +{{code language="none"}}
594 +    scg
595 +{{/code}}
596 +)))
597 +
598 +(% class="line number16 index15 alt1" %)
599 +(((
600 +{{code language="none"}}
601 +}
602 +{{/code}}
603 +)))
604 +)))
605 +)))
606 +
581 581  
608 +)))
609 +)))
582 582  
611 +(((
612 +(% class="syntaxhighlighter nogutter java" %)
613 +(((
614 +There's a few points to note here:
615 +)))
616 +)))
617 +
618 +\\
619 +
620 +1.
621 +1*. Lines in Xtend code don't have to and with a semicolon.
622 +1*. We have been explicit about the method's return type, but we could have easily omitted it, letting Xtend infer the return type.
623 +1*. The keyword 
624 +
625 +{{code language="none"}}
626 +val
627 +{{/code}} declares a constant, while 
628 +
629 +{{code language="none"}}
630 +var
631 +{{/code}} declares a variable. Try to make do with constants where possible.
632 +1*. The methods you call should be declared as 
633 +
634 +{{code language="none"}}
635 +def private
636 +{{/code}} since they are implementation details and shouldn't be called by other classes.
637 +1*. You may be tempted to add a few global variables that hold things like a global input variable or a pointer to the current state. While you could to that, 
638 +
639 +{{code language="none"}}
640 +def create 
641 +{{/code}}methods might offer a better alternative...
642 +\\
643 +1. Replace the TODO with an transformation code that takes an extended BF program and transforms it into an semantically equivalent BF program that only uses standard BF instructions. 
644 +HINT: Some of the extended BF commands can only be expressed by standard operations if you can write to other cells. Therefore you are allowed to perform side effects on the tape.
645 +1. Open the //Plug-In Manifest Editor// and switch to the Runtime tab. Add the package containing your transformation to the list of exported packages. (You may have to check the //Show non-Java packages// option in the //Exported Packages// dialog to see the package.)
646 +\\
647 +)))
648 +1. **Verify your generated SCG**. If you added your transformation correctly, the SCG should be displayed automatically as soon as selected. If your SCG looks like the SCG depicted earlier, then everything is fine.
649 +1. Check your SCG semantically. Is there anything you could improve/optimize? 
650 +11. Write a second transformation (just as before) and add it to the transformation chain right after the transformation you already added.
651 +11. Optimize the given SCG and compare the result with the previous one.
652 +11. Make sure that the two SCGs are still semantically identical.
653 +
583 583  Congratulations! You finished the SCCharts Development Tutorial. Ask your supervisor for further instructions!
584 584  
585 585  
586 586  {{/layout-cell}}
587 -
588 -{{layout-cell}}
589 -
590 -{{/layout-cell}}
591 591  {{/layout-section}}
592 592  {{/layout}}
Confluence.Code.ConfluencePageClass[0]
Id
... ... @@ -1,1 +1,1 @@
1 -16810392
1 +16810372
URL
... ... @@ -1,1 +1,1 @@
1 -https://rtsys.informatik.uni-kiel.de/confluence//wiki/spaces/TUT/pages/16810392/SCCharts Development
1 +https://rtsys.informatik.uni-kiel.de/confluence//wiki/spaces/TUT/pages/16810372/SCCharts Development