<!--
 * 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.
-->
<!DOCTYPE project [
<!ENTITY buildDependency SYSTEM "build-dependency.xml">
]>    

<project name="tutorial-catalog-mediation" default="compile">
    &buildDependency;
    <target name="compile">
        <mkdir dir="target/classes"/>
        <javac destdir="target/classes" debug="on" source="1.5" target="1.5">
            <src path="."/>
            <classpath>
                <fileset refid="tutorial-assets-jar"/>
                <fileset refid="tutorial-catalog-ejb-jar"/>
                <fileset refid="tuscany.jars"/>
                <fileset refid="3rdparty.jars"/>
                <fileset refid="3rdparty-provided.jars"/>
            </classpath>
        </javac>
        <copy todir="target/classes">
            <fileset dir="." excludes="**/*.java, **/.*/**, pom.xml, build*.xml, target/**"/>
        </copy>
        <jar destfile="target/tutorial-catalog-mediation.jar" basedir="target/classes">
            <manifest>
            </manifest>
        </jar>
    </target>

    <target name="package" depends="compile"/>

    <target name="clean">
        <delete dir="target" includeemptydirs="true"/>
    </target>

    <fileset id="tutorial-assets-jar" dir="../assets/target">
        <include name="tutorial-assets.jar"/>
    </fileset>
    <fileset id="tutorial-catalog-ejb-jar" dir="../catalog-ejb/target">
        <include name="tutorial-catalog-ejb.jar"/>
    </fileset>
    <fileset id="3rdparty-provided.jars" dir="../../../lib">
        <include name="geronimo-ejb_3.0_spec-1.0.jar"/>
    </fileset>

</project>
