<!--

    Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.

    This program and the accompanying materials are made available under the
    terms of the Eclipse Public License v. 2.0, which is available at
    http://www.eclipse.org/legal/epl-2.0.

    This Source Code may also be made available under the following Secondary
    Licenses when the conditions for such availability set forth in the
    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
    version 2 with the GNU Classpath Exception, which is available at
    https://www.gnu.org/software/classpath/license.html.

    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0

-->

<!--
   This file should be included by all autodeployment build.xml files and
   defines properties and tasks used by multiple auto-deploy tests.
-->

    <property name="dateFormat" value="yyyy-MM-dd-HH:mm:ss"/>
    <property name="autodeploy.dir" value="${env.S1AS_HOME}/domains/domain1/autodeploy"/>
    <property name="autodeploy.util.build" value="${testsRoot}/build/autodeploy/util"/>

    <path id="autodeploy.compile.classpath">
        <pathelement location="${inst}/lib/javaee.jar"/>
        <pathelement location="${java.home}/lib/tools.jar"/>
        <pathelement location="${env.S1AS_HOME}/modules/deployment-autodeploy.jar"/>
        <pathelement location="${autodeploy.util.build}"/>
    </path>

    <!--
        This target runs a Java class that watches the app server's autodeploy directory and detects
        when the app server has deployed or undeployed the app (or has reported a failure to do so) by observing
        when the marker files appear in the directory.

        The target records its results in a temporary properties file in the ${build} directory.
        This provides a simple way (relatively simple, at least) to use the same target more than once
        and store different result values in a way that can be retrieved and used from the main
        target.  (This basically works around the behavior of ant in which a called target's property
        settings are NOT propagated out to the calling target.  It also avoids the practice of creating
        a set of marker files that, by their presence or absence, convey success or failure of a substep.)
    -->
    <target name="runAutoDeployMonitor">
        <javaWithResult
                fork="true"
                failonerror="false"
                jvm="${JAVA}"
                classname="autodeploy.test.AutoDeployMonitor"
                resultproperty="autodeployResult"
                output="${build}/${log.id}.output.log"
            >
            <jvmarg value="-Dmonitor.debug=true"/>

            <classpath refid="autodeploy.compile.classpath"/>
<!--
            <classpath>
                <path location="${inst}/lib/j2ee.jar"/>
                <path location="${build}"/>
            </classpath>
-->
            <arg line="${arg.list}"/>
        </javaWithResult>

        <!--
            The result property name used in the next task is an argument to the called target.
            Note that the echo is a little oddly formatted.  The </echo> is on a line by itself and left-justified so
            that the output to the file being written will reside on a line by itself.  The
            left-justification is not really needed but the properties file looks a bit nicer
            if you open it in an editor.  This is because the next line in the properties file being
            written is indented as far as the </echo> is indented here in the build.xml file.
        -->
        <echo file="${result.property.file}" append="true">${resultPropertyName}=${autodeployResult}
</echo>

    </target>

    <target name="deploy.autodeploy">

    <!--
        To monitor auto-deployment or auto-undeployment, we start by getting the current time.
        Then we copy the archive file into the autodeploy directory (for auto-deploy) or delete
        it (for auto-undeploy).  All marker files created by the server during auto-deployment of
        the newly-copied archive file will have later timestamps than the timestamp just created.
        There could be earlier marker files for the same archive in the directory and the monitor
        wants to ignore those, which is why we get the current time and pass it to the monitor.

        The monitor will check for marker files for the copied archive file
        and whose last modification time are after the current timestamp, returning 0 if the
        auto-deployer creates a _deployed or _undeployed file, 1 if it creates a _deploy_failed
        or _undeploy_failed file, and -1 if it recognized no marker file.
    -->
        <tstamp prefix="deploy">
            <format property="NOW" pattern="${dateFormat}"/>
        </tstamp>

        <!-- Pause; some file systems record file rev date/time to 2-second precision -->
        <sleep seconds="2"/>

        <!--
            Trigger the auto-deploy.
        -->
        <copy file="${archive.file}" todir="${autodeploy.dir}" overwrite="true"/>

        <condition property="log.id" value="1">
            <not>
                <isset property="log.id"/>
            </not>
        </condition>
        <!--
            Use the monitor to detect when the auto-deploy has completed.
        -->
        <echo>Waiting for autodeployment to complete...</echo>
        <antcall target="runAutoDeployMonitor">
            <param name="arg.list" value="${archive.name} ${autodeploy.dir} ${dateFormat} ${deploy.NOW}"/>
            <param name="resultPropertyName" value="${deployResultPropertyName}"/>
            <param name="log.id" value="${log.id}"/>
        </antcall>
    </target>

    <target name="deploy.autoundeploy">

        <!--
            This target works very much like the deploy.autodeploy target except that instead of
            copying the archive into the autodeploy directory it deletes the previously copied
            archive from that directory.
        -->
        <tstamp prefix="undeploy">
            <format property="NOW" pattern="${dateFormat}"/>
        </tstamp>

        <!-- Pause; some file systems record file rev date/time to 2-second resolution -->
        <sleep seconds="2"/>

        <!--
            Trigger auto-undeploy by deleting the file.
        -->
        <delete quiet="true">
            <fileset dir="${autodeploy.dir}" includes="${archive.name}"/>
        </delete>

        <condition property="log.id" value="2">
            <not>
                <isset property="log.id"/>
            </not>
        </condition>

        <echo>Waiting for autoundeployment to complete...</echo>
        <antcall target="runAutoDeployMonitor">
            <param name="arg.list" value="${archive.name} ${autodeploy.dir} ${dateFormat} ${undeploy.NOW}"/>
            <param name="resultPropertyName" value="${undeployResultPropertyName}"/>
            <param name="log.id" value="${log.id}"/>
        </antcall>
    </target>

