2012-04-12 13 views
0

Ich muss eine API entwickeln, die ein Meta-Modell (Klassendiagramm) und seine Instanz (Objektdiagramm) als Eingabe verwendet, aber ich weiß nicht, wie ich es programmatisch machen soll.Wie validiere ich ein Objektdiagramm (auch "Instanzdiagramm" genannt) gegen ein Meta-Modell?

Ich habe einige Nachforschungen angestellt und festgestellt, dass ich mit EMF API spielen kann, aber ich bin mir nicht sicher, wie ich es machen soll und wie ich mein Diagramm vor der Validierung einfügen kann.

Ich bin ein Anfänger und verloren zwischen all dem Dokument, das auf dem Internet vorhanden sind, so entschuldigen Sie mich, wenn mein Thema nicht klar sind

Ich brauche nur eine Orientierung, beraten zu verstehen, was ich zu tun, .

EDIT: Das Thema ist eine Instanz gegen seine Metamodell zu validieren, die mit Magic Draw erstellt werden. Also muss ich die Datei exportieren (ecore? XMI? Ich weiß nicht, wer der Beste ist) und dann eine Java-API erstellen, die diese beiden Dateien analysiert (ich muss herausfinden, wie man sie auch importiert/importiert) und einen booleschen Wert zurückgibt über die Validierung. Dies ist für den ersten Schritt, nach dem ich denke, ich werde OCL-Einschränkung hinzuzufügen, um die Instanz zu validieren, aber für den Moment muss ich mich auf eine einfache Validierung konzentrieren. Wie kann ich das mit EMF oder einem anderen Tool tun, wenn erforderlich?

Antwort

4

Ihre Frage kann auf zwei Ebenen beantwortet werden: Konzeption und Implementierung. Ich bin mir nicht sicher, wonach du Hilfe suchst, also werde ich versuchen, beides abzudecken. Entschuldigung, wenn beides überflüssig ist (hoffentlich nicht beides!).

Zunächst einmal: Für das Beispiel, das Sie angeben, wäre es normaler, auf ein Klassendiagramm als ein "Modell" und ein Objektdiagramm als eine Instanz dieses Modells zu verweisen. Streng genommen werden "Metamodelle" verwendet, um Modelle zu beschreiben, die wiederum Instanzen haben. Ich werde bei Ihrer Terminologie bleiben, aber wahrscheinlich erwähnenswert.

konzeptionelle Ebene

von ‚konzeptionellem‘ ich meine Antwort auf die Frage „was es zu einem Modell vor einem Metamodell zur Validierung bedeutet '?

Die Antwort ist ziemlich einfach. Das Metamodell ist ein Schema oder ein Satz von Regeln, die definieren, was ein gültiges Modell darstellt.xml stellt ein großartiges Beispiel dar. Ein XML-Schema definiert die Struktur und Regeln für einige Themen: welche Typen erlaubt sind, welche Attribute sie haben können, ob ein Attribut mehrere haben kann Werte, die Menge möglicher Werte, die ein Attribut enthalten kann usw. Ein XML-Dokument entspricht dem Schema, wenn - und nur wenn - es tut Es verstößt nicht gegen eine der im Schema definierten Regeln.

Verallgemeinerung zu Modellen: Ein Modell entspricht seinem Metamodell, wenn - und nur wenn - es keine der im Metamodell definierten Regeln verletzt.

Implementierungsebene

Sie erarbeiten nicht auf das, was die ‚API‘ wird verwendet werden. Es könnte sein, dass Ihre einfachste Lösung nur XML ist: Metamodelle sind dann nur XML-Schema und Modelle sind XML-Dokumente, die mit diesem Schema kompatibel sind. Ihre "Implementierung" würde dann nur eine der vielen validierenden XML-Parser-Bibliotheken auswählen und sie von Ihrem Client-Code aus aufrufen.

Wie auch immer Sie EMF so erwähnen, vielleicht müssen Sie es verwenden.Zur Vereinfachung der Dinge gehen wir von einer Metamodell definieren möchten, wie folgt:

Class Dog { 
    name: String 
    gender: String 
    owner: Person 
} 

Class Person { 
    name: String 
    address: Address 
    dogs: Set<Dog> 
} 

EMF stellt eine API - die eCore API - für solche Dinge zu definieren. Stellen Sie es sich wie Java's Reflection API vor. Sie definieren das Metamodell, indem Sie Instanzen der eCore-API erstellen (entweder programmgesteuert oder über einen der Editoren). So würden Sie erstellen:

  • Zwei Fälle von EClass (einem für Person, einen für Hund)
  • Sechs Fälle von EAttribute (einem für jedes Attribut)
  • Ein EReference für Class.owner und eine Sammlung von EReferences für Person.dogs

und so weiter. Die eCore-API bietet auch die Möglichkeit, Instanzen Ihres Modells mithilfe der API zu erstellen. (Es wird auch automatisch einen Editor generieren, damit Sie die Instanzen bei Bedarf in der Eclipse-GUI erstellen können). Sie können Instanzen Ihres Modells auch in verschiedenen konkreten Syntaxen einlesen. Wenn das von Ihnen gelesene Modell nicht dem Metamodell entspricht, wird EMF Ausnahmen auslösen.

Sorry, wenn das ein bisschen lang ist. Es gibt einen guten Artikel here, der bei Bedarf ein Beispiel ausführlicher behandelt.

EDIT

Addition in Reaktion auf geänderte Frage:

Das Thema ist eine Instanz gegen seine Metamodell zu validieren, die mit Magie Draw erstellt sind.

OK. Ich weiß nicht viel über MagicDraw Exportfunktionen, aber wenn es ecore exportieren kann dann soll, dass ein guter Ort, um zu starten:

  • Export des Klassendiagramm (‚Metamodell‘) als ecore und lädt in EMF zu erstellen das Model. Das sollte ziemlich einfach sein.
  • Exportieren Sie das Objektdiagramm ebenfalls als ecore und laden Sie es, damit EMF beim Laden validiert wird. Wenn Sie weitere Validierung hinzufügen müssen, bietet @Charles Post eine gute Verbindung zum EMF-Validierungs-Framework.

Wenn Sie viel zu tun haben, lohnt es sich, in die EMF book zu investieren. Es ist nicht am zugänglichsten, aber es bietet eine angemessene Abdeckung der verschiedenen Elemente von EMF.

hth.

+0

Vielen Dank für Ihre Zeit und diese große Post, es auf meiner großen Frage beantworten, aber es ist ein Punkt, der für mich nicht klar sind. Ich muss nicht mit XML arbeiten, entweder mit Eclipse GUI-Tool, um mein Modell zu entwerfen, und ich muss auch EMF verwenden. Ich habe meine Frage für weitere Details bearbeitet. Kannst du es bitte sehen? Nochmals vielen Dank für Ihre Zeit und Hilfe – TheCyberXP

+0

Kein Problem - aktualisierte Antwort. – sfinnie

2

Wenn Sie ein Meta-Modell mit ECore definiert haben, generiert EMF die Java-API zum Erstellen von Instanzen (Modell) des definierten EClass. Per Definition entspricht Ihr Modell also seinem Metamodell.

Wenn Ihr Modell von einer anderen Anwendung erstellt wird und Sie es gegen ein separat erstelltes Metamodell validieren möchten, können Sie zuerst versuchen, Ihr Modell mit dem von EMF erzeugten Editor aus Ihrem Metamodell zu öffnen. Wenn es nicht kompatibel ist, werden Sie einige Fehler haben, die für einen ersten Versuch ausreichen könnten. Wenn ich mich gut erinnere, ist dies auch ein Standard-Validierer, den Sie ausführen können, indem Sie mit der rechten Maustaste in Ihren generierten Editor klicken und "Validieren" auswählen.

Es gibt eine andere Lösung von EMF: EMF Validation Framework. In diesem Framework können Sie Einschränkungen definieren, die für Ihre Instanzen validiert werden.

public class MyConstraint extends AbstractModelConstraint{ 
    @Override 
    public IStatus validate(IValidationContext ctx) { 
     try{ 
     //Get the object that will be validated 
     Object obj = ctx.getTarget(); 
     //Here you can run you validation 
     //Create Validation Status 
     return validationStatus 
     } catch (Exception e) { 
     return ctx.createFailureStatus(e); 
     } 
    } 
} 

Für weitere Informationen können Sie einen Blick auf dieses Tutorial nehmen: http://help.eclipse.org/helios/index.jsp?topic=%2Forg.eclipse.emf.validation.doc%2Ftutorials%2FvalidationTutorial.html

ich mir ziemlich sicher‘, dass Sie OCL Constraint auf Metamodell definieren kann, aber dieser Teil eines anderen Projekts. Schau dir das an: http://www.eclipse.org/modeling/mdt/?project=ocl#ocl Ich habe es nie benutzt, deshalb kann ich dir nicht helfen. Es tut uns leid.

Ich hoffe es hilft.

Charles

+0

Ich habe das Metamodell nicht mit ECore definiert, ich habe das Grafikwerkzeug Magic Draw verwendet, aber er kann das Modell in eine Ecore-Datei oder XMI exportieren, also muss man diese Datei nehmen (eine für das Modell, die andere für die Instanz) und sie mit EMF zu validieren. Ist das möglich? Eine Art automatisches Parsen und Validieren. – TheCyberXP