<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You 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

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

<project name="alfresco-webscript" default="all">

    <property environment="env"/>
    <condition property="mcf-dist" value="${env.MCFDISTPATH}">
        <isset property="env.MCFDISTPATH"/>
    </condition>
    <property name="abs-dist" location="../../dist"/>
    <condition property="mcf-dist" value="${abs-dist}">
        <not>
            <isset property="env.MCFDISTPATH"/>
        </not>
    </condition>

    <import file="${mcf-dist}/connector-build.xml"/>

    <property name="alfresco-indexer.version" value="0.8.1"/>

    <path id="connector-classpath">
        <path refid="mcf-connector-build.connector-classpath"/>
        <fileset dir="../../lib">
            <include name="alfresco-indexer-client*.jar"/>
        </fileset>
    </path>

    <path id="connector-test-classpath">
        <path refid="mcf-connector-build.connector-test-classpath"/>
        <fileset dir="../../lib">
            <include name="chemistry*.jar"/>
            <include name="stax*.jar"/>
            <include name="streambuffer*.jar"/>
            <include name="jaxb*.jar"/>
            <include name="jaxws*.jar"/>
            <include name="woodstox-core-asl*.jar"/>
            <include name="mimepull*.jar"/>
            <include name="resolver*.jar"/>
            <include name="org.osgi.core*.jar"/>
            <!-- include name="commons-lang*.jar"/ -->
            <include name="joda*.jar"/>
        </fileset>
    </path>

    <target name="lib" depends="mcf-connector-build.lib,precompile-check" if="canBuild">
        <mkdir dir="dist/lib"/>
        <copy todir="dist/lib">
            <fileset dir="../../lib">
                <include name="alfresco-indexer-client*.jar"/>
            </fileset>
        </copy>
    </target>

    <target name="download-via-alfresco-indexer">
        <get src="https://repo1.maven.org/maven2/${project-path}/${artifact-name}/${artifact-version}/${artifact-name}-${artifact-version}.${artifact-type}" dest="${target}/${artifact-name}-${artifact-version}.${artifact-type}"/>
    </target>

    <target name="download-dependencies">
        <property name="alfresco-package" value="com/github/maoo/indexer"/>
        <antcall target="download-via-maven">
            <param name="project-path" value="${alfresco-package}"/>
            <param name="artifact-version" value="${alfresco-indexer.version}"/>
            <param name="target" value="test-materials-proprietary"/>
            <param name="artifact-name" value="alfresco-indexer-webscripts-war"/>
            <param name="artifact-type" value="war"/>
        </antcall>
    </target>

    <target name="integration">
        <mkdir dir="dist/integration/alfresco-webscript"/>
        <copy todir="dist/integration/alfresco-webscript">
          <fileset dir="../../lib/alfresco-webscript"/>
        </copy>
    </target>

    <target name="download-cleanup">
        <delete>
            <fileset dir="test-materials-proprietary" excludes="README*.txt"/>
        </delete>
    </target>

    <target name="calculate-testcode-condition">
        <available file="test-materials-proprietary/alfresco-indexer-webscripts-war-${alfresco-indexer.version}.war" property="alfrescoTestcodeStatus"/>
        <condition property="tests-present">
            <isset property="alfrescoTestcodeStatus"/>
        </condition>
    </target>

    <target name="pretest-warn" depends="calculate-testcode-condition" unless="tests-present">
        <echo message="Alfresco Connector integration tests cannot be be performed without alfresco.war"/>
    </target>

    <target name="deliver-connector" depends="mcf-connector-build.deliver-connector">
        <antcall target="general-add-repository-connector">
            <param name="connector-label" value="Alfresco Webscript"/>
            <param name="connector-class" value="org.apache.manifoldcf.crawler.connectors.alfrescowebscript.AlfrescoConnector"/>
        </antcall>
        <antcall target="general-add-authority-connector">
            <param name="connector-label" value="Alfresco Webscript"/>
            <param name="connector-class" value="org.apache.manifoldcf.authorities.authorities.alfrescowebscript.AlfrescoAuthorityConnector"/>
        </antcall>
    </target>

    <target name="run-IT-HSQLDB" depends="compile-tests,pretest-check" if="canTest">
        <mkdir dir="test-HSQLDB-output"/>
        <junit fork="true" maxmemory="1024m" dir="test-HSQLDB-output" outputtoformatters="true" showoutput="true" haltonfailure="true">
            <jvmarg value="-DcrawlerWarPath=${mcf-dist}/web/war/mcf-crawler-ui.war"/>
            <jvmarg value="-DauthorityserviceWarPath=${mcf-dist}/web/war/mcf-authority-service.war"/>
            <jvmarg value="-DapiWarPath=${mcf-dist}/web/war/mcf-api-service.war"/>
            <jvmarg value="-DcombinedWarPath=${mcf-dist}/web/war/mcf-combined-service.war"/>
            <jvmarg value="-DalfrescoServerWarPath=../test-materials-proprietary/alfresco-indexer-webscripts-war-${alfresco-indexer.version}.war"/>
            <jvmarg value="-Xms512m"/>
            <jvmarg value="-Xmx1024m"/>
            <jvmarg value="-Xss1024k"/>
            <jvmarg value="-XX:MaxPermSize=256m"/>
            <jvmarg value="-XX:NewSize=256m"/>
            <classpath>
                <fileset dir="${env.JAVA_HOME}/lib">
                    <include name="tools.jar"/>
                </fileset>
                <path refid="connector-test-classpath"/>
                <pathelement location="build/connector-tests/classes"/>
            </classpath>
            <formatter type="brief" usefile="false"/>
            <batchtest todir="test-HSQLDB-output">
                <fileset dir="build/connector-tests/classes">
                    <include name="**/*HSQLDBIT.class"/>
                </fileset>
            </batchtest>
        </junit>
    </target>

</project>
