<?xml version="1.0" encoding="UTF-8"?>
<project name="Unpack IU" default="unpack">
	<property name="framework.location" location="/shared/common/buckminster-3.6" />

	<fail message="unpack.iu property must be defined" unless="unpack.iu" />

	<target name="unpack">
		<antcall target="-call.operation">
			<param name="operation.name" value="unpack" />
		</antcall>
	</target>

	<target name="-unpack">
		<property name="repository.temp.dir" location="${java.io.tmpdir}" />

		<tempfile property="mirror.repository" destdir="${repository.temp.dir}" prefix="mirror-repository-" />

		<mkdir dir="${mirror.repository}" />

		<!-- create an empty artifacts repository and call the <p2.process.artifacts> task to fill in default properties/rules -->
		<echoxml file="${mirror.repository}/artifacts.xml">
			<repository name='' type='org.eclipse.equinox.p2.artifact.repository.simpleRepository' version='1' />
		</echoxml>
		<p2.process.artifacts repositoryPath="file:${mirror.repository}" />

		<!-- mirror the specified IU -->
		<p2.mirror>
			<repository location="file:${mirror.repository}" append="false" compressed="false" />
			<source>
				<repository location="${user.dir}" />
			</source>
			<iu id="${unpack.iu}" />
			<slicingoptions followOnlyFilteredRequirements="true" />
		</p2.mirror>

		<!-- unpack the IU (if needed) -->
		<apply executable="${java.home}/bin/unpack200" dest="${mirror.repository}" skipemptyfilesets="true" force="true" inputstring="">
			<arg value="--remove-pack-file" />
			<srcfile />
			<targetfile />
			<fileset dir="${mirror.repository}">
				<filename name="**/*.pack.gz" />
			</fileset>
			<mapper type="glob" from="*.pack.gz" to="*" />
		</apply>

		<!-- delete the artifacts metadata -->
		<delete dir="${mirror.repository}">
			<filename name="artifacts.xml" />
		</delete>

		<tempfile property="unpacked.repository" destdir="${repository.temp.dir}" prefix="unpacked-repository-" />

		<!-- create new artifacts metadata -->
		<p2.publish.featuresAndBundles repository="file:${unpacked.repository}" source="${mirror.repository}" append="false" compress="false">
			<contextRepository location="file:${mirror.repository}" metadata="true" artifact="false" />
		</p2.publish.featuresAndBundles>

		<delete dir="${mirror.repository}" includeemptydirs="true">
			<or>
				<type type="dir" />
				<type type="file" />
			</or>
		</delete>

		<!-- remove the original IU from the original repository -->
		<p2.remove.iu>
			<repository location="${user.dir}" />
			<iu id="${unpack.iu}" />
		</p2.remove.iu>

		<!-- mirror the unpacked IU back to the original repository -->
		<p2.mirror>
			<repository location="${user.dir}" append="true" />
			<source>
				<repository location="file:${unpacked.repository}" />
			</source>
			<iu id="${unpack.iu}" />
		</p2.mirror>

		<delete dir="${unpacked.repository}" includeemptydirs="true">
			<or>
				<type type="dir" />
				<type type="file" />
			</or>
		</delete>
	</target>

	<target name="-call.operation">
		<condition property="call.operation.target" value="-${operation.name}" else="-call.operation.indirectly">
			<isset property="eclipse.running" />
		</condition>
		<antcall target="${call.operation.target}" />
	</target>

	<target name="-call.operation.indirectly" depends="-locate.framework.launcher">
		<tempfile property="temporary.workspace" destdir="${java.io.tmpdir}" prefix="temporary-workspace-" />
		<java jvm="${java.home}/bin/java" jar="${framework.launcher}" fork="true" dir="${user.dir}" failonerror="true">
			<syspropertyset>
				<propertyref builtin="commandline" />
			</syspropertyset>
			<arg value="-data" />
			<arg value="${temporary.workspace}" />
			<arg value="-application" />
			<arg value="org.eclipse.ant.core.antRunner" />
			<arg value="-buildfile" />
			<arg value="${ant.file}" />
			<arg value="${operation.name}" />
		</java>

		<!--
			somewhat more complicated than a simple <delete dir="${temporary.workspace}" />
			but this way it does not produce the "Deleting directory" message
		-->
		<delete dir="${temporary.workspace}" includeemptydirs="true">
			<or>
				<type type="dir" />
				<type type="file" />
			</or>
		</delete>
	</target>

	<target name="-locate.framework.launcher" unless="framework.launcher">
		<pathconvert property="framework.launcher">
			<first count="1">
				<sort>
					<fileset dir="${framework.location}/plugins">
						<filename name="org.eclipse.equinox.launcher_*.jar" />
					</fileset>
					<reverse xmlns="antlib:org.apache.tools.ant.types.resources.comparators">
						<date />
					</reverse>
				</sort>
			</first>
		</pathconvert>
	</target>
</project>
