Menu

Seite41C

Anonymous Joerg Reichert

4.2.6 Templatierung der Build-Dateien

build.oaw

Die Templatierung der Build- und Eclipse-Projekt-Dateien wird von einem eigenen Workflow namens build.oaw angestoßen, der als Cartridge in den Haupt-Workflow generator.oaw eingebunden ist.

<workflow>
   <component class="oaw.xpand2.Generator" id="buildGenerator">
      <metaModel idRef="meta.model"/>
         <expand value="de::uni_leipzig::dreirad::generator::templates::build::BuildMain::buildMain
                 FOR domainModel"/>
         <globalVarDef name="PackageName" value="'${package.name}'" />
         <globalVarDef name="OutputPath" value="'${output.path}'" />
         <outlet>
            <path value="${output.path}" />
         </outlet>
         <fileEncoding value="ISO-8859-1"/>
         <beautifier class="oaw.xpand2.output.XmlBeautifier"/>
   </component>

   <component class="de.uni_leipzig.dreirad.generator.workflow.AntTaskExecuter">
      <buildFile value="de/uni_leipzig/dreirad/generator/workflow/build.xml" />
      <antTaskToExecute value="copyFiles" />
      <directoryToCopy value="src-static" />
      <targetDirectory value="${output.path}" />
   </component>

</workflow>

Neben der Generator-Komponente, die das Wurzel-Template BuildMain.xpt aufruft, referenziert dieser Unter-Workflow die selbst-geschriebene Workflow-Komponente AntTaskExcecuter, die den Verweis auf eine Build-Datei bekommt, von der das copyFiles-Target aufgerufen werden soll. Mit diesem Target werden die im Generat unveränderlichen Dateien aus dem src-static-Ordner im Generator-Projekt ins Verzeichnis des Generats kopiert.

BuildMain.xpt

BuildMain.xpt delegiert die Generierung der ANT-Build-Skripte an das Template BuildProperties und die Generierung der Eclipse-Projekt-Beschreibungs-Dateien an Project.xpt.

«IMPORT ecore»
«DEFINE buildMain FOR EPackage»

   «EXPAND BuildProperties::buildProperties FOR this»
   «EXPAND Project::project FOR this»

«ENDDEFINE»

BuildProperties.xpt

Die eigentlichen ANT-Skripte zum Kompilieren und Deployen der Client- und Server-seitigen Zielanwendung sind unabhängig vom Datenmodell und sind deshalb wie auch Bibliotheken und Bild-Dateien im Ordner src-static des Generator-Projekts abgelegt, aus dem sie während des Generierungs-Prozesses in den Ordner des Generats kopiert werden. Pfade und Bezeichner sind aus den ANT-Skripten in die Datei build.properties ausgelagert worden. In ihr ist einzig und allein der Package-Pfad zur Klasse mit der main-Methode parametrisiert. Diese Angabe wird im ANT-Skript dazu verwendet, die Manifest-Datei in der jar-Datei zu erstellen, ohne die sonst mit der jar-Datei die Client-Anwendung nicht startbar wäre.

«IMPORT ecore»
«EXTENSION de::uni_leipzig::dreirad::generator::templates::common::Common»
«DEFINE buildProperties FOR EPackage»
   «FILE "build.properties"»
      bin.dir=bin
      conf.server.dir=conf_server
      conf.client.dir=conf_client
      conf.test.dir=conf_test
      src.dir=src
      src.gen.dir=src-gen
      src.test.dir=src-test
      lib.dir=lib
      deploy.dir=res
      deploy.server.file=server.jar
      deploy.client.file=client.jar
      images.dir=images
      testreports.dir=test-reports
      main.class=«getPackageName()».client.ClientMain
   «ENDFILE»
«ENDDEFINE»

Build.ext

Die hier definierten Erweiterungs-Methoden werden im noch zu beschreibenden Template Project.xpt benötigt. Mit getLastFolder wird eine gegebener String an Hand der in ihm vorkommenden '/'-Zeichen in ein Array von Teil-Strings zerlegt. Das letzte Element im Array wird von Methode schließlich zurückgegeben (z.B. getLastFolder("C:/temp/dev/dreirad")->"dreirad"). Die Methode getOutputFolder verwendet getLastFolder, um die der Workflow-Komponente übergebene Variable "OutputPath", die, da durch Übergabe zunächst ungetypt, zu String gecastet wird, und anschließend aus ihr den letzten Ordner des in ihr enthaltenen Pfades zu holen. Der Name des Ordners wird im Template Project.xpt benötigt, um den Namen des Eclipse-Projekts zu setzen.

import ecore;

String getOutputFolder() : ((String) (GLOBALVAR OutputPath)).getLastFolder();
String getLastFolder(String this): split("/").last();

Project.xpt

Allgemein

Mit Project.xpt werden die Dateien classpath.xml und project.xml generiert. Sie werden später im Rahmen des target "copyFiles" des ANT-Skripts, das von der Workflow-Komponente AntTaskExcecuter im build.oaw aufrufen wird, umbenannt in .project und .classpath. Durch die zwischenzeitliche Benamung mit der Erweiterung .xml, werden die beiden Dateien vom in der Generator-Komponente des Workflow eingebundenen XmlBeautifier erkannt und formatiert. Mit der Umbenamung können sie dann ihre Funktion im Rahmen von Eclipse erfüllen.

Der Template-Abschnitt für die classpath-Datei enthält noch keine Parametrisierung. Die Datei .classpath wurde trotzdem nicht in den Ordner src-static platziert, da bei der Weiterentwicklung des Projekts und vor allem durch die Hinzunahme alternativer Cartridges auch die Liste der in den Klassenpfad aufzunehmender Bibliotheken ändern wird. Momentan ist diese Liste für die Kombination Swing/JBoss-4-0-2-GA/EJB-3.0/Hibernate-3.2.0/PostgreSQL-8-2 voreingestellt.

Im Abschnitt für die .project-Datei wird, wie die oben bereits beschrieben Extension-Methode getOutputFolder aus Build.ext aufgerufen, um den Namen des Ordners, in dem sich das Generat befindet, auch als Namen des Eclipse-Projekts zu verwenden.

Template

«IMPORT ecore»
«EXTENSION de::uni_leipzig::dreirad::generator::templates::build::Build»
«DEFINE project FOR EPackage»

   «EXPAND classPathDefinition FOR this»
   «EXPAND projectDefinition FOR this»

«ENDDEFINE»

«DEFINE classPathDefinition FOR EPackage»
   «FILE "classpath.xml"»
      <classpath>
         <classpathentry excluding="conf_client/|src-test/|src/|src-gen/|
                 src-gen/|src-gen/|src/|src-gen/|conf_client/"
                 including="images/" kind="src" path=""/>
         <classpathentry kind="src" path="src"/>
         <classpathentry kind="src" path="src-gen"/>
         <classpathentry kind="src" path="conf_client"/>
         <classpathentry kind="lib" path="lib/ejb3-persistence.jar"/>
         <classpathentry kind="lib" path="lib/formsrt.jar"/>
         <classpathentry kind="lib" path="lib/hibernate-annotations.jar"/>
         <classpathentry kind="lib" path="lib/hibernate-entitymanager.jar"/>
         <classpathentry kind="lib" path="lib/hibernate3.jar"/>
         <classpathentry kind="lib" path="lib/jboss-aop-jdk50-client.jar"/>
         <classpathentry kind="lib" path="lib/jboss-aspect-jdk50-client.jar"/>
         <classpathentry kind="lib" path="lib/jboss-deployment.jar"/>
         <classpathentry kind="lib" path="lib/jboss-ejb3-client.jar"/>
         <classpathentry kind="lib" path="lib/jboss-ejb3x.jar"/>
         <classpathentry kind="lib" path="lib/jboss-iiop-client.jar"/>
         <classpathentry kind="lib" path="lib/jboss-j2ee.jar"/>
         <classpathentry kind="lib" path="lib/jboss.jar"/>
         <classpathentry kind="lib" path="lib/jbossall-client.jar"/>
         <classpathentry kind="lib" path="lib/jcalendar-1.3.2.jar"/>
         <classpathentry kind="lib" path="lib/jnp-client.jar"/>
         <classpathentry kind="lib" path="lib/junit-4.1.jar"/>
         <classpathentry kind="lib" path="lib/log4j.jar"/>
         <classpathentry kind="lib" path="lib/postgresql-8.2-504.jdbc3.jar"/>
         <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
         <classpathentry kind="output" path="bin"/>
      </classpath>
   «ENDFILE»
«ENDDEFINE»

«DEFINE projectDefinition FOR EPackage»
   «FILE "project.xml"»
      <projectDescription>
         <name>«getOutputFolder()»</name>
         <comment></comment>
         <projects>
         </projects>
         <buildSpec>
            <buildCommand>
               <name>org.eclipse.jdt.core.javabuilder</name>
               <arguments>
               </arguments>
            </buildCommand>
         </buildSpec>
         <natures>
            <nature>org.eclipse.jdt.core.javanature</nature>
         </natures>
      </projectDescription>
   «ENDFILE»
«ENDDEFINE»

weiter zu 4.2.7 Erstellen des Generatorgesamtpakets
zurück zu 4.2.5 Templatierung der Präsentationsschicht
zurück zu 4.2 Implementierung des Generators
zurück zu 4 Implementierung
zurück zu [FrontPage]


Related

Documentation: FrontPage
Documentation: Seite000
Documentation: Seite400
Documentation: Seite41B
Documentation: Seite41BD
Documentation: Seite41D
Documentation: Seite420