[EMF] XMI lesen

miketech

Bekanntes Mitglied
Hallo zusammen,

ich habe ein Metamodell serialisiert in XMI, wobei hier auch Elemente aus Ecore zum Einsatz kommen. Nun habe ich ein konkretes Modell, welches ebenfalls in XMI vorliegt. Wie lese ich das Modell nun basierend auf dem Metamodell XMI ein, so dass ich es mittels Java bearbeiten kann?

Wäre für ein paar Starthilfen dankbar :)

Gruß

Mike
 

Wildcard

Top Contributor
Du hast aus dem Ecore Klassen generiert? Falls ja, dann geht das über eine Resource bzgw ein ResourceSet. Am einfachsten ist es, wenn du auch den Test Code generierst, dann legt EMF eine Example Klasse an in der eine Datei geladen, manipuliert und gespeichert wird.
 

miketech

Bekanntes Mitglied
Hallo Wildcard,

danke für Deine Antwort. Gibt es denn auch einen Weg ohne die Ecore-Klassen? Oder ist das zwingend erforderlich?

Gruß

Michael
 

Wildcard

Top Contributor
Ohne die Ecore Klassen? Das heißt also du hast keinen Quellcode generiert und hast lediglich ein ecore?
Ja, das geht auch, aber da du keine Java Klassen hast, hast du auch keine normale API mit gettern und settern. Das ganze nennt sich dann dynamic ecore. Bevor du damit anfängst, würde ich erst mal static ecore versuchen (also Klassen generieren) um EMF besser zu verstehen.

Die Reflektive API bedient sich nämlich in etwa so (Pseudocode):
Java:
EObject root = resource.getContents().get(0);
EClass eClass = yourEPackage.getEClass("Root");
String name = root.eGet(eClass.getEStructuralFeature("name"));
root.eSet(eClass.getEStructuralFeature("name"),name.toUpperCase());

Im vergleich zu:
Java:
Root root = resource.getContents().get(0);
root.setName(root.getName().toUpperCase());
 

miketech

Bekanntes Mitglied
Hallo Wildcard,

danke. Die Unterschiede verstehe ich gut, das dynamische ist auch durchaus meine bevorzugte Variante. Meine Frage ist nur: Wird dann währenddessen geprüft, dass das Modell, das ich erstelle auch konform zum zugrundeliegenden Metamodell ist? Wenn ich die statische Variante nutze, bin ich ja ohnehin auf die Klassen eingeschränkt. Aber wird das bei der dynamischen Variante auch geprüft?

Danke

Michael
 

Wildcard

Top Contributor
Klar wird das geprüft. Bei jedem eGet, eSet, eUnset usw. musst du ja ein EStructuralFeature angeben, sonst funktioniert es nicht. Falls es dir um die definierten Constraints geht (zB upper bound = 4, OCL Constraints, oder sonstiges), dann ist die Antwort ebenfalls 'ja'.
Dynamischem Ecore liegt das gleiche Ecore wie statischem Ecore zu Grunde. Wenn du also zB den Diagnostician verwendest um dein Modell validieren zu lassen, dann wird er anhand des dynamischen Ecores erkennen, wenn du für ein multi Feature den upper bound überschreitest und dir das gleiche Diagnostic liefern, wie wenn du Klassen generiert hättest.
Auch die Notifications haben die gleiche Mächtigkeit bei dynamischem Ecore.
Alles ist etwas langsamer, die API nicht so komfortabel und du kannst den Code nicht customizen, aber davon abgesehen ist dynamic Ecore genauso mächtig wie die static Variante.
 

Ähnliche Java Themen


Oben