<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  The ASF licenses this file to You
  under the Apache License, Version 2.0 (the "License"); you may not
  use this file except in compliance with the License.
  You may obtain a copy of the License at
 
      http://www.apache.org/licenses/LICENSE-2.0
 
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.  For additional information regarding
  copyright in this work, please see the NOTICE file in the top level
  directory of this distribution. -->
<project name="abdera" default="build" basedir="..">
<!--

  abdera Build
    targets:
      * build (compile everything)
      * test  (compile and run test cases)
      * dist  (compile, test and create jars)
      * clean (rather self explanatory)
      * docs  (build the javadocs)
      
   Set the ABDERA_XMLSECURITY=yes environment variable to build the security module
   
-->
  <property name="version" value="0.1.0-incubating" />
  <property name="site" value="../site" />
  <property name="work" value="${basedir}/build/work" />
  <property name="test" value="${basedir}/build/test" />
  <property name="dist" value="${basedir}/dist" />
  <property name="dist_lib" value="${dist}/lib" />
  <property name="docs" value="${dist}/docs" />
  <property name="javadocs" value="${docs}/api" />
  <property name="core" value="${basedir}/core" />
  <property name="core.src" value="${core}/src/main/java" />
  <property name="core.test" value="${core}/src/test/java" />
  <property name="core.work" value="${work}/core" />
  <property name="core.jar" value="${dist}/${ant.project.name}.core.${version}.jar" />
  <property name="parser" value="${basedir}/parser" />
  <property name="parser.src" value="${parser}/src/main/java" />
  <property name="parser.test" value="${parser}/src/test" />
  <property name="parser.test.java" value="${parser}/src/test/java" />
  <property name="parser.test.resources" value="${parser}/src/test/resources" />
  <property name="parser.work" value="${work}/parser" />
  <property name="parser.jar" value="${dist}/${ant.project.name}.parser.${version}.jar" />
  <property name="extensions" value="${basedir}/extensions" />
  <property name="extensions.src" value="${extensions}/src/main/java" />
  <property name="extensions.resources" value="${extensions}/src/main/resources" />
  <property name="extensions.work" value="${work}/extensions" />
  <property name="extensions.test.java" value="${extensions}/src/test/java" />
  <property name="extensions.test.resources" value="${extensions}/src/test/resources" />
  <property name="extensions.jar" value="${dist}/${ant.project.name}.extensions.${version}.jar" />
  <property name="server" value="${basedir}/server" />
  <property name="server.src" value="${server}/src/main/java" />
  <property name="server.work" value="${work}/server" />
  <property name="server.jar" value="${dist}/${ant.project.name}.server.${version}.jar" />
  <property name="security" value="${basedir}/security" />
  <property name="security.src" value="${security}/src/main/java" />
  <property name="security.work" value="${work}/security" />
  <property name="security.jar" value="${dist}/${ant.project.name}.security.${version}.jar" />
  <property environment="env" />
      
  <property name="dependencies" value="${basedir}/dependencies" />
  <property name="dependencies.work" value="${dependencies}/work" />
  <property name="json.src" value="${dependencies}/json/src" />
  <property name="json.src.java"
            value="${json.src}/main/java" />
  <property name="json.version" value="1.0" />

  <property name="json.jar" value="${dependencies}/json-${json.version}.jar" />

  <property file="${dependencies}/deps.properties" />
  
  <path id="jar.dependencies">
    <fileset dir="${dependencies}" includes="**/*.jar" />
  </path>
 
  <target name="compile.dependencies">
    <mkdir dir="${dependencies.work}/json" />

    <!-- build json -->
    <javac srcdir="${json.src.java}" destdir="${dependencies.work}/json" />

    <jar destfile="${json.jar}"
         basedir="${dependencies.work}/json"
         includes="org/json/*.class" />
    
    <delete dir="${dependencies.work}" />
    
  </target>
 
  <target name="dependencies">
    <path id="">
      <fileset dir="dependencies" includes="*.jar" />
    </path>
  </target>
  
  <target name="init">
    <echo>
=====================================================
${ant.project.name}, ${version}
Working directory: ${work}
=====================================================
    </echo>

    <mkdir dir="${test}" />

    <condition property="do.download">
      <not>
        <and>
          <available file="${dependencies}/${geronimo.activation.jar}" />
          <available file="${dependencies}/${geronimo.javamail.jar}" />
          <available file="${dependencies}/${geronimo.servlet.jar}" />          
          <available file="${dependencies}/${axiom.api.jar}" />
          <available file="${dependencies}/${axiom.impl.jar}" />
          <available file="${dependencies}/${jaxen.jar}" />
          <available file="${dependencies}/${log4j.jar}" />
          <available file="${dependencies}/${stax.jar}" />
          <available file="${dependencies}/${stax.api.jar}" />
          <available file="${dependencies}/${commons.logging.jar}" />
          <available file="${dependencies}/${commons.codec.jar}" />
          <available file="${dependencies}/${commons.httpclient.jar}" />
          <available file="${dependencies}/${junit.jar}" />
          <available file="${dependencies}/${wstx.jar}" />
        </and>
      </not>
    </condition>
    <condition property="do.security">
      <istrue value="${env.ABDERA_XMLSECURITY}"/>
    </condition>
    <condition property="do.download.security">
      <and>
        <istrue value="${do.security}" />
        <not>
          <and>
            <available file="${dependencies}/${xmlsecurity.jar}" />
          </and>
        </not>
      </and>
    </condition>
    
    <mkdir dir="${work}" />
    <manifest file="${work}/MANIFEST.MF">
    <attribute name="Specification-Title" value="Apache Abdera"/>
    <attribute name="Specification-Version" value="${version}"/>
    <attribute name="Specification-Vendor" value="The Apache Software Foundation - Incubator"/>
    <attribute name="Implementation-Title" value="org.apache.abdera"/>
    <attribute name="Implementation-Version" value="${version}"/> 
    <attribute name="Implementation-Vendor" value="The Apache Software Foundation - Incubator"/>
    </manifest>
    
    <echo>Building Security? ${do.security}</echo>
    
    <antcall target="download"/>
    <antcall target="downloadsecurity" />
  </target>
  
  <target name="compile.core" depends="init">
    <mkdir dir="${core.work}" />
    <javac srcdir="${core.src}"
           destdir="${core.work}"
           classpathref="jar.dependencies"/>
    <javac srcdir="${core.test}"
           destdir="${test}" 
           classpathref="jar.dependencies"
           classpath="${core.work}"/>
    <mkdir dir="${core.work}/META-INF" />
    <copy todir="${core.work}/META-INF">
      <fileset dir="${basedir}">
        <include name="LICENSE" />
        <include name="NOTICE" />
      </fileset>
    </copy>    
  </target>
  
  <target name="compile.parser" depends="init,compile.core">
    <mkdir dir="${parser.work}" />
    <javac srcdir="${parser.src}"
           destdir="${parser.work}"
           classpathref="jar.dependencies" 
           classpath="${core.work}" />
    <javac srcdir="${parser.test.java}"
           destdir="${test}"
           classpathref="jar.dependencies"
           classpath="${core.work};${parser.work}" />
    <mkdir dir="${parser.work}/META-INF" />
    <copy todir="${parser.work}/META-INF">
      <fileset dir="${basedir}">
        <include name="LICENSE" />
        <include name="NOTICE" />
      </fileset>
    </copy>
    <copy todir="${test}">
      <fileset dir="${parser.test.resources}">
        <include name="**"/>
      </fileset>
    </copy>
  </target>
  
  <target name="compile.extensions" depends="init, compile.core, compile.parser, compile.dependencies">
    <mkdir dir="${extensions.work}" />
    <javac srcdir="${extensions.src}"
           destdir="${extensions.work}"
           classpathref="jar.dependencies"
           classpath="${core.work};${parser.work}" />
    <javac srcdir="${extensions.test.java}"
           destdir="${test}"
           classpathref="jar.dependencies"
           classpath="${core.work};${parser.work};${extensions.work}" />
    <mkdir dir="${extensions.work}/META-INF" />
    <copy todir="${extensions.work}/META-INF">
      <fileset dir="${basedir}">
        <include name="LICENSE" />
        <include name="NOTICE" />
      </fileset>
    </copy>
    <copy todir="${extensions.work}">
      <fileset dir="${extensions.resources}" includes="**/*" />
    </copy>
    <copy todir="${test}">
      <fileset dir="${extensions.test.resources}" includes="**/*" />
    </copy>
  </target>
  
  <target name="compile.server" depends="init, compile.core">
    <mkdir dir="${server.work}" />
    <javac srcdir="${server.src}"
           destdir="${server.work}"
           classpathref="jar.dependencies"
           classpath="${core.work}" />
    <mkdir dir="${server.work}/META-INF" />
    <copy todir="${server.work}/META-INF">
      <fileset dir="${basedir}">
        <include name="LICENSE" />
        <include name="NOTICE" />
      </fileset>
    </copy>
  </target>  
  
  <target name="compile.security" depends="init, compile.core" if="do.security">
    <mkdir dir="${security.work}" />
    <javac srcdir="${security.src}"
           destdir="${security.work}"
           classpathref="jar.dependencies"
           classpath="${core.work}" />    
    <mkdir dir="${security.work}/META-INF" />
    <copy todir="${security.work}/META-INF">
      <fileset dir="${basedir}">
        <include name="LICENSE" />
        <include name="NOTICE" />
      </fileset>
    </copy>
  </target>

  <target name="build" depends="init,compile.core,compile.parser,compile.server,compile.extensions,compile.security"></target>

  <target name="docs" depends="init">
    <javadoc packagenames="org.apache.abdera.*"
             excludepackagenames="org.apache.abdera.util,org.apache.abdera.ext.*.impl,org.apache.abdera.parser.**,org.apache.abdera.security.**"
             sourcepath="${core.src}:${extensions.src}:${security.src}:${server.src}:${parser.src}" 
             destdir="${javadocs}"
             windowtitle="Abdera"
             classpathref="jar.dependencies" />
    <replaceregexp match="Generated by javadoc (.*) on (.*) --"
                   replace="Generated by javadoc --"
                   flags="g"
                   byline="true">
      <fileset dir="${javadocs}" includes="**/*.html"/>
    </replaceregexp>
    <copy  todir="${docs}">
      <fileset dir="${basedir}/docs/" includes="*.html" />
    </copy>
  </target>
  
  <target name="test" depends="build">
    <echo>Running Core Tests...</echo>
    <java classpathref="jar.dependencies" 
          classpath="${core.work}:${parser.work}:${server.work}:${test}"
          classname="org.apache.abdera.test.core.TestSuite"
          fork="yes" />

    <echo>Running Stax Parser Tests...</echo>
    <java classpathref="jar.dependencies" 
          classpath="${core.work}:${parser.work}:${server.work}:${test}"
          classname="org.apache.abdera.test.parser.stax.TestSuite"
          fork="yes" />

    <echo>Running Extension Tests...</echo>
    <java classpathref="jar.dependencies"
          classpath="${core.work}:${parser.work}:${server.work}:${extensions.work}:${test}"
          classname="org.apache.abdera.test.ext.opensearch.TestSuite"
          fork="yes" />
  </target>

  <target name="clean">
    <delete dir="${work}" />
    <delete dir="${test}" />
    <delete dir="${dist}" />
    <delete dir="${dependencies.work}" />
    <delete file="${json.jar}" />
    <delete> 
      <fileset dir="${basedir}" includes="*.zip" />
    </delete>
  </target>
  
  <target name="dist" depends="clean,build,test,docs">
    <mkdir dir="${dist}" />
    <mkdir dir="${dist_lib}" />
    <jar destfile="${core.jar}"   basedir="${core.work}" manifest="${work}/MANIFEST.MF"/>
    <jar destfile="${parser.jar}" basedir="${parser.work}" manifest="${work}/MANIFEST.MF" />
    <jar destfile="${server.jar}" basedir="${server.work}" manifest="${work}/MANIFEST.MF" />    
    <jar destfile="${extensions.jar}" basedir="${extensions.work}" manifest="${work}/MANIFEST.MF" />
    <antcall target="dist.security" />
    <copy todir="${dist_lib}">
      <fileset dir="${dependencies}"  />
    </copy>
    <delete dir="${work}" />
    <delete dir="${test}" />
  </target>
  
  <target name="dist.security" if="do.security">
    <jar destfile="${security.jar}" basedir="${security.work}" manifest="${work}/MANIFEST.MF" />
  </target>
  
  <target name="zip" depends="retro"> 
    <mkdir dir="${work}/dist/${ant.project.name}.${version}"/>
    <copy todir="${work}/dist/${ant.project.name}.${version}">
      <fileset dir="${dist}">
        <include name="**/*.jar" />
        <include name="**/legal/*" />
        <exclude name="**/legal/retroweaver-LICENSE.txt" />
        <exclude name="**/json/*" />
        <exclude name="**/*.retro.jar" />
        <exclude name="**/retroweaver-rt-1.2.3.jar" />
      </fileset>
      <fileset dir="${docs}" includes="**/*" />
      <fileset dir="${basedir}">
        <include name="LICENSE" />
        <include name="NOTICE" />
        <include name="README" />
      </fileset>
    </copy>
    <zip destfile="${basedir}/${ant.project.name}.${version}.zip" 
         basedir="${work}/dist/" />
    <delete dir="${work}/dist/${ant.project.name}.${version}" />
    <mkdir dir="${work}/dist/${ant.project.name}.${version}.jdk142"/>
    <copy todir="${work}/dist/${ant.project.name}.${version}.jdk142">
      <fileset dir="${dist}">
        <include name="**/*.jar" />
        <include name="**/legal/*" />
        <exclude name="**/json/*" />
        <exclude name="**/*.${version}.jar" />
      </fileset>
      <fileset dir="${docs}" includes="**/*" />
      <fileset dir="${basedir}">
        <include name="LICENSE" />
        <include name="NOTICE" />
        <include name="README" />
      </fileset>
    </copy>
    <zip destfile="${basedir}/${ant.project.name}.${version}.jdk142.zip" 
      basedir="${work}/dist/" />
    <delete dir="${work}/dist/${ant.project.name}.${version}.jdk142" />
    <mkdir dir="${work}/dist/${ant.project.name}.${version}.src"/>
    <copy todir="${work}/dist/${ant.project.name}.${version}.src">
      <fileset dir="${basedir}">
        <exclude name="dist/**/*" />
        <exclude name="build/tools" />
        <exclude name="build/work" />
        <exclude name="build/tools/**/*" />
        <exclude name="build/work/**/*" />
        <exclude name="**/*.jar" />
        <exclude name="**/*.zip" />
        <exclude name="**/.project" />
      </fileset>
    </copy>
    <zip destfile="${basedir}/${ant.project.name}.${version}.src.zip"
      basedir="${work}/dist/" />
    <delete dir="${work}" />
  </target>

  <target name="downloadsecurity" if="do.download.security">
    <get src="${xmlsecurity.dir}/${xmlsecurity.jar}"
         dest="${dependencies}/${xmlsecurity.jar}"
         usetimestamp="true" />
  </target>
  <target name="download" if="do.download">
    <echo>Downloading project dependencies.  This may take a moment</echo>
    <parallel>
      <get src="${geronimo.activation.dir}/${geronimo.activation.jar}"
           dest="${dependencies}/${geronimo.activation.jar}"
           usetimestamp="true" />
      <get src="${geronimo.javamail.dir}/${geronimo.javamail.jar}"
           dest="${dependencies}/${geronimo.javamail.jar}"
           usetimestamp="true" />
      <get src="${geronimo.servlet.dir}/${geronimo.servlet.jar}"
           dest="${dependencies}/${geronimo.servlet.jar}"
           usetimestamp="true" />      
      <get src="${axiom.dir}/${axiom.api.jar}"
           dest="${dependencies}/${axiom.api.jar}"
           usetimestamp="true" />
      <get src="${axiom.dir}/${axiom.impl.jar}"
           dest="${dependencies}/${axiom.impl.jar}"
           usetimestamp="true" />
      <get src="${jaxen.dir}/${jaxen.jar}"
           dest="${dependencies}/${jaxen.jar}"
           usetimestamp="true" />
      <get src="${log4j.dir}/${log4j.jar}"
           dest="${dependencies}/${log4j.jar}"
           usetimestamp="true" />
      <get src="${stax.dir}/${stax.jar}"
           dest="${dependencies}/${stax.jar}"
           usetimestamp="true" />
      <get src="${stax.dir}/${stax.api.jar}"
           dest="${dependencies}/${stax.api.jar}"
           usetimestamp="true" />
      <get src="${commons.logging.dir}/${commons.logging.jar}"
           dest="${dependencies}/${commons.logging.jar}"
           usetimestamp="true" />
      <get src="${commons.codec.dir}/${commons.codec.jar}"
           dest="${dependencies}/${commons.codec.jar}"
           usetimestamp="true" />
      <get src="${commons.httpclient.dir}/${commons.httpclient.jar}"
           dest="${dependencies}/${commons.httpclient.jar}"
           usetimestamp="true" />
      <get src="${junit.dir}/${junit.jar}"
           dest="${dependencies}/${junit.jar}"
           usetimestamp="true" />
      <get src="${wstx.dir}/${wstx.jar}"
           dest="${dependencies}/${wstx.jar}"
           usetimestamp="true" />
    </parallel>
  </target>
  
  <target name="clean-downloads" depends="init">
    <delete><fileset dir="${dependencies}" includes="**/*.jar" /></delete>
  </target>

  <target name="site-docs" depends="docs">
    <mkdir dir="${site}/docs/api" />
    <copy todir="${site}/docs/api">
      <fileset dir="${javadocs}" />
    </copy>
  </target>
  
  <target name="retro" depends="dist">
    <property name="retrozip" value="${basedir}/build/tools/${retroweaver.zip}" />
    <property name="retro" value="${basedir}/build/tools/retroweaver-1.2.3" />
    <property name="retro_core.jar" value="${dist}/${ant.project.name}.core.${version}.retro.jar" />
    <property name="retro_parser.jar" value="${dist}/${ant.project.name}.parser.${version}.retro.jar" />
    <property name="retro_extensions.jar" value="${dist}/${ant.project.name}.extensions.${version}.retro.jar" />
    <property name="retro_server.jar" value="${dist}/${ant.project.name}.server.${version}.retro.jar" />
    <condition property="do.download.retroweaver">
      <not><available file="${retrozip}"/></not>
    </condition>
    <antcall target="go_retro" />
    <path id="jar.retro">
      <fileset dir="${retro}/release" includes="**/*.jar" />
    </path>    
    <echo>Retroweaving the Jars...</echo>
    <java classpathref="jar.retro" classname="com.rc.retroweaver.Weaver" fork="yes">
      <arg line="-jar &quot;${core.jar}&quot; &quot;${retro_core.jar}&quot;" />
    </java>
    <java classpathref="jar.retro" classname="com.rc.retroweaver.Weaver" fork="yes">
      <arg line="-jar &quot;${parser.jar}&quot; &quot;${retro_parser.jar}&quot;"/>
    </java>
    <java classpathref="jar.retro" classname="com.rc.retroweaver.Weaver" fork="yes">
      <arg line="-jar &quot;${server.jar}&quot; &quot;${retro_server.jar}&quot;" />
    </java>
    <java classpathref="jar.retro" classname="com.rc.retroweaver.Weaver" fork="yes">
      <arg line="-jar &quot;${extensions.jar}&quot; &quot;${retro_extensions.jar}&quot;" />
    </java>
    <antcall target="retro.security" />
    <copy todir="${dist_lib}" file="${retro}/release/retroweaver-rt-1.2.3.jar" />
  </target>
  
  <target name="retro.security" if="do.security">
    <property name="retro_security.jar" value="${dist}/${ant.project.name}.security.${version}.retro.jar" />
    <java classpathref="jar.retro" classname="com.rc.retroweaver.Weaver" fork="yes">
      <arg line="-jar &quot;${security.jar}&quot; &quot;${retro_security.jar}&quot;" />
    </java>
  </target>
  
  <target name="go_retro" if="do.download.retroweaver">
    <echo>Downloading Retroweaver...</echo>
    <mkdir dir="${basedir}/build/tools" />
    <get src="${retroweaver.dir}/${retroweaver.zip}"
         dest="${basedir}/build/tools/${retroweaver.zip}"
         usetimestamp="true" />
    <unzip src="${basedir}/build/tools/${retroweaver.zip}"
           dest="${basedir}/build/tools/" overwrite="true"/>
  </target>
</project>
