我正在使用 EMF 模型,需要复制这些模型。我的模型由三个元模型的相互关联的实例组成,其中之一就是 Ecore 本身。到目前为止,一切都很好。
但是,在复制这些模型时(我按照通常的协议(protocol)使用 EcoreUtil.Copier.copyAll 来复制),模型的某些部分不会被复制。具体来说,Ecore 实例包含许多 EGenericType
实例(因为存在引用和属性,并且这些引用和属性是使用 EGenericType
实例自动设置以显示其类型的)。复制的结果包含所有内容,但这些 EGenericType
实例除外。
我也查遍了 EMF 源代码,但无法弄清楚问题出在哪里。我查看了 EcoreUtil.Copier 的源代码,它检查每个结构特征是否可更改且未派生,以决定是否实际复制它。对于对 EGenericType
的引用,此条件成立,因此应将其复制为包含引用。
有趣的是,复制的结果确实在对象图中的所有正确位置包含 EGenericType
的复制实例。但是,这些未映射到复印机中,因此似乎不是通过调用 EcoreUtil.Copier.copy
一路创建的,而是隐式创建的。
创建这些内容时有什么想法以及如何让它们显示在复印机 map 中吗?
非常感谢,
史蒂芬
最佳答案
好的,所以我已经使用调试器对此进行了更深入的研究,并且我想我现在明白发生了什么:
本质上,ETypedElement
(包含类型和泛型类型)的契约有点松散:eType
和 eGenericType
都不是标记为派生,但根据情况,其中一个将从另一个派生。
具体来说,如果您设置 ETypedElement
的 eType
,则会隐式创建一个新的 eGenericType
。同样,如果您设置eGenericType
,这将隐式地将eType
设置为此泛型类型的删除。
不幸的是,当 ETypedElement
显式设置其 eType
时,此行为会使 EcoreUtil.Copier
感到困惑。在这种情况下,会发生以下情况:
EcoreUtil.Copier.copy
创建ETypedElement
的新实例,然后开始复制其所有功能。当它到达
eType
功能时,它此时不会复制它,因为eType
不是一个包含引用(出于明显的原因) .接下来是
eGenericType
,它是一个包含引用。但是,它所做的第一件事是检查原始ETypedElement
中是否设置了该值。对于eGenericType
和eType
,此检查已进行自定义,以确保两者中只有一个实际返回true
。因此,对于我们的ETypedElement
,isSetEType()
返回true
且isSetEGenericType()
返回true
。因此,copyContainment()
决定没有任何内容可复制并继续。当
copy()
或copyAll()
返回时,eType
和eGenericType
都不再存在。 code> 已为新创建的对象设置。我们现在调用copyReferences()
。这最终将尝试复制
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/