<?xml version="1.0" encoding="utf-8"?>
<!--
 Copyright 2021 Google LLC

 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

     https://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.
-->

<!--
  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>
