我们尝试使用 Eclipse 中的 EMF 比较工具来比较以下 UML 模型:
<?xml version="1.0" encoding="UTF-8"?>
<xmi:XMI xmi:version="20110701" xmlns:xmi="http://www.omg.org/spec/XMI/20110701" xmlns:CDA="http://www.openhealthtools.org/mdht/schemas/cda/4" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/4.0.0/UML">
<uml:Package xmi:id="PackageId" name="PackageA">
<nestedClassifier xmi:type="uml:Class" xmi:id="nestedClassifierId" name="nestedClassifier">
<ownedComment xmi:id="ownedCommentId">
<body>Body of the article.</body>
</ownedComment>
</nestedClassifier>
</uml:Package>
</xmi:XMI>
通过遵循 EMF 比较文档: http: //www.eclipse.org/emf/compare/documentation/latest/developer/developer-guide.html#Comparison_Scope 我们为 UML 比较编写了以下类:
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.compare.Comparison;
import org.eclipse.emf.compare.Diff;
import org.eclipse.emf.compare.EMFCompare;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.uml2.uml.resource.UMLResource;
public class EMFcompare {
EList<Diff> differences;
public static void main(String[] args) {
// compare two models which are exactly the same
Comparison comparison = compare("./models/MinimalModel.uml", "./models/MinimalModel.uml");
// output the comparison result
System.out.println(comparison.getDifferences().size());
for (Diff diff : comparison.getDifferences()) {
System.out.println("Diff");
System.out.println("Kind is " + diff.getKind());
System.out.println("State: " + diff.getState());
System.out.println(diff);
System.out.println("---------------------------------------------------------------------");
}
}
public static Comparison compare(String uml1, String uml2) {
// create uri for loading resource set
URI uri1 = URI.createFileURI(uml1);
URI uri2 = URI.createFileURI(uml2);
// Register the UML format for model comparison
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("uml", UMLResource.Factory.INSTANCE);
// Load resource sets
ResourceSet resourceSet1 = new ResourceSetImpl();
ResourceSet resourceSet2 = new ResourceSetImpl();
resourceSet1.getResource(uri1, true);
resourceSet2.getResource(uri2, true);
// Compare output uml model with the expected uml model
Comparison comparison = EMFCompare.builder().build().compare(EMFCompare.createDefaultScope(resourceSet1, resourceSet2, null));
return comparison;
}
}
在课堂中,我们两次加载了相同的 UML 模型,因此,比较的两个模型完全相同。但是,输出结果表明两种模型之间存在一些差异:
2
Diff
Kind is ADD
State: UNRESOLVED
AttributeChangeSpec{attribute=AnyType.mixed, value=body=org.eclipse.emf.ecore.xml.type.impl.AnyTypeImpl@cd2dae5 (mixed: [ecore.xml.type:text=Body of the article.], anyAttribute: null), kind=ADD, source=LEFT, state=UNRESOLVED}
---------------------------------------------------------------------
Diff
Kind is DELETE
State: UNRESOLVED
AttributeChangeSpec{attribute=AnyType.mixed, value=body=org.eclipse.emf.ecore.xml.type.impl.AnyTypeImpl@53f65459 (mixed: [ecore.xml.type:text=Body of the article.], anyAttribute: null), kind=DELETE, source=LEFT, state=UNRESOLVED}
---------------------------------------------------------------------
预期的输出应该表明两个 UML 模型之间没有差异。似乎 EMF 比较不支持“nestedClassifier”比较。有什么方法可以用来改进我们的 EMF 比较类来解决这个问题?