EMF-Support für Che

Eclipse Che Tutorial: Tag 2 – Code Generation

Maximilian Kögel, Jonas Helming

In dieser Artikel-Serie beschreiben wir unsere Erfahrung mit der Entwicklung von Erweiterungen (Plug-ins) für Eclipse Che. Als durchgängiges Beispiel dient eine erste Version für EMF-Support in Che, welche wir prototypisch entwickelt haben.

Im ersten Teil der Serie haben wir einen Überblick über unsere Ziele gegeben und beschrieben, wie man einen benutzerdefinierten Che-Workspace mit integriertem Template-Modeling-Projekt erstellt. Dieses Projekt enthält bereits ein vollständig konfiguriertes EMF Model. Bevor wir uns der Erstellung von EMF-Modellen oder Editing-Support widmen, wollen wir uns zunächst mit Code-Generierung aus unserem Modell-Projekt beschäftigen. Es handelt sich dabei um eine der wichtigsten Anforderungen unseres Projekts, da wir den bestehenden EMF-Codegenerator wiederverwenden wollen. Konkret interessiert uns, ob es möglich ist, ein existierendes Eclipse-Framework-Feature wie den Code Generator in Che zu verwenden.

Lassen Sie uns zunächst einen kurzen Blick darauf werfen, wie der EMF-Codegenerator ausgeführt werden kann. Standardmäßig würde man die Benutzeroberfläche der Eclipse-IDE verwenden. Darüber hinaus stellt EMF ein Java API zur Verfügung. Das klingt verlockend, da die Che-Serverkomponente selbst auch in Java geschrieben ist. Wir könnten demnach einen Wrapper-Service für den Che-Server implementieren, der durch die Browser-IDE gestartet wird, und Code über das EMF-API auf dem Che Server generieren. Allerdings läuft EMF normalerweise in einer OSGi-Laufzeitumgebung (im Gegensatz zu Che). Darüber hinaus nutzt es Extension-Points (zumindest in der Paketregistrierung). Tatsächlich ist es möglich, den EMF-Codegenerator in reinem Java aufzurufen, wobei dabei allerdings einige Klassen manuell registriert werden müssten. Das Einrichten des gesamten Klassenpfades ohne OSGi-Unterstützung gleicht in diesem Szenario leider einem Alptraum. Ein weiterer Nachteil dieses Ansatzes ist, dass wir den EMF Code Generator mit unserem Server gemeinsam deployen müssten, was für umständliche Update-Pfade sorgt.

Zum Glück gibt es eine viel einfachere Möglichkeit, den vorhandenen Codegenerator zu integrieren. Die Eclipse-Desktop-IDE bietet eine „Headless-Applikation“ zur Ausführung auf der Kommandozeile. Mit den folgenden Befehlen können Sie beispielsweise den Code für das „Make it happen“-Beispiel generieren.

$ /eclipse/eclipse \
-noSplash \ # do not show the eclipse splash screen
-data /path/to/data/dir \ # the path to be our current project
-application org.eclipse.emf.codegen.ecore.Generator \ # the application id to execute
-model \ # generate EMF model classes
-edit \ # generate EMF edit bundle
/path/to/modelname.genmodel # the path to the genmodel file

Wie integrieren wir nun diesen Befehl in Che? Die gute Nachricht ist, dass wir die Eclipse-Desktop-IDE als Tool einfach in einen Che-Workspace deployen können. Workspaces sind in Che nicht bloße Verzeichnisse, welche Code enthalten, sondern Docker-Container und können damit neben dem Code auch ausführbare Tools beinhalten. Wenn wir also eine Eclipse-Modeling-Tools-Edition in unseren Modeling-Workspace installieren, sollten wir in der Lage sein, mittels EMF-Applikation auf Terminal-Ebene Code zu generieren.

Zuerst müssen wir unserem Che-Workspace-Container eine Eclipse-Installation hinzufügen. Da Che-Workspace-Container auf Linux-Images basieren, können wir die neuesten Eclipse-Modeling-Tools per Terminal herunterladen und extrahieren. Der Download-Link ist auf der offiziellen Download-Seite leicht zu finden (hier der Link für Linux 32/64 Bit). Um das Container-Terminal aufzurufen, klicken Sie auf „Terminal“ am unteren Bereich des Bildschirms der Che IDE. Die einzugebenden Befehle sind nachfolgend aufgelistet:

$ sudo su # gain super user privileges (become root)
$ cd / # switch to the root directory
$ wget ${Download Link} -o eclipse.tar.gz # download eclipse
$ tar xfv eclipse.tar.gz # extract the downloaded tar.gz file

Anschließend können Sie den EMF-Codegenerator mit folgendem Befehl ausführen:

$ /eclipse/eclipse \
-noSplash \
-data /projects/makeithappen \
-application org.eclipse.emf.codegen.ecore.Generator \
-model \
-edit \
/projects/makeithappen/org.eclipse.emf.ecp.makeithappen.model/model/task.genmodel

Der folgende Screenshot zeigt die Code-Generierung im Terminal. In unserer IDE können wir anschließend den generierten Code öffnen. Das bedeutet, dass wir bereits den vorhandenen EMF-Codegenerator in Che wiederverwendet haben – und das nur durch eine einzelne Terminal-Befehlszeile!

Nun, da wir den Codegenerator aus dem Terminal heraus verwenden können, machen wir das Ganze für den User etwas bequemer. Anstatt einen komplexen Befehl eingeben zu müssen, wollen wir die Codegenerierung mit einem Klick ermöglichen. Dafür gibt uns Che benutzerdefinierte Befehle an die Hand. Klicken Sie, um derartige Befehle zu erstellen, in der oberen, rechten Ecke der IDE auf das Dropdown-Menü und wählen sie „Edit Commands…“.

Danach klicken Sie auf die Schaltfläche „+“ neben der „Custom“-Section (siehe Screenshot) und füllen das Formular auf der rechten Seite aus. Wie man sieht, verwendet der Befehl eine Che-Variable für den aktuellen Projektpfad. Das letzte Segment des Pfads zum Genmodel ist allerdings auch weiterhin statisch.

 

 

Jetzt können wir den Code für das Template-Projekt mit nur einem Klick generieren. Dazu haben wir den existierenden EMF-Codegenerator wiederverwendet und mussten bisher nicht eine einzige Zeile Code dafür schreiben. Trotzdem gibt es mehrere offene Fragen sowie Verbesserungspotential. Als Beispiel können wir die Codegenerierung nur auf einem vorab festgelegten Projekt auslösen. Wir arbeiten immer noch mit einem vorab festgelegten Template, und wir können unser Modell nicht wirklich modifizieren (außer in einfachem XML). All diese Dinge erfordern Erweiterungen der Che-Browser-IDE und des Che-Servers, denen wir uns später in dieser Artikel-Serie widmen. Im nächsten Teil werden wir einen benutzerdefinierten Stack erstellen, um die in diesem Artikel vorgenommenen Anpassungen reproduzierbar zu machen. Das Ziel ist es, die heruntergeladene Eclipse-Instanz (zur Codegenerierung) und den benutzerdefinierten Befehl ohne weitere Schritte verfügbar zu machen.

 

Geschrieben von
Maximilian Kögel
Maximilian Kögel
Dr. Maximilian Kögel ist Geschäftsführer der EclipseSource München GmbH und arbeitet als Senior Software Architect im Bereich Eclipse- und Web-Technologie. Neben seiner Fokussierung auf das Eclipse Modeling Framework und Eclipse RCP ist er auch mit der Entwicklung von Webapplikationen mit AngularJS, Web Components und JSON Schema vertraut. Ein Kernthema seiner Arbeit ist das Erstellen von Modellierungswerkzeugen basierend sowohl auf einem Eclipse- als auch einem Web Technologiestack. Er ist ein aktives Mitglied der Eclipse-Community, regelmäßiger Sprecher auf EclipseCons, Leiter und Committer bei mehreren Eclipse Projekten, u.a. EMFForms und EMF Core und nicht zuletzt Mitglied im Eclipse Architecture Council. Auch außerhalb des Eclipse Ökosystems ist er in Open-Source-Projekten aktiv und leitet z.B. das JSONForms-Projekt zur Entwicklung von Web-Applikationen. Als Berater und Trainer verfügt er über langjährige Erfahrung in der Anwendung und Vermittlung von Expertenwissen rund um Java, Eclipse und Web-Technologien sowie agilen Prozessen.
Jonas Helming
Jonas Helming
Dr. Jonas Helming ist Geschäftsführer der EclipseSource München GmbH sowie Consultant, Trainer und Software Engineer im Bereich Eclipse-Technologie. Seine Schwerpunkte liegen neben Java auf den Technologien Eclipse RCP, Eclipse-Modellierung und Eclipse 4. Weiterhin verfügt er über mehrjährige Erfahrung in der Etablierung und Anwendung von agilen Prozessen. Jonas ist aktives Mitglied der Eclipse-Community, leitet mit der EMF Client Plattform und dem EMFStore zwei bei der Eclipse Foundation gehostete Open-Source-Projekte und ist in einigen weiteren aktiv beteiligt. Als Berater und Trainer verfügt er über mehrjährige Erfahrung in der Vermittlung von Themen rund um Java und Eclipse sowie agilen Prozessen und hält einen Lehrauftrag der Technischen Universität München. Darüber hinaus ist er als Speaker regelmäßig auf Kernkonferenzen wie der JAX oder der EclipseCon. Kontakt: jhelming@eclipsesource.com
Kommentare

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu: