XMI über EMF / UML2 einlesen

Status
Nicht offen für weitere Antworten.
H

HTWTeam

Gast
Hallo,

wir sind gerade dabei, eine XMI Datei über das Eclipse Modelling Framework Projekt und dem UML2 Projekt einzulesen.

Folgenden Thread haben wir gefunden und auch den Code ausprobiert:
http://www.java-forum.org/xml-co/82142-xmi-parsen-ueber-emf.html#post511745

Beim Einlesen mit
Java:
org.eclipse.uml2.uml.Package package1 = load(model);
wird auch keine Exception geworfen, allerdings ist die Variable "package1" nach dem Ladevorgang immernoch "null".

Hat jemand eine Idee woran dies liegen könnte?

Als Alternative zu EMF / UML2 käme für uns auch jeder andere frei verfügbare XMI 2.1 Parser in Frage.
 
H

HTWTeam

Gast
Folgenden Code nutzen wir derzeit:

Java:
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.Type;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		org.eclipse.uml2.uml.Package package1 = null;
		
		URI uri = URI.createURI("file:///C:/testcase.xmi"); 
		UMLModel.init();
		package1 =UMLModel.load(uri);
		
		for (Type e : package1 .getOwnedTypes()) 
		   System.out.println(e.getName());
		
		System.out.println("ok");
	}
}


Diese Datei stammt aus dem Beispiel der Seite eUML und steht unter der Eclipse Public License
Java:
/**
 * This class uses functionality from
 * com.ibm.uml2.articles plugin found
 * here: [url=http://www.eclipse.org/modeling/mdt/uml2/docs/articles/Getting_Started_with_UML2/article.html]Getting Started with UML2[/url] 
 */


import java.io.File;
import java.io.IOException;
import java.util.Iterator;

import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.common.util.WrappedException;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.uml2.uml.AggregationKind;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.UMLFactory;
import org.eclipse.uml2.uml.UMLPackage;
import org.eclipse.uml2.uml.resource.UMLResource;
import org.eclipse.uml2.uml.util.UMLUtil;

public class UMLModel {

	private static org.eclipse.uml2.uml.Package model;

	private static final ResourceSet RESOURCE_SET = new ResourceSetImpl();

	private static void registerResourceFactories() {
		Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put(
				UMLResource.FILE_EXTENSION, UMLResource.Factory.INSTANCE);
		Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put(
				"xmi", UMLResource.Factory.INSTANCE);
	}

	private static void registerPathmaps(URI uri) {
		URIConverter.URI_MAP.put(URI.createURI(UMLResource.LIBRARIES_PATHMAP),
				uri.appendSegment("libraries").appendSegment(""));
		URIConverter.URI_MAP.put(URI.createURI(UMLResource.METAMODELS_PATHMAP),
				uri.appendSegment("metamodels").appendSegment(""));
		URIConverter.URI_MAP.put(URI.createURI(UMLResource.PROFILES_PATHMAP),
				uri.appendSegment("profiles").appendSegment(""));
	}

	private static void save(org.eclipse.uml2.uml.Package package_, URI uri) {
		Resource resource = RESOURCE_SET.createResource(uri);
		EList contents = resource.getContents();
		contents.add(package_);

		for (Iterator allContents = UMLUtil.getAllContents(package_, true,
				false); allContents.hasNext();) {

			EObject eObject = (EObject) allContents.next();

			if (eObject instanceof Element) {
				contents
						.addAll(((Element) eObject).getStereotypeApplications());
			}
		}

		try {
			resource.save(null);
		} catch (IOException ioe) {
			System.err.println(ioe.getMessage());
		}
	}

	public static org.eclipse.uml2.uml.Package load(URI uri) {
		registerPathmaps(uri);
		org.eclipse.uml2.uml.Package package_ = null;

		try {
			Resource resource = RESOURCE_SET.getResource(uri, true);

			package_ = (org.eclipse.uml2.uml.Package) EcoreUtil
					.getObjectByType(resource.getContents(),
							UMLPackage.Literals.PACKAGE);
		} catch (WrappedException we) {
			System.err.println(we.getMessage());
			System.exit(1);
		}

		return package_;
	}

	protected static void save(File file) {
		String s = file.toURI().toString();
		if (!s.toLowerCase().endsWith(".xmi"))
			s += ".xmi";
		save(model, URI.createURI(s));
	}

	protected static void load(File file) {
		model = load(URI.createURI(file.toURI().toString()));
	}

	protected static org.eclipse.uml2.uml.Package getModel() {
		return model;
	}

	protected static void createClass(String name) {
		model.createOwnedClass(name, true);
	}

	protected static void createAssociation(String s1, String s2) {
		model.getOwnedType(s1).createAssociation(true,
				AggregationKind.NONE_LITERAL, "[" + s1 + "]", 1, 1,
				model.getOwnedType(s2), true, AggregationKind.NONE_LITERAL,
				"[" + s2 + "]", 1, 1);
	}

	public static void init() {
		registerResourceFactories();
		model = UMLFactory.eINSTANCE.createModel();
		model.setName("uml2_simple_model");
	}

//	protected static void new_() {
//		while (!model.getOwnedElements().isEmpty()) {
//			model.getOwnedElements().get(0).destroy();
//		}
//	}

}

Jetzt kommt der Teil, der etwas verwirrend ist. Wenn die Klasse "Test" ausgeführt wird und als Build-Libraries die bei dem eUML Projekt mitgelieferten (EMF 2.3 und UML2 2.1) verwendet werden funktioniert das Einlesen der XMI Datei und die Ausgabe der enthaltenen Klassen. Sobald als Build-Libraries die aktuellen Pakete (d.h. die aktuellen EMF 2.5.0 und UML2 3.0.1 Pakete) angegeben werden, gibt es zwar wie schon geschildert bei der load-Methode keine Fehler, allerdings bleibt die Variable "package1" leer und somit löst der dann folgende Code der die Klassennamen ausgeben soll eine NullPointerException aus.

Leider unterstüzt die ältere Version von UML2 kaum aktuelle Programme und deshalb sollten wir die aktuelle Version verwenden und dort funktioniert wie geschildert der Ladevorgang nicht.

Vielen Dank im Voraus für die Hilfe :)
 

Wildcard

Top Contributor
Vielleicht hat sich ja am UML3 Modell etwas inkompatibel geändert.
Versuch mal folgendes:
Java:
        registerPathmaps(uri);
        Resource resource = RESOURCE_SET.getResource(uri, true);
        EObject o = resource.getContents().get(0);
 
H

HTWTeam

Gast
Danke, wir wissen jetzt auch woran es lag, dass der andere Code nicht funktioniert.

Wenn der xmlns:uml Tag der XMI-Datei eine Versionsnummer unter 3.0.0 hat, wird die Datei nicht eingelesen, sobald diese hochgesetzt wird, funktioniert es:
xmlns:uml="http://www.eclipse.org/uml2/3.0.0/UML

Wenn die Datei allerdings über die normale GUI des Eclipse UML2 Projekts geöffnet wird, wird dies automatisch angepasst. Leider wissen wir noch nicht über welche Methode(n) dies funktioniert.

Es ist auch keine dauerhafte Lösung die Versionsnummer einfach hochzusetzen, da zwischen den Versionen immer einige Notationen geändert wurden und diese ggf. angepasst werden müssen. Beim Laden der Datei über die GUI wird dies automatisch erledigt.

Wer hat eine Idee über welche Methode wir die XMI Dateien so laden können wie es über die GUI gemacht wird?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N XQUERY Abfrage über tool XML & JSON 2
N Wie komme ich an die Siblings über DOM? XML & JSON 15
N Probleme bei der Formatierung beim Einfügen und löschen über DOM XML & JSON 7
ms_cikar Excel Dateien über Dropbox zugreifen XML & JSON 0
S Konforme XML Datei über XSD erstellen XML & JSON 2
N Algemeines über xml XML & JSON 3
G XSL: Element über eine Variable ermitteln XML & JSON 4
U xmi parsen über emf XML & JSON 10
S XML Validierung mit XSD über DOM - Cannot find. XML & JSON 4
D xml über webservice XML & JSON 5
B xml datei über gui ändern XML & JSON 4
J Soap über Axis XML & JSON 3
J Zugriff auf Web Service über den Browser XML & JSON 12
iman XML Attribute mit JAVA einlesen mit Spring Batch XML & JSON 0
J Object in JSON Datei einlesen und als neues Object erzeugen (in ein Object Array) XML & JSON 29
I Mit Hibernate eine XML-Datei in eine Tabellenspalte einlesen. XML & JSON 1
L XML einlesen gleichnamige Elemente XML & JSON 5
T HTML mit Hilfe Jsoup einlesen XML & JSON 11
R xlsx-Datei mit Apache POI einlesen XML & JSON 18
S CSV Datei einlesen und XML Ausgeben XML & JSON 2
W XML einlesen und Attribute auslesen XML & JSON 1
M XML Werte einlesen aber wie am besten weiterverarbeiten? XML & JSON 13
L XML nur ein Element einlesen XML & JSON 2
L Jackson JSON: Probleme beim einlesen XML & JSON 1
S XML in JTable Einlesen XML & JSON 3
B XML analysieren und einlesen XML & JSON 26
Z XML Datei mit JDOM einlesen und verarbeiten XML & JSON 6
Ollek XML Einlesen - Welche API ist die richtige? XML & JSON 14
X XML einlesen XML & JSON 6
C JAXB: XML-Elemente einlesen und als XML-Attribute ausgeben XML & JSON 7
jstei001 .xsd File wärend der Laufzeit einlesen und XMl rausschreiben XML & JSON 5
J XML mit russischem Inhalt einlesen XML & JSON 4
D XML Einlesen mit JaxB XML & JSON 4
K Einlesen eines Parameters aus HTML-Datei XML & JSON 4
D Wie XML Datei einlesen und HTML entities übernehmen? XML & JSON 3
B Validierung nur beim einlesen oder auch beim schreiben? XML & JSON 4
B SAX-Parser - Dokumente einlesen und in einer Map ablegen XML & JSON 2
N xsd pattern in java einlesen XML & JSON 6
F Einlesen von JDBC connection in Java von XML XML & JSON 4
J wert IN einem tag einlesen/schreiben XML & JSON 4
F XML erzeugen aus JTree und wieder einlesen... XML & JSON 6
N JDOM: XML einlesen XML & JSON 4
F XML mit DOM einlesen- Teile in Arraylist speichern XML & JSON 4
S XML einlesen XML & JSON 18
F XML Datei in Java einlesen XML & JSON 4
S XML einlesen, analysieren, bearbeiten & als Textdatei ausgeben XML & JSON 1
E XML Datei einlesen und Elemente in der Console ausgeben XML & JSON 6
H xml-Datei mit Attributen einlesen XML & JSON 3
C xml "zeilenweise" einlesen XML & JSON 6
B XML einlesen und in Datenbank schreiben XML & JSON 1
S XML-Schema einlesen um parsen zu erleichtern? XML & JSON 2
L Element einlesen <Telefon name="Karl">134313 XML & JSON 2
G XML Tag beim Einlesen manipulieren XML & JSON 2
J XML-Datei ein Array einlesen XML & JSON 10
P Große XML Datei mittels JDOM bearbeiten / einlesen XML & JSON 6
G Simples XML File einlesen mit JDom. Prefix not bound ? XML & JSON 2
M Liste in Baumstruktur einlesen XML & JSON 4
D nicht (ganz) valiedes XML einlesen! XML & JSON 19
S Einlesen einer xml Datei XML & JSON 4
S XML Datei einlesen, aber root überspringen XML & JSON 2
M XML einlesen - prüfen ob Element vorhanden XML & JSON 2
M NullPointerException bei Einlesen XML XML & JSON 3
J XML - schreiben und einlesen (Schema) XML & JSON 14
S XML Strings in JAVA einlesen, aber wie? XML & JSON 8
K JDOM SAXBuilder einlesen XML & JSON 6
G Newbe - Frage.XML - Datei einlesen und speichern XML & JSON 2
G xml einlesen und bestimmte Elemente an eine gui_Klasse überg XML & JSON 25
B XML String einlesen XML & JSON 4
M mit JDOM XML-Datei einlesen, die nicht "well-formed&quo XML & JSON 3
T Newbie Frage. CSS Stylesheet einlesen und suchen nach Tags XML & JSON 6
P OutOfMemoryError beim Einlesen einer XML-Datei XML & JSON 7
C Zeile herausfinden in der ein Fehler beim Einlesen entsteht XML & JSON 3
R wie kann ich ein xml file in einen string einlesen? XML & JSON 2
N Objekte via XML speichern und wieder einlesen XML & JSON 12
R POST REQUEST: XmlDocument mit getInputStream einlesen! XML & JSON 6

Ähnliche Java Themen


Oben