# xmi parsen über emf



## unpack (22. Apr 2009)

Guten Abend.
ich würde gerne eine XMI-Datei auslesen die ein Klassendiagramm enthält und das Klassendiagramm daraufhin anzeigen lassen. 
Durch lesen im Forum und Tutorials habe ich jetzt schon herausgefunden das dass über das Eclipse Modelling Framework und dazugehörigen Plugins ganz gut funktionieren soll. Hierfür nimmt man wohl eine xmi.xsd und erstellt sich ein EcoreModell um sich daraufhin Klassen generieren zu lassen. 
Hab das jetzt auch schon einmal so wie in diesem Tutorial gemacht was auch alles funktioniert hat.Generating an EMF Model using XML Schema (XSD)

Was ich noch nicht so recht verstehe ist folgendes:
1.) Welche Schemadatei nehm ich am besten um mit möglichst vielen Programmen (die Klassendiagramme erstellen) kompatibel zu sein?
(UML2 soll auf jeden Fall unterstützt werden)
2.) Wie übergeb ich die XMI-Datei die mein Klassendiagramm enthält? Muss die doch bestimmt in den erstellten Klassen irgendwie aufrufen, oder? Hab da nicht ein Tutorial zu gefunden. Nur immer wie ich ausführbaren Code erstell.
3.) Das ganze soll ohne Eclipse lauffähig sein. Wie bekomm ich das hin?

Bin für jede Hilfe dankbar, auch wenn es nur Verweise auf Tutorials o.ä. sind weil es damit in Bezug auf EMF auch sehr mau aus sieht. 

Mfg unpack


----------



## Wildcard (23. Apr 2009)

Ein EMF Modell der UML2:
Eclipse Modeling - MDT - Home


----------



## unpack (24. Apr 2009)

Hallo!
Erstmal Danke für den Tip wildcard.
uml2 sieht tatsächlich sehr gut aus und unterstützt auch eine Menge Tools.
Ich hab jetzt mal versucht folgendes Tutorial durchzugehen:Getting Started with UML2 Dort wird gezeigt wie man ein neues Modell erstellt und als xmi exportieren kann was auch alles funktioniert hat. Allerdings bekomme ich es nicht hin eine xmi-Datei(liegt unter C:/uml/model1.uml) einzulesen. Die Funktion load dafür ist aber wie die save funktion in der Klasse UML2Article bereits vorhanden.

```
package com.ibm.uml2.articles;

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.Element;
import org.eclipse.uml2.uml.UMLPackage;
import org.eclipse.uml2.uml.resource.UMLResource;
import org.eclipse.uml2.uml.util.UMLUtil;

/**
 * Base class for articles on how to develop tools using UML2.
 */
public abstract class UML2Article {

	public static boolean DEBUG = true;

	protected static final ResourceSet RESOURCE_SET = new ResourceSetImpl();

	protected static void out(String output) {

		if (DEBUG) {
			System.out.println(output);
		}
	}

	protected static void err(String error) {
		System.err.println(error);
	}

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

	protected 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(""));
	}

	protected 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);

			out("Done.");
		} catch (IOException ioe) {
			err(ioe.getMessage());
		}
	}

	protected static org.eclipse.uml2.uml.Package load(URI 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) {
			err(we.getMessage());
			System.exit(1);
		}

		return package_;
	}

}
```

auslesen wolte ich sie jetzt folgendermaßen:

```
package com.ibm.uml2.articles;

import org.eclipse.emf.common.util.URI;

/**
 * Source code for the "Getting Started with UML2" article.
 */
public class GettingStartedWithUML2 extends UML2Article {

	public static void main(String[] args) {
		
		registerResourceFactories();
		out("loading model..");
		URI model= URI.createURI("file://c://uml//model1.uml");
		org.eclipse.uml2.uml.Package package1 = load(model);
		out(package1.getName());

	}
}
```

Mein package1 ist allerdings immer null. Das der Pfad falsch ist schließ ich eigentlich aus weil dann eine fehlermeldung von eclipse käme das er die datei nicht findet.

Hat einer eine Idee was ich falsch mache?


----------



## Wildcard (24. Apr 2009)

Was sollen die doppel / in deiner URI? \ muss escaped werden, / nicht.


----------



## unpack (25. Apr 2009)

ok dank dir.  hab sie jetzt escaped wie du geschrieben hast. Allerdings bekomm ich nun eine Fehlermeldung 





> Cannot create a resource for 'file:\c:\uml\model1.uml'; a registered resource factory is needed



hab aber eigentlich wie in der FAQ MDT/UML2/FAQ - Eclipsepedia beschrieben das package, die resourceFactory und die Pathmaps registriert.???:L 


```
package com.ibm.uml2.articles;

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

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.Element;
import org.eclipse.uml2.uml.UMLPackage;
import org.eclipse.uml2.uml.resource.UMLResource;
import org.eclipse.uml2.uml.util.UMLUtil;

/**
 * Base class for articles on how to develop tools using UML2.
 */
public abstract class UML2Article {

	public static boolean DEBUG = true;

	protected static final ResourceSet RESOURCE_SET = new ResourceSetImpl();

	protected static void out(String output) {

		if (DEBUG) {
			System.out.println(output);
		}
	}

	protected static void err(String error) {
		System.err.println(error);
	}

	protected static void registerResourceFactories() {
		RESOURCE_SET.getPackageRegistry().put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
		Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put(
				UMLResource.FILE_EXTENSION, UMLResource.Factory.INSTANCE);
	}

	protected 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(""));
	}

	protected 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);

			out("Done.");
		} catch (IOException ioe) {
			err(ioe.getMessage());
		}
	}

	protected static org.eclipse.uml2.uml.Package load(URI 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) {
			err(we.getMessage());
			System.exit(1);
		}

		return package_;
	}

}
```


```
package com.ibm.uml2.articles;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.xmi.XMIResource;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
import org.eclipse.uml2.uml.UMLPackage;

/**
 * Source code for the "Getting Started with UML2" article.
 */
public class GettingStartedWithUML2 extends UML2Article {

	public static void main(String[] args) {

		out("loading model..");
		
		/*uri erstellen*/
		URI model = URI.createURI("file:\\c:\\uml\\model1.uml");
		
		/*resourceFactory und package registrieren*/
		registerResourceFactories();
		
		/*pathmaps registrieren*/
		UML2Article.registerPathmaps(model);
		
		/*laden des model*/
		org.eclipse.uml2.uml.Package package1 = load(model);
		out(package1.getName());

	}
}
```


----------



## Wildcard (25. Apr 2009)

Nein, ich meinte nur das man \ escaped, aber nicht /. Das macht \ aber noch lange nicht zu einem gültigen Trenner in einer URI. Statt // brauchst du /

```
file:///c:/uml/model1.uml
```


----------



## Spot84 (26. Apr 2009)

hat sich schon erledigt, sorry!!


----------



## unpack (26. Apr 2009)

achso, dann hatte ich dich total falsch verstanden.
Aber jetzt funktioniert alles super, kann Modelle einlesen und auch speichern. 
Vielen Dank schon einmal dafür wildcard!!!  

Hab jetzt auch mal rumgeschaut wie ich die Modelle grafisch als Diagramme darstellen kann, was mit den uml2tools auch ohne Probleme geht. MDT-UML2Tools - Eclipsepedia
Nur kann man das anscheinend nur in Eclipse selbst machen, jedoch nicht "standalone". Hab zumindest keine Tutorials diesbezüglich gefunden. Hat villeicht einer eine Idee wie ich das jetzt am besten umsetze, oder muss man sich dafür selbst in GMF etc. einarbeiten und programmieren?


----------



## Wildcard (26. Apr 2009)

Was meinst du mit Standalone? RCP Standalone, oder Swing Applikation Standalone?
Mit RCP kein Problem, aber für Swing kannst du nicht auf entsprechende Eclipse Technologie wie uml2tools, GMF, GEF,... zurückgreifen, da musst du dann dein eigenes Frontend schreiben.


----------



## unpack (26. Apr 2009)

brauch ich denn wenn ich es als rcp mach eine eclipseinstallation und kann ich die gui trotzdem noch anpassen?
wenn ich kein eclipse benötige würde mir das natürlich reichen. 
nur durchschau ich noch nicht recht wie ich die uml2tools in mein rcp einbinde und mein Modell übergeben kann? gibt es da gute tutorials? find irgendwie kaum etwas wenn es um die nutzung von emf-plugins ohne eclipse geht..:rtfm:


----------



## Wildcard (26. Apr 2009)

RCP ist ein von dir zusammengestelltes Eclipse. Im Minimalfall sind das nur wenige MB und nur die Teile von Eclipse die du haben willst.
Hab mir nicht den ganzen Screencast angesehen, sollte dir aber (auch wenn etwas älter) eine Vorstellung davon geben wie so etwas aussieht:
EclipseZone - Why You Should Use Eclipse RCP (In 10 Minutes)


----------

