<?xml version="1.0"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  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.
-->

<project name="OFBiz - SQL" default="jar" basedir=".">
    <import file="../../common.xml"/>

    <!-- ================================================================== -->
    <!-- Initialization of all property settings                            -->
    <!-- ================================================================== -->

    <property name="desc" value="SQL Component"/>
    <property name="name" value="ofbiz-sql"/>
    <property name="ofbiz.home.dir" value="../.."/>

    <path id="local.class.path">
        <fileset dir="../base/lib" includes="*.jar"/>
        <fileset dir="../base/build/lib" includes="*.jar"/>
    </path>
    <patternset id="src-dirs">
        <include name="build/gen-src/javacc"/>
        <include name="build/gen-src/jjtree"/>
    </patternset>
    <path id="test.class.path">
        <path refid="local.class.path"/>
       <fileset dir="../base/lib" includes="*.jar"/>
       <fileset dir="../base/lib/commons" includes="*.jar"/>
       <fileset dir="../base/lib/j2eespecs" includes="*.jar"/>
       <pathelement location="config"/>
       <pathelement location="src"/>
    </path>
    <filelist id="test.classes" dir="${src.dir}">
        <file name="org/ofbiz/sql/test/SQLTest.java"/>
    </filelist>

    <!-- ================================================================== -->
    <!-- Compilation of the source files                                                                                                                         -->
    <!-- ================================================================== -->

    <target name="gen-src">
        <ofbiz-javacc dir="org/ofbiz/sql" file="Parser"/>
    </target>

    <target name="classes" depends="prepare,gen-src">
        <javac16/>
    </target>

    <!-- ================================================================== -->
    <!-- Build JavaDoc                                                      -->
    <!-- ================================================================== -->

    <target name="docs" depends="prepare-docs">
        <default-javadoc>
            <fileset dir="build/gen-src/javacc" defaultexcludes="yes">
                <patternset refid="src.inc.set"/>
                <patternset refid="src.exc.set"/>
            </fileset>
            <fileset dir="${src.dir}" defaultexcludes="yes">
                <patternset refid="src.inc.set"/>
                <patternset refid="src.exc.set"/>
            </fileset>
        </default-javadoc>
    </target>
</project>
