ObjectModel
authors : | Arnaud Thimel |
---|---|
Florian Desbois | |
Jean Couteau | |
contact : | eugene-devel@list.nuiton.org or eugene-users@list.nuiton.org |
revision : | $Revision$ |
date : | $Date$ |
- Note
- This document does not take into account modifications made on EUGene 2.0 version
TODO : revoir cette documentation
Introduction
ObjectModelGenerator generator is aimed to read and analyse object models and generate code from them. In UML, an object model is represented by a class diagram. This object models vision being wildly spread, it is ObjectModelGenerator's basis (please note that this is not mandatory).
Let start from the principle that we got a model (class diagram) created from an XMI (XML Metadata Interchange format modeling tool.
Code generation is made into three steps :
- XMI purification into an XML code that keeps only useful information ;
- Simplified model put into memory ;
- Templates used / code generation.
XMI model purification
Most of the modelign tools describe their models using XMI, but XMI is too verbose to be easily understood.
Eugene uses XSLT transformation allowing to get a purified XML describing the model and keeping the main information.
This intermediate model insure EUGene's stability and durability as it is always based on its own models and not external models (XMI) that changes too much from a version to another.
If we want to support a new XMI version, for example, we just need to create the appropriate transformation stylesheet.
Amongst the extracted information, we can name :
- Objects (classes, abstract classes, interfaces)
- Attributes (names, type, visibility, ...)
- Relations between classes (all multiplicities, navigability, association classes, ...)
- Operations (name, return type, arguments name and type, thrown exceptions, ...)
- Stereotypes
From the following diagram :
We got the following ObjectModel :
Memory model
Once XMI has been changed into an understandable XML, the model is loaded into memory so that it is generated.
The instanciated model is based on the following class diagram (meta-model) :
Available interfaces for the generators are the following :
ObjectModelGenerator :
Consolidate model with a properties file
You can use another properties file with same name as your model to consolidate your model by adding sometagvalues and stereotypes, their will be merge into the memory model.
For example, with a model file model.zargo, use then a file named model.properties.
This file is useful if you don't like to put all your tagValues and stereotypes into a zargo model when synthetic view of them is not possible.
Howto add tagValues
They can be added at different levels:
- On a complete model
model.tagValue.version=1.0
- on a classifier
org.nuiton.eugene.tutorial.Hotel.tagValue.version=1.0
- on a classifier's attribute
org.nuiton.eugene.tutorial.Hotel.attribute.room.tagValue.version=1.0
- on a classifier's operation
org.nuiton.eugene.tutorial.Hotel.operation.enter.tagValue.version=1.0
Howto add stereotypes
Stereotypes can not be placed on a model, but still
- on a classifier
org.nuiton.eugene.tutorial.Hotel.stereotype=unique
- on a classifier's attribute
org.nuiton.eugene.tutorial.Hotel.attribute.room.stereotype=unique
- on a classifier's operation
org.nuiton.eugene.tutorial.Hotel.operation.enter.stereotype=unique
TODO See how to add more than one stereotype oat a level
Howto discover which tagValues and stereotypes to use
Usage of ModelPropertiesProvider permits to define, list and validate usage of tagValues and stereotypes.
For more informations about this concept see ModelPropertiesProvider
You only need to invoke the available-data goal of the maven plugin
Example :
$ mvn eugene:available-data [INFO] --- eugene-maven-plugin:xxx:available-data (default-cli) @ tutti-persistence --- [INFO] Get datas for data types : [modeltype, writer, modelreader, modeltemplate, tagvalue, stereotype] Found 2 modeltypes : [objectmodel] with implementation 'org.nuiton.eugene.models.object.xml.ObjectModelImpl' [statemodel] with implementation 'org.nuiton.eugene.models.state.xml.StateModelImpl' Found 3 writers : [xmi] with implementation 'org.nuiton.eugene.plugin.writer.XmiChainedFileWriter inputProtocol : xmi outputProtocol : model defaultIncludes : **/*.xmi defaultInputDirectory : src/main/xmi defaultTestInputDirectory : src/test/xmi' [model2Java] with implementation 'org.nuiton.eugene.plugin.writer.ModelChainedFileWriter inputProtocol : model outputProtocol : null defaultIncludes : **/*.*model defaultInputDirectory : src/main/models defaultTestInputDirectory : src/test/models' [zargo2xmi] with implementation 'org.nuiton.eugene.plugin.writer.ZargoChainedFileWriter inputProtocol : zargo outputProtocol : xmi defaultIncludes : **/*.zargo defaultInputDirectory : src/main/xmi defaultTestInputDirectory : src/test/xmi' Found 2 modelreaders : [objectmodel] with implementation 'org.nuiton.eugene.models.object.ObjectModelReader' [statemodel] with implementation 'org.nuiton.eugene.models.state.StateModelReader' Found 5 modeltemplates : [org.nuiton.eugene.java.JavaInterfaceTransformer] with implementation 'org.nuiton.eugene.java.JavaInterfaceTransformer' [org.nuiton.eugene.java.JavaGenerator] with implementation 'org.nuiton.eugene.java.JavaGenerator' [org.nuiton.eugene.java.JavaEnumerationTransformer] with implementation 'org.nuiton.eugene.java.JavaEnumerationTransformer' [org.nuiton.eugene.java.SimpleJavaBeanTransformer] with implementation 'org.nuiton.eugene.java.SimpleJavaBeanTransformer' [org.nuiton.eugene.java.JavaBeanTransformer] with implementation 'org.nuiton.eugene.java.JavaBeanTransformer' Found 7 tagvalues in 2 provider(s) : [eugene, java] Provider [eugene] - Found 5 tagvalues : [constantPrefix] targets : 'ObjectModel, ObjectModelClassifier' : Sets the prefix of any constant to be generated for the given class [doNotGenerateBooleanGetMethods] targets : 'ObjectModel, ObjectModelClassifier' : To specify to NOT generate getXXX methods for boolean properties [documentation] targets : 'ObjectModel, ObjectModelElement' : Sets the documentation of a model or any of his elements [i18n] targets : 'ObjectModel, ObjectModelClassifier' : Sets the i18n prefix to use on I18n keys generated [version] targets : 'ObjectModel' : To set the version of the model. Provider [java] - Found 2 tagvalues : [beanSuperClass] targets : 'ObjectModel, ObjectModelClassifier' : To specify a super-class to used on generated bean for a class or any class of a model [noPCS] targets : 'ObjectModel, ObjectModelClassifier' : To specify to not generate any propertyChange code for a class or any class of a model Found 4 stereotypes in 2 provider(s) : [eugene, java] Provider [eugene] - Found 3 stereotypes : [indexed] targets : 'ObjectModelAttribute' : To specify that a attribute is indexed [ordered] targets : 'ObjectModelAttribute' : To specify that a attribute is ordered [skip] targets : 'ObjectModelClassifier' : To specify that a classifier should not been generated. Provider [java] - Found one stereotype : [bean] targets : 'ObjectModelClassifier' : To specify that a class is a JavaBean
Templates application
Each template is itself a generator inheriting from ObjectModelGenerator. All the parts of this generator can be overloaded allowing a strong personalisation of the generators. ObjectModelGenerator's aim is to navigate through the model and on each key element of the model (model, classes, interfaces, classifier, ...) call the appropriate methods. By default, the methods described in the generator are empty, so no code is generated. The templates are aimed to overload those methods and describe the code that will be generated.
The templates can be of all kind because they can generate a different file by model, by interface, by class or even by classifier (common stub to classes and interfaces). Moreover, they can generate every kind of code what so ever : Java, XML, text, C++, ...