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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
 def : OclVoid : PSMM!PrimitiveType = OclUndefined;
Pour la deuxième question, j'ai procédé comme suit:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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