1

我们尝试使用 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 比较类来解决这个问题?

4

0 回答 0