Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用emf比较代码?_Java_Eclipse Emf - Fatal编程技术网

Java 使用emf比较代码?

Java 使用emf比较代码?,java,eclipse-emf,Java,Eclipse Emf,我有两个emf模型A和B,其中B与A不同,因为它有一个额外的子节点 现在,我想使用emf比较代码来执行以下操作: 1) 阅读模型A和B并创建模型C,它是A和B的合并模型。基本上,这对应于A+来自B的额外节点 我看过: 但我不知道如何使用以下代码计算最终合并模型: DiffModel diff = CompareUtils.compare(model1, model2, Collections.<String, Object> emptyMap()); CompareUtils.me

我有两个emf模型A和B,其中B与A不同,因为它有一个额外的子节点

现在,我想使用emf比较代码来执行以下操作:

1) 阅读模型A和B并创建模型C,它是A和B的合并模型。基本上,这对应于A+来自B的额外节点

我看过:

但我不知道如何使用以下代码计算最终合并模型:

DiffModel diff = CompareUtils.compare(model1, model2, Collections.<String, Object> emptyMap());
CompareUtils.merge(diff);
即使匹配.eResource()!=空的

我得到这个错误:

org.eclipse.emf.ecore.resource.Resource$IOWrappedException: The object 'statemachine.impl.StateImpl@11ce012 (name: bbbb)' is not contained in a resource.
    at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.endSave(XMLSaveImpl.java:306)
    at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.save(XMLSaveImpl.java:235)
    at org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl.doSave(XMLResourceImpl.java:254)
    at org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl.save(XMLResourceImpl.java:229)
    at org.eclipse.emf.compare.util.ModelUtils.serialize(ModelUtils.java:429)
我已根据此处的文档将区域添加到资源中:

这个州就在这个地区,所以我不明白为什么会有例外……有什么想法吗?

这个怎么样

Model1 targetModel = EcoreUtil.copy(model1);
addResourceToModel(targetModel) // assign the copied model to a resource
MatchModel match = MatchService.doMatch(targetModel, model2,
                    Collections.<String, Object> emptyMap());
DiffModel diff = DiffService.doDiff(match, false);
EList<DiffElement> differences = diff.getDifferences();
for (DiffElement diffElement : differences) {
    MergeService.merge(diffElement, true);
}
Model1 targetModel=EcoreUtil.copy(Model1);
addResourceToModel(targetModel)//将复制的模型分配给资源
MatchModel match=MatchService.doMatch(targetModel,model2,
Collections.emptyMap());
DiffModel diff=DiffService.doDiff(匹配,false);
EList differences=diff.getDifferences();
对于(差异元素:差异){
MergeService.merge(differElement,true);
}
这个怎么样

Model1 targetModel = EcoreUtil.copy(model1);
addResourceToModel(targetModel) // assign the copied model to a resource
MatchModel match = MatchService.doMatch(targetModel, model2,
                    Collections.<String, Object> emptyMap());
DiffModel diff = DiffService.doDiff(match, false);
EList<DiffElement> differences = diff.getDifferences();
for (DiffElement diffElement : differences) {
    MergeService.merge(diffElement, true);
}
Model1 targetModel=EcoreUtil.copy(Model1);
addResourceToModel(targetModel)//将复制的模型分配给资源
MatchModel match=MatchService.doMatch(targetModel,model2,
Collections.emptyMap());
DiffModel diff=DiffService.doDiff(匹配,false);
EList differences=diff.getDifferences();
对于(差异元素:差异){
MergeService.merge(differElement,true);
}
Tul

您获得的堆栈跟踪意味着其中一个“合并”对象未包含在资源中:合并时,我们复制引用状态机(名称为“bbbb”)的对象,然后需要从复制的对象引用此状态机。。。我们引用的状态机(它是从您的其他模型复制的还是直接引用的?您应该进行调试才能看到这一点)本身并不包含在任何资源中

State state02 = StatemachineFactoryImpl.eINSTANCE.createState();
state02.setName("bbbb");
region02.getState().add(state02);
if (state02.eResource() == null) {
    System.out.println("state02 NOT contained in resource!");
    return;
}
这应该确保“bbbb”确实包含在资源中

State state02 = StatemachineFactoryImpl.eINSTANCE.createState();
state02.setName("bbbb");
region02.getState().add(state02);
if (state02.eResource() == null) {
    System.out.println("state02 NOT contained in resource!");
    return;
}
在这一行之后:

MergeService.merge(differences, true);
您能否再次尝试检查“state02.eResource()==null”?如果是,那就是你的问题。否则,您必须确保不会返回:

for (State state : region01.getState()) {
    if (state.eResource() == null) {
       System.err.println(state.getName() + " is not contained in a resource);
       return;
    }
}
图尔

您获得的堆栈跟踪意味着其中一个“合并”对象未包含在资源中:合并时,我们复制引用状态机(名称为“bbbb”)的对象,然后需要从复制的对象引用此状态机。。。我们引用的状态机(它是从您的其他模型复制的还是直接引用的?您应该进行调试才能看到这一点)本身并不包含在任何资源中

State state02 = StatemachineFactoryImpl.eINSTANCE.createState();
state02.setName("bbbb");
region02.getState().add(state02);
if (state02.eResource() == null) {
    System.out.println("state02 NOT contained in resource!");
    return;
}
这应该确保“bbbb”确实包含在资源中

State state02 = StatemachineFactoryImpl.eINSTANCE.createState();
state02.setName("bbbb");
region02.getState().add(state02);
if (state02.eResource() == null) {
    System.out.println("state02 NOT contained in resource!");
    return;
}
在这一行之后:

MergeService.merge(differences, true);
您能否再次尝试检查“state02.eResource()==null”?如果是,那就是你的问题。否则,您必须确保不会返回:

for (State state : region01.getState()) {
    if (state.eResource() == null) {
       System.err.println(state.getName() + " is not contained in a resource);
       return;
    }
}
您的异常:“org.eclipse.emf.ecore.resource.resource$IOWrappedException:对象‘statemachine.impl’。StateImpl@11ce012(名称:bbbb)“未包含在资源中。”。这个StateImpl@11ce012(名称:bbbb)位于一个名为st2.xmi的资源中,但match元素位于另一个名为“match.xml”的资源中。这两种资源是不同的,它们并不相互引用。因此match元素不能引用StateImpl。要解决此问题,所有元素(state01、state02、match、diff)都必须保存在ONE资源中。代码是:

res.getContents().add(stat01);
res.getContents().add(stat02);
res.getContents().add(match);
res.getContents().add(diff);
顺便说一句,条件“
state02.eResource()==null
”不是必需的。

您的异常:“org.eclipse.emf.ecore.resource.resource$IOWrappedException:对象'statemachine.impl。StateImpl@11ce012(名称:bbbb)“未包含在资源中。”。这个StateImpl@11ce012(名称:bbbb)位于一个名为st2.xmi的资源中,但match元素位于另一个名为“match.xml”的资源中。这两种资源是不同的,它们并不相互引用。因此match元素不能引用StateImpl。要解决此问题,所有元素(state01、state02、match、diff)都必须保存在ONE资源中。代码是:

res.getContents().add(stat01);
res.getContents().add(stat02);
res.getContents().add(match);
res.getContents().add(diff);
顺便说一下,条件“
state02.eResource()==null
”不是必需的