<!--
   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="Shared build targets">
	<!-- the following properties must be set from the calling script 
    <property name="eclipse.installation.dir" value="${buildDirectory}"/>
    <property name="eclipse.local.tar.non.server" value="${test.eclipse.zip}"/>
    eclipse.download.cache,pluginbuilder.eclipse.url
    optional:
    <property name="pluginbuilder.additional.feature.urls" value="featureurl1,featureurl2"/>
    -->
    
	<taskdef resource="net/sf/antcontrib/antcontrib.properties" classpath="${buildHome}/build-files/ant-contrib.jar" />
	
	<target name="unpack.eclipse">
		<condition property="unpack.eclipse">
			<not>
				<available type="dir" file="${eclipse.installation.dir}"/>
			</not>
		</condition>
		<antcall target="-unpack.eclipse.ifnecessary"/>
	</target>    
    
	<!-- call either with or feature.url or pluginbuilder.eclipse.url
		 sets property archive.location to the archive path in download cache.
	 -->
	<target name="-set.archive.location" if="pluginbuilder.is.server">
		<!-- set default, useful for server where pluginbuilder.eclipse.url.default can be specified in build_local.properties --> 
		<property name="pluginbuilder.eclipse.url" value="${pluginbuilder.eclipse.url.default}"/>
		<condition property="archive.url" value="${feature.url}" else="${pluginbuilder.eclipse.url}">
				<isset property="feature.url"/>
		</condition>
		<mkdir dir="${eclipse.download.cache}"/>
		<tempfile destdir="${eclipse.download.cache}" property="tmp.file" suffix=".txt" prefix="downloadurl"/>		
		<echo file="${tmp.file}" message="${archive.url}"/>
		<checksum file="${tmp.file}" property="pluginbuilder.eclipse.url.checksum"/>
		<delete file="${tmp.file}"/>
		<property name="archive.location" value="${eclipse.download.cache}/${pluginbuilder.eclipse.url.checksum}"/>
		<!-- <echo message="${archive.location} is archive location for ${archive.url}"/> -->
	</target>
	
	<target name="-set.eclipse.local.tar.server" if="pluginbuilder.is.server" depends="-set.archive.location">
		<property name="eclipse.local.tar" value="${archive.location}"/>
	</target>
	
	<target name="-set.eclipse.local.tar.non.server" unless="pluginbuilder.is.server">
		<property name="eclipse.local.tar" value="${eclipse.local.tar.non.server}"/>
	</target>
	
	<target name="-get.archive.ifnecessary" unless="eclipse.is.downloaded">
		<condition property="archive.url" value="${feature.url}" else="${pluginbuilder.eclipse.url}">
				<isset property="feature.url"/>
		</condition>
		<get src="${archive.url}" dest="${archive.location}" />		
	</target>
	
	<target name="-get.archive" depends="-set.archive.location" if="pluginbuilder.is.server">
		<condition property="eclipse.is.downloaded">
			<available file="${archive.location}" property="${eclipse.is.downloaded}"/>
		</condition>		
		<antcall target="-get.archive.ifnecessary"/> 
	</target>
	
	<target name="-get.features" if="pluginbuilder.is.server" >
		<property name="pluginbuilder.feature.urls" value="${pluginbuilder.feature.urls.default}"/>
		<foreach list="${pluginbuilder.feature.urls}" param="feature.url" delimiter="," target="-get.archive" inheritall="true"/>
	</target>
	
	<target name="-unpack.features" if="pluginbuilder.is.server">
		<property name="pluginbuilder.feature.urls" value="${pluginbuilder.feature.urls.default}"/>
		<foreach list="${pluginbuilder.feature.urls}" param="feature.url" delimiter="," target="-unpack.feature" inheritall="true"/>
	</target>
	
	<target name="-unpack.feature" depends="-set.archive.location">
		<property name="tempunziplocation" value="${buildDirectory}/tmpunzip"/>
		<delete dir="${tempunziplocation}" failonerror="false"/>
		<mkdir dir="${tempunziplocation}"/>
		<unzip src="${archive.location}" overwrite="true" dest="${tempunziplocation}"/>
		<condition property="moveroot" value="${tempunziplocation}/eclipse" else="${tempunziplocation}">
				<available file="${tempunziplocation}/eclipse" type="dir"/>
		</condition>
		<move todir="${eclipse.installation.dir}" includeemptydirs="true">
			<fileset dir="${moveroot}" includes="**"/>
		</move>
	</target>
			
	<target name="-unpack.eclipse.ifnecessary" if="unpack.eclipse">
		<antcall target="-get.archive"/>
		<condition property="is.windows">
		  <os family="windows"/>
		</condition>
		<antcall target="-unpack.eclipse.windows"/>
		<antcall target="-unpack.eclipse.linux"/>
		<antcall target="-get.features"/>
		<antcall target="-unpack.features"/>
	</target>
	
	<target name="-unpack.eclipse.windows" if="is.windows" depends="-set.eclipse.local.tar.server,-set.eclipse.local.tar.non.server">
		<unzip src="${eclipse.local.tar}" overwrite="true" dest="${eclipse.installation.dir}/.."/>		
	</target>
	
	<target name="-unpack.eclipse.linux" unless="is.windows" depends="-set.eclipse.local.tar.server,-set.eclipse.local.tar.non.server">
		<untar src="${eclipse.local.tar}" overwrite="true" dest="${eclipse.installation.dir}/.." compression="gzip"/>		
	</target>
	
	<target name="test">
		<property name="buildDirectory" value="C:/Temp/tst"/>
		<mkdir dir="${buildDirectory}"/>
		<property name="eclipse.download.cache" value="C:/Temp/downloadcache"/>
		<property name="pluginbuilder.is.server" value="true"/>
		<property name="pluginbuilder.eclipse.url" value="http://mirror.yoxos-eclipse-distribution.de/eclipse.org/eclipse/downloads/drops/R-3.2.2-200702121330/eclipse-PDE-3.2.2.zip"/>
		
		<property name="eclipse.installation.dir" value="C:/Temp/eclipse_root/eclipse"/>
		<delete dir="${eclipse.installation.dir}" failonerror="false"/>
		<property name="pluginbuilder.feature.urls" value="http://self.pluginbuilder.org/0.2.0/org.pluginbuilder.feature-0.2.0.20070218PRD.zip,http://mirror.yoxos-eclipse-distribution.de/eclipse.org/eclipse/downloads/drops/R-3.2.2-200702121330/eclipse-examples-3.2.2.zip"/>
		<antcall target="unpack.eclipse"/>
	</target>
	
</project>