Die Referenzierung erfolgt in der XML/XMI-Repräsentation eines EMF-generierten Modells standardmäßig über XPath Ausdrücke (hm, stimmt das? wo hab ich das denn gelesen?). <packagedElement xsi:type="KobrA2SUM.Structure:K2ComponentClass" name="TravelBookingSystem"> <generalization general="#//BookingSystem"/> <!-- ... --> </packagedElement> <packagedElement xsi:type="KobrA2SUM.Structure:K2ComponentClass" name="TravelBookingSystem"> <!-- ... --> </packagedElement> Hieraus ergibt sich der Nachteil, dass ein SUM-View-Mapping der Modellelemente nur zu Programmlaufzeit sichergestellt werden kann. Ändert man zum Beispiel den Namen der Komponente “BookingSystem” in der View “offline” und möchte dann die Änderung in das SUM importieren, ist die nicht mehr korrekt möglich, da kein passendes Mapping mehr erfolgen kann. Vor allem hinsichtlich einer kollaborativen Entwicklung ergeben sich Schwierigkeiten, die ohne künstliche IDs nicht zu umgehen sind. Aus diesem Grund gibt es die Möglichkeit UUIDs zu verwenden. Da diese bei EMF-generierten Modellen standardmäßig nicht vorgesehen sind, ist ein kleiner Eingriff des Programmierers in den erzeugten Code notwendig. Wie das funktioniert habe ich vor allem durch einen Artikel von Seweryn Niemiec erfahren: How To Enable UUID In EMF Generated Model […] Folgende Änderungen brachten mich zum Ziel:
  1. Die Klasse KobrA2SUMResourceFactoryImpl erweitert org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl
  2. Die Klasse KobrA2SUMResourceImpl erweitert org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl
  3. Außerdem wurde die Methode useUUIDs() der Klasse KobrA2SUMResourceImpl überschrieben: /* (non-Javadoc) * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#useUUIDs() */ @Override protected boolean useUUIDs() { return true; }
Schließlich erhielt ich ein Modell, das UUIDs verwendet und auch über diese referenziert. <packagedElement xsi:type="KobrA2SUM.Structure:K2ComponentClass" xmi:id="_5F2l0CKuEd654_10FfizxA" name="TravelBookingSystem"> <generalization xmi:id="_5F96kCKuEd654_10FfizxA" general="#_5H7CYSKuEd654_10FfizxA"/> <!-- ... --> </packagedElement> <packagedElement xsi:type="KobrA2SUM.Structure:K2Class" xmi:id="_5H7CYSKuEd654_10FfizxA" name="BookingSystem"> <!-- ... --> </packagedElement> Bei der View-Erzeugung werden dann die UUIDs der Elemente “kopiert”, d.h. die UUID des Elements des SUM per eObject.eResource().getURIFragment(eObject) ausgelesen und dann beim Element der View manuell per UMLResource.setID(eObject) gesetzt. Um dies herauszufinden war das durchstöbern der Newsgroup [news.eclipse.modeling.mdt.uml2] sehr hilfreich, denn dort fand ich den entsprechenden Hinweis.

One Comment

  • ktb

    Noch einfacher war es, von der UMLResource zu erben 🙂
    (siehe MDT UML2, org.eclipse.uml2)