1

次の UML モデルを比較するために、Eclipse で EMF 比較ツールを使用しようとしています。

<?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 回読み込んだため、比較した 2 つのモデルはまったく同じです。ただし、出力結果は、2 つのモデル間にいくつかの違いがあることを示しています。

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}
---------------------------------------------------------------------

予想される出力は、2 つの UML モデル間に違いがないことを示す必要があります。EMF 比較は「nestedClassifier」比較をサポートしていないようです。この問題を解決するために EMF 比較クラスを改善するために使用できる方法はありますか?

4

0 に答える 0