blob: 9a994c406a67ca33a8d31420316aed2fb1aa9980 [file] [log] [blame]
<project name="grails" default="help">
<property name="servlet.version" value="2.3"/>
<property name="path" value="" />
<taskdef name="groovyc" classname="org.codehaus.groovy.ant.Groovyc" />
<taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" />
<target name="help">
<echo>Usage: grails [target]
Targets:
"create-app" - Create a new grails app
"create-controller" - Create a new controller
"create-service" - Create a new service
"create-domain-class" - Create a new domain class
"create-test-suite" - Create a new test suite
"generate-controller" - Generates a controller from a domain class
"generate-views" - Generates the views from a domain class
"generate-all" - Generates the all artifacts from a domain class
"test-app" - Run current app's unit tests
"run-app" - Run the application locally and wait
"create-webtest" - Create the functional test layout
"run-webtest" - Run the functional tests for a running app
</echo>
</target>
<target name="init-props">
<property environment="env"/>
<fail unless="env.GRAILS_HOME" message="GRAILS_HOME is not set."/>
<property name="grails.home" location="${env.GRAILS_HOME}"/>
<groovy >
// reusable code blocks, a pitty we cannot store Closures in the project...
properties.lower = 'x[0].toLowerCase() + x[1..-1]'
properties.caps = 'x[0].toUpperCase() + x[1..-1]'
properties.normCaps = '''
x = x.replaceAll(' ','')
x = x[0].toUpperCase() + x[1..-1]
if (x.endsWith(y)) x = x[0..(x.size()-y.size()-1)]
return x
'''
</groovy>
</target>
<target name="init" depends="init-props" description="Initialise the current app">
<mkdir dir="${path}src"/>
<mkdir dir="${path}src/java"/>
<mkdir dir="${path}src/groovy"/>
<mkdir dir="${path}grails-app"/>
<mkdir dir="${path}grails-app/controllers"/>
<mkdir dir="${path}grails-app/services"/>
<mkdir dir="${path}grails-app/domain"/>
<mkdir dir="${path}grails-app/taglib"/>
<mkdir dir="${path}grails-app/views"/>
<mkdir dir="${path}grails-app/views/layouts"/>
<mkdir dir="${path}grails-app/i18n"/>
<mkdir dir="${path}grails-app/conf"/>
<mkdir dir="${path}grails-tests"/>
<mkdir dir="${path}web-app"/>
<mkdir dir="${path}web-app"/>
<mkdir dir="${path}web-app"/>
<mkdir dir="${path}web-app/js"/>
<mkdir dir="${path}web-app/css"/>
<mkdir dir="${path}web-app/WEB-INF/classes"/>
<!--<mkdir dir="${path}
"/>-->
<!--<mkdir dir="${path}html"/>-->
<mkdir dir="${path}lib"/>
<mkdir dir="${path}spring"/>
<mkdir dir="${path}hibernate"/>
<mkdir dir="${grails.home}/dist"/>
<copy todir="${path}web-app/WEB-INF">
<fileset dir="${grails.home}/src/war/WEB-INF">
<include name="applicationContext.xml"/>
</fileset>
</copy>
<copy todir="${path}grails-app">
<fileset dir="${grails.home}/src/grails/grails-app" />
</copy>
<copy file="${grails.home}/src/war/WEB-INF/web${servlet.version}.template.xml" tofile="${path}web-app/WEB-INF/web.template.xml"/>
<copy file="${grails.home}/src/war/WEB-INF/sitemesh.xml" tofile="${path}web-app/WEB-INF/sitemesh.xml"/>
<copy todir="${path}web-app/js">
<fileset dir="${grails.home}/src/war/js"/>
</copy>
<copy todir="${path}web-app/css">
<fileset dir="${grails.home}/src/war/css"/>
</copy>
<copy todir="${path}web-app/WEB-INF/tld">
<fileset dir="${grails.home}/src/war/WEB-INF/tld/${servlet.version}"/>
<fileset dir="${grails.home}/src/war/WEB-INF/tld" includes="spring.tld"/>
<fileset dir="${grails.home}/src/war/WEB-INF/tld" includes="grails.tld"/>
</copy>
<copy todir="${path}spring">
<fileset dir="${grails.home}/src/war/WEB-INF/spring">
<include name="*.xml"/>
</fileset>
</copy>
<touch file="${path}grails-app/i18n/messages.properties"></touch>
</target>
<target name="generate-controller" depends="init-props" description="Generates a controller from a domain class">
<path id="test.classpath">
<!--<pathelement location="${grails.home}/src/web-app/WEB-INF"/>-->
<pathelement location="${basedir}/tmp/war/WEB-INF"/>
<pathelement location="${basedir}/tmp/war/WEB-INF/classes"/>
<fileset dir="${grails.home}/lib"/>
<fileset dir="${grails.home}/dist"/>
<fileset dir="lib"/>
</path>
<java classpathref="test.classpath" classname="grails.util.GenerateUtils" fork="true">
<arg value="controller" />
<arg value="${domain.class.name}" />
<!-- <jvmarg value="-Xdebug"/>
<jvmarg value="-Xrunjdwp:transport=dt_socket,address=50010,suspend=y,server=y"/> -->
</java>
</target>
<target name="generate-views" depends="package" description="Generates the views from a domain class">
<input addproperty="domain.class.name" message="Enter domain class name:" />
<path id="test.classpath">
<pathelement location="${basedir}/tmp/war/WEB-INF"/>
<pathelement location="${basedir}/tmp/war/WEB-INF/classes"/>
<fileset dir="${grails.home}/lib"/>
<fileset dir="${grails.home}/dist"/>
<fileset dir="lib"/>
</path>
<java classpathref="test.classpath" classname="grails.util.GenerateUtils" fork="true">
<arg value="view" />
<arg value="${domain.class.name}" />
</java>
</target>
<target name="generate-all" depends="package" description="Generates the all artifacts from a domain class">
<input addproperty="domain.class.name" message="Enter domain class name:" />
<path id="test.classpath">
<pathelement location="${basedir}/tmp/war/WEB-INF"/>
<pathelement location="${basedir}/tmp/war/WEB-INF/classes"/>
<fileset dir="${grails.home}/lib"/>
<fileset dir="${grails.home}/dist"/>
<fileset dir="lib"/>
</path>
<java classpathref="test.classpath" classname="grails.util.GenerateUtils" fork="true">
<arg value="view" />
<arg value="${domain.class.name}" />
</java>
<java classpathref="test.classpath" classname="grails.util.GenerateUtils" fork="true">
<arg value="controller" />
<arg value="${domain.class.name}" />
</java>
</target>
<target name="create-app" depends="init-props" description="Create a new grails app">
<input addproperty="project.name" message="Enter application name:" />
<antcall target="init">
<param name="path" value="${project.name}/"/>
</antcall>
<groovy>
def projName = properties."project.name"
properties."project.class.name" = Eval.x(projName, properties.lower)
</groovy>
<copy file="${grails.home}/src/grails/templates/artifacts/DataSource.groovy"
tofile="${project.name}/grails-app/conf/ApplicationDataSource.groovy"/>
<copy file="${grails.home}/src/grails/templates/artifacts/BootStrap.groovy"
tofile="${project.name}/grails-app/conf/ApplicationBootStrap.groovy"/>
</target>
<target name="create-controller" depends="init-props" description="Create a new controller">
<input addproperty="controller.name" message="Enter controller name:" />
<groovy>
def ctrlName = properties."controller.name"
properties."controller.class.name" = Eval.xy(ctrlName,'Controller', properties.normCaps)
</groovy>
<copy file="${grails.home}/src/grails/templates/artifacts/Controller.groovy"
tofile="grails-app/controllers/${controller.class.name}Controller.groovy"
overwrite="false"/>
<replace file="grails-app/controllers/${controller.class.name}Controller.groovy"
token="@controller.name@"
value="${controller.class.name}" />
<echo>Created controller: grails-app/controllers/${controller.class.name}Controller.groovy</echo>
<property name="test.suite.name" value="${controller.class.name}" />
<antcall target="internal-create-test-suite" />
</target>
<target name="create-service" depends="init-props" description="Create a new service">
<input addproperty="service.name" message="Enter service name:" />
<groovy>
def serviceName = properties."service.name"
properties."service.class.name" = Eval.xy(serviceName,'Service', properties.normCaps)
</groovy>
<copy file="${grails.home}/src/grails/templates/artifacts/Service.groovy"
tofile="grails-app/services/${service.class.name}Service.groovy"
overwrite="false"/>
<replace file="grails-app/services/${service.class.name}Service.groovy"
token="@service.name@"
value="${service.class.name}" />
<echo>Created service: grails-app/services/${service.class.name}Service.groovy</echo>
<property name="test.suite.name" value="${service.class.name}" />
<antcall target="internal-create-test-suite" inheritall="true" />
</target>
<target name="create-domain-class" depends="init-props" description="Create a new domain class">
<input addproperty="domain.class.name" message="Enter domain class name:" />
<groovy>
def domainName = properties."domain.class.name"
properties."domain.class.name" = Eval.x(domainName, properties.caps)
</groovy>
<copy file="${grails.home}/src/grails/templates/artifacts/DomainClass.groovy"
tofile="grails-app/domain/${domain.class.name}.groovy"
overwrite="false"/>
<replace file="grails-app/domain/${domain.class.name}.groovy"
token="@domain.class.name@"
value="${domain.class.name}" />
<echo>Domain class created: grails-app/domain/${domain.class.name}.groovy</echo>
<property name="test.suite.name" value="${domain.class.name}" />
<antcall target="internal-create-test-suite" inheritall="true" />
</target>
<target name="create-test-suite" depends="init-props" description="Create a new test suite">
<input addproperty="test.suite.name" message="Enter test suite name:" />
<antcall target="internal-create-test-suite" inheritall="true" />
</target>
<target name="internal-create-test-suite">
<groovy>
def suiteName = properties."test.suite.name"
properties."test.suite.name" = Eval.xy(suiteName,'Tests', properties.normCaps)
</groovy>
<copy file="${grails.home}/src/grails/templates/artifacts/Tests.groovy"
tofile="grails-tests/${test.suite.name}Tests.groovy"
overwrite="false"/>
<replace file="grails-tests/${test.suite.name}Tests.groovy"
token="@test.suite.name@"
value="${test.suite.name}" />
<echo>Created test suite: grails-tests/${test.suite.name}Tests.groovy</echo>
</target>
<target name="clean">
<delete file="grails-app.war"/>
<delete dir="tmp" />
</target>
<target name="build" depends="init-props">
<path id="classpath">
<fileset dir="lib"/>
<fileset dir="${grails.home}/lib"/>
<fileset dir="${grails.home}/dist"/>
</path>
<delete failonerror="false">
<fileset dir="web-app/WEB-INF/classes"/>
</delete>
<javac srcdir="src/java" destdir="web-app/WEB-INF/classes" classpathref="classpath" debug="on" deprecation="on" optimize="off"/>
<groovyc srcdir="src/groovy" destdir="web-app/WEB-INF/classes" classpathref="classpath" />
</target>
<target name="test" depends="build">
<delete dir="tmp/reports"/>
<mkdir dir="tmp/reports"/>
<path id="test_classpath">
<fileset dir="lib"/>
<fileset dir="${grails.home}/lib"/>
<fileset dir="${grails.home}/dist"/>
<path location="web-app/WEB-INF/classes"/>
</path>
<junit>
<classpath refid="test_classpath"/>
<formatter type="plain" usefile="no"/>
<formatter type="xml"/>
<batchtest todir="tmp/reports" fork="yes">
<fileset dir="web-app/WEB-INF/classes" includes="**/*Tests.class" excludes="**/Abstract*"/>
</batchtest>
</junit>
</target>
<target name="test-app" depends="package" description="Run current app's unit tests">
<mkdir dir="${basedir}/tmp/war/WEB-INF/grails-app/tests" />
<copy todir="${basedir}/tmp/war/WEB-INF/grails-app/tests">
<fileset dir="${basedir}/grails-tests/" includes="**" />
</copy>
<path id="test.classpath">
<!--<pathelement location="${grails.home}/src/web-app/WEB-INF"/>-->
<pathelement location="${basedir}/tmp/war/WEB-INF"/>
<pathelement location="${basedir}/tmp/war/WEB-INF/classes"/>
<fileset dir="${grails.home}/lib"/>
<fileset dir="${grails.home}/dist"/>
<fileset dir="lib"/>
</path>
<java classpathref="test.classpath" classname="grails.util.RunTests" fork="true">
<!-- <jvmarg value="-Xdebug"/>
<jvmarg value="-Xrunjdwp:transport=dt_socket,address=50010,suspend=y,server=y"/> -->
</java>
<delete dir="${basedir}/tmp/war/WEB-INF/grails-app/tests"></delete>
</target>
<target name="dev">
<property name="dev.run" value="true" />
</target>
<target name="package" depends="build">
<mkdir dir="tmp/war"/>
<copy todir="tmp/war">
<fileset dir="web-app">
<include name="**/**"/>
<exclude name="WEB-INF/*.template.xml"/>
</fileset>
</copy>
<property name="controllers.home" location="grails-app/controllers"></property>
<property name="web.xml.template" location="web-app/WEB-INF/web.template.xml"></property>
<property name="target.web.xml" location="tmp/war/WEB-INF/web.xml"></property>
<property name="tmp.war.dir" location="tmp/war"></property>
<property name="project.base.dir" location="."></property>
<groovy><![CDATA[
import groovy.text.SimpleTemplateEngine
def controllersHome = properties."controllers.home"
def controllers = []
def flows = []
new File("${controllersHome}").eachFileRecurse {
def match = it.name =~ "(\\w+)(Controller.groovy\$)"
if(match) {
def controllerName = match[0][1]
controllerName = Eval.x(controllerName, properties.lower)
controllers << controllerName
}
match = it.name =~ "(\\w+)(PageFlow.groovy\$)"
if(match) {
def flowName = match[0][1]
flowName = Eval.x(flowName, properties.lower)
flows << flowName
}
}
def devRun = ("true" == properties."dev.run")
def binding = [ "controllers" : controllers,
"flows" : flows,
"basedir" : properties."project.base.dir",
"destdir" : properties."tmp.war.dir",
"dev" : devRun ]
def engine = new SimpleTemplateEngine()
def template = engine.createTemplate( new File( properties."web.xml.template" ).text ).make(binding)
new File( properties."target.web.xml" ).write( template.toString() )
]]></groovy>
<mkdir dir="tmp/war/WEB-INF/classes"/>
<touch file="tmp/war/WEB-INF/classes/.dummy"/>
<mkdir dir="tmp/war/WEB-INF/lib"/>
<touch file="tmp/war/WEB-INF/lib/.dummy"/>
<mkdir dir="tmp/war/WEB-INF/spring"/>
<touch file="tmp/war/WEB-INF/spring/.dummy"/>
<mkdir dir="tmp/war/WEB-INF/tld"/>
<mkdir dir="tmp/war/js"/>
<copy todir="tmp/war/WEB-INF/lib">
<fileset dir="${grails.home}/lib">
<include name="antlr-2.7.6rc1.jar"/>
<include name="asm.jar"/>
<include name="asm-attrs.jar"/>
<include name="cglib-2.1.3.jar"/>
<include name="dom4j-1.6.1.jar"/>
<include name="ehcache-1.1.jar"/>
<include name="ejb-3.0-edr2.jar"/>
<include name="hibernate3.jar"/>
<include name="jdbc2_0-stdext.jar"/>
<include name="jta.jar"/>
<include name="junit.jar"/>
<include name="asm-2.0.jar"/>
<include name="asm-util-2.0.jar"/>
<include name="commons-logging.jar"/>
<include name="sitemesh-2.2.1.jar"/>
<include name="spring-webflow.jar"/>
<include name="spring-binding.jar"/>
<include name="spring.jar"/>
<include name="groovy-all-1.0-jsr-05-SNAPSHOT.jar"/>
<include name="springmodules-sandbox.jar"/>
<include name="standard-${servlet.version}.jar"/>
<include name="jstl-${servlet.version}.jar"/>
<include name="commons-lang-2.0.jar"/>
<include name="log4j-1.2.8.jar"/>
<include name="ognl-2.7.jar"/>
<include name="hsqldb.jar"/>
<include name="commons-collections-3.0.jar"/>
<include name="commons-pool-1.2.jar"/>
<include name="commons-dbcp-1.2.1.jar"/>
<include name="commons-cli-1.0.jar"/>
<include name="commons-validator.jar"/>
<include name="commons-fileupload.jar"/>
<include name="jakarta-oro-2.0.8.jar"/>
</fileset>
<fileset dir="${grails.home}/dist"/>
<fileset dir="lib"/>
</copy>
<antcall target="package:java5"></antcall>
<copy todir="tmp/war/WEB-INF/grails-app">
<fileset dir="grails-app" includes="**"/>
</copy>
<copy todir="tmp/war/WEB-INF/classes">
<fileset dir="grails-app/i18n" includes="**"/>
</copy>
<copy todir="tmp/war/WEB-INF/spring">
<fileset dir="spring" includes="**"/>
</copy>
<copy todir="tmp/war/WEB-INF/classes">
<fileset dir="hibernate" includes="**"/>
</copy>
<copy todir="tmp/war/WEB-INF">
<fileset dir="${grails.home}/src/war/WEB-INF">
<include name="log4j.properties"/>
</fileset>
</copy>
</target>
<target name="package:checkj5">
<condition property="is.java.5">
<equals arg1="${ant.java.version}" arg2="1.5"/>
</condition>
</target>
<target name="package:java5" depends="package:checkj5" if="is.java.5">
<copy todir="tmp/war/WEB-INF/lib">
<fileset dir="${grails.home}/lib">
<include name="hibernate-annotations.jar"/>
<include name="ejb3-persistence.jar"/>
</fileset>
</copy>
</target>
<target name="war" depends="clean,package">
<basename property="project.dir" file="."/>
<jar destfile="${project.dir}.war" basedir="tmp/war" />
</target>
<target name="run-app:impl">
<basename property="project.dir" file="."/>
<groovy>
import org.mortbay.jetty.*
import org.mortbay.http.*
System.setProperty('org.mortbay.xml.XmlParser.NotValidating', 'true')
def server = new Server()
try {
def listener = new SocketListener()
listener.setPort(8080)
server.addListener(listener)
server.addWebApplication("/" + properties."project.dir", 'tmp/war')
server.start()
if (properties.'runTests') ant.antcall(target:'webtest-impl')
} catch(Throwable t) {
t.printStackTrace()
} finally {
if (properties.'runTests') server.stop()
}
</groovy>
</target>
<target name="wait-forever" >
<script language="groovy">
while(true) {
sleep(Long.MAX_VALUE)
}
</script>
</target>
<target name="run-app" depends="dev, package" description="Run the application locally and wait">
<antcall target="run-app:impl" />
<antcall target="wait-forever" />
</target>
<target name="init-webtest" depends="init-props" >
<!--
Download WebTest distro if needed.
Users may need to use the <setproxy/> task to when behind a firewall!
Downloads are expanded below the downloads dir.
Todo: expanded dirs need to deleted if download cache is updated
Todo: fail gracefully if not online
Todo: fetch by release tag
-->
<mkdir dir="${grails.home}/downloads/webtest" />
<get dest="${grails.home}/downloads/webtest.zip" src="http://webtest.canoo.com/webtest/build.zip"
verbose="true" usetimestamp="true"/>
<unzip dest="${grails.home}/downloads/webtest" src="${grails.home}/downloads/webtest.zip" overwrite="false" />
</target>
<target name="create-webtest" description="Create a functional testing layout" depends="init-webtest" >
<copy todir=".">
<fileset dir="${grails.home}/src/grails/templates/" includes="webtest/"/>
</copy>
</target>
<target name="generate-webtest" description="Create a webtest for a domain class" depends="init-props" >
<input addproperty="domain.class.name" message="Enter domain class name:" />
<groovy>
def domainName = properties."domain.class.name"
properties."webtest.name" = Eval.x(domainName, properties.caps)
</groovy>
<copy file="${grails.home}/src/grails/templates/artifacts/WebTest.groovy"
tofile="webtest/tests/${webtest.name}Test.groovy" />
<replace file="webtest/tests/${webtest.name}Test.groovy"
token="@webtest.name.caps@"
value="${webtest.name}" />
<replace file="webtest/tests/${webtest.name}Test.groovy"
token="@webtest.name.lower@"
value="${domain.class.name}" />
<echo>Webtest created: webtest/tests/${webtest.name}Test.groovy</echo>
</target>
<target name="run-webtest" depends="init-props" description="Run the functional tests for a running app">
<antcall target="run-app:impl">
<param name="runTests" value="true"/>
</antcall>
</target>
<target name="webtest-impl">
<java classname="groovy.ui.GroovyMain" >
<arg line="webtest/tests/TestSuite"/>
<classpath>
<pathelement location="webtest/tests"/>
<fileset dir="${grails.home}/lib" includes="*.jar"/>
<fileset dir="${grails.home}/dist" includes="*.jar"/>
<pathelement location="${grails.home}/downloads/webtest/lib"/>
<fileset dir="${grails.home}/downloads/webtest/lib" includes="**/*.jar"/>
</classpath>
</java>
</target>
</project>