Grundlegende Frage & Xpand Probleme

Hallo zusammen,

kurze Anmerkung vorne weg, der "Xpand Reference" Link ist tot auf dieser Seite:
http://www.uml-lab.com/de/uml-lab/tutorials/codestyles-tutorial/

In meinem Projekt liegen hauptsächlich Entities, Business Functions und Business Services vor. Am Ende soll es ein mit Architekturspezifika angereichertes Modell geben. Alle Entites sollen auch als solche gekennzeichnet sein, genauso wie alle Business Functions und Business Services. Zudem soll auch Diagramme nur von den Entities etc. geben. Wie in eurem Tutorial gezeigt soll auch weiter abstrahiert werden und die Getter und Setter Methoden nicht im Diagramm angezeigt werden. Zudem soll der Quelltext völlig unberührt bleiben. Die erste Frage lautet also wie ich das Round-Trip-Engineering vermeiden kann und nur die Diagramme mir anpassen kann.

Leider gibt es hier keine Code Tags, daher muss ich es so posten. Auf Wunsch kann ich es auch bei Pastebin hochladen, das sieht hier ziemlich verwirrend und unschön aus.
In einem ersten Schritt wollte ich mich daran machen nur Kommentare einzufügen.

Nach mehrfachen Probieren werden z.B. die Logger Initialisierungen aus den Java-Klassen gelöscht. Es werden auch nur teilweise die Kommentare gesetzt z.B. nur bei der Klasse "Person" aus dem "Code Style Example".

Vielen Dank schon im Voraus!
Jigsaw

Edit: Habe die Code-Tags eingefügt

Comments

  • edited January 2013
    Hallo Jigsaw,

    zunächst Danke für den Fehlerreport beim "Xpand Reference" Link, wir korrigieren das Link Target. Korrekt muss das natürlich nach http://help.eclipse.org/indigo/index.jsp?topic=/org.eclipse.xpand.doc/help/xpand_reference_introduction.html gehen.

    Also, wenn ich Deine Frage korrekt verstehe, ist Dein primärer Use Case das Reverse Engineering: Du hast Source Code (hauptsächlich Entities, Business Functions und Business Services) und möchtest ein Modell davon anlegen. Im Klassendiagramm möchtest Du möglichst viel Abstraktion und Du möchtest visuell sehen, welche Klassen nun ein Entity, eine Business Function oder ein Business Service ist. Den bestehenden Code verändern möchtest Du nicht, und Du möchtest eigentlich auch keinen neuen Code generieren.

    Mit dem CodeStyles Tutorial bist Du schon an der richtigen Stelle. Aber benötigst Du wirklich einen eigenen CodeStyle? Getter/Setter werden schon von UML Lab's build-in CodeStyles erkannt und ausgeblendet (es sei denn die Methoden entsprechen nicht den JavaBeans Konventionen und enthalten anderen Code, wie es bspw. im mitgelieferten Logger Beispiel der Fall ist) - und das Taggen der Klassen nach Entity/Business Function/Business Service kannst Du auch mit Hilfe von QVT erreichen.

    Wir sind gerade dabei ein Tutorial hierzu zu verfassen, aber im Wesentlichen geht das ganz einfach: Mit Hilfe von QVT kannst Du je nach Namen des Packages einen entsprechenden Stereotypen an die Klasse applizieren -> die Klassen sind nun entsprechend markiert und Du siehst die Markierung im Klassendiagramm und kannst Dir Diagramme je nach Wunsch zusammenstellen.

    Zusätzlich könntest Du auch noch mehr machen, zum Beispiel hat UML Lab Unterstützung für OCL - hiermit kannst Du die per Stereotyp entsprechend markierten Klassen automatisch visuell im Diagramm markieren lassen: Andere Farben, Schriften, Icons, etc. oder auch mit Warning/Error Marker (in Deinem Fall wohl nicht relevant).

    Würde Dir das weiterhelfen? Wir bundeln gerade die nächste UML Lab Version (1.5.2), diese wird direkten Support für QVT enthalten (bisher geht das leider ein wenig umständlich). Wenn wir die Release draußen haben, kann ich Dir ein Beispielscript hier posten, wenn Du magst.

    Viele Grüße
    Manuel

    PS: Code Tags gehen so hier: <code> some source code </code > Weitere primitive HTML Entitäten sind auch erlaubt.
  • edited January 2013
    Zudem treten Fehlermeldungen auf, die ich als Logfile angehängt habe. Außerdem habe ich noch die einzelnen Dateien angehängt, damit das Ganze übersichtlicher ist. Die Dateienden habe ich den Suffix .txt hinzugefügt.

    Edit: Danke für die Antworte, ich denke als erstes wird mir das ausreichen. Danke für das Angebot, das nehme ich gerne an. Hier noch einmal die Fragen geordnet:
    1.) Wann wird ca. die nächste Version released?
    2.) Gibt es ein Code-Beispiel zu dem farbigen Markieren der Stereotypen?
    3.) Ist es möglich UML Lab so einzustellen, dass nur reverse engineered wird?
    log
    log
    error logfile.log
    440K
    txt
    txt
    File.xpt.txt
    932B
    txt
    txt
    Attribute.xpt.txt
    2K
    txt
    txt
    Stereotypes.xpt.txt
    332B
    txt
    txt
    StereotypesUtils.ext.txt
    644B
  • Hallo Herr Bork,

    ich würde mich über eine Antwort auf meinen letzten Post freuen.
  • Hallo Jigsaw,

    ok, machen wir so. Wir arbeiten aktuell an der Release, Ende nächster Woche wird sie veröffentlicht. Ich werde dann ein QVT Beispiel Script mit Anleitung posten.
    Gibt es ein Code-Beispiel zu dem farbigen Markieren der Stereotypen?
    Ja, das wird bspw. von unserem Legacy Code Style verwendet, um dessen Verwendung durch graue Schrift beim jew. Element zu visualisieren. Das kann man sich folgendermaßen angucken:

    • Im UML Lab Tree die System Profiles einblenden: UML Lab Tree View wählen, den Button mit Pfeil-Runter-Symbol oben rechts im View klicken, Customize View... wählen, und im folgenden Dialog den Haken bei den System Profiles herausnehmen. Nun erscheinen im UML Lab Tree alle geladenen System-Profile.

    • Im UML Lab Tree das Package UMLLabProfile ausklappen und den Stereotyp LegacyStyledElement selektieren.

    • Nun in der Properties View das Tab Constraints wählen. Dort sieht man nun zwei OCL Constraints: LegacyInUse und InconsistentHashCodeEquals

    Bei ersterem ist ein Visual konfiguriert - die graue Schriftart. Der OCL Ausdruck ist hier sehr einfach - es werden schlichtweg alle Elemente, auf denen der Stereotyp LegacyStyledElement appliziert ist, grau dargestellt. (Hinweis: Der OCL Ausdruck ist false, was zunächst vielleicht verwunderlich ist - denn die Markierung soll ja immer erfolgen, also wäre true logisch richtig. Dies erklärt sich damit, dass die Anwendung der konfigurierten farblichen Markierung nur dann erfolgt, wenn der OCL Ausdrücke zu "Falsch" ausgewertet wird. Daher müssen alle OCL Ausdrücke für diesen Anwendungsfall negiert werden.) Im zweiten Beispiel sieht man übrigens einen wesentlich komplexeren OCL Ausdruck.
    Ist es möglich UML Lab so einzustellen, dass nur reverse engineered wird?
    Es ist möglich die automatische Codegenerierung beim Speichern zu deaktivieren. Dazu muss Generate code automatically on save deaktiviert werden (Window->Preferences->UML Lab->Code Generator). Diese Setting ist Workspace-global, in UML Lab 1.5.2 wird es möglich sein diese Einstellung auch pro Eclipse Projekt oder pro UML Modell vorzunehmen.

    Beste Grüße
    Manuel Bork

    PS Danke für den Reminder, ich bekomme leider keine Benachrichtigungen auf editierte Posts :/
  • Hallo Herr Bork,

    dankeschön für Ihre ausführlichen Antworten, das mit dem Antworten macht nichts :)

    Zu dem "farbigen Markieren von Stereotypen":
    Ich bin Ihrer Anleitung gefolgt, jedoch kann ich bei "LegacyStyledElement" nichts verändern. Folgendär Error tritt auf:


    java.lang.RuntimeException: com.yattasolutions.obf.ms.y$e: Cannot modify resource: pathmap://UMLLAB_PROFILES/UMLLab.profile.uml
    at com.yattasolutions.obf.ht.d.c(SourceFile:172)
    at com.yattasolutions.obf.fz.d.a(SourceFile:1)
    at com.yattasolutions.obf.fz.d$7.widgetSelected(SourceFile:269)
    at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:248)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4169)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3758)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1029)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:923)
    at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:86)
    at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:588)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:543)
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
    at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:124)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:353)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:180)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:629)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:584)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1438)
    Caused by: com.yattasolutions.obf.ms.y$e: Cannot modify resource: pathmap://UMLLAB_PROFILES/UMLLab.profile.uml
    at com.yattasolutions.obf.ms.y.j(SourceFile:611)
    at com.yattasolutions.obf.ms.y.a(SourceFile:604)
    at com.yattasolutions.obf.ht.d.c(SourceFile:166)
    ... 28 more


    Aus der Fehlermeldung entnehme ich, dass ich UML Lab eigene Resourcen nicht editieren kann. Die Datei "UMLLab.profile.uml" konnte ich nicht finden und selbst anpassen, weder im plugins Ordner, noch in den .jar Files (allerdings habe ich auch nicht alle durchsucht bei ca. 900 Dateien). Gibt es eine Möglichkeit das gewünschte Resultat des farbigen Markierens von bestimmten Klassen/ Stereotypen zu erreichen?

    Danke schon im Voraus.
    Grüße
  • Hallo Jigsaw,

    richtig, diese Resourcen sind schreibgeschützt geladen. Das besagte Profil ist nicht dazu gedacht geändert zu werden. Wir sollten die Fehlermeldung verbessern finde ich ;).

    Sie können das Einfärben von Elementen mit OCL in eigenen Profilen nutzen. Wenn Sie zB das CodeStyles Tutorial oder Profiles Tutorial (http://www.uml-lab.com/de/uml-lab/tutorials/codestyles-tutorial/ bzw. http://www.uml-lab.com/de/uml-lab/tutorials/uml-profiles-tutorial/) von uns nehmen, können sie das am Stereotyp LoggerStyledElement oder ValueChecked ausprobieren.

    Viele Grüße
    Manuel Bork
  • edited January 2013
    Hallo Herr Bork,

    leider muss ich Sie noch einmal belästigen :)

    Die Werkzeuge sind mir gegeben, nur leider kann ich sie noch nicht so einsetzen, dass etwas konstruktives dabei herauskommt.

    Es sollten einfach nur Kommentare gesetzt werden. Über Ihre Anleitung sollten diese Elemente farbig markiert werden. Leider funktioniert anscheinend dieser Code nicht:


    «IMPORT uml»
    «IMPORT UMLLabProfile»
    «IMPORT StereotypStyle»
    «IMPORT java::standard»
    «IMPORT java::standard::classDiag::property»
    «IMPORT java::standard::classDiag::operation»
    «IMPORT java::standard::classDiag::assoc»
    «IMPORT java::standard::classDiag::classifier»

    «EXTENSION Utility»
    «EXTENSION java::standard::classDiag::classifier::ClassifierExtensions»
    «EXTENSION xtend::StereotypeUtils»


    «DEFINE Stereotyp (StereotypStyledElement style, Classifier class) FOR Classifier»
       /**
          * Kommentar
       «IF hasEntityInName(class)»
          * Stereotyp: Entity
       «ELSEIF hasBFInName(class)»
          * Stereotyp: BusinessFunction
       «ELSEIF hasBSInName(class)»
           * Stereotyp: BusinessService
       «ENDIF»
       */
    «ENDDEFINE»


    Es werden nur Befehle wie diese aus einem Xtend File ausgeführt:

    import uml;
    import UMLLabProfile;

    extension Utility;

    boolean hasEntityInName(Classifier this):
    this.getQualifiedName().contains("Entity");


    Das Ganze ist recht primitiv, leider funktioniert es nicht. Können Sie mir sagen worin der Fehler liegt?
  • Hallo Jigsaw,

    gerne doch ;).

    Also, ich verstehe Ihr Szenario nicht ganz recht. Wenn ich Sie recht verstanden habe, wollen Sie doch Source Code reverse engineeren und ihn dann entsprechend aufbereitet visualisieren. Wie meinen Sie in diesem Zusammenhang dann Folgendes:

    Es sollten einfach nur Kommentare gesetzt werden.
    Meinen Sie es sollen beim Code Generieren Kommentare generiert werden (= der Code soll verändert werden), oder sollen beim Einlesen Kommentare im UML Modell angelegt werden? Oder sind diese Kommentare bereits im Source Code vorhanden und Sie möchten diese zur Erkennung nutzen?

    Viele Grüße
    Manuel Bork
  • edited January 2013
    Hallo Herr Bork,

    dies war lediglich ein Test. Später sollen dann die Stereotypen gesetzt werden. Der Code sollte im realen Anwendungsfall unberührt bleiben. Beim Einlesen sollten die Kommentare in den Source Code geschrieben werden (nur in diesem Test).

    Das hätte ich dazu sagen müssen, sonst ist es wirklich verwirrend.
  • Ok, verstehe. Wie gesagt, ich würde das dann nur mit Hilfe der UML Lab Standard Templates machen, und ich gebe Ihnen Beispielscripte sobald unsere Release online ist.

    Beim Einlesen sollten die Kommentare in den Source Code geschrieben werden (nur in diesem Test).
    Ich fürchte wir sprechen doch noch ein wenig aneinander vorbei: Beim Einlesen kann der Source Code nicht verändert werden, sondern nur beim anschließenden Generieren. UML Lab verwendet Templates um Code zu generieren und auch um ihn einzulesen. Enthalten die Templates Abschnitte, die nicht auf den Code passen (weil sie bspw. nicht im Code existieren) "passen" die Templates nicht, und sie werden nicht verwendet um den Code einzulesen.
  • Ich habe mich ein wenig ungenau ausgedrückt. Beim Generieren des Codes sollten dann die Kommentare gesetzt werden. Eigentlich ist es erst einmal egal, was gemacht wird, das sollte sowieso nur ein Test sein. Ich wollte nur testen, ob der Code-Schnippsel funktioniert. Nach Ihrer Aussage passt dann der Code nicht zu den Templates. Den Fehler kann ich jedoch nicht erkennen.
  • Ok :). Also dann müsste das Template für das Generieren funktionieren, sobald der CodeStyle der jeweiligen Klasse auf StereotypStyledElement umgestellt wird.
  • edited January 2013
    Ich bekomme diese Fehlermeldung:
    Assignment ''${com.yattasolutions.codegen.util.Utility.getQualifiedName(${this},".")}': 'eu.dummy.business.service.Dummy1BusinessService'' was not processed.

    Ist an dem getQualifiedName()-Aufruf etwas falsch?
  • Nein, diese Fehlermeldung kommt beim Reverse Engineering und ist auch nur hierbei relevant, nicht beim Code Generieren. Sie bedeutet, dass dieses Statement nicht beim Berechnen des Modells genutzt wurde.

    Bekommen sie denn Fehlermeldungen, wenn Sie

    a) Release Tempaltes (UML Lab -> Reload Templates) ausführen? Hier werden die Templates neu geladen, wenn es hierbei Fehlermeldungen gibt funktionieren danach sowohl der Generator als auch das Reverse Engineering nicht korrekt.

    b) Code Generieren? Setzen Sie den CodeStyle einer beliebigen Klasse auf StereotypedStyle und wählen Sie hier Generate Code (per Rechtsklick auf das Diagramm).
  • edited January 2013
    Ich bekomme beides mal keine Fehlermeldung, nur bei "reparse all files", d.h. dann?
    Wenn ich den CodeStyle einer beliebigen Klassen setze, bekomme ich auch die gewünschte Färbung.
  • Ok, das mit der Färbung ist super. Bei "reparse all files" spielt die Fehlermeldung in dem Fall keine Rolle, denn dabei handelt es sich ja nur um das Reverse Engineering. Wenn Sie beim Generieren keine Fehlermeldung erhalten, sollte ihr Template beim Generieren den gewünschten Kommentar in den Source Code generieren.
  • edited January 2013
    Mh, die Färbung tritt nur auf, wenn ich die Klasse manuell anklicke und dann über die Properties bei CodeStyle "Stereotyp" wähle. Der Sinn ist es ja, dass es am Ende voll automatisiert passiert. Bei über 1000 Klassen will ich am Ende dann nicht alle Klassen des Stereotyps "Entity" manuell anwählen wollen :)
    Auch wird der Code nicht in den Source Code geschrieben.

    Vielleicht können Sie die Situation nachstellen. Hier die leicht modifizierte Version im Vergleich zu vorher:

    File.xpt:
    «IMPORT uml»
    «IMPORT UMLLabProfile»
    «IMPORT StereotypStyle»

    «EXTENSION Utility»
    «EXTENSION java::standard::classDiag::classifier::ClassifierExtensions»
    «EXTENSION xtend::StereotypeUtils»

    «DEFINE Stereotyp (StereotypStyledElement style, Classifier class) FOR Classifier»
       /**
       «IF isInBFPackage(class)»
          * Stereotyp: BusinessFunction kommentar
       «ELSEIF isInBSPackage(class)»
          * Stereotyp: BusinessService KOmmentar
       «ENDIF»
       */
    «ENDDEFINE»



    StereotypeUtils.ext

    import uml;
    import UMLLabProfile;

    extension Utility;

    boolean isInBFPackage(Classifier this):
    this.package.getQualifiedName(".").endsWith(".business.functions");

    boolean isInBSPackage(Classifier this):
    this.package.getQualifiedName(".").endsWith(".business.service");
  • Richtig, das Taggen der Klassen muss auf jeden Fall automatisch passieren. Wie gesagt, das würde ich allerdings nicht mit den Templates lösen, sondern in Ihrem Fall mit Hilfe eines QVT Scripts.

    Zu Ihrem Beispieltemplates: Sie haben das Template "Stereotype(StereotypeStyledElement, Classifier)" in der Datai File.xpt spezifiziert. Wo haben Sie den Aufruf dazu drin?
  • Wo sollte dieser Aufruf stehen und wie sollte der aussehen?
  • Ausgehend von einem Root-Template (Model.xpt) wird dem XPand Code Generator die Steuerung (wann welches Template aufgerufen wird) überlassen. Einzig an den existierenden Templates, die einen CodeStyle Parameter enthalten, kann man sich zusätzlich einhängen. Das sind die Templates, die vom Code Style Wizard angeboten werden.

    In Ihrem Fall sollte der Aufruf im Classifier Template erfolgen - oben, in einem Ihrer ersten Posts haben Sie auch den Aufruf schon im Template stehen:

    «DEFINE classifier (LoggerStyledElement style) FOR Classifier»
    «EXPAND java::standard::Comment::comment FOR this»
    «EXPAND xpand::Stereotypes::Stereotype FOR this»
    «REM»«EXPAND annotations(style) FOR this»«ENDREM»
    «visibilityString()» «IF isAbstract && !isInterface()»abstract «ENDIF»«IF isStatic()»static «ENDIF»
    «IF isFinal()»final «ENDIF»
    ...

    Die Deklaration des Templates muss also angepasst werden (anstelle von LoggerStyledElement StereotypStyledElement) und dann kann der Aufruf weiter unten auch angepasst werden:

    «EXPAND Stereotypes::Stereotyp FOR this»
    Dieses classifier(LoggerStyledElement) Template hängt sich somit in unseren Codegenerator hinein. Wichtig ist, dass es im File.xpt Template ist (so, wie vom CodeStyle Wizard angelegt).

    Stereotype.xpt muss nun neben File.xpt liegen, und ich würde das Template ändern (die Parameter entfernen, sind unnötig):

    «DEFINE Stereotyp FOR Classifier»
    /**
    «IF isInBFPackage(this)»
    * Stereotyp: BusinessFunction kommentar
    «ELSEIF isInBSPackage(this)»
    * Stereotyp: BusinessService KOmmentar
    «ENDIF»
    */
    «ENDDEFINE»
  • edited January 2013
    Vielen Dank für Ihre ausführlichen Antworten und Ihre Geduld!

    Leider bekomme ich eine Fehlermeldung:

    «DEFINE classifier (StereotypStyledElement style) FOR Classifier»
       «EXPAND java::standard::Comment::comment FOR this»
       «EXPAND xpand::Stereotypes::Stereotyp FOR this»
       
       «REM»«EXPAND annotations(style) FOR this»«ENDREM»
       «visibilityString()» «IF isAbstract && !isInterface()»abstract «ENDIF»«IF isStatic()»static «ENDIF»
       «IF isFinal()»final «ENDIF»
       «getClassOrInterfaceString()» «EXPAND Type::type(this) FOR this»
       «LET getGeneralization() AS generalization»
          «IF generalization != null && !isInterface()»
              extends «EXPAND Type::type(generalization) FOR generalization.general»
          «ENDIF»
       «ENDLET»
       «IF !getInterfaces().isEmpty» «extendsClause()» «""-»
          «FOREACH getInterfaces() AS relationship SEPARATOR ", "»
             «IF relationship.target.size > 0»
                 «EXPAND Type::type(relationship) FOR (Classifier) relationship.target.fromSingleton()»
             «ENDIF»
          «ENDFOREACH»
       «ENDIF»
        {
       «IF isEnum() && !isInterface()»«REM»TODO !isInterface() should not be needed«ENDREM»
          «LET (Enumeration) this AS enum»
             «FOREACH enum.ownedLiteral AS literal SEPARATOR ", "»
                «literal.name»
                «LET (Expression)literal.specification AS expression»
                   «IF expression != null && !expression.operand.isEmpty»
                      («""-»
                      «FOREACH expression.operand AS operand SEPARATOR ", "»
                         «operand.stringValue()»
                      «ENDFOREACH»
                      )«""-»
                   «ENDIF»
                «ENDLET»
             «ENDFOREACH»
             ;
             
          «ENDLET»
       «ENDIF»
       
       «EXPAND java::standard::classDiag::classifier::File::classifierChildren(style) FOR this»
       }
    «ENDDEFINE»



    Couldn't find definition xpand::Stereotypes::Stereotyp for type
    uml::Classifier


    Ich habe die Stereotypes.xpt im Package von der File.xpt liegen zusätzlich noch in einem Package namens "xpand" neben dem Package von der File.xpt leider funktioniert es immer noch nicht. Auch habe ich es mit "xpand::Stereotypes::Stereotyp" statt "xpand::Stereotypes::Stereotype" versucht.

    Zusätzlich ist mir noch nicht ganz klar, wo ich das:
    «EXPAND Stereotypes::Stereotyp FOR this»
    einfügen soll. Spontan würde ich nach dem Aufruf sagen:
    «EXPAND java::standard::classDiag::classifier::File::classifierChildren(style) FOR this»

    Entschuldigen Sie mein Nachfragen, leider habe ich in Xpand so gut wie keine Erfahrung.
  • Also ich würde den Aufruf in der zweiten Zeile des Templates stehen lassen, damit der Kommentar oberhalb der Klasse generiert wird.

    Um den Fehler einzugrenzen, würde ich den Aufruf aber zunächst entfernen, durch eine beliebige Zeichenketter ersetzen und einmal testweise generieren - nur um sicher zu gehen, dass alles ansonsten funktioniert.

    Z.B. so:«DEFINE classifier (StereotypStyledElement style) FOR Classifier»
    «EXPAND java::standard::Comment::comment FOR this»
    /*testing*/

    «REM»«EXPAND annotations(style) FOR this»«ENDREM»

    Der Name des Expand-Ausdrucks bezieht sich auf den Dateinamen ("Stereotypes") gefolgt vom Templatenamen ("Stereotyp") (und ggf. Parameter). Sprich, wenn Stereotypes.xpt neben File.xpt liegt muss der Aufruf folgendermaßen lauten:

    «EXPAND Stereotypes::Stereotyp FOR this»
    Leider kann ich die Dokumentation im Eclipse Wiki nicht direkt verlinken; Hilfe zur Syntax finden Sie hier: http://help.eclipse.org/indigo/topic/org.eclipse.xpand.doc/help/xpand_reference_introduction.html?path=61_1_0_5_2_4#xpand_reference_expand unter "Xpand2 -> Statements of the Xpand language -> EXPAND".
  • Leider wird weder Code in die Klassen generiert, noch werden die Klassen farbig markiert, sprich die CodeStyles appliziert. Wieder kann ich die CodeStyles auf die Klassen manuell applizieren über die Properties. In Klammern steht nach dem CodeStyle Namen ausgegraut "Profile not yet applied".

    Die File.xpt sieht so aus:

    «IMPORT uml»
    «IMPORT UMLLabProfile»
    «IMPORT StereotypStyle»
    «IMPORT java::standard»
    «IMPORT java::standard::classDiag::classifier»

    «EXTENSION Utility»
    «EXTENSION java::standard::classDiag::classifier::ClassifierExtensions»

    «DEFINE classifier (StereotypStyledElement style) FOR Classifier»
       «EXPAND java::standard::Comment::comment FOR this»
       /*testing*/
       «EXPAND Stereotypes::Stereotyp(style, this) FOR this»
       «REM»«EXPAND annotations(style) FOR this»«ENDREM»
       «visibilityString()» «IF isAbstract && !isInterface()»abstract «ENDIF»«IF isStatic()»static «ENDIF»
    ...

    Selbst das "/*testing*/" wird nicht in die Klassen generiert. Klicke ich in das Diagramm und wähle "Generate Code", passiert ebenfalls nichts.

    Sollte nicht wenigstens der testing-Kommentar in die Klassen geschrieben werden?
  • Hallo Jigsaw,

    ich habe mal Ihr Beispiel nachgebaut und den "Stereotyp"-CodeStyle angelegt, in dem der String "/*testing*/" generiert wird, wenn man den CodeStyle manuell in einem Beispielprojekt auf einer Beispielklasse appliziert. Das Projekt einfach in den Workspace importieren (vorher das existierende Stereotyp Projekt entfernen).

    Sie erhalten dann folgenden Code:

    /*testing*/
    public class NewClass1 {
    }
    zip
    zip
    Stereotyp.zip
    5K
  • edited January 2013
    Gab es irgendein Problem mit dem Zeichensatz? In jedem Zeilenende und Zeilenanfang befinden sich "Â", allerdings meldet UML Lab keine Probleme.

    In dem Projekt werden immer noch keine Kommentare erzeugt, vielleicht mache ich auch etwas falsch. Ich beschreibe mal mein Vorgehen:
    Diagramm des Projektes anlegen über New -> UML Model and Class Diagram -> Output Ordner wählen -> Single Class Diagram -> Die zu wählenden Resourcen anwählen (nur der src Ordner) -> Finish
    Die neu erstellte .uml Datei rechtsklicken -> UML Lab -> Reparse All Files -> Hier müsste doch schon der Code generiert werden und die Klassen farbig markiert werden?
    Spätestens wenn ich in das Diagramm klicke an einer beliebigen Stelle -> Generate Code
    Ich habe auch mal meinen Code-Style angehängt.
    zip
    zip
    Stereotype.zip
    8K
  • Oh, das ist ein UTF-8 Problem - mein Workspace ist in UTF-8 und ich habe das nicht explizit auf dem Projekt gesetzt.

    Nein, das ist nicht richtig. UML Lab verändert den Code ja nicht einfach, sondern nur, wenn etwas im Modell verändert wird. Wie wärs wir telefonieren kurz? Dann können wir das Problem bestimmt schneller lösen.

    Wenn Sie mögen, rufen Sie einfach bei uns an, Sie erreichen uns unter 0561 574 32 77 0.
  • Die UML Lab 1.5.2 Release ist nun online verfügbar - ich werde dann noch ein Beispielprojekt für die Markierung der Klassen mit QVTo hochladen.
  • Dankeschön Herr Bork für Ihren Einsatz! :)
  • Hallo Herr Bork,

    wann kann ich mit dem Beispielprojekt rechnen? :)

    Grüße
  • edited January 2013
    Hallo Jigsaw,

    ich war diese Woche auf der OOP in München, daher die Verzögerung. Hier das kleine Beispiel, was Ihren Use Case allerdings schon recht gut abdecken sollte:

    modeltype UML uses 'http://www.eclipse.org/uml2/4.0.0/UML';

    transformation NameTagging(inout uml : UML);

    main()
    {
    // invoke toggleTagName on all NamedElements of the model.
    // to invoke it only on Classes and Interfaces, change to 'Classifier'
    uml.objectsOfType(NamedElement)->map toggleTagName();
    }

    mapping inout NamedElement::toggleTagName ()
    {
    // remove existing tags if they are 'invalid'
    // (optional operation, to cleanup after model modifications etc)
    self->map untagName ();
    // create tags
    self->map tagName ();
    }

    mapping inout NamedElement::tagName ()
    when
    {
    // invoke on all elements named ".*Service" ...
    self.name.match(".*Service")
    // ... and missing the Stereotype application
    and self.getAppliedStereotype("UMLLabProfile::UnresolvedElement")->isEmpty()
    }
    {
    // get stereotype and apply
    var stereotype : Stereotype :=
    self.getApplicableStereotype("UMLLabProfile::UnresolvedElement");
    self.applyStereotype(stereotype);
    }

    mapping inout NamedElement::untagName ()
    when
    {
    // invoke on all elements *not* named ".*Service" ...
    not self.name.match(".*Service")
    // ... but having the Stereotype applied
    and not self.getAppliedStereotype("UMLLabProfile::UnresolvedElement")->isEmpty()
    }
    {
    // get stereotype and unapply
    var stereotype : Stereotype :=
    self.getAppliedStereotype("UMLLabProfile::UnresolvedElement");
    self.unapplyStereotype(stereotype);
    }



    Speichern Sie das Script einfach in einer Datei, zB als "NameTagging.qvto" und rufen Sie es auf dem Modell auf: Dazu wählen Sie im UML Lab Tree View das Rootpackage des Modells aus und wählen im Kontextmenü Apply QVTo Transformation. Im Filechooser dann das Script wählen et voilà - alle NamedElements, deren Namen auf "Service" endet, haben nun den Stereotyp UnresolvedElement appliziert.

    Ersetzen Sie UMLLabProfile::UnresolvedElement einfach durch Ihren eigenen Stereotypen und denken Sie daran, das Profil, in dem der Stereotype definiert ist zunächst zu applizieren (Modell im UML Lab Tree View selektieren und das jeweilige Profil im Properties View auf dem Tab "Profiles" applizieren).

    Viel Spaß beim Ausprobieren
    Manuel Bork
  • Hallo Jigsaw,

    hat alles funktioniert?

    Viele Grüße
    Manuel Bork
  • edited February 2013
    Hallo Herr Bork,

    das Script hat wunderbar funktioniert, der Stereotyp "UnresolvedElement" wurde auch auf die Klassen übertragen, allerdings bin ich bei dem Schritt "eigenen Stereotyp anlegen" stecken geblieben. Ich habe dann auch einiges versucht und habe dann auch den MDD Zuständigen gefragt, deswegen hat die Antwort so lange gebraucht. In UML Lab hat er es allerdings nicht hinbekommen einen eigenen Stereotyp anzulegen. Funktioniert das Anlegen äquivalent zu MagicDraw?

    Edit: Nicht wundern über den Nickname :)
  • Stereotypen können nur in UML Profilen angelegt werden. Ein UML Profil ist eine spezielle Art von Modell.

    Dazu am einfachsten eine neue Profil Datei mit Klassendiagramm mit unserem CodeStyle-Wizard anlegen (ohne dabei Templates zu überschreiben). Den Stereotyp legen Sie im Klassendiagramm per Rechtsklick-Drag an. Dann importieren Sie die entsprechende UML Metaklasse (in Ihrem Fall wohl am Besten Classifier), indem Sie im Diagramm rechtsklicken und "Add/Remove Meta Class" wählen. Zwischen Stereotyp und Metaklasse muss dann noch eine StereotypeExtension angelegt werden (per Rechtsklick-Drag, wie beim Anlegen einer Assoziation).

    Unser UML Profiles Tutorial zeigt wie das hier beschriebene im Detail funktioniert - orientieren Sie sich am Stereotyp "ValueChecked", der dort angelegt wird.
  • Super, vielen Dank! Es hat alles wunderbar geklappt, danke für Ihre Mühe und Durchhaltvermögen! :)
  • Klasse - gerne!
  • edited February 2013
    Hallo Herr Bork,

    ich habe das Gefühl, dass die QVT Transformation noch nicht stabil funktioniert. Lege ich erstmals ein Projekt an und appliziere die QVT Scripte funktioniert es. Schließe ich jedoch UML Lab und öffne es erneut, wird die QVT Transformation nicht erneut geladen (vielleicht Absicht?). Will ich dann dieselben Scripte erneut applizieren, werden willkürlich Elemente eingefärbt. Selbst wenn ich die .uml und .umlcd lösche und sie mir erneut generieren lasse, tritt dieser Fehler auf. Edit: Auch wenn ich das Projekt erneut ohne Modelle importiere. Falls der Bedarf besteht, kann ich Ihnen auch den workspace zippen und zusenden.
  • Hallo Jigsaw,

    das Anwenden von QVT Transformationen ist eine einmalige Aktion, die das Modell verändert. Damit die Änderungen persistent sind, muss das Modell dann gespeichert werden.

    Wenn das Modell nicht gespeichert wird, ist beim nächsten Öffnen der Zustand wieder wie zuvor, und die Transformation muss erneut angewendet werden.

    Komisch - natürlich sollte das erneute Anwenden der Transformation auch wieder das selbe Ergebnis bewirken (soweit das QVT Script deterministisch formuliert ist, versteht sich). Zwei Dinge: Können Sie bitte prüfen, ob das UML Profil, in denen die Stereotypen definiert sind, vor dem Applizieren geöffnet sind? Hierfür reicht ein Blick in den UML Lab Tree View. Normalerweise werden alle Profile, deren Dateiname auf ".profile.uml" enden, automatisch geöffnet. Außerdem muss vor dem Ausführen des QVT Scripts das Profil auf dem Modell angewendet sein. Hierzu selektieren Sie das UML Modell im UML Lab Tree View und schauen in den Properties nach, ob das Profil appliziert ist.

    Wenn beides der Fall ist und es trotzdem reproduzierbar nicht funktioniert würde ich mich sehr über den Workspace freuen!

    Viele Grüße
    Manuel Bork
  • Hallo Jigsaw,

    danke fürs Zusenden des Workspaces. Ich denke ich weiß, was die Probleme sind:

    - Die Einfärbungen im Klassendiagramm geschehen erst nach dem Ausführen der Constraint-Validierung. Diese geschieht automatisch nach jeder Änderung am Modell. Wenn Sie das Klassendiagramm aber nur öffnen, dann wird die Constraint-Validierung nicht wieder ausgeführt. Dann müssen Sie diese manuell anstoßen, indem Sie im UML Lab Menü "Validate Model Constraints" ausführen.

    - Die OCL Regeln sind doppelt definiert: Einerseits an den Stereotypen (BusinessFunction, BusinessService und Entity) - andererseits an den CodeStyle-Stereotypen (BusinessFunctionProfileStyledElement und BusinessServiceProfileStyledElement). Letzteres wahrscheinlich wegen der ersten Versuche das Taggen über die Templates zu realisieren. Beides zusammen führt nun zu nicht-deterministischem Verhalten :/. Wenn Sie die OCL-Regeln an den CodeStyle-Stereotypen entfernen, verhält sich alles wie es soll :).

    Viele Grüße
    Manuel Bork

    PS: Ich werde dies in unserem Team diskutieren, ob es nicht sinnvoll ist die Validierung sofort beim Öffnen des Klassendiagramms auszuführen.
Sign In or Register to comment.