<!--
 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.
-->
<!-- ====================================================================== -->
<!-- Build script to compile, package a OpenJPA/Slice based application     -->
<!-- with Google Web Toolkit client to be deployed in a servlet container.  -->
<!-- ====================================================================== -->
<project name="OpenTrader">

	<!-- local environment paths for required libraries                     -->
	<property file="build.properties" />

	<!-- root directory for *.java and GWT module descriptor                -->
	<property name="src.dir" value="src/main/java" />

	<!-- root directory for web.xml, persistence.xml, cascaded stylesheets  -->
	<!-- images and the entry point html file                               -->
	<property name="rsrc.dir" value="src/main/resources" />

	<!-- root directory for the deployment layout                           -->
	<property name="war.dir" value="war" />

	<!-- root directory for compiled *.class files                          -->
	<!-- the directory is named according to packaging of web application   -->
	<property name="classes.dir" value="war/WEB-INF/classes" />

	<!-- root directory for jar files application depends on                -->
	<!-- the directory is named according to packaging of web application   -->
	<property name="lib.dir" value="war/WEB-INF/lib" />

	<!-- the target web archieve created by this script                     -->
	<property name="target.war" value="opentrader.war" />

	<!-- the name of the GWT module. The module descriptor must be placed   -->
	<!-- relative w.r.t. source root for GWT compiler                       -->
	<property name="gwt.module" value="org.apache.openjpa.trader.OpenTrader" />

	<!-- relevant GWT class libraries. gwt-user.jar however should not be   -->
	<!-- deployed in a servlet container as this jar contains javax.servlet -->
	<!-- classes. gwt-servlet is the right jar to deploy                    -->
	<!-- cobogw.jar is used for rounded panels.                             -->
	<path id="gwt.classpath">
		<pathelement location="${gwt.sdk}/gwt-user.jar" />
		<pathelement location="${gwt.sdk}/gwt-dev.jar" />
		<pathelement location="${gwt.sdk}/gwt-servlet.jar" />
		<pathelement location="${gwt.sdk}/cobogw-1.3.1.jar" />
	</path>

	<!-- classpath for normal java compilation                             -->
	<path id="java.compile.classpath">
		<pathelement path="${openjpa.jar}" />
		<path refid="gwt.classpath" />
	</path>

	<!-- classpath for OpenJPA bytecode enhanement requires the resource   -->
	<!-- root directory to locate persitence.xml descriptor                -->
	<path id="openjpa.compile.classpath">
		<pathelement path="${openjpa.jar}" />
		<pathelement path="${classes.dir}" />
		<pathelement path="${rsrc.dir}" />
	</path>

	<!-- classpath for GWT Compiler requires the application source code  -->
	<!-- and standard JPA jar as well, because application domain classes -->
	<!-- refer them through source code mapping annotations               -->
	<path id="gwt.compile.classpath">
		<path refid="gwt.classpath" />
		<pathelement path="${src.dir}" />
		<pathelement path="${jpa.jar}" />
		<pathelement path="${classes.dir}" />
		<pathelement path="${rsrc.dir}" />
	</path>


	<target name="clean" description="Deletes all derived resources">
		<delete dir="${war.dir}"/>
		<delete dir="${target.war}" />
	</target>

	<!-- compilation proceeds in 3 phases. Compiling normal Java, bytecode  -->
	<!-- followed by GWT compilation.                                       -->
	<target name="compile" depends="clean">
		<mkdir dir="${classes.dir}" />
		<antcall target="compile.pojo"/>
	    <antcall target="compile.gwt"/>
	    <antcall target="compile.openjpa"/>
	</target>

	<target name="compile.pojo">
		<javac srcdir="src"
		       destdir="${classes.dir}"
		       verbose="false"
		       debug="true">
			<classpath refid="java.compile.classpath" />
			<exclude name="**/override/**" />
		</javac>
	</target>

	<target name="compile.gwt">
		<java classname="com.google.gwt.dev.Compiler"
		      failonerror="true"
		      fork="true">
			<classpath refid="gwt.compile.classpath" />
			<arg value="-logLevel" />
			<arg value="WARN" />
			<arg value="${gwt.module}" />
		</java>
	</target>

	<target name="compile.openjpa">
		<java classname="org.apache.openjpa.enhance.PCEnhancer"
		      failonerror="true"
		      fork="true">
			<classpath refid="openjpa.compile.classpath" />
			<arg value="-properties" />
			<arg value="META-INF/persistence.xml#exchange" />
		</java>
	</target>

	<!-- packaging for development. Copies relevant files from the source   -->
	<!-- in a layour mimicing the web archive structure for deployment      -->
	<target name="devpack">
		<copy file="${src.dir}/org/apache/openjpa/trader/OpenTrader.gwt.xml"
		      tofile="${classes.dir}/org/apache/openjpa/trader/OpenTrader.gwt.xml" />
		<copy todir="${war.dir}">
			<fileset dir="${rsrc.dir}">
				<include name="WEB-INF/web.xml" />
				<include name="OpenTrader.html" />
				<include name="css/OpenTrader.css" />
			</fileset>
		</copy>
		<copy todir="${war.dir}">
			<fileset dir="${rsrc.dir}">
				<include name="help/*.*" />
			</fileset>
		</copy>
		<copy todir="${classes.dir}">
			<fileset dir="${rsrc.dir}">
				<include name="images/*.*" />
				<include name="META-INF/persistence.xml" />
			</fileset>
		</copy>
		<copy todir="${lib.dir}" file="${openjpa.jar}" />
		<!-- do not deploy gwt-user.jar as it contains javax.servlet.*      -->
		<copy todir="${lib.dir}" file="${gwt.sdk}/gwt-servlet.jar" />
		<copy todir="${lib.dir}" file="${gwt.sdk}/cobogw-1.3.1.jar" />
		<copy todir="${lib.dir}" file="${jdbc.jar}" />
	</target>

	<target name="package"
	        depends="devpack"
	        description="Package OpenTrader as a WAR archieve">
		<delete file="${target.war}" />
		<jar destfile="${target.war}"
		     filesonly="true"
		     duplicate="fail" update="true"
		     basedir="${war.dir}">
		</jar>
	</target>

	<!-- classpath for running the aplication in development mode.          -->
	<path id="dev.run.classpath">
		<path refid="gwt.classpath" />
		<pathelement path="${src.dir}" />
		<pathelement path="${war.dir}" />
		<pathelement path="${war.dir}/WEB-INF/classes" />
		<pathelement path="${openjpa.jar}" />
		<pathelement path="${jdbc.jar}" />
	</path>

	<target name="devmode" depends="devpack" description="Runs in development mode">
		<java failonerror="true"
		      fork="true"
		      classname="com.google.gwt.dev.DevMode">
			<classpath refid="dev.run.classpath" />
			<jvmarg value="-Xmx256M" />
			<arg value="-startupUrl" />
			<arg value="OpenTrader.html" />
			<arg value="-logLevel" />
			<arg value="DEBUG" />
			<arg value="${gwt.module}" />
		</java>
	</target>

	<target name="deploy" depends="package">
		<copy file="${target.war}" todir="${auto.deploy.dir}" />
	</target>


</project>
