我正在XTend中构建一个代码生成器,我已经有了一个输入模型和元模型.也就是说,我使用ATL为我的XTend代码生成器生成输入模型(作为转换序列的一部分,逐渐降低抽象级别,而不是一次性;这就是我不使用xtext创建语法的原因) .
所以要很清楚,我的代码生成器输入模型是XMI格式的文件,而不是在XTEXT项目的语法(即使不使用)!而且我认为这会给我带来麻烦/困惑.
我使用现有模型创建了一个新的XText项目,右键单击.text文件,运行为,生成人工制品,然后我对mwe2文件执行了相同的操作.
下一步是什么,我做得对吗?如何启动代码生成器?所有示例都来自您使用XText创建DSL的POV.我有一个EMF元模型,以及一个基于XMI的实例.如何使用XTend进一步处理?
任何提示或指向教程的指针都是有帮助的.
解:
该解决方案是为斯文在我接受的答案建议,而且我想指出的是您需要使用的genmodel从你的元模型生成Java工件.此链接显示了如何:http://www.vogella.com/articles/EclipseEMF/article.html,请参阅第4节.这可能看起来太符合逻辑,但我认为无论如何都值得注意.
我仍然是EMF的新手,所以也许我的问题没有意义,或者我假设错了.
我正在开发一个模型驱动的项目,所以我定义了一个ecore元模型并生成了关联代码.现在我正在尝试进行单元测试,我需要能够测试对象之间的相等性,尤其是在扩展EObject的对象之间.
我尝试使用EcoreUtil.equals()来进行测试,但它总是返回false,因为我的对象包含列表(类EList)中的引用,这些引用没有以相同的方式排序.但是,我在我的元模型中明确定义了引用不是有序的:我想使用它们更像Set than List.
所以,我最终决定在我的genereated*Impl Class中实现我自己的equals方法,即使它在javadoc中不鼓励,但它有另一种方式,更优雅,测试EMF对象之间的结构相等而不考虑顺序名单?
谢谢!
我正在开发EMF模型和具有不同视图的UI.我还使用EMF生成的编辑器.
每个元素都有不同的属性,可以在Properties-View中显示.但是特别是在编写大量文本(元素的描述)时,我不想在Properties-View的小行中编辑这个属性.我想在标准编辑器中编辑此属性,我可以使用编辑器的所有好处.我该如何管理?
编辑:我能想到的一种可能的方法是:使用属性内容创建Temp-File,在编辑器中打开此文件,在保存文件后读取保存的内容(我还不知道如何触发属性 - 保存文件时更新)并删除文件.
根据EMF FAQ,可以在EMF中创建一个Map:
EMap基本上是java.util.Map $ Entry实例的List.因此,要创建Map,您需要首先按照以下步骤为地图条目建模:
- 创建一个名为[Type1]的EClass到[Type2] Map,其中[Type1]表示键的类型,[Type2]表示值的类型.
- 将新创建的EClass的Instance Class Name属性设置为java.util.Map $ Entry.
- 创建名为"key"的EAttribute或EReference,并为其设置EDataType或EClass.
- 创建一个名为"value"的EAttribute或EReference,并为其设置EDataType或EClass.
现在,当您使用此映射条目类作为其EClass创建一个EReference时,EMF代码生成器将检测此特殊情况并为您生成正确类型的EMap getter/setter,而不是正常的EList getter/setter.
我可以在Xcore模型中使用它吗?我不确定步骤#2在Xcore中是否可行,或者它是否支持地图.
我目前正在尝试使用Maven构建我的项目.当我尝试生成源时,EMF会出现问题.
我做了很多关于如何触发构建过程的研究,以便在已经存在.genmodel时生成源.但是,我没有找到任何关于如何使用Maven的参考.显然,有一个maven-plugin,即maven-emfgen-plugin,但似乎已经过时了.当我尝试在这个站点提供的剪切时,我得到的是一个失败,它告诉我不再支持我的eclipse版本.我在下面添加了确切的错误消息.
现在我的确切问题是:
此致,拉尔斯
错误:[错误]无法在项目org.emoflon.ibex.tgg.editor上执行目标net.sf.mapasuta.build.maven.plugins:maven-emfgen-plugin:1.1:genmodel(generate-mm-sources):Eclipse版本4.6.2尚不支持. - > [帮助1]
我有一个传递字符串和 EMF EObject 的 Java 方法。该字符串是 EObject 的属性名称。例如,如果传递“foo”和EObject eobj,则需要访问eobj.getFoo()。我知道如何从 EAttibute 的 featureID 中获取其值,但似乎找不到通过属性名称获取它的方法。这可能吗?
我知道这样一个事实,即在涉及继承时,我无法在基于 ecore 的模型中整体覆盖或重新定义属性。但是我可以以某种方式为现有的继承属性分配一个新值吗?
例如,A 类定义了一个字符串的属性名称,默认值设置为'defaultA'。B 类继承自 A 类,名称应具有值“defaultB”。
我试图在 B 类中重新实现具有相同名称和数据类型的属性,但我无法从中创建 genmodel(“可能没有两个名为 'name' 的特征”)。
甚至无法更改继承属性的值吗?
好的,所以在 Java 中这是可能的:
import org.eclipse.emf.common.util.Enumerator;
public enum MyEnum implements Enumerator {
LITERAL1(0, "Name", "Literal", "custom1", "custom2", "custom3"),
LITERAL2(0, "Name", "Literal", "custom1", "custom2", "custom3"),
LITERAL3(0, "Name", "Literal", "custom1", "custom2", "custom3"),
LITERAL4(0, "Name", "Literal", "custom1", "custom2", "custom3");
public static final int LITERAL1_VALUE = 0;
public static final int LITERAL2_VALUE = 1;
public static final int LITERAL3_VALUE = 2;
public static final int LITERAL4_VALUE = 3;
private static final MyEnum[] VALUES_ARRAY =
new MyEnum[] {
LITERAL1,
LITERAL2,
LITERAL3,
LITERAL4,
};
public static final …Run Code Online (Sandbox Code Playgroud) 情况
我有一个Eclipse RCP应用程序,用于管理EMF模型中的应用程序项目.
通过将它们序列化为XMI格式来保存这些项目.然后可以将这些文件加载回模型中.我使用标准的EMF工具(例如Resource).
由于模型重构,以下内容已更改:
MyClass带有属性的EClass Name(带大写字母).<MyClass Name="My Class Name 1" ... />与
MyClass继承自MyBaseClass,带属性name(没有大写字母).MyClass不再具有Name属性,因为EMF不允许这两者.这是有意义的,因为它会碰到例如getter方法getName().问题
如何将旧的 XMI项目文件加载到我的新模型中?
直到这个问题,我能够:
但是,在这种情况下,我无法首先加载XMI文件:模型name一方面未命中属性,另一方面无法识别(因而忽略)属性Name.
题
实现此向后兼容性支持的正确位置是什么?
我假设我应该处理反序列化过程或XML映射.
解决方案的约束是:
<MyClass name="..." ... />必须正确加载新项目(包含).