-
Notifications
You must be signed in to change notification settings - Fork 0
3. Generator
The creation process is divided into two steps to avoid problems with cyclic data type references. First, all packages and types are created, including their inheritance and realization relations. Then, in a second step, all operations, references, and attributes are created. This step also created the data type package hierarchy, which contains all EDataType
instances.
The Generator in the package eme.generator
consists out of eight different generator classes a subpackage eme.generator.hierarchies
and a subpackage eme.generator.saving
:
-
EcoreMetamodelGenerator
is the main generator class, it manages the whole generation process and handles the other generator classes. To create an Ecore metamodel from an intermediate model, use this class exclusively, it manages the calls to all other generators. Creating a metamodel can be achieved with the methodgenerateMetamodel()
, which returns aGeneratedEcoreMetamodel
. The main generator class also manages the saving strategy. Initially, the saving strategy is set according to the properties class, but it can be changed during the runtime with the method callchangeSavingStrategy()
. A metamodel is saved (if previously generated) with the methodsaveMetamodel()
. -
GeneratedEcoreMetamodel
is a container class encapsulates generated metamodels. It offers access to the metamodel rootEPackage
through the methodgetRoot()
. The container class can additionally store saving information with aSavingInformation
instance. This is made possible through the methodssetSavingInformation()
andgetSavingInformation()
. The methodisSaved()
checks whether aGeneratedEcoreMetamodel
containsSavingInformation
. -
EPackageGenerator
is the class that generates packages of the metamodel (EPackage objects) from the intermediate model. The functionality of the class is tied to its instance of an intermediate model. The class offers the methodgenerate()
for the creation of a metamodel, which is of typeEPackage
. The method automatically creates Ecore objects for all the contained elements (subpackages, classes, methods etc.) of the intermediate model. -
EClassifierGenerator
is used by theEPackageGenerator
to generate the content of the packages. It offers three methods:generateEClassifer()
generates anEClassifier
from anExtractedType
. If the type already generated, it simply returns theEClassifier
of the type.completeEClassifiers()
finishes theEClassifier
generation by adding methods and attributes to the classes. Also, it sorts the external types.generateDummy()
generates an empty dummyEClass
with a custom name. -
EMemberGenerator
is used by theEClassifierGenerator
to generate the methods and attributes of the classifiers. It offers two methods. Both take anExtractedType
and anEClass
as parameters.addOperations()
generatesEOperation
objects for every method of theExtractedType
and adds them to theEClass
.addAttributes()
generatesEStructuralFeature
objects for every attribute of theExtractedType
and adds them to theEClass
. Structural features can be anEAttribute
or anEReference
. -
EDataTypeGenerator
is used by the classesEClassifierGenerator
andEOperationGenerator
to manage data types. The class stores a map that maps data type names to the data types themselves. It also creates and stores new data types. It offers the methodsaddDataType()
,addException()
,addGenericArguments()
andaddTypeParameters()
.addDataType()
adds either anEClassifier
(for normal data types) or anEGenericType
(for type parameters) to anETypedElement
from anExtractedDataType
. If it adds anEClassifier
there are three possibilities what thatEClassifier
can be in that context:- The
EClassifier
is an already created classifier (class, interface or enumeration). - The
EClassifier
is a basicEDataType
which has an Ecore equivalent (e.g.int
,java.lang.Integer
orjava.lang.Object
). - The
EClassifier
is an external data type without an Ecore equivalent and is created and stored as newEDataType
which is contained in the root package.
The method
addException()
adds an exception from anExtractedDataType
to anEOperations
. It works similar to the methodaddDataType()
.The method
addGenericArguments()
adds all generic arguments with their own generic arguments from anExtractedDataType
to anEGenericType
. This method is separated from the methodgenerate()
because generic type arguments are added to theEGenericType
instead of theEType
of anETypedElement
, even if the data type is not anEGenericType
.The method
addTypeParameters()
creates all type parameters and their bounds of anExtractedType
and adds them to anEClassifier
.To use the
EDataTypeGenerator
one has to call the constructor with three parameters. The first one is the intermediate model. The second is the list of createdEClassifier
objects of theEPackageGenerator
. This is needed to check whether a data type is an already createdEClass
. The third parameter is theExternalTypeHierarchy
object, which is needed to manage the containment of external types. - The
-
EPackageHierarchy
is one of the three hierarchy classes in the subpackageeme.generator.hierarchies
. It builds anEPackage
hierarchy in a specific base package. The hierarchy is built from EClassifiers that are added to the class with an array of package names. AnEClassifier
can be added with the methodadd(EClassifier dataType, String[] path)
, which automatically manages the package creation. The methodsort()
sorts the content of the external type package hierarchy alphabetically. It has two subclasses that are also in the packageeme.generator.hierarchies
:-
InnerTypeHierarchy
builds an inner type package hierarchy in a specific base package. This is used to manage nested types. The hierarchy is built from inner types that are added to the class with their relative path to the base package. AnEClassifier
can be added with the methodadd(EClassifier dataType, String relativePath)
. -
ExternalTypeHierarchy
builds the external data type package hierarchy in the root package. It adds a data type package to the root package and contains every externalEDataType
in a package hierarchy in the data type package to avoid name collisions. An external data type can be added with the methodadd(EDataType dataType)
.
-
-
SelectionHelper
contains the check methods. These methods check for a specific model element whether it may be generated. This depends on whether the element is selected or not and whether the properties allow the generation of such elements. Whenever an element must not be generated, theSelectionHelper
stores that information. The methodgenerateReport()
then allows producing a report about what kind of elements were not generated and how many of them were not generated. The report distinguishes among Packages, Interfaces, Classes, Enumerations, Constructors, Methods, and Attributes. -
EMFProjectGenerator
can be used by saving strategies to create an empty EMF project in for the Eclipse IDE. -
The subpackage
eme.generator.saving
is explained in the next chapter.