<?xml version="1.0" encoding="UTF-8"?>

<project name="Philae project" default="usage" basedir="." xmlns:mcr="antlib:org.mycore.buildtools">

	<import file="${basedir}/common-modules.xml" />

	<!-- =================================================================== -->
	<!-- Help on usage                                                       -->
	<!-- =================================================================== -->

	<target name="usage" description="Display main targets by running 'ant -projecthelp'">
		<java classname="org.apache.tools.ant.Main" fork="false">
			<arg value="-projecthelp" />
		</java>
	</target>

	<!-- =================================================================== -->
	<!-- Remove the user created directories and files                       -->
	<!-- =================================================================== -->

	<target name="clean" description="Removes all generated files, cleaning up">
		<delete dir="${build}" />
		<mkdir dir="${build}" />
		<mkdir dir="${build.cli.bin}" />
		<mkdir dir="${build.cli.classes}" />
		<mkdir dir="${build.cli.config}" />
		<mkdir dir="${build.cli.lib}" />
		<mkdir dir="${build.cli.schema}" />
		<mkdir dir="${build.cli.xsl}" />
		<mkdir dir="${build.config}" />
		<mkdir dir="${build.content}" />
		<mkdir dir="${build.webapps}" />
	</target>

	<!-- =================================================================== -->
	<!-- Resolve external jars                                               -->
	<!-- =================================================================== -->

	<condition property="pom.file.exists">
		<available file="${stage-one.config}/pom.xml" />
	</condition>

	<target name="copy.pom" unless="pom.file.exists">
		<copy file="${stage-one.config}/pom.xml.template" tofile="${stage-one.config}/pom.xml" />
	</target>

	<target name="resolve" description="resolve libraries" depends="clean, copy.pom">
		<echo level="info">Resolve jars with maven</echo>
		<exec executable="mvn">
			<arg value="-f${stage-one.config}/pom.xml" />
			<arg value="-Dbuild.directory=${build.cli}" />
			<arg value="dependency:copy-dependencies" />
		</exec>
	</target>

	<!-- =================================================================== -->
	<!-- Create all directories                                              -->
	<!-- =================================================================== -->

	<target name="create.directories" depends="init" description="Creates the neccessary data directory structure">
		<echo level="info">Create all directories</echo>
		<modulePreHook target="create.directories" />
		<mkdir dir="${MCR.datadir}" />
		<mkdir dir="${MCR.savedir}" />
    <mkdir dir="${MCR.EHCache.diskStore.path}" />
		<mkdir dir="${MCR.IFS.ContentStore.IFS2.URI}" />
    <mkdir dir="${MCR.Metadata.Store.BaseDir}" />
		<moduleHook target="create.directories" />
	</target>

	<!-- =================================================================== -->
	<!-- Compiles all application classes                                    -->
	<!-- =================================================================== -->

	<target name="create.jar" depends="compile" description="creates stage-one.jar">
		<echo level="info">Compiling java classes</echo>
		<modulePreHook target="create.jar" />
		<moduleHook target="create.jar" />
	</target>

	<target name="compile" depends="init" description="Compiles all sources under the build directory">
		<modulePreHook target="compile" />
		<moduleHook target="compile" />
	</target>

	<!-- =================================================================== -->
	<!-- Create scripts in cli/... like mycore.sh a.s.o.                     -->
	<!-- =================================================================== -->

	<target name="create.scripts" depends="init, config, create.scripts.unix" description="Create commandline scripts">
		<echo>Unpack shell scripts</echo>
		<fileset id="module.fileset" dir="${build.cli.lib}" includes="*.jar">
			<mcr:appModuleSelector />
		</fileset>
		<unjar dest="${build.cli}">
			<fileset refid="module.fileset" />
			<patternset>
				<include name="bin/*.sh" />
			</patternset>
		</unjar>
		<modulePreHook target="create.scripts" />
		<moduleHook target="create.scripts" />
		<chmod perm="755">
			<fileset dir="${build.cli.bin}" includes="*.sh" />
		</chmod>
	</target>

	<condition property="persistence.file.exists">
		<available file="${stage-one.config}/persistence.xml" />
	</condition>

	<target name="copy.persistence" unless="persistence.file.exists">
		<copy file="${stage-one.config}/persistence.xml.template" tofile="${stage-one.config}/persistence.xml" />
	</target>

	<condition property="log4j2.file.exists">
		<available file="${stage-one.config}/log4j2.xml" />
	</condition>

	<target name="copy.log4j2" unless="log4j2.file.exists">
		<copy file="${stage-one.config}/log4j2.xml.template" tofile="${stage-one.config}/log4j2.xml" />
	</target>

	<target name="config" depends="init, copy.persistence, copy.log4j2" description="generates mycore.properties file">
		<delete file="${build.cli.config}/mycore.properties" />
		<modulePreHook target="config" />
		<copy todir="${build.cli.config}" overwrite="true">
			<fileset dir="${stage-one.config}" includes="hosts.xml" />
			<fileset dir="${stage-one.config}" includes="log4j2.xml" />
		</copy>
		<mkdir dir="${build.cli.config}/META-INF" />
		<copy todir="${build.cli.config}/META-INF" overwrite="true">
			<fileset dir="${stage-one.config}" includes="persistence.xml" />
		</copy>
		<delete dir="${build.cli.config}/META-INF/resources" />
		<moduleHook target="config" />
		<mcr:config propertyfile="${build.cli.config}/mycore.properties" mergeFile="${stage-one.config}/mycore.private.properties" />
	</target>

	<target name="create.scripts.unix" if="os.is.unix">
		<modulePreHook target="create.scripts.unix" />
		<antcall target="create.scripts.unix.write">
			<param name="mycore.cmd.file" value="mycore.sh" />
			<param name="mycore.cmd.class" value="org.mycore.frontend.cli.MCRCommandLineInterface $*" />
			<param name="mycore.cmd.dir" value="${build}" />
		</antcall>
		<moduleHook target="create.scripts.unix" />
	</target>

	<target name="create.scripts.unix.write">
		<property name="tmp.cmd.file" value="${build.cli.bin}/${mycore.cmd.file}" />
		<echo>Creating ${mycore.cmd.file} to invoke ${mycore.cmd.class}</echo>
		<echo file="${tmp.cmd.file}" append="false">
			<![CDATA[#!/bin/sh

#
# This shell script invokes the MyCoRe class ${mycore.cmd.class}
#
# Generated by ant using the target "create.scripts".
#

CLASSPATH=${build.classpath.translated}
export CLASSPATH

$JAVA_HOME/bin/java -Xmx${java.maxmemory} -Xms${java.maxmemory} -DMCR.AppName=${app.name} -Djava.awt.headless=true $OPTION ${mycore.cmd.class}
        ]]>
		</echo>
		<chmod file="${tmp.cmd.file}" perm="755" />
	</target>

	<!-- =================================================================== -->
	<!-- Install Jetty                                                       -->
	<!-- =================================================================== -->

	<target name="create.jetty" if="os.is.unix">
		<antcall target="jetty.unix.write">
			<param name="cmd.file" value="jettystart.sh" />
			<param name="cmd.value" value="-Djetty.stop.port=${jetty.stop.port} -Djetty.port=${jetty.start.port} -q -f ${stage-one.config}/jetty-pom.xml jetty:run" />
		</antcall>
		<antcall target="jetty.unix.write">
			<param name="cmd.file" value="jettystop.sh" />
			<param name="cmd.value" value="-Djetty.stop.port=${jetty.stop.port} -q -f ${stage-one.config}/jetty-pom.xml jetty:stop" />
		</antcall>
		<copy todir="${build}" overwrite="true">
			<fileset dir="${stage-one.config}" includes="jetty-realm.properties" />
		</copy>

	</target>

	<target name="jetty.unix.write">
		<mkdir dir="${build.cli.bin}" />
		<echo level="info">Creating ${build.cli.bin}/${cmd.file} to invoke mvn ${cmd.value}</echo>
		<echo file="${build.cli.bin}/${cmd.file}" append="false">
			<![CDATA[#!/bin/sh

export INSTALL_HOME=$PHILAE_HOME
cd ${build}
mvn -DMCR.AppName=${app.name} ${cmd.value}
]]>
		</echo>
		<chmod perm="755" file="${build.cli.bin}/${cmd.file}" />
	</target>

	<!-- =================================================================== -->
	<!-- Load all classifications                                            -->
	<!-- =================================================================== -->

	<target name="create.class" depends="init" description="Load all classifications">
		<delete dir="${MCR.EHCache.diskStore.path}" />
		<mkdir dir="${MCR.EHCache.diskStore.path}" />
		<delete dir="${build.content}/classifications" />
		<mkdir dir="${build.content}/classifications" />
		<echo>Prepare classifications</echo>
		<fileset id="module.fileset" dir="${build.cli.lib}" includes="*.jar">
			<mcr:appModuleSelector />
		</fileset>
		<unjar dest="${build.content}">
			<fileset refid="module.fileset" />
			<patternset>
				<include name="classifications/**" />
			</patternset>
		</unjar>

		<modulePreHook target="create.class" />
		<moduleHook target="create.class" />

		<echo level="info"> run ${ant.project.name} load classifications from ${build.content}/classifications</echo>
		<property name="commands.file" value="${build}/commands.txt" />
		<delete file="${commands.file}" />
		<echo file="${commands.file}" append="false">
			<![CDATA[
      update all classifications from directory ${build.content}/classifications
      ]]>
		</echo>
		<antcall target="invoke.cli">
			<param name="cli.directory" value="${build}" />
			<param name="cli.command" value="process ${commands.file}" />
		</antcall>
		<delete file="${commands.file}" />
	</target>

	<!-- =================================================================== -->
	<!-- Load initialize user entries in the database                        -->
	<!-- =================================================================== -->

	<target name="create.users" depends="init" description="initialize user system">
		<modulePreHook target="create.users" />
		<property name="commands.file" value="${build}/commands.txt" />
		<echo file="${commands.file}" append="false"> init superuser </echo>
		<antcall target="invoke.cli">
			<param name="cli.directory" value="${stage-one.config}" />
			<param name="cli.command" value="process ${commands.file}" />
		</antcall>
		<delete file="${commands.file}" />
		<moduleHook target="create.users" />
	</target>

	<!-- =================================================================== -->
	<!-- Load default ACL rules                                              -->
	<!-- =================================================================== -->

	<target name="create.default-rules" depends="init" description="Load default ACL rules">
		<echo>Prepare default-rules</echo>
		<fileset id="module.fileset" dir="${build.cli.lib}" includes="*.jar">
			<mcr:appModuleSelector />
		</fileset>
		<unjar dest="${build}">
			<fileset refid="module.fileset" />
			<patternset>
				<include name="config/*/permissions*.xml" />
				<include name="config/*/grant*.xml" />
			</patternset>
		</unjar>
		<modulePreHook target="create.default-rules" />
		<moduleHook target="create.default-rules" />
	</target>

	<!-- =================================================================== -->
	<!-- Build the web application directory and copy webpages               -->
	<!-- =================================================================== -->

	<target name="create.webapp" depends="init, i18n" description="Build the complete web application">
		<echo level="info">Creating web application in directory ${build.webapps}</echo>
		<mkdir dir="${build.webapps}" />
		<mkdir dir="${build.webapps}/editor" />
		<mkdir dir="${build.webapps}/WEB-INF" />
		<mkdir dir="${build.webapps}/WEB-INF/classes" />
		<mkdir dir="${build.webapps}/WEB-INF/classes/xsl" />
		<mkdir dir="${build.webapps}/WEB-INF/lib" />
		<modulePreHook target="create.webapp" />
		<antcall target="create.webapp.base" />
		<moduleHook target="create.webapp" />
	</target>

	<target name="i18n">
		<delete file="${build.webapps}/WEB-INF/classes/messages_de.properties" />
		<delete file="${build.webapps}/WEB-INF/classes/messages_en.properties" />
		<delete file="${build.webapps}/WEB-INF/classes/messages_es.properties" />
		<delete file="${build.webapps}/WEB-INF/classes/messages_fr.properties" />
		<delete file="${build.webapps}/WEB-INF/classes/messages_it.properties" />
		<delete file="${build.webapps}/WEB-INF/classes/messages_ja.properties" />
		<modulePreHook target="i18n" />
		<moduleHook target="i18n" />
		<copy todir="${build.webapps}/WEB-INF/classes">
			<fileset dir="${build.cli.config}" includes="messages*.properties" />
		</copy>
	</target>

	<target name="create.webapp.base">
		<copy todir="${build.webapps}/WEB-INF/lib">
			<fileset dir="${build.cli.lib}" includes="*.jar" />
			<fileset dir="${build.cli.lib}" includes="*.zip" />
		</copy>
		<copy todir="${build.webapps}" overwrite="true">
			<fileset dir="${build.cli.config}" includes="FileContentTypes.xml" />
			<fileset dir="${build.cli.config}" includes="hosts.xml" />
			<fileset dir="${build.cli.config}" includes="log4j2.xml" />
		</copy>
		<copy todir="${build.webapps}/WEB-INF/classes">
			<fileset dir="${build.cli.classes}" includes="**/*" />
			<fileset dir="${build.cli.config}" includes="*.xml" />
			<fileset dir="${build.cli.config}" includes="META-INF/*.xml" />
			<fileset dir="${build.cli.config}" includes="mycore.properties" />
		</copy>
		<fileset id="module.fileset" dir="${build.cli.lib}" includes="*.jar">
			<mcr:appModuleSelector />
		</fileset>
		<unjar dest="${build.webapps}/WEB-INF/classes">
			<fileset refid="module.fileset" />
			<patternset>
				<include name="xsl/**" />
			</patternset>
		</unjar>
	</target>

</project>
<!-- ======================== End of file ======================== -->