eclipse - 使用 ECoreUtil.Copier 复制 EGenericType 实例

标签 eclipse eclipse-emf emf eclipse-emf-ecore

我正在使用 EMF 模型,需要复制这些模型。我的模型由三个元模型的相互关联的实例组成,其中之一就是 Ecore 本身。到目前为止,一切都很好。

但是,在复制这些模型时(我按照通常的协议(protocol)使用 EcoreUtil.Copier.copyAll 来复制),模型的某些部分不会被复制。具体来说,Ecore 实例包含许多 EGenericType 实例(因为存在引用和属性,并且这些引用和属性是使用 EGenericType 实例自动设置以显示其类型的)。复制的结果包含所有内容,但这些 EGenericType 实例除外。

我也查遍了 EMF 源代码,但无法弄清楚问题出在哪里。我查看了 EcoreUtil.Copier 的源代码,它检查每个结构特征是否可更改且未派生,以决定是否实际复制它。对于对 EGenericType 的引用,此条件成立,因此应将其复制为包含引用。

有趣的是,复制的结果确实在对象图中的所有正确位置包含 EGenericType 的复制实例。但是,这些未映射到复印机中,因此似乎不是通过调用 EcoreUtil.Copier.copy 一路创建的,而是隐式创建的。

创建这些内容时有什么想法以及如何让它们显示在复印机 map 中吗?

非常感谢,

史蒂芬

最佳答案

好的,所以我已经使用调试器对此进行了更深入的研究,并且我想我现在明白发生了什么:

本质上,ETypedElement(包含类型和泛型类型)的契约有点松散:eTypeeGenericType 都不是标记为派生,但根据情况,其中一个将从另一个派生。

具体来说,如果您设置 ETypedElementeType,则会隐式创建一个新的 eGenericType。同样,如果您设置eGenericType,这将隐式地将eType设置为此泛型类型的删除。

不幸的是,当 ETypedElement 显式设置其 eType 时,此行为会使 EcoreUtil.Copier 感到困惑。在这种情况下,会发生以下情况:

  1. EcoreUtil.Copier.copy 创建 ETypedElement 的新实例,然后开始复制其所有功能。

  2. 当它到达eType功能时,它此时不会复制它,因为eType不是一个包含引用(出于明显的原因) .

  3. 接下来是eGenericType,它是一个包含引用。但是,它所做的第一件事是检查原始 ETypedElement 中是否设置了该值。对于 eGenericTypeeType,此检查已进行自定义,以确保两者中只有一个实际返回 true。因此,对于我们的 ETypedElementisSetEType() 返回 trueisSetEGenericType() 返回 true 。因此,copyContainment() 决定没有任何内容可复制并继续。

  4. copy()copyAll() 返回时,eTypeeGenericType 都不再存在。 code> 已为新创建的对象设置。我们现在调用copyReferences()

  5. 这最终将尝试复制eType引用(请记住,这被标记为不是包含引用)。 isSetType() 返回 true,因此 copyReference() 继续并复制类型信息。然后,复制对象中 eType 的 setter 创建 EGenericType 的新实例,但 EcoreUtil.Copier 永远看不到它。

因此,如果我想获取原始 EGenericType 实例及其副本以显示在复制映射中,我需要对 EcoreUtil.Copier 进行子类化并重写 copyReference()copyContainment() 来处理这种特殊情况。

关于eclipse - 使用 ECoreUtil.Copier 复制 EGenericType 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46323548/

相关文章:

eclipse - 启动 DroolsTest aka "Hello World"失败

java - 与 SQL Server : login failed for user x 的 JDBC 连接

android - 为什么 Eclipse 的 Android 设备选择器不显示我的 Android 设备?

java - EMF:生成编辑器代码

java - 通过 Gradle 生成 EMF 模型

Eclipse 错误弹出窗口 : "Certificate Problem"

java - 使用 EMF 解析字符串格式的 XML

java - EList (EMF) 的更改行为

java - 单独的接口(interface)和实现 emf ecore

eclipse - 使用 Eclipse 建模框架开发应用程序