Acceleo M2T(无法访问我的 matamodele 属性,引用 ..)
Acceleo M2T (Cannot access to the my matamodele attributes , references .. )
我正在 Acceleo(在 Obeo Designer 中)开发 M2T 生成器。
我已经基于 *.ecore (pfe.ecore) 创建了我的元模型,然后我在运行时 (MyModels.pfe) 使用 Sirius 创建了一个实例模型。
现在我正在尝试使用 Accelo 生成 MyModels.pfe 的 java 代码 - class 根是 InterationSpatiale。
我想为图表中的每个 classes 生成一个 *.java
这是我的 generate.mtl 文件
[comment encoding = UTF-8 /]
[module generate('http://www.example.org/pfe')/]
[template public generateElement(myinteractionspatiale :
InteractionSpatiale)]
[comment @main/]
[file (myinteractionspatiale.name.concat('.java'), false, 'UTF-8')]
public class [myinteractionspatiale.name/] {
[for (aEAttribute : ecore :: EAttribute |
myinteractionspatiale.eClass().eAllAttributes)]
[aEAttribute.eType.instanceClassName/] [aEAttribute.name/];
[/for]
[for (aEReference : EReference
|myinteractionspatiale.eClass().eAllReferences)]
[aEReference.eReferenceType.name/] [aEReference.name/];
[/for]
[for (aEAttribute : EAttribute |
myinteractionspatiale.eClass().eAllAttributes)]
public [aEAttribute.eType.instanceClassName/]
get[aEAttribute.name.toUpperFirst()/] () {
return this.[aEAttribute.name/];
}
[/for]
[for (aEAttribute : EAttribute |
myinteractionspatiale.eClass().eAllAttributes)]
public void set[aEAttribute.name.toUpperFirst()/]
([aEAttribute.eType.instanceClassName/] [aEAttribute.name/]) {
this.[aEAttribute.name/] = [aEAttribute.name/];
}
[/for]
[for (aEReference : EReference |
myinteractionspatiale.eClass().eAllReferences)]
public [aEReference.eReferenceType.name/]
get[aEReference.name.toUpperFirst()/] () {
return this.[aEReference.name/];
}
[/for]
[for (aEReference : EReference |
myinteractionspatiale.eClass().eAllReferences)]
public void set[aEReference.name.toUpperFirst()/]
([aEReference.eReferenceType.name/] [aEReference.name/]) {
this.[aEReference.name/] = [aEReference.name/];}
[/for]
[for (aEOperation : EOperation |
myinteractionspatiale.eClass().eAllOperations)]
public [aEOperation.eType.instanceClassName/] [aEOperation.name/] () {
}
[/for]
}
[/file]
[/template]
我得到的生成文件App.java是
public class App {
java.lang.String name;
Entite entite;
Evenement evenement;
SystemeCoordonnees systemecoordonnees;
TacheSysteme tachesysteme;
RelationSpatiale relationspatiale;
InteractionSpatiale interactionspatiale;
public java.lang.String getName () {
return this.name;
}
public void setName (java.lang.String name) {
this.name = name;
}
public Entite getEntite () {
return this.entite;
}
public Evenement getEvenement () {
return this.evenement;
}
public SystemeCoordonnees getSystemecoordonnees () {
return this.systemecoordonnees;
}
public TacheSysteme getTachesysteme () {
return this.tachesysteme;
}
public RelationSpatiale getRelationspatiale () {
return this.relationspatiale;
}
public InteractionSpatiale getInteractionspatiale () {
return this.interactionspatiale;
}
public void setEntite (Entite entite) {
this.entite = entite;
}
public void setEvenement (Evenement evenement) {
this.evenement = evenement;
}
public void setSystemecoordonnees (SystemeCoordonnees systemecoordonnees)
{
this.systemecoordonnees = systemecoordonnees;
}
public void setTachesysteme (TacheSysteme tachesysteme) {
this.tachesysteme = tachesysteme;
}
public void setRelationspatiale (RelationSpatiale relationspatiale) {
this.relationspatiale = relationspatiale;
}
public void setInteractionspatiale (InteractionSpatiale
interactionspatiale) {
this.interactionspatiale = interactionspatiale;
}
}
但是我真正想要的是为模型MyModels.pfe的每个class创建一个文件,而不仅仅是模型java的文件根 class.
请检查 MyModels.pfe 以了解我想要生成的内容。
ScreenShot of MyModels.pfe
非常感谢任何有关如何迭代并为每个 class 及其属性和值[EFixe.java、EMobile.java ...][=13 生成文件的帮助=]
aEClass : InteractionSpatiale
具有误导性,您应该将其命名为类似 myInteractionSpatiale 的名称,因为您的参数是 InteractionSpatiale 的一个实例(在 Java/Acceleo 键入的意义上)。
在 EMF 类型的意义上,您的 myInteractionSpatiale 是一个 EObject,它是您在元模型中定义的 EClass“InteractionSpatiale”的一个实例 pfe.ecore
我了解到您想迭代此 EClass 的属性:
myInteractionSpatiale.eClass().getAllAttributes()
最后一条评论的替代方案(不是最优化的)
对于每个 class ,我在主模块中创建一个 let 块来调用不同的模板:
[let p : EFixe = myInteractionSpatiale.entite->any(oclIsKindOf(EFixe)) ]
[generateEntiteFixe (p)/]
[/let]
此致
我正在 Acceleo(在 Obeo Designer 中)开发 M2T 生成器。 我已经基于 *.ecore (pfe.ecore) 创建了我的元模型,然后我在运行时 (MyModels.pfe) 使用 Sirius 创建了一个实例模型。
现在我正在尝试使用 Accelo 生成 MyModels.pfe 的 java 代码 - class 根是 InterationSpatiale。
我想为图表中的每个 classes 生成一个 *.java 这是我的 generate.mtl 文件
[comment encoding = UTF-8 /]
[module generate('http://www.example.org/pfe')/]
[template public generateElement(myinteractionspatiale :
InteractionSpatiale)]
[comment @main/]
[file (myinteractionspatiale.name.concat('.java'), false, 'UTF-8')]
public class [myinteractionspatiale.name/] {
[for (aEAttribute : ecore :: EAttribute |
myinteractionspatiale.eClass().eAllAttributes)]
[aEAttribute.eType.instanceClassName/] [aEAttribute.name/];
[/for]
[for (aEReference : EReference
|myinteractionspatiale.eClass().eAllReferences)]
[aEReference.eReferenceType.name/] [aEReference.name/];
[/for]
[for (aEAttribute : EAttribute |
myinteractionspatiale.eClass().eAllAttributes)]
public [aEAttribute.eType.instanceClassName/]
get[aEAttribute.name.toUpperFirst()/] () {
return this.[aEAttribute.name/];
}
[/for]
[for (aEAttribute : EAttribute |
myinteractionspatiale.eClass().eAllAttributes)]
public void set[aEAttribute.name.toUpperFirst()/]
([aEAttribute.eType.instanceClassName/] [aEAttribute.name/]) {
this.[aEAttribute.name/] = [aEAttribute.name/];
}
[/for]
[for (aEReference : EReference |
myinteractionspatiale.eClass().eAllReferences)]
public [aEReference.eReferenceType.name/]
get[aEReference.name.toUpperFirst()/] () {
return this.[aEReference.name/];
}
[/for]
[for (aEReference : EReference |
myinteractionspatiale.eClass().eAllReferences)]
public void set[aEReference.name.toUpperFirst()/]
([aEReference.eReferenceType.name/] [aEReference.name/]) {
this.[aEReference.name/] = [aEReference.name/];}
[/for]
[for (aEOperation : EOperation |
myinteractionspatiale.eClass().eAllOperations)]
public [aEOperation.eType.instanceClassName/] [aEOperation.name/] () {
}
[/for]
}
[/file]
[/template]
我得到的生成文件App.java是
public class App {
java.lang.String name;
Entite entite;
Evenement evenement;
SystemeCoordonnees systemecoordonnees;
TacheSysteme tachesysteme;
RelationSpatiale relationspatiale;
InteractionSpatiale interactionspatiale;
public java.lang.String getName () {
return this.name;
}
public void setName (java.lang.String name) {
this.name = name;
}
public Entite getEntite () {
return this.entite;
}
public Evenement getEvenement () {
return this.evenement;
}
public SystemeCoordonnees getSystemecoordonnees () {
return this.systemecoordonnees;
}
public TacheSysteme getTachesysteme () {
return this.tachesysteme;
}
public RelationSpatiale getRelationspatiale () {
return this.relationspatiale;
}
public InteractionSpatiale getInteractionspatiale () {
return this.interactionspatiale;
}
public void setEntite (Entite entite) {
this.entite = entite;
}
public void setEvenement (Evenement evenement) {
this.evenement = evenement;
}
public void setSystemecoordonnees (SystemeCoordonnees systemecoordonnees)
{
this.systemecoordonnees = systemecoordonnees;
}
public void setTachesysteme (TacheSysteme tachesysteme) {
this.tachesysteme = tachesysteme;
}
public void setRelationspatiale (RelationSpatiale relationspatiale) {
this.relationspatiale = relationspatiale;
}
public void setInteractionspatiale (InteractionSpatiale
interactionspatiale) {
this.interactionspatiale = interactionspatiale;
}
}
但是我真正想要的是为模型MyModels.pfe的每个class创建一个文件,而不仅仅是模型java的文件根 class.
请检查 MyModels.pfe 以了解我想要生成的内容。 ScreenShot of MyModels.pfe
非常感谢任何有关如何迭代并为每个 class 及其属性和值[EFixe.java、EMobile.java ...][=13 生成文件的帮助=]
aEClass : InteractionSpatiale
具有误导性,您应该将其命名为类似 myInteractionSpatiale 的名称,因为您的参数是 InteractionSpatiale 的一个实例(在 Java/Acceleo 键入的意义上)。
在 EMF 类型的意义上,您的 myInteractionSpatiale 是一个 EObject,它是您在元模型中定义的 EClass“InteractionSpatiale”的一个实例 pfe.ecore
我了解到您想迭代此 EClass 的属性:
myInteractionSpatiale.eClass().getAllAttributes()
最后一条评论的替代方案(不是最优化的)
对于每个 class ,我在主模块中创建一个 let 块来调用不同的模板:
[let p : EFixe = myInteractionSpatiale.entite->any(oclIsKindOf(EFixe)) ]
[generateEntiteFixe (p)/]
[/let]
此致