# RCP-Anwendung aus EMF erzeugen und vor allem danach modifizieren



## JanHH (9. Feb 2010)

Hallo,

wenn man mittels eines EMF-Modells eine komplexe RCP-Anwendung auf Basis von Eclipse erstellen will, wie geht man dann vor? Ich hab zwar ein Buch über EMF, aber da wird nix über RCP gesagt, und ein Buch über RCP, aber da wird nix über EMF gesagt.

Meine naive Vorstellung ist:

Man kann von EMF ja auch einen Editor für das Datenmodell erzeugen lasssen. Damit kann man das Modell grundsätzlich bearbeiten, aber diese Editor-Applikation entspricht ja bei weitem noch nicht der angepeilten, fertigen Anwendung. Dennoch ist das automatisierte Erzeugen von Editor für Baumstrukturen, Properties usw. natürlich enorm praktisch.

Man lässt sich also den Editor-Code erzeugen, hat damit ein Grundgerüst für die Anwendung, und bearbeitet diesen dann per Hand nach.

Oder wie?

Gruß+Danke
Jan


----------



## Wildcard (9. Feb 2010)

Der EMF Editor ist sehr erweiterbar. Du kannst auch deinen eigenen Implementieren, wenn er dir nicht zusagt und trotzdem von EMF profitieren, da dir im generierten Edit Code schon ContentProvider, LabelProvider, Commands,... erstellt wurden. Damit ist es dann sehr einfach einen eigenen Editor umzusetzen.
Zusätzlich gibt es auch noch GMF um grafische Editoren zu generieren und XText für textuelle.
Eine schickere Properties View kann man sich mit wenigen Klicks mit EFF erzeugen.
Allen Ansätzen gemein ist, dass ausdrücklich erwünscht ist generierten Code mit händischem zu mischen. Versteh es allerdings nicht als initialen Generator und danach händisches weiterarbeiten.
Der Workflow ist üblicherweise:
-generieren
-customizen
-generieren
-weiter customizen...

Händische Änderungen bleiben dabei dank JMerge erhalten sofern man sich an die Doku hält. 
	
	
	
	





```
@generated NOT
```
 usw.
Wenn du nun daraus einen RCP haben möchtest, dann erstellst du mit Eclipse eine Product Definition, wählst die PlugIns/Features aus die enthalten sein soll, definierst Icon und Splashscreen und schon kannst du den RCP auf Knopfdruck bauen.


----------



## JanHH (10. Feb 2010)

Danke für die Antwort. Es hat sich aber mal wieder herausgestellt, wie es so oft mit leistungsfähigen Frameworks ist.. man muss sich da erstmal ziemlich intensiv einarbeiten, in diesem Fall sogar in mindetens zwei (EMF und Eclipse RCP), und das dauert dann alles in allem sehr viel länger, als wenn ich die Sachen einfach per Hand selber programmiere. Es bringt einem wenig, wenn man weiss das die tollsten Sachen möglich sind, aber bevor sie das dann auch ganz praktisch sind, liegt die Lektüre eines oder mehrer Bücher mit 500 Seiten Dicke vor einem, noch dazu auf Englisch.

Zumal das Datenmodell in meiner Anwendung relativ simpel ist. Kann man in einer Stunde selber programmieren, und XML mittels JaxB ist auch schnell obendraufgesetzt.

Hab mich jetzt endgültig dafür entschieden, das Datenmodell selber zu schreiben, XML-konvertieren mit JaxB zu integrieren, Persistenz mittels JPA und alles nicht als RCP-Anwendung, sondern als seam-basierte Webanwendung. Das ist die beste und produktivste Variante.


----------



## Wildcard (10. Feb 2010)

Wie du meinst, ich würde allerdings unabhängig von dieser Anwendung die Einarbeitung in EMF in Erwähgung ziehen, als Investition in die Zukunft...
Eclipse on my mind: Lessons learned about modeling


----------



## JanHH (12. Feb 2010)

Ich finde EMF ja auch grundsätzlich schon gut. Es hängt wirklich von der konkreten Anwendung ab. EMF hat schon viel Overhead, den man erstmal lernen muss. Wenn man z.B. gar keine RCP-Editoren gebrauchen kann (weil man eine Webanwendung schreibt), ist z.B. JaxB deutlich einfacher, wenn es "nur" darum geht, aus Objekten XML zu machen und umgekehrt. Einarbeitung samt Ausprobieren 10 Minuten, ein paar Annotationen, vier Zeilen java-Code, fertig. Und bereits mit JaxB hat man schon viel produktiven Gewinn. Da EMF ja sicherlich noch deutlich mehr kann, kann ich mir schon vorstellen, dass man damit sehr gut effizient Anwendungen entwickeln kann. Aber um ein Projekt innerhalb weniger Tage fertigzustellen, ist der Einarbeitungsaufwand erstmal zu groß.


----------



## Wildcard (12. Feb 2010)

Das gleiche bekommt man mit EMF aber auch. Mehr als 10 Minuten dauert es nicht ein Modell inklusive XML Repräsentierung zu erzeugen. Wahlweise wie bei JaxB aus Annotationen, per Ecore Editor, Grammatik, oder XML Schema. Also dabei sehe ich keinen großen Unterschied ausser, dass das EMF Modell deutlich besser als das JaxB Modell ist.


----------



## JanHH (12. Feb 2010)

Aber die Einarbeitungszeit ist deutlich grösser, selbst für die einfachen Dinge muss man bei EMF mindesens ein oder zwei Stunden ansetzen, bei JaxB 10 Minuten! Ausserdem ist JaxB Java-Standard und steht überall funktionsfähig zur Verfügung; wenn man EMF hingegen ausserhalb von Eclipse einsetzen will, wirds zusätzlich bastelig, sofern es überhaupt funktioniert.. hab mal spasseshalber versucht, EMF in einer NetBeans-RCP-Anwendung einzusetzen, und das hat nicht geklappt (aus mir nicht erklärlichen Ursachen). Ausserdem ist JaxB nur ein "obendrauf" auf bestehende Klassen, EMF ist ein wesentlich tieferer Eingriff (eigene Objekt-Klassen, dieser ganze Kram mit E davor), und so weiter, und so fort.. naja man kann die beide im Grunde kaum vergleichen. Für "schnell und einfach XML-Funktionalität" kann JaxB die bessere Wahl sein.

Ist wohl eine ganz allgemeine Feststellung, man muss immer den Produktivitätsgewinn durch ein Framework abwiegen gegen den Aufwand, sich da einzuarbeiten. Je nach Situatipn ist mal das eine, mal das andere besser.


----------



## Wildcard (13. Feb 2010)

Ich weiß nicht wo du das mit den Stunden hernimmst.
-Neue Ecore Datei anlegen
-Klassen und Properties eintragen
-Genmodel aus der  Ecore anlegen
-Auf generieren drücken
fertig. Dauert 2 Minuten und ist unbestreitbar schneller als Java Interfaces anzulegen und Annotationen einzutragen.

Wenn das Schema schon da ist geht es noch schneller, per Wizard genmodel und ecore aus der XSD anlegen lassen (4 Klicks), generieren, fertig. Das generierte Modell ist um Klassen besser als das JaxB Modell.
EMF ist von Anfang an auf Standalone Betrieb ausgelegt und mit basteln hat das nichts zu tun.
Du brauchst ein paar Runtime Jars (im Bereich einiger KB, nicht mehr), wie bei JaxB auch bevor es ins JDK aufgenommen wurde, also auch hier kein Unterschied.
EMF ist nicht nur sehr viel mächtiger als JaxB, sondern auch Performance und Heap Optimiert.
Wenn es dir auf minimalen Heap ankommt, wirst du es schwer haben händisch ein Modell zu erstellen das weniger Memory Footprint hat als ein EMF Modell mit der Ultra-Slim-Diet.
JaxB Modelle können sich nicht selbst konsistent halten und enthalten keine Business Logik. Du musst diese Teile also alle noch selbst coden und umständlich an dein Modell anflanschen, während all das Bereits Teil von EMF ist.
Ein gutes Modell braucht fast immer eine Observer Schnittstelle. Mit JaxB musst du sie selbst implementieren (was keine triviale Aufgabe ist, da es einige Pitfalls zu beachten gibt).
Mit EMF bekommst du es geschenkt.

Query Support, Indexing, Model Repository, DB Persistenz, Diff Model, Match Model, Versionierung, Validierung, OCL Support, ...
Alles optionale EMF Komponenten die du geschenkt bekommst. JaxB hingegen erzeugt lediglich stumpfe Datencontainer die nichts mit einem echten Datenmodell gemein haben und klopft sie anschließend in XML...


----------



## JanHH (14. Feb 2010)

Irgendwie berücksichtigst Du bei Deinen Zeitangaben allerdings nie die Zeit, die es für jemanden, der von all diesen Dingen absolut keine oder nur teilweise Ahnung hat, braucht, um sich erstmal einzuarbeiten. Wenn man all die von Dir erwähnten Features nutzen will, können da, wenn mans nur nebenbei macht, einige Wochen ins Land ziehen.

Und zu dem "kein Gebastel".. das hab ich ja gemacht, die paar runtime-jars meinem Netbeans-Projekt hinzugefügt, es liess ich auch kompilieren, aber es lief nicht.. und nu? Wenn da gemeckrt wird, es würden Klassen nicht gefunden werden, die man aber dennoch problemlos im Quellcode importieren konnte?

Ich gebe Dir schon grundsätzlich Recht dass EMF eine gute Sache ist und einem vieles abnimmt, aber man muss sich da auch erst einarbeiten, und das Projekt muss von Anfang an auf EMF ausgerichtet sein (bzw. EMF ist ja quasi der Kern des ganzen dann). Obs Sinn macht oder nicht hängt dann natürlich auch ganz stark davon ab, ob man in der Zukunft auch weitere Projekte haben wird, wo sowas wie EMF von Nutzen ist, und bei mir ist das vorraussichtlich nicht so.


----------



## Wildcard (16. Feb 2010)

JanHH hat gesagt.:


> Irgendwie berücksichtigst Du bei Deinen Zeitangaben allerdings nie die Zeit, die es für jemanden, der von all diesen Dingen absolut keine oder nur teilweise Ahnung hat, braucht, um sich erstmal einzuarbeiten. Wenn man all die von Dir erwähnten Features nutzen will, können da, wenn mans nur nebenbei macht, einige Wochen ins Land ziehen.


Für die advanced Features wird Einarbeitungszeit benötigt, aber doch nicht für das was man mit JaxB erreichen kann. Da braucht man IMO mehr Einarbeitungszeit in JaxB.



JanHH hat gesagt.:


> Und zu dem "kein Gebastel".. das hab ich ja gemacht, die paar runtime-jars meinem Netbeans-Projekt hinzugefügt, es liess ich auch kompilieren, aber es lief nicht.. und nu? Wenn da gemeckrt wird, es würden Klassen nicht gefunden werden, die man aber dennoch problemlos im Quellcode importieren konnte?


Hast du in die Doku geschaut? Dort steht welche Jars du brauchts.
EMF/FAQ - Eclipsepedia



JanHH hat gesagt.:


> Ich gebe Dir schon grundsätzlich Recht dass EMF eine gute Sache ist und einem vieles abnimmt, aber man muss sich da auch erst einarbeiten, und das Projekt muss von Anfang an auf EMF ausgerichtet sein (bzw. EMF ist ja quasi der Kern des ganzen dann). .


Wenn du ein XML Binding mit JaxB machst, programmierst du gegen Interfaces. Diese Interfaces können exakt so in EMF übernommen werden, ausser das die EMF Klassen eben mehr können.
Wenn deine Anwendung also sauber aufgebaut ist, kann ihr egal sein welche Technolgie zum Einsatz kommt. Wenn die Migration funktioniert hat, kann man den angeflanschten Zusatzcode löschen den man bisher brauchte um das JaxB Modell sinnvoll benutzen zu können.



JanHH hat gesagt.:


> Obs Sinn macht oder nicht hängt dann natürlich auch ganz stark davon ab, ob man in der Zukunft auch weitere Projekte haben wird, wo sowas wie EMF von Nutzen ist, und bei mir ist das vorraussichtlich nicht so


Nun, ich bin der Meinung das EMF für jede Java Anwendung von Nutzen ist.


----------



## JanHH (18. Feb 2010)

Naja, keine Sorge, das Thema EMF ist für mich ja auch noch lange nicht abgehakt.. finds ja schon für sich faszinierend genug, um sich damit mal zu beschäftigen.

Dass es bei Netbeans nicht lief, hat wohl eher was mit der doch etwas eigenwilligen Konfiguration von Netbeans-RCP-Anwendungen zu tun. Die richtigen Jars waren auf jeden Fall dabei. Aber ist nun auch egal, das Thema Netbeans ist auch mal wieder abgehakt.

Wie siehts bei EMF eigentlich mit JPA-Persistenz aus?


----------



## Wildcard (18. Feb 2010)

JanHH hat gesagt.:


> Wie siehts bei EMF eigentlich mit JPA-Persistenz aus?


Alles vorhanden.
EMF/Teneo/EclipseLink JPA - Eclipsepedia
CDO Hibernate Store Model Relational Mapping - Eclipsepedia


----------

