<!--
 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="mcf-sharepoint-2010-plugin" default="help">

    <target name="clean">
        <delete>
	<fileset dir="." includes="apache-manifoldcf-sharepoint-2010-plugin-*"/>
        </delete>
        <delete file="webservice/Web References/SPPermissionsService/Permissions.wsdl"/>
        <delete file="webservice/Package/*.wsp"/>
        <delete file="webservice/setup.inf"/>
        <delete file="webservice/setup.rpt"/>
        <delete dir="webservice/obj"/>
        <delete dir="webservice/bin"/>
        <delete dir="dist"/>
    </target>

    
    <target name="calculate-condition">
        <available file="wsdls/Permissions.wsdl" property="PermissionsStatus"/>
        <condition property="canBuild">
            <and>
                <isset property="PermissionsStatus"/>
            </and>
        </condition>
    </target>
    
    <target name="precompile-check" depends="calculate-condition" unless="canBuild">
        <echo message="Apache SharePoint 2010 ManifoldCF Plugin cannot be built without Permissions.wsdl"/>
    </target>

    <target name="compile" depends="precompile-check" if="canBuild">
        <copy todir="webservice/Web References/SPPermissionsService" file="wsdls/Permissions.wsdl"/>
        <exec executable="cmd" dir="webservice" failonerror="true" failifexecutionfails="true">
            <arg value="/c"/>
            <arg value="build.bat"/>
        </exec>
    </target>

    <target name="deliver" depends="compile" if="canBuild">
        <mkdir dir="dist"/>
        <copy todir="dist">
            <fileset dir="webservice/Package">
                <include name="*.wsp"/>
                <include name="*.bat"/>
                <include name="*.txt"/>
            </fileset>
        </copy>
    </target>

    <target name="build" depends="deliver" if="canBuild"/>
    
    <target name="set-version">
        <property name="release-version" value="0.2-dev"/>
    </target>
      
    <target name="create-source-zip" depends="set-version">
      <zip destfile="apache-manifoldcf-sharepoint-2010-plugin-${release-version}-src.zip" update="false">
        <zipfileset dir="." prefix="apache-manifoldcf-sharepoint-2010-plugin-${release-version}">
          <exclude name="/wsdls/Permissions.wsdl"/>
          <exclude name="/webservice/Web References/SPPermissionsService/Permissions.wsdl"/>
          <exclude name="/webservice/Package/*.wsp"/>
          <exclude name="/dist/"/>
          <exclude name="/apache-manifoldcf-sharepoint-2010-plugin-*"/>
        </zipfileset>
      </zip>
    </target>
      
    <target name="create-source-tar" depends="set-version">
      <tar destfile="apache-manifoldcf-sharepoint-2010-plugin-${release-version}-src.tar.gz" compression="gzip" longfile="gnu">
        <tarfileset dir="." prefix="apache-manifoldcf-sharepoint-2010-plugin-${release-version}">
          <exclude name="/wsdls/Permissions.wsdl"/>
          <exclude name="/webservice/Web References/SPPermissionsService/Permissions.wsdl"/>
          <exclude name="/webservice/Package/*.wsp"/>
          <exclude name="/dist/"/>
          <exclude name="/apache-manifoldcf-sharepoint-2010-plugin-*"/>
        </tarfileset>
      </tar>
    </target>

    <target name="create-bin-zip" depends="build,set-version">
      <zip destfile="apache-manifoldcf-sharepoint-2010-plugin-${release-version}-bin.zip" update="false">
        <zipfileset dir="." prefix="apache-manifoldcf-sharepoint-2010-plugin-${release-version}">
          <exclude name="/wsdls/"/>
          <exclude name="/webservice/"/>
          <exclude name="apache-manifoldcf-sharepoint-2010-plugin-*"/>
          <exclude name="build.xml"/>
        </zipfileset>
      </zip>
    </target>
      
    <target name="create-bin-tar" depends="build,set-version">
      <tar destfile="apache-manifoldcf-sharepoint-2010-plugin-${release-version}-bin.tar.gz" compression="gzip" longfile="gnu">
        <tarfileset dir="." prefix="apache-manifoldcf-sharepoint-2010-plugin-${release-version}">
          <exclude name="/wsdls/"/>
          <exclude name="/webservice/"/>
          <exclude name="apache-manifoldcf-sharepoint-2010-plugin-*"/>
          <exclude name="build.xml"/>
        </tarfileset>
      </tar>
    </target>

    <target name="image" depends="create-source-zip,create-source-tar,create-bin-zip,create-bin-tar"/>

    <target name="help">
        <echo level="info">
Apache ManifoldCF SharePoint 2010 Plugin build file.  Use this
file to build the plugin distributables.

Useful targets are:

clean   - Clean the build area
build   - Build package under the 'dist' directory
image   - Package the sources

Prerequisites: This build requires Windows, with .NET 1.0
and .NET 3.0 to be installed, and Microsoft.SharePoint.dll to
be installed in the appropriate assembly directory.
        </echo>
    </target>
  
    <target name="-taskdef">
      <typedef resource="org/apache/rat/anttasks/antlib.xml" uri="antlib:rat.anttasks">
        <classpath>
          <fileset dir="." includes="rat*.jar"/>
        </classpath>
      </typedef>
    </target>
    <target name="rat-sources" depends="-taskdef"
      description="runs the tasks over src/java excluding the license directory">
      <rat:report xmlns:rat="antlib:org.apache.rat.anttasks">
        <fileset dir="webservice/">
          <exclude name="Web References/SPPermissionsService/Permissions.wsdl"/>
          <exclude name="MCPermissionsService.csproj"/>
          <exclude name="MetaCarta.snk"/>
          <exclude name="Properties/AssemblyInfo.cs"/>
          <exclude name="Properties/Settings.Designer.cs"/>
          <exclude name="Properties/Settings.settings"/>
          <exclude name="Web References/SPPermissionsService/Reference.cs"/>
          <exclude name="Web References/SPPermissionsService/Reference.map"/>
          <exclude name="obj/**/*"/>
          <exclude name="bin/*"/>
          <exclude name="setup.inf"/>
          <exclude name="setup.rpt"/>
        </fileset>
      </rat:report>
    </target>

</project>
