Since I didn't find any other solutions on the web, I worte an ant build.xml
that generates jdo metadata files based on @jdo xdoclet tags in java files
having the @jdo.persistence-capable tag and afterwards uses these metadata
files to automatically enhances the class files using the sun JDO enhancer.

This is the first build I ever wrote, therefore it doesn't contain any best
practices. Therefore comments and suggestions are more than welcome.

Sebastian

<?xml version="1.0" encoding="UTF-8"?>
<project name="JDOTest" default="compile" basedir=".">

   <!-- ================================ -->
   <!-- Global properties                -->
   <!-- ================================ -->
   <property name="version"        value="1.0"/>
   <property name="jarname"        value="jdotest.jar"/>
   <property name="runclass"       value="sebthom.jdotest.Main"/>
   <property name="classpath"      value=""/>
   <property name="build.compiler" value="jikes"/>

   <!-- ================================ -->
   <!-- Project directories              -->
   <!-- ================================ -->
   <property name="bin"      value="bin"/>
   <property name="docs"     value="docs"/>
   <property name="includes" value="includes"/>
   <property name="lib"      value="lib"/>
   <property name="src"      value="src"/>

   <property name="bin_absolute"      location="${bin}"/>
   <property name="docs_absolute"      location="${docs}"/>
   <property name="includes_absolute" location="${includes}"/>
   <property name="lib_absolute"      location="${lib}"/>
   <property name="src_absolute"      location="${src}"/>

   <!-- ================================ -->
   <!-- Class path                       -->
   <!-- ================================ -->
   <path id="base.path">
      <!-- use the value of the ${classpath} property in the classpath -->
      <pathelement path="${classpath}"/>
      <!-- includes all jar files in lib -->
      <fileset dir="${lib}">
         <include name="**/*.jar"/>
      </fileset>
      <!-- includes all jar files in includes -->
      <fileset dir="${includes}">
         <include name="**/*.jar"/>
      </fileset>
      <!-- includes all compiled class files in includes -->
      <dirset dir="${includes}">
         <include name="**"/>
      </dirset>
   </path>

   <!-- ================================ -->
   <!-- Additional ant tasks             -->
   <!-- ================================ -->
   <taskdef classpathref="base.path"
resource="net/sf/antcontrib/antcontrib.properties" />
   <taskdef classpathref="base.path" name="jdodoclet"
classname="xdoclet.modules.jdo.JdoDocletTask"/>

   <!-- ================================ -->
   <!-- Target: display properties       -->
   <!-- ================================ -->
   <target name="display properties">
       <echoproperties/>
   </target>

   <!-- ================================ -->
   <!-- Target: compile                  -->
   <!-- ================================ -->
   <target name="compile">
      <!-- Create the build directory structure used by compile -->
      <mkdir dir="${bin}"/>

      <!-- run javac to compile the source files -->
      <javac srcdir="${src}" destdir="${bin}" debug="on"
classpathref="base.path"/>

      <!-- generate metadata.jdo file in bin directory -->
      <jdodoclet
         addedtags="@xdoclet-generated at ${TODAY},@copyright The XDoclet
Team,@author XDoclet,@version ${version}"
         excludedtags="@version,@author,@todo"
         destdir="${bin}"
         verbose="false"
      >
         <fileset dir="${src}">
            <include name="**/*.java"/>
         </fileset>

         <jdometadata generation="package"/>
      </jdodoclet>

      <!-- enhance every class containing @jdo.persistence-capable tag -->
      <foreach target="compile.jdoEnhancer" param="param_JavaFile">
             <fileset dir="${src}">
            <include name="**/*.java"/>
            <or>
               <contains text="@jdo.persistence-capable"
casesensitive="no"/>
               <contains text="@jdo:persistence-capable"
casesensitive="no"/>
            </or>
         </fileset>
      </foreach>
   </target>

   <target name="compile.jdoEnhancer">
      <!-- set javaFile.fullname  --> <property name    ="javaFile.fullname"
 value="${param_JavaFile}"/>
      <!-- set javaFile.directory --> <dirname 
property="javaFile.directory" file="${javaFile.fullname}"/>
      <!-- set javaFile.filename  --> <basename property="javaFile.filename"
 file="${javaFile.fullname}"/>
      <!-- set javaFile.basename  --> <basename property="javaFile.basename"
 file="${javaFile.fullname}" suffix=".java"/>

      <!-- set classFile.fullname -->
         <pathconvert property="classFile.fullname" targetOS="unix">
            <path>
               <pathelement
location="${javaFile.directory}${file.separator}${javaFile.basename}.class"/>
            </path>
            <map from="${src_absolute}" to="${bin_absolute}" />
         </pathconvert>
      <!-- set classFile.directory -->
         <dirname property="classFile.directory"
file="${classFile.fullname}"/>

      <echo>Enhancing: ${classFile.fullname}</echo>
      <java fork="yes" failonerror="yes"
classname="com.sun.jdori.enhancer.Main" classpathref="base.path">
         <!-- Even if the enhancer expects a parameter for the location of
the JDO file, the JDO file
              has to be named {package}.jdo and has to be at the same level
as the package folder itself.
              Any other location or filename will be ignored by the
enhancer.
              /com/
              /com/mycompany/
              /com/mycompany/mypackage.jdo  <== the JDO file is named
{package}.jdo
              /com/mycompany/mypackage/MyClass.class
         -->
         <arg line="-d &quot;${bin}&quot; -f
&quot;${classFile.directory}.jdo&quot; &quot;${classFile.fullname}&quot;"/>
      </java>
   </target>

   <!-- ================================ -->
   <!-- Target: jar                      -->
   <!-- ================================ -->
   <target name="jar" depends="compile">
      <!-- Create the directory for the jar file -->
      <mkdir dir="${lib}"/>
  
      <pathconvert pathsep=" " property="jar.classpath" refid="base.path"/>

      <!-- make a jar file -->
      <jar jarfile="${lib}/${jarname}" basedir="${bin}">
          <manifest>
              <attribute name="Built-By"   value="${user.name}"/>
              <attribute name="Main-Class" value="${runclass}"/>
              <attribute name="Class-Path" value="${jar.classpath}"/>
          </manifest>
      </jar>
   </target>

   <!-- ================================ -->
   <!-- Target: docs                     -->
   <!-- ================================ -->
   <target name="docs" depends="compile">
      <!-- Create the directory for the java docs -->
      <mkdir dir="${docs}"/>

      <!-- create javadocs -->
      <javadoc
           sourcepath="${src}"
           defaultexcludes="yes"
           destdir="${docs}"
           author="true"
           version="true"
           use="true"
           windowtitle="${ant.project.name} API Documentation Version:
${version}"
      >
         <classpath refid="base.path"/>
         <packageset dir="${src}" defaultexcludes="yes">
            <include name="sebthom/**" />
         </packageset>
      </javadoc>
   </target>

   <!-- ================================ -->
   <!-- Target: run                      -->
   <!-- ================================ -->
   <target name="run" depends="jar,docs">
      <!-- run the class -->
      <java classname="${runclass}" classpathref="base.path">
         <!-- to add a command line arg use: <arg value="-h"/> -->
      </java>
  </target>

   <!-- ================================ -->
   <!-- Target: clean                    -->
   <!-- ================================ -->
   <target name="clean">
      <!-- Delete the ${bin} and ${docs} directory trees -->
      <delete dir="${bin}"/>
      <delete dir="${docs}"/>

      <!-- Delete output jar file -->
      <delete file="${lib}/${jarname}"/>
   </target>

</project>

-- 
+++ GMX - Mail, Messaging & more  http://www.gmx.net +++
Bitte lächeln! Fotogalerie online mit GMX ohne eigene Homepage!


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to