Changes for page SCCharts Development
Last modified by Richard Kreissig on 2023/09/14 10:04
Summary
-
Page properties (1 modified, 0 added, 0 removed)
-
Objects (1 modified, 0 added, 0 removed)
Details
- Page properties
-
- Content
-
... ... @@ -135,18 +135,6 @@ 135 135 136 136 {{layout-section ac:type="single"}} 137 137 {{layout-cell}} 138 - 139 -{{/layout-cell}} 140 -{{/layout-section}} 141 - 142 -{{layout-section ac:type="single"}} 143 -{{layout-cell}} 144 - 145 -{{/layout-cell}} 146 -{{/layout-section}} 147 - 148 -{{layout-section ac:type="single"}} 149 -{{layout-cell}} 150 150 = Creating SCCharts Models Programmatically = 151 151 152 152 == Creating a Test Project == ... ... @@ -153,6 +153,7 @@ 153 153 154 154 We need a project for testing. Do the following: 155 155 144 +1. If you used the standard KIELER Oomph installation setup, create a new Working Set named Tutorial in the Package Explorer. Then... 156 156 1. Create a new empty //Plug-In Project//. 157 157 1. Add the project that contains the sccharts metamodel as a dependency of your new project through the //Plugin Manifest Editor//. 158 158 1. Create a simple Java class that implements a main method. Hint: In a new Java class, simply type main and hit Ctrl+Space. Eclipse content assist will create the method for you. ... ... @@ -159,12 +159,12 @@ 159 159 160 160 == Creating a Model == 161 161 162 -To create a model 151 +To create a model programmatically you cannot directly use the Java classes generated for the model. Instead, the main package contains interfaces for all of your model object classes. The {{code language="none"}}impl{{/code}} package contains the actual implementation and the {{code language="none"}}util{{/code}} package contains some helper classes. Do not instantiate objects directly by manually calling {{code language="none"}}new{{/code}}. EMF generates a Factory to create new objects. The factory itself uses the singleton pattern to get access to it: 163 163 164 164 {{code language="java"}} 165 165 SCChartsFactory sccFactory = SCChartsFactory.eINSTANCE; 166 -State state = sccFactory 167 -Transition transition = sccFactory 155 +State state = sccFactory.createState(); 156 +Transition transition = sccFactory.createTransition(); 168 168 {{/code}} 169 169 170 170 Important: The SCCharts grammar is build on top of several other grammars. Therefore, not all language objects can be found in the SCCharts factory. For example, all expression elements are part of the KExpressions grammar and hence, have their own factory. If you need other factories, don't forget to add the corresponding plugin to your plugin dependency list. ... ... @@ -171,13 +171,13 @@ 171 171 172 172 {{code language="java"}} 173 173 KExpressionsFactory kFactory = KExpressionsFactory.eINSTANCE; 174 -Bool eanValue boolValue = kFactory.createBooleanValue();163 +BoolValue boolValue = kFactory.createBoolValue(); 175 175 {{/code}} 176 176 177 177 For all simple attributes, there are getter and setter methods: 178 178 179 179 {{code language="java"}} 180 -state.setId(" Root");169 +state.setId("Init"); 181 181 boolValue.setValue(true); 182 182 {{/code}} 183 183 ... ... @@ -190,15 +190,25 @@ 190 190 List references (multiplicity of > 1) have only a list getter, which is used to manipulate the list: 191 191 192 192 {{code language="java"}} 193 -state. outgoingTransitions.add(transition);182 +state.getOutgoingTransitions().add(transition); 194 194 {{/code}} 195 195 185 +{{info title="Plugin Dependencies"}} 186 +You may have noticed that is was not necessary to add a dependency for the kexpressions classes. The SCCharts plugin reexports the dependencies of the other EMF metamodels. Look at the plugin.xml in the SCCharts plugin in the dependency tab for more information. 187 +{{/info}} 188 + 196 196 == Saving a Model == 197 197 198 198 EMF uses the [[Eclipse Resource concept>>url:http://help.eclipse.org/juno/topic/org.eclipse.platform.doc.isv/guide/resInt.htm?cp=2_0_10||rel="nofollow" shape="rect" class="external-link"]] to save models to files and load models from files. It can use different //Resource Factories// that determine how exactly models are serialized. We will use the [[XMIResourceFactoryImpl>>url:http://download.eclipse.org/modeling/emf/emf/javadoc/2.8.0/org/eclipse/emf/ecore/xmi/impl/XMIResourceFactoryImpl.html||rel="nofollow" shape="rect" class="external-link"]] to save our models to XML files: 199 199 200 -1. Add a dependency to the {{code language="none"}}org.eclipse.emf.ecore.xmi{{/code}} plug-in. 201 201 1. ((( 194 +Add a dependency to the {{code language="none"}}com.google.inject, org.eclipse.core.resources, {{/code}}and{{code language="none"}} de.cau.cs.kieler.sccharts.text{{/code}} plug-ins. 195 + 196 +{{info title="Additional Dependencies"}} 197 +Don't worry. You will be experienced enough to add mandatory dependencies quickly in the future. However, for now just add the dependencies to proceed with the tutorial. 198 +{{/info}} 199 +))) 200 +1. ((( 202 202 Use something like the following code to save the model from above: 203 203 204 204 {{code language="java"}} ... ... @@ -205,10 +205,10 @@ 205 205 // Create a resource set. 206 206 ResourceSet resourceSet = new ResourceSetImpl(); 207 207 208 -// Register the defaultresource factory -- only needed for stand-alone!209 - //thistells EMF touseXML to savehe model210 - resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(211 - Resource.Factory.Registry.DEFAULT_EXTENSION, new SCTResourceFactoryImpl());207 +// Register the resource factory -- only needed for stand-alone! 208 +SctStandaloneSetup.doSetup(); 209 + 210 + 212 212 // Get the URI of the model file. 213 213 URI fileURI = URI.createFileURI(new File("myABO.sct").getAbsolutePath()); 214 214 ... ... @@ -226,18 +226,172 @@ 226 226 /* error handling */ 227 227 } 228 228 {{/code}} 228 + 229 +{{info title="File Extensions"}} 230 +File extensions are important! They define the parser/serializer that EMF uses. Always use the file extension that is defined for a particular model. 231 +{{/info}} 229 229 ))) 233 +{{/layout-cell}} 234 +{{/layout-section}} 230 230 236 +{{layout-section ac:type="two_right_sidebar"}} 237 +{{layout-cell}} 231 231 ==== Model Creation Task ==== 232 232 233 - Withtheseinformationoutoftheway,onwegotosome modelcreation:240 +You are now equipped with the fundamentals you need to create models programmatically. Let's try it: 234 234 235 -1. Programmatically create a valid model of ABO in the {{code language="none"}}main(){{/code}} method. 236 -1. 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. 237 -1. Execute the main method. 238 -1. Inspect your SCT file. 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.) 247 + 248 +{{note title="Kext Warning"}} 249 +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. 250 +{{/note}} 251 +))) 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. 239 239 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. 240 240 260 + 261 +{{/layout-cell}} 262 + 263 +{{layout-cell}} 264 +{{code language="java" title="Root.sct"}} 265 +scchart Root { 266 + initial state Init 267 + --> Init with true; 268 +} 269 +{{/code}} 270 + 271 +[[image:attach:RunConfiguration.png]] 272 +{{/layout-cell}} 273 +{{/layout-section}} 274 + 275 +{{layout-section ac:type="two_right_sidebar"}} 276 +{{layout-cell}} 277 += Model-to-Model Transformation with KiCo = 278 + 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. 280 + 281 +== Creating a new Transformation == 282 + 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. :) 284 + 285 + 286 + 287 +Transformation Creation Task 288 + 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//. 294 +1. ((( 295 +Now, you should have a class similar to the following one. 296 + 297 +{{code language="java"}} 298 +package tutorial.transformation 299 + 300 +import de.cau.cs.kieler.kico.transformation.AbstractProductionTransformation 301 + 302 +class DoubleStates extends AbstractProductionTransformation { 303 + 304 + override getProducedFeatureId() { 305 + throw new UnsupportedOperationException("TODO: auto-generated method stub") 306 + } 307 + 308 + override getId() { 309 + throw new UnsupportedOperationException("TODO: auto-generated method stub") 310 + } 311 + 312 +} 313 +{{/code}} 314 +))) 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**. 317 + 318 +{{info title="Programming Guidelines"}} 319 +You should really think about some constants here. You can also look at the sccharts transformation and features constants in the sccharts plugin. 320 +{{/info}} 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 + 336 + 337 +{{/layout-cell}} 338 + 339 +{{layout-cell}} 340 +[[image:attach:KielerSCTEditor.png]] 341 + 342 + 343 + 344 + 345 + 346 + 347 + 348 + 349 + 350 + 351 + 352 + 353 + 354 + 355 + 356 + 357 + 358 + 359 + 360 + 361 + 362 + 363 + 364 + 365 + 366 + 367 + 368 + 369 + 370 + 371 + 372 + 373 + 374 + 375 + 376 + 377 + 378 + 379 + 380 + 381 + 382 + 383 + 384 + 385 + 386 + 387 + 388 +[[image:attach:KielerSCTEditorOwnTransformation.png]] 389 +{{/layout-cell}} 390 +{{/layout-section}} 391 + 392 +{{layout-section ac:type="single"}} 393 +{{layout-cell}} 241 241 = Transforming SCCharts = 242 242 243 243 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.
- Confluence.Code.ConfluencePageClass[0]
-
- Id
-
... ... @@ -1,1 +1,1 @@ 1 -168103 161 +16810368 - URL
-
... ... @@ -1,1 +1,1 @@ 1 -https://rtsys.informatik.uni-kiel.de/confluence//wiki/spaces/TUT/pages/168103 16/SCCharts Development1 +https://rtsys.informatik.uni-kiel.de/confluence//wiki/spaces/TUT/pages/16810368/SCCharts Development