<!--
   Copyright 2001-2004 The Apache Software Foundation

   Licensed 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.
-->

<project name="Digester" default="compile" basedir=".">


<!--
        "Digester" component of the Jakarta Commons Subproject
        $Id: build.xml,v 1.54 2004/09/09 20:38:19 rdonkin Exp $
-->


<!-- ========== Initialize Properties ===================================== -->


  <property file="build.properties"/>                <!-- Component local   -->
  <property file="../build.properties"/>             <!-- Commons local     -->
  <property file="${user.home}/build.properties"/>   <!-- User local        -->


<!-- ========== External Dependencies ===================================== -->


  <!-- The directories corresponding to your necessary dependencies -->
  <property name="jaxp.home"               value="/usr/local/jaxp1.1"/>
  <property name="junit.home"              value="/usr/local/junit3.7"/>
  <property name="commons.home"            value=".."/>
  <property name="beanutils.home"          value="${commons.home}/beanutils"/>
  <property name="collections.home"        value="${commons.home}/collections"/>
  <property name="logging.home"            value="${commons.home}/logging"/>


<!-- ========== Derived Values ============================================ -->


  <!-- The locations of necessary jar files -->
  <property name="jaxp.jaxp.jar"           value="${jaxp.home}/jaxp.jar"/>
  <property name="jaxp.parser.jar"         value="${jaxp.home}/crimson.jar"/>
  <property name="junit.jar"               value="${junit.home}/junit.jar"/>
  <property name="commons-beanutils.api"   value="${beanutils.home}/dist/docs/api"/>
  <property name="commons-beanutils.jar"   value="${beanutils.home}/dist/commons-beanutils.jar"/>
  <property name="commons-collections.api" value="${collections.home}/dist/docs/api"/>
  <property name="commons-collections.jar" value="${collections.home}/dist/commons-collections.jar"/>
  <property name="commons-logging.api"     value="${logging.home}/dist/docs/api"/>
  <property name="commons-logging.jar"     value="${logging.home}/dist/commons-logging.jar"/>


<!-- ========== Component Declarations ==================================== -->


  <!-- The name of this component -->
  <property name="component.name"          value="digester"/>

  <!-- The primary package name of this component -->
  <property name="component.package"       value="org.apache.commons.digester"/>

  <!-- The title of this component -->
  <property name="component.title"         value="Digester - XML to Java Object Configuration"/>

  <!-- The current version number of this component -->
  <property name="component.version"       value="1.6"/>

  <!-- The base directory for compilation targets -->
  <property name="build.home"              value="target"/>

  <!-- The base directory for component configuration files -->
  <property name="conf.home"               value="src/conf"/>

  <!-- The base directory for distribution targets -->
  <property name="dist.home"               value="dist"/>

  <!-- The base directory for component sources -->
  <property name="source.home"             value="src/java"/>

  <!-- The base directory for unit test sources -->
  <property name="test.home"               value="src/test"/>


<!-- ========== Compiler Defaults ========================================= -->


  <!-- Should Java compilations set the 'debug' compiler option? -->
  <property name="compile.debug"           value="true"/>

  <!-- Should Java compilations set the 'deprecation' compiler option? -->
  <property name="compile.deprecation"     value="false"/>

  <!-- Should Java compilations set the 'optimize' compiler option? -->
  <property name="compile.optimize"        value="true"/>

  <!-- Construct compile classpath -->
  <path id="compile.classpath">
    <pathelement location="${build.home}/classes"/>
    <pathelement location="${jaxp.jaxp.jar}"/>
    <pathelement location="${jaxp.parser.jar}"/>
    <pathelement location="${commons-beanutils.jar}"/>
    <pathelement location="${commons-collections.jar}"/>
    <pathelement location="${commons-logging.jar}"/>
    <pathelement location="${junit.jar}"/>
  </path>


<!-- ========== Test Execution Defaults =================================== -->

  <property name="suppressLogOutputDuringTests" value="true"/>
  <property name="log.factoryopt" value="org.apache.commons.logging.Log"/>
  <property name="log.noop" value="org.apache.commons.logging.impl.NoOpLog"/>
  <property name="log.class" value="${log.noop}"/>
  
  <!--
  <property name="logclass" value="org.apache.commons.logging.impl.NoOpLog"/>
  -->

  <!-- Construct unit test classpath -->
  <path id="test.classpath">
    <pathelement location="${build.home}/classes"/>
    <pathelement location="${build.home}/tests"/>
    <pathelement location="${junit.jar}"/>
    <pathelement location="${jaxp.jaxp.jar}"/>
    <pathelement location="${jaxp.parser.jar}"/>
    <pathelement location="${commons-beanutils.jar}"/>
    <pathelement location="${commons-collections.jar}"/>
    <pathelement location="${commons-logging.jar}"/>
  </path>

  <!-- Should all tests fail if one does? -->
  <property name="test.failonerror"        value="true"/>

  <!-- The test runner to execute -->
  <property name="test.runner"             value="junit.textui.TestRunner"/>


<!-- ========== Executable Targets ======================================== -->


  <target name="init"
   description="Initialize and evaluate conditionals">
    <echo message="-------- ${component.name} ${component.version} --------"/>
    <filter  token="name"                  value="${component.package}"/>
    <filter  token="version"               value="${component.version}"/>
  </target>


  <target name="prepare" depends="init"
   description="Prepare build directory">
    <mkdir dir="${build.home}"/>
    <mkdir dir="${build.home}/classes"/>
    <mkdir dir="${build.home}/conf"/>
    <mkdir dir="${build.home}/tests"/>
  </target>


  <target name="static" depends="prepare"
   description="Copy static files to build directory">
    <tstamp/>
    <copy  todir="${build.home}/conf" filtering="on">
      <fileset dir="${conf.home}" includes="*.MF"/>
    </copy>
  </target>


  <target name="compile" depends="static"
   description="Compile shareable components">
    <javac  srcdir="${source.home}"
           destdir="${build.home}/classes"
             debug="${compile.debug}"
       deprecation="${compile.deprecation}"
          optimize="${compile.optimize}">
      <classpath refid="compile.classpath"/>
    </javac>
    <copy    todir="${build.home}/classes" filtering="on">
      <fileset dir="${source.home}" excludes="**/*.java"/>
    </copy>
    <copy      file="LICENSE.txt"
              todir="${build.home}/classes/META-INF"/>
  </target>


  <target name="compile.tests" depends="compile"
   description="Compile unit test cases">
    <javac  srcdir="${test.home}"
           destdir="${build.home}/tests"
             debug="${compile.debug}"
       deprecation="${compile.deprecation}"
          optimize="${compile.optimize}">
      <classpath refid="test.classpath"/>
    </javac>
    <copy    todir="${build.home}/tests" filtering="on">
      <fileset dir="${test.home}" excludes="**/*.java"/>
    </copy>
  </target>


  <target name="compile.examples" depends="compile"
   description="Compile example code">
    <ant dir="src/examples/api" target="compile"/>
  </target>


  <target name="clean"
   description="Clean build and distribution directories">
    <delete    dir="${build.home}"/>
    <delete    dir="${dist.home}"/>
  </target>


  <target name="all" depends="clean,compile"
   description="Clean and compile all components"/>


  <target name="javadoc" depends="compile"
   description="Create component Javadoc documentation">
    <mkdir      dir="${dist.home}"/>
    <mkdir      dir="${dist.home}/docs"/>
    <mkdir      dir="${dist.home}/docs/api"/>
    <javadoc sourcepath="${source.home}"
                destdir="${dist.home}/docs/api"
           packagenames="org.apache.commons.*"
                 author="true"
                private="true"
                version="true"
               overview="src/java/overview.html"
               doctitle="&lt;h1&gt;${component.title} (Version ${component.version})&lt;/h1&gt;"
            windowtitle="${component.title} (Version ${component.version})"
                 bottom='Copyright (c) 2001-2004 - Apache Software Foundation &lt;!-- 
   Licensed 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.
                 --&gt;'>
      <link     offline="true" packagelistLoc="${commons-beanutils.api}"
                   href="http://jakarta.apache.org/commons/beanutils/api/"/>
      <link     offline="true" packagelistLoc="${commons-collections.api}"
                   href="http://jakarta.apache.org/commons/collections/api/"/>
      <link     offline="true" packagelistLoc="${commons-logging.api}"
                   href="http://jakarta.apache.org/commons/logging/api/"/>
      <classpath  refid="compile.classpath"/>
    </javadoc>
  </target>


  <target name="dist" depends="compile,javadoc"
   description="Create binary distribution">
    <mkdir      dir="${dist.home}"/>
    <copy      file="LICENSE.txt"
              todir="${dist.home}"/>
    <mkdir      dir="${build.home}/classes/META-INF"/>
    <copy      file="RELEASE-NOTES.txt"
              todir="${dist.home}"/>
    <copy      file="NOTICE.txt"
              todir="${dist.home}"/>
    <jar    jarfile="${dist.home}/commons-${component.name}.jar"
            basedir="${build.home}/classes"
           manifest="${build.home}/conf/MANIFEST.MF"/>
  </target>


<!-- ========== Unit Test Targets ========================================= -->

<!--
  <target name="test" depends="compile.tests,
                               test.digester,
                               test.matching,
                               test.matching.extended,
                               test.rule,
                               test.callmethod,
                               test.objectparam,
                               test.bpsr,
                               test.spr,
                               test.xmlrules,
                               test.node,
                               test.factory,
                               test.regex,
                               test.wdrules,
                               test.plugins,
                               test.others,
                               test.substitution
                              "
   description="Run all unit test cases">
  </target>
  -->
  <target name="test" depends="compile.tests,
                               test.digester"
   description="Run all unit test cases">
  </target>

  <target name="test.factory" depends="compile.tests"
   description="Run tests for loading Digester rules from XML ...">
    <echo message="Running factory create tests ..."/>
    <condition property="logopt" value="${log.factoryopt}=${log.class}">
      <istrue value="${suppressLogOutputDuringTests}"/>
    </condition>
    <java classname="${test.runner}" fork="yes"
        failonerror="${test.failonerror}">
      <jvmarg value="-D${logopt}"/>
      <arg value="org.apache.commons.digester.TestFactoryCreate"/>
      <classpath refid="test.classpath"/>
    </java>
  </target>

  <target name="test.xmlrules" depends="compile.tests"
   description="Run tests for loading Digester rules from XML ...">
    <echo message="Running xmlrules tests ..."/>
    <condition property="logopt" value="${log.factoryopt}=${log.class}">
      <istrue value="${suppressLogOutputDuringTests}"/>
    </condition>
    <java classname="${test.runner}" fork="yes"
        failonerror="${test.failonerror}">
      <jvmarg value="-D${logopt}"/>
      <arg value="org.apache.commons.digester.xmlrules.DigesterLoaderTestSuite"/>
      <classpath refid="test.classpath"/>
    </java>
  </target>


  <target name="test.bpsr" depends="compile.tests"
   description="Run tests for BeanPropertySetterRule ...">
    <echo message="Running BeanPropertySetterRule tests ..."/>
    <condition property="logopt" value="${log.factoryopt}=${log.class}">
      <istrue value="${suppressLogOutputDuringTests}"/>
    </condition>
    <java classname="${test.runner}" fork="yes"
        failonerror="${test.failonerror}">
      <jvmarg value="-D${logopt}"/>
      <arg value="org.apache.commons.digester.BeanPropertySetterRuleTestCase"/>
      <classpath refid="test.classpath"/>
    </java>
  </target>


  <target name="test.callmethod" depends="compile.tests"
   description="Run tests for CallMethodRule and CallParamRule ...">
    <echo message="Running CallMethodRule tests ..."/>
    <condition property="logopt" value="${log.factoryopt}=${log.class}">
      <istrue value="${suppressLogOutputDuringTests}"/>
    </condition>
    <java classname="${test.runner}" fork="yes"
        failonerror="${test.failonerror}">
      <jvmarg value="-D${logopt}"/>
      <arg value="org.apache.commons.digester.CallMethodRuleTestCase"/>
      <classpath refid="test.classpath"/>
    </java>
  </target>

  <target name="test.overlapping" depends="compile.tests"
   description="Run tests for OverlappingCallMethodRule...">
    <echo message="Running OverlappingCallMethodRule tests ..."/>
    <condition property="logopt" value="${log.factoryopt}=${log.class}">
      <istrue value="${suppressLogOutputDuringTests}"/>
    </condition>
    <java classname="${test.runner}" fork="yes"
        failonerror="${test.failonerror}">
      <jvmarg value="-D${logopt}"/>
      <arg value="org.apache.commons.digester.OverlappingCallMethodRuleTestCase"/>
      <classpath refid="test.classpath"/>
    </java>
  </target>

  <target name="test.objectparam" depends="compile.tests"
   description="Run tests for ObjectParamRule ...">
    <echo message="Running ObjectParamRule tests ..."/>
    <condition property="logopt" value="${log.factoryopt}=${log.class}">
      <istrue value="${suppressLogOutputDuringTests}"/>
    </condition>
    <java classname="${test.runner}" fork="yes"
        failonerror="${test.failonerror}">
      <jvmarg value="-D${logopt}"/>
      <arg value="org.apache.commons.digester.ObjectParamRuleTestCase"/>
      <classpath refid="test.classpath"/>
    </java>
  </target>

  <target name="test.digester" depends="compile.tests"
   description="Run basic Digester unit tests ...">
    <echo message="Running basic Digester tests ..."/>
    <condition property="logopt" value="${log.factoryopt}=${log.class}">
      <istrue value="${suppressLogOutputDuringTests}"/>
    </condition>
    <java classname="${test.runner}" fork="yes"
        failonerror="${test.failonerror}">
      <jvmarg value="-D${logopt}"/>
      <arg value="org.apache.commons.digester2.DigesterTestCase"/>
      <classpath refid="test.classpath"/>
    </java>
  </target>


  <target name="test.matching" depends="compile.tests"
   description="Run rule Digester test cases">
    <echo message="Running rule Digester tests ..."/>
    <condition property="logopt" value="${log.factoryopt}=${log.class}">
      <istrue value="${suppressLogOutputDuringTests}"/>
    </condition>
    <java classname="${test.runner}" fork="yes"
        failonerror="${test.failonerror}">
      <jvmarg value="-D${logopt}"/>
      <arg value="org.apache.commons.digester.RulesBaseTestCase"/>
      <classpath refid="test.classpath"/>
    </java>
  </target>

  <target name="test.regex" depends="compile.tests"
   description="Run tests for RegexRules">
    <echo message="Running tests for RegexRules ..."/>
    <condition property="logopt" value="${log.factoryopt}=${log.class}">
      <istrue value="${suppressLogOutputDuringTests}"/>
    </condition>
    <java classname="${test.runner}" fork="yes"
        failonerror="${test.failonerror}">
      <jvmarg value="-D${logopt}"/>
      <arg value="org.apache.commons.digester.RegexRulesTestCase"/>
      <classpath refid="test.classpath"/>
    </java>
  </target>

  <target name="test.wdrules" depends="compile.tests"
   description="Run tests for WithDefaultsRulesWrapper">
    <echo message="Running tests for WithDefaultsRulesWrapper ..."/>
    <condition property="logopt" value="${log.factoryopt}=${log.class}">
      <istrue value="${suppressLogOutputDuringTests}"/>
    </condition>
    <java classname="${test.runner}" fork="yes"
        failonerror="${test.failonerror}">
      <jvmarg value="-D${logopt}"/>
      <arg value="org.apache.commons.digester.WDRulesWrapperTestCase"/>
      <classpath refid="test.classpath"/>
    </java>
  </target>
  
  <target name="test.matching.extended" depends="compile.tests"
   description="Run rule Digester extended test cases">
    <echo message="Running rule Digester tests for ExtendedBaseRules ..."/>
    <condition property="logopt" value="${log.factoryopt}=${log.class}">
      <istrue value="${suppressLogOutputDuringTests}"/>
    </condition>
    <java classname="${test.runner}" fork="yes"
        failonerror="${test.failonerror}">
      <jvmarg value="-D${logopt}"/>
      <arg value="org.apache.commons.digester.EBRTestCase"/>
      <classpath refid="test.classpath"/>
    </java>
  </target>


  <target name="test.rule" depends="compile.tests"
   description="Run rule Digester unit tests ...">
    <echo message="Running Rule tests ..."/>
    <condition property="logopt" value="${log.factoryopt}=${log.class}">
      <istrue value="${suppressLogOutputDuringTests}"/>
    </condition>
    <java classname="${test.runner}" fork="yes"
        failonerror="${test.failonerror}">
      <jvmarg value="-D${logopt}"/>
      <arg value="org.apache.commons.digester.RuleTestCase"/>
      <classpath refid="test.classpath"/>
    </java>
  </target>

  <target name="test.spr" depends="compile.tests"
   description="Run tests for SetPropertyRule ...">
    <echo message="Running SetPropertyRule tests ..."/>
    <condition property="logopt" value="${log.factoryopt}=${log.class}">
      <istrue value="${suppressLogOutputDuringTests}"/>
    </condition>
    <java classname="${test.runner}" fork="yes"
        failonerror="${test.failonerror}">
      <jvmarg value="-D${logopt}"/>
      <arg value="org.apache.commons.digester.SetPropertyRuleTestCase"/>
      <classpath refid="test.classpath"/>
    </java>
  </target>


  <target name="test.node" depends="compile.tests"
          description="Run NodeCreateRule tests ...">
    <echo message="Running NodeCreateRule tests ..."/>
    <condition property="logopt" value="${log.factoryopt}=${log.class}">
      <istrue value="${suppressLogOutputDuringTests}"/>
    </condition>
    <java classname="${test.runner}" fork="yes"
        failonerror="${test.failonerror}">
      <jvmarg value="-D${logopt}"/>
      <arg value="org.apache.commons.digester.NodeCreateRuleTestCase"/>
      <classpath refid="test.classpath"/>
    </java>
  </target>

  <target name="test.plugins" depends="compile.tests"
          description="Run Plugins tests ...">
    <echo message="Running Plugins tests ..."/>
    <condition property="logopt" value="${log.factoryopt}=${log.class}">
      <istrue value="${suppressLogOutputDuringTests}"/>
    </condition>
    <java classname="${test.runner}" fork="yes"
        failonerror="${test.failonerror}">
      <jvmarg value="-D${logopt}"/>
      <arg value="org.apache.commons.digester.plugins.TestAll"/>
      <classpath refid="test.classpath"/>
    </java>
  </target> 

  <target name="test.others" depends="compile.tests"
          description="Run Other tests ...">
    <echo message="Running Other tests ..."/>
    <condition property="logopt" value="${log.factoryopt}=${log.class}">
      <istrue value="${suppressLogOutputDuringTests}"/>
    </condition>
    <java classname="${test.runner}" fork="yes"
        failonerror="${test.failonerror}">
      <jvmarg value="-D${logopt}"/>
      <arg value="org.apache.commons.digester.TestOthers"/>
      <classpath refid="test.classpath"/>
    </java>
  </target> 
  
  <target name="test.substitution" depends="compile.tests"
          description="Run Substitutions tests ...">
    <echo message="Running Substitutions tests ..."/>
    <condition property="logopt" value="${log.factoryopt}=${log.class}">
      <istrue value="${suppressLogOutputDuringTests}"/>
    </condition>
    <java classname="${test.runner}" fork="yes"
        failonerror="${test.failonerror}">
      <jvmarg value="-D${logopt}"/>
      <arg value="org.apache.commons.digester.substitution.TestAll"/>
      <classpath refid="test.classpath"/>
    </java>
  </target> 

</project>
