Salut
En essayant de réaliser une transformation depuis méta-modèle PIMM vers un méta-modèle PSMM, j'ai rencontré deux difficultés:
1- Comment peut-on inclure et utiliser les primitivetypes dans une règle ATL?
2- Est ce qu'il existe un type général (comme le type Object en modélisation UML) qu'on peut utiliser dans une règle ATL (j'ai pensé à OclAny mais je n'ai pas réussi à le faire fonctionner)?
Pour la première question, j'ai fait comme suit:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| helper def : primitiveTypesPackage : PSMM!Package = OclUndefined;
-- j'ai créé un package de primitivetypes
rule addPrimitiveTypesPackage() {
to
ptPac : PSMM!Package (
name <- 'PrimitiveTypes'
),
stringType : PSMM!PrimitiveType (-- -> (thisModule.primitiveTypesPackage.classifiers)(
name <- 'String'
),
integerType : PSMM!PrimitiveType (-- -> (thisModule.primitiveTypesPackage.classifiers)(
name <- 'Integer'
),
booleanType : PSMM!PrimitiveType (-- -> (thisModule.primitiveTypesPackage.classifiers)(
name <- 'Boolean'
),
commentType : PSMM!PrimitiveType (-- -> (thisModule.primitiveTypesPackage.classifiers)(
name <- 'Real'
),
do {
stringType.package <- thisModule.primitiveTypesPackage;
integerType.package <- thisModule.primitiveTypesPackage;
booleanType.package <- thisModule.primitiveTypesPackage;
commentType.package <- thisModule.primitiveTypesPackage;
}
} |
et j'ai défini le helper suivant pour accéder aux types créés:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| helper def : getPrimitiveType(typeName : String) : PSMM!PrimitiveType = PSMM!PrimitiveType.allInstances()->select(t | t.name=typeName)->first();
rule createProperties() {
to
prop: PSMM!Property(
name <- 'itsGroup',
lower <- 1,
upper <- 1,
visibility <- #public,
type <- thisModule.getPrimitiveType('String')
),
...
} |
Est ce que cette façon de faire est correcte? si oui, comment puis-je indiquer les pathmaps correspondant:
1 2 3 4
| 'String' -> 'pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String'
'Integer' -> 'pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer'
'Boolean' -> 'pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean'
'Comment' -> 'pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String' |
Ceci dans le but d'obtenir dans le fichier XMI représentant le modèle cible, le paramètre href correspondant au primitivetype utilisé; par exemple, si 'String' est utilisé, je dois avoir dans le fichier XMI représentant le modèle cible: href = 'pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String'
NB: - Est-il possible de procéder autrement : importer les primitiveTypes à l'aide d'une règle ATL et accéder à ces types, au lieu de créer ces types comme je l'ai fait? si oui, comment?
- Si je veux utiliser OclVoid pour indiquer qu'une opération ne retourne rien, est ce que le helper suivant est correct?
def : OclVoid : PSMM!PrimitiveType = OclUndefined;
Pour la deuxième question, j'ai procédé comme suit:
1 2 3 4 5 6 7 8 9 10 11 12 13
| rule createProperties() {
to
prop: PSMM!Property(
name <- 'valuesToReturn',
visibility <- #private,
lower <- 0,
upper <- -1,
type <- OclAny
),
...
} |
Cependant ceci n'est pas acceptable et j'obtiens l'erreur suivante:
org.eclipse.m2m.atl.engine.emfvm.VMException: java.lang.Class cannot be cast to org.eclipse.uml2.uml.Type
Comment puis-je affecté un type général à une propriété pour indiquer qu'elle peut recevoir n'importe qu'elle valeur?
Merci d'avance
Partager