<!--
  This file contains useful Ant definitions for users of App Engine.
  To use these macrodefs and taskdefs, import the file into your own build.xml:

  <property name="appengine.sdk.dir" location="/some_dir/appengine-java-sdk-trunk"/>
  <import file="${appengine.sdk.dir}/config/user/ant-macros.xml"/>

  For example uses of the macros, see the template project's build.xml.
 -->
<project name="appengine-ant-macros">

  <property name="appengine.sdk.home" location="${ant.file.appengine-ant-macros}../../../.."/>
  <property name="appengine.tools.classpath" 
            location="${appengine.sdk.home}/lib/appengine-tools-api.jar"/>

  <!-- 
    A macrodef for dev_appserver. Use like:
    
    <dev_appserver war="${war}"/>
  -->
  <macrodef name="dev_appserver" description="Runs the App Engine Development App Server">
    <attribute name="war" description="The exploded war directory containing the application"/>
    <attribute name="port" default="8080" description="The port the server starts on"/>
    <attribute name="address" default="localhost" description="The interface the server binds to"/>
    <element name="options" optional="true" description="Additional options for dev_appserver"/>
    <element name="args" optional="true" description="Additional arguments for the java task"/>

    <sequential>
      <java classname="com.google.appengine.tools.KickStart"
            classpath="${appengine.tools.classpath}"
            fork="true" failonerror="true">
        <arg value="com.google.appengine.tools.development.DevAppServerMain"/>
        <arg value="--port=@{port}"/>
        <arg value="--address=@{address}"/>
        <options/>
        <arg value="@{war}"/>
        <args/>
      </java>
    </sequential>
  </macrodef>

  <!-- 
    A macrodef for appcfg. Use like:
    
    <appcfg action="update" war="${war}"/>

  -->
  <macrodef name="appcfg" description="Manages an application">
    <attribute name="war" description="The exploded war directory containing the application"/>
    <attribute name="action" description="One of (update, rollback, update_indexes, request_logs)"/>
    <element name="options" optional="true" description="Options for appcfg (such as --server, --num_days, etc...)"/>
    <element name="args" optional="true" description="Additional arguments for the java task"/>

    <sequential>
      <java classname="com.google.appengine.tools.admin.AppCfg"
            classpath="${appengine.tools.classpath}"
            fork="true" failonerror="true">
        <arg value="--disable_prompt"/>
        <options/>
        <arg value="@{action}"/>
        <arg value="@{war}"/>
        <args/>
      </java>
    </sequential>
  </macrodef>

  <!-- 
    A taskdef for ORM enhancement. Use like:
    
    <enhance failonerror="true">
      <classpath>
        <pathelement path="${appengine.tools.classpath}"/>
        <pathelement path="@{war}/WEB-INF/classes"/>
        <fileset dir="@{war}/WEB-INF/lib" includes="*.jar"/>
      </classpath>
      <fileset dir="@{war}/WEB-INF/classes" includes="**/*.class"/>
    </enhance>
        
    Alternatively, use the <enhance_war/> macrodef below.
  -->
  <taskdef name="enhance"
           classpath="${appengine.tools.classpath}"
           classname="com.google.appengine.tools.enhancer.EnhancerTask"/>

  <!-- 
    A macrodef for ORM enhancement for a war. Use like:
     
    <enhance_war war="${war}"/>  
  -->
  <macrodef name="enhance_war" description="Run the ORM enhancer on an exploded war">
    <attribute name="war" description="The exploded war directory containing the application"/>
    <attribute name="api" description="persistence api, JDO or JPA" default="JDO"/>
    <element name="args" optional="true" description="Additional arguments to the enhancer"/>
    <sequential>
      <enhance failonerror="true" api="@{api}">
        <args/>
        <classpath>
          <pathelement path="${appengine.tools.classpath}"/>
          <pathelement path="@{war}/WEB-INF/classes"/>
          <fileset dir="@{war}/WEB-INF/lib" includes="*.jar"/>
        </classpath>
        <fileset dir="@{war}/WEB-INF/classes" includes="**/*.class"/>
      </enhance>
    </sequential>
  </macrodef>

</project>