<project name="grails" default="help">

	<property name="servlet.version" value="2.3"/>
	<property name="path" value="" />
	
	<target name="help">
		<echo>Usage: grails [target]

Targets:		
"init" - initialise the current app
"create-app" - Create a new grails app
"create-controller" - Create a new controller
"create-domain-class" - Create a new domain class
"create-test-suite" - Create a new test suite
"test-app" - Run current app's unit tests
"run-app" - Run the application (coming soon)
		</echo>
	</target>
	

	<target name="create-app">
		<property environment="env"/>
		<fail unless="env.GRAILS_HOME" message="GRAILS_HOME is not set."/>
		<property name="grails.home" location="${env.GRAILS_HOME}"/>
		
		<input addproperty="project.name" message="Enter application name:" />
		
		<antcall target="init">
			<param name="path" value="${project.name}/"/>
		</antcall>
		
		<script language="groovy">
			def projName = grails.getProperty("project.name")			
			grails.setProperty("project.class.name", projName.substring(0,1).toUpperCase() + projName.substring(1,projName.length()))
		</script>		
		
		<copy 	file="${grails.home}/src/grails/templates/DataSource.groovy" 
				tofile="${project.name}/grails-app/conf/${project.class.name}DataSource.groovy"/>
			<copy 	file="${grails.home}/src/grails/templates/BootStrap.groovy" 
					tofile="${project.name}/grails-app/conf/${project.class.name}BootStrap.groovy"/>		
		
		<replace 	file="${project.name}/grails-app/conf/${project.class.name}DataSource.groovy" 
					token="@data.source.name@" 
					value="${project.class.name}" />
			<replace 	file="${project.name}/grails-app/conf/${project.class.name}BootStrap.groovy" 
						token="@bootstrap.class.name@" 
						value="${project.class.name}" />		
	</target>
	
	<target name="create-controller">
		<property environment="env"/>
		<fail unless="env.GRAILS_HOME" message="GRAILS_HOME is not set."/>
		<property name="grails.home" location="${env.GRAILS_HOME}"/>
		
		<input addproperty="controller.name" message="Enter controller name:" />
		
		<script language="groovy">
			def ctrlName = grails.getProperty("controller.name")		
			ctrlName = ctrlName.substring(0,1).toUpperCase() + ctrlName.substring(1,ctrlName.length())
			if(ctrlName.endsWith("Controller")) {
				def i = ctrlName.lastIndexOf("Controller");
				ctrlName = ctrlName.substring(0, i);
			}			
			grails.setProperty("controller.class.name", ctrlName)
		</script>
				
		<copy 	file="${grails.home}/src/grails/templates/Controller.groovy" 
				tofile="grails-app/controllers/${controller.class.name}Controller.groovy"/>
		
		<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>
	</target>
	
	<target name="create-domain-class">
		<property environment="env"/>
		<fail unless="env.GRAILS_HOME" message="GRAILS_HOME is not set."/>
		<property name="grails.home" location="${env.GRAILS_HOME}"/>
		
		<input addproperty="domain.class.name" message="Enter domain class name:" />
		
		<script language="groovy">
			def className = grails.getProperty("domain.class.name")		
			className = className.substring(0,1).toUpperCase() + className.substring(1,className.length())
			grails.setProperty("domain.class.name", className)
		</script>
				
		<copy 	file="${grails.home}/src/grails/templates/DomainClass.groovy" 
				tofile="grails-app/domain/${domain.class.name}.groovy"/>
		
		<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>
	</target>	
	
	<target name="create-test-suite">
		<property environment="env"/>
		<fail unless="env.GRAILS_HOME" message="GRAILS_HOME is not set."/>
		<property name="grails.home" location="${env.GRAILS_HOME}"/>
		
		<input addproperty="test.suite.name" message="Enter test suite name:" />
		
		<script language="groovy">
			def suiteName = grails.getProperty("test.suite.name")		
			suiteName = suiteName.substring(0,1).toUpperCase() + suiteName.substring(1,suiteName.length())
			if(suiteName.endsWith("Tests")) {
				def i = suiteName.lastIndexOf("Tests");
				suiteName = suiteName.substring(0, i);
			}			
			grails.setProperty("test.suite.name", suiteName)
		</script>
				
		<copy 	file="${grails.home}/src/grails/templates/Tests.groovy" 
				tofile="grails-app/tests/${test.suite.name}Tests.groovy"/>
		
		<replace 	file="grails-app/tests/${test.suite.name}Tests.groovy" 
					token="@test.suite.name@" 
					value="${test.suite.name}" />	
		<echo>Created test suite: grails-app/tests/${test.suite.name}Tests.groovy</echo>
	</target>	
	
	<target name="init">
		<property environment="env"/>
		<fail unless="env.GRAILS_HOME" message="GRAILS_HOME is not set."/>
		<property name="grails.home" location="${env.GRAILS_HOME}"/>
		<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/domain"/>
		<mkdir dir="${path}grails-app/views"/>
		<mkdir dir="${path}grails-app/layouts"/>		
		<mkdir dir="${path}grails-app/conf"/>
		<mkdir dir="${path}grails-app/tests"/>
		<mkdir dir="${path}grails-test"/>
		<mkdir dir="${path}jsp"/>
		<mkdir dir="${path}lib"/>
		<mkdir dir="${path}spring"/>
		<mkdir dir="${path}html"/>
		<mkdir dir="${path}war"/>
		<mkdir dir="${path}war/WEB-INF"/>
		<mkdir dir="${path}war/WEB-INF/classes"/>
		<mkdir dir="${grails.home}/dist"/>
		
		<copy todir="${path}war/WEB-INF">
			<fileset dir="${grails.home}/src/war/WEB-INF">
				<include name="applicationContext.xml"/>
			</fileset>
		</copy>
		<copy file="${grails.home}/src/war/WEB-INF/web${servlet.version}.xml" tofile="${path}war/WEB-INF/web.xml"/>
		<copy file="${grails.home}/src/war/WEB-INF/sitemesh.xml" tofile="${path}war/WEB-INF/sitemesh.xml"/>		
		<copy todir="${path}spring">
			<fileset dir="${grails.home}/src/war/WEB-INF/spring">
				<include name="*.xml"/>
			</fileset>
		</copy>
	</target>
	
	<target name="clean">
		<delete file="grails-app.war"/>
		<delete dir="tmp"/>
	</target>
	
	<target name="build">
		<property environment="env"/>
		<fail unless="env.GRAILS_HOME" message="GRAILS_HOME is not set."/>
		<property name="grails.home" location="${env.GRAILS_HOME}"/>
		<path id="classpath">
			<fileset dir="lib"/>
			<fileset dir="${grails.home}/lib"/>
			<fileset dir="${grails.home}/dist"/>
		</path>
		<delete>
			<fileset dir="war/WEB-INF/classes"/>
		</delete>
		<javac srcdir="src" destdir="war/WEB-INF/classes" classpathref="classpath" debug="on" deprecation="on" optimize="off"/>
	</target>
	
	<target name="test" depends="build">
		<property environment="env"/>
		<fail unless="env.GRAILS_HOME" message="GRAILS_HOME is not set."/>
		<property name="grails.home" location="${env.GRAILS_HOME}"/>
		<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="war/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="war/WEB-INF/classes" includes="**/*Tests.class" excludes="**/Abstract*"/>
			</batchtest>			
		</junit>
	</target>

	<target name="test-app">
		<property environment="env"/>
		<fail unless="env.GRAILS_HOME" message="GRAILS_HOME is not set."/>
		<property name="grails.home" location="${env.GRAILS_HOME}"/>
		<delete dir="tmp/tests/classpath"/>
		<mkdir dir="tmp/tests/classpath/spring"/>
		<copy todir="tmp/tests/classpath">
			<fileset dir="${grails.home}/src/war/WEB-INF">
				<include name="log4j.properties"/>
			</fileset>
			<fileset dir="grails-app"/>
		</copy>
		<copy todir="tmp/tests/classpath/spring">
			<fileset dir="spring" includes="**"/>
		</copy>
		<path id="test.classpath">
			<pathelement location="${basedir}/tmp/tests/classpath"/>
			<pathelement location="${grails.home}/src/war/WEB-INF"/>
			<pathelement location="${basedir}/grails-app"/>
			<pathelement location="${basedir}/grails-app/controllers"/>
			<pathelement location="${basedir}/grails-app/domain"/>
			<pathelement location="${basedir}/grails-app/conf"/>
			<pathelement location="${basedir}/grails-app/tests"/>
			<pathelement location="${basedir}/grails-test"/>
			<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>
	</target>
	
	<target name="war">
		<property environment="env"/>
		<fail unless="env.GRAILS_HOME" message="GRAILS_HOME is not set."/>
		<property name="grails.home" location="${env.GRAILS_HOME}"/>
		<delete file="grails-app.war"/>
		<delete dir="tmp"/>
		<mkdir dir="tmp/war"/>
		<copy todir="tmp/war">
			<fileset dir="war">
				<include name="WEB-INF/*.xml"/>
			</fileset>
		</copy>
		<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/jsp"/>
		<touch file="tmp/war/WEB-INF/jsp/.dummy"/>
		<mkdir dir="tmp/war/WEB-INF/jsp/layouts"/>
		<touch file="tmp/war/WEB-INF/jsp/layouts/.dummy"/>		
		<mkdir dir="tmp/war/WEB-INF/spring"/>
		<touch file="tmp/war/WEB-INF/spring/.dummy"/>
		<mkdir dir="tmp/war/WEB-INF/grails-app"/>
		<touch file="tmp/war/WEB-INF/grails-app/.dummy"/>
		<mkdir dir="tmp/war/WEB-INF/tld"/>
		<mkdir dir="tmp/war/js"/>
		<copy todir="tmp/war">
			<fileset dir="html"/>
		</copy>
		<copy todir="tmp/war/js">
			<fileset dir="${grails.home}/src/war/js"/>
		</copy>
		<copy todir="tmp/war/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="gvtags.tld"/>
		</copy>
		<copy todir="tmp/war/WEB-INF/lib">
			<fileset dir="${grails.home}/lib">
				<include name="antlr-2.7.5.jar"/>
				<include name="asm.jar"/>
				<include name="asm-attrs.jar"/>
				<include name="cglib-2.1.jar"/>
				<include name="dom4j-1.6.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="hibernate3.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-04-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="gvtags.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="jakarta-oro-2.0.8.jar"/>					
			</fileset>
			<fileset dir="${grails.home}/dist"/>
			<fileset dir="lib"/>
		</copy>
		<copy todir="tmp/war/WEB-INF/classes">
			<fileset dir="war/WEB-INF/classes"/>
			<fileset dir="grails-app" includes="**">
				<exclude name="controllers"/>
				<exclude name="domain"/>
				<exclude name="conf"/>
				<exclude name="tests"/>
				<exclude name="views"/>
			</fileset>
			<fileset dir="grails-app/controllers" includes="**"/>
			<fileset dir="grails-app/domain" includes="**"/>
			<fileset dir="grails-app/conf" includes="**"/>
			<fileset dir="grails-app/tests" includes="**"/>
		</copy>
		<copy todir="tmp/war/WEB-INF/jsp">
			<fileset dir="jsp" includes="**"/>
			<fileset dir="grails-app/views" includes="**"/>
		</copy>
			<copy todir="tmp/war/WEB-INF/jsp/layouts">
				<fileset dir="grails-app/layouts" includes="**"/>
			</copy>		
		<copy todir="tmp/war/WEB-INF/spring">
			<fileset dir="spring" includes="**"/>
		</copy>
		<copy todir="tmp/war/WEB-INF">
			<fileset dir="${grails.home}/src/war/WEB-INF">
				<include name="log4j.properties"/>
			</fileset>
		</copy>
		<basename property="project.dir" file="."/>
		<jar destfile="${project.dir}.war" basedir="tmp/war" />
	</target>

	<target name="run-app" depends="war">
	    <property location="tmp/war" name="tmp.war.location" />
		<basename property="project.dir" file="."/>
		
		<script language="groovy">
			import org.mortbay.jetty.*;
			import org.mortbay.http.*;		
			try {
				def server = new Server();
				def listener = new SocketListener();
				listener.setPort(8080); 
				server.addListener(listener);
				server.addWebApplication("/" + grails.getProperty("project.dir"),grails.getProperty("tmp.war.location"));
				server.start();		
				// we put this here because ant drops out of its process when the script tag finishes 
				// and hence stops the web server		
				while(true) {
					Thread.sleep(Long.MAX_VALUE)
				}
			}
			catch(Error er) {
				er.printStackTrace();			
			}
			catch(Exception e) {
				e.printStackTrace();
			}
		</script>
	</target>	
</project>