Index: /main/branches/stable_gs3/release-kits/bin/cdrk2
===================================================================
--- /main/branches/stable_gs3/release-kits/bin/cdrk2	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/bin/cdrk2	(revision 21851)
@@ -0,0 +1,1 @@
+link rk
Index: /main/branches/stable_gs3/release-kits/bin/cdrk2.bat
===================================================================
--- /main/branches/stable_gs3/release-kits/bin/cdrk2.bat	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/bin/cdrk2.bat	(revision 21851)
@@ -0,0 +1,3 @@
+@echo off
+set RK_NAME=%0
+%~dp0\rk.bat %*
Index: /main/branches/stable_gs3/release-kits/bin/derk
===================================================================
--- /main/branches/stable_gs3/release-kits/bin/derk	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/bin/derk	(revision 21851)
@@ -0,0 +1,1 @@
+link rk
Index: /main/branches/stable_gs3/release-kits/bin/derk.bat
===================================================================
--- /main/branches/stable_gs3/release-kits/bin/derk.bat	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/bin/derk.bat	(revision 21851)
@@ -0,0 +1,3 @@
+@echo off
+set RK_NAME=%0
+%~dp0\rk.bat %*
Index: /main/branches/stable_gs3/release-kits/bin/rk
===================================================================
--- /main/branches/stable_gs3/release-kits/bin/rk	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/bin/rk	(revision 21851)
@@ -0,0 +1,71 @@
+#!/bin/bash
+
+function show_title() {
+	echo "RK_HOME: $RK_HOME"
+	echo "O---------------------------------------------O"
+	echo 
+	echo "   $rk_name ";
+	echo "   $rk_fullname ";
+	echo 
+	echo "O---------------------------------------------O"
+
+}
+
+function show_help {
+	echo "usage: {rk2|rk3|sork2|sork2|cdrk2|derk} [-help|-cmd] [ANT_ARGS]"
+	echo "	-help       show this help screen"
+	echo "	-cmd        show the ant command being used by the releas kit"
+	echo "	ANT_ARGS    additional arguments to be passed to ant"
+}
+
+#determine requested release kit
+rk_name="$(basename $0)"
+export RK_HOME="$(cd "$(dirname "$0")/.." && pwd)"
+
+if [ "$rk_name" == "rk2" ]; then
+	rk_fullname="Release Kit for Greenstone2"
+elif [ "$rk_name" == "rk3" ]; then
+        rk_fullname="Release Kit for Greenstone3"
+elif [ "$rk_name" == "sork2" ]; then
+        rk_fullname="Source Code Release Kit for Greenstone2"
+elif [ "$rk_name" == "sork3" ]; then
+        rk_fullname="Source Code Release Kit for Greenstone3"
+elif [ "$rk_name" == "cdrk2" ]; then
+        rk_fullname="CD-ROM Release Kit for Greenstone2"
+elif [ "$rk_name" == "derk" ]; then
+        rk_fullname="Documented Examples Release Kit"
+else
+	show_help
+	exit
+fi
+
+#make sure ant has enough memory
+export ANT_OPTS=-Xmx800M
+
+#create the command
+toexec="ant -lib \"`pwd`/installer/classes\" -f \"$RK_HOME/kits/$rk_name/ant-scripts/build.xml\" \"-Dbasedir=`pwd`\" \"-Drk.home=$RK_HOME\" \"-Drk.name=$rk_name\""
+
+#pass on the arguments
+while [ "$1" != "" ]; do
+
+	if [ "$1" == "-help" ]; then
+		show_help
+		exit
+	elif [ "$1" == "-cmd" ]; then
+		show_cmd=true
+	else
+		toexec="$toexec \"$1\""
+	fi
+	shift
+
+done
+
+#show the command to be executed
+if [ "$show_cmd" == "true" ]; then
+	echo $toexec
+#execute
+else
+	show_title | tee ${rk_name}.out
+	$toexec 2>&1 | tee -a ${rk_name}.out
+fi
+
Index: /main/branches/stable_gs3/release-kits/bin/rk.bat
===================================================================
--- /main/branches/stable_gs3/release-kits/bin/rk.bat	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/bin/rk.bat	(revision 21851)
@@ -0,0 +1,12 @@
+@echo off
+set RELEASE_DIR=%CD%
+echo RELEASE_DIR:%RELEASE_DIR%
+pushd "%CD%"
+CD /D "%~dp0\.."
+
+@echo on
+cmd.exe /c ant -f "%CD%\kits\%RK_NAME%\ant-scripts\build.xml" "-Drk.home=%CD%" "-Drk.name=%RK_NAME%" "-Dbasedir=%RELEASE_DIR%" -lib "%RELEASE_DIR%/installer/classes" %* | "%CD%\shared\windows\utils\tee.exe" "%RELEASE_DIR%\%RK_NAME%.out"
+
+:end
+
+popd
Index: /main/branches/stable_gs3/release-kits/bin/rk2
===================================================================
--- /main/branches/stable_gs3/release-kits/bin/rk2	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/bin/rk2	(revision 21851)
@@ -0,0 +1,1 @@
+link rk
Index: /main/branches/stable_gs3/release-kits/bin/rk2.bat
===================================================================
--- /main/branches/stable_gs3/release-kits/bin/rk2.bat	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/bin/rk2.bat	(revision 21851)
@@ -0,0 +1,3 @@
+@echo off
+set RK_NAME=%0
+%~dp0\rk.bat %*
Index: /main/branches/stable_gs3/release-kits/bin/rk3
===================================================================
--- /main/branches/stable_gs3/release-kits/bin/rk3	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/bin/rk3	(revision 21851)
@@ -0,0 +1,1 @@
+link rk
Index: /main/branches/stable_gs3/release-kits/bin/rk3.bat
===================================================================
--- /main/branches/stable_gs3/release-kits/bin/rk3.bat	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/bin/rk3.bat	(revision 21851)
@@ -0,0 +1,3 @@
+@echo off
+set RK_NAME=%0
+%~dp0\rk.bat %*
Index: /main/branches/stable_gs3/release-kits/bin/sork2
===================================================================
--- /main/branches/stable_gs3/release-kits/bin/sork2	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/bin/sork2	(revision 21851)
@@ -0,0 +1,1 @@
+link rk
Index: /main/branches/stable_gs3/release-kits/bin/sork2.bat
===================================================================
--- /main/branches/stable_gs3/release-kits/bin/sork2.bat	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/bin/sork2.bat	(revision 21851)
@@ -0,0 +1,3 @@
+@echo off
+set RK_NAME=%0
+%~dp0\rk.bat %*
Index: /main/branches/stable_gs3/release-kits/bin/sork3
===================================================================
--- /main/branches/stable_gs3/release-kits/bin/sork3	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/bin/sork3	(revision 21851)
@@ -0,0 +1,1 @@
+link rk
Index: /main/branches/stable_gs3/release-kits/bin/sork3.bat
===================================================================
--- /main/branches/stable_gs3/release-kits/bin/sork3.bat	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/bin/sork3.bat	(revision 21851)
@@ -0,0 +1,3 @@
+@echo off
+set RK_NAME=%0
+%~dp0\rk.bat %*
Index: /main/branches/stable_gs3/release-kits/build.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/build.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/build.xml	(revision 21851)
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<project name="rk-compilation" default="compile">
+
+	<target name="compile">
+		<ant dir="shared/core/ant-tasks/greenstone" inheritAll="false">
+			<property name="crypt.jar" value="${basedir}/shared/core/lib/crypt.jar"/>
+		</ant>
+		<ant dir="shared/core/ant-installer" inheritAll="false">
+			<property name="antlib" value="${ant.home}/lib"/>
+		</ant>
+	</target>
+	<target name="clean">
+		<ant dir="shared/core/ant-tasks/greenstone" inheritAll="false" target="clean">
+			<property name="crypt.jar" value="${basedir}/shared/core/lib/crypt.jar"/>
+		</ant>
+		<ant dir="shared/core/ant-installer" inheritAll="false" target="clean">
+			<property name="antlib" value="${ant.home}/lib"/>
+		</ant>
+	</target>
+
+</project>
+
Index: /main/branches/stable_gs3/release-kits/kits/cdrk2/ant-scripts/build.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/kits/cdrk2/ant-scripts/build.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/kits/cdrk2/ant-scripts/build.xml	(revision 21851)
@@ -0,0 +1,228 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+		.......................................................... 
+		March 2009
+		CD Release Kit for Greenstone2 (cdrk2)
+		Oran Fry
+		..........................................................
+-->
+
+<project name="cdrk2-build" default="cdrk2">
+
+	<!-- IMPORT OTHER ANT SCRIPTS -->
+	<import file="${rk.home}/shared/core/ant-scripts/shared.xml"/>
+	<import file="${rk.home}/shared/greenstone2/ant-scripts/greenstone2-shared.xml"/>
+
+	<!-- figure out where the compiled software is coming from -->
+	<property name="software.archive.linux"
+		value="http://www.greenstone.org/caveat-emptor/cdrom-components-${version}-candidate-${date}-linux.tar.gz"/>
+	<property name="software.archive.windows"
+		value="http://www.greenstone.org/caveat-emptor/cdrom-components-${version}-candidate-${date}-windows.tar.gz"/>
+	<property name="software.archive.mac"
+		value="http://www.greenstone.org/caveat-emptor/cdrom-components-${version}-candidate-${date}-mac.tar.gz"/>
+	<property name="software.archive.documented-examples"
+		value="http://www.greenstone.org/caveat-emptor/Greenstone-documented-examples-${version}-candidate-${date}.tar.gz"/>
+
+
+	<!-- THE MAIN TARGET -->
+	<target name="cdrk2" depends="init">
+
+		<!-- show the properties we're using -->
+		<echo message="software.archive.linux:                    ${software.archive.linux}"/>
+		<echo message="software.archive.windows:                  ${software.archive.windows}"/>
+		<echo message="software.archive.mac:                      ${software.archive.mac}"/>
+		<echo message="software.archive.documented-examples:      ${software.archive.documented-examples}"/>
+
+		<!-- create a directory for the cdrom contents -->
+		<mkdir dir="cdrom"/>
+
+		<!-- checkout and compile documentation java/fop code -->
+		<exec executable="svn">
+			<arg value="export"/>
+			<arg value="${svn.root}/documentation/${branch.path}/shared"/>
+			<arg value="documentation/shared"/>
+		</exec>
+		<javac srcdir="documentation/shared" destdir="" debug="on">
+			<include name="*.java"/>
+		</javac>
+
+		<!-- checkout tutorials and build them -->
+		<exec executable="svn"><arg value="checkout"/><arg value="${svn.root}/documentation/${branch.path}/tutorials"/><arg value="documentation/tutorials"/></exec>
+		<exec executable="svn"><arg value="checkout"/><arg value="${svn.root}/main/${branch.path}/gli"/><arg value="documentation/gli"/></exec>
+		<exec executable="svn"><arg value="checkout"/><arg value="${svn.root}/main/${branch.path}/greenstone2/perllib"/><arg value="documentation/perllib"/></exec>
+		<exec executable="svn"><arg value="checkout"/><arg value="${svn.root}/main/${branch.path}/greenstone2/macros"/><arg value="documentation/macros"/></exec>
+		<exec executable="svn"><arg value="checkout"/><arg value="${svn.root}/documentation/${branch.path}/tutorial_sample_files"/><arg value="documentation/tutorial_sample_files"/></exec>
+		<delete dir="documentation/tutorials/html"/>
+		<exec dir="documentation/tutorials" executable="/bin/bash">
+			<arg value="generate-html.sh"/>
+			<env key="GSDLHOME" value="${basedir}/documentation"/>
+		</exec>
+		<delete dir="cdrom/Tutorial Exercises"/>
+		<mkdir dir="cdrom/Tutorial Exercises/sample_files"/>
+
+		<!-- copy tutorial html into place on the cd -->
+		<copy todir="cdrom/Tutorial Exercises/English"><fileset dir="documentation/tutorials/html/en"/></copy>
+		<copy todir="cdrom/Tutorial Exercises/French"><fileset dir="documentation/tutorials/html/fr"/></copy>
+		<copy todir="cdrom/Tutorial Exercises/Spanish"><fileset dir="documentation/tutorials/html/es"/></copy>
+		<copy todir="cdrom/Tutorial Exercises/Russian"><fileset dir="documentation/tutorials/html/ru"/></copy>
+
+		<!-- create tutorial sample files zips in place on the cdrom -->
+		<zip destfile="cdrom/Tutorial Exercises/sample_files/beatles.zip" basedir="documentation/tutorial_sample_files/beatles"/>
+		<zip destfile="cdrom/Tutorial Exercises/sample_files/custom.zip" basedir="documentation/tutorial_sample_files/custom"/>
+		<zip destfile="cdrom/Tutorial Exercises/sample_files/demo_NewFiles.zip" basedir="documentation/tutorial_sample_files/demo_NewFiles"/>
+		<zip destfile="cdrom/Tutorial Exercises/sample_files/dspace.zip" basedir="documentation/tutorial_sample_files/dspace"/>
+		<zip destfile="cdrom/Tutorial Exercises/sample_files/images.zip" basedir="documentation/tutorial_sample_files/images"/>
+		<zip destfile="cdrom/Tutorial Exercises/sample_files/isis.zip" basedir="documentation/tutorial_sample_files/isis"/>
+		<zip destfile="cdrom/Tutorial Exercises/sample_files/marc.zip" basedir="documentation/tutorial_sample_files/marc"/>
+		<zip destfile="cdrom/Tutorial Exercises/sample_files/niupepa.zip" basedir="documentation/tutorial_sample_files/niupepa"/>
+		<zip destfile="cdrom/Tutorial Exercises/sample_files/oai.zip" basedir="documentation/tutorial_sample_files/oai"/>
+		<zip destfile="cdrom/Tutorial Exercises/sample_files/simple_html.zip" basedir="documentation/tutorial_sample_files/simple_html"/>
+		<zip destfile="cdrom/Tutorial Exercises/sample_files/tudor.zip" basedir="documentation/tutorial_sample_files/tudor"/>
+		<zip destfile="cdrom/Tutorial Exercises/sample_files/Word_and_PDF.zip" basedir="documentation/tutorial_sample_files/Word_and_PDF"/>
+
+		<!-- checkout manuals ad build them -->
+		<exec executable="svn"><arg value="checkout"/><arg value="${svn.root}/documentation/${branch.path}/manuals"/><arg value="documentation/manuals"/></exec>
+		<exec executable="svn"><arg value="checkout"/><arg value="${svn.root}/documentation/${branch.path}/shared"/><arg value="documentation/shared"/></exec>
+		<exec executable="svn"><arg value="checkout"/><arg value="${svn.root}/main/${branch.path}/gli"/><arg value="documentation/gli"/></exec>
+
+		<unzip src="documentation/shared/fop.zip" dest="documentation/shared"/>
+		<chmod perm="a+x" file="documentation/shared/fop/fop.sh"/>
+
+		<antcall target="generate-gli-chapter"><param name="language" value="en"/></antcall>
+		<antcall target="generate-gli-chapter"><param name="language" value="fr"/></antcall>
+		<antcall target="generate-gli-chapter"><param name="language" value="es"/></antcall>
+		<antcall target="generate-gli-chapter"><param name="language" value="ru"/></antcall>
+
+		<delete dir="documentation/manuals/build"/>
+		<exec dir="documentation/manuals" executable="/bin/bash">
+			<arg value="generate-pdf.sh"/>
+			<arg value="all"/>
+			<arg value="en es ru fr"/>
+		</exec>
+
+		<exec spawn="true" dir="documentation/manuals" executable="/bin/bash">
+			<arg value="generate-pdf.sh"/>
+			<arg value="Install"/>
+			<arg value="ar"/>
+		</exec>
+
+		<!-- put manuals in place on cdrom -->
+		<delete dir="cdrom/Documentation"/>
+		<copy todir="cdrom/Documentation/English"><fileset dir="documentation/manuals/build/en/pdf"/></copy>
+		<copy todir="cdrom/Documentation/French"><fileset dir="documentation/manuals/build/fr/pdf"/></copy>
+		<copy todir="cdrom/Documentation/Spanish"><fileset dir="documentation/manuals/build/es/pdf"/></copy>
+		<copy todir="cdrom/Documentation/Russian"><fileset dir="documentation/manuals/build/ru/pdf"/></copy>
+		<copy todir="cdrom/Documentation/Arabic"><fileset dir="documentation/manuals/build/ar/pdf"/></copy>
+
+		<!-- top off manuals with a few more from the web -->
+		<get src="http://wiki.greenstone.org/wiki/gsdoc/others/CDS-ISIS_to_DL.pdf" dest="cdrom/Documentation/English/CDS-ISIS_to_DL.pdf"/>
+		<get src="http://www.greenstone.org/docs/inside_greenstone.pdf" dest="cdrom/Documentation/English/inside_greenstone.pdf"/>
+
+		<get src="http://www.greenstone.org/manuals/gsdl2/ar/pdf/Users_Guide_Arabic.doc" dest="cdrom/Documentation/Arabic/Users_Guide_Arabic.doc"/>
+		<get src="http://www.greenstone.org/manuals/gsdl2/ar/pdf/Install_ar.pdf" dest="cdrom/Documentation/Arabic/Install_ar.pdf"/>
+
+		<mkdir dir="cdrom/Documentation/Brazilian Portuguese"/>
+		<get src="http://www.greenstone.org/manuals/gsdl2/pt-br/pdf/Install_pt-br.pdf" dest="cdrom/Documentation/Brazilian Portuguese/Install_pt-br.pdf"/>
+
+		<mkdir dir="cdrom/Documentation/Vietnamese"/>
+		<get src="http://prdownloads.sourceforge.net/greenstone/Install-2.39-vi.pdf" dest="cdrom/Documentation/Vietnamese/Install-2.39-vi.pdf"/>
+		<get src="http://prdownloads.sourceforge.net/greenstone/User-2.39-vi.pdf" dest="cdrom/Documentation/Vietnamese/User-2.39-vi.pdf"/>
+		<get src="http://prdownloads.sourceforge.net/greenstone/Paper-2.39-vi.pdf" dest="cdrom/Documentation/Vietnamese/Paper-2.39-vi.pdf"/>
+
+		<mkdir dir="cdrom/Documentation/Kazakh"/>
+		<get src="http://prdownloads.sourceforge.net/greenstone/Install-2.39-kz.pdf" dest="cdrom/Documentation/Kazakh/Install-2.39-kz.pdf"/>
+		<get src="http://prdownloads.sourceforge.net/greenstone/User-2.39-kz.pdf" dest="cdrom/Documentation/Kazakh/User-2.39-kz.pdf"/>
+		<get src="http://prdownloads.sourceforge.net/greenstone/Paper-2.39-kz.pdf" dest="cdrom/Documentation/Kazakh/Paper-2.39-kz.pdf"/>
+
+		<!-- insert the documented examples onto cdrom -->
+		<mkdir dir="archives"/>
+		<get src="${software.archive.documented-examples}" dest="archives/documented-examples.tar.gz"/>
+		<delete dir="cdrom/Documented Examples"/>
+		<copy toDir="cdrom">
+			<fileset dir="${rk.home}/kits/${rk.name}/resources">
+				<include name="Documented Examples/**/*"/>
+				<include name="Documented Examples"/>
+			</fileset>
+		</copy>
+		<exec executable="tar" dir="cdrom/Documented Examples"><arg value="-xzf"/><arg value="../../archives/documented-examples.tar.gz"/></exec>
+
+		<!-- insert readmes -->
+		<copy todir="cdrom"><fileset dir="${rk.home}/greenstone2/docs"/></copy>
+		<antcall target="gsdl-set-dates-in-readmes"><param name="gsdl.basedir" value="${basedir}/cdrom"/></antcall>
+
+		<!-- insert linux software -->
+		<mkdir dir="cdrom"/>
+		<mkdir dir="archives"/>
+		<get src="${software.archive.linux}" dest="archives/linux.tar.gz"/>
+		<exec executable="tar" dir="cdrom"><arg value="-xzf"/><arg value="../archives/linux.tar.gz"/></exec>
+
+		<!-- insert windows software -->
+		<mkdir dir="cdrom"/>
+		<mkdir dir="archives"/>
+		<get src="${software.archive.windows}" dest="archives/windows.tar.gz"/>
+		<exec executable="tar" dir="cdrom"><arg value="-xzf"/><arg value="../archives/windows.tar.gz"/></exec>
+
+		<!-- insert mac software -->
+		<mkdir dir="cdrom"/>
+		<mkdir dir="archives"/>
+		<get src="${software.archive.mac}" dest="archives/mac.tar.gz"/>
+		<exec executable="tar" dir="cdrom"><arg value="-xzf"/><arg value="../archives/mac.tar.gz"/></exec>
+
+		<!-- create autorun (windows) -->
+		<exec executable="cp">
+			<arg value="${rk.home}/kits/${rk.name}/resources/AUTORUN.INF"/>
+			<arg value="cdrom"/>
+		</exec>
+
+		<!-- finally create the cdrom image -->
+		<mkdir dir="products"/>
+		<exec executable="mkisofs">
+			<arg value="-V"/>
+			<arg value="Greenstone-${version}"/>
+			<arg value="-input-charset"/>
+			<arg value="utf-8"/>
+			<arg value="-o"/>
+			<arg value="products/Greenstone-${version}-cdrom.iso"/>
+			<arg value="-J"/>
+			<arg value="-R"/>
+			<arg value="-D"/>
+			<arg value="cdrom"/>
+		</exec>
+		<exec executable="/bin/bash" dir="products">
+			<arg value="-c"/>
+			<arg value="cat Greenstone-${version}-cdrom.iso | gzip > Greenstone-${version}-cdrom.iso.gz"/>
+		</exec>
+		<exec executable="/bin/bash" dir="products">
+			<arg value="-c"/>
+			<arg value="zip Greenstone-${version}-cdrom.zip Greenstone-${version}-cdrom.iso"/>
+		</exec>
+
+	</target>
+
+	<target name="properties" depends="core-properties">
+		<echo>software.archive.linux                      (optional)  the URL to the linux archive of components</echo>
+		<echo>software.archive.windows                    (optional)  the URL to the windows archive of components</echo>
+		<echo>software.archive.mac                        (optional)  the URL to the mac archive of components</echo>
+		<echo>software.archive.documented-examples        (optional)  the URL to the archive of documented examples</echo>
+	</target>
+
+	<!-- target to generate the manual chapter about gli in a given language -->
+	<target name="generate-gli-chapter">
+		<path id="documentation.compile.classpath">
+			<fileset dir="documentation">
+				<include name="**/*.jar"/>
+			</fileset>
+			<pathelement path="documentation/gli/classes"/>
+			<pathelement path="documentation/shared"/>
+			<pathelement path="documentation/manuals"/>
+		</path>
+		<java classname="ApplyXSLT" classpathref="documentation.compile.classpath" output="documentation/manuals/xml-source/${language}/help-${language}.xml">
+			<arg value="${language}" />
+			<arg value="documentation/manuals/processing/gen-gli-help-to-manual-chapter.xsl" />
+			<arg value="documentation/gli/help/${language}/help.xml" />
+			<arg value="compiled" />
+		</java>
+		<copy file="documentation/manuals/xml-source/${language}/help-${language}.xml" todir="documentation/manuals"/>
+	</target>
+
+</project>
Index: /main/branches/stable_gs3/release-kits/kits/cdrk2/resources/AUTORUN.INF
===================================================================
--- /main/branches/stable_gs3/release-kits/kits/cdrk2/resources/AUTORUN.INF	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/kits/cdrk2/resources/AUTORUN.INF	(revision 21851)
@@ -0,0 +1,3 @@
+[autorun]
+open=Greenstone-2.82cd-windows.exe
+icon=Software\core\all\web\images\icon.ico
Index: /main/branches/stable_gs3/release-kits/kits/cdrk2/resources/Documented Examples/README.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/kits/cdrk2/resources/Documented Examples/README.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/kits/cdrk2/resources/Documented Examples/README.txt	(revision 21851)
@@ -0,0 +1,4 @@
+Copy the entire 'documented-examples' folder into the 'collect' folder of your
+Greenstone installation (GSDLHOME/collect) to install the documented example
+collections.
+
Index: /main/branches/stable_gs3/release-kits/kits/derk/ant-scripts/build.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/kits/derk/ant-scripts/build.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/kits/derk/ant-scripts/build.xml	(revision 21851)
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+		.......................................................... 
+		April 2009
+		Documented Example Release Kit (derk)
+		Oran Fry
+		..........................................................
+-->
+
+<project name="derk-build" default="derk">
+
+	<!-- IMPORT OTHER ANT SCRIPTS -->
+	<import file="${rk.home}/shared/core/ant-scripts/shared.xml"/>
+
+	<!-- THE MAIN TARGET -->
+	<target name="derk" depends="init">
+		<!-- export the documented examples -->
+		<if><bool><not><available file="documented-examples"/></not></bool>
+			<exec executable="svn">
+				<arg value="export"/>
+				<arg value="${svn.root}/documented-examples/${branch.path}"/>
+				<arg value="documented-examples"/>
+			</exec>
+		</if>
+
+		<!-- clean up -->
+		<delete file="documented-examples/text-for-translation.txt"/>
+
+		<!-- prepare-gs2build -->
+		<if>
+			<bool><not><available file="gs2build"/></not></bool>
+			<exec executable="svn">
+				<arg value="export"/>
+				<arg value="${svn.root}/main/${branch.path}/gs2build"/>
+				<arg value="gs2build"/>
+			</exec>
+		</if>
+		<if><bool><not><available file="gs2build/Makefile"/></not></bool>
+			<exec dir="gs2build" executable="/bin/bash" failonerror="true"><arg value="./configure"/></exec>
+			<exec dir="gs2build" executable="make" failonerror="true"/>
+			<exec dir="gs2build" executable="make" failonerror="true"><arg value="install"/></exec>
+		</if>
+
+		<!-- build the collections -->
+		<exec dir="gs2build" executable="${rk.home}/kits/${rk.name}/resources/build.sh" failonerror="true"/>
+
+		<!-- create archives -->
+		<mkdir dir="products"/>
+		<zip destfile="products/Greenstone-documented-examples-${version}.zip"  basedir="." includes="documented-examples/**/*"/>
+		<exec executable="tar">
+			<arg line="-czf products/Greenstone-documented-examples-${version}.tar.gz documented-examples"/>
+		</exec>
+
+	</target>
+
+	<target name="properties" depends="core-properties"/>
+
+</project>
Index: /main/branches/stable_gs3/release-kits/kits/derk/resources/build.sh
===================================================================
--- /main/branches/stable_gs3/release-kits/kits/derk/resources/build.sh	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/kits/derk/resources/build.sh	(revision 21851)
@@ -0,0 +1,30 @@
+#!/bin/bash
+opwd=`pwd`
+source setup.bash
+
+if [ ! -e "collect/documented-examples" ]; then
+	cd collect
+	ln -s ../../documented-examples
+	cd $opwd
+fi
+
+cd collect
+
+for coll in documented-examples/*; do
+	cd $opwd
+
+	if [ -d "collect/$coll/etc" ]; then
+		if [ ! -e "collect/$coll/index" ]; then
+			echo
+			echo "Building collection $coll "
+			echo
+
+			import.pl --removeold $coll && \
+			buildcol.pl --removeold $coll && \
+			rm -rf collect/$coll/index collect/$coll/archives && \
+			mv collect/$coll/building collect/$coll/index || exit 1
+		else
+			echo skipping $coll
+		fi
+	fi
+done
Index: /main/branches/stable_gs3/release-kits/kits/rk2/ant-scripts/build.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/kits/rk2/ant-scripts/build.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/kits/rk2/ant-scripts/build.xml	(revision 21851)
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+		.......................................................... 
+		September 2009
+		Release Kit for Greenstone2 (rk2)
+		Oran Fry
+		..........................................................
+-->
+
+<project name="rk2-build" default="rk2">
+
+	<!-- IMPORT OTHER ANT SCRIPTS -->
+	<import file="${rk.home}/shared/core/ant-scripts/shared.xml"/>
+	<import file="${rk.home}/shared/greenstone2/ant-scripts/greenstone2-shared.xml"/>
+
+	<import file="compile.xml"/>
+	<import file="create-components.xml"/>
+	<import file="${rk.home}/shared/core/ant-scripts/create-installer.xml"/>
+	<import file="${rk.home}/shared/core/ant-scripts/wrap.xml"/>
+	<import file="create-cdrom-components.xml"/>
+
+	<import file="components.xml"/>
+
+	<!-- THE MAIN TARGET -->
+	<target name="rk2" depends="init,gs2-init,compile,create-components,create-installer,wrap,create-cdrom-components"/>
+
+	<!-- target to show properties in rk2-build.properties -->
+	<target name="properties" depends="core-properties,gs2-properties"/>
+
+</project>
Index: /main/branches/stable_gs3/release-kits/kits/rk2/ant-scripts/compile.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/kits/rk2/ant-scripts/compile.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/kits/rk2/ant-scripts/compile.xml	(revision 21851)
@@ -0,0 +1,259 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<project name="rk2-compile">
+
+	<target name="compile" depends="init,gs2-init">
+
+		<!-- checkout gsdl and gli -->
+		<exec executable="svn">
+			<arg value="checkout"/>
+			<arg value="${svn.root}/main/${branch.path}/greenstone2"/>
+			<arg value="${basedir}/compiled"/>
+		</exec>
+                <exec executable="svn">
+			<arg value="checkout"/>
+			<arg value="${svn.root}/main/${branch.path}/gli"/>
+			<arg value="${basedir}/compiled/gli"/>
+		</exec>
+
+		<!-- drop in documentation -->
+		<copy todir="compiled" overwrite="true">
+			<fileset dir="${rk.home}/shared/greenstone2/docs" excludes="READMEar.txt,READMEes.txt,READMEfr.txt,READMEru.txt"/>
+		</copy>
+
+		<!-- set version numbers -->
+		<antcall target="gsdl-set-version-numbers"><param name="gsdl.basedir" value="${basedir}/compiled"/></antcall>
+		<antcall target="gli-set-version-numbers"><param name="glibasedir" value="${basedir}/compiled/gli"/></antcall>
+
+		<!-- windows only -->
+		<if><bool><equals arg1="${rk.os}" arg2="windows"/></bool>
+
+			<!-- unzip packages -->
+			<unzip src="${basedir}/compiled/common-src/packages/windows/crypt/crypt.zip" dest="${basedir}/compiled/common-src/packages/windows/crypt"/>
+			<unzip src="${basedir}/compiled/common-src/packages/windows/expat/expat.zip" dest="${basedir}/compiled/common-src/packages/windows/expat"/>
+			<unzip src="${basedir}/compiled/common-src/packages/windows/stlport/stlport.zip" dest="${basedir}/compiled/common-src/packages/windows/stlport"/>
+			<unzip src="${basedir}/compiled/common-src/indexers/packages/windows/iconv/iconv.zip" dest="${basedir}/compiled/common-src/indexers/packages/windows/iconv"/>
+			<untar src="${basedir}/compiled/common-src/packages/sqlite/sqlite-amalgamation-3.5.9.tar.gz" dest="${basedir}/compiled/common-src/packages/sqlite" compression="gzip"/>
+
+			<!-- get winbin -->
+			<if><bool><not><available file="${basedir}/compiled/bin/windows"/></not></bool>
+				<exec executable="svn">
+					<arg value="export"/>
+					<arg value="${svn.root}/main/${branch.path}/binaries/windows/bin"/>
+					<arg value="${basedir}/compiled/bin/windows"/>
+					<arg value="-r"/><arg value="${branch.revision}"/>
+				</exec>
+			</if>
+
+			<!-- insert windows perl -->
+			<unzip src="${rk.home}/shared/windows/perl.zip" dest="compiled/bin/windows"/>
+
+			<!-- compile c code -->
+			<exec dir="${basedir}/compiled" executable="nmake"><arg value="/f"/><arg value="win32.mak"/><arg value="clean"/></exec>
+			<exec dir="${basedir}/compiled" executable="nmake"><arg value="/f"/><arg value="win32.mak"/><arg value="APACHE_HTTPD=1"/></exec>
+			<exec dir="${basedir}/compiled" executable="nmake"><arg value="/f"/><arg value="win32.mak"/><arg value="LOCAL_LIBRARY=1"/></exec>
+			<mkdir dir="products"/>
+			<copy file="${basedir}/compiled/server.exe" tofile="${basedir}/products/server-${version}.exe"/>
+			<move file="${basedir}/compiled/server.exe" todir="${basedir}/compiled/bin/windows"/>
+
+
+		<!-- linux only -->
+		<else><if><bool><equals arg1="${rk.os}" arg2="linux"/></bool>
+
+			<!-- add static to configure.in -->
+			<rsr file="${basedir}/compiled/configure.in" pattern="^LDFLAGS=.*$" replacement="LDFLAGS=-static"/>
+			<exec dir="${basedir}/compiled" executable="autoconf" output="${basedir}/compiled/configure">
+				<arg value="configure.in"/>
+			</exec>
+
+			<!-- set environment in packages/configure -->
+			<rsr file="${basedir}/compiled/common-src/packages/configure" pattern="^ENVIRONMENT=.*$" replacement="ENVIRONMENT=&quot;LDFLAGS=-static&quot;"/>
+			<rsr file="${basedir}/compiled/build-src/packages/configure" pattern="^ENVIRONMENT=.*$" replacement="ENVIRONMENT=&quot;LDFLAGS=-static&quot;"/>
+
+			<!-- run configure -->
+			<exec dir="${basedir}/compiled" executable="${basedir}/compiled/configure" failonerror="true">
+				<arg line="--enable-apache-httpd"/>
+				<env key="LDFLAGS" value="-static"/>
+			</exec>
+
+			<!-- add -static to makefiles -->
+			<rsr file="${basedir}/compiled/build-src/packages/wv/wv-gs/Makefile" pattern="^LDFLAGS =.*$" replacement="LDFLAGS = -static" />
+			<rsr file="${basedir}/compiled/build-src/packages/xlhtml/xlhtml-0.4.9.0/xlhtml/Makefile" pattern="^LDFLAGS =.*$" replacement="LDFLAGS = -static"/>
+			<rsr file="${basedir}/compiled/build-src/packages/xlhtml/xlhtml-0.4.9.0/ppthtml/Makefile" pattern="^LDFLAGS =.*$" replacement="LDFLAGS = -static"/>
+			<rsr file="${basedir}/compiled/build-src/packages/rtftohtml/rtftohtml_src/Makefile" pattern="(-o rtftohtml.{2}EXEEXT.{1})" replacement="$1 -static"/>
+
+		<!-- mac only -->
+		<else><if><bool><equals arg1="${rk.os}" arg2="mac"/></bool>
+			<!-- run configure -->
+			<exec dir="${basedir}/compiled" executable="${basedir}/compiled/configure" failonerror="true">
+				<arg line="--enable-apache-httpd"/>
+			</exec>
+
+			<!-- tweak makefiles -->
+			<rsr file="${basedir}/compiled/runtime-src/src/recpt/Makefile" pattern="^(LIBS =.*)-L(.)\(PACKAGES_DIR\)/expat/lib -lexpat(.*)$" replacement="$1$2(PACKAGES_DIR)/expat/lib/libexpat.a$3"/>
+			<rsr file="${basedir}/compiled/runtime-src/src/oaiservr/Makefile" pattern="^(LIBS =.*)-L(.)\(PACKAGES_DIR\)/expat/lib -lexpat(.*)$" replacement="$1$2(PACKAGES_DIR)/expat/lib/libexpat.a$3"/>
+
+		</if></else></if></else></if>
+
+		<!-- mac and linux: compile -->
+		<if><bool><or><equals arg1="${rk.os}" arg2="mac"/><equals arg1="${rk.os}" arg2="linux"/></or></bool>
+
+			<!-- make -->
+			<exec dir="${basedir}/compiled" executable="make" failonerror="true"/>
+
+			<!-- make install -->
+			<exec dir="${basedir}/compiled" executable="make" failonerror="true"><arg value="install"/></exec>
+
+			<!-- make apache-for-dist -->
+			<exec dir="${basedir}/compiled" executable="make" failonerror="true"><arg value="apache-for-dist"/></exec>
+
+			<!-- strip executables -->
+			<exec dir="${basedir}/compiled/bin/${os.shell}" executable="find" failonerror="true">
+				<arg line=". ! -name . -type f -maxdepth 1 -exec strip {} &#59;"/>
+			</exec>
+		</if>
+
+		<!-- compile gli -->
+		<!-- (linux and mac) -->
+		<if><bool><or><equals arg1="${rk.os}" arg2="mac"/><equals arg1="${rk.os}" arg2="linux"/></or></bool>
+			<exec dir="compiled/gli" executable="/bin/bash"><arg value="-c"/><arg value="./makegli.sh"/></exec>
+			<exec dir="compiled/gli" executable="/bin/bash"><arg value="-c"/><arg value="./makejar.sh"/></exec>
+		<!-- windows -->
+		<else><if><bool><equals arg1="${rk.os}" arg2="windows"/></bool>
+			<exec dir="compiled/gli" executable="cmd.exe"><arg value="/c"/><arg value="makegli.bat"/></exec>
+			<exec dir="compiled/gli" executable="cmd.exe"><arg value="/c"/><arg value="makejar.bat"/></exec>
+		</if></else></if>
+
+		<delete dir="compiled/gli/jar"/>
+		<delete dir="compiled/gli/classes/org"/>
+		<move file="compiled/gli/GLIServer.jar" todir="compiled/bin/java"/>
+
+		<!-- compile uninstaller -->
+		<antcall target="insert-and-compile-uninstaller" />
+
+		<!-- build demo collection -->
+		<!-- the envs on these execs simulate the environment when you run setup.bat 
+		<exec dir="${basedir}/compiled" executable="perl">
+			<arg line="bin/script/import.pl - -removeold demo"/>
+			<env key="GSDLHOME" path="${basedir}/compiled"/>
+			<env key="GSDLCOLLECTDIR" path="${basedir}/compiled/collect"/>
+			<env key="GSDLOS" value="windows"/>
+			<env key="PATH" path="${basedir}/compiled/bin/windows/perl/bin:${basedir}/compiled/bin/windows:${basedir}/compiled/bin/script:${env.PATH}"/>
+		</exec>
+		<exec dir="${basedir}/compiled" executable="perl">
+			<arg line="bin/script/buildcol.pl - -removeold demo"/>
+			<env key="GSDLHOME" path="${basedir}/compiled"/>
+			<env key="GSDLCOLLECTDIR" path="${basedir}/compiled/collect"/>
+			<env key="GSDLOS" value="windows"/>
+			<env key="PATH" path="${basedir}/compiled/bin/windows/perl/bin:${basedir}/compiled/bin/windows:${basedir}/compiled/bin/script:${env.PATH}"/>
+		</exec>
+		<delete dir="${basedir}/compiled/collect/demo/index"/>
+		<move file="${basedir}/compiled/collect/demo/building" tofile="${basedir}/compiled/collect/demo/index"/>
+		-->
+
+		<!-- delete the source code -->
+		<delete><fileset dir="compiled" includes="Makefile,config.cache,config.h,config.log,stamp-h,config.status"/></delete>
+		<delete dir="compiled/common-src"/>
+		<delete dir="compiled/build-src"/>
+		<delete dir="compiled/runtime-src"/>
+		<delete><fileset dir="compiled" includes="Install.txt,acconfig.h,aclocal.m4,config.guess,config.sub,configtest.pl,configure,configure.in,install-sh,Makefile.in,micotest.cpp,config.h.in,win32.mak,win32cfg.h"/></delete>
+
+		<!-- strip .svn working-copy dirs -->
+		<antcall target="strip-svn-dirs"><param name="dir" value="compiled"/></antcall>
+
+		<!-- create needed empty files -->
+		<mkdir dir="compiled/tmp"/>
+		<chmod dir="compiled/tmp" perm="a+rwx"/>
+		<echo file="compiled/etc/usage.txt"></echo>
+
+		<!-- windows -->
+		<if><bool><equals arg1="${rk.os}" arg2="windows"/></bool>
+
+			<!-- make a copy of server.exe in the root -->
+			<copy file="compiled/bin/windows/server.exe" tofile="compiled/server.exe"/>
+
+			<!-- delete sourcecode -->
+			<delete dir="${binzip.dir}/common-src"/>
+			<delete dir="${binzip.dir}/build-src"/>
+			<delete dir="${binzip.dir}/runtime-src"/>
+
+			<!-- create simple zipped binary distribution 
+			<mkdir dir="distributions"/>
+			<property name="binzip.dir" value="distributions/Greenstone-${version}-${os.suffix}-binary"/>
+			<copy todir="${binzip.dir}"><fileset dir="compiled"/></copy>
+			<delete><fileset dir="${binzip.dir}" includes="README*.txt,Uninstall.bat,Uninst.bat,uninst.jar,win32.mak,win32cfg.h,makegs2.bat" excludes="READMEen.txt"/></delete>
+			-->
+
+			<!-- delete unneeded files -->
+			<delete dir="compiled/bin/linux" />
+			<delete><fileset dir="compiled" includes="*.bash,*.sh,*.csh,.gstermrc"/></delete>
+			<delete><fileset dir="compiled/gli" includes="*.sh,*4gs3.bat"/></delete>
+			<delete dir="compiled/autom4te.cache" />
+
+		<!-- linux -->
+		<else><if><bool><equals arg1="${rk.os}" arg2="linux"/></bool>
+			<!-- grab imagemagick binaries -->
+			<delete dir="compiled/bin/linux/imagemagick"/>
+			<exec executable="svn">
+				<arg value="export"/>
+				<arg value="${svn.root}/main/${branch.path}/binaries/linux/imagemagick"/>
+				<arg value="compiled/bin/linux/imagemagick"/>
+			</exec>
+
+			<!-- grab wv binaries -->
+			<delete dir="compiled/bin/linux/wv"/>
+			<exec executable="svn">
+				<arg value="export"/>
+				<arg value="${svn.root}/main/${branch.path}/binaries/linux/wv"/>
+				<arg value="compiled/bin/linux/wv"/>
+			</exec>
+
+			<!-- delete unneeded files -->
+			<delete><fileset dir="compiled" includes="win32.mak,win32cfg.h,Install.sh,Support.htm,micotest.cpp"/></delete>
+			<delete><fileset dir="compiled/gli" includes="*.bat"/></delete>
+			<delete><fileset dir="compiled" includes="*.bat"/></delete>
+			<delete dir="compiled/common-src/packages/windows"/>
+			<delete dir="compiled/common-src/indexers/packages/windows"/>
+
+		<!-- mac -->
+		<else><if><bool><equals arg1="${rk.os}" arg2="mac"/></bool>
+			<!-- grab imagemagick binaries -->
+			<delete dir="compiled/bin/darwin/imagemagick"/>
+			<exec executable="svn">
+				<arg value="export"/>
+				<arg value="${svn.root}/main/${branch.path}/binaries/mac/intel/imagemagick"/>
+				<arg value="compiled/bin/darwin/imagemagick"/>
+			</exec>
+
+			<!-- grab ghostscript binaries -->
+			<delete dir="compiled/bin/darwin/ghostscript"/>
+			<exec executable="svn">
+				<arg value="export"/>
+				<arg value="${svn.root}/main/${branch.path}/binaries/mac/intel/ghostscript"/>
+				<arg value="compiled/bin/darwin/ghostscript"/>
+			</exec>
+
+			<!-- delete unneeded files -->
+			<delete><fileset dir="compiled" includes="win32.mak,win32cfg.h,Install.sh,Support.htm,*.bat"/></delete>
+			<delete><fileset dir="compiled/gli" includes="*.bat"/></delete>
+			<delete dir="compiled/common-src/packages/windows"/>
+
+		</if></else></if></else></if>
+
+		<!-- delete unneeded files -->
+		<delete dir="compiled/uninstaller" />
+		<delete file="compiled/bin/java/SignedGatherer.jar" />
+
+		<!-- tidy up gli -->
+		<antcall target="gli-tidy-for-dist"><param name="glibasedir" value="compiled/gli"/></antcall>
+
+		<!-- mac and linux: insert export to cdrom package -->
+		<if><bool><or><equals arg1="${rk.os}" arg2="mac"/><equals arg1="${rk.os}" arg2="linux"/></or></bool>
+			<mkdir dir="compiled/bin/windows"/>
+			<get src="${server.exe.location}" dest="compiled/bin/windows/server.exe"/>
+			<get src="${svn.root}/main/${branch.path}/binaries/windows/bin/Setup.exe" dest="compiled/bin/windows/Setup.exe"/>
+			<get src="${svn.root}/main/${branch.path}/binaries/windows/bin/gssetup.exe" dest="compiled/bin/windows/gssetup.exe"/>
+		</if>
+
+	</target>
+
+</project>
Index: /main/branches/stable_gs3/release-kits/kits/rk2/ant-scripts/components.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/kits/rk2/ant-scripts/components.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/kits/rk2/ant-scripts/components.xml	(revision 21851)
@@ -0,0 +1,48 @@
+<!-- an ant project containing authoritative definitions of the components of greenstone3 -->
+<project name="components">
+
+	<!-- source component - files that get compiled and could be safely removed from a binary distribution -->
+	<patternset id="greenstone2.source.component">
+		<include name="gli/src"/>
+		<include name="gli/src/**/*"/>
+		<include name="common-src"/>
+		<include name="common-src/**/*"/>
+		<include name="build-src"/>
+		<include name="build-src/**/*"/>
+		<include name="runtime-src"/>
+		<include name="runtime-src/**/*"/>
+		<include name="aclocal.m4"/>
+		<include name="config.guess"/>
+		<include name="config.h.in"/>
+		<include name="config.sub"/>
+		<include name="configure"/>
+		<include name="configure.in"/>
+		<include name="install-sh"/>
+		<include name="Makefile.in"/>
+		<include name="win32.mak"/>
+		<include name="win32cfg.h"/>
+	</patternset>
+
+	<!-- imagemagick -->
+	<patternset id="greenstone2.imagemagick.component">
+		<include name="bin/**/imagemagick"/>
+                <include name="bin/**/imagemagick/**/*"/>
+	</patternset>
+
+        <!-- ghostscript -->
+        <patternset id="greenstone2.ghostscript.component">
+                <include name="bin/**/ghostscript"/>
+                <include name="bin/**/ghostscript/**/*"/>
+        </patternset>
+
+        <!-- the core component - defined by antithesis -->
+        <patternset id="greenstone2.core.component">
+		<invert>
+			<patternset refid="greenstone2.source.component"/>
+			<patternset refid="greenstone2.imagemagick.component"/>
+			<patternset refid="greenstone2.ghostscript.component"/>
+		</invert>
+        </patternset>
+
+</project>
+
Index: /main/branches/stable_gs3/release-kits/kits/rk2/ant-scripts/create-cdrom-components.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/kits/rk2/ant-scripts/create-cdrom-components.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/kits/rk2/ant-scripts/create-cdrom-components.xml	(revision 21851)
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<project name="rk2-create-cdrom-components" default="create-cdrom-components">
+
+	<!--
+		cd components
+		produce components for cdrom distributions, to be picked up and used by cdrk2 release kit
+		split components into linux only files (linux) and general files (all)
+	-->
+
+	<target name="create-cdrom-components" depends="init,gs2-init">
+		<antcall target="compile-cdrom-installer"/> <!-- from init -->
+
+		<!-- clean up -->
+		<delete dir="cdrom"/>
+
+		<!-- setup directory structure -->
+		<mkdir dir="cdrom/build"/>
+		<mkdir dir="cdrom/dist/Software"/>
+		<mkdir dir="cdrom/dist/Java/Jars"/>
+
+		<!-- create core component -->
+		<mkdir dir="cdrom/dist/Software/core/all"/>
+		<mkdir dir="cdrom/dist/Software/core/${rk.os}"/>
+
+		<!-- core linux -->
+		<if><bool><equals arg1="${rk.os}" arg2="linux"/></bool>
+			<unzip src="components/core.comp" dest="cdrom/dist/Software/core/all" overwrite="true"/>
+			<move todir="cdrom/dist/Software/core/linux" overwrite="true">
+				<fileset dir="cdrom/dist/Software/core/all">
+					<include name="bin/linux"/>
+					<include name="bin/linux/**/*"/>
+					<include name="bin/windows"/>
+					<include name="bin/windows/**/*"/>
+					<include name="cgi-bin/library.cgi"/>
+					<include name="cgi-bin/oaiserver.cgi"/>
+					<include name="apache-httpd/**/*"/>
+					<include name="*.sh"/>
+					<include name="*.csh"/>
+					<include name="*.bash"/>
+				</fileset>
+			</move>
+			<!-- delete the apache manual to save space -->
+			<delete dir="cdrom/dist/Software/core/linux/apache-httpd/linux/manual"/>
+
+		<!-- core windows -->
+		<else><if><bool><equals arg1="${rk.os}" arg2="windows"/></bool>
+			<unzip src="components/core.comp" dest="cdrom/dist/Software/core/windows" overwrite="true">
+				<patternset>
+					<include name="bin/windows"/>
+					<include name="server.exe"/>
+					<include name="bin/windows/**/*"/>
+					<include name="cgi-bin/library.cgi"/>
+					<include name="cgi-bin/oaiserver.cgi"/>
+					<include name="*.bat"/>
+					<include name="gli/*.bat"/>
+				</patternset>
+			</unzip>
+
+		<!-- core mac -->
+		<else><if><bool><equals arg1="${rk.os}" arg2="mac"/></bool>
+			<unzip src="components/core.comp" dest="cdrom/dist/Software/core/mac" overwrite="true">
+				<patternset>
+					<include name="bin/darwin"/>
+					<include name="bin/darwin/**/*"/>
+					<include name="bin/windows"/>
+					<include name="bin/windows/**/*"/>
+					<include name="cgi-bin/library.cgi"/>
+					<include name="cgi-bin/oaiserver.cgi"/>
+					<include name="apache-httpd"/>
+					<include name="apache-httpd/**/*"/>
+					<include name="*.sh"/>
+					<include name="*.csh"/>
+					<include name="*.bash"/>
+				</patternset>
+			</unzip>
+			<!-- delete the httpd manual to save space -->
+			<delete dir="cdrom/dist/Software/core/mac/apache-httpd/darwin/manual"/>
+
+		</if></else></if></else></if>
+
+		<!-- imagemagick -->
+		<mkdir dir="cdrom/dist/Software/imagemagick/${rk.os}"/>
+		<unzip src="components/imagemagick.comp" dest="cdrom/dist/Software/imagemagick/${rk.os}" overwrite="true"/>
+
+		<!-- ghostscript: windows and mac only -->
+		<if><bool><or><equals arg1="${rk.os}" arg2="windows"/><equals arg1="${rk.os}" arg2="mac"/></or></bool>
+			<mkdir dir="cdrom/dist/Software/ghostscript/${rk.os}"/>
+			<unzip src="components/ghostscript.comp" dest="cdrom/dist/Software/ghostscript/${rk.os}" overwrite="true"/>
+		</if>
+
+		<!-- jre linux -->
+		<if><bool><equals arg1="${rk.os}" arg2="linux"/></bool>
+			<mkdir dir="cdrom/dist/Java/Linux"/>
+			<exec executable="cp">
+				<arg value="${rk.home}/shared/linux/jre_bin"/>
+				<arg value="cdrom/dist/Java/Linux"/>
+			</exec>
+			<!--
+			don't extract to save space
+			<exec dir="cdrom/dist/Java/Linux" executable="${rk.home}/shared/linux/jre_bin"/>
+			<exec dir="cdrom/dist/Java/Linux" executable="tar"><arg value="-xf"/><arg value="jre.tar"/></exec>
+			<delete file="cdrom/dist/Java/Linux/jre.tar"/>
+			-->
+
+		<!-- jre windows -->
+		<else><if><bool><or><equals arg1="${rk.os}" arg2="windows"/></or></bool>
+			<mkdir dir="cdrom/dist/Java/Windows"/>
+			<exec dir="cdrom/dist/Java/Windows" executable="${rk.home}/shared/windows/wrapper/jre.exe"/>
+
+		</if></else></if>
+
+		<!-- jar installer: windows and linux only -->
+		<if><bool><or><equals arg1="${rk.os}" arg2="windows"/><equals arg1="${rk.os}" arg2="mac"/></or></bool>
+			<copy file="installer/cdrom.jar" tofile="cdrom/dist/Java/Jars/${rk.os}.jar"/>
+		</if>
+
+		<!-- compile cdrom wrapper -->
+		<!-- (windows) -->
+		<if><bool><equals arg1="${rk.os}" arg2="windows"/></bool>
+			<copy todir="cdrom/build" overwrite="true">
+				<fileset dir="${rk.home}/shared/windows/wrapper"/>
+				<fileset dir="${rk.home}/shared/greenstone2/wrapper" includes="*.bmp"/>
+				<fileset dir="${rk.home}/shared/core/icon" includes="icon.ico"/>
+				<fileset dir="${rk.home}/shared/core/search4j" includes="libsearch4j.cpp,libsearch4j.h"/>
+			</copy>
+			<exec executable="rc" dir="cdrom/build">
+				<arg line="wrapper.rc"/>
+			</exec>
+			<exec executable="cl" dir="cdrom/build">
+				<arg line="/c -GX -DCDROM wrapper.cpp"/>
+			</exec>
+			<exec executable="link" dir="cdrom/build">
+				<arg line="/OUT:../dist/Greenstone-${version}-windows.exe gdi32.lib advapi32.lib shell32.lib user32.lib wrapper.obj wrapper.RES"/>
+			</exec>
+
+		<!-- (linux) -->
+		<else><if><bool><equals arg1="${rk.os}" arg2="linux"/></bool>
+			<copy file="${rk.home}/shared/linux/wrapper.cpp" todir="cdrom/build" overwrite="true"/>
+
+			<echo level="info">compile the cdrom wrapper</echo>
+			<exec executable="g++" dir="cdrom/build">
+				<arg line="-Wall -static -static-libgcc -c -DCDROM -o wrapper.o wrapper.cpp"/>
+			</exec>
+
+			<echo level="info">link the compiled code</echo>
+			<exec executable="g++" dir="cdrom/build">
+				<arg line="-static -static-libgcc -o ../dist/Greenstone-${version}-linux wrapper.o"/>
+			</exec>
+
+		<!-- (mac) -->
+		<else><if><bool><equals arg1="${rk.os}" arg2="mac"/></bool>
+
+			<mkdir dir="wrapped-installer/cdrom"/>
+			<!-- create app for cdrom installer -->
+			<copy todir="cdrom/dist/Greenstone-${version}-MacOS.app"><fileset dir="${rk.home}/shared/mac/Wrapper.app"/></copy>
+			<copy todir="cdrom/dist/Greenstone-${version}-MacOS.app/Contents/Resources" file="${rk.home}/shared/core/icon/icon.icns"/>
+			<chmod file="cdrom/dist/Greenstone-${version}-MacOS.app/Contents/MacOS/JavaApplicationStub" perm="+x"/>
+
+			<!-- copy bundled files -->
+			<copy todir="cdrom/dist/Greenstone-${version}-MacOS.app/Contents/Resources/Java" file="${basedir}/installer/cdrom.jar"/>
+
+			<!-- substitute in real values -->
+			<rsr file="cdrom/dist/Greenstone-${version}-MacOS.app/Contents/Info.plist" pattern="@jar@" replacement="cdrom.jar"/>
+			<rsr file="cdrom/dist/Greenstone-${version}-MacOS.app/Contents/Info.plist" pattern="@version@" replacement="${version}"/>
+			
+		</if></else></if></else></if>
+
+
+		<!-- create cdrom components -archive -->
+		<mkdir dir="products"/>
+		<!-- (windows) -->
+		<if><bool><equals arg1="${rk.os}" arg2="windows"/></bool>
+			<tar destfile="products/cdrom-components-${version}-windows.tar.gz" compression="gzip">
+				<tarfileset dir="cdrom/dist"><include name="**/*"/></tarfileset>
+			</tar>
+
+		<!-- (linux and mac) -->
+		<else><if><bool><or><equals arg1="${rk.os}" arg2="linux"/><equals arg1="${rk.os}" arg2="mac"/></or></bool>
+			<exec dir="cdrom/dist" executable="bash">
+				<arg value="-c"/>
+				<arg value="tar -czf ../../products/cdrom-components-${version}-${rk.os}.tar.gz *"/>
+			</exec>
+		</if></else></if>
+	</target>
+
+</project>
Index: /main/branches/stable_gs3/release-kits/kits/rk2/ant-scripts/create-components.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/kits/rk2/ant-scripts/create-components.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/kits/rk2/ant-scripts/create-components.xml	(revision 21851)
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<project name="rk2-create-components">
+
+	<target name="create-components" depends="init,gs2-init">
+
+		<!-- core  -->
+		<antcall target="create-component"><param name="component" value="core"/></antcall>
+
+		<!-- imagemagick -->
+		<antcall target="create-component"><param name="component" value="imagemagick"/></antcall>
+
+		<!-- windows and mac only -->
+		<if><bool><or><equals arg1="${rk.os}" arg2="windows"/><equals arg1="${rk.os}" arg2="mac"/></or></bool>
+			<!-- ghostscript -->
+			<antcall target="create-component"><param name="component" value="ghostscript"/></antcall>
+		</if>
+
+	</target>
+
+</project>
Index: /main/branches/stable_gs3/release-kits/kits/rk2/installer/antinstall-config.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/kits/rk2/installer/antinstall-config.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/kits/rk2/installer/antinstall-config.xml	(revision 21851)
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE installer PUBLIC "-//tp23 //DTD Ant Installer Config//EN" "http://antinstaller.sf.net/dtd/antinstall-config-0.8.dtd">
+<installer
+			ui="swing,text"
+			verbose="true"
+			debug="false"
+			lookAndFeel="org.tp23.jgoodies.plaf.plastic.PlasticXPLookAndFeel"
+			name="Greenstone@version@ Installer"
+			windowIcon="/resources/icon.png"
+			defaultImageResource="/resources/header.png"
+			minJavaVersion="1.4">
+
+	<!-- select language page -->
+	<page type="input" name="language-selector" displayText="">
+		<comment name="language-selector-explanation"/>
+		<select property="language" defaultValue="en" displayText="" useAsLocale="true">
+			<option value="en" text="English"/>
+			<option value="fr" text="FranÃ§ais (French)"/>
+			<option value="es" text="EspaÃ±ol (Spanish)"/>
+			<option value="de" text="Deutsch (German)"/>
+			<option value="ru" text="ÑÑÑÑÐºÐžÐ¹ ÑÐ·ÑÐº (Russian)"/>
+			<option value="zh" text="äž­æ (Chinese)"/>
+			<option value="ar" text="Arabic"/>
+		</select>
+	</page>
+
+	<!-- intro page -->
+	<page type="input" name="intro" displayText="">
+		<comment name="welcome"/>
+	</page>
+
+	<!-- licence page -->
+	<page type="license" name="license" resource="/LICENSE.txt"  displayText="" />
+
+	<!--  install destination page -->
+	<page type="input" name="destination" displayText="">
+
+		<!-- if linux|mac -->
+		<directory property="installDir"
+			defaultValue="/usr/local/Greenstone,${env.HOME}/Greenstone"
+			create="true"
+			displayText=""
+			flagFile="_uninst"
+			flagFileExistsProperty="ISInstallDetected"
+			/>
+		<!-- /if -->
+		<!-- if windows -->
+		<directory property="installDir"
+			defaultValue="C:\Program Files\Greenstone,${env.HOMEDRIVE}\${env.HOMEPATH}\Greenstone"
+			create="true"
+			displayText=""
+			flagFile="_uninst"
+			flagFileExistsProperty="ISInstallDetected"
+			/>
+		<!-- /if -->
+
+	</page>
+
+	<!-- don't budge if installshield installation found -->
+	<page type="input" name="dontBudge" displayText="" ifProperty="(${ISInstallDetected}==true)" showNextButton="false">
+		<comment name="is-install-detected"/>
+	</page>
+
+	<!-- conmponents -->
+	<page type="input" name="selector" displayText="">
+		<comment name="choose-components"/>
+
+		<!-- if linux|windows -->
+		<target
+			target="Initialising"
+			diskRequirement="x"
+			defaultValue="true"
+			displayText="x"
+			force="true"
+			hidden="true"/>
+		<!-- /if -->
+
+		<target
+			target="Installing Core System"
+			diskRequirement="@component.size.core@"
+			displayText=""
+			defaultValue="true"
+			force="true"/>
+
+		<target
+			target="Installing ImageMagick"
+			diskRequirement="@component.size.imagemagick@"
+			defaultValue="true" 
+			displayText=""/>
+
+		<!-- if windows|mac -->
+		<target
+			target="Installing Ghostscript"
+			diskRequirement="@component.size.ghostscript@"
+			defaultValue="true" 
+			displayText=""/>
+		<!-- /if -->
+
+
+		<!-- start cdrom -->
+		<!-- the size of this component has to be maintained manually as we can't
+			know at compile time how big the documented examples are -->
+		<target
+			target="Installing Documented Examples"
+			diskRequirement="108 MB"
+			defaultValue="true" 
+			displayText=""/>
+		<!-- end cdrom -->
+
+		<!-- if windows -->
+		<target
+			target="Installing Start Menu Shortcuts"
+			diskRequirement="~10 KB"
+			defaultValue="true"
+			displayText=""/>
+		<!-- /if -->
+
+	</page>
+
+	<!-- page to ask if we should enable admin pages -->
+	<page type="input" name="admin-pages" displayText="">
+		<comment name="admin-expl"/>
+		<comment name="admin-expl-2"/>
+		<comment name="admin-expl-3"/>
+		<checkbox property="enable.admin.pages" displayText="" defaultValue="false"/>
+	</page>
+
+	<!-- only if they said yes above, set a password -->
+	<page type="input" name="admin-password" displayText="" ifProperty="(${enable.admin.pages}==true)" target="Configuring Administration Pages">
+		<comment name="admin-password-expl"/>
+		<validated property="admin.password" defaultValue="" displayText="" regex="^.{3,20}$"/>
+	</page>
+
+	<!-- progress page -->
+	<page type="progress" name="progress" showTargets="true" displayText=""/>
+
+</installer>
Index: /main/branches/stable_gs3/release-kits/kits/rk2/installer/build.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/kits/rk2/installer/build.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/kits/rk2/installer/build.xml	(revision 21851)
@@ -0,0 +1,295 @@
+﻿<?xml version="1.0"?>
+<!--
+This is the build.xml run by AntInstaller for the installer
+-->
+
+<project name="Installation">
+
+	<!-- this is required to pick up the properties generated during the install pages -->
+	<property file="${basedir}/ant.install.properties"/>
+
+	<!-- set some properties to keep track of the OS -->
+	<!-- if windows -->
+	<property name="rk.os" value="windows"/>
+	<property name="shell.name" value="windows"/>
+	<!-- /if -->
+	<!-- if linux -->
+	<property name="rk.os" value="linux"/>
+	<property name="shell.name" value="linux"/>
+	<!-- /if -->
+	<!-- if mac -->
+	<property name="rk.os" value="mac"/>
+	<property name="shell.name" value="darwin"/>
+	<!-- /if -->
+
+	<!-- classpath -->
+	<path id="project.classpath">
+		<pathelement path="${antinstaller.jar}"/>
+	</path>
+
+	<!-- custom tasks -->
+	<typedef name="rsr" classname="org.greenstone.anttasks.RegexSearchReplace" classpathref="project.classpath"/>
+	<typedef name="adduser" classname="org.greenstone.anttasks.AddGreenstoneUserToDatabase" classpathref="project.classpath"/>
+	<!-- if windows -->
+	<taskdef name="shortcut" classname="com.orangevolt.tools.ant.Win32ShortcutTask" classpathref="project.classpath"/>
+	<taskdef name="winprops" classname="com.orangevolt.tools.ant.Win32PropertiesTask" classpathref="project.classpath"/> 
+	<typedef name="getfreepath" classname="org.greenstone.anttasks.GetFreePath" classpathref="project.classpath"/>
+	<!-- /if -->
+	<!-- if linux|mac -->
+	<taskdef name="sevenzip" classname="org.apache.tools.ant.SevenZip" classpathref="project.classpath"/>
+	<!-- /if -->
+	
+	<!-- determine if a bundled java exists -->
+	<condition property="bundled.java.exists">
+		<or>
+			<available file="../@java.extracted@/bin/java"/>
+			<available file="../@java.extracted@/bin/java.exe"/>
+		</or>
+	</condition>
+
+	<!-- determine if there is an existing installation in the installDir-->
+	<available file="${installDir}\etc\installation.properties" property="is.overinstall"/>
+
+	<!-- create a local installDir String -->
+	<path id="installDir.path"><pathelement location="${installDir}"/></path>
+	<property name="installDir.local" refid="installDir.path"/>
+
+	<!-- if windows -->
+	<!-- load windows properties -->
+	<winprops/>
+	<!-- /if -->
+
+	<!-- load the properties of the previous installation if this is an overinstall -->
+	<target name="Looking For Previous Installation" if="is.overinstall">
+		<property file="${installDir}\etc\installation.properties"/>
+		<delete dir="${installed.startmenu.path}" failonerror="false"/>
+	</target>
+
+	<!-- copy jre -->
+	<target name="Initialising" if="bundled.java.exists">
+		<mkdir dir="${installDir}/packages"/>
+		<copy todir="${installDir}/packages/jre" failonerror="false">
+			<fileset dir="../@java.extracted@"/>
+		</copy>
+		<chmod dir="${installDir}/packages/jre/bin" includes="*" perm="775"/>		
+	</target>
+
+	<!-- core system -->
+	<target name="Installing Core System">
+
+		<!-- if windows -->
+		<!-- figure out the start menu path -->
+		<getfreepath path="${win32.personal.programs_menu}\Greenstone-@version@" property="startmenu.path"/>		
+		<path id="startmenu.path.path" path="${startmenu.path}"/>
+		<pathconvert targetos="unix" property="startmenu.path.unix" refid="startmenu.path.path"/>
+
+		<!-- extract 7za tool -->
+		<unzip src="${antinstaller.jar}" dest="${basedir}">
+			<patternset><include name="7za.exe"/></patternset>
+		</unzip>
+		<!-- /if -->
+
+		<!-- start web -->
+		<unzip src="${antinstaller.jar}" dest="${basedir}"><patternset><include name="core.lzma"/></patternset></unzip>
+		<!-- if linux|mac --><sevenzip task="decode" input="${basedir}/core.lzma" output="${basedir}/core.comp"/><!-- /if -->
+		<!-- if windows --><exec dir="${basedir}" executable="${basedir}/7za.exe"><arg line="x core.lzma"/></exec><!-- /if -->
+		<delete file="core.lzma"/>
+		<unzip src="${basedir}/core.comp" dest="${installDir}"/>
+		<delete file="core.comp"/>
+		<!-- end web -->
+
+		<!-- start cdrom -->
+		<copy todir="${installDir}">
+			<fileset dir="${orig.dir}/Software/core/all"/>
+			<fileset dir="${orig.dir}/Software/core/${rk.os}"/><!-- /if -->
+		</copy>
+		<!-- if windows -->
+		<copy todir="${installDir}/packages/jre" failonerror="false">
+			<fileset dir="${orig.dir}/Java/Windows/jre"/>
+		</copy>
+		<!-- /if -->
+		<!-- end cdrom -->
+
+		<echo>Setting Binaries to Executable</echo>
+		<chmod dir="${installDir}" includes="*.sh,*.bash" perm="775"/>
+		<chmod dir="${installDir}/bin" includes="*" perm="775"/>
+		<chmod dir="${installDir}/cgi-bin" includes="*" perm="775"/>
+		<chmod dir="${installDir}/bin/script" includes="**/*" perm="775"/>
+		<chmod dir="${installDir}/gli" includes="*.sh" perm="775"/>
+		<!-- if linux|mac -->
+		<chmod dir="${installDir}/bin/${shell.name}" includes="**/*" perm="775"/>
+		<chmod dir="${installDir}/apache-httpd/${shell.name}/bin" includes="*" perm="775"/>
+		<chmod dir="${installDir}/apache-httpd/${shell.name}" includes="*.sh" perm="775"/>
+		<!-- /if -->
+
+		<echo>Filling in concrete values in config files</echo>
+		<copy file="${installDir}/cgi-bin/gsdlsite.cfg.in" tofile="${installDir}/cgi-bin/gsdlsite.cfg"/>
+		<rsr file="${installDir}/cgi-bin/gsdlsite.cfg" pattern="&quot;?\*\*GSDLHOME\*\*&quot;?" replacement="&quot;${installDir.local}&quot;"/>
+
+		<echo>Correcting perl shebangs in perl scripts</echo>
+		<!-- if linux|mac -->
+		<exec executable="which" outputproperty="perl.executable"><arg value="perl"/></exec>
+		<rsr file="${installDir}/cgi-bin/gliserver.pl" pattern="^#!.*" replacement="#!${perl.executable} -w" lines="1"/>
+		<!-- /if -->
+		<!-- if windows -->
+		<property name="perl.executable" value="${installDir.local}\bin\windows\perl\bin\perl.exe"/>
+		<rsr file="${installDir}/cgi-bin/gliserver.pl" pattern="^#!.*" replacement="#!${perl.executable} -w" lines="1"/>
+		<!-- /if -->
+
+		<echo>Creating the english dictionary</echo>
+		<copy file="${installDir}/gli/classes/dictionary.properties" tofile="${installDir}/gli/classes/dictionary_en.properties"/>
+
+		<!-- if linux|mac -->
+		<echo>Set the installation locale in config files</echo>
+		<rsr file="${installDir}/setup.bash" pattern="^gsdllang=.*" replacement="gsdllang=${language}"/>
+		<rsr file="${installDir}/gli/gli.sh" pattern="^glilang=.*" replacement="glilang=${language}"/>
+		<rsr file="${installDir}/gli/gems.sh" pattern="^glilang=.*" replacement="glilang=${language}"/>
+		<!-- /if -->
+		<rsr
+			file="${installDir}/gli/classes/xml/config.xml"
+			pattern="(&lt;Argument name=&quot;general.locale&quot;&gt;).*(&lt;/Argument&gt;)"
+			replacement="$1${language}$2"/>
+
+		<echo file="${installDir}/etc/main.cfg" append="true"
+			>cgiarg          shortname=l argdefault=${language}</echo>
+
+		<!-- if linux|mac -->
+		<echo>Setting up apache web server</echo>
+		<exec dir="${installDir}" executable="${installDir}/apache-httpd/${shell.name}/install-bindist.sh">
+			<arg value="${installDir}/apache-httpd/${shell.name}"/>
+		</exec>
+		<!-- /if -->
+
+		<echo message="Creating installation properties file"/>
+		<!-- if linux|mac -->
+		<echo file="${installDir}/etc/installation.properties">#this file is just a placeholder for now</echo>
+		<!-- /if -->
+		<!-- if windows -->
+		<echo file="${installDir}\etc\installation.properties">installed.startmenu.path:${startmenu.path.unix}</echo>
+		<!-- /if -->
+		
+	</target>
+
+	<!-- ImageMagick -->
+	<target name="Installing ImageMagick">
+		<echo>Installing ImageMagick</echo>
+		<!-- start web -->
+		<unzip src="${antinstaller.jar}" dest="${basedir}"><patternset><include name="imagemagick.lzma"/></patternset></unzip>
+		<!-- if linux|mac --><sevenzip task="decode" input="${basedir}/imagemagick.lzma" output="${basedir}/imagemagick.comp"/><!-- /if -->
+		<!-- if windows --><exec dir="${basedir}" executable="${basedir}/7za.exe"><arg line="x imagemagick.lzma"/></exec><!-- /if -->
+		<delete file="imagemagick.lzma"/>
+		<unzip src="${basedir}/imagemagick.comp" dest="${installDir}"/>
+		<delete file="imagemagick.comp"/>
+		<!-- end web -->
+
+		<!-- start cdrom -->
+		<copy todir="${installDir}/bin/${shell.name}">
+			<fileset dir="${orig.dir}/Software/imagemagick/${rk.os}"/>
+		</copy>
+		<!-- end cdrom -->
+
+		<chmod dir="${installDir}/bin/${shell.name}/imagemagick/bin" includes="*" perm="775"/>
+		
+	</target>
+
+	<!-- Ghostscript -->
+	<target name="Installing Ghostscript" depends="">
+		<echo message="Installing Ghostscript"/>
+		<!-- start web -->
+		<unzip src="${antinstaller.jar}" dest="${basedir}"><patternset><include name="ghostscript.lzma"/></patternset></unzip>
+		<!-- if linux|mac --><sevenzip task="decode" input="${basedir}/ghostscript.lzma" output="${basedir}/ghostscript.comp"/><!-- /if -->
+		<!-- if windows --><exec dir="${basedir}" executable="${basedir}/7za.exe"><arg line="x ghostscript.lzma"/></exec><!-- /if -->
+		<delete file="ghostscript.lzma"/>
+		<unzip src="${basedir}/ghostscript.comp" dest="${installDir}" />
+		<delete file="ghostscript.comp"/>
+		<!-- end web -->
+
+		<!-- start cdrom -->
+		<copy todir="${installDir}/bin/${shell.name}">
+			<fileset dir="${orig.dir}/Software/ghostscript/${rk.os}"/>
+		</copy>
+		<!-- end cdrom -->
+
+		<chmod dir="${installDir}/bin/${shell.name}/ghostscript/bin" includes="*" perm="775"/>
+	</target>
+
+	<!-- Start menu shortcuts -->
+	<target name="Installing Start Menu Shortcuts">
+
+		<mkdir dir="${startmenu.path}\Documentation"/>
+		
+		<shortcut
+			file="${startmenu.path}\Greenstone Server.lnk"
+			execute="${installDir}\server.exe"
+			workingDirectory="${installDir}"
+			iconFile="${installDir}\web\images\server.ico"
+			iconIndex="0" />
+
+		<shortcut
+			file="${startmenu.path}\Librarian Interface (GLI).lnk"
+			execute="${installDir}\gli\gli.bat"
+			workingDirectory="${installDir}\gli"
+			iconFile="${installDir}\web\images\librarian.ico"
+			iconIndex="0" />
+
+		<shortcut
+			file="${startmenu.path}\Librarian Interface for Remote Server (Client GLI).lnk"
+			execute="${installDir}\gli\client-gli.bat"
+			workingDirectory="${installDir}\gli"
+			iconFile="${installDir}\web\images\librarian.ico"
+			iconIndex="0" />
+
+		<shortcut
+			file="${startmenu.path}\Metadata Set Editor (GEMS).lnk"
+			execute="${installDir}\gli\gems.bat"
+			workingDirectory="${installDir}\gli"
+			iconFile="${installDir}\web\images\metadata.ico"
+			iconIndex="0" />
+
+		<shortcut
+			file="${startmenu.path}\Uninstall.lnk"
+			execute="${installDir}\Uninstall.bat"
+			workingDirectory="${installDir}"
+			iconFile="${installDir}\web\images\uninstall.ico"
+			iconIndex="0" />
+
+		<shortcut
+			file="${startmenu.path}\Documentation\READMEen.lnk"
+			execute="${installDir}\READMEen.txt" />
+
+		<shortcut
+			file="${startmenu.path}\Documentation\Greenstone Wiki.url"
+			url="http://wiki.greenstone.org" />
+
+		<shortcut
+			file="${startmenu.path}\Documentation\Greenstone Website.url"
+			url="http://www.greenstone.org" />
+			
+	</target>
+
+	<target name="Configuring Administration Pages" if="enable.admin.pages">
+		<echo>Enabling Admin Pages</echo>
+		<rsr file="${installDir}/etc/main.cfg" pattern="^\s*status\s+.*" replacement="status enabled"/>
+		<echo>Creating admin and demo users</echo>
+		<adduser txt2db="${installDir}/bin/${shell.name}/txt2db"
+			usersDb="${installDir}/etc/users.gdb"
+			username="admin"
+			password="${admin.password}"
+			groups="administrator,colbuilder,all-collections-editor"
+			comment="created at install time"/>
+		<adduser
+			txt2db="${installDir}/bin/${shell.name}/txt2db"
+			usersDb="${installDir}/etc/users.gdb"
+			username="demo"
+			password="demo"
+			groups="demo"
+			comment="Dummy 'demo' user with password 'demo' for authen-e collection"/>
+	</target>
+
+	<target name="Installing Documented Examples">
+		<copy todir="${installDir}/collect">
+			<fileset dir="${orig.dir}/Documented Examples" includes="documented-examples/**/*"/>
+		</copy>
+	</target>
+
+</project>
Index: /main/branches/stable_gs3/release-kits/kits/rk3/ant-scripts/build.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/kits/rk3/ant-scripts/build.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/kits/rk3/ant-scripts/build.xml	(revision 21851)
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+		.......................................................... 
+		August 2009
+		Release Kit for Greenstone3 (rk3)
+		Oran Fry
+		..........................................................
+-->
+
+<project name="rk3-build" default="rk3">
+
+	<property name="version.major" value="3"/>
+
+	<!-- IMPORT OTHER ANT SCRIPTS -->
+	<import file="${rk.home}/shared/core/ant-scripts/shared.xml"/>
+	<import file="${rk.home}/shared/greenstone3/ant-scripts/greenstone3-shared.xml"/>
+
+	<import file="compile.xml"/>
+	<import file="${rk.home}/shared/core/ant-scripts/create-installer.xml"/>
+	<import file="${rk.home}/shared/core/ant-scripts/wrap.xml"/>
+
+	<!-- THE MAIN TARGET -->
+	<target name="rk3" depends="init,gs3-init">
+		<antcall target="compile"/>
+		<ant inheritRefs="true" dir="." antfile="${rk.home}/kits/${rk.name}/ant-scripts/create-components.xml" target="create-components"/>
+		<antcall target="create-installer"/>
+		<antcall target="wrap"/>
+	</target>
+
+	<!-- target to show properties in rk3-build.properties -->
+	<target name="properties" depends="core-properties,gs3-properties"/>
+
+
+</project>
Index: /main/branches/stable_gs3/release-kits/kits/rk3/ant-scripts/compile.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/kits/rk3/ant-scripts/compile.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/kits/rk3/ant-scripts/compile.xml	(revision 21851)
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<project name="rk3-compile">
+
+	<target name="compile">
+
+		<!-- checkout greenstone3 -->
+		<exec executable="svn">
+			<arg value="checkout"/>
+			<arg value="${svn.root}/main/${branch.path}/greenstone3"/>
+			<arg value="compiled"/>
+			<arg value="-r"/><arg value="${branch.revision}"/>
+		</exec>
+
+		<antcall target="persist-forwarded-properties">
+			<param name="greenstone3basedir" value="compiled"/>
+		</antcall>
+
+		<!-- make sure all c++ compilation is done statically on linux -->
+		<if><bool><equals arg1="${rk.os}" arg2="linux"/></bool>
+			<property name="forward.compile.static" value="true"/>
+		</if>
+
+		<!-- run greenstone3's ant prepare -->
+		<ant dir="compiled" inheritAll="false">
+			<target name="prepare"/>
+			<propertyset refid="forward.properties"/>
+			<property name="properties.accepted" value="true"/>
+		</ant>
+
+		<!-- set all version numbers -->
+		<antcall target="greenstone3-set-version-numbers"><param name="greenstone3basedir" value="compiled"/></antcall>
+		<antcall target="gli-set-version-numbers"><param name="glibasedir" value="compiled/gli"/></antcall>
+		<antcall target="gsdl-set-version-numbers"><param name="gsdl.basedir" value="compiled/gs2build"/></antcall>
+
+		<!-- run greenstone3's ant install and ant dist-tidy -->
+		<ant dir="compiled" inheritAll="false">
+			<target name="install"/>
+			<target name="dist-tidy"/>
+			<propertyset refid="forward.properties"/>
+			<property name="properties.accepted" value="true"/>
+		</ant>
+
+		<!-- insert an xml parser -->
+		<copy todir="compiled/gs2build/perllib/cpan">
+			<fileset dir="${rk.home}/shared/greenstone3" includes="XML-Parser/**/*"/>
+		</copy>
+
+		<!-- insert ant -->
+		<mkdir dir="compiled/packages"/>
+		<get src="http://www.greenstone.org/gs3files/apache-ant-1.8.0-bin.tar.gz" dest="compiled/packages/apache-ant-1.8.0-bin.tar.gz"/>
+		<untar src="compiled/packages/apache-ant-1.8.0-bin.tar.gz" dest="compiled/packages/" compression="gzip"/>
+		<move file="compiled/packages/apache-ant-1.8.0" tofile="compiled/packages/ant"/>
+		<delete file="compiled/packages/apache-ant-1.8.0-bin.tar.gz"/>
+	
+
+		<!-- put the uninstaller in place -->
+		<antcall target="insert-and-compile-uninstaller"/>
+
+		<!-- (windows only) -->
+		<if><bool><equals arg1="${rk.os}" arg2="windows"/></bool>
+			<!-- insert perl -->
+			<unzip src="${rk.home}/shared/windows/perl.zip" dest="compiled/gs2build/bin/windows"/>
+		</if>
+
+		<!-- minify tomcat -->
+		<delete dir="compiled/packages/tomcat/webapps/docs"/>
+		<delete dir="compiled/packages/tomcat/webapps/examples"/>
+
+		<!-- tidy up gli to make it smaller -->
+		<antcall target="gli-tidy-for-dist"><param name="glibasedir" value="compiled/gli"/></antcall>
+
+		<!-- strip out .svn dirs -->
+		<antcall target="strip-svn-dirs"><param name="dir" value="compiled"/></antcall>
+
+		<!-- (linux only) -->
+		<if><bool><equals arg1="${rk.os}" arg2="linux"/></bool>
+			<!-- grab imagemagick binaries -->
+			<delete dir="compiled/gs2build/bin/linux/imagemagick"/>
+			<exec executable="svn">
+				<arg value="export"/>
+				<arg value="${svn.root}/main/${branch.path}/binaries/linux/imagemagick"/>
+				<arg value="compiled/gs2build/bin/linux/imagemagick"/>
+			</exec>
+
+			<!-- grab wv binaries -->
+			<delete dir="compiled/gs2build/bin/linux/wv"/>
+			<exec executable="svn">
+				<arg value="export"/>
+				<arg value="${svn.root}/main/${branch.path}/binaries/linux/wv"/>
+				<arg value="compiled/gs2build/bin/linux/wv"/>
+			</exec>
+		<!-- (mac only) -->
+		<else><if><bool><equals arg1="${rk.os}" arg2="mac"/></bool>
+			<!-- grab imagemagick binaries -->
+			<delete dir="compiled/gs2build/bin/darwin/imagemagick"/>
+			<exec executable="svn">
+				<arg value="export"/>
+				<arg value="${svn.root}/main/${branch.path}/binaries/mac/intel/imagemagick"/>
+				<arg value="compiled/gs2build/bin/darwin/imagemagick"/>
+			</exec>
+
+			<!-- grab ghostscript binaries -->
+			<delete dir="compiled/gs2build/bin/darwin/ghostscript"/>
+			<exec executable="svn">
+				<arg value="export"/>
+				<arg value="${svn.root}/main/${branch.path}/binaries/mac/intel/ghostscript"/>
+				<arg value="compiled/gs2build/bin/darwin/ghostscript"/>
+			</exec>
+		</if></else></if>
+
+	</target>
+
+</project>
Index: /main/branches/stable_gs3/release-kits/kits/rk3/ant-scripts/create-components.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/kits/rk3/ant-scripts/create-components.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/kits/rk3/ant-scripts/create-components.xml	(revision 21851)
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<project name="rk3-create-components">
+
+	<import file="${basedir}/compiled/resources/xml/components.xml"/>
+	<import file="${rk.home}/shared/core/ant-scripts/shared.xml"/>
+
+	<target name="create-components">
+
+		<!-- core -->
+		<antcall target="create-component"><param name="component" value="core"/></antcall>
+
+		<!-- tomcat -->
+		<antcall target="create-component"><param name="component" value="tomcat"/></antcall>
+
+		<!-- imageagick -->
+		<antcall target="create-component"><param name="component" value="imagemagick"/></antcall>
+
+		<!-- (windows and mac only) -->
+		<if><bool><or><equals arg1="${rk.os}" arg2="windows"/><equals arg1="${rk.os}" arg2="mac"/></or></bool>
+			<!-- ghostscript -->
+			<antcall target="create-component"><param name="component" value="ghostscript"/></antcall>
+		</if>
+
+	</target>
+
+
+</project>
Index: /main/branches/stable_gs3/release-kits/kits/rk3/installer/antinstall-config.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/kits/rk3/installer/antinstall-config.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/kits/rk3/installer/antinstall-config.xml	(revision 21851)
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE installer PUBLIC "-//tp23 //DTD Ant Installer Config//EN" "http://antinstaller.sf.net/dtd/antinstall-config-0.8.dtd">
+
+<installer
+			ui="swing,text"
+			verbose="true"
+			debug="false"
+			lookAndFeel="org.tp23.jgoodies.plaf.plastic.PlasticXPLookAndFeel"
+			name="Greenstone@version@ Installer"
+			windowIcon="/resources/icon.png"
+			defaultImageResource="/resources/header.png"
+			minJavaVersion="1.4">
+
+	<!-- select language page -->
+	<page type="input" name="language-selector" displayText="">
+		<comment name="language-selector-explanation"/>
+		<select property="language" defaultValue="en" displayText="" useAsLocale="true">
+			<option value="en" text="English"/>
+			<option value="fr" text="FranÃ§ais (French)"/>
+			<option value="es" text="EspaÃ±ol (Spanish)"/>
+			<option value="de" text="Deutsch (German)"/>
+			<option value="ru" text="ÑÑÑÑÐºÐžÐ¹ ÑÐ·ÑÐº (Russian)"/>
+			<option value="zh" text="äž­æ (Chinese)"/>
+			<option value="ar" text="Arabic"/>
+		</select>
+	</page>
+
+	<!-- welcome page -->
+	<page type="input" name="intro" displayText="">
+		<comment name="welcome-greenstone3"/>
+	</page>
+
+	<!--  type="license" shows a license page to click through -->
+	<page type="license" name="license" resource="/LICENSE.txt"  displayText="" />
+
+	<!--  install destination page -->
+	<page type="input" name="destination" displayText="">
+
+		<!-- if linux|mac -->
+		<directory property="installDir"
+			defaultValue="/usr/local/Greenstone3,${env.HOME}/Greenstone3"
+			create="true"
+			displayText=""
+			flagFile="_uninst"
+			flagFileExistsProperty="ISInstallDetected"
+			/>
+		<!-- /if -->
+		<!-- if windows -->
+		<directory property="installDir"
+			defaultValue="C:\Program Files\Greenstone3,${env.HOMEDRIVE}${env.HOMEPATH}\Greenstone3"
+			create="true"
+			displayText=""
+			flagFile="_uninst"
+			flagFileExistsProperty="ISInstallDetected"
+			/>
+		<!-- /if -->
+
+	</page>
+
+	<!-- page to stop you going forward if an IS installation is detected -->
+	<page type="input" name="dontBudge" displayText="" ifProperty="(${ISInstallDetected}==true)" showNextButton="false">
+		<comment name="is-install-detected"/>
+	</page>
+
+	<!-- page to choose components -->
+	<page type="input" name="selector" displayText="">
+		<comment name="choose-components"/>
+
+		<target
+			target="Initialising"
+			diskRequirement="x"
+			defaultValue="true"
+			displayText="x"
+			force="true"
+			hidden="true"/>
+
+		<target
+			target="Installing Core System"
+			diskRequirement="@component.size.core@"
+			displayText=""
+			defaultValue="true"
+			force="true"/>
+
+		<target
+			target="Installing ImageMagick"
+			diskRequirement="@component.size.imagemagick@"
+			defaultValue="true" 
+			displayText=""/>
+
+		<!-- if windows|mac -->
+		<target
+			target="Installing Ghostscript"
+			diskRequirement="@component.size.ghostscript@"
+			defaultValue="true" 
+			displayText=""/>
+		<!-- /if -->
+
+		<target
+			target="Installing Tomcat"
+			diskRequirement="@component.size.tomcat@"
+			defaultValue="true"
+			displayText=""/>
+
+		<!-- if windows -->
+		<target
+			target="Installing Start Menu Shortcuts"
+			diskRequirement="~10 KB"
+			defaultValue="true"
+			displayText=""/>
+		<!-- /if -->
+
+	</page>
+
+	<!-- page to setup tomcat -->
+	<page type="input" name="tomcat-config" ifProperty="(${Installing Tomcat}==true)" displayText="">
+		<text property="tomcat.server" defaultValue="localhost" displayText=""/>
+		<text property="tomcat.port" defaultValue="8080" displayText=""/>
+		<text property="tomcat.shutdown.port" defaultValue="8005" displayText=""/>
+	</page>
+
+	<!-- the final progress page -->
+	<page type="progress" name="progress" showTargets="true" displayText=""/>
+
+</installer>
Index: /main/branches/stable_gs3/release-kits/kits/rk3/installer/build.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/kits/rk3/installer/build.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/kits/rk3/installer/build.xml	(revision 21851)
@@ -0,0 +1,279 @@
+<?xml version="1.0"?>
+<!--
+This is the build.xml run by AntInstaller for the installer
+-->
+<project name="Installation">
+
+	<!-- this is required to pick up the properties generated during the install pages -->
+	<property file="${basedir}/ant.install.properties"/>
+
+	<!-- custom tasks -->
+	<path id="project.classpath"><pathelement path="${antinstaller.jar}"/></path>
+
+	<typedef name="rsr" classname="org.greenstone.anttasks.RegexSearchReplace" classpathref="project.classpath"/>
+	<!-- if linux|mac -->
+	<taskdef name="sevenzip" classname="org.apache.tools.ant.SevenZip" classpathref="project.classpath"/>
+	<!-- /if -->
+	<!-- if windows -->
+	<taskdef name="shortcut" classname="com.orangevolt.tools.ant.Win32ShortcutTask" classpathref="project.classpath"/> 
+	<taskdef name="winprops" classname="com.orangevolt.tools.ant.Win32PropertiesTask" classpathref="project.classpath"/> 
+	<typedef name="getfreepath" classname="org.greenstone.anttasks.GetFreePath" classpathref="project.classpath"/>
+	<!-- /if -->
+
+	<!-- create a local and strictly unix installDir String -->
+	<path id="installDir.path"><pathelement location="${installDir}"/></path>
+	<property name="installDir.local" refid="installDir.path"/>
+	<pathconvert targetos="unix" property="installDir.unix" refid="installDir.path"/>
+
+	<!-- if windows -->
+	<!-- load windows properties -->
+	<winprops/>
+	<!-- /if -->
+
+	<!-- work out whether a jre is bundled with this installer -->
+	<available file="../jre/bin" property="bundled.java.exists"/>
+
+	<!-- determine if there is an existing installation in the installDir-->
+	<available file="${installDir}\installation.properties" property="is.overinstall"/>
+
+	<!-- target to copy the bundled jre into place -->
+	<target name="Initialising" if="bundled.java.exists">
+		<mkdir dir="${installDir}"/>
+		<copy todir="${installDir}/packages/jre" failonerror="false">
+			<fileset dir="../jre"/>
+		</copy>
+		<chmod dir="${installDir}/packages/jre/bin" includes="*" perm="775"/>		
+	</target>
+
+	<!-- target to load in the messages left by the last installation -->
+	<target name="Looking For Previous Installation" if="is.overinstall">
+		<property file="${installDir}\installation.properties"/>
+		<delete dir="${installed.startmenu.path}" failonerror="false"/>
+	</target>
+
+	<target name="Installing Core System">
+
+		<!-- rip out build.xml to the temp dir so we can fake and <antcall> with <ant> -->
+		<unzip src="${antinstaller.jar}" dest="${basedir}"><patternset><include name="build.xml"/></patternset></unzip>	
+
+
+		<!-- if windows -->
+		<echo>Figuring out the start menu path</echo>
+		<getfreepath path="${win32.personal.programs_menu}\Greenstone-@version@" property="startmenu.path"/>
+		<path id="startmenu.path.path" path="${startmenu.path}"/>
+		<pathconvert targetos="unix" property="startmenu.path.unix" refid="startmenu.path.path"/>
+
+		<echo>Extracting 7za tool</echo>
+		<unzip src="${antinstaller.jar}" dest="${basedir}">
+			<patternset><include name="7za.exe"/></patternset>
+		</unzip>
+		<!-- /if -->
+
+		<echo>Extracting core component</echo>
+		<unzip src="${antinstaller.jar}" dest="${basedir}"><patternset><include name="core.lzma"/></patternset></unzip>
+		<!-- if windows --><exec dir="${basedir}" executable="${basedir}/7za.exe"><arg line="x core.lzma"/></exec><!-- /if -->
+		<!-- if linux|mac --><sevenzip task="decode" input="${basedir}/core.lzma" output="${basedir}/core.comp"/><!-- /if -->
+		<delete file="core.lzma"/>
+		<unzip src="${basedir}/core.comp" dest="${installDir}"/>
+		<delete file="core.comp"/>
+
+		<echo>Setting binaries to executable</echo>
+		<chmod dir="${installDir}" includes="*.sh" perm="775"/>
+		<chmod dir="${installDir}/bin/script" includes="*" perm="775"/>
+		<chmod dir="${installDir}/bin" includes="*" perm="775"/>
+		<!-- if linux -->
+		<chmod dir="${installDir}/gs2build/bin/linux" includes="*" perm="775"/>
+		<!-- /if -->
+		<!-- if mac -->
+		<chmod dir="${installDir}/gs2build/bin/darwin" includes="*" perm="775"/>
+		<!-- /if -->
+		<chmod dir="${installDir}/gs2build/bin/script" includes="**/*" perm="775"/>
+		<chmod dir="${installDir}/gli" includes="*.sh" perm="775"/>
+		<!--<chmod file="${installDir}/packages/ant/bin/ant" perm="775"/>-->
+		<!--
+		source is not included for now
+		<chmod dir="${installDir}/gs2build" includes="**/configure" perm="775"/>
+		<chmod dir="${installDir}/gs2build/common-src/packages/gdbm/gdbm-1.8.3" includes="mkinstalldirs" perm="775"/>
+		<chmod file="${installDir}/src/packages/javagdbm/configure" perm="775"/>
+		-->
+
+		<echo>Setting tomcat ports</echo>
+		<rsr file="${installDir}/build.properties">
+			<job pattern="^(tomcat\.server[=:]).*" replacement="$1${tomcat.server}" />
+			<job pattern="^(tomcat\.port[=:]).*" replacement="$1${tomcat.port}" />
+			<job pattern="^(tomcat\.shutdown.port[=:]).*" replacement="$1${tomcat.shutdown.port}" />
+		</rsr>
+
+		<echo>Setting up global properties</echo>
+		<copy file="${installDir}/resources/java/global.properties.in" tofile="${installDir}/web/WEB-INF/classes/global.properties" overwrite="true"/>
+		<rsr file="${installDir}/web/WEB-INF/classes/global.properties">
+			<job pattern="^(gsdl3\.home[:=]).*" replacement="$1${installDir.unix}/web" />
+			<job pattern="^(tomcat.server[:=]).*" replacement="$1${tomcat.server}" />
+			<job pattern="^(tomcat\.port[:=]).*" replacement="$1${tomcat.port}" />
+		</rsr>
+
+		<echo>Setting up log4j properties</echo>
+		<copy file="${installDir}/resources/java/log4j.properties.in" tofile="${installDir}/web/WEB-INF/classes/log4j.properties" overwrite="true"/>
+		<rsr file="${installDir}/web/WEB-INF/classes/log4j.properties" pattern="@gsdl3home@" replacement="${installDir.unix}/web" />
+
+		<!-- if windows -->
+		<echo message="Setting GSDLHOME in gs2build\setup.bat"/>
+		<rsr file="${installDir}/gs2build/setup.bat" pattern="&quot;?\*\*GSDLHOME\*\*&quot;?" replacement="&quot;${installDir.local}\gs2build&quot;" />
+		<!-- /if -->
+
+		<echo>Creating the english dictionary</echo>
+		<copy file="${installDir}/gli/classes/dictionary.properties" tofile="${installDir}/gli/classes/dictionary_en.properties"/>
+
+		<echo>Creating usage.txt</echo>
+		<echo file="${installDir}/gs2build/etc/usage.txt"></echo>
+
+		<echo>Creating installation properties file</echo>
+		<echo file="${installDir}\installation.properties">installed.startmenu.path:${startmenu.path.unix}</echo>
+
+		<echo>Finished</echo>
+
+	</target>
+
+	<target name="Installing ImageMagick">
+
+		<echo>Installing ImageMagick</echo>
+		<unzip src="${antinstaller.jar}" dest="${basedir}"><patternset><include name="imagemagick.lzma"/></patternset></unzip>
+		<!-- if windows --><exec dir="${basedir}" executable="${basedir}/7za.exe"><arg line="x imagemagick.lzma"/></exec><!-- /if -->
+		<!-- if linux|mac --><sevenzip task="decode" input="${basedir}/imagemagick.lzma" output="${basedir}/imagemagick.comp"/><!-- /if -->
+		<delete file="imagemagick.lzma"/>
+		<unzip src="${basedir}/imagemagick.comp" dest="${installDir}"/>
+		<delete file="imagemagick.comp"/>
+
+		<echo>Setting binaries to executable</echo>
+		<!-- if linux -->
+		<chmod dir="${installDir}/gs2build/bin/linux/imagemagick/bin" includes="*" perm="775"/>
+		<!-- /if -->
+		<!-- if mac -->
+		<chmod dir="${installDir}/gs2build/bin/darwin/imagemagick/bin" includes="*" perm="775"/>
+		<!-- /if -->
+
+	</target>
+
+	<target name="Installing Ghostscript">
+
+		<echo>Installing Ghostscript</echo>
+		<unzip src="${antinstaller.jar}" dest="${basedir}"><patternset><include name="ghostscript.lzma"/></patternset></unzip>
+		<!-- if windows --><exec dir="${basedir}" executable="${basedir}/7za.exe"><arg line="x ghostscript.lzma"/></exec><!-- /if -->
+		<!-- if linux|mac --><sevenzip task="decode" input="${basedir}/ghostscript.lzma" output="${basedir}/ghostscript.comp"/><!-- /if -->
+		<delete file="ghostscript.lzma"/>
+		<unzip src="${basedir}/ghostscript.comp" dest="${installDir}"/>
+		<delete file="ghostscript.comp"/>
+
+		<echo>Setting binaries to executable</echo>
+		<!-- if linux -->
+		<chmod dir="${installDir}/gs2build/bin/linux/ghostscript/bin" includes="*" perm="775"/>
+		<!-- /if -->
+		<!-- if mac -->
+		<chmod dir="${installDir}/gs2build/bin/darwin/ghostscript/bin" includes="*" perm="775"/>
+		<!-- /if -->
+
+	</target>
+
+	<target name="Installing Tomcat">
+
+		<echo>Installing Tomcat (packages/tomcat)</echo>
+		<mkdir dir="packages"/>
+		<unzip src="${antinstaller.jar}" dest="${basedir}"><patternset><include name="tomcat.lzma"/></patternset></unzip>
+		<!-- if windows --><exec dir="${basedir}" executable="${basedir}/7za.exe"><arg line="x tomcat.lzma"/></exec><!-- /if -->
+		<!-- if linux|mac --><sevenzip task="decode" input="${basedir}/tomcat.lzma" output="${basedir}/tomcat.comp"/><!-- /if -->
+		<delete file="tomcat.lzma"/>
+		<unzip src="${basedir}/tomcat.comp" dest="${installDir}"/>
+		<delete file="tomcat.comp"/>
+
+
+		<echo>Changing tomcat ports tomcat's server.xml</echo>
+		<copy file="${installDir}/resources/tomcat/server_tomcat6.xml" tofile="${installDir}/packages/tomcat/conf/server.xml" overwrite="true"/>
+		<rsr file="${installDir}/packages/tomcat/conf/server.xml">
+			<job pattern="@port@" replacement="${tomcat.port}"/>
+			<job pattern="@shutdown-port@" replacement="${tomcat.shutdown.port}"/>
+		</rsr>
+
+		<echo>Copying greenstone3.xml to tomcat directory</echo>
+		<copy file="${installDir}/resources/tomcat/greenstone3.xml" tofile="${installDir}/packages/tomcat/conf/Catalina/localhost/greenstone3.xml" overwrite="true"/>
+		<rsr file="${installDir}/packages/tomcat/conf/Catalina/localhost/greenstone3.xml" pattern="@gsdl3webhome@" replacement="${installDir.local}${file.separator}web" />
+
+		<echo>Set binaries to executable</echo>
+		<chmod dir="${installDir}/packages/tomcat/bin" includes="*.sh" perm="775"/>
+
+	</target>
+
+	<target name="Installing Start Menu Shortcuts">
+
+		<echo>Installing Start Menu Shortcuts</echo>
+
+		<mkdir dir="${startmenu.path}\Documentation"/>
+		
+		<shortcut
+			file="${startmenu.path}\Greenstone3 Server.lnk"
+			execute="${installDir}\gs3-server.bat"
+			workingDirectory="${installDir}"
+			iconFile="${installDir}\resources\images\server.ico"
+			iconIndex="0" />
+
+		<shortcut
+			file="${startmenu.path}\Greenstone Librarian Interface (GLI).lnk"
+			execute="${installDir}\gli\gli.bat"
+			workingDirectory="${installDir}\gli"
+			iconFile="${installDir}\resources\images\librarian.ico"
+			iconIndex="0" />
+			
+		<shortcut
+			file="${startmenu.path}\Greenstone Editor for Metadata Sets (GEMS).lnk"
+			execute="${installDir}\gli\gems.bat"
+			workingDirectory="${installDir}\gli"
+			iconFile="${installDir}\resources\images\metadata.ico"
+			iconIndex="0" />
+
+		<shortcut
+			file="${startmenu.path}\Uninstall.lnk"
+			execute="${installDir}\Uninstall.bat"
+			workingDirectory="${installDir}"
+			iconFile="${installDir}\resources\images\uninstall.ico"
+			iconIndex="0" />
+	
+		<shortcut
+			file="${startmenu.path}\Documentation\README.lnk"
+			execute="${installDir}\README.txt" />
+		
+		<shortcut
+			file="${startmenu.path}\Documentation\Greenstone3 Users' Guide.lnk"
+			execute="${installDir}\documentation\manual\manual.pdf" />
+		
+		<shortcut
+			file="${startmenu.path}\Documentation\Greenstone2 Users' Guide.lnk"
+			execute="${installDir}\documentation\manual\gs2_user_en.pdf" />
+
+		<shortcut
+			file="${startmenu.path}\Documentation\Greenstone Wiki.url"
+			url="http://wiki.greenstone.org" />
+
+		<shortcut
+			file="${startmenu.path}\Documentation\Greenstone Website.url"
+			url="http://www.greenstone.org" />
+		
+	</target>
+
+	<!-- util target to extract the given component -->
+	<!-- pass in ${component.name} as a param -->
+	<!-- unused at this time as causes display errors in installer gui!
+	<target name="extract-component">
+		<!- - extract the component into place - ->
+		<unzip src="${antinstaller.jar}" dest="${basedir}"><patternset><include name="${component.name}.lzma"/></patternset></unzip>
+		<!- - if windows - ->
+		<exec dir="${basedir}" executable="${basedir}/7za.exe"><arg line="x ${component.name}.lzma"/></exec>
+		<!- - /if - ->
+		<!- - if linux|mac - ->
+		<sevenzip task="decode" input="${basedir}/${component.name}.lzma" output="${basedir}/${component.name}.comp"/>
+		<!- - /if - ->
+		<delete file="${component.name}.lzma"/>
+		<unzip src="${basedir}/${component.name}.comp" dest="${installDir}"/>
+		<delete file="${component.name}.comp"/>
+	</target>
+	-->
+
+</project>
Index: /main/branches/stable_gs3/release-kits/kits/sork2/ant-scripts/build.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/kits/sork2/ant-scripts/build.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/kits/sork2/ant-scripts/build.xml	(revision 21851)
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+		.......................................................... 
+		November 2008
+		Source Release Kit for Greenstone2 (sork2)
+		Oran Fry
+		..........................................................
+-->
+
+<project name="sork2-build" default="sork2">
+
+	<!-- IMPORT OTHER ANT SCRIPTS -->
+	<import file="${rk.home}/shared/core/ant-scripts/shared.xml"/>
+	<import file="${rk.home}/shared/greenstone2/ant-scripts/greenstone2-shared.xml"/>
+
+	<!-- THE MAIN TARGET -->
+	<target name="sork2" depends="init">
+
+		<!-- store the name of the distribution -->
+		<property name="dist.name" value="Greenstone-${version}-source-distribution"/>
+
+		<!-- create distributions dir -->
+		<mkdir dir="distributions"/>
+
+		<!-- export greenstone2 and gli -->
+		<exec executable="svn"><arg value="export"/><arg value="${svn.root}/main/${branch.path}/greenstone2"/><arg value="distributions/${dist.name}"/></exec>
+		<exec executable="svn"><arg value="export"/><arg value="${svn.root}/main/${branch.path}/gli"/><arg value="distributions/${dist.name}/gli"/></exec>
+
+		<!-- set version numbers -->
+		<antcall target="gsdl-set-version-numbers"><param name="gsdl.basedir" value="${basedir}/distributions/${dist.name}"/></antcall>
+		<antcall target="gli-set-version-numbers"><param name="glibasedir" value="${basedir}/distributions/${dist.name}/gli"/></antcall>
+
+		<!-- insert windows binaries -->
+		<delete dir="distributions/${dist.name}/bin/windows"/>
+		<exec executable="svn">
+			<arg value="export"/>
+			<arg value="${svn.root}/main/${branch.path}/binaries/windows/bin"/>
+			<arg value="distributions/${dist.name}/bin/windows"/>
+		</exec>
+		<get src="${server.exe.location}" dest="distributions/${dist.name}/bin/windows/server.exe"/>
+		<delete dir="distributions/${dist.name}/bin/windows/imagemagick"/>
+		<delete dir="distributions/${dist.name}/bin/windows/ghostscript"/>
+
+		<!-- insert windows perl -->
+		<unzip src="${rk.home}/shared/windows/perl.zip" dest="distributions/${dist.name}/bin/windows"/>
+
+		<!-- clean up -->
+		<delete file="distributions/${dist.name}/bin/linux/mgquery_old" />
+
+		<!-- create the archives (source code distribution) -->
+		<mkdir dir="products"/>
+		<delete file="products/${dist.name}.zip"/>
+		<zip destfile="products/${dist.name}.zip"  basedir="distributions" includes="${dist.name}/**/*"/>
+		<exec dir="distributions" executable="tar">
+			<arg line="-czf ../products/${dist.name}.tar.gz ${dist.name}"/>
+		</exec>
+
+		<!-- CREATE THE SOURCE CODE COMPONENT (SOURCE CODE TOP-UP TO THE BINARY RELEASE) -->
+
+		<!-- create a directory for the sourcecode -->
+		<mkdir dir="distributions/source-component"/>
+
+		<!-- copy the files in -->
+		<exec dir="distributions/${dist.name}" executable="cp">
+			<arg value="-r"/>
+
+			<!-- the bulk sourcecode -->
+			<arg value="build-src"/>
+			<arg value="common-src"/>
+			<arg value="runtime-src"/>
+
+			<!-- unix build files -->
+			<arg value="acconfig.h"/>
+			<arg value="aclocal.m4"/>
+			<arg value="config.sub"/>
+			<arg value="config.guess"/>
+			<arg value="configtest.pl"/>
+			<arg value="configure"/>
+			<arg value="configure.in"/>
+			<arg value="install-sh"/>
+			<arg value="Makefile.in"/>
+			<arg value="micotest.cpp"/>
+			<arg value="config.h.in"/>
+			<arg value="Install.txt"/>
+
+			<!-- windows build files -->
+			<arg value="win32.mak"/>
+			<arg value="win32cfg.h"/>
+			<arg value="makegs2.bat"/>
+
+			<!-- destination -->
+			<arg value="../source-component"/>
+
+		</exec>
+
+		<!-- unzip some windows packages -->
+		<unzip src="distributions/source-component/common-src/indexers/packages/windows/iconv/iconv.zip" dest="distributions/source-component/common-src/indexers/packages/windows/iconv"/>
+		<delete file="distributions/source-component/common-src/indexers/packages/windows/iconv/iconv.zip"/>
+		
+		<unzip src="distributions/source-component/common-src/packages/windows/crypt/crypt.zip" dest="distributions/source-component/common-src/packages/windows/crypt"/>
+		<delete file="distributions/source-component/common-src/packages/windows/crypt/crypt.zip"/>
+		
+		<unzip src="distributions/source-component/common-src/packages/windows/expat/expat.zip" dest="distributions/source-component/common-src/packages/windows/expat"/>
+		<delete file="distributions/source-component/common-src/packages/windows/expat/expat.zip"/>
+		
+		<unzip src="distributions/source-component/common-src/packages/windows/stlport/stlport.zip" dest="distributions/source-component/common-src/packages/windows/stlport"/>
+		<delete file="distributions/source-component/common-src/packages/windows/stlport/stlport.zip"/>
+
+		<exec executable="tar" dir="distributions/source-component/common-src/packages/sqlite"><arg value="-xzf"/><arg value="sqlite-amalgamation-3.5.9.tar.gz"/></exec>
+		<delete file="distributions/source-component/common-src/packages/sqlite/sqlite-amalgamation-3.5.9.tar.gz"/>
+
+		<exec executable="tar" dir="distributions/source-component/common-src/packages/expat"><arg value="-xzf"/><arg value="expat-1.95.8.tar.gz"/></exec>
+		<delete file="distributions/source-component/common-src/packages/sqlite/sqlite-amalgamation-3.5.9.tar.gz"/>
+
+		<!-- archive it -->
+		<delete file="products/Greenstone-${version}-source-component.zip"/>
+		<zip destfile="products/Greenstone-${version}-source-component.zip" basedir="distributions/source-component" includes="**/*"/>
+		<exec dir="distributions/source-component" executable="bash">
+			<arg value="-c"/>
+			<arg value="tar -czf ../../products/Greenstone-${version}-source-component.tar.gz *"/>
+		</exec>
+
+	</target>
+
+	<target name="properties" depends="core-properties,gs2-properties"/>
+
+</project>
Index: /main/branches/stable_gs3/release-kits/kits/sork3/ant-scripts/build.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/kits/sork3/ant-scripts/build.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/kits/sork3/ant-scripts/build.xml	(revision 21851)
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+		.......................................................... 
+		July 2009
+		Source Release Kit for Greenstone3 (sork3)
+		Oran Fry
+		..........................................................
+-->
+
+<project name="sork3-build" default="sork3">
+	
+	<!-- IMPORT OTHER ANT SCRIPTS -->
+	<import file="${rk.home}/shared/core/ant-scripts/shared.xml"/>
+	<import file="${rk.home}/shared/greenstone3/ant-scripts/greenstone3-shared.xml"/>
+
+	<!-- THE MAIN TARGET -->
+	<target name="sork3" depends="init,gs3-init">
+
+		<!-- store the name of the distribution -->
+		<property name="dist.name" value="Greenstone-${version}-source-distribution"/>
+
+		<!-- export the greenstone3 base code -->
+		<exec executable="svn"><arg value="export"/><arg value="${svn.root}/main/${branch.path}/greenstone3"/><arg value="distributions/${dist.name}"/></exec>
+		<antcall target="persist-forwarded-properties">
+			<param name="greenstone3basedir" value="distributions/${dist.name}"/>
+		</antcall>
+
+		<!-- set version numbers -->
+		<antcall target="greenstone3-set-version-numbers"><param name="greenstone3basedir" value="${basedir}/distributions/${dist.name}"/></antcall>
+
+		<!-- run ant prepare -->
+		<ant dir="distributions/${dist.name}" target="prepare">
+			<property name="properties.accepted" value="true"/>
+			<property name="app.version" value="${version}"/>
+			<propertyset refid="forward.properties"/>
+		</ant>
+
+		<!-- set gli version numbers -->
+		<antcall target="gli-set-version-numbers"><param name="glibasedir" value="${basedir}/distributions/${dist.name}/gli"/></antcall>
+
+		<!-- insert windows binaries -->
+		<delete dir="distributions/${dist.name}/gs2build/bin/windows"/>
+		<exec executable="svn"><arg value="export"/><arg value="${svn.root}/main/${branch.path}/binaries/windows/bin"/><arg value="distributions/${dist.name}/gs2build/bin/windows"/></exec>
+		<delete dir="distributions/${dist.name}/gs2build/bin/windows/imagemagick"/>
+		<delete dir="distributions/${dist.name}/gs2build/bin/windows/ghostscript"/>
+
+		<!-- insert windows perl -->
+		<unzip src="${rk.home}/shared/windows/perl.zip" dest="distributions/${dist.name}/gs2build/bin/windows"/>
+
+		<!-- clean up -->
+		<delete file="distributions/${dist.name}/gs2build/bin/linux/mgquery_old" />
+		<delete file="distributions/${dist.name}/build.properties.in"/>
+		<delete><fileset dir="distributions/${dist.name}/packages" includes="**/*.zip,**/*.tar.gz"/></delete>
+
+		<!-- run greenstone3's own targets for fixing execute permissions -->
+		<ant dir="distributions/${dist.name}">
+			<target name="fix-execute-permissions"/>
+			<target name="fix-execute-permissions-source"/>
+			<propertyset refid="forward.properties"/>
+			<property name="properties.accepted" value="true"/>
+		</ant>
+
+		<!-- create the archives -->
+		<mkdir dir="products"/>
+		<delete file="products/${dist.name}.zip"/>
+		<zip destfile="products/${dist.name}.zip"  basedir="distributions" includes="${dist.name}/**/*"/>
+		<exec dir="distributions" executable="tar">
+			<arg line="-czf ../products/${dist.name}.tar.gz ${dist.name}"/>
+		</exec>
+
+		<!-- create the sourcecode component -->
+		<ant dir="${basedir}" antfile="${rk.home}/kits/${rk.name}/ant-scripts/create-sourcecode-component.xml" target="create-sourcecode-component"/>
+	</target>
+
+	<target name="properties" depends="core-properties,gs3-properties"/>
+
+</project>
Index: /main/branches/stable_gs3/release-kits/kits/sork3/ant-scripts/create-sourcecode-component.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/kits/sork3/ant-scripts/create-sourcecode-component.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/kits/sork3/ant-scripts/create-sourcecode-component.xml	(revision 21851)
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!-- this is in a separate file because <import> can only load files that exist before build starts. This separate project is exeuted using <ant> AFTER greenstone3 has been checked out, to allow us to import the source-fileset.xml file -->
+<project name="create-sourcecode-component">
+
+	<import file="${basedir}/distributions/${dist.name}/resources/xml/components.xml"/>
+	<import file="${basedir}/distributions/${dist.name}/resources/xml/executables.xml"/>
+
+	<target name="create-sourcecode-component">
+
+		<copy todir="distributions/source-component">
+			<fileset dir="distributions/${dist.name}">
+				<patternset refid="greenstone3.source.component"/>
+			</fileset>
+		</copy>
+
+		<!-- fix permissions -->
+		<chmod perm="775">
+			<fileset dir="distributions/source-component"><patternset refid="greenstone3.source.executables"/></fileset>
+		</chmod>
+
+		<!-- archive it -->
+		<delete file="products/Greenstone-${version}-source-component.zip"/>
+		<zip destfile="products/Greenstone-${version}-source-component.zip" basedir="distributions/source-component" includes="**/*"/>
+		<exec dir="distributions/source-component" executable="bash">
+			<arg value="-c"/>
+			<arg value="tar -czf ../../products/Greenstone-${version}-source-component.tar.gz *"/>
+		</exec>
+	</target>
+
+
+</project>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/.directory
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/.directory	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/.directory	(revision 21851)
@@ -0,0 +1,2 @@
+[Desktop Entry]
+Icon=/research/oranfry/programs/ant-installer/antinstaller-icon.png
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/CHANGELOG.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/CHANGELOG.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/CHANGELOG.txt	(revision 21851)
@@ -0,0 +1,217 @@
+CHANGELOG
+
+
+========================================
+version 0.2
+Fixed a bug with the ordering of targets.
+Added app-root element.
+Hid the passwords and added a new properties file renderer with more verbose output.
+Fiddled with windoze script. (help wanted its not good scripting)
+
+========================================
+version 0.3
+Introduced fixed basedir for build.xml files to remove dependency on current
+	directory.
+Introduced SelfExtractor code to deliver installers as a single Jar file.
+Fixed some intermittent bugs in the sysout.jar library.
+Improved feedback of running Ant tasks.
+Added different default values for windows and Unix for directories and files.
+Added an ifTarget attribute to conditionally show installation pages.
+Added a Date input type.
+
+========================================
+version 0.4
+Fixed un-important error in the install-config.xml for the demo application.
+Fixed more bugs in sysout.jar related to reusing the graphics buffer.
+Added popup to save/clear in the sysout.jar.
+Fixed double printing in sysout.jar.
+Added corner button to sysout.jar to jump to final message.
+UI improvements including focusing correct buttons and better layouts.
+Changes to the way Properties are saved internally in preparation for allowing 
+	${prop.name} syntax in future versions.
+
+========================================
+version 0.5
+Fixed an introduced bug when an input page is skipped in text mode.
+Added paging to the license page in text mode.
+Fixed bug printing passwords to properties file.
+Big internal changes to the way properties are stored and referenced 
+	to allow ${refs}.
+Other internal changes to the name of InputFields that do not actually 
+	collect input to OutputField.
+Allow the use of .. in file and directory references and display the 
+	correct absolute path reference.
+
+========================================
+version 0.6
+The XML DTD should be upgraded to 0.6 to use some new features.
+Added a modified version of JGoodies' (excelent) Look And Feel to reduce 
+	the size of the installers and include and option for anti-aliased fonts 
+	in the swing GUI. 
+	- Anti-aliasing is resource intensive but good looking.
+	- The package name has been changed to maintain compatibility on the classpath
+	  with the original JGoodies files, the new package is org.tp23.jgoodies.
+Added a splash page feature to show an image.
+Added an (optional) image to the extract progress window.
+Added a new input type large-select for drop down lists.
+Fixed errors from targets on the first page in the Swing UI. 
+Fixed errors if defaultValue is null. (however it should not be set to null)
+Fixed a bug in the selfextractor when the jar is saved in a path with spaces 
+	or other non text characters.
+Added documents about the scrolling in license page.
+Removed images from the default build of antinstaller.jar 
+	- Any existing builds that are to be upgraded and use the default images, 
+	  should add the images to the classpath. The images are included in the 
+	  download in the /images directory.
+The online manual has been updated, all the changes are included in the download.
+Added some of the new features to the examples and the AnInstaller installer.
+
+========================================
+version 0.7
+File and Directory choosers will now show hidden files .
+	Thanks to Markus Dueringer for the tip.
+Environment variables can now be accesses in default values with the 
+	${env.ProgramFiles} syntax. - thanks again to Markus Dueringer
+Also the Java system properties can be accessed with the "java." prefix. 
+	- e.g ${java.user.name}
+Show details button was not big enough in some LAFs - thanks to Mike Watts.
+There are known issues with the directory selector and the Metouia LAF, 
+	I can't replicate the issues but if you have problems.
+	a) use the modified JGoodies which apparently does not have this problem.
+	b) keep the stack traces and report them please!
+	When using the selfextractor from windows or X users will probably not 
+	see the errors anyway.
+Better defaulting is included for the Directory chooser	<page
+			 type="text"
+			 name="intro.1"
+			 displayText="HTML page"
+			 htmlResource="/resources/text.html"
+			 textResource="/resources/text.txt"
+			 overflow="true" />
+	the home directory will be shown less often, it was particularly annoying 
+	when the chooser is used to create a new directory
+
+========================================
+version 0.7.1
+Bug fix in Defaulting Directory Chooser that manifested in not being able to see 
+	directories in app-root.
+RFE-1154368 Can't install from a read only source fixed.
+	The log file is written to the temp dir if it cannot write to the current dir.
+	The ant.install.properties file is only written if it can be since it is 
+	primarily for debug.
+	- There is no requirement to add <property file="ant.install.properties"/> 
+	  to the build file any more properties will be added directly to the 
+	  build as with secret properties.
+
+========================================
+version 0.7.2
+Changed the implementation of the Progress Details so selecting text is now possible.
+	This is more stable too. It has the side effect of keeping the whole System.out 
+	and System.err in memory which is only an issue for veeerrry long builds on 
+	machines with too little RAM.
+Changed minor bug where directly edited (not via the chooser) file inputs were 
+	replaced with defaults if the user when back.
+Added TargetSelectInput by Mark Anderson providing the option of radio buttons 
+	for targets instead of checkboxes.
+Fixed an introduced bug launching from the root drive when ANT_HOME was not set.
+Introduced a new "NonExtractor" this is a replacement mechanism to the SelfExtractor.
+	The Jar is still used to run the installer but the files are not extracted 
+	by default. 
+	In the build.xml files should be specifically extracted using  unzip with 
+	nested patternsets to specify the files to extract.
+	This provide opportunities to improve the performance of installers.
+	Unzipping can now be performed directly into the installation directories rather 
+	than unzipping and then copying or moving.
+	Also the antinstaller classes and LookAndFeel and Xerces need no longer 
+	be extracted.
+Added an new feature to the ifProperty attribute so the property being tested can 
+	come from the environment or the java system properties.
+	for example ifProperty="${env.SHELL}=/bin/bash thanks to Eddyrun.
+	The old syntax of property=value is deprecated in favour of ${property}=value
+	N.B.  ${property}=${value} is NOT supported.
+Big internal changes to the Execution class to use a filter pattern currently 
+	hardcoded but with intent to allow pluggable pre and post install tasks.
+
+========================================
+version 0.7.3
+Added overflow="true" to simple input page.
+GridBag Layout used instead of absolute positioning modified to support overflow size
+	difference.
+More Images and Icons added to a separate download.
+Added GUI tools for Quick start.
+A Much more flexible ifProperty syntax supporting some standard operator with non 
+standard syntax (see the docs).
+Fixed a fatal introduced bug in the console version installer
+
+========================================
+version 0.7.4
+Added an optional feature to hide password on the console. set textMask="true".
+	N.B.  this does not work in eclipse's console and may not be a stable solution
+Implemented plugable filter chains to add steps to the install process.
+	An example releaseNotes plugin is provided.
+Added ext-validated type for pluggable field validation as yet unteset 
+	and undocumented.
+Added an Ant task to build installers using Ant.
+Added a modified version of the MetalLookAndFeel to reduce download size and still 
+	be able to get the required amount of text in labels and buttons.
+Added LookAndFeel names : "default"|"jgoodies", "greymetal" or "null" .
+Further testing to allow downloads without including xercesImpl.jar or xml-apis.jar
+Added progress pane enhancements to show the targets running for visual feedback of 
+	install progress without having to monitor the output logs which can be 
+	ugly/confusing.
+XMLValiation of test scripts and minor changes in the DTD.
+Extended validation of config and integrated validation into the installer Ant task.
+N.B. passing command line parameters to the build is an override of the detection 
+	method, start scripts should be modified if the default behaviour is requried.
+	e.g. java -cp $CP org.tp23.antinstaller.runtime.ExecInstaller default . 
+	will not override the default behaviour or trying X and falling back 
+	to text/console
+Added an untested feature for including arbitrary validation classes ExtValidated
+Assorted fixes for i18n.
+app-root no longer creates the directory if it is missing.
+
+========================================
+version 0.8
+Added features to load defaults from previous installs and perform almost silent 
+	installs property names and targets must not end with the string -targets, 
+	this is validated in the config checker.
+Comments expand property values.
+Multiline comments via use of explanatoryText and a null displayText value.
+Fixed a display bug in the progress renderer if there were more than 5 
+	targets and none that were dependencies.
+PropertyLoaderFilter added, any users with custom .fconfig files should 
+	ensure thier custom versions are still compatible.
+Added a release notes feature that is a tad tricky to install so 
+	contact for details.
+Added HTML page feature that allows using the Java HTML rendering to display 
+	a page of HTML property references are expanded so the page can contain 
+	${property.name} syntax to give feed back of selected properties.
+	Images are loaded from the classpath so the following syntax will locate 
+	and display an image &lt;img src="/resources/temazo.png"&gt;.
+	Java HTML rendering is poor at best and only html3.2 ,
+	so dont expect firefox quality rendering ;)
+	The java renderer handles PNG properly though so nice .
+	trancparency effects can be achieved.
+Fixed bug in validation if only target-selects are used.
+Extended i18n for antinstall-config.xml files using ResourceBundles 
+	called LanguagePack
+GUI tool for creating LanguagePack files.
+Changes to the Expression code for ifProperty attributes
+	The original syntax is not 100% compatible e.g.  my.property=value1
+	will not work it should be converted to ${my.property}=value1.
+Initial work on loading existing values if found to automate installs.
+	Not quite silent installs but save repeating entries.
+Added ability to stretch the GUI horizontally, but still using fixed widths.
+	Set the wide attribute in the installer element to configure width 
+	e.g. 600:275
+Added the ability to deliver different install types in the same Jar which 
+	can be selected on the command line with -type [install type].
+Added icons to the buttons in the swing GUI,  the installer Ant task now takes 
+	a new attribute called icons to specify which icon pack to use.
+Added ability to run special Ant tasks mid build, the same build-xml file is used
+	but the message rendering and logging is different in the antinstaller- tasks
+Added icons for kde and windows to the AntInstaller SelfExtractor, lots of Ant 
+	hacking to avoid extra dependencies.
+Migrated classes from sysout.jar into the core src packages
+Renamed ant-ext.jar to ant-installer-ext.jar  
+	all build files will need to be updated
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/build.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/build.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/build.xml	(revision 21851)
@@ -0,0 +1,156 @@
+<?xml version="1.0"?>
+<!--
+This is a normal Ant build file to build the release for sourceforge
+-->
+<project name="Installation Build"  default="build">
+
+    <!-- Project properties -->
+    <property name="prepareDir"  value="artifacts/prepare"/>
+	<property name="antlib"	value="antlib"/>
+
+
+    <!-- Classpaths - start -->
+	<!-- Classpaths for compilation - start -->
+
+    <path id="project.cp">
+        <fileset dir="${antlib}" includes="ant.jar,ant-launcher.jar"/>
+    </path>
+    <path id="project.ext.cp">
+        <fileset dir="lib">
+			<include name="ant-installer.jar"/>
+        </fileset>
+        <fileset dir="${antlib}" includes="ant.jar,ant-launcher.jar"/>
+    </path>
+	<!-- Classpaths for compilation - end -->
+
+    <path id="taskdef.cp">
+      <fileset dir="./lib">
+        <include name="ant-installer-ext.jar"/>
+        <include name="ant-installer.jar"/>
+      </fileset>
+    </path>
+    <!-- Classpaths - end -->
+	
+
+    <!-- Task definitions - start -->
+    <!-- AntInstaller installer task definition.
+         Defined within target as it depends upon files that aren't
+         available at the start of a clean build -->
+    <target name="_set-installer-taskdef" unless="installer.taskdef.defined">
+        <taskdef
+            name="installer"
+            classname="org.tp23.antinstaller.taskdefs.Installer"
+            classpathref="taskdef.cp"/>
+        <property name="installer.taskdef.defined" value="true"/>
+    </target>
+    <!-- Task definitions - end -->
+
+
+    <!-- =============================== -->
+    <!-- ==== Public Runnable Targets == -->
+    <!-- =============================== -->
+
+    <target name="clean-build" depends="clean, _build-ai-jars, clean-demo, _build-demo">
+      <!-- this build is pretty much everything other than the installers -->
+    </target>
+
+    <target name="build" depends="_build-ai-jars, _build-demo">
+      <!-- this build should be enough to run the unittests without having to build a release package -->
+    </target>
+
+    <target name="clean" description="Clean out compiled and generated files">
+    	<echo message="*** *** Cleaning artifacts *** *** "/>
+    	<echo message="*** ***"/>
+        <delete dir="${prepareDir}"/>
+    	<delete file="./lib/ant-installer.jar"/>
+    	<delete file="./lib/ant-installer-ext.jar"/>
+    </target>
+
+    <target name="clean-demo" description="Clean out demo files">
+		<ant dir="demo" antfile="build-demo.xml" target="clean">
+			<property name="${installDir}" value="demo"/>
+		</ant>
+    </target>
+
+
+    <!-- =============================== -->
+    <!-- ======= Internal Targets ====== -->
+    <!-- =============================== -->
+
+	<!-- 
+		tests that the following has been run locally
+		This does not need to be run repeatedly but unittests depend on it
+		# ant -buildfile demo/build-demo.xml 
+	-->
+    <target name="_check-demo">
+    	<condition property="installpack.missing">
+    		<not>
+    			<available file="demo/artifacts/installpack.zip" type="file"/>
+    		</not>
+    	</condition>
+    </target>
+	
+    <target name="_build-demo" if="installpack.missing" depends="_check-demo">
+    	<echo message="requires demo build: ${installpack.missing}"/>
+		<ant dir="demo" antfile="build-demo.xml" target="selfextract">
+			<property name="${installDir}" value="demo"/>
+		</ant>
+    </target>
+
+	
+	<target name="_build-ai-jars" depends="_ant-installer.jar, _ant-installer-ext.jar">
+        <!-- AntInstaller JARs are built in ./lib-->
+        <!-- (checked-in) JARs should not be used -->
+    </target>
+
+    <target name="_ant-installer.jar">
+        <echo message="*** *** Building ant-installer.jar *** *** "/>
+    	<echo message="*** ***"/>
+        <echo message="Initing the build directory - ${prepareDir}"/>
+        <mkdir dir="${prepareDir}/classes"/>
+
+        <echo message="*** Building ant-installer.jar ***"/>
+        <mkdir dir="./lib"/>
+        <javac destdir="${prepareDir}/classes" srcdir="src" classpathref="project.cp" debug="true"/>
+        <jar file="./lib/ant-installer.jar" whenempty="fail">
+            <fileset dir="./src/resources">
+                <include name="LICENSE-ant-install.txt"/>
+            </fileset>
+            <fileset dir="${prepareDir}/classes"/>
+            <fileset dir="./src">
+                <include name="**/*.dtd"/>
+                <include name="**/*.properties"/>
+                <include name="**/*.fconfig"/>
+                <include name="resources/extract-image.png"/>
+                <include name="resources/gkmain_inv.png"/>
+                <include name="resources/antbar.png"/>
+            </fileset>
+            <manifest>
+                <attribute name="AntInstaller-Version" value="${ant.install.version}"/>
+            </manifest>
+        </jar>
+    </target>
+
+	<target name="_ant-installer-ext.jar">
+		<echo message="*** *** Building ant-installer-ext.jar *** *** "/>
+    	<echo message="*** ***"/>
+        <mkdir dir="${prepareDir}/classes_ext"/>
+        <javac destdir="${prepareDir}/classes_ext" srcdir="src_ext" classpathref="project.ext.cp" debug="true"/>
+		<jar file="./lib/ant-installer-ext.jar" whenempty="fail">
+            <fileset dir="./src/resources">
+                <include name="LICENSE-ant-install.txt"/>
+            </fileset>
+            <fileset dir="${prepareDir}/classes_ext"/>
+            <manifest>
+                <attribute name="AntInstaller-Version" value="${ant.install.version}"/>
+            </manifest>
+        </jar>
+    </target>	
+
+	<target name="setEn"></target>
+	<target name="setFr"></target>
+	<target name="setEs"></target>
+	<target name="setRu"></target>
+
+	
+</project>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/DEMO-README.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/DEMO-README.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/DEMO-README.txt	(revision 21851)
@@ -0,0 +1,13 @@
+This Demo is a very simple example of what AntInstaller and Ant can do
+
+The installer performs the following tasks
+extracts an installpack.zip pack of files to a temporary directory
+install the selected components in the directory of the users choice
+performs an ant replace operation on the config file in {installDir}/config/example-config.xml
+deletes the temporary direcotry
+
+Clearly this is not a realworld example. 
+
+The replace Ant task is a very usefull operation for installations, and of course the
+full power of ant is at your disposal at the time the installation is performed.  It is probably
+best to be specific about the optional tasks that are included.
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/README.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/README.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/README.txt	(revision 21851)
@@ -0,0 +1,1 @@
+This is an example readme file 
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/ant.install.log
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/ant.install.log	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/ant.install.log	(revision 21851)
@@ -0,0 +1,4 @@
+Logger initialized
+Ant basedir:/research/oranfry/programs/ant-installer/demo
+Filter: org.tp23.antinstaller.runtime.exe.LoadConfigFilter
+Installation error: Not able to load and read the AntInstaller config: class org.tp23.antinstaller.InstallException
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/bin/run.cmd
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/bin/run.cmd	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/bin/run.cmd	(revision 21851)
@@ -0,0 +1,19 @@
+@echo off
+
+if "%JAVA_HOME%" == "" goto nojava
+
+set CLASSPATH=.\classes
+
+echo CLASSPATH:%CLASSPATH%
+echo JAVA_HOME:%JAVA_HOME%
+
+%JAVA_HOME%\bin\java -cp %CLASSPATH% org.tp23.demo.Demonstration
+
+goto end
+ 
+:nojava
+echo Set JAVA_HOME environment variable
+goto end
+
+
+:end
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/bin/run.sh
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/bin/run.sh	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/bin/run.sh	(revision 21851)
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+if [ "$JAVA_HOME" = "" ] ; then
+	echo set JAVA_HOME;
+	exit 1;
+fi
+
+# find the command called's root  e.g.  ./build/
+dir=`expr  match "$0" '\(.*\)run.sh'`
+echo command called $0 directory 
+
+#  if it we did not call ./  change to the directory we called 
+if [ "$dir" != "./" ] ; then
+        if [ "$dir" != "" ] ;  then
+								echo changing to $dir
+                cd "$dir" ;
+        fi
+fi
+CLASSPATH=$CLASSPATH:./classes
+
+echo $CLASSPATH
+echo $JAVA_HOME
+
+$JAVA_HOME/bin/java -cp $CLASSPATH org.tp23.demo.Demonstration
+
+ 
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/build-demo.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/build-demo.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/build-demo.xml	(revision 21851)
@@ -0,0 +1,103 @@
+<?xml version="1.0"?>
+<!--
+
+This Ant script is used to package parts of the demo app to create an installer
+
+the selfextract target shows an example of creating a self extracting jar for the demo app
+
+run with ...
+
+ant -buildfile build-demo.xml
+
+-->
+<project name="Create Demo Installer Zip Build"  default="selfextract"  basedir=".">
+
+    <!-- Default location in installed tree -->
+    <property name="installDir" location=".."/>
+	<!-- This file should either not exist or contain a property that points to a valid ./antlib${ant.lib.version} directory -->
+	<property file="${installDir}/build/version.properties"/>
+
+    <path id="taskdef.cp">
+	  <fileset dir="${installDir}/lib">
+        <include name="ant-installer-ext.jar"/>
+        <include name="ant-installer.jar"/>
+      </fileset>
+	</path>
+	
+	<target name="_set-version" if="antlib.missing" depends="_check-version">
+		<property name="ant.lib.version" value=""/>
+	</target>
+	<target name="_check-version">
+		<condition property="antlib.missing">
+			<not><available file="${installDir}/antlib${ant.lib.version}"/></not>
+		</condition>
+	</target>
+	<target name="selfextract" depends="_set-version, build-resources">
+		<echo message="*** *** Building demo-installer.jar *** *** "/>
+    	<echo message="*** ***"/>
+		<taskdef 
+			name="installer" 
+			classname="org.tp23.antinstaller.taskdefs.Installer"
+			classpathref="taskdef.cp"/>
+        <installer file="${installDir}/demo/artifacts/demo-installer.jar" compress="true"
+				extractType="SelfExtractor"
+				installConfig="installer/antinstall-config.xml"
+				buildFile="installer/build.xml"
+				antInstallLib="${installDir}/lib"
+				antLib="${installDir}/antlib${ant.lib.version}"
+				validateConfig="true"
+				failOnError="true"
+				icons="eclipse">
+			<fileset dir="${installDir}/demo/artifacts" includes="installpack.zip"/>
+			<fileset dir="installclasspath" includes="resources/*"/>
+		</installer>
+		<!-- old build jar  file="./selfextractpack.jar" compress="true">
+			<manifest>
+				<attribute name="Manifest-Version" value="1.0"/>
+				<attribute name="Main-Class" value="org.tp23.antinstaller.selfextract.SelfExtractor"/>
+				<attribute name="Look-And-Feel" value="org.tp23.jgoodies.plaf.plastic.PlasticXPLookAndFeel"/>
+			</manifest>
+			<fileset dir="selfextract">
+				<include name="**/*"/>
+			</fileset>
+			<zipgroupfileset dir="installlib" includes="*.jar"/>
+		</jar-->
+	</target>
+
+	<target name="clean">
+		<echo message="*** *** Cleaning demo artifacts *** *** "/>
+    	<echo message="*** ***"/>
+		<delete dir="${installDir}/demo/classes" failonerror="false"/>
+		<delete file="${installDir}/demo/artifacts/installpack.zip" failonerror="false"/>
+		<delete file="${installDir}/demo/artifacts/demo-installer.jar" failonerror="false"/>
+	</target>
+
+	<target name="build-resources">
+		<echo message="*** *** Creating demo resources ZIP *** *** "/>
+    	<echo message="*** ***"/>
+		<mkdir dir="${installDir}/demo/classes"/>
+		<javac destdir="${installDir}/demo/classes" srcdir="src"/>
+		<copy 
+			file="src/resources/demo.png" 
+			tofile="${installDir}/demo/classes/resources/demo.png" 
+			overwrite="true"/>
+		<mkdir dir="${installDir}/demo/artifacts"/>
+		<delete file="${installDir}/demo/artifacts/installpack.zip" failonerror="false"/>
+		<mkdir dir="${installDir}/demo/artifacts"/>
+		<zip  file="${installDir}/demo/artifacts/installpack.zip">
+			<zipfileset dir="." defaultexcludes="true">
+				<include name="bin/**/*"/>
+				<include name="classes/**/*"/>
+				<include name="config/**/*"/>
+				<include name="doc/**/*"/>
+				<include name="src/**/*"/>
+				<include name="README.txt"/>
+				<include name="DEMO-README.txt"/>
+			</zipfileset>
+			<zipfileset dir="${installDir}/demo" defaultexcludes="true">
+				<include name="classes/**/*"/>
+			</zipfileset>
+		</zip>
+	</target>
+
+</project>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/checkConfig.sh
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/checkConfig.sh	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/checkConfig.sh	(revision 21851)
@@ -0,0 +1,35 @@
+#!/bin/sh
+
+# This script check the configuration in the scripts directory
+
+# find the command called's root  e.g.  ./build/
+dir=`expr  match "$0" '\(.*\)checkConfig.sh'`
+#  if it we did not call ./  change to the directory we called
+if [ "$dir" != "./" ] ; then
+   if [ "$dir" != "" ] ;  then
+      echo changing to $dir
+      cd "$dir" ;
+   fi
+fi
+
+
+# Installer requires Java
+if [ "$JAVA_HOME" = "" ] ; then
+	echo Installer requires Java available from http://java.sun.com
+	echo If you have Java installed you may just need to set the variable JAVA_HOME
+	exit 1;
+fi
+
+# Installer from command line classpath
+CLASSPATH=./installlib/xercesImpl.jar
+CLASSPATH=$CLASSPATH:./installlib/xml-apis.jar
+CLASSPATH=$CLASSPATH:./installlib/ant-installer.jar
+CLASSPATH=$CLASSPATH:./installlib/ant-installer-ext.jar
+CLASSPATH=$CLASSPATH:./antlib/ant.jar
+CLASSPATH=$CLASSPATH:./antlib/ant-launcher.jar
+
+COMMAND=$JAVA_HOME/bin/java
+
+#echo $COMMAND -classpath $CLASSPATH  org.tp23.antinstaller.runtime.ExecInstall $1
+
+$COMMAND -classpath $CLASSPATH  org.tp23.antinstaller.runtime.ConfigurationLoader .
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/config/demo.properties
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/config/demo.properties	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/config/demo.properties	(revision 21851)
@@ -0,0 +1,7 @@
+#
+# Installtion properties
+# 
+TextProperty=@TextProperty@
+BooleanProperty=@BooleanProperty@
+Colour=@Colour@
+SelectedFile=@SelectedFile@
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/config/example-config.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/config/example-config.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/config/example-config.xml	(revision 21851)
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+
+<configuration>
+	<static-property value="Made by AntInstaller, by TP23"/> 
+	<dynamic-colour-property value="@Colour@"/> 
+	<dynamic-selectedfile-property value="@SelectedFile@"/> 
+	<dynamic-boolean-property value="@BooleanProperty@"/> 
+	<dynamic-text-property value="@TextProperty@"/> 
+</configuration>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/allclasses-frame.html
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/allclasses-frame.html	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/allclasses-frame.html	(revision 21851)
@@ -0,0 +1,31 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.4.2_01) on Tue Nov 02 02:03:53 CET 2004 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+All Classes
+</TITLE>
+
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+
+</HEAD>
+
+<BODY BGCOLOR="white">
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B>All Classes</B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%" SUMMARY="">
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="org/tp23/demo/Demonstration.html" title="class in org.tp23.demo" target="classFrame">Demonstration</A>
+<BR>
+</FONT></TD>
+</TR>
+</TABLE>
+
+</BODY>
+</HTML>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/allclasses-noframe.html
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/allclasses-noframe.html	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/allclasses-noframe.html	(revision 21851)
@@ -0,0 +1,31 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.4.2_01) on Tue Nov 02 02:03:53 CET 2004 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+All Classes
+</TITLE>
+
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+
+</HEAD>
+
+<BODY BGCOLOR="white">
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B>All Classes</B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%" SUMMARY="">
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="org/tp23/demo/Demonstration.html" title="class in org.tp23.demo">Demonstration</A>
+<BR>
+</FONT></TD>
+</TR>
+</TABLE>
+
+</BODY>
+</HTML>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/constant-values.html
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/constant-values.html	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/constant-values.html	(revision 21851)
@@ -0,0 +1,135 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.4.2_01) on Tue Nov 02 02:03:53 CET 2004 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Constant Field Values
+</TITLE>
+
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    parent.document.title="Constant Field Values";
+}
+</SCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Package</FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/tp23/demo/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="index.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="constant-values.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H1>
+Constant Field Values</H1>
+</CENTER>
+<HR SIZE="4" NOSHADE>
+<B>Contents</B><UL>
+</UL>
+
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Package</FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/tp23/demo/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="index.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="constant-values.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/deprecated-list.html
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/deprecated-list.html	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/deprecated-list.html	(revision 21851)
@@ -0,0 +1,131 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.4.2_01) on Tue Nov 02 02:03:53 CET 2004 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Deprecated List
+</TITLE>
+
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    parent.document.title="Deprecated List";
+}
+</SCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Package</FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/tp23/demo/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Deprecated</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="index.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="deprecated-list.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+<B>Deprecated API</B></H2>
+</CENTER>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Package</FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/tp23/demo/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Deprecated</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="index.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="deprecated-list.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/help-doc.html
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/help-doc.html	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/help-doc.html	(revision 21851)
@@ -0,0 +1,180 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.4.2_01) on Tue Nov 02 02:03:54 CET 2004 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+API Help
+</TITLE>
+
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    parent.document.title="API Help";
+}
+</SCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Package</FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/tp23/demo/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Help</B></FONT>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="index.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="help-doc.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H1>
+How This API Document Is Organized</H1>
+</CENTER>
+This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.<H3>
+Package</H3>
+<BLOCKQUOTE>
+
+<P>
+Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:<UL>
+<LI>Interfaces (italic)<LI>Classes<LI>Exceptions<LI>Errors</UL>
+</BLOCKQUOTE>
+<H3>
+Class/Interface</H3>
+<BLOCKQUOTE>
+
+<P>
+Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:<UL>
+<LI>Class inheritance diagram<LI>Direct Subclasses<LI>All Known Subinterfaces<LI>All Known Implementing Classes<LI>Class/interface declaration<LI>Class/interface description
+<P>
+<LI>Nested Class Summary<LI>Field Summary<LI>Constructor Summary<LI>Method Summary
+<P>
+<LI>Field Detail<LI>Constructor Detail<LI>Method Detail</UL>
+Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.</BLOCKQUOTE>
+<H3>
+Tree (Class Hierarchy)</H3>
+<BLOCKQUOTE>
+There is a <A HREF="overview-tree.html">Class Hierarchy</A> page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with <code>java.lang.Object</code>. The interfaces do not inherit from <code>java.lang.Object</code>.<UL>
+<LI>When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.<LI>When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.</UL>
+</BLOCKQUOTE>
+<H3>
+Deprecated API</H3>
+<BLOCKQUOTE>
+The <A HREF="deprecated-list.html">Deprecated API</A> page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.</BLOCKQUOTE>
+<H3>
+Index</H3>
+<BLOCKQUOTE>
+The <A HREF="index-all.html">Index</A> contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.</BLOCKQUOTE>
+<H3>
+Prev/Next</H3>
+These links take you to the next or previous class, interface, package, or related page.<H3>
+Frames/No Frames</H3>
+These links show and hide the HTML frames.  All pages are available with or without frames.
+<P>
+<H3>
+Serialized Form</H3>
+Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.
+<P>
+<FONT SIZE="-1">
+<EM>
+This help file applies to API documentation generated using the standard doclet.</EM>
+</FONT>
+<BR>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Package</FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/tp23/demo/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Help</B></FONT>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="index.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="help-doc.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/index-all.html
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/index-all.html	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/index-all.html	(revision 21851)
@@ -0,0 +1,147 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.4.2_01) on Tue Nov 02 02:03:53 CET 2004 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Index
+</TITLE>
+
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    parent.document.title="Index";
+}
+</SCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Package</FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/tp23/demo/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Index</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="index.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="index-all.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<A HREF="#_D_">D</A> <A HREF="#_M_">M</A> <A HREF="#_O_">O</A> <HR>
+<A NAME="_D_"><!-- --></A><H2>
+<B>D</B></H2>
+<DL>
+<DT><A HREF="org/tp23/demo/Demonstration.html" title="class in org.tp23.demo"><B>Demonstration</B></A> - class org.tp23.demo.<A HREF="org/tp23/demo/Demonstration.html" title="class in org.tp23.demo">Demonstration</A>.<DD>Title: Example Application<DT><A HREF="org/tp23/demo/Demonstration.html#Demonstration()"><B>Demonstration()</B></A> - 
+Constructor for class org.tp23.demo.<A HREF="org/tp23/demo/Demonstration.html" title="class in org.tp23.demo">Demonstration</A>
+<DD>&nbsp;
+</DL>
+<HR>
+<A NAME="_M_"><!-- --></A><H2>
+<B>M</B></H2>
+<DL>
+<DT><A HREF="org/tp23/demo/Demonstration.html#main(java.lang.String[])"><B>main(String[])</B></A> - 
+Static method in class org.tp23.demo.<A HREF="org/tp23/demo/Demonstration.html" title="class in org.tp23.demo">Demonstration</A>
+<DD>&nbsp;
+</DL>
+<HR>
+<A NAME="_O_"><!-- --></A><H2>
+<B>O</B></H2>
+<DL>
+<DT><A HREF="org/tp23/demo/package-summary.html"><B>org.tp23.demo</B></A> - package org.tp23.demo<DD>&nbsp;</DL>
+<HR>
+<A HREF="#_D_">D</A> <A HREF="#_M_">M</A> <A HREF="#_O_">O</A> 
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Package</FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/tp23/demo/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Index</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="index.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="index-all.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/index.html
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/index.html	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/index.html	(revision 21851)
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc on Tue Nov 02 02:03:53 CET 2004-->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Generated Documentation (Untitled)
+</TITLE>
+</HEAD>
+<FRAMESET cols="20%,80%">
+<FRAME src="allclasses-frame.html" name="packageFrame" title="All classes and interfaces (except non-static nested types)">
+<FRAME src="org/tp23/demo/package-summary.html" name="classFrame" title="Package, class and interface descriptions">
+<NOFRAMES>
+<H2>
+Frame Alert</H2>
+
+<P>
+This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
+<BR>
+Link to<A HREF="org/tp23/demo/package-summary.html">Non-frame version.</A>
+</NOFRAMES>
+</FRAMESET>
+</HTML>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/org/tp23/demo/Demonstration.html
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/org/tp23/demo/Demonstration.html	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/org/tp23/demo/Demonstration.html	(revision 21851)
@@ -0,0 +1,263 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.4.2_01) on Tue Nov 02 02:03:53 CET 2004 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Demonstration
+</TITLE>
+
+<META NAME="keywords" CONTENT="org.tp23.demo.Demonstration class">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    parent.document.title="Demonstration";
+}
+</SCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV CLASS&nbsp;
+&nbsp;NEXT CLASS</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="Demonstration.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL:&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+org.tp23.demo</FONT>
+<BR>
+Class Demonstration</H2>
+<PRE>
+java.lang.Object
+  <IMG SRC="../../../resources/inherit.gif" ALT="extended by"><B>org.tp23.demo.Demonstration</B>
+</PRE>
+<HR>
+<DL>
+<DT>public class <B>Demonstration</B><DT>extends java.lang.Object</DL>
+
+<P>
+<p>Title: Example Application</p>
+ <p>Description: Prints Hello World, trys to do it in a pop up box
+ if a Throwable is thrown (e.g. no X) it prints to System.out</p>
+ <p>Copyright: Copyright (c) 2004</p>
+ <p>Company: tp23</p>
+<P>
+
+<P>
+<DL>
+<DT><B>Version:</B></DT>
+  <DD>1.0</DD>
+<DT><B>Author:</B></DT>
+  <DD>Paul Hinds</DD>
+</DL>
+<HR>
+
+<P>
+<!-- ======== NESTED CLASS SUMMARY ======== -->
+
+
+<!-- =========== FIELD SUMMARY =========== -->
+
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../org/tp23/demo/Demonstration.html#Demonstration()">Demonstration</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/tp23/demo/Demonstration.html#main(java.lang.String[])">main</A></B>(java.lang.String[]&nbsp;args)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Methods inherited from class java.lang.Object</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+
+<!-- ============ FIELD DETAIL =========== -->
+
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=1><FONT SIZE="+2">
+<B>Constructor Detail</B></FONT></TD>
+</TR>
+</TABLE>
+
+<A NAME="Demonstration()"><!-- --></A><H3>
+Demonstration</H3>
+<PRE>
+public <B>Demonstration</B>()</PRE>
+<DL>
+</DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=1><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TD>
+</TR>
+</TABLE>
+
+<A NAME="main(java.lang.String[])"><!-- --></A><H3>
+main</H3>
+<PRE>
+public static void <B>main</B>(java.lang.String[]&nbsp;args)</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV CLASS&nbsp;
+&nbsp;NEXT CLASS</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="Demonstration.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL:&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/org/tp23/demo/package-frame.html
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/org/tp23/demo/package-frame.html	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/org/tp23/demo/package-frame.html	(revision 21851)
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.4.2_01) on Tue Nov 02 02:03:53 CET 2004 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+org.tp23.demo
+</TITLE>
+
+<META NAME="keywords" CONTENT="org.tp23.demo package">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
+
+
+</HEAD>
+
+<BODY BGCOLOR="white">
+<FONT size="+1" CLASS="FrameTitleFont">
+<A HREF="../../../org/tp23/demo/package-summary.html" target="classFrame">org.tp23.demo</A></FONT>
+<TABLE BORDER="0" WIDTH="100%" SUMMARY="">
+<TR>
+<TD NOWRAP><FONT size="+1" CLASS="FrameHeadingFont">
+Classes</FONT>&nbsp;
+<FONT CLASS="FrameItemFont">
+<BR>
+<A HREF="Demonstration.html" title="class in org.tp23.demo" target="classFrame">Demonstration</A></FONT></TD>
+</TR>
+</TABLE>
+
+
+</BODY>
+</HTML>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/org/tp23/demo/package-summary.html
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/org/tp23/demo/package-summary.html	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/org/tp23/demo/package-summary.html	(revision 21851)
@@ -0,0 +1,145 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.4.2_01) on Tue Nov 02 02:03:53 CET 2004 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+org.tp23.demo
+</TITLE>
+
+<META NAME="keywords" CONTENT="org.tp23.demo package">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    parent.document.title="org.tp23.demo";
+}
+</SCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Package</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV PACKAGE&nbsp;
+&nbsp;NEXT PACKAGE</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="package-summary.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<H2>
+Package org.tp23.demo
+</H2>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Class Summary</B></FONT></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../org/tp23/demo/Demonstration.html" title="class in org.tp23.demo">Demonstration</A></B></TD>
+<TD>Title: Example Application</TD>
+</TR>
+</TABLE>
+&nbsp;
+
+<P>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Package</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV PACKAGE&nbsp;
+&nbsp;NEXT PACKAGE</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="package-summary.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/org/tp23/demo/package-tree.html
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/org/tp23/demo/package-tree.html	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/org/tp23/demo/package-tree.html	(revision 21851)
@@ -0,0 +1,139 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.4.2_01) on Tue Nov 02 02:03:53 CET 2004 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+org.tp23.demo Class Hierarchy
+</TITLE>
+
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    parent.document.title="org.tp23.demo Class Hierarchy";
+}
+</SCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="package-tree.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+Hierarchy For Package org.tp23.demo
+</H2>
+</CENTER>
+<H2>
+Class Hierarchy
+</H2>
+<UL>
+<LI TYPE="circle">class java.lang.Object<UL>
+<LI TYPE="circle">class org.tp23.demo.<A HREF="../../../org/tp23/demo/Demonstration.html" title="class in org.tp23.demo"><B>Demonstration</B></A></UL>
+</UL>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="package-tree.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/overview-tree.html
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/overview-tree.html	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/overview-tree.html	(revision 21851)
@@ -0,0 +1,141 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.4.2_01) on Tue Nov 02 02:03:53 CET 2004 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Class Hierarchy
+</TITLE>
+
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    parent.document.title="Class Hierarchy";
+}
+</SCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Package</FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="index.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="overview-tree.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+Hierarchy For All Packages</H2>
+</CENTER>
+<DL>
+<DT><B>Package Hierarchies:</B><DD><A HREF="org/tp23/demo/package-tree.html">org.tp23.demo</A></DL>
+<HR>
+<H2>
+Class Hierarchy
+</H2>
+<UL>
+<LI TYPE="circle">class java.lang.Object<UL>
+<LI TYPE="circle">class org.tp23.demo.<A HREF="org/tp23/demo/Demonstration.html" title="class in org.tp23.demo"><B>Demonstration</B></A></UL>
+</UL>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Package</FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="index.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="overview-tree.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/package-list
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/package-list	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/package-list	(revision 21851)
@@ -0,0 +1,1 @@
+org.tp23.demo
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/packages.html
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/packages.html	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/packages.html	(revision 21851)
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.4.2_01) on Tue Nov 02 02:03:53 CET 2004 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+
+</TITLE>
+
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+
+</HEAD>
+
+<BODY BGCOLOR="white">
+
+<BR>
+
+<BR>
+
+<BR>
+<CENTER>
+The front page has been relocated.Please see:
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A HREF="index.html">Frame version</A>
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A HREF="org/tp23/demo/package-summary.html">Non-frame version.</A></CENTER>
+
+</BODY>
+</HTML>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/stylesheet.css
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/stylesheet.css	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/doc/stylesheet.css	(revision 21851)
@@ -0,0 +1,29 @@
+/* Javadoc style sheet */
+
+/* Define colors, fonts and other style attributes here to override the defaults */
+
+/* Page background color */
+body { background-color: #FFFFFF }
+
+/* Headings */
+h1 { font-size: 145% }
+
+/* Table colors */
+.TableHeadingColor     { background: #CCCCFF } /* Dark mauve */
+.TableSubHeadingColor  { background: #EEEEFF } /* Light mauve */
+.TableRowColor         { background: #FFFFFF } /* White */
+
+/* Font used in left-hand frame lists */
+.FrameTitleFont   { font-size: 100%; font-family: Helvetica, Arial, sans-serif }
+.FrameHeadingFont { font-size:  90%; font-family: Helvetica, Arial, sans-serif }
+.FrameItemFont    { font-size:  90%; font-family: Helvetica, Arial, sans-serif }
+
+/* Navigation bar fonts and colors */
+.NavBarCell1    { background-color:#EEEEFF;} /* Light mauve */
+.NavBarCell1Rev { background-color:#00008B;} /* Dark Blue */
+.NavBarFont1    { font-family: Arial, Helvetica, sans-serif; color:#000000;}
+.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;}
+
+.NavBarCell2    { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;}
+.NavBarCell3    { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;}
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/install.cmd
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/install.cmd	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/install.cmd	(revision 21851)
@@ -0,0 +1,44 @@
+@echo off
+REM #!/bin/sh
+if  "%JAVA_HOME%" == "" goto nojava
+
+setlocal
+
+set AI_LIB=..\lib
+set ANT_LIB=..\antlib
+set CLASSPATH=%AI_LIB%\xercesImpl.jar;%AI_LIB%\xml-apis.jar;%AI_LIB%\ant-installer.jar
+set CLASSPATH=%CLASSPATH%;%AI_LIB%\jgoodies-edited-1_2_2.jar
+set CLASSPATH=%CLASSPATH%;%ANT_LIB%\ant.jar;%ANT_LIB%\ant-launcher.jar
+set CLASSPATH=%CLASSPATH%;.\installclasspath
+
+
+
+REM set CLASSPATH=%CLASSPATH%;.\installlib\ant-weblogic.jar;.\installlib\ant-javamail.jar
+
+set INTERFACE=default
+set COMMAND=%JAVA_HOME%\bin\java
+if "%1" == "text" goto settext
+if "%1" == "swing" goto setswing
+goto install
+
+:settext
+set COMMAND=%JAVA_HOME%\bin\java
+set INTERFACE=text
+goto install
+
+:setswing
+set COMMAND=%JAVA_HOME%\bin\javaw
+set INTERFACE=swing
+goto install
+
+:install
+
+start "AntInstaller" "%COMMAND%" -classpath %CLASSPATH%  org.tp23.antinstaller.runtime.ExecInstall %INTERFACE% .
+goto end
+
+:nojava
+echo you must install java to run this applicaiton
+goto end
+
+endlocal
+:end
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/install.sh
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/install.sh	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/install.sh	(revision 21851)
@@ -0,0 +1,37 @@
+#!/bin/sh
+
+# find the command called's root  e.g.  ./build/
+dir=`expr  match "$0" '\(.*\)install.sh'`
+#  if it we did not call ./  change to the directory we called
+if [ "$dir" != "./" ] ; then
+   if [ "$dir" != "" ] ;  then
+      echo changing to $dir
+      cd "$dir" ;
+   fi
+fi
+
+
+
+if [ "$JAVA_HOME" = "" ] ; then
+	echo set JAVA_HOME;
+	exit 1;
+fi
+
+AI_LIB=../lib
+ANT_LIB=../antlib
+CLASSPATH=${AI_LIB}/xercesImpl.jar:${AI_LIB}/xml-apis.jar:${AI_LIB}/ant-installer.jar
+CLASSPATH=$CLASSPATH:${AI_LIB}/jgoodies-edited-1_2_2.jar
+CLASSPATH=$CLASSPATH:${ANT_LIB}/ant.jar:${ANT_LIB}/ant-launcher.jar
+CLASSPATH=$CLASSPATH:./installclasspath
+
+
+### add other ant jars required here and add them to the install package
+#CLASSPATH=$CLASSPATH:./installlib/ant-weblogic.jar:./installlib/ant-javamail.jar
+
+COMMAND=$JAVA_HOME/bin/java
+INTERFACE=default
+if [ "$1" != "" ] ; then
+	INTERFACE=$1;
+fi
+
+$COMMAND -classpath $CLASSPATH  org.tp23.antinstaller.runtime.ExecInstall $INTERFACE .
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/installclasspath/resources/GPL.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/installclasspath/resources/GPL.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/installclasspath/resources/GPL.txt	(revision 21851)
@@ -0,0 +1,148 @@
+GNU LESSER GENERAL PUBLIC LICENSE
+Version 2.1, February 1999
+
+Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.]
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
+
+This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
+
+When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
+
+To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
+
+For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
+
+We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
+
+To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
+
+Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
+
+Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
+
+When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
+
+We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
+
+For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
+
+In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
+
+Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
+
+The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
+
+GNU LESSER GENERAL PUBLIC LICENSE
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
+
+A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
+
+The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
+
+"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
+
+Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
+
+1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
+
+You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
+
+a) The modified work must itself be a software library.
+
+b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
+
+c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
+
+d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
+
+(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
+
+3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
+
+Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
+
+This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
+
+4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
+
+If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
+
+5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
+
+However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
+
+When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
+
+If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
+
+Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
+
+6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
+
+You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
+
+a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
+
+b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
+
+c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
+
+d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
+
+e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
+
+For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
+
+It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
+
+7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
+
+a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
+
+b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
+
+8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
+
+9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
+
+10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
+
+11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
+
+This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
+
+12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
+
+13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
+
+14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/installer/antinstall-config.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/installer/antinstall-config.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/installer/antinstall-config.xml	(revision 21851)
@@ -0,0 +1,133 @@
+<?xml version="1.0"?>
+<!DOCTYPE installer PUBLIC "-//tp23 //DTD Ant Installer Config//EN" "http://antinstaller.sf.net/dtd/antinstall-config-0.7.dtd">
+<!--
+
+This is an example installer from which you can start a project
+Edit this file to select the properties you want decided, at the end
+of the installation screen the properties will be available in a file
+in the current directory for your ant script
+
+
+lookAndFeel="com.jgoodies.plaf.windows.ExtWindowsLookAndFeel"  - not recommended since it is not linux compatible due to Micro$oft License restrictions
+
+lookAndFeel="net.sourceforge.mlf.metouia.MetouiaLookAndFeel"  - good, and cross platform
+
+lookAndFeel="com.jgoodies.plaf.plastic.Plastic3DLookAndFeel"  - good, and cross platform
+
+lookAndFeel="com.jgoodies.plaf.plastic.PlasticXPLookAndFeel"  - good, and cross platform
+
+lookAndFeel="com.jgoodies.plaf.plastic.PlasticLookAndFeel" - good but flat, and cross platform
+-->
+
+<!--
+
+defaultImageResource,windowIcon,resource and imageResource load from the classpath
+the installer script should put the locations of these resources on the classpath
+
+-->
+<installer
+			ui="swing,text"
+			verbose="false"
+			lookAndFeel="org.tp23.jgoodies.plaf.plastic.PlasticXPLookAndFeel"
+			name="Demo Installer"
+			windowIcon="/resources/gkmain_inv.png"
+			defaultImageResource="/resources/greens.png"
+			minJavaVersion="1.4">
+	<!--  each page element represents a page of the installer -->
+	<page
+			type="input"
+			name="intro"
+			displayText="Welcome to the example installer program"
+			imageResource="/resources/greens.png">
+		<comment
+				displayText="This is a demo install"
+				title="true"/>
+		<comment
+				displayText="The application installed is yer typical Hello World"
+				bold="true"/>
+		<comment
+				displayText="There is not much more to be said really."/>
+	</page>
+	<!--  type="license" shows a license page to click through -->
+	<page
+			type="license"
+			name="license"
+			displayText="License conditions"
+			resource="/resources/GPL.txt"
+			imageResource="/resources/rockstiles.png">
+	</page>
+	<!--  type="input" shows a list of editable options for the installer -->
+	<page
+			type="input"
+			name="properties"
+			displayText="Required install options">
+		<directory
+				property="installDir"
+				defaultValue="/usr/local/demoapp"
+				defaultValueWin="${env.ProgramFiles}\demoapp"
+				displayText="Select an installation directory"
+				create="true"/>
+	</page>
+	<page
+			type="input"
+			name="selector"
+			displayText="Components to install">
+		<comment
+				displayText="Choose the components you want to install"
+				bold="true"/>
+		<target
+			displayText="Core components"
+			target="default"
+			defaultValue="true"
+			force="true"/>
+		<target
+			displayText="Source code"
+			target="tgsrc"
+			defaultValue="false"/>
+		<target
+			displayText="Documentation"
+			target="tgdoc"
+			defaultValue="true"/>
+	</page>
+	<!--  These are some other input types -->
+	<page
+			type="input"
+			name="other-input-types"
+			displayText="Pointless install options">
+		<text
+				property="TextProperty"
+				defaultValue="blah blah"
+				displayText="Enter any text"/>
+		<checkbox
+				property="BooleanProperty"
+				displayText="Make a boolean decision"
+				defaultValue="true"
+				force="false"/>
+		<select
+				property="Colour"
+				defaultValue="#FF0000"
+				displayText="Choose the option"
+				explanatoryText="This field can be used on any input field to render further descriptive text">
+			<option text="Red" value="#FF0000"/>
+			<option text="Green" value="#00FF00"/>
+			<option text="Blue" value="#0000FF"/>
+		</select>
+		<file
+				property="SelectedFile"
+				defaultValue="/usr/tomcat/webapps/default/WEB-INF/web.xml"
+				defaultValueWin="C:\autoexec.bat"
+				displayText="Select a file"
+				checkExists="false"/>
+	</page>
+	<!--  page type="progress" shows a progress page with the install button 
+				Its target is set to cleanuptarget since it is the last page this target will be run last-->
+	<page
+			type="progress"
+			name="progress"
+			showTargets="true"
+			displayText="Installation progress"
+			target="cleanuptarget">
+	</page>
+</installer>
+
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/installer/build.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/installer/build.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/installer/build.xml	(revision 21851)
@@ -0,0 +1,107 @@
+<?xml version="1.0"?>
+<!--
+
+This is the build.xml run by AntInstaller for the demo app
+
+It is a normal Ant build script, but remember that it is run in a similar
+way to running
+> ant -buildfile build.xml default,tgdoc,tgsrc
+
+this is targets selected in the selector page have dependencies those
+dependencies may be run once for each target selected
+e.g. if tgdoc had depends="default" and the installer passed
+default,tgdoc  ant would run default then default again then tgdoc
+
+To avoid this problem targets can be forced in the gui using the following
+input in the page to choose components to install
+		<input
+			type="target"
+			displayText="Core components"
+			target="default"
+			defaultValue="true"
+			force="true"/>
+
+-->
+
+<project name="Installation Build"  default=""  basedir="${basedir}">
+
+	<!-- this is required to pick up the properties generated during the install pages -->
+	<property file="${basedir}/ant.install.properties"/>
+
+
+	<target name="default" depends="">
+		<echo message="Colour selected [${Colour}]"/>
+		<echo message="Installation Directory [${installDir}]"/>
+		<echo message="Entered Property [${TextProperty}]"/>
+		<echo message="Checkbox Property [${BooleanProperty}]"/>
+		<echo message="File [${SelectedFile}]"/>
+		<!-- this is an exagerated example 
+		  clearly 
+			<unzip src="installpack.zip" dest="${basedir}/temp"/>
+			<replace ...
+			would be sufficient
+		-->
+		<mkdir dir="${basedir}/temp"/>
+		<unzip src="installpack.zip" dest="${basedir}/temp"/>
+		<mkdir dir="${installDir}"/>
+		<mkdir dir="${installDir}/classes"/>
+		<mkdir dir="${installDir}/config"/>
+		<mkdir dir="${installDir}/lib"/>
+		<copy 
+			  file="${basedir}/temp/bin/run.sh"  
+			  tofile="${installDir}/run.sh" 
+			  overwrite="true"/>
+		<copy 
+			  file="${basedir}/temp/bin/run.cmd"  
+			  tofile="${installDir}/run.cmd" 
+			  overwrite="true"/>
+		<chmod file="${installDir}/run.sh" perm="774"/>
+		<copy 
+			  file="${basedir}/temp/README.txt" 
+			  todir="${installDir}" 
+			  overwrite="true"/>
+		<copy 
+			  todir="${installDir}/classes" 
+			  overwrite="true">
+			<fileset dir="${basedir}/temp/classes"/>
+		</copy>
+		<copy 
+			  todir="${installDir}/config" 
+			  overwrite="true">
+			<fileset dir="${basedir}/temp/config"/>
+		</copy>
+		<replace file="${installDir}/config/example-config.xml">
+			<replacefilter token="@TextProperty@"    value="${TextProperty}"/>
+			<replacefilter token="@SelectedFile@"    value="${SelectedFile}"/>
+			<replacefilter token="@Colour@"          value="${Colour}"/>
+			<replacefilter token="@BooleanProperty@" value="${BooleanProperty}"/>
+		</replace>
+		<replace file="${installDir}/config/demo.properties">
+			<replacefilter token="@TextProperty@"    value="${TextProperty}"/>
+			<replacefilter token="@SelectedFile@"    value="${SelectedFile}"/>
+			<replacefilter token="@Colour@"          value="${Colour}"/>
+			<replacefilter token="@BooleanProperty@" value="${BooleanProperty}"/>
+		</replace>
+	</target>
+
+	<target name="tgdoc" depends="">
+		<echo message="Installing documentation files"/>
+		<mkdir dir="${installDir}/doc"/>
+		<copy todir="${installDir}/doc" overwrite="true">
+			<fileset dir="${basedir}/temp/doc"/>
+		</copy>
+	</target>
+
+	<target name="tgsrc" depends="">
+		<echo message="Installing Source files"/>
+		<mkdir dir="${installDir}/src"/>
+		<copy todir="${installDir}/src" overwrite="true">
+			<fileset dir="${basedir}/temp/src"/>
+		</copy>
+	</target>
+
+	<target name="cleanuptarget" depends="">
+		<delete dir="${basedir}/temp">
+		</delete>
+	</target>
+</project>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/src/org/tp23/demo/Demonstration.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/src/org/tp23/demo/Demonstration.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/demo/src/org/tp23/demo/Demonstration.java	(revision 21851)
@@ -0,0 +1,85 @@
+package org.tp23.demo;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Iterator;
+import java.util.Properties;
+
+import javax.swing.ImageIcon;
+import javax.swing.JOptionPane;
+import javax.swing.JFrame;
+
+/**
+ *
+ * <p>Title: Example Application</p>
+ * <p>Description: Prints Hello World, trys to do it in a pop up box
+* if a Throwable is thrown (e.g. no X) it prints to System.out</p>
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @author Paul Hinds
+ * @version 1.0
+ */
+public class Demonstration {
+	private static ImageIcon icon ;
+	static{
+		try {
+			InputStream in = Demonstration.class.getResourceAsStream("/resources/demo.png");
+			byte[] data = new byte[11437];
+			for (int i = 0; i < data.length; i++) {
+				data[i]=(byte)in.read();
+			}
+			icon = new ImageIcon(data);
+		}
+		catch (IOException e) {
+			e.printStackTrace();
+		}		
+	}
+
+	public static void main(String[] args) {
+		try{
+			JOptionPane.showMessageDialog(null,
+							"Demo Application \n\n" +
+							"Deployed with: "+
+							"http://antinstaller.sourceforge.net \n" +
+							"Built by: "+
+							"http://ant.apache.org \n" +
+							"See also: "+
+							"http://httpfileserver.sourceforge.net \n\n" +
+							"This project is Apache licensed \n\n" +
+							"Properties selected while installing \n\n" +
+							initProps(),
+							"About - Demo App",
+							JOptionPane.INFORMATION_MESSAGE,
+							icon);
+		}catch(Throwable t){
+			System.out.println("Hello World");
+		}
+		System.exit(0);
+	}
+	private static String initProps() {
+		StringBuffer userProperties = new StringBuffer();
+		try {
+			Properties props = new Properties();
+			props.load(new FileInputStream(new File("./config/demo.properties")));
+			Iterator iter = props.keySet().iterator();
+			while(iter.hasNext()){
+				String key = (String)iter.next();
+				userProperties.append(key)
+				.append("=")
+				.append(props.getProperty(key))
+				.append('\n');
+			}
+		}
+		catch (FileNotFoundException e) {
+			e.printStackTrace();
+		}
+		catch (IOException e) {
+			e.printStackTrace();
+		}
+		return userProperties.toString();
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/README.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/README.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/README.txt	(revision 21851)
@@ -0,0 +1,21 @@
+AntInstaller Image Readme
+
+
+This pack is spearate from the main AntInstaller download
+for two reasons
+1) to keep the size of the ant-installer.jar down
+2) to allow inclusion of the (excelent) crystal icons
+licensed under LGPL
+
+All default Icons and images are licensed under Apache2.0 
+	by Paul Hinds
+
+Crystal Icons
+	http://www.everaldo.com/crystal.html 
+
+N.B. everaldo produces comercial icons as well it should 
+not be assumed that everaldo icons are LGPL generally.  
+Icons in this pack are based on icons included with KDE 
+which are LGPL.  
+Personal/Business contact with everaldo send direct 
+e-mail to everaldo@everaldo.com
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/extract-images/crystal-images.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/extract-images/crystal-images.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/extract-images/crystal-images.txt	(revision 21851)
@@ -0,0 +1,4 @@
+Crystal Icons from KDE install
+
+http://www.everaldo.com/crystal.html
+License : LGPL
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/extract-images/default-images.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/extract-images/default-images.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/extract-images/default-images.txt	(revision 21851)
@@ -0,0 +1,5 @@
+Default Icons: Paul Hinds
+
+http://java.riereta.net
+
+License: Apache 2.0
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/navicons/amaranth/resources/icons/LICENSE
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/navicons/amaranth/resources/icons/LICENSE	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/navicons/amaranth/resources/icons/LICENSE	(revision 21851)
@@ -0,0 +1,514 @@
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
+ 
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/navicons/bluecurve/resources/icons/LICENSE
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/navicons/bluecurve/resources/icons/LICENSE	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/navicons/bluecurve/resources/icons/LICENSE	(revision 21851)
@@ -0,0 +1,56 @@
+The Fedora Project
+
+Individual Contributor License Agreement (CLA)
+
+[WWW] http://fedoraproject.org/wiki/Legal/Licenses/CLA
+
+Thank you for your interest in The Fedora Project (the "Project"). In order to clarify the intellectual property license granted with Contributions from any person or entity, Red Hat, Inc. ("Red Hat"), as maintainer of the Project, must have a Contributor License Agreement (CLA) on file that has been signed by each Contributor, indicating agreement to the license terms below. This license is for Your protection as a Contributor as well as the protection of the Project and its users; it does not change your rights to use your own Contributions for any other purpose.
+
+You and the Project hereby accept and agree to the following terms and conditions:
+
+    *
+
+      1. Contributors and Contributions.
+          o
+
+            A. The Project and any individual or legal entity that voluntarily submits to the Project a Contribution are collectively addressed herein as "Contributors". For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+          o
+
+            B. A "Contribution" is any original work, including any modification or addition to an existing work, that has been submitted for inclusion in, or documentation of, any of the products owned or managed by the Project, where such work originates from that particular Contributor or from some entity acting on behalf of that Contributor.
+          o
+
+            C. A Contribution is "submitted" when any form of electronic, verbal, or written communication is sent to the Project, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Project for the purpose of discussing or improving software or documentation of the Project, but excluding communication that is conspicuously marked or otherwise designated in writing by you as "Not a Contribution."
+          o
+
+            D. Any Contribution submitted by you to the Project shall be under the terms and conditions of this License, without any additional terms or conditions, unless you explicitly state otherwise in the submission.
+    *
+
+      2. Contributor Grant of License. You hereby grant to Red Hat, Inc., on behalf of the Project, and to recipients of software distributed by the Project:
+          o
+
+            (a) a perpetual, non-exclusive, worldwide, fully paid-up, royalty free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute your Contribution and such derivative works; and,
+          o
+
+            (b) a perpetual, non-exclusive, worldwide, fully paid-up, royalty free, irrevocable (subject to Section 3) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer your Contribution and derivative works thereof, where such license applies only to those patent claims licensable by you that are necessarily infringed by your Contribution alone or by combination of your Contribution with the work to which you submitted the Contribution. Except for the license granted in this section, you reserve all right, title and interest in and to your Contributions.
+    *
+
+      3. Reciprocity. As of the date any such litigation is filed, your patent grant shall immediately terminate with respect to any party that institutes patent litigation against you (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the work to which you have contributed, constitutes direct or contributory patent infringement.
+    *
+
+      4. You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to the Project, or that your employer has executed a separate Corporate CLA with the Project.
+    *
+
+      5. You represent that each of your Contributions is your original creation (see section 7 for submissions on behalf of others). You represent that your Contribution submission(s) include complete details of any third-party license or other restriction (including, but not limited to, related copyright, patents and trademarks) of which you are personally aware and which are associated with any part of your Contribution.
+    *
+
+      6. You are not expected to provide support for your Contributions, except to the extent you desire to provide support. You may provide support for free, for a fee, or not at all. Your Contributions are provided on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE.
+    *
+
+      7. Should you wish to submit work that is not your original creation, you may submit it to the Project separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]".
+    *
+
+      8. You agree to notify the Project of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect.
+    *
+
+      9. The Project is under no obligations to accept and include every contribution.
+ 
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/navicons/crystalsvg/resources/icons/LICENSE
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/navicons/crystalsvg/resources/icons/LICENSE	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/navicons/crystalsvg/resources/icons/LICENSE	(revision 21851)
@@ -0,0 +1,12 @@
+This copyright and license notice covers the images in this directory.
+Note the license notice contains an add-on.
+
+KDE Crystal theme icons.
+Copyright (C) 2002 and following years KDE Artists
+This library is free software; you can redistribute it and/or modify it under
+the terms of the GNU Lesser General Public License as published by the Free
+Software Foundation, version 2.1 of the License.
+
+This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+License for more details. 
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/navicons/eclipse/resources/icons/LICENSE
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/navicons/eclipse/resources/icons/LICENSE	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/navicons/eclipse/resources/icons/LICENSE	(revision 21851)
@@ -0,0 +1,86 @@
+Eclipse Public License - v 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENTâS ACCEPTANCE OF THIS AGREEMENT.
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+    a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
+    b) in the case of each subsequent Contributor:
+
+    i)changes to the Program, and
+
+    ii)additions to the Program;
+
+    where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributorâs behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
+
+2. GRANT OF RIGHTS
+
+a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
+
+b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
+
+c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipientâs responsibility to acquire that license before distributing the Program.
+
+d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
+
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
+
+    a) it complies with the terms and conditions of this Agreement; and
+
+    b) its license agreement:
+
+    i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
+
+    ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
+
+    iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
+
+    iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
+
+When the Program is made available in source code form:
+
+    a) it must be made available under this Agreement; and
+
+    b) a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained within the Program.
+
+Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributorâs responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipientâs patent(s), then such Recipientâs rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
+
+All Recipientâs rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipientâs rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipientâs obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. 
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/navicons/krystaline/resources/icons/LICENSE
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/navicons/krystaline/resources/icons/LICENSE	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/navicons/krystaline/resources/icons/LICENSE	(revision 21851)
@@ -0,0 +1,513 @@
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/resources/LICENSE-ant-install.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/resources/LICENSE-ant-install.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/resources/LICENSE-ant-install.txt	(revision 21851)
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright 2005 Paul Hinds
+
+   Licensed 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.
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/titlebars/default-images.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/titlebars/default-images.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/titlebars/default-images.txt	(revision 21851)
@@ -0,0 +1,5 @@
+Default Icons: Paul Hinds
+
+http://java.riereta.net
+
+License: Apache 2.0
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/tool-credits.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/tool-credits.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/images/tool-credits.txt	(revision 21851)
@@ -0,0 +1,17 @@
+
+   <ant-installer> 
+      _-------_ 
+      \ ()0o< / 
+       \ /|\ /
+        \   /
+         \ /
+          Â·
+Default icons created with
+
+     - inkscape - 
+http://www.inkscape.org
+
+   - and the gimp -
+  http://www.gimp.org
+
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/kde-icons/antinstaller-demo.desktop
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/kde-icons/antinstaller-demo.desktop	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/kde-icons/antinstaller-demo.desktop	(revision 21851)
@@ -0,0 +1,14 @@
+[Desktop Entry]
+Comment=AntInstaller Demo
+Path=@installDir@
+Icon=@installDir@/kde-icons/AntInstaller.png
+Exec=java -jar '@installDir@/demo/artifacts/demo-installer.jar'
+Name=AntInstaller Demo
+StartupNotify=true
+Terminal=0
+TerminalOptions=
+Type=Application
+Encoding=UTF-8
+X-KDE-SubstituteUID=false
+X-KDE-Username=
+Categories=Development;Java
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/kde-icons/antinstaller-docs.desktop
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/kde-icons/antinstaller-docs.desktop	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/kde-icons/antinstaller-docs.desktop	(revision 21851)
@@ -0,0 +1,14 @@
+[Desktop Entry]
+Comment=AntInstaller Docs
+Path=@installDir@
+Icon=@installDir@/kde-icons/AntInstaller.png
+Exec=kfmclient exec '@installDir@/web/index.html'
+Name=AntInstaller Docs
+StartupNotify=true
+Terminal=0
+TerminalOptions=
+Type=Application
+Encoding=UTF-8
+X-KDE-SubstituteUID=false
+X-KDE-Username=
+Categories=Development;Java
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/kde-icons/antinstaller-wizard.desktop
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/kde-icons/antinstaller-wizard.desktop	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/kde-icons/antinstaller-wizard.desktop	(revision 21851)
@@ -0,0 +1,14 @@
+[Desktop Entry]
+Comment=AntInstaller Project Wizard
+Path=@installDir@
+Icon=@installDir@/kde-icons/AntInstaller.png
+Exec='@installDir@/wizard.sh'
+Name=AntInstaller Wizard
+StartupNotify=true
+Terminal=0
+TerminalOptions=
+Type=Application
+Encoding=UTF-8
+X-KDE-SubstituteUID=false
+X-KDE-Username=
+Categories=Development;Java
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/lib/LICENSE-ant-install.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/lib/LICENSE-ant-install.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/lib/LICENSE-ant-install.txt	(revision 21851)
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright 2005 Paul Hinds
+
+   Licensed 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.
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/lib/LICENSE-ant.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/lib/LICENSE-ant.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/lib/LICENSE-ant.txt	(revision 21851)
@@ -0,0 +1,203 @@
+/*
+ *                                 Apache License
+ *                           Version 2.0, January 2004
+ *                        http://www.apache.org/licenses/
+ *
+ *   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+ *
+ *   1. Definitions.
+ *
+ *      "License" shall mean the terms and conditions for use, reproduction,
+ *      and distribution as defined by Sections 1 through 9 of this document.
+ *
+ *      "Licensor" shall mean the copyright owner or entity authorized by
+ *      the copyright owner that is granting the License.
+ *
+ *      "Legal Entity" shall mean the union of the acting entity and all
+ *      other entities that control, are controlled by, or are under common
+ *      control with that entity. For the purposes of this definition,
+ *      "control" means (i) the power, direct or indirect, to cause the
+ *      direction or management of such entity, whether by contract or
+ *      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ *      outstanding shares, or (iii) beneficial ownership of such entity.
+ *
+ *      "You" (or "Your") shall mean an individual or Legal Entity
+ *      exercising permissions granted by this License.
+ *
+ *      "Source" form shall mean the preferred form for making modifications,
+ *      including but not limited to software source code, documentation
+ *      source, and configuration files.
+ *
+ *      "Object" form shall mean any form resulting from mechanical
+ *      transformation or translation of a Source form, including but
+ *      not limited to compiled object code, generated documentation,
+ *      and conversions to other media types.
+ *
+ *      "Work" shall mean the work of authorship, whether in Source or
+ *      Object form, made available under the License, as indicated by a
+ *      copyright notice that is included in or attached to the work
+ *      (an example is provided in the Appendix below).
+ *
+ *      "Derivative Works" shall mean any work, whether in Source or Object
+ *      form, that is based on (or derived from) the Work and for which the
+ *      editorial revisions, annotations, elaborations, or other modifications
+ *      represent, as a whole, an original work of authorship. For the purposes
+ *      of this License, Derivative Works shall not include works that remain
+ *      separable from, or merely link (or bind by name) to the interfaces of,
+ *      the Work and Derivative Works thereof.
+ *
+ *      "Contribution" shall mean any work of authorship, including
+ *      the original version of the Work and any modifications or additions
+ *      to that Work or Derivative Works thereof, that is intentionally
+ *      submitted to Licensor for inclusion in the Work by the copyright owner
+ *      or by an individual or Legal Entity authorized to submit on behalf of
+ *      the copyright owner. For the purposes of this definition, "submitted"
+ *      means any form of electronic, verbal, or written communication sent
+ *      to the Licensor or its representatives, including but not limited to
+ *      communication on electronic mailing lists, source code control systems,
+ *      and issue tracking systems that are managed by, or on behalf of, the
+ *      Licensor for the purpose of discussing and improving the Work, but
+ *      excluding communication that is conspicuously marked or otherwise
+ *      designated in writing by the copyright owner as "Not a Contribution."
+ *
+ *      "Contributor" shall mean Licensor and any individual or Legal Entity
+ *      on behalf of whom a Contribution has been received by Licensor and
+ *      subsequently incorporated within the Work.
+ *
+ *   2. Grant of Copyright License. Subject to the terms and conditions of
+ *      this License, each Contributor hereby grants to You a perpetual,
+ *      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ *      copyright license to reproduce, prepare Derivative Works of,
+ *      publicly display, publicly perform, sublicense, and distribute the
+ *      Work and such Derivative Works in Source or Object form.
+ *
+ *   3. Grant of Patent License. Subject to the terms and conditions of
+ *      this License, each Contributor hereby grants to You a perpetual,
+ *      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ *      (except as stated in this section) patent license to make, have made,
+ *      use, offer to sell, sell, import, and otherwise transfer the Work,
+ *      where such license applies only to those patent claims licensable
+ *      by such Contributor that are necessarily infringed by their
+ *      Contribution(s) alone or by combination of their Contribution(s)
+ *      with the Work to which such Contribution(s) was submitted. If You
+ *      institute patent litigation against any entity (including a
+ *      cross-claim or counterclaim in a lawsuit) alleging that the Work
+ *      or a Contribution incorporated within the Work constitutes direct
+ *      or contributory patent infringement, then any patent licenses
+ *      granted to You under this License for that Work shall terminate
+ *      as of the date such litigation is filed.
+ *
+ *   4. Redistribution. You may reproduce and distribute copies of the
+ *      Work or Derivative Works thereof in any medium, with or without
+ *      modifications, and in Source or Object form, provided that You
+ *      meet the following conditions:
+ *
+ *      (a) You must give any other recipients of the Work or
+ *          Derivative Works a copy of this License; and
+ *
+ *      (b) You must cause any modified files to carry prominent notices
+ *          stating that You changed the files; and
+ *
+ *      (c) You must retain, in the Source form of any Derivative Works
+ *          that You distribute, all copyright, patent, trademark, and
+ *          attribution notices from the Source form of the Work,
+ *          excluding those notices that do not pertain to any part of
+ *          the Derivative Works; and
+ *
+ *      (d) If the Work includes a "NOTICE" text file as part of its
+ *          distribution, then any Derivative Works that You distribute must
+ *          include a readable copy of the attribution notices contained
+ *          within such NOTICE file, excluding those notices that do not
+ *          pertain to any part of the Derivative Works, in at least one
+ *          of the following places: within a NOTICE text file distributed
+ *          as part of the Derivative Works; within the Source form or
+ *          documentation, if provided along with the Derivative Works; or,
+ *          within a display generated by the Derivative Works, if and
+ *          wherever such third-party notices normally appear. The contents
+ *          of the NOTICE file are for informational purposes only and
+ *          do not modify the License. You may add Your own attribution
+ *          notices within Derivative Works that You distribute, alongside
+ *          or as an addendum to the NOTICE text from the Work, provided
+ *          that such additional attribution notices cannot be construed
+ *          as modifying the License.
+ *
+ *      You may add Your own copyright statement to Your modifications and
+ *      may provide additional or different license terms and conditions
+ *      for use, reproduction, or distribution of Your modifications, or
+ *      for any such Derivative Works as a whole, provided Your use,
+ *      reproduction, and distribution of the Work otherwise complies with
+ *      the conditions stated in this License.
+ *
+ *   5. Submission of Contributions. Unless You explicitly state otherwise,
+ *      any Contribution intentionally submitted for inclusion in the Work
+ *      by You to the Licensor shall be under the terms and conditions of
+ *      this License, without any additional terms or conditions.
+ *      Notwithstanding the above, nothing herein shall supersede or modify
+ *      the terms of any separate license agreement you may have executed
+ *      with Licensor regarding such Contributions.
+ *
+ *   6. Trademarks. This License does not grant permission to use the trade
+ *      names, trademarks, service marks, or product names of the Licensor,
+ *      except as required for reasonable and customary use in describing the
+ *      origin of the Work and reproducing the content of the NOTICE file.
+ *
+ *   7. Disclaimer of Warranty. Unless required by applicable law or
+ *      agreed to in writing, Licensor provides the Work (and each
+ *      Contributor provides its Contributions) on an "AS IS" BASIS,
+ *      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ *      implied, including, without limitation, any warranties or conditions
+ *      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ *      PARTICULAR PURPOSE. You are solely responsible for determining the
+ *      appropriateness of using or redistributing the Work and assume any
+ *      risks associated with Your exercise of permissions under this License.
+ *
+ *   8. Limitation of Liability. In no event and under no legal theory,
+ *      whether in tort (including negligence), contract, or otherwise,
+ *      unless required by applicable law (such as deliberate and grossly
+ *      negligent acts) or agreed to in writing, shall any Contributor be
+ *      liable to You for damages, including any direct, indirect, special,
+ *      incidental, or consequential damages of any character arising as a
+ *      result of this License or out of the use or inability to use the
+ *      Work (including but not limited to damages for loss of goodwill,
+ *      work stoppage, computer failure or malfunction, or any and all
+ *      other commercial damages or losses), even if such Contributor
+ *      has been advised of the possibility of such damages.
+ *
+ *   9. Accepting Warranty or Additional Liability. While redistributing
+ *      the Work or Derivative Works thereof, You may choose to offer,
+ *      and charge a fee for, acceptance of support, warranty, indemnity,
+ *      or other liability obligations and/or rights consistent with this
+ *      License. However, in accepting such obligations, You may act only
+ *      on Your own behalf and on Your sole responsibility, not on behalf
+ *      of any other Contributor, and only if You agree to indemnify,
+ *      defend, and hold each Contributor harmless for any liability
+ *      incurred by, or claims asserted against, such Contributor by reason
+ *      of your accepting any such warranty or additional liability.
+ *
+ *   END OF TERMS AND CONDITIONS
+ *
+ *   APPENDIX: How to apply the Apache License to your work.
+ *
+ *      To apply the Apache License to your work, attach the following
+ *      boilerplate notice, with the fields enclosed by brackets "[]"
+ *      replaced with your own identifying information. (Don't include
+ *      the brackets!)  The text should be enclosed in the appropriate
+ *      comment syntax for the file format. We also recommend that a
+ *      file or class name and description of purpose be included on the
+ *      same "printed page" as the copyright notice for easier
+ *      identification within third-party archives.
+ *
+ *   Copyright [yyyy] [name of copyright owner]
+ *
+ *   Licensed 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.
+ */
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/lib/LICENSE-dom.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/lib/LICENSE-dom.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/lib/LICENSE-dom.txt	(revision 21851)
@@ -0,0 +1,71 @@
+This license came from:
+http://www.w3.org/Consortium/Legal/copyright-software-19980720
+
+
+W3C® SOFTWARE NOTICE AND LICENSE
+Copyright © 1994-2001 World
+Wide Web Consortium, <a href="http://www.w3.org/">World
+Wide Web Consortium</a>, (<a href=
+"http://www.lcs.mit.edu/">Massachusetts Institute of
+Technology</a>, <a href="http://www.inria.fr/">Institut National de
+Recherche en Informatique et en Automatique</a>, <a href=
+"http://www.keio.ac.jp/">Keio University</a>). All Rights Reserved.
+http://www.w3.org/Consortium/Legal/
+
+This W3C work (including software, documents, or other related
+items) is being provided by the copyright holders under the
+following license. By obtaining, using and/or copying this work,
+you (the licensee) agree that you have read, understood, and will
+comply with the following terms and conditions:
+Permission to use, copy, modify, and distribute this software
+and its documentation, with or without modification,  for any
+purpose and without fee or royalty is hereby granted, provided that
+you include the following on ALL copies of the software and
+documentation or portions thereof, including modifications, that
+you make:
+
+The full text of this NOTICE in a location viewable to users of
+the redistributed or derivative work.
+
+Any pre-existing intellectual property disclaimers, notices, or
+terms and conditions. If none exist, a short notice of the
+following form (hypertext is preferred, text is permitted) should
+be used within the body of any redistributed or derivative code:
+"Copyright © [$date-of-software] World Wide Web Consortium, (Massachusetts Institute of
+Technology, Institut National de
+Recherche en Informatique et en Automatique, Keio University). All Rights Reserved.
+http://www.w3.org/Consortium/Legal/"
+
+Notice of any changes or modifications to the W3C files,
+including the date changes were made. (We recommend you provide 
+URIs to the location from which the code is derived.)
+
+THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND
+COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF
+MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE
+USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD
+PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT,
+SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE
+SOFTWARE OR DOCUMENTATION.
+
+The name and trademarks of copyright holders may NOT be used in
+advertising or publicity pertaining to the software without
+specific, written prior permission. Title to copyright in this
+software and any associated documentation will at all times remain
+with copyright holders.
+____________________________________
+This formulation of W3C's notice and license became active on
+August 14 1998 so as to improve compatibility with GPL. This
+version ensures that W3C software licensing terms are no more
+restrictive than GPL and consequently W3C software may be
+distributed in GPL packages. See the older formulation for the
+policy prior to this date. Please see our Copyright FAQ for common 
+questions about using materials from
+our site, including specific terms and conditions for packages like
+libwww, Amaya, and Jigsaw. 
+Other questions about this notice can be
+directed to site-policy@w3.org.
+
+webmaster
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/lib/LICENSE-jgoodies.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/lib/LICENSE-jgoodies.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/lib/LICENSE-jgoodies.txt	(revision 21851)
@@ -0,0 +1,31 @@
+
+           The BSD License for the JGoodies Looks
+           ======================================
+
+Copyright (c) 2001-2004 JGoodies Karsten Lentzsch. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without 
+modification, are permitted provided that the following conditions are met:
+
+ o Redistributions of source code must retain the above copyright notice, 
+   this list of conditions and the following disclaimer. 
+    
+ o Redistributions in binary form must reproduce the above copyright notice, 
+   this list of conditions and the following disclaimer in the documentation 
+   and/or other materials provided with the distribution. 
+    
+ o Neither the name of JGoodies Karsten Lentzsch nor the names of 
+   its contributors may be used to endorse or promote products derived 
+   from this software without specific prior written permission. 
+    
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/lib/LICENSE-sax.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/lib/LICENSE-sax.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/lib/LICENSE-sax.txt	(revision 21851)
@@ -0,0 +1,20 @@
+This license came from: http://www.megginson.com/SAX/copying.html
+  However please note future versions of SAX may be covered 
+  under http://saxproject.org/?selected=pd
+
+
+This page is now out of date -- see the new SAX site at 
+http://www.saxproject.org/ for more up-to-date
+releases and other information. Please change your bookmarks.
+
+
+SAX2 is Free!
+
+I hereby abandon any property rights to SAX 2.0 (the Simple API for
+XML), and release all of the SAX 2.0 source code, compiled code, and
+documentation contained in this distribution into the Public Domain.
+SAX comes with NO WARRANTY or guarantee of fitness for any
+purpose.
+
+David Megginson, david@megginson.com
+2000-05-05
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/lib/LICENSE-sysout.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/lib/LICENSE-sysout.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/lib/LICENSE-sysout.txt	(revision 21851)
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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.
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/lib/LICENSE-xerces.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/lib/LICENSE-xerces.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/lib/LICENSE-xerces.txt	(revision 21851)
@@ -0,0 +1,56 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights 
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ *    if any, must include the following acknowledgment:  
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowledgment may appear in the software itself,
+ *    if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xerces" and "Apache Software Foundation" must
+ *    not be used to endorse or promote products derived from this
+ *    software without prior written permission. For written 
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ *    nor may "Apache" appear in their name, without prior written
+ *    permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, International
+ * Business Machines, Inc., http://www.ibm.com.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/README.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/README.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/README.txt	(revision 21851)
@@ -0,0 +1,109 @@
+
+This SelfExtracting archive should be run with Java to start the installation.
+________________________________________________________________________________
+
+If Java1.4 is installed correctly simply double click the .jar file in your 
+file browser.
+
+
+To run the installer from the commandline
+WINDOWS 
+		C:\> javaw -jar [installer-file].jar
+UNIX
+		> java -jar [installer-file].jar
+
+
+If the .jar extension has been reregistered you will need to specify the Java
+command
+
+WINDOWS
+
+	Right mouse click on the file and select "Open with" then "javaw"
+
+
+LINUX
+
+	Konquerer (KDE) right mouse click and select "Open with" then "java"
+
+
+
+
+
+TROUBLESHOOTING
+________________________________________________________________________________
+
+
+WINDOWS
+________________________________________________________________________________
+If you do not have the "javaw" entry in the "Open with" list 
+	Check that you have a current version of Java ( >1.4 ) installed.
+	The Sun Java installation process registers javaw with .jars in the 
+	installation.  
+	You can reinstall Java if you still have the original installer.
+	If you don't have the installer, or don't want to reinstall Java, you can 
+	modify the registration of the .jar extension.
+		In Explorer select "Tools" then "Folder options"
+		Select the "File types" tab
+		First check to see if teh JAR Extension is in the list
+			JAR extension IS in the list
+				click the "Change" button
+				find javaw in the list of files
+				click OK
+			JAR extension NOT in list
+				click the New button
+				enter "jar" as the file extension
+				Enter <New> as the file type
+				
+			
+				
+
+
+LINUX
+________________________________________________________________________________
+
+Using X
+
+Log in to the shell as the user that is running X
+Ensure you have exported your DISPLAY variable  (echo $DISPLAY) if not export it
+> export DISPLAY=127.0.0.1:0
+
+Check the default java is the correct version
+> java -version
+
+	If the java binary is not found, but you do have Java installed
+		Add the bin directory of the Java installation to your path
+		> export PATH=$PATH:[path to Java]/bin
+		run the installer with > java -jar [installer-file].jar
+	
+	If the default java version is below 1.4
+		If you do NOT have a recent version installed anywhere on your system
+			install the Sun Java JRE or SDK for linux.
+		If/when you DO have a recent version of Java installed
+			find the location of the java installation
+			e.g /usr/java/j2sdk1.4.2_04
+			export the JAVA_HOME variable of the installation
+			> export JAVA_HOME=/usr/java/j2sdk1.4.2_04
+			run the following command
+			> $JAVA_HOME/bin/java -jar [installer-file].jar
+			You should consider adding the export JAVA_HOME entry to your profile 
+			and/or ensure the location of the JAVA_HOME/bin directory for Java >1.4 
+			is in your PATH
+		
+	If the default java version IS above 1.4
+	run the installer with > java -jar [installer-file].jar
+
+
+Without X (command line)
+
+The installer will run on the command line with a text interface if it is not 
+possible to load the GUI.
+running the following command without a DISPLAY variable or in runlevel 3 will
+start the installer in text mode
+> java -jar [installer-file].jar
+
+
+
+
+
+
+ 
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/DefaultPropertiesFileRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/DefaultPropertiesFileRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/DefaultPropertiesFileRenderer.java	(revision 21851)
@@ -0,0 +1,108 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+
+import org.tp23.antinstaller.input.ConditionalField;
+import org.tp23.antinstaller.input.InputField;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.input.SecretPropertyField;
+import org.tp23.antinstaller.page.Page;
+
+
+
+/**
+ *
+ * <p>Outputs the completed Pages as a java Properties file. </p>
+ * @author Paul Hinds
+ * @version $Id: DefaultPropertiesFileRenderer.java,v 1.8 2007/01/09 22:41:41 teknopaul Exp $
+ */
+public class DefaultPropertiesFileRenderer
+	implements PropertiesFileRenderer {
+
+	public DefaultPropertiesFileRenderer() {
+	}
+
+	public void renderProperties(InstallerContext ctx, File baseDir){
+		Installer installer = ctx.getInstaller();
+		Page[] completedPages = installer.getPages();
+		Properties props = new Properties();
+		props.put(FILE_ROOT_PROPERTY, baseDir.getAbsolutePath());
+        props.setProperty(INSTALLER_VERSION_PROPERTY,
+                ctx.getInstaller().getVersion());
+
+
+		for (int i = 0; i < completedPages.length; i++) {
+			OutputField[] fields = completedPages[i].getOutputField();
+
+            retrieveProperties( fields, props );
+			
+			// print targets selected
+			List targets = completedPages[i].getTargets(ctx);
+			if(targets.size() > 0){
+				Iterator iterator = targets.iterator();
+				StringBuffer targetProperty = new StringBuffer();
+				while (iterator.hasNext()) {
+					String target = (String) iterator.next();
+					targetProperty.append(target).append(",");
+				}
+				props.put(completedPages[i].getName() + TARGETS_SUFFIX, targetProperty.toString());				
+			}
+
+		}
+		try {
+			File antInstallProperties = new File(baseDir.getAbsolutePath(), PROPERTIES_FILE_NAME);
+            FileOutputStream fos = new FileOutputStream(antInstallProperties);
+			props.store(fos,
+						"Ant Installer - AutoGenerated properties");
+            fos.close();
+		}
+		catch (Throwable ex) {
+            if(ctx.getInstaller().isVerbose()) {
+                ctx.log(ex);
+            }
+			//swallow Exceptions as in contract for this method
+		}
+	}
+
+    private void retrieveProperties( OutputField[] fields, Properties props ) {
+        for (int f = 0; f < fields.length; f++) {
+            if (fields[f] instanceof SecretPropertyField) {
+                //InputField field = (InputField)fields[f];
+                //props.put(field.getProperty(), "XXXXXXXX");
+            }
+            else if( fields[f] instanceof ConditionalField ) {
+                ConditionalField confField = (ConditionalField) fields[f];
+                retrieveProperties( confField.getFields(), props );
+            }
+            else if (fields[f] instanceof InputField) {
+                InputField field = (InputField)fields[f];
+
+                String result = field.getInputResult();
+                //Temporary fix for PR 1353906
+                if( result == null ) {
+                    result = "";
+                }
+                props.put(field.getProperty(), result);
+            }
+        }
+    }
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/ExplicitPropertiesFileRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/ExplicitPropertiesFileRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/ExplicitPropertiesFileRenderer.java	(revision 21851)
@@ -0,0 +1,218 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+
+import org.tp23.antinstaller.input.ConditionalField;
+import org.tp23.antinstaller.input.InputField;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.input.SecretPropertyField;
+import org.tp23.antinstaller.page.Page;
+
+/**
+ * <p>Outputs the completed Pages as a Java Properties file. The file produced is compatible
+ * with java.util.Properties. </p>
+ * <p>Output is commented as it is printed to aid debugging</p>
+ * @see http://java.sun.com/docs/books/jls/second_edition/html/lexical.doc.html#100850
+ * @author Paul Hinds
+ * @version $Id: ExplicitPropertiesFileRenderer.java,v 1.9 2007/01/09 22:41:41 teknopaul Exp $
+ */
+public class ExplicitPropertiesFileRenderer
+	implements PropertiesFileRenderer {
+
+	private static String newLine = System.getProperty("line.separator");
+	private static final char[] hexidecimals = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+
+	public ExplicitPropertiesFileRenderer() {
+	}
+
+	public void renderProperties(InstallerContext ctx, File baseDir){
+		Installer installer = ctx.getInstaller();
+		Page[] completedPages = installer.getPages();
+
+		StringBuffer propertiesData = new StringBuffer();
+		propertiesData.append("### Ant Installer - properties auto generated on ");
+		propertiesData.append( convert(new Date().toString(), true) );
+		propertiesData.append(newLine);
+		propertiesData.append(newLine);
+
+		propertiesData.append(FILE_ROOT_PROPERTY);
+		propertiesData.append(" = ");
+		propertiesData.append( convert(baseDir.getAbsolutePath(), true) );
+		propertiesData.append(newLine);
+
+        propertiesData.append(INSTALLER_VERSION_PROPERTY);
+        propertiesData.append(" = ");
+        propertiesData.append( convert(ctx.getInstaller().getVersion(), true) );
+        propertiesData.append(newLine);
+
+		propertiesData.append(newLine);
+		String property = null;
+		String value = null;
+
+
+		for (int i = 0; i < completedPages.length; i++) {
+			OutputField[] fields = completedPages[i].getOutputField();
+
+			propertiesData.append(newLine);
+			propertiesData.append("## Properties from Page:" + completedPages[i].getName());
+			propertiesData.append(newLine);
+
+            retrievePropertiesData( fields, propertiesData );
+
+			// print targets selected
+			List targets = completedPages[i].getTargets(ctx);
+			if(targets.size() > 0){
+				Iterator iterator = targets.iterator();
+				StringBuffer targetProperty = new StringBuffer();
+				while (iterator.hasNext()) {
+					String target = (String) iterator.next();
+					targetProperty.append(target).append(",");
+				}
+				propertiesData.append("# Targets selected for page");
+				propertiesData.append(newLine);
+				property = convert(completedPages[i].getName() + TARGETS_SUFFIX, true);
+				value = convert(targetProperty.toString(), true);
+				propertiesData.append(property + " = " + value);
+				propertiesData.append(newLine);
+				
+			}
+		}
+		try {
+			File antInstallProperties = new File(baseDir.getAbsolutePath(), PROPERTIES_FILE_NAME);
+			FileWriter fos = new FileWriter(antInstallProperties);
+			BufferedWriter writer = new BufferedWriter(fos);
+			writer.write(propertiesData.toString());
+			writer.flush();
+			fos.close();
+		}
+		catch (Throwable ex) {
+            if(ctx.getInstaller().isVerbose()) {
+                ctx.log(ex);
+            }
+            //swallow Exceptions as in the contract for this method
+		}
+	}
+    private void retrievePropertiesData( OutputField[] fields, StringBuffer propertiesData ) {
+        String property = null;
+        String value = null;
+
+        for (int f = 0; f < fields.length; f++) {
+            if (fields[f] instanceof SecretPropertyField) {
+                InputField field = (InputField) fields[f];
+                //String result = field.getInputResult();
+                propertiesData.append("# Property hidden " + printClass(fields[f].getClass()));
+                propertiesData.append(newLine);
+                property = convert(field.getProperty(), true);
+                propertiesData.append("#" + property + "=XXXXXXXX");
+                propertiesData.append(newLine);
+            }
+            else if (fields[f] instanceof ConditionalField ) {
+                ConditionalField confField = (ConditionalField) fields[f];
+                retrievePropertiesData( confField.getFields(), propertiesData );
+            }
+            else if (fields[f] instanceof InputField) {
+                InputField field = (InputField) fields[f];
+                String result = field.getInputResult();
+                propertiesData.append("# " + printClass(fields[f].getClass()));
+                propertiesData.append(newLine);
+
+                property = convert(field.getProperty(), true);
+                value = convert(result, false);
+                propertiesData.append(property + " = " + value);
+                propertiesData.append(newLine);
+            }
+        }
+    }
+
+	private String printClass(Class clazz) {
+		String name = clazz.getName();
+		int lastDot = name.lastIndexOf('.');
+		return name.substring(lastDot, name.length());
+	}
+
+	private String convert(String input, boolean doSpaces) {
+		if (input == null) {
+			// this happens when a page is skipped in text mode
+			return "";
+		}
+		int num = input.length();
+		StringBuffer sb = new StringBuffer(num);
+
+		for (int i = 0; i < num; i++) {
+			char c = input.charAt(i);
+			switch (c) {
+				case ' ':
+					if (i == 0 || doSpaces) {
+						sb.append('\\');
+					}
+					sb.append(' ');
+					break;
+				case '\n':
+					sb.append("\\n");
+					break;
+				case '\r':
+					sb.append("\\r");
+					break;
+				case '\\':
+					sb.append("\\\\");
+					break;
+				case '\t':
+					sb.append("\\t");
+					break;
+				case '\f':
+					sb.append("\\f");
+					break;
+				case '=':
+					sb.append("\\=");
+					break;
+				case ':':
+					sb.append("\\:");
+					break;
+				case '#':
+					sb.append("\\#");
+					break;
+				case '!':
+					sb.append("\\!");
+					break;
+
+				default:
+					if ( (c < 0x0020) || (c > 0x007e) ) {
+						sb.append("\\u")
+							.append(hex( (c >> 12) & 0xF))
+							.append(hex( (c >> 8) & 0xF))
+							.append(hex( (c >> 4) & 0xF))
+							.append(hex(c & 0xF));
+					}
+					else {
+						sb.append(c);
+					}
+			}
+		}
+		return sb.toString();
+	}
+
+	private char hex(int val) {
+		return hexidecimals[ (val & 0xF)];
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/InstallException.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/InstallException.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/InstallException.java	(revision 21851)
@@ -0,0 +1,67 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller;
+
+import java.io.PrintStream;
+import java.io.PrintWriter;
+
+/**
+ *
+ * <p>Custom Installation Exception, Hopefully compatible with JDK1.3 and 1.4</p>
+ * @author Paul Hinds
+ * @version $Id: InstallException.java,v 1.1.1.1 2005/10/18 18:20:51 teknopaul Exp $
+ */
+public class InstallException extends Exception{
+
+	private Throwable cause;
+	
+	public InstallException() {
+	}
+	public InstallException(String message) {
+		super(message);
+	}
+	public InstallException(String message,Throwable cause) {
+		super(message);
+        this.cause = cause;
+	}
+    public Throwable getException() {
+        return cause;
+    }
+    public Throwable getCause() {
+        return getException();
+    }
+    public void printStackTrace() {
+        printStackTrace(System.err);
+    }
+    public void printStackTrace(PrintStream ps) {
+        synchronized (ps) {
+            super.printStackTrace(ps);
+            if (cause != null) {
+                ps.println("--- Nested Exception ---");
+                cause.printStackTrace(ps);
+            }
+        }
+    }
+    public void printStackTrace(PrintWriter pw) {
+        synchronized (pw) {
+            super.printStackTrace(pw);
+            if (cause != null) {
+                pw.println("--- Nested Exception ---");
+                cause.printStackTrace(pw);
+            }
+        }
+    }
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/Installer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/Installer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/Installer.java	(revision 21851)
@@ -0,0 +1,275 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller;
+
+import java.util.List;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+import java.util.Vector;
+
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.input.ResultContainer;
+import org.tp23.antinstaller.page.Page;
+import org.tp23.antinstaller.renderer.swing.SizeConstants;
+import org.tp23.antinstaller.runtime.IfPropertyHelper;
+import org.tp23.antinstaller.runtime.VersionHelper;
+import org.tp23.antinstaller.runtime.exe.ExecuteRunnerFilter.AbortException;
+
+/**
+ * <p>Object representation of the Installer element in the config. </p>
+ * <p>This object holds the reference to all the Pages which in tern hold references
+ * to the InputFields,  All the properties in the Installer element are held at this level
+ * as is the ResultContainer</p>
+ * @author Paul Hinds
+ * @version $Id: Installer.java,v 1.9 2007/01/28 08:44:41 teknopaul Exp $
+ */
+public class Installer {
+
+
+	// i18n support
+	public static ResourceBundle langPack = null;
+	static {
+		try {
+			langPack = ResourceBundle.getBundle("resources.LanguagePack");
+		} catch (MissingResourceException e) {
+			// ignore, signifies no lang packs installed
+		}
+	}
+
+	private String name;
+	private String minJavaVersion = "1.4";
+	private String ui;// permitted UI override values
+	private boolean verbose;
+	private boolean debug;
+	private String lookAndFeel;
+	private String wide;
+	private String windowIcon;
+	private String defaultImageResource;
+	private String finishButtonText = "Install";
+    private String antialiased;
+    private String loadDefaults;
+    private String version = "0.0";
+    
+	private Page[] pages;
+	private ResultContainer resultContainer = new ResultContainer();
+
+	public Installer() {
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+
+	public String getMinJavaVersion() {
+		return minJavaVersion;
+	}
+    
+    public void setMinJavaVersion(String minJavaVersion) throws AbortException {
+        if(minJavaVersion != null && ! "".equals(minJavaVersion) ) {
+            VersionHelper helper = new VersionHelper();
+            if( ! helper.equalOrHigher(System.getProperty("java.version"), minJavaVersion, true) ) {
+                throw new AbortException("Incorrect Java version, installer requires: " + minJavaVersion);
+            }
+        }
+        this.minJavaVersion = minJavaVersion;
+    }
+
+	public Page[] getPages() {
+		return pages;
+	}
+
+	public void setPages(Page[] pages) {
+		this.pages = pages;
+	}
+
+    /**
+     * returns full ui attribute with spaces removed (the string is not parsed into tokens).
+     * e.g.  "text,swint,swing-auto"
+     * @return
+     */
+	public String getUi() {
+		return ui;
+	}
+
+    /**
+     * Sets the ui attrribute removing any whitespace
+     * @param ui
+     */
+	public void setUi(String ui) {
+		this.ui = ui.replaceAll("\\s", "");
+	}
+
+	public boolean supportsAutoBuild(){
+		return ui != null && ui.indexOf("-auto") > -1;
+	}
+
+	public boolean isVerbose() {
+		return verbose;
+	}
+	public void setVerbose(boolean verbose) {
+		this.verbose = verbose;
+	}
+	public void setVerbose(String strVerbose) {
+		this.verbose = OutputField.isTrue(strVerbose);
+	}
+
+	public boolean isDebug() {
+		return debug;
+	}
+	public void setDebug(boolean debug) {
+		this.debug = debug;
+	}
+	public void setDebug(String strDebug) {
+		this.debug = OutputField.isTrue(strDebug);
+	}
+
+
+	public String getLookAndFeel() {
+		return lookAndFeel;
+	}
+
+	public void setLookAndFeel(String lookAndFeel) {
+		this.lookAndFeel = lookAndFeel;
+	}
+
+	public String getWindowIcon() {
+		return windowIcon;
+	}
+
+	public void setWindowIcon(String windowIcon) {
+		this.windowIcon = windowIcon;
+	}
+
+	public String getDefaultImageResource() {
+		return defaultImageResource;
+	}
+
+	public void setDefaultImageResource(String defaultImageResource) {
+		this.defaultImageResource = defaultImageResource;
+	}
+
+	public String getFinishButtonText() {
+		if(langPack != null){
+			return langPack.getString("finishButtonText");
+		}
+		return finishButtonText;
+	}
+
+	public void setFinishButtonText(String finishButtonText) {
+		this.finishButtonText = finishButtonText;
+	}
+
+	public ResultContainer getResultContainer() {
+		return resultContainer;
+	}
+
+	public String getAntialiased() {
+		return antialiased;
+	}
+
+	public void setAntialiased(String antialiased) {
+		this.antialiased = antialiased;
+	}
+
+	public String getWide() {
+		return wide;
+	}
+
+	public void setWide(String wide) {
+		try {
+			this.wide = wide;
+			parseWideValue(wide);
+		} catch (Exception e) {
+			// ignore use defaults
+		}
+	}
+	public void parseWideValue(String wide) throws NumberFormatException, StringIndexOutOfBoundsException{
+		int pageWidth = Integer.parseInt(wide.substring(0, wide.indexOf(':')));
+		int labelWidth = Integer.parseInt(wide.substring(wide.indexOf(':') + 1, wide.length()));
+		SizeConstants.PAGE_WIDTH = pageWidth;
+		SizeConstants.LABEL_WIDTH = labelWidth;
+	}
+
+	public String getLoadDefaults() {
+		return loadDefaults;
+	}
+
+	public void setLoadDefaults(String loadDefaults) {
+		this.loadDefaults = loadDefaults;
+	}
+
+	/**
+	 * Returns the list of selected targets from the installer obeying
+	 * page order. This method is
+	 * probably only usefull after the UI screens have finished.  Using prior to that
+	 * bear in mind that the user in the Swing GUI can go back and reselect
+	 * targets that were not selected previously.
+	 * Page targets for pages that were not shown are not returned in the list 
+	 * @return Returns a Vector since Ant requires this for the Project class (Should be a List)
+	 * @throws InstallException 
+	 */
+	public Vector getTargets(InstallerContext ctx){
+		Vector argsList = new Vector();
+		for (int i = 0; i < getPages().length; i++) {
+			Page page = getPages()[i];
+			List pageTargets = page.getPageTargets();
+			boolean shown = conditionalDisplay(page, ctx);
+			for (int pt = 0; pt < pageTargets.size(); pt++) {
+				Page.IndexedTarget target = (Page.IndexedTarget)pageTargets.get(pt);
+				if( ! argsList.contains(target.getTarget()) &&
+					shown){
+					argsList.add(target.getTarget());
+				}
+			}
+			List elementTargets = page.getElementTargets();
+			for (int pt = 0; pt < elementTargets.size(); pt++) {
+				Page.IndexedTarget target = (Page.IndexedTarget)elementTargets.get(pt);
+				if( ! argsList.contains(target.getTarget()) ){
+					argsList.add(target.getTarget());
+				}
+			}
+		}
+		return argsList;
+	}
+
+	/**
+	 * @return boolean true if the page was to be shown
+	 * @throws InstallException 
+	 */
+	private boolean conditionalDisplay(Page page, InstallerContext ctx){
+		try {
+			IfPropertyHelper helper = new IfPropertyHelper(ctx);
+			return helper.ifProperty(page) && helper.ifTarget(page, ctx.getInstaller().getPages());
+		} catch (InstallException e) {
+			throw new RuntimeException("ifProperty runtime exception");
+		}
+	}
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/InstallerContext.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/InstallerContext.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/InstallerContext.java	(revision 21851)
@@ -0,0 +1,271 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller;
+
+import java.io.File;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.Properties;
+import java.util.Vector;
+
+import org.apache.tools.ant.BuildListener;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.tp23.antinstaller.page.Page;
+import org.tp23.antinstaller.renderer.AntOutputRenderer;
+import org.tp23.antinstaller.renderer.MessageRenderer;
+import org.tp23.antinstaller.runtime.Logger;
+import org.tp23.antinstaller.runtime.Runner;
+import org.tp23.antinstaller.runtime.exe.AntLauncherFilter;
+import org.tp23.antinstaller.runtime.exe.LoadConfigFilter;
+/**
+ *
+ * <p>A single InstallerContext is created by the ExecInstall class and
+ * exist for the duration of the Install screens and the runing of
+ * the Ant Script. </p>
+ * @author Paul Hinds
+ * @version $Id: InstallerContext.java,v 1.10 2007/01/28 08:44:41 teknopaul Exp $
+ */
+public class InstallerContext {
+
+	/**
+	 * This is the prefix for environment variables, unlike Ant this is fixed to
+	 * the common prefix of "env".  If you dont like this complain to the bug reports
+	 * on sourceforge
+	 */
+	public static final String ENV_PREFIX = "env.";
+	/**
+	 * This is the prefix for Java system property variables.
+	 * This is fixed to "java."
+	 */
+	public static final String JAVA_PREFIX = "java.";
+
+	private Logger logger = null;
+	private Installer installer = null;
+	private MessageRenderer messageRenderer = null;
+    private AntOutputRenderer antOutputRenderer = null;
+    private Runner runner = null;
+    private Page currentPage = null;
+    private java.io.File fileRoot = null; // ant basedir
+    private BuildListener buildListener = null;
+    private AntLauncherFilter antRunner = null;
+    private String uIOverride = null;
+    private String installerConfigFile = LoadConfigFilter.INSTALLER_CONFIG_FILE;
+    private String antBuildFile = "build.xml";
+    private String configResource;
+    
+    
+    // called after the Ant part has been run
+    private boolean installedSucceded = false;
+     
+	public InstallerContext() {
+	}
+
+	public void setInstallSucceded(boolean installedSucceded){
+		this.installedSucceded=installedSucceded;
+	}
+	public boolean isInstallSucceded(){
+		return installedSucceded;
+	}
+	
+	public void log(String message){
+		if(logger != null) {
+            logger.log(message);
+        }
+	}
+	public void log(Throwable message){
+		if(logger != null) {
+            logger.log(message);
+        }
+	}
+    public void log(boolean vebose, Throwable message){
+        if(vebose && logger != null) {
+            logger.log(message);
+        }
+    }
+
+	/**
+	 * Check to see if the system is windoze to be able to return the correct prompted
+	 * directories.  This method should be IsNotWindows since it assumes anything
+	 * that is not windows is Unix
+	 * @return boolean true if not windows in the os.name System Property
+	 */
+	public static boolean isUnix(){
+		return System.getProperty("os.name").toLowerCase().indexOf("windows") == -1;
+	}
+
+	/**
+	 * Use the standard Ant way to load the environment variables, this is not all inclusive
+	 * (but will be come Java 1.5 I imagine)
+	 * @return Properties
+	 */
+	public static Properties getEnvironment(){
+		Properties props = new Properties();
+		try {
+			Vector osEnv = Execute.getProcEnvironment();
+			for (Enumeration e = osEnv.elements(); e.hasMoreElements(); ) {
+				String entry = (String) e.nextElement();
+				int pos = entry.indexOf('=');
+				if (pos != -1) {
+					props.put(ENV_PREFIX + entry.substring(0, pos),
+							  entry.substring(pos + 1));
+				}
+			}
+		}
+		catch (Exception ex) {
+			// swallow exceptions so this can be loaded statically
+			// bit of a bugger if you need the environment on Mac OS 9 but not all apps
+			// do so we don't want to die inother situations
+			System.out.println("Can't load environment:"+ex.getClass()+","+ex.getMessage());
+		}
+		Properties javaSysProps = System.getProperties();
+		Iterator iter = javaSysProps.keySet().iterator();
+		while (iter.hasNext()) {
+			Object key = (Object)iter.next();
+			props.put(JAVA_PREFIX+key.toString(),javaSysProps.get(key));
+		}
+		return props;
+	}
+
+	// Bean methods
+	public Installer getInstaller() {
+		return installer;
+	}
+
+	public String getMinJavaVersion() {
+		return installer.getMinJavaVersion();
+	}
+
+	public MessageRenderer getMessageRenderer() {
+		return messageRenderer;
+	}
+
+	public void setMessageRenderer(MessageRenderer messageRenderer) {
+		this.messageRenderer = messageRenderer;
+		this.messageRenderer.setInstallerContext(this);
+	}
+	
+    public AntOutputRenderer getAntOutputRenderer() {
+		return antOutputRenderer;
+    }
+    
+    public void setAntOutputRenderer(AntOutputRenderer antOutputRenderer) {
+		this.antOutputRenderer = antOutputRenderer;
+    }
+    
+    public Page getCurrentPage() {
+		return currentPage;
+    }
+    
+    public void setCurrentPage(Page currentPage) {
+		this.currentPage = currentPage;
+    }
+	/**
+	 * in SelfExtractor - the directory the install has extracted to <br/>
+	 * in Scripted installs - the base directory of the install      <br/>
+	 * in NonExtractor - the temporary space created for the build   <br/> 
+	 * @return 
+	 */
+	public File getFileRoot() {
+		return fileRoot;
+	}
+
+	public void setFileRoot(File fileRoot) {
+		this.fileRoot = fileRoot;
+	}
+
+	public org.apache.tools.ant.BuildListener getBuildListener() {
+		return buildListener;
+	}
+
+	public void setBuildListener(org.apache.tools.ant.BuildListener buildListener) {
+		this.buildListener = buildListener;
+	}
+
+	public AntLauncherFilter getAntRunner() {
+		return antRunner;
+	}
+
+	public void setAntRunner(AntLauncherFilter antRunner) {
+		this.antRunner = antRunner;
+	}
+
+	public Logger getLogger() {
+		return logger;
+	}
+
+	public void setLogger(Logger logger) {
+		this.logger = logger;
+	}
+
+	public Runner getRunner() {
+		return runner;
+	}
+
+	public void setRunner(Runner runner) {
+		this.runner = runner;
+	}
+
+	public void setInstaller(Installer installer) {
+		this.installer = installer;
+	}
+
+	public String getUIOverride() {
+		return uIOverride;
+	}
+
+	public void setUIOverride(String override) {
+		uIOverride = override;
+	}
+	
+	public boolean isAutoBuild(){
+		return uIOverride != null && uIOverride.indexOf("-auto") > -1;
+	}
+
+	/**
+	 * RFE 1569628, the antinstaller config file to use, defaults to antinstall-config.xml
+	 * @return
+	 */
+	public String getInstallerConfigFile() {
+		return installerConfigFile;
+	}
+
+	public void setInstallerConfigFile(String installerConfigFile) {
+		this.installerConfigFile = installerConfigFile;
+	}
+	/**
+	 * RFE 1569628, the build file to use, defaults to build.xml
+	 * There should never be any path info, that is derived elsewhere
+	 * @return
+	 */
+	public String getAntBuildFile() {
+		return antBuildFile;
+	}
+
+	public void setAntBuildFile(String antBuildFile) {
+		this.antBuildFile = antBuildFile;
+	}
+
+	public String getConfigResource() {
+		return configResource;
+	}
+
+	public void setConfigResource(String configResource) {
+		this.configResource = configResource;
+	}
+}
+
+
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/PropertiesFileRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/PropertiesFileRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/PropertiesFileRenderer.java	(revision 21851)
@@ -0,0 +1,43 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller;
+
+import java.io.File;
+/**
+ *
+ * <p>Renders a properties file in the base directory for Ant to use and
+ *  available for viewing after for Debug</p>
+ * In earlier versions this was the only way to access properties it is now
+ * mostly redundant.
+ * @author Paul Hinds
+ * @version $Id: PropertiesFileRenderer.java,v 1.4 2006/12/23 04:07:23 teknopaul Exp $
+ */
+public interface PropertiesFileRenderer {
+
+	public static final String FILE_ROOT_PROPERTY = "basedir";
+    public static final String INSTALLER_VERSION_PROPERTY = "ant.install.config.version";
+	public static final String PROPERTIES_FILE_NAME = "ant.install.properties";
+	public static final String TARGETS_SUFFIX = "-targets";
+
+	/**
+	 * This method no longer throws IOException since the requirement to print properties
+	 * has been removed.  By default properties will be printed since they are usefull
+	 * for debug but classes implementing this method should swallow all Exceptions
+	 * @param ctx InstallerContext
+	 * @param baseDir File
+	 */
+	public void renderProperties(InstallerContext ctx, File baseDir);
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/ResourceBundleHelper.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/ResourceBundleHelper.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/ResourceBundleHelper.java	(revision 21851)
@@ -0,0 +1,111 @@
+/*
+ * Licensed 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.
+ */
+package org.tp23.antinstaller;
+
+import java.text.MessageFormat;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * Helper class that will catch missing bundle entries and handle formatting
+ * of message strings
+ *
+ * @author mwilson
+ * @version $Id
+ * @since 0.7.4 patch 7
+ */
+public class ResourceBundleHelper
+{
+    private String bundleName;
+    private ResourceBundle resourceBundle;
+
+    private static final Object[] EMPTY_OBJ_ARRAY = new Object[0];
+    private static final String EMPTY_STRING = "";
+
+    public ResourceBundleHelper( final String bundleName )
+    {
+        this.bundleName = bundleName;
+        resourceBundle = ResourceBundle.getBundle( bundleName );
+    }
+
+    public String getMessage( final String key )
+    {
+        return getMessage( key, EMPTY_OBJ_ARRAY );
+    }
+
+    public String getMessage( final String key, final Object obj  )
+    {
+        return getMessage( key, new Object[] { obj } );
+    }
+
+    /**
+     * Return a formatted message string.
+     * @param key resource bundle key
+     * @param objArray array of objects that will be used with formatting
+     *                 string
+     * @return formatted string or error message if the resource bundle
+     *         entry is missing
+     */
+    public String getMessage( String key, Object objArray[] )
+    {
+        String message;
+
+        //Replace null values with empty strings - safer
+        for( int i = 0; i < objArray.length; i++ )
+        {
+            if( objArray[i] == null )
+            {
+                objArray[i] = EMPTY_STRING;
+            }
+        }
+
+        String formatStr = null;
+
+        try
+        {
+            formatStr = resourceBundle.getString( key );
+        }
+        catch( MissingResourceException missingResExc )
+        {
+            //Handle missing resource below...
+        }
+
+        if( formatStr == null )
+        {
+            StringBuffer strBuffer = new StringBuffer( "Message entry with key " );
+            strBuffer.append( key );
+            strBuffer.append( " is missing from resource bundle " );
+            strBuffer.append( bundleName );
+            strBuffer.append( "\n" );
+            strBuffer.append( bundleName );
+            strBuffer.append( ":: " );
+            strBuffer.append( key );
+            for( int i = 0; i < objArray.length; i++ )
+            {
+                strBuffer.append( " " );
+                strBuffer.append( objArray[i].toString() );
+            }
+
+            message = strBuffer.toString();
+        }
+        else
+        {
+            MessageFormat msgformat = new MessageFormat( formatStr );
+            message = msgformat.format( ( (Object) ( objArray ) ) );
+        }
+
+        return message;
+    }
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/ValidationException.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/ValidationException.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/ValidationException.java	(revision 21851)
@@ -0,0 +1,32 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller;
+/**
+ *
+ * <p>Thrown if there is a failure during validation of human entered input. </p>
+ * @author Paul Hinds
+ * @version $Id: ValidationException.java,v 1.1.1.1 2005/10/18 18:20:52 teknopaul Exp $
+ */
+public class ValidationException extends InstallException{
+	public ValidationException() {
+	}
+	public ValidationException(String message) {
+		super(message);
+	}
+	public ValidationException(String message,Throwable cause) {
+		super(message,cause);
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.2.dtd
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.2.dtd	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.2.dtd	(revision 21851)
@@ -0,0 +1,120 @@
+<!--
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+-->
+<!ELEMENT validated EMPTY >
+<!ATTLIST validated defaultValue CDATA #REQUIRED >
+<!ATTLIST validated regex CDATA #REQUIRED >
+<!ATTLIST validated displayText CDATA #REQUIRED >
+<!ATTLIST validated property NMTOKEN #REQUIRED >
+<!ATTLIST validated explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT file EMPTY >
+<!ATTLIST file defaultValue CDATA #REQUIRED >
+<!ATTLIST file defaultValueWin CDATA #IMPLIED >
+<!ATTLIST file displayText CDATA #REQUIRED >
+<!ATTLIST file property NMTOKEN #REQUIRED >
+<!ATTLIST file checkExists (true | false) #IMPLIED  >
+<!ATTLIST file explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT option EMPTY >
+<!ATTLIST option value CDATA #REQUIRED >
+<!ATTLIST option text CDATA #REQUIRED >
+
+<!ELEMENT comment EMPTY >
+<!ATTLIST comment bold (true | false) #IMPLIED >
+<!ATTLIST comment displayText CDATA #REQUIRED >
+<!ATTLIST comment title NMTOKEN #IMPLIED >
+<!ATTLIST comment explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT checkbox EMPTY >
+<!ATTLIST checkbox defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST checkbox force (true | false) #IMPLIED  >
+<!ATTLIST checkbox displayText CDATA #REQUIRED >
+<!ATTLIST checkbox property NMTOKEN #REQUIRED >
+<!ATTLIST checkbox explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT installer ( page+ ) >
+<!ATTLIST installer verbose (true | false) #IMPLIED  >
+<!ATTLIST installer name CDATA #REQUIRED >
+<!ATTLIST installer windowIcon CDATA #IMPLIED >
+<!ATTLIST installer lookAndFeel NMTOKEN #IMPLIED >
+<!ATTLIST installer minJavaVersion NMTOKEN #IMPLIED >
+<!ATTLIST installer ui CDATA #IMPLIED >
+<!ATTLIST installer defaultImageResource CDATA #IMPLIED >
+
+<!ELEMENT directory EMPTY >
+<!ATTLIST directory defaultValue CDATA #REQUIRED >
+<!ATTLIST directory defaultValueWin CDATA #IMPLIED >
+<!ATTLIST directory create (true | false) #IMPLIED  >
+<!ATTLIST directory displayText CDATA #REQUIRED >
+<!ATTLIST directory property NMTOKEN #REQUIRED >
+<!ATTLIST directory checkExists (true | false) #IMPLIED  >
+<!ATTLIST directory explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT app-root EMPTY >
+<!ATTLIST app-root defaultValue CDATA #REQUIRED >
+<!ATTLIST app-root displayText CDATA #REQUIRED >
+<!ATTLIST app-root property NMTOKEN #REQUIRED >
+<!ATTLIST app-root explanatoryText CDATA #IMPLIED >
+<!ATTLIST app-root checkFile1 CDATA #IMPLIED >
+<!ATTLIST app-root checkFile2 CDATA #IMPLIED >
+<!ATTLIST app-root checkDir1 CDATA #IMPLIED >
+<!ATTLIST app-root checkDir2 CDATA #IMPLIED >
+
+<!ELEMENT target EMPTY >
+<!ATTLIST target defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST target force (true | false) #IMPLIED  >
+<!ATTLIST target displayText CDATA #REQUIRED >
+<!ATTLIST target target NMTOKEN #REQUIRED >
+<!ATTLIST target explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT page ( app-root | comment | text | checkbox | select | directory | file | target | validated | password | date )* >
+<!ATTLIST page name NMTOKEN #REQUIRED >
+<!ATTLIST page type NMTOKEN #REQUIRED >
+<!ATTLIST page imageResource CDATA #IMPLIED >
+<!ATTLIST page resource CDATA #IMPLIED >
+<!ATTLIST page displayText CDATA #REQUIRED >
+<!ATTLIST page target NMTOKEN #IMPLIED >
+<!ATTLIST page ifTarget NMTOKEN #IMPLIED >
+
+<!ELEMENT select ( option+ ) >
+<!ATTLIST select defaultValue CDATA #REQUIRED >
+<!ATTLIST select explanatoryText CDATA #IMPLIED >
+<!ATTLIST select displayText CDATA #REQUIRED >
+<!ATTLIST select property NMTOKEN #REQUIRED >
+<!ATTLIST select explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT password EMPTY >
+<!ATTLIST password defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST password regex CDATA #REQUIRED >
+<!ATTLIST password displayText CDATA #REQUIRED >
+<!ATTLIST password property NMTOKEN #REQUIRED >
+<!ATTLIST password explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT date EMPTY >
+<!ATTLIST date defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST date dateFormat CDATA #REQUIRED >
+<!ATTLIST date displayText CDATA #REQUIRED >
+<!ATTLIST date property NMTOKEN #REQUIRED >
+<!ATTLIST date explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT text EMPTY >
+<!ATTLIST text defaultValue CDATA #REQUIRED >
+<!ATTLIST text displayText CDATA #REQUIRED >
+<!ATTLIST text property NMTOKEN #REQUIRED >
+<!ATTLIST text explanatoryText CDATA #IMPLIED >
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.3.dtd
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.3.dtd	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.3.dtd	(revision 21851)
@@ -0,0 +1,121 @@
+<!--
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+-->
+<!ELEMENT validated EMPTY >
+<!ATTLIST validated defaultValue CDATA #REQUIRED >
+<!ATTLIST validated regex CDATA #REQUIRED >
+<!ATTLIST validated displayText CDATA #REQUIRED >
+<!ATTLIST validated property NMTOKEN #REQUIRED >
+<!ATTLIST validated explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT file EMPTY >
+<!ATTLIST file defaultValue CDATA #REQUIRED >
+<!ATTLIST file defaultValueWin CDATA #IMPLIED >
+<!ATTLIST file displayText CDATA #REQUIRED >
+<!ATTLIST file property NMTOKEN #REQUIRED >
+<!ATTLIST file checkExists (true | false) #IMPLIED  >
+<!ATTLIST file explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT option EMPTY >
+<!ATTLIST option value CDATA #REQUIRED >
+<!ATTLIST option text CDATA #REQUIRED >
+
+<!ELEMENT comment EMPTY >
+<!ATTLIST comment bold (true | false) #IMPLIED >
+<!ATTLIST comment displayText CDATA #REQUIRED >
+<!ATTLIST comment title NMTOKEN #IMPLIED >
+<!ATTLIST comment explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT checkbox EMPTY >
+<!ATTLIST checkbox defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST checkbox force (true | false) #IMPLIED  >
+<!ATTLIST checkbox displayText CDATA #REQUIRED >
+<!ATTLIST checkbox property NMTOKEN #REQUIRED >
+<!ATTLIST checkbox explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT installer ( page+ ) >
+<!ATTLIST installer verbose (true | false) #IMPLIED  >
+<!ATTLIST installer name CDATA #REQUIRED >
+<!ATTLIST installer windowIcon CDATA #IMPLIED >
+<!ATTLIST installer lookAndFeel NMTOKEN #IMPLIED >
+<!ATTLIST installer minJavaVersion NMTOKEN #IMPLIED >
+<!ATTLIST installer ui CDATA #IMPLIED >
+<!ATTLIST installer defaultImageResource CDATA #IMPLIED >
+<!ATTLIST installer finishButtonText CDATA #IMPLIED >
+
+<!ELEMENT directory EMPTY >
+<!ATTLIST directory defaultValue CDATA #REQUIRED >
+<!ATTLIST directory defaultValueWin CDATA #IMPLIED >
+<!ATTLIST directory create (true | false) #IMPLIED  >
+<!ATTLIST directory displayText CDATA #REQUIRED >
+<!ATTLIST directory property NMTOKEN #REQUIRED >
+<!ATTLIST directory checkExists (true | false) #IMPLIED  >
+<!ATTLIST directory explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT app-root EMPTY >
+<!ATTLIST app-root defaultValue CDATA #REQUIRED >
+<!ATTLIST app-root displayText CDATA #REQUIRED >
+<!ATTLIST app-root property NMTOKEN #REQUIRED >
+<!ATTLIST app-root explanatoryText CDATA #IMPLIED >
+<!ATTLIST app-root checkFile1 CDATA #IMPLIED >
+<!ATTLIST app-root checkFile2 CDATA #IMPLIED >
+<!ATTLIST app-root checkDir1 CDATA #IMPLIED >
+<!ATTLIST app-root checkDir2 CDATA #IMPLIED >
+
+<!ELEMENT target EMPTY >
+<!ATTLIST target defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST target force (true | false) #IMPLIED  >
+<!ATTLIST target displayText CDATA #REQUIRED >
+<!ATTLIST target target NMTOKEN #REQUIRED >
+<!ATTLIST target explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT page ( app-root | comment | text | checkbox | select | directory | file | target | validated | password | date )* >
+<!ATTLIST page name NMTOKEN #REQUIRED >
+<!ATTLIST page type NMTOKEN #REQUIRED >
+<!ATTLIST page imageResource CDATA #IMPLIED >
+<!ATTLIST page resource CDATA #IMPLIED >
+<!ATTLIST page displayText CDATA #REQUIRED >
+<!ATTLIST page target NMTOKEN #IMPLIED >
+<!ATTLIST page ifTarget NMTOKEN #IMPLIED >
+
+<!ELEMENT select ( option+ ) >
+<!ATTLIST select defaultValue CDATA #REQUIRED >
+<!ATTLIST select explanatoryText CDATA #IMPLIED >
+<!ATTLIST select displayText CDATA #REQUIRED >
+<!ATTLIST select property NMTOKEN #REQUIRED >
+<!ATTLIST select explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT password EMPTY >
+<!ATTLIST password defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST password regex CDATA #REQUIRED >
+<!ATTLIST password displayText CDATA #REQUIRED >
+<!ATTLIST password property NMTOKEN #REQUIRED >
+<!ATTLIST password explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT date EMPTY >
+<!ATTLIST date defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST date dateFormat CDATA #REQUIRED >
+<!ATTLIST date displayText CDATA #REQUIRED >
+<!ATTLIST date property NMTOKEN #REQUIRED >
+<!ATTLIST date explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT text EMPTY >
+<!ATTLIST text defaultValue CDATA #REQUIRED >
+<!ATTLIST text displayText CDATA #REQUIRED >
+<!ATTLIST text property NMTOKEN #REQUIRED >
+<!ATTLIST text explanatoryText CDATA #IMPLIED >
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.4.dtd
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.4.dtd	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.4.dtd	(revision 21851)
@@ -0,0 +1,122 @@
+<!--
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+-->
+<!ELEMENT validated EMPTY >
+<!ATTLIST validated defaultValue CDATA #REQUIRED >
+<!ATTLIST validated regex CDATA #REQUIRED >
+<!ATTLIST validated displayText CDATA #REQUIRED >
+<!ATTLIST validated property NMTOKEN #REQUIRED >
+<!ATTLIST validated explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT file EMPTY >
+<!ATTLIST file defaultValue CDATA #REQUIRED >
+<!ATTLIST file defaultValueWin CDATA #IMPLIED >
+<!ATTLIST file displayText CDATA #REQUIRED >
+<!ATTLIST file property NMTOKEN #REQUIRED >
+<!ATTLIST file checkExists (true | false) #IMPLIED  >
+<!ATTLIST file explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT option EMPTY >
+<!ATTLIST option value CDATA #REQUIRED >
+<!ATTLIST option text CDATA #REQUIRED >
+
+<!ELEMENT comment EMPTY >
+<!ATTLIST comment bold (true | false) #IMPLIED >
+<!ATTLIST comment displayText CDATA #REQUIRED >
+<!ATTLIST comment title NMTOKEN #IMPLIED >
+<!ATTLIST comment explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT checkbox EMPTY >
+<!ATTLIST checkbox defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST checkbox force (true | false) #IMPLIED  >
+<!ATTLIST checkbox displayText CDATA #REQUIRED >
+<!ATTLIST checkbox property NMTOKEN #REQUIRED >
+<!ATTLIST checkbox explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT installer ( page+ ) >
+<!ATTLIST installer verbose (true | false) #IMPLIED  >
+<!ATTLIST installer name CDATA #REQUIRED >
+<!ATTLIST installer windowIcon CDATA #IMPLIED >
+<!ATTLIST installer lookAndFeel NMTOKEN #IMPLIED >
+<!ATTLIST installer minJavaVersion NMTOKEN #IMPLIED >
+<!ATTLIST installer ui CDATA #IMPLIED >
+<!ATTLIST installer defaultImageResource CDATA #IMPLIED >
+<!ATTLIST installer finishButtonText CDATA #IMPLIED >
+
+<!ELEMENT directory EMPTY >
+<!ATTLIST directory defaultValue CDATA #REQUIRED >
+<!ATTLIST directory defaultValueWin CDATA #IMPLIED >
+<!ATTLIST directory create (true | false) #IMPLIED  >
+<!ATTLIST directory displayText CDATA #REQUIRED >
+<!ATTLIST directory property NMTOKEN #REQUIRED >
+<!ATTLIST directory checkExists (true | false) #IMPLIED  >
+<!ATTLIST directory explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT app-root EMPTY >
+<!ATTLIST app-root defaultValue CDATA #REQUIRED >
+<!ATTLIST app-root displayText CDATA #REQUIRED >
+<!ATTLIST app-root property NMTOKEN #REQUIRED >
+<!ATTLIST app-root explanatoryText CDATA #IMPLIED >
+<!ATTLIST app-root checkFile1 CDATA #IMPLIED >
+<!ATTLIST app-root checkFile2 CDATA #IMPLIED >
+<!ATTLIST app-root checkDir1 CDATA #IMPLIED >
+<!ATTLIST app-root checkDir2 CDATA #IMPLIED >
+
+<!ELEMENT target EMPTY >
+<!ATTLIST target defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST target force (true | false) #IMPLIED  >
+<!ATTLIST target displayText CDATA #REQUIRED >
+<!ATTLIST target target NMTOKEN #REQUIRED >
+<!ATTLIST target explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT page ( app-root | comment | text | checkbox | select | directory | file | target | validated | password | date )* >
+<!ATTLIST page name NMTOKEN #REQUIRED >
+<!ATTLIST page type NMTOKEN #REQUIRED >
+<!ATTLIST page imageResource CDATA #IMPLIED >
+<!ATTLIST page resource CDATA #IMPLIED >
+<!ATTLIST page usePaging CDATA #IMPLIED >
+<!ATTLIST page displayText CDATA #REQUIRED >
+<!ATTLIST page target NMTOKEN #IMPLIED >
+<!ATTLIST page ifTarget NMTOKEN #IMPLIED >
+
+<!ELEMENT select ( option+ ) >
+<!ATTLIST select defaultValue CDATA #REQUIRED >
+<!ATTLIST select explanatoryText CDATA #IMPLIED >
+<!ATTLIST select displayText CDATA #REQUIRED >
+<!ATTLIST select property NMTOKEN #REQUIRED >
+<!ATTLIST select explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT password EMPTY >
+<!ATTLIST password defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST password regex CDATA #REQUIRED >
+<!ATTLIST password displayText CDATA #REQUIRED >
+<!ATTLIST password property NMTOKEN #REQUIRED >
+<!ATTLIST password explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT date EMPTY >
+<!ATTLIST date defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST date dateFormat CDATA #REQUIRED >
+<!ATTLIST date displayText CDATA #REQUIRED >
+<!ATTLIST date property NMTOKEN #REQUIRED >
+<!ATTLIST date explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT text EMPTY >
+<!ATTLIST text defaultValue CDATA #REQUIRED >
+<!ATTLIST text displayText CDATA #REQUIRED >
+<!ATTLIST text property NMTOKEN #REQUIRED >
+<!ATTLIST text explanatoryText CDATA #IMPLIED >
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.5.dtd
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.5.dtd	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.5.dtd	(revision 21851)
@@ -0,0 +1,125 @@
+<!--
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+-->
+<!ELEMENT validated EMPTY >
+<!ATTLIST validated defaultValue CDATA #REQUIRED >
+<!ATTLIST validated regex CDATA #REQUIRED >
+<!ATTLIST validated displayText CDATA #REQUIRED >
+<!ATTLIST validated property NMTOKEN #REQUIRED >
+<!ATTLIST validated explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT file EMPTY >
+<!ATTLIST file defaultValue CDATA #REQUIRED >
+<!ATTLIST file defaultValueWin CDATA #IMPLIED >
+<!ATTLIST file displayText CDATA #REQUIRED >
+<!ATTLIST file property NMTOKEN #REQUIRED >
+<!ATTLIST file checkExists (true | false) #IMPLIED  >
+<!ATTLIST file explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT option EMPTY >
+<!ATTLIST option value CDATA #REQUIRED >
+<!ATTLIST option text CDATA #REQUIRED >
+
+<!ELEMENT comment EMPTY >
+<!ATTLIST comment bold (true | false) #IMPLIED >
+<!ATTLIST comment displayText CDATA #REQUIRED >
+<!ATTLIST comment title NMTOKEN #IMPLIED >
+<!ATTLIST comment explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT checkbox EMPTY >
+<!ATTLIST checkbox defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST checkbox force (true | false) #IMPLIED  >
+<!ATTLIST checkbox displayText CDATA #REQUIRED >
+<!ATTLIST checkbox property NMTOKEN #REQUIRED >
+<!ATTLIST checkbox explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT installer ( page+ ) >
+<!ATTLIST installer verbose (true | false) #IMPLIED  >
+<!ATTLIST installer name CDATA #REQUIRED >
+<!ATTLIST installer windowIcon CDATA #IMPLIED >
+<!ATTLIST installer lookAndFeel NMTOKEN #IMPLIED >
+<!ATTLIST installer minJavaVersion NMTOKEN #IMPLIED >
+<!ATTLIST installer ui CDATA #IMPLIED >
+<!ATTLIST installer defaultImageResource CDATA #IMPLIED >
+<!ATTLIST installer finishButtonText CDATA #IMPLIED >
+<!ATTLIST installer antialiased CDATA #IMPLIED >
+
+<!ELEMENT directory EMPTY >
+<!ATTLIST directory defaultValue CDATA #REQUIRED >
+<!ATTLIST directory defaultValueWin CDATA #IMPLIED >
+<!ATTLIST directory create (true | false) #IMPLIED  >
+<!ATTLIST directory displayText CDATA #REQUIRED >
+<!ATTLIST directory property NMTOKEN #REQUIRED >
+<!ATTLIST directory checkExists (true | false) #IMPLIED  >
+<!ATTLIST directory explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT app-root EMPTY >
+<!ATTLIST app-root defaultValue CDATA #REQUIRED >
+<!ATTLIST app-root displayText CDATA #REQUIRED >
+<!ATTLIST app-root property NMTOKEN #REQUIRED >
+<!ATTLIST app-root explanatoryText CDATA #IMPLIED >
+<!ATTLIST app-root checkFile1 CDATA #IMPLIED >
+<!ATTLIST app-root checkFile2 CDATA #IMPLIED >
+<!ATTLIST app-root checkDir1 CDATA #IMPLIED >
+<!ATTLIST app-root checkDir2 CDATA #IMPLIED >
+
+<!ELEMENT target EMPTY >
+<!ATTLIST target defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST target force (true | false) #IMPLIED  >
+<!ATTLIST target displayText CDATA #REQUIRED >
+<!ATTLIST target target NMTOKEN #REQUIRED >
+<!ATTLIST target explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT page ( app-root | comment | text | checkbox | select | directory | file | target | validated | password | date )* >
+<!ATTLIST page name NMTOKEN #REQUIRED >
+<!ATTLIST page type NMTOKEN #REQUIRED >
+<!ATTLIST page imageResource CDATA #IMPLIED >
+<!ATTLIST page resource CDATA #IMPLIED >
+<!ATTLIST page usePaging CDATA #IMPLIED >
+<!ATTLIST page displayText CDATA #REQUIRED >
+<!ATTLIST page target NMTOKEN #IMPLIED >
+<!ATTLIST page ifTarget NMTOKEN #IMPLIED >
+<!ATTLIST page splashResource NMTOKEN #IMPLIED >
+<!ATTLIST page altText NMTOKEN #IMPLIED >
+
+<!ELEMENT select ( option+ ) >
+<!ATTLIST select defaultValue CDATA #REQUIRED >
+<!ATTLIST select explanatoryText CDATA #IMPLIED >
+<!ATTLIST select displayText CDATA #REQUIRED >
+<!ATTLIST select property NMTOKEN #REQUIRED >
+<!ATTLIST select explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT password EMPTY >
+<!ATTLIST password defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST password regex CDATA #REQUIRED >
+<!ATTLIST password displayText CDATA #REQUIRED >
+<!ATTLIST password property NMTOKEN #REQUIRED >
+<!ATTLIST password explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT date EMPTY >
+<!ATTLIST date defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST date dateFormat CDATA #REQUIRED >
+<!ATTLIST date displayText CDATA #REQUIRED >
+<!ATTLIST date property NMTOKEN #REQUIRED >
+<!ATTLIST date explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT text EMPTY >
+<!ATTLIST text defaultValue CDATA #REQUIRED >
+<!ATTLIST text displayText CDATA #REQUIRED >
+<!ATTLIST text property NMTOKEN #REQUIRED >
+<!ATTLIST text explanatoryText CDATA #IMPLIED >
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.6.dtd
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.6.dtd	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.6.dtd	(revision 21851)
@@ -0,0 +1,132 @@
+<!--
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+-->
+<!ELEMENT validated EMPTY >
+<!ATTLIST validated defaultValue CDATA #REQUIRED >
+<!ATTLIST validated regex CDATA #REQUIRED >
+<!ATTLIST validated displayText CDATA #REQUIRED >
+<!ATTLIST validated property NMTOKEN #REQUIRED >
+<!ATTLIST validated explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT file EMPTY >
+<!ATTLIST file defaultValue CDATA #REQUIRED >
+<!ATTLIST file defaultValueWin CDATA #IMPLIED >
+<!ATTLIST file displayText CDATA #REQUIRED >
+<!ATTLIST file property NMTOKEN #REQUIRED >
+<!ATTLIST file checkExists (true | false) #IMPLIED  >
+<!ATTLIST file explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT option EMPTY >
+<!ATTLIST option value CDATA #REQUIRED >
+<!ATTLIST option text CDATA #REQUIRED >
+
+<!ELEMENT comment EMPTY >
+<!ATTLIST comment bold (true | false) #IMPLIED >
+<!ATTLIST comment displayText CDATA #REQUIRED >
+<!ATTLIST comment title NMTOKEN #IMPLIED >
+<!ATTLIST comment explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT checkbox EMPTY >
+<!ATTLIST checkbox defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST checkbox force (true | false) #IMPLIED  >
+<!ATTLIST checkbox displayText CDATA #REQUIRED >
+<!ATTLIST checkbox property NMTOKEN #REQUIRED >
+<!ATTLIST checkbox explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT installer ( page+ ) >
+<!ATTLIST installer verbose (true | false) #IMPLIED  >
+<!ATTLIST installer name CDATA #REQUIRED >
+<!ATTLIST installer windowIcon CDATA #IMPLIED >
+<!ATTLIST installer lookAndFeel NMTOKEN #IMPLIED >
+<!ATTLIST installer minJavaVersion NMTOKEN #IMPLIED >
+<!ATTLIST installer ui CDATA #IMPLIED >
+<!ATTLIST installer defaultImageResource CDATA #IMPLIED >
+<!ATTLIST installer finishButtonText CDATA #IMPLIED >
+<!ATTLIST installer antialiased CDATA #IMPLIED >
+
+<!ELEMENT directory EMPTY >
+<!ATTLIST directory defaultValue CDATA #REQUIRED >
+<!ATTLIST directory defaultValueWin CDATA #IMPLIED >
+<!ATTLIST directory create (true | false) #IMPLIED  >
+<!ATTLIST directory displayText CDATA #REQUIRED >
+<!ATTLIST directory property NMTOKEN #REQUIRED >
+<!ATTLIST directory checkExists (true | false) #IMPLIED  >
+<!ATTLIST directory explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT app-root EMPTY >
+<!ATTLIST app-root defaultValue CDATA #REQUIRED >
+<!ATTLIST app-root displayText CDATA #REQUIRED >
+<!ATTLIST app-root property NMTOKEN #REQUIRED >
+<!ATTLIST app-root explanatoryText CDATA #IMPLIED >
+<!ATTLIST app-root checkFile1 CDATA #IMPLIED >
+<!ATTLIST app-root checkFile2 CDATA #IMPLIED >
+<!ATTLIST app-root checkDir1 CDATA #IMPLIED >
+<!ATTLIST app-root checkDir2 CDATA #IMPLIED >
+
+<!ELEMENT target EMPTY >
+<!ATTLIST target defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST target force (true | false) #IMPLIED  >
+<!ATTLIST target displayText CDATA #REQUIRED >
+<!ATTLIST target target NMTOKEN #REQUIRED >
+<!ATTLIST target explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT page ( app-root | comment | text | checkbox | select | large-select | directory | file | target | validated | password | date )* >
+<!ATTLIST page name NMTOKEN #REQUIRED >
+<!ATTLIST page type NMTOKEN #REQUIRED >
+<!ATTLIST page imageResource CDATA #IMPLIED >
+<!ATTLIST page resource CDATA #IMPLIED >
+<!ATTLIST page usePaging CDATA #IMPLIED >
+<!ATTLIST page displayText CDATA #REQUIRED >
+<!ATTLIST page target NMTOKEN #IMPLIED >
+<!ATTLIST page ifTarget NMTOKEN #IMPLIED >
+<!ATTLIST page splashResource NMTOKEN #IMPLIED >
+<!ATTLIST page altText NMTOKEN #IMPLIED >
+
+<!ELEMENT select ( option+ ) >
+<!ATTLIST select defaultValue CDATA #REQUIRED >
+<!ATTLIST select explanatoryText CDATA #IMPLIED >
+<!ATTLIST select displayText CDATA #REQUIRED >
+<!ATTLIST select property NMTOKEN #REQUIRED >
+<!ATTLIST select explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT large-select ( option+ ) >
+<!ATTLIST large-select defaultValue CDATA #REQUIRED >
+<!ATTLIST large-select explanatoryText CDATA #IMPLIED >
+<!ATTLIST large-select displayText CDATA #REQUIRED >
+<!ATTLIST large-select property NMTOKEN #REQUIRED >
+<!ATTLIST large-select explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT password EMPTY >
+<!ATTLIST password defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST password regex CDATA #REQUIRED >
+<!ATTLIST password displayText CDATA #REQUIRED >
+<!ATTLIST password property NMTOKEN #REQUIRED >
+<!ATTLIST password explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT date EMPTY >
+<!ATTLIST date defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST date dateFormat CDATA #REQUIRED >
+<!ATTLIST date displayText CDATA #REQUIRED >
+<!ATTLIST date property NMTOKEN #REQUIRED >
+<!ATTLIST date explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT text EMPTY >
+<!ATTLIST text defaultValue CDATA #REQUIRED >
+<!ATTLIST text displayText CDATA #REQUIRED >
+<!ATTLIST text property NMTOKEN #REQUIRED >
+<!ATTLIST text explanatoryText CDATA #IMPLIED >
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.7.dtd
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.7.dtd	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.7.dtd	(revision 21851)
@@ -0,0 +1,157 @@
+<!--
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+-->
+<!ELEMENT validated EMPTY >
+<!ATTLIST validated defaultValue CDATA #REQUIRED >
+<!ATTLIST validated regex CDATA #REQUIRED >
+<!ATTLIST validated displayText CDATA #REQUIRED >
+<!ATTLIST validated property NMTOKEN #REQUIRED >
+<!ATTLIST validated explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT file EMPTY >
+<!ATTLIST file defaultValue CDATA #REQUIRED >
+<!ATTLIST file defaultValueWin CDATA #IMPLIED >
+<!ATTLIST file displayText CDATA #REQUIRED >
+<!ATTLIST file property NMTOKEN #REQUIRED >
+<!ATTLIST file checkExists (true | false) #IMPLIED  >
+<!ATTLIST file explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT option EMPTY >
+<!ATTLIST option value CDATA #REQUIRED >
+<!ATTLIST option text CDATA #REQUIRED >
+
+<!ELEMENT comment EMPTY >
+<!ATTLIST comment bold (true | false) #IMPLIED >
+<!ATTLIST comment displayText CDATA #REQUIRED >
+<!ATTLIST comment title NMTOKEN #IMPLIED >
+<!ATTLIST comment explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT checkbox EMPTY >
+<!ATTLIST checkbox defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST checkbox force (true | false) #IMPLIED  >
+<!ATTLIST checkbox displayText CDATA #REQUIRED >
+<!ATTLIST checkbox property NMTOKEN #REQUIRED >
+<!ATTLIST checkbox explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT installer ( page+ ) >
+<!ATTLIST installer verbose (true | false) #IMPLIED  >
+<!ATTLIST installer debug (true | false) #IMPLIED  >
+<!ATTLIST installer name CDATA #REQUIRED >
+<!ATTLIST installer windowIcon CDATA #IMPLIED >
+<!ATTLIST installer lookAndFeel NMTOKEN #IMPLIED >
+<!ATTLIST installer minJavaVersion NMTOKEN #IMPLIED >
+<!ATTLIST installer ui CDATA #IMPLIED >
+<!ATTLIST installer defaultImageResource CDATA #IMPLIED >
+<!ATTLIST installer finishButtonText CDATA #IMPLIED >
+<!ATTLIST installer antialiased CDATA #IMPLIED >
+
+<!ELEMENT directory EMPTY >
+<!ATTLIST directory defaultValue CDATA #REQUIRED >
+<!ATTLIST directory defaultValueWin CDATA #IMPLIED >
+<!ATTLIST directory create (true | false) #IMPLIED  >
+<!ATTLIST directory displayText CDATA #REQUIRED >
+<!ATTLIST directory property NMTOKEN #REQUIRED >
+<!ATTLIST directory checkExists (true | false) #IMPLIED  >
+<!ATTLIST directory explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT app-root EMPTY >
+<!ATTLIST app-root defaultValue CDATA #REQUIRED >
+<!ATTLIST app-root defaultValueWin CDATA #IMPLIED >
+<!ATTLIST app-root create (true | false) #IMPLIED  >
+<!ATTLIST app-root displayText CDATA #REQUIRED >
+<!ATTLIST app-root property NMTOKEN #REQUIRED >
+<!ATTLIST app-root checkExists (true | false) #IMPLIED  >
+<!ATTLIST app-root explanatoryText CDATA #IMPLIED >
+<!ATTLIST app-root checkFile1 CDATA #IMPLIED >
+<!ATTLIST app-root checkFile2 CDATA #IMPLIED >
+<!ATTLIST app-root checkDir1 CDATA #IMPLIED >
+<!ATTLIST app-root checkDir2 CDATA #IMPLIED >
+
+<!ELEMENT target EMPTY >
+<!ATTLIST target defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST target force (true | false) #IMPLIED  >
+<!ATTLIST target displayText CDATA #REQUIRED >
+<!ATTLIST target target NMTOKEN #REQUIRED >
+<!ATTLIST target explanatoryText CDATA #IMPLIED >
+<!ATTLIST target osSpecific CDATA #IMPLIED >
+<!ATTLIST target strict CDATA #IMPLIED >
+
+<!ELEMENT page ( app-root | comment | text | checkbox | select | large-select | target-select | directory | file | target | validated | password | date )* >
+<!ATTLIST page name CDATA #REQUIRED >
+<!ATTLIST page type NMTOKEN #REQUIRED >
+<!ATTLIST page imageResource CDATA #IMPLIED >
+<!ATTLIST page displayText CDATA #REQUIRED >
+<!ATTLIST page target NMTOKEN #IMPLIED >
+
+<!-- License page attributes -->
+<!ATTLIST page resource CDATA #IMPLIED >
+<!ATTLIST page usePaging CDATA #IMPLIED >
+
+<!-- Splash page attributes -->
+<!ATTLIST page splashResource CDATA #IMPLIED >
+<!ATTLIST page altText CDATA #IMPLIED >
+
+<!-- Progress page attributes -->
+<!ATTLIST page showTargets NMTOKEN #IMPLIED >
+
+<!-- Input page attributes -->
+<!ATTLIST page ifTarget NMTOKEN #IMPLIED >
+<!ATTLIST page ifProperty CDATA #IMPLIED >
+<!ATTLIST page overflow CDATA #IMPLIED >
+
+<!ELEMENT select ( option+ ) >
+<!ATTLIST select defaultValue CDATA #REQUIRED >
+<!ATTLIST select explanatoryText CDATA #IMPLIED >
+<!ATTLIST select displayText CDATA #REQUIRED >
+<!ATTLIST select property NMTOKEN #REQUIRED >
+<!ATTLIST select explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT large-select ( option+ ) >
+<!ATTLIST large-select defaultValue CDATA #REQUIRED >
+<!ATTLIST large-select explanatoryText CDATA #IMPLIED >
+<!ATTLIST large-select displayText CDATA #REQUIRED >
+<!ATTLIST large-select property NMTOKEN #REQUIRED >
+<!ATTLIST large-select explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT target-select ( option+ ) >
+<!ATTLIST target-select defaultValue CDATA #REQUIRED >
+<!ATTLIST target-select explanatoryText CDATA #IMPLIED >
+<!ATTLIST target-select displayText CDATA #REQUIRED >
+<!ATTLIST target-select property NMTOKEN #REQUIRED >
+<!ATTLIST target-select explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT password EMPTY >
+<!ATTLIST password defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST password regex CDATA #REQUIRED >
+<!ATTLIST password displayText CDATA #REQUIRED >
+<!ATTLIST password property NMTOKEN #REQUIRED >
+<!ATTLIST password explanatoryText CDATA #IMPLIED >
+<!ATTLIST password textMask CDATA #IMPLIED >
+
+<!ELEMENT date EMPTY >
+<!ATTLIST date defaultValue CDATA #REQUIRED >
+<!ATTLIST date dateFormat CDATA #REQUIRED >
+<!ATTLIST date displayText CDATA #REQUIRED >
+<!ATTLIST date property NMTOKEN #REQUIRED >
+<!ATTLIST date explanatoryText CDATA #IMPLIED >
+
+<!ELEMENT text EMPTY >
+<!ATTLIST text defaultValue CDATA #REQUIRED >
+<!ATTLIST text displayText CDATA #REQUIRED >
+<!ATTLIST text property NMTOKEN #REQUIRED >
+<!ATTLIST text explanatoryText CDATA #IMPLIED >
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.8.dtd
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.8.dtd	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.8.dtd	(revision 21851)
@@ -0,0 +1,205 @@
+<!--
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+-->
+<!ELEMENT validated EMPTY >
+<!ATTLIST validated defaultValue CDATA #REQUIRED >
+<!ATTLIST validated regex CDATA #REQUIRED >
+<!ATTLIST validated displayText CDATA #REQUIRED >
+<!ATTLIST validated property NMTOKEN #REQUIRED >
+<!ATTLIST validated explanatoryText CDATA #IMPLIED >
+<!ATTLIST validated name NMTOKEN #IMPLIED >
+
+<!ELEMENT file EMPTY >
+<!ATTLIST file defaultValue CDATA #REQUIRED >
+<!ATTLIST file defaultValueWin CDATA #IMPLIED >
+<!ATTLIST file displayText CDATA #REQUIRED >
+<!ATTLIST file property NMTOKEN #REQUIRED >
+<!ATTLIST file checkExists (true | false) #IMPLIED  >
+<!ATTLIST file explanatoryText CDATA #IMPLIED >
+<!ATTLIST file name NMTOKEN #IMPLIED >
+
+<!ELEMENT option EMPTY >
+<!ATTLIST option value CDATA #REQUIRED >
+<!ATTLIST option text CDATA #REQUIRED >
+<!ATTLIST option name NMTOKEN #IMPLIED >
+
+
+<!ELEMENT comment EMPTY >
+<!ATTLIST comment bold (true | false) #IMPLIED >
+<!ATTLIST comment displayText CDATA #IMPLIED >
+<!ATTLIST comment title NMTOKEN #IMPLIED >
+<!ATTLIST comment explanatoryText CDATA #IMPLIED >
+<!ATTLIST comment name NMTOKEN #IMPLIED >
+
+
+<!ELEMENT checkbox EMPTY >
+<!ATTLIST checkbox defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST checkbox force (true | false) #IMPLIED  >
+<!ATTLIST checkbox displayText CDATA #REQUIRED >
+<!ATTLIST checkbox property NMTOKEN #REQUIRED >
+<!ATTLIST checkbox explanatoryText CDATA #IMPLIED >
+<!ATTLIST checkbox name NMTOKEN #IMPLIED >
+
+
+<!ELEMENT installer ( page+ ) >
+<!ATTLIST installer verbose (true | false) #IMPLIED  >
+<!ATTLIST installer debug (true | false) #IMPLIED  >
+<!ATTLIST installer name CDATA #REQUIRED >
+<!ATTLIST installer windowIcon CDATA #IMPLIED >
+<!ATTLIST installer lookAndFeel NMTOKEN #IMPLIED >
+<!ATTLIST installer minJavaVersion NMTOKEN #IMPLIED >
+<!ATTLIST installer ui CDATA #IMPLIED >
+<!ATTLIST installer defaultImageResource CDATA #IMPLIED >
+<!ATTLIST installer finishButtonText CDATA #IMPLIED >
+<!ATTLIST installer antialiased CDATA #IMPLIED >
+<!ATTLIST installer wide CDATA #IMPLIED >
+<!ATTLIST installer loadDefaults (true | prompt | false) #IMPLIED  >
+<!ATTLIST installer version CDATA #IMPLIED  >
+
+<!ELEMENT directory EMPTY >
+<!ATTLIST directory defaultValue CDATA #REQUIRED >
+<!ATTLIST directory defaultValueWin CDATA #IMPLIED >
+<!ATTLIST directory create (true | false) #IMPLIED  >
+<!ATTLIST directory displayText CDATA #REQUIRED >
+<!ATTLIST directory property NMTOKEN #REQUIRED >
+<!ATTLIST directory checkExists (true | false) #IMPLIED  >
+<!ATTLIST directory explanatoryText CDATA #IMPLIED >
+<!ATTLIST directory name NMTOKEN #IMPLIED >
+
+
+<!ELEMENT app-root EMPTY >
+<!ATTLIST app-root defaultValue CDATA #REQUIRED >
+<!ATTLIST app-root defaultValueWin CDATA #IMPLIED >
+<!ATTLIST app-root create (true | false) #IMPLIED  >
+<!ATTLIST app-root displayText CDATA #REQUIRED >
+<!ATTLIST app-root property NMTOKEN #REQUIRED >
+<!ATTLIST app-root checkExists (true | false) #IMPLIED  >
+<!ATTLIST app-root explanatoryText CDATA #IMPLIED >
+<!ATTLIST app-root checkFile1 CDATA #IMPLIED >
+<!ATTLIST app-root checkFile2 CDATA #IMPLIED >
+<!ATTLIST app-root checkDir1 CDATA #IMPLIED >
+<!ATTLIST app-root checkDir2 CDATA #IMPLIED >
+<!ATTLIST app-root name NMTOKEN #IMPLIED >
+
+
+<!ELEMENT target EMPTY >
+<!ATTLIST target defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST target force (true | false) #IMPLIED  >
+<!ATTLIST target displayText CDATA #REQUIRED >
+<!ATTLIST target target NMTOKEN #REQUIRED >
+<!ATTLIST target explanatoryText CDATA #IMPLIED >
+<!ATTLIST target osSpecific CDATA #IMPLIED >
+<!ATTLIST target strict CDATA #IMPLIED >
+<!ATTLIST target name NMTOKEN #IMPLIED >
+
+<!ELEMENT conditional  ( hidden+ ) >
+<!ATTLIST conditional ifProperty CDATA #REQUIRED >
+<!ELEMENT hidden EMPTY >
+<!ATTLIST hidden property NMTOKEN #REQUIRED >
+<!ATTLIST hidden value CDATA #REQUIRED >
+
+<!ELEMENT page ( app-root | comment | text | checkbox | select | large-select | target-select | directory | file | target | validated | password | password-confirm | date | hidden | conditional )* >
+<!ATTLIST page name CDATA #REQUIRED >
+<!ATTLIST page type NMTOKEN #REQUIRED >
+<!ATTLIST page imageResource CDATA #IMPLIED >
+<!ATTLIST page displayText CDATA #REQUIRED >
+<!ATTLIST page target NMTOKEN #IMPLIED >
+<!ATTLIST page postDisplayTarget NMTOKEN #IMPLIED >
+
+
+<!-- License page attributes -->
+<!ATTLIST page resource CDATA #IMPLIED >
+<!ATTLIST page usePaging CDATA #IMPLIED >
+
+<!-- Splash page attributes -->
+<!ATTLIST page splashResource CDATA #IMPLIED >
+<!ATTLIST page altText CDATA #IMPLIED >
+
+<!-- Text page attributes -->
+<!ATTLIST page htmlResource CDATA #IMPLIED >
+<!ATTLIST page textResource CDATA #IMPLIED >
+
+<!-- Progress page attributes -->
+<!ATTLIST page showTargets NMTOKEN #IMPLIED >
+
+<!-- Input page attributes -->
+<!ATTLIST page ifTarget NMTOKEN #IMPLIED >
+<!ATTLIST page ifProperty CDATA #IMPLIED >
+<!ATTLIST page overflow CDATA #IMPLIED >
+
+<!ELEMENT select ( option+ ) >
+<!ATTLIST select defaultValue CDATA #REQUIRED >
+<!ATTLIST select explanatoryText CDATA #IMPLIED >
+<!ATTLIST select displayText CDATA #REQUIRED >
+<!ATTLIST select property NMTOKEN #REQUIRED >
+<!ATTLIST select explanatoryText CDATA #IMPLIED >
+
+
+<!ELEMENT large-select ( option+ ) >
+<!ATTLIST large-select defaultValue CDATA #REQUIRED >
+<!ATTLIST large-select explanatoryText CDATA #IMPLIED >
+<!ATTLIST large-select displayText CDATA #REQUIRED >
+<!ATTLIST large-select property NMTOKEN #REQUIRED >
+<!ATTLIST large-select explanatoryText CDATA #IMPLIED >
+
+
+<!ELEMENT target-select ( option+ ) >
+<!ATTLIST target-select defaultValue CDATA #REQUIRED >
+<!ATTLIST target-select explanatoryText CDATA #IMPLIED >
+<!ATTLIST target-select displayText CDATA #REQUIRED >
+<!ATTLIST target-select property NMTOKEN #REQUIRED >
+<!ATTLIST target-select explanatoryText CDATA #IMPLIED >
+
+
+<!ELEMENT password EMPTY >
+<!ATTLIST password defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST password regex CDATA #REQUIRED >
+<!ATTLIST password displayText CDATA #REQUIRED >
+<!ATTLIST password property NMTOKEN #REQUIRED >
+<!ATTLIST password explanatoryText CDATA #IMPLIED >
+<!ATTLIST password textMask CDATA #IMPLIED >
+<!ATTLIST password name NMTOKEN #IMPLIED >
+
+
+<!ELEMENT password-confirm EMPTY >
+<!ATTLIST password-confirm defaultValue NMTOKEN #REQUIRED >
+<!ATTLIST password-confirm regex CDATA #IMPLIED >
+<!ATTLIST password-confirm displayText CDATA #REQUIRED >
+<!ATTLIST password-confirm property NMTOKEN #REQUIRED >
+<!ATTLIST password-confirm explanatoryText CDATA #IMPLIED >
+<!ATTLIST password-confirm textMask CDATA #IMPLIED >
+<!ATTLIST password-confirm origField CDATA #REQUIRED >
+<!ATTLIST password-confirm name NMTOKEN #IMPLIED >
+
+
+<!ELEMENT date EMPTY >
+<!ATTLIST date defaultValue CDATA #REQUIRED >
+<!ATTLIST date dateFormat CDATA #REQUIRED >
+<!ATTLIST date displayText CDATA #REQUIRED >
+<!ATTLIST date property NMTOKEN #REQUIRED >
+<!ATTLIST date explanatoryText CDATA #IMPLIED >
+<!ATTLIST date name NMTOKEN #IMPLIED >
+
+
+<!ELEMENT text EMPTY >
+<!ATTLIST text defaultValue CDATA #REQUIRED >
+<!ATTLIST text displayText CDATA #REQUIRED >
+<!ATTLIST text property NMTOKEN #REQUIRED >
+<!ATTLIST text explanatoryText CDATA #IMPLIED >
+<!ATTLIST text name NMTOKEN #IMPLIED >
+
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/FeedbackListener.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/FeedbackListener.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/FeedbackListener.java	(revision 21851)
@@ -0,0 +1,105 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.antmod;
+
+import java.util.ResourceBundle;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildListener;
+import org.tp23.antinstaller.renderer.swing.SwingInstallerContext;
+import org.tp23.antinstaller.Installer;
+
+/**
+ *
+ * <p>Reports a message in the swing UI this mesage is reported in the
+ * top of the window. </p>
+ * <p>The Listeners should apparently never uses System.out or System.err</p>
+ * This class is not really an Ant modification since it simply implements
+ * a public interface but is here on the offchance that one day Ant changes
+ * it's APIs
+ * @author Paul Hinds
+ * @version $Id: FeedbackListener.java,v 1.1.1.1 2005/10/18 18:20:52 teknopaul Exp $
+ */
+public class FeedbackListener implements BuildListener{
+
+	private final SwingInstallerContext swingCtx;
+
+	public FeedbackListener(SwingInstallerContext swingCtx) {
+		this.swingCtx=swingCtx;
+	}
+
+	/**
+	 * buildStarted This event results in User notification
+	 *
+	 * @param buildEvent BuildEvent
+	 */
+	public void buildStarted(BuildEvent buildEvent) {
+		//swingCtx.provideAntFeedBack(buildEvent.getMessage());
+		swingCtx.buildStarted(buildEvent);
+	}
+
+	/**
+	 * buildFinished This event results in User notification
+	 *
+	 * @param buildEvent BuildEvent
+	 */
+	public void buildFinished(BuildEvent buildEvent) {
+		swingCtx.provideAntFeedBack(org.tp23.antinstaller.Installer.langPack.getString("installFinished"));
+		swingCtx.buildFinished(buildEvent);
+	}
+
+	/**
+	 * targetStarted This event results in User notification
+	 *
+	 * @param buildEvent BuildEvent
+	 */
+	public void targetStarted(BuildEvent buildEvent) {
+		swingCtx.provideAntFeedBack(org.tp23.antinstaller.Installer.langPack.getString("running")+buildEvent.getTarget());
+		swingCtx.targetStarted(buildEvent);
+	}
+
+	/**
+	 * targetFinished This event is ignored
+	 * @param buildEvent BuildEvent
+	 */
+	public void targetFinished(BuildEvent buildEvent) {
+		swingCtx.targetFinished(buildEvent);
+	}
+
+	/**
+	 * taskStarted This event is ignored
+	 * @param buildEvent BuildEvent
+	 */
+	public void taskStarted(BuildEvent buildEvent) {
+		//swingCtx.provideAntFeedBack(buildEvent.getMessage());
+	}
+
+	/**
+	 * taskFinished This event is ignored
+	 * @param buildEvent BuildEvent
+	 */
+	public void taskFinished(BuildEvent buildEvent) {
+		//swingCtx.provideAntFeedBack(buildEvent.getMessage());
+	}
+
+	/**
+	 * messageLogged This event is ignored
+	 * @param buildEvent BuildEvent
+	 */
+	public void messageLogged(BuildEvent buildEvent) {
+		//swingCtx.provideAntFeedBack(buildEvent.getMessage());
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/Jdk14RegexpMatcher.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/Jdk14RegexpMatcher.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/Jdk14RegexpMatcher.java	(revision 21851)
@@ -0,0 +1,139 @@
+/*
+ * Copyright  2001-2004 The Apache Software Foundation
+ *
+ *  Licensed 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.
+ *
+ */
+
+package org.tp23.antinstaller.antmod;
+
+import java.util.Vector;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.util.regexp.RegexpMatcher;
+import org.apache.tools.ant.util.regexp.RegexpUtil;
+
+/**
+ * Implementation of RegexpMatcher for the built-in regexp matcher of
+ * JDK 1.4. UNIX_LINES option is enabled as a default.
+ *
+ */
+public class Jdk14RegexpMatcher implements RegexpMatcher {
+
+    private String pattern;
+
+    public Jdk14RegexpMatcher() {
+    }
+
+    /**
+     * Set the regexp pattern from the String description.
+     */
+    public void setPattern(String pattern) {
+        this.pattern = pattern;
+    }
+
+    /**
+     * Get a String representation of the regexp pattern
+     */
+    public String getPattern() {
+        return pattern;
+    }
+
+    protected Pattern getCompiledPattern(int options)
+        throws BuildException {
+        int cOptions = getCompilerOptions(options);
+        try {
+            Pattern p = Pattern.compile(this.pattern, cOptions);
+            return p;
+        } catch (PatternSyntaxException e) {
+            throw new BuildException(e);
+        }
+    }
+
+    /**
+     * Does the given argument match the pattern?
+     */
+    public boolean matches(String argument) throws BuildException {
+        return matches(argument, MATCH_DEFAULT);
+    }
+
+    /**
+     * Does the given argument match the pattern?
+     */
+    public boolean matches(String input, int options)
+        throws BuildException {
+        try {
+            Pattern p = getCompiledPattern(options);
+            return p.matcher(input).find();
+        } catch (Exception e) {
+            throw new BuildException(e);
+        }
+    }
+
+    /**
+     * Returns a Vector of matched groups found in the argument.
+     *
+     * <p>Group 0 will be the full match, the rest are the
+     * parenthesized subexpressions</p>.
+     */
+    public Vector getGroups(String argument) throws BuildException {
+        return getGroups(argument, MATCH_DEFAULT);
+    }
+
+    /**
+     * Returns a Vector of matched groups found in the argument.
+     *
+     * <p>Group 0 will be the full match, the rest are the
+     * parenthesized subexpressions</p>.
+     */
+    public Vector getGroups(String input, int options)
+        throws BuildException {
+        Pattern p = getCompiledPattern(options);
+        Matcher matcher = p.matcher(input);
+        if (!matcher.find()) {
+            return null;
+        }
+        Vector v = new Vector();
+        int cnt = matcher.groupCount();
+        for (int i = 0; i <= cnt; i++) {
+            String match = matcher.group(i);
+            // treat non-matching groups as empty matches
+            if (match == null) {
+                match = "";
+            }
+            v.addElement(match);
+        }
+        return v;
+    }
+
+    protected int getCompilerOptions(int options) {
+        // be strict about line separator
+        int cOptions = Pattern.UNIX_LINES;
+
+        if (RegexpUtil.hasFlag(options, MATCH_CASE_INSENSITIVE)) {
+            cOptions |= Pattern.CASE_INSENSITIVE;
+        }
+        if (RegexpUtil.hasFlag(options, MATCH_MULTILINE)) {
+            cOptions |= Pattern.MULTILINE;
+        }
+        if (RegexpUtil.hasFlag(options, MATCH_SINGLELINE)) {
+            cOptions |= Pattern.DOTALL;
+        }
+
+        return cOptions;
+    }
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/Jdk14RegexpRegexp.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/Jdk14RegexpRegexp.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/Jdk14RegexpRegexp.java	(revision 21851)
@@ -0,0 +1,92 @@
+/*
+ * Copyright  2001-2004 The Apache Software Foundation
+ *
+ *  Licensed 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.
+ *
+ */
+package org.tp23.antinstaller.antmod;
+
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.util.regexp.Regexp;
+import org.apache.tools.ant.util.regexp.RegexpUtil;
+
+
+/***
+ * Regular expression implementation using the JDK 1.4 regular expression package
+ */
+public class Jdk14RegexpRegexp extends Jdk14RegexpMatcher implements Regexp {
+
+    public Jdk14RegexpRegexp() {
+        super();
+    }
+
+    protected int getSubsOptions(int options) {
+        int subsOptions = REPLACE_FIRST;
+        if (RegexpUtil.hasFlag(options, REPLACE_ALL)) {
+            subsOptions = REPLACE_ALL;
+        }
+        return subsOptions;
+    }
+
+    public String substitute(String input, String argument, int options)
+        throws BuildException {
+        // translate \1 to $(1) so that the Matcher will work
+        StringBuffer subst = new StringBuffer();
+        for (int i = 0; i < argument.length(); i++) {
+            char c = argument.charAt(i);
+            if (c == '$') {
+                subst.append('\\');
+                subst.append('$');
+            } else if (c == '\\') {
+                if (++i < argument.length()) {
+                    c = argument.charAt(i);
+                    int value = Character.digit(c, 10);
+                    if (value > -1) {
+                        subst.append("$").append(value);
+                    } else {
+                        subst.append(c);
+                    }
+                } else {
+                    // XXX - should throw an exception instead?
+                    subst.append('\\');
+                }
+            } else {
+                subst.append(c);
+            }
+        }
+        argument = subst.toString();
+
+        int sOptions = getSubsOptions(options);
+        Pattern p = getCompiledPattern(options);
+        StringBuffer sb = new StringBuffer();
+
+        Matcher m = p.matcher(input);
+        if (RegexpUtil.hasFlag(sOptions, REPLACE_ALL)) {
+            sb.append(m.replaceAll(argument));
+        } else {
+            boolean res = m.find();
+            if (res) {
+                m.appendReplacement(sb, argument);
+                m.appendTail(sb);
+            } else {
+                sb.append(input);
+            }
+        }
+
+        return sb.toString();
+    }
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/Launcher.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/Launcher.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/Launcher.java	(revision 21851)
@@ -0,0 +1,250 @@
+/*
+ * Copyright  2003-2004 The Apache Software Foundation
+ *
+ *  Licensed 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.
+ *
+ */
+package org.tp23.antinstaller.antmod;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.StringTokenizer;
+
+import org.apache.tools.ant.launch.LaunchException;
+import org.apache.tools.ant.launch.Locator;
+import org.tp23.antinstaller.InstallerContext;
+
+
+
+/**
+ *  This is a launcher for Ant.
+ *
+ * This file has been modified by Paul Hinds for Antinstaller and is not the same
+ * as the one delivered with Ant 1.6
+ *
+ * @since Ant 1.6
+ * @version $Id: Launcher.java,v 1.1.1.1 2005/10/18 18:20:54 teknopaul Exp $
+ */
+public class Launcher {
+	/** The Ant Home property */
+	public static final String ANTHOME_PROPERTY = "ant.home";
+
+
+	/** The Ant Library Directory property */
+	public static final String ANTLIBDIR_PROPERTY = "ant.library.dir";
+
+
+	/** The location of a per-user library directory */
+	public static final String USER_LIBDIR = ".ant/lib";
+
+
+	/** The startup class that is to be run */
+	public static final String MAIN_CLASS = "org.apache.tools.ant.Main";
+
+	private final Map allProperties;
+
+
+
+/**
+	 * Addtional Constructor to pass password properties to Ant
+	 * without saving them to a file.
+	 * Added by Paul Hinds
+	 * @param allProperties Properties
+	 */
+	public Launcher(Map allProperties) {
+		this.allProperties = allProperties;
+	}
+
+
+
+/**
+	 * Run the launcher to launch Ant
+	 *
+	 * @param args the command line arguments
+	 *
+	 * @exception MalformedURLException if the URLs required for the classloader
+	 *            cannot be created.
+	 */
+	public int run(String[] args, InstallerContext cxt) throws LaunchException, MalformedURLException {
+
+		try {
+
+			String antHomeProperty = System.getProperty(ANTHOME_PROPERTY);
+			File antHome = null;
+
+			File jarDir = null;
+
+			File sourceJar = Locator.getClassSource(getClass());
+			jarDir = sourceJar.getParentFile();
+
+			if (antHomeProperty != null) {
+				antHome = new File(antHomeProperty);
+			}
+
+			if (antHome == null || !antHome.exists()) {
+				antHome = jarDir.getParentFile();
+				System.setProperty(ANTHOME_PROPERTY, antHome.getAbsolutePath());
+			}
+
+			if (!antHome.exists()) {
+				throw new LaunchException("Ant home is set incorrectly or ant could not be located");
+			}
+
+			List libPaths = new ArrayList();
+			List argList = new ArrayList();
+			String[] newArgs;
+
+			for (int i = 0; i < args.length; ++i) {
+				if (args[i].equals("-lib")) {
+					if (i == args.length - 1) {
+						throw new LaunchException("The -lib argument must be followed by a library location");
+					}
+					libPaths.add(args[++i]);
+				}
+				else {
+					argList.add(args[i]);
+				}
+			}
+
+			if (libPaths.size() == 0) {
+				newArgs = args;
+			}
+			else {
+				newArgs = (String[]) argList.toArray(new String[0]);
+			}
+
+			List libPathURLs = new ArrayList();
+			for (Iterator i = libPaths.iterator(); i.hasNext(); ) {
+				String libPath = (String) i.next();
+				StringTokenizer myTokenizer
+					= new StringTokenizer(libPath, System.getProperty("path.separator"));
+				while (myTokenizer.hasMoreElements()) {
+					String elementName = myTokenizer.nextToken();
+					File element = new File(elementName);
+					if (elementName.indexOf("%") != -1 && !element.exists()) {
+						continue;
+					}
+					if (element.isDirectory()) {
+						// add any jars in the directory
+						URL[] dirURLs = Locator.getLocationURLs(element);
+						for (int j = 0; j < dirURLs.length; ++j) {
+							libPathURLs.add(dirURLs[j]);
+						}
+					}
+
+					libPathURLs.add(element.toURL());
+				}
+			}
+
+			URL[] libJars = (URL[]) libPathURLs.toArray(new URL[0]);
+
+			// Now try and find JAVA_HOME
+			File toolsJar = Locator.getToolsJar();
+
+			// determine ant library directory for system jars: use property
+			// or default using location of ant-launcher.jar
+			File antLibDir = null;
+			String antLibDirProperty = System.getProperty(ANTLIBDIR_PROPERTY);
+			if (antLibDirProperty != null) {
+				antLibDir = new File(antLibDirProperty);
+			}
+			if ( (antLibDir == null) || !antLibDir.exists()) {
+				antLibDir = jarDir;
+				System.setProperty(ANTLIBDIR_PROPERTY, antLibDir.getAbsolutePath());
+			}
+			URL[] systemJars = Locator.getLocationURLs(antLibDir);
+
+			File userLibDir
+				= new File(System.getProperty("user.home"), USER_LIBDIR);
+			URL[] userJars = Locator.getLocationURLs(userLibDir);
+
+
+			int numJars = libJars.length + userJars.length + systemJars.length;
+			if (toolsJar != null) {
+				numJars++;
+			}
+			URL[] jars = new URL[numJars];
+			System.arraycopy(libJars, 0, jars, 0, libJars.length);
+			System.arraycopy(userJars, 0, jars, libJars.length, userJars.length);
+			System.arraycopy(systemJars, 0, jars, userJars.length + libJars.length,
+							 systemJars.length);
+
+			if (toolsJar != null) {
+				jars[jars.length - 1] = toolsJar.toURL();
+			}
+
+
+			// now update the class.path property
+			StringBuffer baseClassPath
+				= new StringBuffer(System.getProperty("java.class.path"));
+			if (baseClassPath.charAt(baseClassPath.length() - 1)
+				== File.pathSeparatorChar) {
+				baseClassPath.setLength(baseClassPath.length() - 1);
+			}
+
+			for (int i = 0; i < jars.length; ++i) {
+				baseClassPath.append(File.pathSeparatorChar);
+				baseClassPath.append(Locator.fromURI(jars[i].toString()));
+			}
+
+			System.setProperty("java.class.path", baseClassPath.toString());
+
+			URLClassLoader loader = new URLClassLoader(jars);
+			Thread.currentThread().setContextClassLoader(loader);
+			try {
+				Main main = new Main();
+				Properties props = new Properties();
+				props.putAll(allProperties);
+				return main.startAnt(newArgs, props, null, cxt);
+			}
+			catch (Throwable t) {
+				t.printStackTrace();
+				return 1;
+			}
+		}
+		catch (Throwable ex) {
+			// Essentially all of the above is nice to have as far as AntInstaller is concerned
+			// ant.home may not be available when installing and application on a client that does not
+			// have and never will have Ant.  However the code is left since sometimes AntInstaller can be used
+			// for a general gui for Ant builds and features such and ANT_HOME/lib are useful
+			try {
+				System.setProperty(ANTHOME_PROPERTY, new File(".").getAbsolutePath());
+				Main main = new Main();
+				// fix for bug:1177191
+				// remove the -lib as discovered by Mark Anderson
+				String[] newArgs = new String[args.length-2];
+				for(int i=0,n=0;i<args.length;i++){
+					if(args[i].equals("-lib")){
+						i++;
+						continue;
+					}
+					newArgs[n++]=args[i];
+				}
+				Properties props = new Properties();
+				props.putAll(allProperties);
+				return main.startAnt(newArgs, props, null, cxt);
+			}
+			catch (Throwable t) {
+				t.printStackTrace();
+				return 1;
+			}
+		}
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/Main.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/Main.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/Main.java	(revision 21851)
@@ -0,0 +1,1064 @@
+/*
+ * Copyright  2000-2004 The Apache Software Foundation
+ *
+ *  Licensed 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.
+ *
+ */
+package org.tp23.antinstaller.antmod;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintStream;
+import java.util.Enumeration;
+import java.util.Properties;
+import java.util.Vector;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.BuildListener;
+import org.apache.tools.ant.BuildLogger;
+import org.apache.tools.ant.DefaultLogger;
+import org.apache.tools.ant.Diagnostics;
+import org.apache.tools.ant.ExitStatusException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.ProjectHelper;
+import org.apache.tools.ant.Target;
+import org.apache.tools.ant.input.DefaultInputHandler;
+import org.apache.tools.ant.input.InputHandler;
+import org.apache.tools.ant.launch.AntMain;
+import org.apache.tools.ant.util.JavaEnvUtils;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.PropertiesFileRenderer;
+
+
+/**
+ * Command line entry point into Ant. This class is entered via the
+ * canonical `public static void main` entry point and reads the
+ * command line arguments. It then assembles and executes an Ant
+ * project.
+ * <p>
+ * If you integrating Ant into some other tool, this is not the class
+ * to use as an entry point. Please see the source code of this
+ * class to see how it manipulates the Ant project classes.
+ *
+* This file has been modified by Paul Hinds for Antinstaller and is not the same
+* as the one delivered with Ant 1.6
+* @version $Id: Main.java,v 1.5 2007/01/12 10:41:48 anothermwilson Exp $
+ */
+public class Main implements AntMain {
+
+    /** The default build file name. */
+    public static final String DEFAULT_BUILD_FILENAME = "build.xml";
+
+    /** Our current message output status. Follows Project.MSG_XXX. */
+    private int msgOutputLevel = Project.MSG_INFO;
+
+    /** File that we are using for configuration. */
+    private File buildFile; /* null */
+
+    /** Stream to use for logging. */
+    private static PrintStream out = System.out;
+
+    /** Stream that we are using for logging error messages. */
+    private static PrintStream err = System.err;
+
+    /** The build targets. */
+    private Vector targets = new Vector();
+
+    /** Set of properties that can be used by tasks. */
+    private Properties definedProps = new Properties();
+
+    /** Names of classes to add as listeners to project. */
+    private Vector listeners = new Vector(1);
+
+    /** File names of property files to load on startup. */
+    private Vector propertyFiles = new Vector(1);
+
+    /** Indicates whether this build is to support interactive input */
+    private boolean allowInput = true;
+
+    /** keep going mode */
+    private boolean keepGoingMode = false;
+
+    /**
+     * The Ant logger class. There may be only one logger. It will have
+     * the right to use the 'out' PrintStream. The class must implements the
+     * BuildLogger interface.
+     */
+    private String loggerClassname = null;
+
+    /**
+     * The Ant InputHandler class.  There may be only one input
+     * handler.
+     */
+    private String inputHandlerClassname = null;
+
+    /**
+     * Whether or not output to the log is to be unadorned.
+     */
+    private boolean emacsMode = false;
+
+    /**
+     * Whether or not this instance has successfully been
+     * constructed and is ready to run.
+     */
+    private boolean readyToRun = false;
+
+    /**
+     * Whether or not we should only parse and display the project help
+     * information.
+     */
+    private boolean projectHelp = false;
+
+    /**
+     * Whether or not a logfile is being used. This is used to
+     * check if the output streams must be closed.
+     */
+    private static boolean isLogFileUsed = false;
+
+    /**
+     * optional thread priority
+     */
+    private Integer threadPriority = null;
+	/**
+	 * Installer Context
+	 */
+	private InstallerContext ctx = null;
+
+    /**
+     * Prints the message of the Throwable if it (the message) is not
+     * <code>null</code>.
+     *
+     * @param t Throwable to print the message of.
+     *          Must not be <code>null</code>.
+     */
+    private static void printMessage(Throwable t) {
+        String message = t.getMessage();
+        if (message != null) {
+            System.err.println(message);
+        }
+    }
+
+    /**
+     * Creates a new instance of this class using the
+     * arguments specified, gives it any extra user properties which have been
+     * specified, and then runs the build using the classloader provided.
+     *
+     * @param args Command line arguments. Must not be <code>null</code>.
+     * @param additionalUserProperties Any extra properties to use in this
+     *        build. May be <code>null</code>, which is the equivalent to
+     *        passing in an empty set of properties.
+     * @param coreLoader Classloader used for core classes. May be
+     *        <code>null</code> in which case the system classloader is used.
+     */
+    public static void start(String[] args, Properties additionalUserProperties,
+                             ClassLoader coreLoader) {
+        throw new UnsupportedOperationException("Required by Ant interface but not used");
+        //Main m = new Main();
+        //m.startAnt(args, additionalUserProperties, coreLoader);
+    }
+
+    
+	public void startAnt(String[] args, Properties additionalUserProperties,
+						 ClassLoader coreLoader) {
+        throw new UnsupportedOperationException("Required by Ant interface but not used");
+		//startAnt(args, additionalUserProperties, coreLoader, null); // FindBugs does not like this
+	}
+    /**
+     * Start Ant
+     * @param args command line args
+     * @param additionalUserProperties properties to set beyond those that
+     *        may be specified on the args list
+     * @param coreLoader - not used
+     * @return the return code that was used for System.exit() in the original Ant 
+     *
+     * @since Ant 1.6
+     */
+    public int startAnt(String[] args, Properties additionalUserProperties,
+                         ClassLoader coreLoader, InstallerContext ctx) {
+		 this.ctx = ctx;
+		 out = ctx.getAntOutputRenderer().getOut();
+		 err = ctx.getAntOutputRenderer().getErr();
+        try {
+            Diagnostics.validateVersion();
+            processArgs(args);
+        } catch (Throwable exc) {
+            handleLogfile();
+            printMessage(exc);
+            return 1;
+        }
+
+        if (additionalUserProperties != null) {
+            for (Enumeration e = additionalUserProperties.keys();
+                    e.hasMoreElements();) {
+                String key = (String) e.nextElement();
+                String property = additionalUserProperties.getProperty(key);
+                definedProps.put(key, property);
+            }
+        }
+
+        // expect the worst
+        int exitCode = 1;
+        try {
+            try {
+                runBuild(coreLoader);
+                exitCode = 0;
+            } catch (ExitStatusException ese) {
+                exitCode = ese.getStatus();
+                if (exitCode != 0) {
+                    throw ese;
+                }
+            }
+        } catch (BuildException be) {
+            if (err != System.err) {
+                printMessage(be);
+            }
+        } catch (Throwable exc) {
+            exc.printStackTrace();
+            printMessage(exc);
+        } finally {
+            handleLogfile();
+        }
+        //mod by Paul Hinds
+		return exitCode;
+		//System.exit(exitCode);
+    }
+
+    /**
+     * Close logfiles, if we have been writing to them.
+     *
+     * @since Ant 1.6
+     */
+    private static void handleLogfile() {
+        if (isLogFileUsed) {
+            if (out != null) {
+                try {
+                    out.close();
+                } catch (final Exception e) {
+                    //ignore
+                }
+            }
+            if (err != null) {
+                try {
+                    err.close();
+                } catch (final Exception e) {
+                    //ignore
+                }
+            }
+        }
+    }
+
+    /**
+     * Command line entry point. This method kicks off the building
+     * of a project object and executes a build using either a given
+     * target or the default target.
+     *
+     * @param args Command line arguments. Must not be <code>null</code>.
+     */
+//    public static void main(String[] args) {
+//        start(args, null, null);
+//    }
+//
+    /**
+     * Constructor used when creating Main for later arg processing
+     * and startup
+     */
+    public Main() {
+    }
+
+    /**
+     * Sole constructor, which parses and deals with command line
+     * arguments.
+     *
+     * @param args Command line arguments. Must not be <code>null</code>.
+     *
+     * @exception BuildException if the specified build file doesn't exist
+     *                           or is a directory.
+     *
+     * @deprecated
+     */
+    protected Main(String[] args) throws BuildException {
+        processArgs(args);
+    }
+
+    /**
+     * Process command line arguments.
+     * When ant is started from Launcher, the -lib argument does not get
+     * passed through to this routine.
+     *
+     * @param args the command line arguments.
+     *
+     * @since Ant 1.6
+     */
+    private void processArgs(String[] args) {
+        String searchForThis = null;
+        PrintStream logTo = null;
+
+        // cycle through given args
+
+        for (int i = 0; i < args.length; i++) {
+            String arg = args[i];
+
+            if (arg.equals("-help") || arg.equals("-h")) {
+                printUsage();
+                return;
+            } else if (arg.equals("-version")) {
+                printVersion();
+                return;
+            } else if (arg.equals("-diagnostics")) {
+                Diagnostics.doReport(System.out);
+                return;
+            } else if (arg.equals("-quiet") || arg.equals("-q")) {
+                msgOutputLevel = Project.MSG_WARN;
+            } else if (arg.equals("-verbose") || arg.equals("-v")) {
+                printVersion();
+                msgOutputLevel = Project.MSG_VERBOSE;
+            } else if (arg.equals("-debug") || arg.equals("-d")) {
+                printVersion();
+                msgOutputLevel = Project.MSG_DEBUG;
+            } else if (arg.equals("-noinput")) {
+                allowInput = false;
+            } else if (arg.equals("-logfile") || arg.equals("-l")) {
+                try {
+                    File logFile = new File(args[i + 1]);
+                    i++;
+                    logTo = new PrintStream(new FileOutputStream(logFile));
+                    isLogFileUsed = true;
+                } catch (IOException ioe) {
+                    String msg = "Cannot write on the specified log file. "
+                        + "Make sure the path exists and you have write "
+                        + "permissions.";
+                    throw new BuildException(msg);
+                } catch (ArrayIndexOutOfBoundsException aioobe) {
+                    String msg = "You must specify a log file when "
+                        + "using the -log argument";
+                    throw new BuildException(msg);
+                }
+            } else if (arg.equals("-buildfile") || arg.equals("-file")
+                       || arg.equals("-f")) {
+                try {
+                    buildFile = new File(args[i + 1].replace('/', File.separatorChar));
+                    i++;
+                } catch (ArrayIndexOutOfBoundsException aioobe) {
+                    String msg = "You must specify a buildfile when "
+                        + "using the -buildfile argument";
+                    throw new BuildException(msg);
+                }
+            } else if (arg.equals("-listener")) {
+                try {
+                    listeners.addElement(args[i + 1]);
+                    i++;
+                } catch (ArrayIndexOutOfBoundsException aioobe) {
+                    String msg = "You must specify a classname when "
+                        + "using the -listener argument";
+                    throw new BuildException(msg);
+                }
+            } else if (arg.startsWith("-D")) {
+
+                /* Interestingly enough, we get to here when a user
+                 * uses -Dname=value. However, in some cases, the OS
+                 * goes ahead and parses this out to args
+                 *   {"-Dname", "value"}
+                 * so instead of parsing on "=", we just make the "-D"
+                 * characters go away and skip one argument forward.
+                 *
+                 * I don't know how to predict when the JDK is going
+                 * to help or not, so we simply look for the equals sign.
+                 */
+
+                String name = arg.substring(2, arg.length());
+                String value = null;
+                int posEq = name.indexOf("=");
+                if (posEq > 0) {
+                    value = name.substring(posEq + 1);
+                    name = name.substring(0, posEq);
+                } else if (i < args.length - 1) {
+                    value = args[++i];
+                } else {
+                    throw new BuildException("Missing value for property "
+                                             + name);
+                }
+
+                definedProps.put(name, value);
+            } else if (arg.equals("-logger")) {
+                if (loggerClassname != null) {
+                    throw new BuildException("Only one logger class may "
+                        + " be specified.");
+                }
+                try {
+                    loggerClassname = args[++i];
+                } catch (ArrayIndexOutOfBoundsException aioobe) {
+                    throw new BuildException("You must specify a classname when"
+                                             + " using the -logger argument");
+                }
+            } else if (arg.equals("-inputhandler")) {
+                if (inputHandlerClassname != null) {
+                    throw new BuildException("Only one input handler class may "
+                                             + "be specified.");
+                }
+                try {
+                    inputHandlerClassname = args[++i];
+                } catch (ArrayIndexOutOfBoundsException aioobe) {
+                    throw new BuildException("You must specify a classname when"
+                                             + " using the -inputhandler"
+                                             + " argument");
+                }
+            } else if (arg.equals("-emacs") || arg.equals("-e")) {
+                emacsMode = true;
+            } else if (arg.equals("-projecthelp") || arg.equals("-p")) {
+                // set the flag to display the targets and quit
+                projectHelp = true;
+            } else if (arg.equals("-find") || arg.equals("-s")) {
+                // eat up next arg if present, default to build.xml
+                if (i < args.length - 1) {
+                    searchForThis = args[++i];
+                } else {
+                    searchForThis = DEFAULT_BUILD_FILENAME;
+                }
+            } else if (arg.startsWith("-propertyfile")) {
+                try {
+                    propertyFiles.addElement(args[i + 1]);
+                    i++;
+                } catch (ArrayIndexOutOfBoundsException aioobe) {
+                    String msg = "You must specify a property filename when "
+                        + "using the -propertyfile argument";
+                    throw new BuildException(msg);
+                }
+            } else if (arg.equals("-k") || arg.equals("-keep-going")) {
+                keepGoingMode = true;
+            } else if (arg.equals("-nice")) {
+                try {
+                    threadPriority=Integer.decode(args[i + 1]);
+                } catch (ArrayIndexOutOfBoundsException aioobe) {
+                    throw new BuildException(
+                            "You must supply a niceness value (1-10)"+
+                            " after the -nice option");
+                } catch (NumberFormatException e) {
+                    throw new BuildException("Unrecognized niceness value: " +
+                            args[i + 1]);
+                }
+                i++;
+                if(threadPriority.intValue()<Thread.MIN_PRIORITY ||
+                        threadPriority.intValue()>Thread.MAX_PRIORITY) {
+                    throw new BuildException(
+                            "Niceness value is out of the range 1-10");
+                }
+            } else if (arg.startsWith("-")) {
+                // we don't have any more args to recognize!
+                String msg = "Unknown argument: " + arg;
+                System.out.println(msg);
+                printUsage();
+                throw new BuildException("");
+            } else {
+                // if it's no other arg, it may be the target
+                targets.addElement(arg);
+            }
+        }
+
+        // if buildFile was not specified on the command line,
+        if (buildFile == null) {
+            // but -find then search for it
+            if (searchForThis != null) {
+                buildFile = findBuildFile(System.getProperty("user.dir"),
+                                          searchForThis);
+            } else {
+                buildFile = new File(DEFAULT_BUILD_FILENAME);
+            }
+        }
+
+        // make sure buildfile exists
+        if (!buildFile.exists()) {
+            System.out.println("Buildfile: " + buildFile + " does not exist!");
+            throw new BuildException("Build failed");
+        }
+
+        // make sure it's not a directory (this falls into the ultra
+        // paranoid lets check everything category
+
+        if (buildFile.isDirectory()) {
+            System.out.println("What? Buildfile: " + buildFile + " is a dir!");
+            throw new BuildException("Build failed");
+        }
+
+        // Load the property files specified by -propertyfile
+        for (int propertyFileIndex = 0;
+             propertyFileIndex < propertyFiles.size();
+             propertyFileIndex++) {
+            String filename
+                = (String) propertyFiles.elementAt(propertyFileIndex);
+            Properties props = new Properties();
+            FileInputStream fis = null;
+            try {
+                fis = new FileInputStream(filename);
+                props.load(fis);
+            } catch (IOException e) {
+                System.out.println("Could not load property file "
+                   + filename + ": " + e.getMessage());
+            } finally {
+                if (fis != null) {
+                    try {
+                        fis.close();
+                    } catch (IOException e) {
+                        // ignore
+                    }
+                }
+            }
+
+            // ensure that -D properties take precedence
+            Enumeration propertyNames = props.propertyNames();
+            while (propertyNames.hasMoreElements()) {
+                String name = (String) propertyNames.nextElement();
+                if (definedProps.getProperty(name) == null) {
+                    definedProps.put(name, props.getProperty(name));
+                }
+            }
+        }
+
+        if (msgOutputLevel >= Project.MSG_INFO) {
+            System.out.println("Buildfile: " + buildFile);
+        }
+
+        if (logTo != null) {
+            out = logTo;
+            err = logTo;
+            System.setOut(out);
+            System.setErr(err);
+        }
+        readyToRun = true;
+    }
+
+    /**
+     * Helper to get the parent file for a given file.
+     * <p>
+     * Added to simulate File.getParentFile() from JDK 1.2.
+     * @deprecated
+     *
+     * @param file   File to find parent of. Must not be <code>null</code>.
+     * @return       Parent file or null if none
+     */
+    private File getParentFile(File file) {
+        File parent = file.getParentFile();
+
+        if (parent != null && msgOutputLevel >= Project.MSG_VERBOSE) {
+            System.out.println("Searching in " + parent.getAbsolutePath());
+        }
+
+        return parent;
+    }
+
+    /**
+     * Search parent directories for the build file.
+     * <p>
+     * Takes the given target as a suffix to append to each
+     * parent directory in search of a build file.  Once the
+     * root of the file-system has been reached an exception
+     * is thrown.
+     *
+     * @param start  Leaf directory of search.
+     *               Must not be <code>null</code>.
+     * @param suffix  Suffix filename to look for in parents.
+     *                Must not be <code>null</code>.
+     *
+     * @return A handle to the build file if one is found
+     *
+     * @exception BuildException if no build file is found
+     */
+    private File findBuildFile(String start, String suffix)
+         throws BuildException {
+        if (msgOutputLevel >= Project.MSG_INFO) {
+            System.out.println("Searching for " + suffix + " ...");
+        }
+
+        File parent = new File(new File(start).getAbsolutePath());
+        File file = new File(parent, suffix);
+
+        // check if the target file exists in the current directory
+        while (!file.exists()) {
+            // change to parent directory
+            parent = getParentFile(parent);
+
+            // if parent is null, then we are at the root of the fs,
+            // complain that we can't find the build file.
+            if (parent == null) {
+                throw new BuildException("Could not locate a build file!");
+            }
+
+            // refresh our file handle
+            file = new File(parent, suffix);
+        }
+
+        return file;
+    }
+
+    /**
+     * Executes the build. If the constructor for this instance failed
+     * (e.g. returned after issuing a warning), this method returns
+     * immediately.
+     *
+     * @param coreLoader The classloader to use to find core classes.
+     *                   May be <code>null</code>, in which case the
+     *                   system classloader is used.
+     *
+     * @exception BuildException if the build fails
+     */
+    private void runBuild(ClassLoader coreLoader) throws BuildException {
+
+        if (!readyToRun) {
+            return;
+        }
+
+        final Project project = new Project();
+        project.setCoreLoader(coreLoader);
+
+        Throwable error = null;
+
+        try {
+            addBuildListeners(project);
+            addInputHandler(project);
+
+            PrintStream err = System.err;
+            PrintStream out = System.out;
+            InputStream in = System.in;
+
+            // use a system manager that prevents from System.exit()
+            // only in JDK > 1.1
+            SecurityManager oldsm = null;
+            if (!JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_0)
+                && !JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_1)) {
+                oldsm = System.getSecurityManager();
+
+                //SecurityManager can not be installed here for backwards
+                //compatibility reasons (PD). Needs to be loaded prior to
+                //ant class if we are going to implement it.
+                //System.setSecurityManager(new NoExitSecurityManager());
+            }
+            try {
+                if (allowInput) {
+                    project.setDefaultInputStream(System.in);
+                }
+                //System.setIn(new DemuxInputStream(project));
+                //System.setOut(new PrintStream(new DemuxOutputStream(project, false)));
+                //System.setErr(new PrintStream(new DemuxOutputStream(project, true)));
+
+
+                if (!projectHelp) {
+                    project.fireBuildStarted();
+                }
+
+                // set the thread priorities
+                if (threadPriority != null) {
+                    try {
+                        project.log("Setting Ant's thread priority to "
+                                + threadPriority,Project.MSG_VERBOSE);
+                        Thread.currentThread().setPriority(threadPriority.intValue());
+                    } catch (SecurityException swallowed) {
+                        //we cannot set the priority here.
+                        project.log("A security manager refused to set the -nice value");
+                    }
+                }
+
+                project.init();
+                project.setUserProperty("ant.version", getAntVersion());
+
+                // set user-define properties
+                Enumeration e = definedProps.keys();
+                while (e.hasMoreElements()) {
+                    String arg = (String) e.nextElement();
+                    String value = (String) definedProps.get(arg);
+                    project.setUserProperty(arg, value);
+                }
+
+                project.setUserProperty("ant.file",
+                                        buildFile.getAbsolutePath());
+                project.setKeepGoingMode(keepGoingMode);
+
+                ProjectHelper.configureProject(project, buildFile);
+
+				project.setBasedir(definedProps.getProperty(PropertiesFileRenderer.FILE_ROOT_PROPERTY));
+
+
+                if (projectHelp) {
+                    printDescription(project);
+                    printTargets(project, msgOutputLevel > Project.MSG_INFO);
+                    return;
+                }
+
+                // make sure that we have a target to execute
+                if (targets.size() == 0) {
+                    if (project.getDefaultTarget() != null) {
+                        targets.addElement(project.getDefaultTarget());
+                    }
+                }
+                project.executeTargets(targets);
+            } finally {
+                // put back the original security manager
+                //The following will never eval to true. (PD)
+                if (oldsm != null) {
+                    System.setSecurityManager(oldsm);
+                }
+
+                System.setOut(out);
+                System.setErr(err);
+                System.setIn(in);
+            }
+        } catch (RuntimeException exc) {
+            error = exc;
+            throw exc;
+        } catch (Error err) {
+            error = err;
+            throw err;
+        } finally {
+            if (!projectHelp) {
+                project.fireBuildFinished(error);
+            } else if (error != null) {
+                project.log(error.toString(), Project.MSG_ERR);
+            }
+        }
+    }
+
+    /**
+     * Adds the listeners specified in the command line arguments,
+     * along with the default listener, to the specified project.
+     *
+     * @param project The project to add listeners to.
+     *                Must not be <code>null</code>.
+     */
+    protected void addBuildListeners(Project project) {
+
+        // Add the default listener
+        project.addBuildListener(createLogger());
+
+		//Add the AntInstaller Listener
+        if(ctx.getBuildListener()!=null){
+        	project.addBuildListener(ctx.getBuildListener());
+        }
+
+        for (int i = 0; i < listeners.size(); i++) {
+            String className = (String) listeners.elementAt(i);
+            try {
+                BuildListener listener =
+                    (BuildListener) Class.forName(className).newInstance();
+                if (project != null) {
+                    project.setProjectReference(listener);
+                }
+                project.addBuildListener(listener);
+            } catch (Throwable exc) {
+                throw new BuildException("Unable to instantiate listener "
+                    + className, exc);
+            }
+        }
+    }
+
+    /**
+     * Creates the InputHandler and adds it to the project.
+     *
+     * @param project the project instance.
+     *
+     * @exception BuildException if a specified InputHandler
+     *                           implementation could not be loaded.
+     */
+    private void addInputHandler(Project project) throws BuildException {
+        InputHandler handler = null;
+        if (inputHandlerClassname == null) {
+            handler = new DefaultInputHandler();
+        } else {
+            try {
+                handler = (InputHandler)
+                    (Class.forName(inputHandlerClassname).newInstance());
+                if (project != null) {
+                    project.setProjectReference(handler);
+                }
+            } catch (ClassCastException e) {
+                String msg = "The specified input handler class "
+                    + inputHandlerClassname
+                    + " does not implement the InputHandler interface";
+                throw new BuildException(msg);
+            } catch (Exception e) {
+                String msg = "Unable to instantiate specified input handler "
+                    + "class " + inputHandlerClassname + " : "
+                    + e.getClass().getName();
+                throw new BuildException(msg);
+            }
+        }
+        project.setInputHandler(handler);
+    }
+
+    // XXX: (Jon Skeet) Any reason for writing a message and then using a bare
+    // RuntimeException rather than just using a BuildException here? Is it
+    // in case the message could end up being written to no loggers (as the
+    // loggers could have failed to be created due to this failure)?
+    /**
+     * Creates the default build logger for sending build events to the ant
+     * log.
+     *
+     * @return the logger instance for this build.
+     */
+    private BuildLogger createLogger() {
+        BuildLogger logger = null;
+        if (loggerClassname != null) {
+            try {
+                Class loggerClass = Class.forName(loggerClassname);
+                logger = (BuildLogger) (loggerClass.newInstance());
+            } catch (ClassCastException e) {
+                System.err.println("The specified logger class "
+                    + loggerClassname
+                    + " does not implement the BuildLogger interface");
+                throw new RuntimeException();
+            } catch (Exception e) {
+                System.err.println("Unable to instantiate specified logger "
+                    + "class " + loggerClassname + " : "
+                    + e.getClass().getName());
+                throw new RuntimeException();
+            }
+        } else {
+            logger = new DefaultLogger();
+        }
+
+        logger.setMessageOutputLevel(msgOutputLevel);
+        logger.setOutputPrintStream(out);
+        logger.setErrorPrintStream(err);
+        logger.setEmacsMode(emacsMode);
+
+        return logger;
+    }
+
+    /**
+     * Prints the usage information for this class to <code>System.out</code>.
+     */
+    private static void printUsage() {
+        String lSep = System.getProperty("line.separator");
+        StringBuffer msg = new StringBuffer();
+        msg.append("ant [options] [target [target2 [target3] ...]]" + lSep);
+        msg.append("Options: " + lSep);
+        msg.append("  -help, -h              print this message" + lSep);
+        msg.append("  -projecthelp, -p       print project help information" + lSep);
+        msg.append("  -version               print the version information and exit" + lSep);
+        msg.append("  -diagnostics           print information that might be helpful to" + lSep);
+        msg.append("                         diagnose or report problems." + lSep);
+        msg.append("  -quiet, -q             be extra quiet" + lSep);
+        msg.append("  -verbose, -v           be extra verbose" + lSep);
+        msg.append("  -debug, -d             print debugging information" + lSep);
+        msg.append("  -emacs, -e             produce logging information without adornments" + lSep);
+        msg.append("  -lib <path>            specifies a path to search for jars and classes" + lSep);
+        msg.append("  -logfile <file>        use given file for log" + lSep);
+        msg.append("    -l     <file>                ''" + lSep);
+        msg.append("  -logger <classname>    the class which is to perform logging" + lSep);
+        msg.append("  -listener <classname>  add an instance of class as a project listener" + lSep);
+        msg.append("  -noinput               do not allow interactive input" + lSep);
+        msg.append("  -buildfile <file>      use given buildfile" + lSep);
+        msg.append("    -file    <file>              ''" + lSep);
+        msg.append("    -f       <file>              ''" + lSep);
+        msg.append("  -D<property>=<value>   use value for given property" + lSep);
+        msg.append("  -keep-going, -k        execute all targets that do not depend" + lSep);
+        msg.append("                         on failed target(s)" + lSep);
+        msg.append("  -propertyfile <name>   load all properties from file with -D" + lSep);
+        msg.append("                         properties taking precedence" + lSep);
+        msg.append("  -inputhandler <class>  the class which will handle input requests" + lSep);
+        msg.append("  -find <file>           (s)earch for buildfile towards the root of" + lSep);
+        msg.append("    -s  <file>           the filesystem and use it" + lSep);
+        msg.append("  -nice  number          A niceness value for the main thread:" + lSep +
+                   "                         1 (lowest) to 10 (highest); 5 is the default" + lSep);
+        System.out.println(msg.toString());
+    }
+
+    /**
+     * Prints the Ant version information to <code>System.out</code>.
+     *
+     * @exception BuildException if the version information is unavailable
+     */
+    private static void printVersion() throws BuildException {
+        System.out.println(getAntVersion());
+    }
+
+    /**
+     * Cache of the Ant version information when it has been loaded.
+     */
+    private static String antVersion = null;
+
+    /**
+     * Returns the Ant version information, if available. Once the information
+     * has been loaded once, it's cached and returned from the cache on future
+     * calls.
+     *
+     * @return the Ant version information as a String
+     *         (always non-<code>null</code>)
+     *
+     * @exception BuildException if the version information is unavailable
+     */
+    public static synchronized String getAntVersion() throws BuildException {
+        if (antVersion == null) {
+            try {
+                Properties props = new Properties();
+                InputStream in =
+                    Main.class.getResourceAsStream("/org/apache/tools/ant/version.txt");
+                props.load(in);
+                in.close();
+
+                StringBuffer msg = new StringBuffer();
+                msg.append("Apache Ant version ");
+                msg.append(props.getProperty("VERSION"));
+                msg.append(" compiled on ");
+                msg.append(props.getProperty("DATE"));
+                antVersion = msg.toString();
+            } catch (IOException ioe) {
+                throw new BuildException("Could not load the version information:"
+                                         + ioe.getMessage());
+            } catch (NullPointerException npe) {
+                throw new BuildException("Could not load the version information.");
+            }
+        }
+        return antVersion;
+    }
+
+     /**
+      * Prints the description of a project (if there is one) to
+      * <code>System.out</code>.
+      *
+      * @param project The project to display a description of.
+      *                Must not be <code>null</code>.
+      */
+    private static void printDescription(Project project) {
+       if (project.getDescription() != null) {
+          project.log(project.getDescription());
+       }
+    }
+
+    /**
+     * Prints a list of all targets in the specified project to
+     * <code>System.out</code>, optionally including subtargets.
+     *
+     * @param project The project to display a description of.
+     *                Must not be <code>null</code>.
+     * @param printSubTargets Whether or not subtarget names should also be
+     *                        printed.
+     */
+    private static void printTargets(Project project, boolean printSubTargets) {
+        // find the target with the longest name
+        int maxLength = 0;
+        Enumeration ptargets = project.getTargets().elements();
+        String targetName;
+        String targetDescription;
+        Target currentTarget;
+        // split the targets in top-level and sub-targets depending
+        // on the presence of a description
+        Vector topNames = new Vector();
+        Vector topDescriptions = new Vector();
+        Vector subNames = new Vector();
+
+        while (ptargets.hasMoreElements()) {
+            currentTarget = (Target) ptargets.nextElement();
+            targetName = currentTarget.getName();
+            if (targetName.equals("")) {
+                continue;
+            }
+            targetDescription = currentTarget.getDescription();
+            // maintain a sorted list of targets
+            if (targetDescription == null) {
+                int pos = findTargetPosition(subNames, targetName);
+                subNames.insertElementAt(targetName, pos);
+            } else {
+                int pos = findTargetPosition(topNames, targetName);
+                topNames.insertElementAt(targetName, pos);
+                topDescriptions.insertElementAt(targetDescription, pos);
+                if (targetName.length() > maxLength) {
+                    maxLength = targetName.length();
+                }
+            }
+        }
+
+        printTargets(project, topNames, topDescriptions, "Main targets:",
+                     maxLength);
+        //if there were no main targets, we list all subtargets
+        //as it means nothing has a description
+        if (topNames.size() == 0) {
+            printSubTargets = true;
+        }
+        if (printSubTargets) {
+            printTargets(project, subNames, null, "Other targets:", 0);
+        }
+
+        String defaultTarget = project.getDefaultTarget();
+        if (defaultTarget != null && !"".equals(defaultTarget)) {
+            // shouldn't need to check but...
+            project.log("Default target: " + defaultTarget);
+        }
+    }
+
+    /**
+     * Searches for the correct place to insert a name into a list so as
+     * to keep the list sorted alphabetically.
+     *
+     * @param names The current list of names. Must not be <code>null</code>.
+     * @param name  The name to find a place for.
+     *              Must not be <code>null</code>.
+     *
+     * @return the correct place in the list for the given name
+     */
+    private static int findTargetPosition(Vector names, String name) {
+        int res = names.size();
+        for (int i = 0; i < names.size() && res == names.size(); i++) {
+            if (name.compareTo((String) names.elementAt(i)) < 0) {
+                res = i;
+            }
+        }
+        return res;
+    }
+
+    /**
+     * Writes a formatted list of target names to <code>System.out</code>
+     * with an optional description.
+     *
+     *
+     * @param project the project instance.
+     * @param names The names to be printed.
+     *              Must not be <code>null</code>.
+     * @param descriptions The associated target descriptions.
+     *                     May be <code>null</code>, in which case
+     *                     no descriptions are displayed.
+     *                     If non-<code>null</code>, this should have
+     *                     as many elements as <code>names</code>.
+     * @param heading The heading to display.
+     *                Should not be <code>null</code>.
+     * @param maxlen The maximum length of the names of the targets.
+     *               If descriptions are given, they are padded to this
+     *               position so they line up (so long as the names really
+     *               <i>are</i> shorter than this).
+     */
+    private static void printTargets(Project project, Vector names,
+                                     Vector descriptions, String heading,
+                                     int maxlen) {
+        // now, start printing the targets and their descriptions
+        String lSep = System.getProperty("line.separator");
+        // got a bit annoyed that I couldn't find a pad function
+        String spaces = "    ";
+        while (spaces.length() <= maxlen) {
+            spaces += spaces;
+        }
+        StringBuffer msg = new StringBuffer();
+        msg.append(heading);
+        msg.append(lSep);
+        msg.append(lSep);
+        for (int i = 0; i < names.size(); i++) {
+            msg.append(" ");
+            msg.append(names.elementAt(i));
+            if (descriptions != null) {
+                msg.append(spaces.substring(0, maxlen - ((String) names.elementAt(i)).length() + 2));
+                msg.append(descriptions.elementAt(i));
+            }
+            msg.append(lSep);
+        }
+        project.log(msg.toString());
+    }
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/ProjectHelper3.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/ProjectHelper3.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/ProjectHelper3.java	(revision 21851)
@@ -0,0 +1,1043 @@
+/*
+ * Copyright  2000-2004 The Apache Software Foundation
+ *
+ *  Licensed 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.
+ *
+ */
+
+package org.tp23.antinstaller.antmod;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URL;
+import java.util.Hashtable;
+import java.util.Stack;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Location;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.ProjectHelper;
+import org.apache.tools.ant.RuntimeConfigurable;
+import org.apache.tools.ant.Target;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.UnknownElement;
+import org.apache.tools.ant.helper.AntXMLContext;
+import org.apache.tools.ant.util.FileUtils;
+import org.apache.tools.ant.util.JAXPUtils;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * Sax2 based project reader
+ * 
+* This file has been modified by Paul Hinds for Antinstaller and is not the same
+* as the ProjectHelper2 delivered with Ant 1.6 although almost identical
+ */
+public class ProjectHelper3 extends ProjectHelper {
+    /* Stateless */
+
+    // singletons - since all state is in the context
+    private static AntHandler elementHandler = new ElementHandler();
+    private static AntHandler targetHandler = new TargetHandler();
+    private static AntHandler mainHandler = new MainHandler();
+    private static AntHandler projectHandler = new ProjectHandler();
+
+    /**
+     * helper for path -> URI and URI -> path conversions.
+     */
+    private static FileUtils fu = FileUtils.newFileUtils();
+
+    /**
+     * Parse an unknown element from a url
+     *
+     * @param project the current project
+     * @param source  the url containing the task
+     * @return a configured task
+     * @exception BuildException if an error occurs
+     */
+    public UnknownElement parseUnknownElement(Project project, URL source)
+        throws BuildException {
+        Target dummyTarget = new Target();
+        dummyTarget.setProject(project);
+
+        AntXMLContext context = new AntXMLContext(project);
+        context.addTarget(dummyTarget);
+        context.setImplicitTarget(dummyTarget);
+
+        parse(context.getProject(), source,
+              new RootHandler(context, elementHandler));
+        Task[] tasks = dummyTarget.getTasks();
+        if (tasks.length != 1) {
+            throw new BuildException("No tasks defined");
+        }
+        return (UnknownElement) tasks[0];
+    }
+    /**
+     * Parse a source xml input.
+     *
+     * @param project the current project
+     * @param source  the xml source
+     * @exception BuildException if an error occurs
+     */
+    public void parse(Project project, Object source)
+            throws BuildException {
+        getImportStack().addElement(source);
+        //System.out.println("Adding " + source);
+        AntXMLContext context = null;
+        context = (AntXMLContext) project.getReference("ant.parsing.context");
+//        System.out.println("Parsing " + getImportStack().size() + " " +
+//                context+ " " + getImportStack() );
+        if (context == null) {
+            context = new AntXMLContext(project);
+            project.addReference("ant.parsing.context", context);
+            project.addReference("ant.targets", context.getTargets());
+        }
+
+        if (getImportStack().size() > 1) {
+            // we are in an imported file.
+            context.setIgnoreProjectTag(true);
+            Target currentTarget = context.getCurrentTarget();
+            try {
+                Target newCurrent = new Target();
+                newCurrent.setProject(project);
+                newCurrent.setName("");
+                context.setCurrentTarget(newCurrent);
+                parse(project, source, new RootHandler(context, mainHandler));
+                newCurrent.execute();
+            } finally {
+                context.setCurrentTarget(currentTarget);
+            }
+        } else {
+            // top level file
+            parse(project, source, new RootHandler(context, mainHandler));
+            // Execute the top-level target
+            context.getImplicitTarget().execute();
+        }
+    }
+
+    /**
+     * Parses the project file, configuring the project as it goes.
+     *
+     * @param project the current project
+     * @param source  the xml source
+     * @param handler the root handler to use (contains the current context)
+     * @exception BuildException if the configuration is invalid or cannot
+     *                           be read
+     */
+    public void parse(Project project, Object source, RootHandler handler)
+            throws BuildException {
+
+        AntXMLContext context = handler.context;
+
+        File buildFile = null;
+        URL  url = null;
+        String buildFileName = null;
+
+        if (source instanceof File) {
+            buildFile = (File) source;
+            buildFile = fu.normalize(buildFile.getAbsolutePath());
+            context.setBuildFile(buildFile);
+            buildFileName = buildFile.toString();
+//         } else if (source instanceof InputStream ) {
+        } else if (source instanceof URL) {
+//        	These commented out code is the only difference
+//			between this class and ProjectHelper2
+//            if (handler.getCurrentAntHandler() != elementHandler) {
+//                throw new BuildException(
+//                    "Source " + source.getClass().getName()
+//                    + " not supported by this plugin for "
+//                    + " non task xml");
+//            }
+            url = (URL) source;
+            buildFileName = url.toString();
+//         } else if (source instanceof InputSource ) {
+        } else {
+            throw new BuildException("Source " + source.getClass().getName()
+                                     + " not supported by this plugin");
+        }
+
+        InputStream inputStream = null;
+        InputSource inputSource = null;
+
+
+        try {
+            /**
+             * SAX 2 style parser used to parse the given file.
+             */
+            XMLReader parser = JAXPUtils.getNamespaceXMLReader();
+
+            String uri = null;
+            if (buildFile != null) {
+                uri = fu.toURI(buildFile.getAbsolutePath());
+                inputStream = new FileInputStream(buildFile);
+            } else {
+                inputStream = url.openStream();
+                uri = url.toString(); // ?? OK ??
+            }
+
+            inputSource = new InputSource(inputStream);
+            if (uri != null) {
+                inputSource.setSystemId(uri);
+            }
+            project.log("parsing buildfile " + buildFileName
+                        + " with URI = " + uri, Project.MSG_VERBOSE);
+
+            DefaultHandler hb = handler;
+
+            parser.setContentHandler(hb);
+            parser.setEntityResolver(hb);
+            parser.setErrorHandler(hb);
+            parser.setDTDHandler(hb);
+            parser.parse(inputSource);
+        } catch (SAXParseException exc) {
+            Location location = new Location(exc.getSystemId(),
+                exc.getLineNumber(), exc.getColumnNumber());
+
+            Throwable t = exc.getException();
+            if (t instanceof BuildException) {
+                BuildException be = (BuildException) t;
+                if (be.getLocation() == Location.UNKNOWN_LOCATION) {
+                    be.setLocation(location);
+                }
+                throw be;
+            }
+
+            throw new BuildException(exc.getMessage(), t, location);
+        } catch (SAXException exc) {
+            Throwable t = exc.getException();
+            if (t instanceof BuildException) {
+                throw (BuildException) t;
+            }
+            throw new BuildException(exc.getMessage(), t);
+        } catch (FileNotFoundException exc) {
+            throw new BuildException(exc);
+        } catch (UnsupportedEncodingException exc) {
+              throw new BuildException("Encoding of project file "
+                                       + buildFileName + " is invalid.",
+                                       exc);
+        } catch (IOException exc) {
+            throw new BuildException("Error reading project file "
+                                     + buildFileName + ": " + exc.getMessage(),
+                                     exc);
+        } finally {
+            if (inputStream != null) {
+                try {
+                    inputStream.close();
+                } catch (IOException ioe) {
+                    // ignore this
+                }
+            }
+        }
+    }
+
+    /**
+     * The common superclass for all SAX event handlers used to parse
+     * the configuration file.
+     *
+     * The context will hold all state information. At each time
+     * there is one active handler for the current element. It can
+     * use onStartChild() to set an alternate handler for the child.
+     */
+    public static class AntHandler  {
+        /**
+         * Handles the start of an element. This base implementation does
+         * nothing.
+         *
+         * @param uri the namespace URI for the tag
+         * @param tag The name of the element being started.
+         *            Will not be <code>null</code>.
+         * @param qname The qualified name of the element.
+         * @param attrs Attributes of the element being started.
+         *              Will not be <code>null</code>.
+         * @param context The context that this element is in.
+         *
+         * @exception SAXParseException if this method is not overridden, or in
+         *                              case of error in an overridden version
+         */
+        public void onStartElement(String uri, String tag, String qname,
+                                   Attributes attrs,
+                                   AntXMLContext context)
+            throws SAXParseException {
+        }
+
+        /**
+         * Handles the start of an element. This base implementation just
+         * throws an exception - you must override this method if you expect
+         * child elements.
+         *
+         * @param uri The namespace uri for this element.
+         * @param tag The name of the element being started.
+         *            Will not be <code>null</code>.
+         * @param qname The qualified name for this element.
+         * @param attrs Attributes of the element being started.
+         *              Will not be <code>null</code>.
+         * @param context The current context.
+         * @return a handler (in the derived classes)
+         *
+         * @exception SAXParseException if this method is not overridden, or in
+         *                              case of error in an overridden version
+         */
+        public AntHandler onStartChild(String uri, String tag, String qname,
+                                       Attributes attrs,
+                                       AntXMLContext context)
+            throws SAXParseException {
+            throw new SAXParseException("Unexpected element \"" + qname
+                + " \"", context.getLocator());
+        }
+
+        /**
+         * Handle the end of a element.
+         *
+         * @param uri the namespace uri of the element
+         * @param tag the tag of the element
+         * @param qname the qualified name of the element
+         * @param context the current context
+         * @exception SAXParseException if an error occurs
+         */
+        public void onEndChild(String uri, String tag, String qname,
+                                     AntXMLContext context)
+            throws SAXParseException {
+        }
+
+        /**
+         * This method is called when this element and all elements nested into it have been
+         * handled. I.e., this happens at the &lt;/end_tag_of_the_element&gt;.
+         * @param uri the namespace uri for this element
+         * @param tag the element name
+         * @param context the current context
+         */
+        public void onEndElement(String uri, String tag,
+                                 AntXMLContext context) {
+        }
+
+        /**
+         * Handles text within an element. This base implementation just
+         * throws an exception, you must override it if you expect content.
+         *
+         * @param buf A character array of the text within the element.
+         *            Will not be <code>null</code>.
+         * @param start The start element in the array.
+         * @param count The number of characters to read from the array.
+         * @param context The current context.
+         *
+         * @exception SAXParseException if this method is not overridden, or in
+         *                              case of error in an overridden version
+         */
+        public void characters(char[] buf, int start, int count, AntXMLContext context)
+            throws SAXParseException {
+            String s = new String(buf, start, count).trim();
+
+            if (s.length() > 0) {
+                throw new SAXParseException("Unexpected text \"" + s
+                    + "\"", context.getLocator());
+            }
+        }
+
+        /**
+         * Will be called every time a namespace is reached.
+         * It'll verify if the ns was processed, and if not load the task
+         * definitions.
+         * @param uri The namespace uri.
+         */
+        protected void checkNamespace(String uri) {
+
+        }
+    }
+
+    /**
+     * Handler for ant processing. Uses a stack of AntHandlers to
+     * implement each element ( the original parser used a recursive behavior,
+     * with the implicit execution stack )
+     */
+    public static class RootHandler extends DefaultHandler {
+        private Stack antHandlers = new Stack();
+        private AntHandler currentHandler = null;
+        private AntXMLContext context;
+
+        /**
+         * Creates a new RootHandler instance.
+         *
+         * @param context The context for the handler.
+         * @param rootHandler The handler for the root element.
+         */
+        public RootHandler(AntXMLContext context, AntHandler rootHandler) {
+            currentHandler = rootHandler;
+            antHandlers.push(currentHandler);
+            this.context = context;
+        }
+
+        /**
+         * Returns the current ant handler object.
+         * @return the current ant handler.
+         */
+        public AntHandler getCurrentAntHandler() {
+            return currentHandler;
+        }
+
+        /**
+         * Resolves file: URIs relative to the build file.
+         *
+         * @param publicId The public identifier, or <code>null</code>
+         *                 if none is available. Ignored in this
+         *                 implementation.
+         * @param systemId The system identifier provided in the XML
+         *                 document. Will not be <code>null</code>.
+         * @return an inputsource for this identifier
+         */
+        public InputSource resolveEntity(String publicId,
+                                         String systemId) {
+
+            context.getProject().log("resolving systemId: "
+                + systemId, Project.MSG_VERBOSE);
+
+            if (systemId.startsWith("file:")) {
+                String path = fu.fromURI(systemId);
+
+                File file = new File(path);
+                if (!file.isAbsolute()) {
+                    file = fu.resolveFile(context.getBuildFileParent(), path);
+                }
+                try {
+                    InputSource inputSource =
+                            new InputSource(new FileInputStream(file));
+                    inputSource.setSystemId(fu.toURI(file.getAbsolutePath()));
+                    return inputSource;
+                } catch (FileNotFoundException fne) {
+                    context.getProject().log(file.getAbsolutePath()
+                        + " could not be found", Project.MSG_WARN);
+                }
+
+            }
+            // use default if not file or file not found
+            return null;
+        }
+
+        /**
+         * Handles the start of a project element. A project handler is created
+         * and initialised with the element name and attributes.
+         *
+         * @param uri The namespace uri for this element.
+         * @param tag The name of the element being started.
+         *            Will not be <code>null</code>.
+         * @param qname The qualified name for this element.
+         * @param attrs Attributes of the element being started.
+         *              Will not be <code>null</code>.
+         *
+         * @exception org.xml.sax.SAXParseException if the tag given is not
+         *                              <code>"project"</code>
+         */
+        public void startElement(String uri, String tag, String qname, Attributes attrs)
+            throws SAXParseException {
+            AntHandler next
+                = currentHandler.onStartChild(uri, tag, qname, attrs, context);
+            antHandlers.push(currentHandler);
+            currentHandler = next;
+            currentHandler.onStartElement(uri, tag, qname, attrs, context);
+        }
+
+        /**
+         * Sets the locator in the project helper for future reference.
+         *
+         * @param locator The locator used by the parser.
+         *                Will not be <code>null</code>.
+         */
+        public void setDocumentLocator(Locator locator) {
+            context.setLocator(locator);
+        }
+
+        /**
+         * Handles the end of an element. Any required clean-up is performed
+         * by the onEndElement() method and then the original handler
+         * is restored to the parser.
+         *
+         * @param uri  The namespace URI for this element.
+         * @param name The name of the element which is ending.
+         *             Will not be <code>null</code>.
+         * @param qName The qualified name for this element.
+         *
+         * @exception SAXException in case of error (not thrown in
+         *                         this implementation)
+         *
+         */
+        public void endElement(String uri, String name, String qName) throws SAXException {
+            currentHandler.onEndElement(uri, name, context);
+            AntHandler prev = (AntHandler) antHandlers.pop();
+            currentHandler = prev;
+            if (currentHandler != null) {
+                currentHandler.onEndChild(uri, name, qName, context);
+            }
+        }
+
+        /**
+         * Handle text within an element, calls currentHandler.characters.
+         *
+         * @param buf  A character array of the test.
+         * @param start The start offset in the array.
+         * @param count The number of characters to read.
+         * @exception SAXParseException if an error occurs
+         */
+        public void characters(char[] buf, int start, int count)
+            throws SAXParseException {
+            currentHandler.characters(buf, start, count, context);
+        }
+
+        /**
+         * Start a namespace prefix to uri mapping
+         *
+         * @param prefix the namespace prefix
+         * @param uri the namespace uri
+         */
+        public void startPrefixMapping(String prefix, String uri) {
+            context.startPrefixMapping(prefix, uri);
+        }
+
+        /**
+         * End a namepace prefix to uri mapping
+         *
+         * @param prefix the prefix that is not mapped anymore
+         */
+        public void endPrefixMapping(String prefix) {
+            context.endPrefixMapping(prefix);
+        }
+    }
+
+    /**
+     * The main handler - it handles the &lt;project&gt; tag.
+     *
+     * @see AntHandler
+     */
+    public static class MainHandler extends AntHandler {
+
+        /**
+         * Handle the project tag
+         *
+         * @param uri The namespace uri.
+         * @param name The element tag.
+         * @param qname The element qualified name.
+         * @param attrs The attributes of the element.
+         * @param context The current context.
+         * @return The project handler that handles subelements of project
+         * @exception SAXParseException if the qualified name is not "project".
+         */
+        public AntHandler onStartChild(String uri, String name, String qname,
+                                       Attributes attrs,
+                                       AntXMLContext context)
+            throws SAXParseException {
+            if (name.equals("project")
+                && (uri.equals("") || uri.equals(ANT_CORE_URI))) {
+                return ProjectHelper3.projectHandler;
+            } else {
+//                 if (context.importlevel > 0) {
+//                     // we are in an imported file. Allow top-level <target>.
+//                     if (qname.equals( "target" ) )
+//                         return ProjectHelper3.targetHandler;
+//                 }
+                throw new SAXParseException("Unexpected element \"" + qname
+                    + "\" " + name, context.getLocator());
+            }
+        }
+    }
+
+    /**
+     * Handler for the top level "project" element.
+     */
+    public static class ProjectHandler extends AntHandler {
+
+        /**
+         * Initialisation routine called after handler creation
+         * with the element name and attributes. The attributes which
+         * this handler can deal with are: <code>"default"</code>,
+         * <code>"name"</code>, <code>"id"</code> and <code>"basedir"</code>.
+         *
+         * @param uri The namespace URI for this element.
+         * @param tag Name of the element which caused this handler
+         *            to be created. Should not be <code>null</code>.
+         *            Ignored in this implementation.
+         * @param qname The qualified name for this element.
+         * @param attrs Attributes of the element which caused this
+         *              handler to be created. Must not be <code>null</code>.
+         * @param context The current context.
+         *
+         * @exception SAXParseException if an unexpected attribute is
+         *            encountered or if the <code>"default"</code> attribute
+         *            is missing.
+         */
+        public void onStartElement(String uri, String tag, String qname,
+                                   Attributes attrs,
+                                   AntXMLContext context)
+            throws SAXParseException {
+            String id = null;
+            String baseDir = null;
+            boolean nameAttributeSet = false;
+
+            Project project = context.getProject();
+
+            /** XXX I really don't like this - the XML processor is still
+             * too 'involved' in the processing. A better solution (IMO)
+             * would be to create UE for Project and Target too, and
+             * then process the tree and have Project/Target deal with
+             * its attributes ( similar with Description ).
+             *
+             * If we eventually switch to ( or add support for ) DOM,
+             * things will work smoothly - UE can be avoided almost completely
+             * ( it could still be created on demand, for backward compatibility )
+             */
+
+            for (int i = 0; i < attrs.getLength(); i++) {
+                String attrUri = attrs.getURI(i);
+                if (attrUri != null
+                    && !attrUri.equals("")
+                    && !attrUri.equals(uri)) {
+                    continue; // Ignore attributes from unknown uris
+                }
+                String key = attrs.getLocalName(i);
+                String value = attrs.getValue(i);
+
+                if (key.equals("default")) {
+                    if (value != null && !value.equals("")) {
+                        if (!context.isIgnoringProjectTag()) {
+                            project.setDefault(value);
+                        }
+                    }
+                } else if (key.equals("name")) {
+                    if (value != null) {
+                        context.setCurrentProjectName(value);
+                        nameAttributeSet = true;
+                        if (!context.isIgnoringProjectTag()) {
+                            project.setName(value);
+                            project.addReference(value, project);
+                        }
+                    }
+                } else if (key.equals("id")) {
+                    if (value != null) {
+                        // What's the difference between id and name ?
+                        if (!context.isIgnoringProjectTag()) {
+                            project.addReference(value, project);
+                        }
+                    }
+                } else if (key.equals("basedir")) {
+                    if (!context.isIgnoringProjectTag()) {
+                        baseDir = value;
+                    }
+                } else {
+                    // XXX ignore attributes in a different NS ( maybe store them ? )
+                    throw new SAXParseException("Unexpected attribute \""
+                        + attrs.getQName(i) + "\"", context.getLocator());
+                }
+            }
+
+            // XXX Move to Project ( so it is shared by all helpers )
+            String antFileProp = "ant.file." + context.getCurrentProjectName();
+            String dup = project.getProperty(antFileProp);
+            if (dup != null && nameAttributeSet) {
+                File dupFile = new File(dup);
+                if (context.isIgnoringProjectTag()
+                    && !dupFile.equals(context.getBuildFile())) {
+                    project.log("Duplicated project name in import. Project "
+                        + context.getCurrentProjectName() + " defined first in "
+                        + dup + " and again in " + context.getBuildFile(),
+                        Project.MSG_WARN);
+                }
+            }
+
+            if (context.getBuildFile() != null) {
+                project.setUserProperty("ant.file."
+                    + context.getCurrentProjectName(),
+                    context.getBuildFile().toString());
+            }
+
+            if (context.isIgnoringProjectTag()) {
+                // no further processing
+                return;
+            }
+            // set explicitly before starting ?
+            if (project.getProperty("basedir") != null) {
+                project.setBasedir(project.getProperty("basedir"));
+            } else {
+                // Default for baseDir is the location of the build file.
+                if (baseDir == null) {
+                    project.setBasedir(context.getBuildFileParent().getAbsolutePath());
+                } else {
+                    // check whether the user has specified an absolute path
+                    if ((new File(baseDir)).isAbsolute()) {
+                        project.setBasedir(baseDir);
+                    } else {
+                        project.setBaseDir(fu.resolveFile(
+                                               context.getBuildFileParent(), baseDir));
+                    }
+                }
+            }
+
+            project.addTarget("", context.getImplicitTarget());
+            context.setCurrentTarget(context.getImplicitTarget());
+        }
+
+        /**
+         * Handles the start of a top-level element within the project. An
+         * appropriate handler is created and initialised with the details
+         * of the element.
+         *
+         * @param uri The namespace URI for this element.
+         * @param name The name of the element being started.
+         *            Will not be <code>null</code>.
+         * @param qname The qualified name for this element.
+         * @param attrs Attributes of the element being started.
+         *              Will not be <code>null</code>.
+         * @param context The context for this element.
+         * @return a target or an element handler.
+         *
+         * @exception org.xml.sax.SAXParseException if the tag given is not
+         *            <code>"taskdef"</code>, <code>"typedef"</code>,
+         *            <code>"property"</code>, <code>"target"</code>
+         *            or a data type definition
+         */
+        public AntHandler onStartChild(String uri, String name, String qname,
+                                       Attributes attrs,
+                                       AntXMLContext context)
+            throws SAXParseException {
+            if (name.equals("target")
+                && (uri.equals("") || uri.equals(ANT_CORE_URI))) {
+                return ProjectHelper3.targetHandler;
+            } else {
+                return ProjectHelper3.elementHandler;
+            }
+        }
+
+    }
+
+    /**
+     * Handler for "target" elements.
+     */
+    public static class TargetHandler extends AntHandler {
+
+        /**
+         * Initialisation routine called after handler creation
+         * with the element name and attributes. The attributes which
+         * this handler can deal with are: <code>"name"</code>,
+         * <code>"depends"</code>, <code>"if"</code>,
+         * <code>"unless"</code>, <code>"id"</code> and
+         * <code>"description"</code>.
+         *
+         * @param uri The namespace URI for this element.
+         * @param tag Name of the element which caused this handler
+         *            to be created. Should not be <code>null</code>.
+         *            Ignored in this implementation.
+         * @param qname The qualified name for this element.
+         * @param attrs Attributes of the element which caused this
+         *              handler to be created. Must not be <code>null</code>.
+         * @param context The current context.
+         *
+         * @exception SAXParseException if an unexpected attribute is encountered
+         *            or if the <code>"name"</code> attribute is missing.
+         */
+        public void onStartElement(String uri, String tag, String qname,
+                                   Attributes attrs,
+                                   AntXMLContext context)
+            throws SAXParseException {
+            String name = null;
+            String depends = "";
+
+            Project project = context.getProject();
+            Target target = new Target();
+            target.setProject(project);
+            context.addTarget(target);
+
+            for (int i = 0; i < attrs.getLength(); i++) {
+                String attrUri = attrs.getURI(i);
+                if (attrUri != null
+                    && !attrUri.equals("")
+                    && !attrUri.equals(uri)) {
+                    continue; // Ignore attributes from unknown uris
+                }
+                String key = attrs.getLocalName(i);
+                String value = attrs.getValue(i);
+
+                if (key.equals("name")) {
+                    name = value;
+                    if ("".equals(name)) {
+                        throw new BuildException("name attribute must "
+                            + "not be empty");
+                    }
+                } else if (key.equals("depends")) {
+                    depends = value;
+                } else if (key.equals("if")) {
+                    target.setIf(value);
+                } else if (key.equals("unless")) {
+                    target.setUnless(value);
+                } else if (key.equals("id")) {
+                    if (value != null && !value.equals("")) {
+                        context.getProject().addReference(value, target);
+                    }
+                } else if (key.equals("description")) {
+                    target.setDescription(value);
+                } else {
+                    throw new SAXParseException("Unexpected attribute \""
+                        + key + "\"", context.getLocator());
+                }
+            }
+
+            if (name == null) {
+                throw new SAXParseException("target element appears without "
+                    + "a name attribute", context.getLocator());
+            }
+
+            Hashtable currentTargets = project.getTargets();
+
+            // If the name has already been defined ( import for example )
+            if (currentTargets.containsKey(name)) {
+                if (!context.isIgnoringProjectTag()) {
+                    // not in a import'ed file
+                    throw new BuildException(
+                        "Duplicate target '" + name + "'",
+                        new Location(context.getLocator().getSystemId(),
+                                     context.getLocator().getLineNumber(),
+                                     context.getLocator().getColumnNumber()));
+                }
+                // Alter the name.
+                if (context.getCurrentProjectName() != null) {
+                    String newName = context.getCurrentProjectName()
+                        + "." + name;
+                    project.log("Already defined in main or a previous import, "
+                        + "define " + name + " as " + newName,
+                                Project.MSG_VERBOSE);
+                    name = newName;
+                } else {
+                    project.log("Already defined in main or a previous import, "
+                        + "ignore " + name, Project.MSG_VERBOSE);
+                    name = null;
+                }
+            }
+
+            if (name != null) {
+                target.setName(name);
+                project.addOrReplaceTarget(name, target);
+            }
+
+            // take care of dependencies
+            if (depends.length() > 0) {
+                target.setDepends(depends);
+            }
+        }
+
+        /**
+         * Handles the start of an element within a target.
+         *
+         * @param uri The namespace URI for this element.
+         * @param name The name of the element being started.
+         *            Will not be <code>null</code>.
+         * @param qname The qualified name for this element.
+         * @param attrs Attributes of the element being started.
+         *              Will not be <code>null</code>.
+         * @param context The current context.
+         * @return an element handler.
+         *
+         * @exception SAXParseException if an error occurs when initialising
+         *                              the appropriate child handler
+         */
+        public AntHandler onStartChild(String uri, String name, String qname,
+                                       Attributes attrs,
+                                       AntXMLContext context)
+            throws SAXParseException {
+            return ProjectHelper3.elementHandler;
+        }
+
+        /**
+         * Handle the end of the project, sets the current target of the
+         * context to be the implicit target.
+         *
+         * @param uri The namespace URI of the element.
+         * @param tag The name of the element.
+         * @param context The current context.
+         */
+        public void onEndElement(String uri, String tag, AntXMLContext context) {
+            context.setCurrentTarget(context.getImplicitTarget());
+        }
+    }
+
+    /**
+     * Handler for all project elements ( tasks, data types )
+     */
+    public static class ElementHandler extends AntHandler {
+
+        /**
+         * Constructor.
+         */
+        public ElementHandler() {
+        }
+
+        /**
+         * Initialisation routine called after handler creation
+         * with the element name and attributes. This configures
+         * the element with its attributes and sets it up with
+         * its parent container (if any). Nested elements are then
+         * added later as the parser encounters them.
+         *
+         * @param uri The namespace URI for this element.
+         * @param tag Name of the element which caused this handler
+         *            to be created. Must not be <code>null</code>.
+         * @param qname The qualified name for this element.
+         * @param attrs Attributes of the element which caused this
+         *              handler to be created. Must not be <code>null</code>.
+         * @param context The current context.
+         *
+         * @exception SAXParseException in case of error (not thrown in
+         *                              this implementation)
+         */
+        public void onStartElement(String uri, String tag, String qname,
+                                   Attributes attrs,
+                                   AntXMLContext context)
+            throws SAXParseException {
+            RuntimeConfigurable parentWrapper = context.currentWrapper();
+            Object parent = null;
+
+            if (parentWrapper != null) {
+                parent = parentWrapper.getProxy();
+            }
+
+            /* UnknownElement is used for tasks and data types - with
+               delayed eval */
+            UnknownElement task = new UnknownElement(tag);
+            task.setProject(context.getProject());
+            task.setNamespace(uri);
+            task.setQName(qname);
+            task.setTaskType(
+                ProjectHelper.genComponentName(task.getNamespace(), tag));
+            task.setTaskName(qname);
+
+            Location location = new Location(context.getLocator().getSystemId(),
+                    context.getLocator().getLineNumber(),
+                    context.getLocator().getColumnNumber());
+            task.setLocation(location);
+            task.setOwningTarget(context.getCurrentTarget());
+
+            context.configureId(task, attrs);
+
+            if (parent != null) {
+                // Nested element
+                ((UnknownElement) parent).addChild(task);
+            }  else {
+                // Task included in a target ( including the default one ).
+                context.getCurrentTarget().addTask(task);
+            }
+
+            // container.addTask(task);
+            // This is a nop in UE: task.init();
+
+            RuntimeConfigurable wrapper
+                = new RuntimeConfigurable(task, task.getTaskName());
+
+            for (int i = 0; i < attrs.getLength(); i++) {
+                String name = attrs.getLocalName(i);
+                String attrUri = attrs.getURI(i);
+                if (attrUri != null
+                    && !attrUri.equals("")
+                    && !attrUri.equals(uri)) {
+                    name = attrUri + ":" + attrs.getQName(i);
+                }
+                String value = attrs.getValue(i);
+                // PR: Hack for ant-type value
+                //  an ant-type is a component name which can
+                // be namespaced, need to extract the name
+                // and convert from qualified name to uri/name
+                if (ANT_TYPE.equals(name)
+                    || (ANT_CORE_URI.equals(attrUri)
+                        && ANT_TYPE.equals(attrs.getLocalName(i)))) {
+                    name = ANT_TYPE;
+                    int index = value.indexOf(":");
+                    if (index != -1) {
+                        String prefix = value.substring(0, index);
+                        String mappedUri = context.getPrefixMapping(prefix);
+                        if (mappedUri == null) {
+                            throw new BuildException(
+                                "Unable to find XML NS prefix " + prefix);
+                        }
+                        value = ProjectHelper.genComponentName(
+                            mappedUri, value.substring(index + 1));
+                    }
+                }
+                wrapper.setAttribute(name, value);
+            }
+
+            if (parentWrapper != null) {
+                parentWrapper.addChild(wrapper);
+            }
+
+            context.pushWrapper(wrapper);
+        }
+
+        /**
+         * Adds text to the task, using the wrapper
+         *
+         * @param buf A character array of the text within the element.
+         *            Will not be <code>null</code>.
+         * @param start The start element in the array.
+         * @param count The number of characters to read from the array.
+         * @param context The current context.
+         *
+         * @exception SAXParseException if the element doesn't support text
+         *
+         * @see ProjectHelper#addText(Project,java.lang.Object,char[],int,int)
+         */
+        public void characters(char[] buf, int start, int count,
+                               AntXMLContext context)
+            throws SAXParseException {
+            RuntimeConfigurable wrapper = context.currentWrapper();
+            wrapper.addText(buf, start, count);
+        }
+
+        /**
+         * Handles the start of an element within a target. Task containers
+         * will always use another task handler, and all other tasks
+         * will always use a nested element handler.
+         *
+         * @param uri The namespace URI for this element.
+         * @param tag The name of the element being started.
+         *            Will not be <code>null</code>.
+         * @param qname The qualified name for this element.
+         * @param attrs Attributes of the element being started.
+         *              Will not be <code>null</code>.
+         * @param context The current context.
+         * @return The handler for elements.
+         *
+         * @exception SAXParseException if an error occurs when initialising
+         *                              the appropriate child handler
+         */
+        public AntHandler onStartChild(String uri, String tag, String qname,
+                                       Attributes attrs,
+                                       AntXMLContext context)
+            throws SAXParseException {
+            return ProjectHelper3.elementHandler;
+        }
+
+        /**
+         * Handles the end of the element. This pops the wrapper from
+         * the context.
+         *
+         * @param uri The namespace URI for the element.
+         * @param tag The name of the element.
+         * @param context The current context.
+         */
+        public void onEndElement(String uri, String tag, AntXMLContext context) {
+            context.popWrapper();
+        }
+    }
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/RegexpMatcherFactory.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/RegexpMatcherFactory.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/RegexpMatcherFactory.java	(revision 21851)
@@ -0,0 +1,43 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.antmod;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.util.regexp.RegexpMatcher;
+
+
+/**
+ * This class exists because the default Regexp handler is not part of ant.jar
+ * @author Paul Hinds
+ * @version $Id: RegexpMatcherFactory.java,v 1.2 2006/12/21 00:03:05 teknopaul Exp $
+ */
+public class RegexpMatcherFactory {
+
+	/**
+	 * 
+	 */
+	public RegexpMatcherFactory() {
+		super();
+	}
+    public RegexpMatcher newRegexpMatcher() throws BuildException {
+    	try{
+    		return new org.apache.tools.ant.util.regexp.RegexpMatcherFactory().newRegexpMatcher(null);
+    	}
+    	catch(BuildException be){
+    		return new Jdk14RegexpMatcher();
+    	}
+    }
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/RuntimeLauncher.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/RuntimeLauncher.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/RuntimeLauncher.java	(revision 21851)
@@ -0,0 +1,144 @@
+/*
+ * Copyright  2003-2004 The Apache Software Foundation
+ *
+ *  Licensed 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.
+ *
+ */
+package org.tp23.antinstaller.antmod;
+
+import java.io.File;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.ProjectHelper;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.antmod.taskdefs.LogTask;
+import org.tp23.antinstaller.antmod.taskdefs.MessageTask;
+import org.tp23.antinstaller.antmod.taskdefs.PropertyTask;
+import org.tp23.antinstaller.runtime.ExecInstall;
+import org.tp23.antinstaller.selfextract.NonExtractor;
+import org.tp23.antinstaller.selfextract.SelfExtractor;
+
+
+
+/**
+ * This is a launcher for Ant which swallows all messages and logs.
+ *
+ * This file has been modified by Paul Hinds for Antinstaller and is not the same
+ * as the one delivered with Ant 1.6
+ *
+ * @since Ant 1.6
+ * @version $Id$
+ */
+public class RuntimeLauncher {
+
+	public final static String CONTEXT_REFERENCE = "antinstaller.internal.context";
+
+	private final Map allProperties = new HashMap();
+	private final Project project = new Project();
+	private InstallerContext ctx;
+
+	public RuntimeLauncher(InstallerContext ctx) {
+		this.ctx = ctx;
+	}
+
+	public void updateProps(){
+		allProperties.clear();
+		allProperties.putAll(InstallerContext.getEnvironment());
+		allProperties.putAll(ctx.getInstaller().getResultContainer().getAllProperties());
+		// add properties
+		String arg;
+		String value;
+		Iterator iter = allProperties.keySet().iterator();
+		while (iter.hasNext()) {
+			arg = (String) iter.next();
+			value = (String) allProperties.get(arg);
+			project.setUserProperty(arg, value);
+		}
+	}
+
+	public void parseProject(){
+		project.setCoreLoader(this.getClass().getClassLoader());
+		//project.addBuildListener(this);
+        project.init();
+
+		ProjectHelper helper = new ProjectHelper3();
+		project.addReference("ant.projectHelper", helper);
+		
+		//SelfExtractor requirements
+		if(SelfExtractor.CONFIG_RESOURCE == ctx.getConfigResource()){
+			File buildXml = new File(ctx.getFileRoot(), ctx.getAntBuildFile());
+			if(!buildXml.exists()){
+				ctx.log("No build file found??: " + buildXml);
+			}
+			helper.parse(project, buildXml);
+			project.setUserProperty("ant.file", buildXml.getAbsolutePath());
+		}
+
+		//NonExtractor requirements
+		if(NonExtractor.CONFIG_RESOURCE == ctx.getConfigResource()){
+			URL buildIS = this.getClass().getResource("/" + ctx.getAntBuildFile());
+			helper.parse(project, buildIS);
+			project.setUserProperty("ant.file", buildIS.toExternalForm());
+			try {
+				File enclosingJar = SelfExtractor.getEnclosingJar(this);
+				project.setUserProperty(NonExtractor.ANTINSTALLER_JAR_PROPERTY, enclosingJar.getAbsolutePath());
+			} catch (RuntimeException e) {
+				ctx.log("No enclosing jar found");
+			}
+		}
+		
+		//Scripted install requirements
+		if(ExecInstall.CONFIG_RESOURCE == ctx.getConfigResource()){
+			File buildXml = new File(ctx.getFileRoot(), ctx.getAntBuildFile());
+			helper.parse(project, buildXml);
+			if(!buildXml.exists()){
+				ctx.log("No build file found??: " + buildXml);
+			}
+			project.setUserProperty("ant.file", buildXml.getAbsolutePath());
+		}
+		
+		project.setBaseDir(ctx.getFileRoot());
+		
+		// clever stuff for callbacks
+		project.addReference(CONTEXT_REFERENCE, ctx);
+		project.addTaskDefinition("antinstaller-property", PropertyTask.class);
+		project.addTaskDefinition("antinstaller-message", MessageTask.class);
+		project.addTaskDefinition("antinstaller-log", LogTask.class);
+
+	}
+    /**
+	 * Run the launcher to launch Ant with a specific target, there is no classpath
+	 * additions set or ant.home; everything should be loaded for this to run correctly.
+	 *
+	 * @param args the command line arguments
+	 */
+	public int run(String target){
+        try {
+			ctx.getLogger().log("internal target execution started:" + target);
+        	project.fireBuildStarted();
+        	project.executeTarget(target);
+			project.fireBuildFinished(null);
+			ctx.getLogger().log("internal target execution successful:" + target);
+			return 0;
+		}
+		catch (Throwable t) {
+			ctx.getLogger().log("internal target execution error:" + target);
+            ctx.getLogger().log(ctx.getInstaller(), t);
+			return 1;
+		}
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/package.html
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/package.html	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/package.html	(revision 21851)
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head><!--
+  Copyright (c) 2004 tp23
+  All Rights Reserved.
+--></head>
+
+<body bgcolor="white">Contains modifications of Apache Ant code.</body>
+</html>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/taskdefs/GetResourceTask.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/taskdefs/GetResourceTask.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/taskdefs/GetResourceTask.java	(revision 21851)
@@ -0,0 +1,73 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.antmod.taskdefs;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import org.tp23.antinstaller.selfextract.ResourceExtractor;
+/**
+ * Extracts a resource from the classpath into the filesystem
+ * @author teknopaul
+ *
+ */
+public class GetResourceTask extends Task{
+
+	String resource;
+	String dest;
+	String regex;
+	String replace;
+	
+	public void execute() throws BuildException{
+		try {
+			ResourceExtractor re = new ResourceExtractor();
+			if(regex != null){
+				re.copyResource(resource, new File(dest), regex, replace);
+			}
+			else{
+				re.copyResourceBinary(resource, new File(dest));
+			}
+		} catch (IOException e) {
+			throw new BuildException(e.getMessage());
+		}
+	}
+	public String getDest() {
+		return dest;
+	}
+	public void setDest(String file) {
+		this.dest = file;
+	}
+	public String getResource() {
+		return resource;
+	}
+	public void setResource(String resource) {
+		this.resource = resource;
+	}
+	public String getReplace() {
+		return replace;
+	}
+	public void setReplace(String replace) {
+		this.replace = replace;
+	}
+	public String getRegex() {
+		return regex;
+	}
+	public void setRegex(String token) {
+		this.regex = token;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/taskdefs/LogTask.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/taskdefs/LogTask.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/taskdefs/LogTask.java	(revision 21851)
@@ -0,0 +1,54 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.antmod.taskdefs;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.antmod.RuntimeLauncher;
+/**
+ * usage: 
+ * &lt;antinstaller-log message="log message"/&gt;
+ * @author teknopaul
+ *
+ */
+public class LogTask extends Task {
+	
+	private String message;
+	/**
+	 * Ant Tasks must have a noargs constructor
+	 */
+	public LogTask(){
+	}
+
+	/**
+	 * the "main" method
+	 */
+    public void execute() throws BuildException {
+    	InstallerContext ctx = (InstallerContext)getProject().getReference(RuntimeLauncher.CONTEXT_REFERENCE);
+    	ctx.log(message);
+    }
+
+	public String getMessage() {
+		return message;
+	}
+
+	public void setMessage(String message) {
+		this.message = message;
+	}
+
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/taskdefs/MessageTask.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/taskdefs/MessageTask.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/taskdefs/MessageTask.java	(revision 21851)
@@ -0,0 +1,54 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.antmod.taskdefs;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.antmod.RuntimeLauncher;
+/**
+ * usage: 
+ * &lt;antinstaller-message message="output"/&gt;
+ * @author teknopaul
+ *
+ */
+public class MessageTask extends Task {
+	
+	private String message;
+	/**
+	 * Ant Tasks must have a noargs constructor
+	 */
+	public MessageTask(){
+	}
+
+	/**
+	 * the "main" method
+	 */
+    public void execute() throws BuildException {
+    	InstallerContext ctx = (InstallerContext)getProject().getReference(RuntimeLauncher.CONTEXT_REFERENCE);
+    	ctx.getMessageRenderer().printMessage(message);
+    }
+
+	public String getMessage() {
+		return message;
+	}
+
+	public void setMessage(String message) {
+		this.message = message;
+	}
+
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/taskdefs/PropertyTask.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/taskdefs/PropertyTask.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/taskdefs/PropertyTask.java	(revision 21851)
@@ -0,0 +1,114 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.antmod.taskdefs;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.antmod.RuntimeLauncher;
+/**
+ * usage: 
+ * &lt;antinstaller-property name="property.name" value="myValue"/&gt;
+ * <br />
+ * or: 
+ * &lt;antinstaller-property resource="/resources/my.props"/&gt;
+ * @author teknopaul
+ *
+ */
+public final class PropertyTask extends Task {
+	
+	private String name;
+	private String value;
+    private String resource;
+	/**
+	 * Ant Tasks must have a noargs constructor
+	 */
+	public PropertyTask(){
+	}
+
+	/**
+	 * the "main" method
+	 */
+    public void execute() throws BuildException {
+        if(resource != null){
+            executeResource();
+        }
+        else {
+            if(name == null || value == null) {
+                throw new BuildException("either resource or (name and value) can not be null for antinstaller-property task");
+            }
+            executePropVal();
+        }
+    }
+    
+    private void executePropVal(){
+        InstallerContext ctx = (InstallerContext)getProject().getReference(RuntimeLauncher.CONTEXT_REFERENCE);
+        ctx.log("setting property: name=" + name + ", value=" + value);
+        ctx.getInstaller().getResultContainer().setProperty(name, value);
+    }
+    
+    // FindBugs - this class should stay final since getResourceAsStream() may not work in subclasses
+    private void executeResource() throws BuildException{
+        InstallerContext ctx = (InstallerContext)getProject().getReference(RuntimeLauncher.CONTEXT_REFERENCE);
+        InputStream is = this.getClass().getResourceAsStream(resource);
+        if(is == null){
+            ctx.log("Can not find resource: " + resource);
+            throw new BuildException("Can not find resource: " + resource);
+        }
+        try {
+            Properties props = new Properties();
+            props.load(is);
+            is.close();
+            if(ctx.getInstaller().isVerbose()){
+                ctx.log("loaded properties: " + props.size());
+            }
+            
+            ctx.getInstaller().getResultContainer().getAllProperties().putAll(props);
+        } catch (IOException e) {
+            ctx.log("Can not load resource: " + resource);
+            throw new BuildException("Can not load resource: " + resource);
+        }
+    }
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getValue() {
+		return value;
+	}
+
+	public void setValue(String value) {
+		this.value = value;
+	}
+
+    public String getResource() {
+        return resource;
+    }
+
+    public void setResource(String resource) {
+        this.resource = resource;
+    }
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/AppRootInput.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/AppRootInput.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/AppRootInput.java	(revision 21851)
@@ -0,0 +1,159 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.input;
+
+import java.io.File;
+import java.util.ResourceBundle;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.ValidationException;
+import org.tp23.antinstaller.renderer.MessageRenderer;
+
+/**
+ *
+ * <p>Input type to select a directory and validate it by checking the existence of
+ * files relative to the directory selected.  An Expected use for this is to find the
+ * Application root of an exiting app on the clients machine.  for example to find
+ * Tomcat, ask the user to select the tomcat root and check the existence of ./conf/tomcat-users.xml
+ * and ./webapps </p>
+ * @author Paul Hinds
+ * @version $Id: AppRootInput.java,v 1.2 2005/10/23 14:39:20 teknopaul Exp $
+ */
+public class AppRootInput
+	extends DirectoryInput {
+
+    private String checkFile1;
+    private String checkFile2;
+	private String checkDir1;
+	private String checkDir2;
+
+	public AppRootInput() {
+	}
+
+	/**
+	 * Called to validate the user input
+	 */
+	public boolean validate(InstallerContext cxt) throws ValidationException{
+		if (getInputResult() == null)return false;
+		MessageRenderer mr = cxt.getMessageRenderer();
+		String directorySelected = getInputResult();
+		File file = new File(directorySelected);
+		// removed in response to BUG:1303230
+//		if(!file.exists()){
+//			if(mr.prompt(res.getString("dirNotExistCreate"))){
+//				boolean ok = file.mkdirs();
+//				if(!ok)mr.printMessage(res.getString("dirNotCreated"));
+//			}
+//		}
+		if(!file.isDirectory()){
+			mr.printMessage(org.tp23.antinstaller.Installer.langPack.getString("dirNotExist")+":"+file.getAbsolutePath());
+			return false;
+		}
+		else if(checkFile1!=null && ! checkExists(mr,file,checkFile1)){
+			return false ;
+		}
+		else if(checkFile2!=null && ! checkExists(mr,file,checkFile2)){
+			return false ;
+		}
+		else if(checkDir1!=null && ! checkExists(mr,file,checkDir1)){
+			return false ;
+		}
+		else if(checkDir2!=null && ! checkExists(mr,file,checkDir2)){
+			return false ;
+		}
+		return true;
+	}
+
+	private boolean checkExists(MessageRenderer mr,File root,String check){
+		File checkFile = new File(root,checkFile1);
+		if(!checkFile.exists()){
+			reportMissing(mr,checkFile);
+			return false;
+		}
+		return true;
+	}
+
+	private void reportMissing(MessageRenderer mr,File missing){
+		StringBuffer message = new StringBuffer();
+		message.append(org.tp23.antinstaller.Installer.langPack.getString("appRootInvalid"));
+		message.append(System.getProperty("line.separator"));
+		if(missing.isDirectory()){
+			message.append(org.tp23.antinstaller.Installer.langPack.getString("dirNotExist"));
+		}
+		else{
+			message.append(org.tp23.antinstaller.Installer.langPack.getString("fileNotExist"));
+		}
+		message.append(":");
+		message.append(missing.getAbsolutePath());
+		mr.printMessage(message.toString());
+	}
+
+
+
+	public String getCheckDir1() {
+		return checkDir1;
+	}
+
+	public String getCheckDir2() {
+		return checkDir2;
+	}
+
+	public String getCheckFile1() {
+		return checkFile1;
+	}
+
+	public String getCheckFile2() {
+		return checkFile2;
+	}
+
+	public void setCheckFile2(String checkFile2) {
+		this.checkFile2 = checkFile2;
+	}
+
+	public void setCheckFile1(String checkFile1) {
+		this.checkFile1 = checkFile1;
+	}
+
+	public void setCheckDir2(String checkDir2) {
+		this.checkDir2 = checkDir2;
+	}
+
+	public void setCheckDir1(String checkDir1) {
+		this.checkDir1 = checkDir1;
+	}
+	
+	/**
+	 * Used by checkConfig to validate the configuration file.
+	 * Not used at runtime.
+	 * @return boolean
+	 */
+	public boolean validateObject() {
+		if(getDisplayText()==null){
+			System.out.println("AppRoot:displayText must be set");
+			return false;
+		}
+		if(getProperty()==null){
+			System.out.println("AppRoot:property must be set");
+			return false;
+		}
+		if(getDefaultValue()==null){
+			System.out.println("AppRoot:defaultValue must be set");
+			return false;
+		}
+		return true;
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/CheckboxInput.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/CheckboxInput.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/CheckboxInput.java	(revision 21851)
@@ -0,0 +1,86 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.input;
+
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.ValidationException;
+
+
+
+/**
+ *
+ * <p>Input type for boolean choices represented as a checkbox in swing and a yes/no option
+ * on the command line </p>
+ * @author Paul Hinds
+ * @version $Id: CheckboxInput.java,v 1.3 2006/12/07 02:42:22 teknopaul Exp $
+ */
+public class CheckboxInput
+	extends InputField{
+
+
+	private String force;
+
+	public CheckboxInput() {
+	}
+
+	public String getForce() {
+		return force;
+	}
+
+	public void setForce(String force) {
+		this.force = force;
+	}
+
+	public void setValue(String trueOrFalse){
+			setInputResult(trueOrFalse);
+	}
+	/**
+	 * Called to validate the user input
+	 * @TODO should validate against non internationalized true or false flags 
+	 */
+	public boolean validate(InstallerContext cxt) throws ValidationException{
+		return true;
+	}
+
+
+	/**
+	 * Used by checkConfig to validate the configuration file.
+	 * Not used at runtime.
+	 * @return boolean
+	 */
+	public boolean validateObject() {
+		if(getProperty()==null){
+			System.out.println("Checkbox:property must be set");
+			return false;
+		}
+		if(getDisplayText()==null){
+			System.out.println("Checkbox:displayText must be set");
+			return false;
+		}
+		if(!InputField.requiredBoolean(getDefaultValue())){
+			System.out.println("Checkbox:defaultValue must be true or false");
+			return false;
+		}
+		if(!InputField.optionalBoolean(getForce())){
+			System.out.println("Checkbox:defaultValue must be true or false or null");
+			return false;
+		}
+		return true;
+	}
+
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/CommentOutput.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/CommentOutput.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/CommentOutput.java	(revision 21851)
@@ -0,0 +1,97 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.input;
+
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.ValidationException;
+
+
+
+/**
+ *
+ * <p>This "Input type" is strictly for Output! Unlike all the other
+ * concrete classes in this package CommentOutputs refer to text
+ * that will be printed but nothing will be collected from
+ * the user.</p>
+ * The text outputted in Comments will have property values resolved
+ * if they are in the format ${property.name}
+ * @author Paul Hinds
+ * @version $Id: CommentOutput.java,v 1.2 2006/03/24 18:25:58 teknopaul Exp $
+ */
+public class CommentOutput
+	extends OutputField {
+
+	private String bold;
+	private String title;
+
+	public CommentOutput() {
+	}
+
+	public String getBold() {
+		return bold;
+	}
+
+	public void setBold(String bold) {
+		this.bold = bold;
+	}
+
+	public String getTitle() {
+		return title;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+	
+	public String getDisplayText() {
+		return 	resultContainer.getDefaultValue(super.getDisplayText()) ;
+	}
+
+	public String getExplanatoryText() {
+		return resultContainer.getDefaultValue(super.getExplanatoryText());
+	}
+
+	/**
+	 * Called to validate the user input
+	 */
+	public boolean validate(InstallerContext cxt) throws ValidationException{
+		return true;
+	}
+	
+	
+	/**
+	 * Used by checkConfig to validate the configuration file.
+	 * Not used at runtime.
+	 * @return boolean
+	 */
+	public boolean validateObject() {
+//  null accepted now if only using explanatory text		
+//		if(getDisplayText() == null){
+//			System.out.println("Comment:displayText must be set");
+//			return false;
+//		}
+		if(!InputField.optionalBoolean(getBold())){
+			System.out.println("Comment:bold must be true or false or null:" + getBold());
+			return false;
+		}
+		if(!InputField.optionalBoolean(getTitle())){
+			System.out.println("Comment:title must be true or false or null:" + getTitle());
+			return false;
+		}
+		return true;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ConditionalField.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ConditionalField.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ConditionalField.java	(revision 21851)
@@ -0,0 +1,119 @@
+/*
+ * Licensed 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.
+ */
+
+package org.tp23.antinstaller.input;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.ValidationException;
+import org.tp23.antinstaller.runtime.ConfigurationException;
+import org.tp23.antinstaller.runtime.logic.Expression;
+import org.tp23.antinstaller.runtime.logic.ExpressionBuilder;
+
+/**
+ * Container for other <code>OutputField</code> members that will be
+ * conditionally updated. Typical use is with <code>&lt;hidden&gt;</code>
+ * to conditionally set property values.
+ *
+ * @author mwilson
+ * @version $Id
+ * @since 0.7.4 patch 7
+ */
+public class ConditionalField extends InputField {
+    
+    private String ifProperty;
+    private Expression expression;
+    private InputField[] fields;
+
+    public void setIfProperty(final String expressionStr) {
+        this.ifProperty = expressionStr;
+    }
+
+    public String getIfProperty() {
+        return ifProperty;
+    }
+
+    public InputField[] getFields() {
+        return fields;
+    }
+
+    public void setFields(InputField[] fields) {
+        this.fields = fields;
+    }
+
+    /**
+     * Runtime validation of user input
+     *
+     * @param context Installer context
+     * @return <code>true</code> if user input is valid, otherwise <code>false</code>
+     * @throws ValidationException
+     */
+    public boolean validate(InstallerContext context)
+            throws ValidationException {
+        try {
+            getExpression();
+            if ((fields != null) && (fields.length > 0)) {
+                int i = 0;
+                for (; (i < fields.length) && (fields[i].validate(context)); i++) {
+                }
+
+                if (i == fields.length) {
+                    return true;
+                }
+            }
+        } catch (ConfigurationException configExc) {
+            if(context.getInstaller().isVerbose()) {
+                context.log(configExc);
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Build-time validation of installer configuration file
+     *
+     * @return <code>true</code> if configuration is ok, otherwise <code>false</code>
+     */
+    public boolean validateObject() {
+        try {
+            getExpression();
+            if ((fields != null) && (fields.length > 0)) {
+                int i = 0;
+                for (; (i < fields.length) && (fields[i].validateObject()); i++) {
+                }
+
+                if (i == fields.length) {
+                    return true;
+                }
+
+                System.out.println("Invalid field:" + fields[i]);
+            }
+        } catch (ConfigurationException configExc) {
+            System.out.println("Invalid conditional expression: " + configExc);
+        }
+        return false;
+    }
+
+    /**
+     * Get the conditional expression in preparation for evaluation
+     *
+     * @throws ConfigurationException if the expression is invalid
+     */
+    public Expression getExpression() throws ConfigurationException {
+        if (expression == null) {
+            expression = ExpressionBuilder.parseLogicalExpressions(resultContainer, ifProperty);
+        }
+
+        return expression;
+    }
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ConfirmPasswordTextInput.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ConfirmPasswordTextInput.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ConfirmPasswordTextInput.java	(revision 21851)
@@ -0,0 +1,70 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.input;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.ValidationException;
+
+/**
+ * a second password filed that checks to see if a password entered twice matches
+ * @author Paul Hinds
+ * @version $Id$
+ */
+public class ConfirmPasswordTextInput
+	extends PasswordTextInput
+{
+	private String origField;
+
+	/**
+	 * Called to validate the user input, if the confirm flag is set
+	 * and there is a password field on the same page with the same property name
+	 * both passwords must match for validation to pass
+	 */
+	public boolean validate(InstallerContext ctx) throws ValidationException{
+		OutputField[] otherFields = ctx.getCurrentPage().getOutputField();
+		for (int i = 0; i < otherFields.length; i++) {
+			if(otherFields[i] instanceof PasswordTextInput &&
+					otherFields[i] != this){
+				PasswordTextInput pwd = (PasswordTextInput)otherFields[i];
+				if(pwd.getProperty().equals(getOrigField())){
+					return this.getInputResult().equals(pwd.getInputResult());
+				}
+			}
+		}
+		throw new ValidationException("Confirm password requires a PasswordTextInput, on the same page, with  property " + getOrigField());
+	}
+
+	public boolean validateObject() {
+		if ( ! super.validateObject()){
+			return false;
+		}
+		if(getOrigField() == null){
+			System.out.println("ConfirmPassword:origField must be set");
+			return false;
+		}
+		// @TODO check the orig field exists
+		return true;
+	}
+	
+	public String getOrigField() {
+		return origField;
+	}
+
+	public void setOrigField(String origField) {
+		this.origField = origField;
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/DateInput.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/DateInput.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/DateInput.java	(revision 21851)
@@ -0,0 +1,107 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.input;
+
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.ValidationException;
+
+
+/**
+ *
+ * <p>Free text input type with validation a SimpleDataFormat instance. </p>
+ * <p>By default the date format is <code>dd/MM/yyyy</code> unless it
+ * is overriden in teh antinstall-config.xml file. </p>
+ * @author Paul Hinds
+ * @version $Id: DateInput.java,v 1.1.1.1 2005/10/18 18:20:54 teknopaul Exp $
+ */
+public class DateInput
+	extends InputField{
+
+    private String dateFormat = "dd/MM/yyyy";
+	private DateFormat formatter = new SimpleDateFormat(dateFormat);
+
+	public DateInput() {
+		formatter.setLenient(false);
+	}
+
+	public String getDateFormat() {
+		return dateFormat;
+	}
+	public void setDateFormat(String dateFormat) {
+		try {
+			formatter = new SimpleDateFormat(dateFormat);
+			formatter.setLenient(false);
+			this.dateFormat = dateFormat;
+		}
+		catch (RuntimeException e) {
+			throw new InputException("Invalid date format in DateInput");
+		}
+	}
+
+	public void setValue(String dir){
+		setInputResult(dir);
+	}
+
+	/**
+	 * Called to validate the user input
+	 */
+	public boolean validate(InstallerContext cxt) throws ValidationException{
+		if (getInputResult() == null)return false;
+		String toTest = getInputResult();
+		try {
+			formatter.parse(toTest);
+		}
+		catch (ParseException ex) {
+			return false;
+		}
+		return true;
+	}
+
+	public void setDefaultValue(String defaultValue) {
+		if(defaultValue.equals("TODAY")){
+			this.defaultValue = formatter.format(new Date());
+		} else {
+			this.defaultValue = defaultValue;
+		}
+	}
+	
+	/**
+	 * Used by checkConfig to validate the configuration file.
+	 * Not used at runtime.
+	 * @return boolean
+	 */
+	public boolean validateObject() {
+		if(getDisplayText()==null){
+			System.out.println("Date:displayText must be set");
+			return false;
+		}
+		if(getProperty()==null){
+			System.out.println("Date:property must be set");
+			return false;
+		}
+		if(getDefaultValue()==null){
+			System.out.println("Date:defaultValue must be set");
+			return false;
+		}
+		return true;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/DirectoryInput.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/DirectoryInput.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/DirectoryInput.java	(revision 21851)
@@ -0,0 +1,244 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.input;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ResourceBundle;
+import java.util.ArrayList;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.ValidationException;
+import org.tp23.antinstaller.renderer.MessageRenderer;
+
+/**
+ * <p>Input type to select a directory </p>
+ * <p> </p>
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @author Paul Hinds
+ * @version $Id: DirectoryInput.java,v 1.5 2007/01/28 10:25:48 teknopaul Exp $
+ */
+
+public class DirectoryInput extends OSSpecific {
+
+	private boolean abort = false;
+    private String create;
+    private String checkExists;
+
+	//to make default install directory choice smart
+	private String decidedDefault = null;
+
+	//to detect previous installations
+	private String flagFile;
+	private String flagFileExistsProperty;
+
+	public DirectoryInput() {
+	}
+
+	/**
+	 * Called to validate the user input
+	 */
+	public boolean validate(InstallerContext cxt) throws ValidationException{
+		if (getInputResult() == null)return false;
+		MessageRenderer mr = cxt.getMessageRenderer();
+        String selectedName = getInputResult();
+        // handle no directory option
+        if( "".equals(selectedName) ){
+            if( InputField.isTrue(create) || InputField.isTrue(checkExists) ){
+                mr.printMessage(org.tp23.antinstaller.Installer.langPack.getString("dirNotExist"));
+                return false;
+            }
+            else {
+                return true;
+            }
+        } 
+		File file = new File(selectedName);
+		if(InputField.isTrue(create)){
+			if(!file.exists()){
+				try {
+					if(mr.prompt(org.tp23.antinstaller.Installer.langPack.getString("dirNotExistCreate") + "\n" + file.getAbsolutePath())){
+						boolean ok = file.mkdirs();
+						if(!ok){
+							mr.printMessage(org.tp23.antinstaller.Installer.langPack.getString("dirNotCreated"));
+							return false;
+						}
+					} else {
+						//make them stay on the page until they manage to select an existent folder
+						return false;
+					}
+				}
+				catch (Exception ex) {
+					mr.printMessage(org.tp23.antinstaller.Installer.langPack.getString("canNotCreateFile") + "\n" + file.getAbsolutePath());
+                    //FIXME should not throw here, should do something better so users on linux can chmod where necessary
+                    // then try again
+					throw new ValidationException(org.tp23.antinstaller.Installer.langPack.getString("canNotCreateFile"),ex);
+					
+				}
+			}
+		}
+		if(InputField.isTrue(checkExists)){
+//			if( ( !file.exists() || !file.isDirectory() ) && triedToCreate){
+//				//TODO add some usefull text here to explain that we can not continue
+//			}
+			if(!file.exists() || !file.isDirectory()){
+				mr.printMessage(org.tp23.antinstaller.Installer.langPack.getString("dirNotExist") + "\n" + file.getAbsolutePath());
+				return false;
+			}
+		}
+		return true;
+	}
+
+	public String getDefaultValue(boolean correctForOS) {
+
+		if ( this.defaultValue == null ) {
+			return null;
+		}
+
+		if ( decidedDefault != null ) {
+			return decidedDefault;
+		}
+
+		String[] defaultsArray = defaultValue.split(",");
+		for ( int i=0; i<defaultsArray.length; i++ ) {
+			String def = resultContainer.getDefaultFileRef(defaultsArray[i]);
+			File defFile = new File( def );
+
+			//if the path is a file, go to next
+			if ( defFile.isFile() ) {
+				continue;
+			}
+
+			//if the path is a directory, try to write a little file to it
+			if ( defFile.isDirectory() ) {
+				File testFile = new File( defFile, "ant-installer-test-file-(ok-to-delete)" );
+				boolean result = false;
+				try { result = testFile.createNewFile(); } catch ( IOException ioe ) {}
+				if ( result ) {
+					decidedDefault = def;
+					try { testFile.delete(); } catch ( SecurityException se ) {}
+					return decidedDefault;
+				}
+			}
+
+			//if the path doesn't exist, try to create it as a directory
+			if ( !defFile.exists() ) {
+				if ( defFile.mkdir() ) {
+					decidedDefault = def;
+					try { defFile.delete(); } catch ( SecurityException se ) {}
+					return decidedDefault;
+				}
+			}
+			
+		}
+
+		decidedDefault = resultContainer.getDefaultFileRef(
+			defaultsArray[defaultsArray.length-1]
+			);
+		return decidedDefault;
+
+	}
+
+	public boolean isAbort() {
+		return abort;
+	}
+
+	public void setAbort(boolean abort) {
+		this.abort = abort;
+	}
+
+    public String getCreate() {
+		return create;
+    }
+    public void setCreate(String create) {
+		this.create = create;
+    }
+	public void setValue(String dir){
+		setInputResult(dir);
+	}
+
+	public String getCheckExists() {
+		return checkExists;
+	}
+
+	public void setCheckExists(String checkExists) {
+		this.checkExists = checkExists;
+	}
+
+	public String getFlagFile() {
+		return flagFile;
+	}
+
+	public void setFlagFile(String flagFile) {
+		this.flagFile = flagFile;
+	}
+
+    public String getFlagFileExistsProperty() {
+    	return flagFileExistsProperty;
+    }
+
+    public void setFlagFileExistsProperty( String flagFileExistsProperty ) {
+    	this.flagFileExistsProperty = flagFileExistsProperty;
+    }
+
+	/**
+	 * Used by checkConfig to validate the configuration file.
+	 * Not used at runtime.
+	 * @return boolean
+	 */
+	public boolean validateObject() {
+		if(getDisplayText() == null){
+			System.out.println("Directory:displayText must be set");
+			return false;
+		}
+		if(getProperty() == null){
+			System.out.println("Directory:property must be set");
+			return false;
+		}
+		if(defaultValue == null){
+			System.out.println("Directory:defaultValue must be set");
+			return false;
+		}
+        if(defaultValue.equals("")){
+            if( isTrue(getCreate()) || isTrue(getCheckExists()) ) {
+                System.out.println("Directory:defaultValue must be set if checkExists or create are true");
+                return false;
+            }
+        }
+		if(!InputField.optionalBoolean(getCreate())){
+			System.out.println("Directory:create must be true or false or null");
+			return false;
+		}
+		if(!InputField.optionalBoolean(getCheckExists())){
+			System.out.println("Directory:checkExists must be true or false or null");
+			return false;
+		}
+		return true;
+	}
+
+	public void setInputResult(String inputResult) {
+		resultContainer.setProperty(getProperty(), inputResult);
+
+		if ( flagFile != null ) {
+			File ff = new File( inputResult + File.separator + flagFile );
+			Boolean ffExists = new Boolean(ff.exists());
+			resultContainer.setProperty( flagFileExistsProperty, ffExists.toString() );
+		}
+	
+	}
+
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ExtValidatedTextInput.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ExtValidatedTextInput.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ExtValidatedTextInput.java	(revision 21851)
@@ -0,0 +1,108 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.input;
+
+
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.ValidationException;
+
+
+/**
+ *
+ * <p>Free text input type with validation using a custon supplied class.</p>
+ * This enable very coplext validation, for example, a class could be written
+ * to validate a port number enterd by a user that tries to open a socket
+ * on the port and returns false to the validate method if the socket is in use. 
+ * @author Paul Hinds
+ * @version $Id: ExtValidatedTextInput.java,v 1.2 2007/01/09 22:41:41 teknopaul Exp $
+ */
+public class ExtValidatedTextInput
+	extends ValidatedTextInput{
+
+    private String validationClass;
+    private Validator validator;
+    private Throwable throwable ;
+
+	public ExtValidatedTextInput() {
+	}
+
+	public void setValue(String dir){
+		setInputResult(dir);
+	}
+    public String getValidationClass() {
+		return validationClass;
+    }
+    public void setValidationClass(String validationClass) {
+		this.validationClass = validationClass;
+		try {
+			validator = (Validator)Class.forName(validationClass).newInstance();
+		}
+		catch (Exception ex) {
+			throw new InputException("Invalid Class in ExtValidated text input");
+		}
+    }
+
+	/**
+	 * Called to validate the user input
+	 */
+	public boolean validate(InstallerContext ctx) throws ValidationException{
+		String result = getInputResult();
+		try{
+			validator.validate(result,ctx);
+			throwable = null;
+			return true;
+		}
+		catch(Throwable t){
+			throwable = t;
+			return false;
+		}
+		
+	}
+	/**
+	 * @return Returns the validator.
+	 */
+	public Validator getValidator() {
+		return validator;
+	}
+
+	/**
+	 * Used by checkConfig to validate the configuration file.
+	 * Not used at runtime.
+	 * @return boolean
+	 */
+	public boolean validateObject() {
+		if(getDisplayText() == null){
+			System.out.println("ExtValidated:displayText must be set");
+			return false;
+		}
+		if(getProperty() == null){
+			System.out.println("ExtValidated:property must be set");
+			return false;
+		}
+		if(getValidationClass() == null){
+			System.out.println("ExtValidated:validationClass must be set");
+			return false;
+		}
+		return true;
+	}
+	/**
+	 * @return Returns the throwable.
+	 */
+	public Throwable getThrowable() {
+		return throwable;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/FileInput.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/FileInput.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/FileInput.java	(revision 21851)
@@ -0,0 +1,100 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.input;
+
+import java.io.File;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.ValidationException;
+
+
+/**
+ *
+ * <p>Input type to select a directory </p>
+ * <p> </p>
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @author Paul Hinds
+ * @version $Id: FileInput.java,v 1.2 2007/01/28 10:25:48 teknopaul Exp $
+ */
+public class FileInput
+	extends OSSpecific{
+
+	private boolean abort = false;
+    private String checkExists;
+
+	public FileInput() {
+	}
+
+	/**
+	 * Called to validate the user input
+	 */
+	public boolean validate(InstallerContext ctx) throws ValidationException{
+		if (getInputResult() == null) { // this does not happen
+            return false;
+        }
+		if(InputField.isTrue(checkExists)){
+            File file = new File(getInputResult());
+			if(!file.exists()){
+				return false;
+			}
+		}
+		return true;
+	}
+
+	public boolean isAbort() {
+		return abort;
+	}
+
+	public void setAbort(boolean abort) {
+		this.abort = abort;
+	}
+
+	public String getCheckExists() {
+		return checkExists;
+	}
+	public void setCheckExists(String checkExists) {
+		this.checkExists = checkExists;
+	}
+	public void setValue(String dir){
+		setInputResult(dir);
+	}
+
+	/**
+	 * Used by checkConfig to validate the configuration file.
+	 * Not used at runtime.
+	 * @return boolean
+	 */
+	public boolean validateObject() {
+		if(getDisplayText()==null){
+			System.out.println("File:displayText must be set");
+			return false;
+		}
+		if(getProperty()==null){
+			System.out.println("File:property must be set");
+			return false;
+		}
+		if(getDefaultValue()==null){
+			System.out.println("File:defaultValue must be set");
+			return false;
+		}
+		if(!InputField.optionalBoolean(getCheckExists())){
+			System.out.println("File:checkExists must be true or false or null");
+			return false;
+		}
+		return true;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/HiddenPropertyInput.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/HiddenPropertyInput.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/HiddenPropertyInput.java	(revision 21851)
@@ -0,0 +1,67 @@
+/*
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.input;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.ValidationException;
+
+/**
+ * @author mwilson
+ * @version $Id
+ * @since 0.7.4 patch 6
+ */
+public class HiddenPropertyInput extends InputField
+{
+
+    public HiddenPropertyInput()
+    {
+    }
+
+    public void setValue( String propValue )
+    {
+        //Use default value to allow updates when page re-displayed
+        setDefaultValue( propValue );
+    }
+
+    /**
+     * Called to validate the non-existent user input
+     */
+    public boolean validate( InstallerContext cxt ) throws ValidationException
+    {
+        return true;
+    }
+
+    /**
+     * Used by checkConfig to validate the configuration file.
+     * Not used at runtime.
+     *
+     * @return boolean
+     */
+    public boolean validateObject()
+    {
+
+        final String typeName = "hidden";
+        if( getProperty() == null )
+        {
+            System.out.println( typeName + ": property must be set" );
+            return false;
+        }
+        if( getDefaultValue() == null )
+        {
+            System.out.println( typeName + ": value must be set" );
+            return false;
+        }
+        return true;
+    }
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/InputException.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/InputException.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/InputException.java	(revision 21851)
@@ -0,0 +1,12 @@
+package org.tp23.antinstaller.input;
+
+
+/**
+ * @author Paul Hinds
+ * @version $Id: InputException.java,v 1.1.1.1 2005/10/18 18:20:55 teknopaul Exp $
+ */
+public class InputException extends RuntimeException {
+	public InputException(String message){
+		super(message);
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/InputField.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/InputField.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/InputField.java	(revision 21851)
@@ -0,0 +1,102 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.input;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+import org.tp23.antinstaller.Installer;
+
+/**
+ *
+ * <p>Object representation of an inputField XML Element </p>
+ * <p>Also used to hold data of the results of the installer questions </p>
+ * @author Paul Hinds
+ * @version $Id: InputField.java,v 1.4 2006/12/07 02:50:27 teknopaul Exp $
+ */
+public abstract class InputField
+	extends OutputField {
+
+	private String property;
+	protected String defaultValue;
+
+	/**
+	 * Flag to indicate that the user has already editted this field
+	 */
+	private boolean editted = false;
+	private Installer i = new Installer();
+
+	public InputField() {
+	}
+
+	public String getDisplayText() {
+		if( org.tp23.antinstaller.Installer.langPack != null){
+			try {
+				String r = org.tp23.antinstaller.Installer.langPack.getString(getProperty().replaceAll(" ","_") + ".displayText");
+				return r;
+			} catch (MissingResourceException e) {}
+		}
+		return displayText;
+	}
+	public String getExplanatoryText() {
+		if( org.tp23.antinstaller.Installer.langPack != null ) {
+			try {
+				return org.tp23.antinstaller.Installer.langPack.getString(getProperty().replaceAll(" ","_") + ".explanatoryText");
+			} catch (MissingResourceException e) {
+				// ignore and return null explanatoryText is optional
+			}
+		}
+		return explanatoryText;
+	}
+
+	/**
+	 * Returns the input result if there is one and if this is a PropertyField
+	 * @return String
+	 */
+	public String getInputResult() {
+		return resultContainer.getProperty(property);
+	}
+
+	public void setInputResult(String inputResult) {
+		resultContainer.setProperty(property, inputResult);
+	}
+	public boolean isEditted() {
+		return editted;
+	}
+	public void setEditted(boolean editted) {
+		this.editted = editted;
+	}
+	public void setResultContainer(ResultContainer resultContainer) {
+		this.resultContainer = resultContainer;
+	}
+
+	public String getProperty() {
+		return property;
+	}
+
+	public void setProperty(String property) {
+		this.property = property;
+	}
+
+	public String getDefaultValue() {
+		return resultContainer.getDefaultValue(defaultValue);
+	}
+
+	public void setDefaultValue(String defaultValue) {
+		this.defaultValue = defaultValue;
+	}
+
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/LargeSelectInput.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/LargeSelectInput.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/LargeSelectInput.java	(revision 21851)
@@ -0,0 +1,142 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.input;
+
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.ValidationException;
+
+
+
+/**
+ *
+ * <p>Input type to choose a single value from a (numbered) list of options </p>
+ * <p>This input is designed to handle larger lists of options </p>
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @author Paul Hinds
+ * @version $Id: LargeSelectInput.java,v 1.3 2006/12/07 02:50:27 teknopaul Exp $
+ */
+public class LargeSelectInput
+	extends InputField{
+
+	private int optionIdx = 0;
+
+	private LargeSelectInput.Option[] options;
+
+	public LargeSelectInput() {
+	}
+
+
+	public LargeSelectInput.Option[] getOptions() {
+		return options;
+	}
+
+	public void setOptions(LargeSelectInput.Option[] options) {
+		this.options = options;
+	}
+	public Option getNewOption(){
+		return new Option();
+	}
+	
+	public class Option {
+
+		private int idx = ++optionIdx;
+		private String text;
+		public String value;
+		public void setText(String text) {
+			this.text = text;
+		}
+		public String getText() {
+			if( org.tp23.antinstaller.Installer.langPack != null ) {
+				return org.tp23.antinstaller.Installer.langPack.getString(getProperty() + "." + idx +".displayText");
+			}
+			return text;
+		}
+	}
+	
+	public void setValue(String dir){
+		setInputResult(dir);
+	}
+	/**
+	 * Called to validate the user input
+	 */
+	public boolean validate(InstallerContext cxt) throws ValidationException{
+		if(getInputResult()==null)return false;
+		String value = getInputResult();
+		boolean ok = false;
+		for (int i = 0; i < options.length; i++) {
+			ok |= options[i].value.equals(value);
+		}
+		return ok;
+	}
+
+
+
+	/**
+	 * Used by checkConfig to validate the configuration file.
+	 * Not used at runtime.
+	 * @return boolean
+	 */
+	public boolean validateObject() {
+		if(getDisplayText()==null){
+			System.out.println("LargeSelect:displayText must be set");
+			return false;
+		}
+		if(getProperty()==null){
+			System.out.println("LargeSelect:property must be set");
+			return false;
+		}
+		if(getDefaultValue()==null){
+			System.out.println("LargeSelect:defaultValue must be set");
+			return false;
+		}
+		if(getOptions()==null){
+			System.out.println("LargeSelect:option must have at least two options");
+			return false;
+		}
+		if(getOptions().length<2){
+			System.out.println("LargeSelect:option must have at least two options");
+			return false;
+		}
+		for (int i = 0; i < getOptions().length; i++) {
+			Option o = getOptions()[i];
+			if(o.getText()==null){
+				System.out.println("LargeSelect:option:text must be set");
+				return false;
+			}
+			if(o.value==null){
+				System.out.println("LargeSelect:option:value must be set");
+				return false;
+			}
+		}
+		boolean defaultExists = false;
+		for (int i = 0; i < getOptions().length; i++) {
+			Option o = getOptions()[i];
+			if(o.value.equals(getDefaultValue())){
+				defaultExists=true;
+			}
+		}
+		if(!defaultExists){
+			System.out.println("LargeSelect:option:Default must be one of the options");
+			return false;
+		}
+		return true;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/OSSpecific.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/OSSpecific.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/OSSpecific.java	(revision 21851)
@@ -0,0 +1,49 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.input;
+
+import org.tp23.antinstaller.InstallerContext;
+/**
+ * Operating System Specific input fields have different default values for Unix and Windoze
+ * TODO something more with defaults for optionally supporting more OSs
+ */
+public abstract class OSSpecific extends InputField {
+
+	private String defaultValueWin;
+
+	public String getDefaultValue(boolean correctForOS) {
+		if(InstallerContext.isUnix() || defaultValueWin == null){
+            if("".equals(defaultValue)){
+                return "";
+            }
+			return resultContainer.getDefaultFileRef(defaultValue);
+		}
+		else {
+            if("".equals(defaultValueWin)){
+                return "";
+            }
+            return resultContainer.getDefaultFileRef(defaultValueWin);
+        }
+	}
+
+	public String getDefaultValueWin() {
+		return defaultValueWin;
+	}
+
+	public void setDefaultValueWin(String defaultValueWin) {
+		this.defaultValueWin = defaultValueWin;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/OutputField.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/OutputField.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/OutputField.java	(revision 21851)
@@ -0,0 +1,137 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.input;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.ValidationException;
+/**
+ * This is the super class of all "Input types".  It is called OutputField since
+ * it handles the base features of "Input types" for outputing text for
+ * the user to read.  It also encapsulates some convenience methods for
+ * interpreting boolean values from the command line and in configuration files.
+ */
+public abstract class OutputField {
+
+	private static int commentIdx = 0;
+	
+	/* This is redundant unless language packs are used
+	 */
+	private String name = "comment." + ++commentIdx;
+	
+	protected String displayText;
+	protected String explanatoryText;
+	protected ResultContainer resultContainer;
+	
+	public OutputField() {
+		
+	}
+
+	/* This is redundant unless language packs are used
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/* This is redundant unless language packs are used
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getDisplayText() {
+		if( org.tp23.antinstaller.Installer.langPack != null ) {
+			return org.tp23.antinstaller.Installer.langPack.getString(getName() + ".displayText");
+		}
+		return displayText;
+	}
+
+	public void setDisplayText(String displayText) {
+		this.displayText = displayText;
+	}
+
+	public String getExplanatoryText() {
+		if( org.tp23.antinstaller.Installer.langPack != null ) {
+			try {
+				return org.tp23.antinstaller.Installer.langPack.getString(getName() + ".explanatoryText");
+			} catch (MissingResourceException e) {
+				// ignore and return null explanatoryText is optional
+			}
+		}
+		return explanatoryText;
+	}
+
+	public void setExplanatoryText(String explanatoryText) {
+		this.explanatoryText = explanatoryText;
+	}
+
+	public void setResultContainer(ResultContainer resultContainer) {
+		this.resultContainer = resultContainer;
+	}
+
+	/**
+	 * Validate the user input (or lack of it)
+	 * This method should return false if the validation fails an throw an exception
+	 * if it is not possible to validate or there is an error.
+	 *
+	 * @param cxt InstallerContext
+	 * @throws ValidationException thrown in error conditions not validation failure
+	 * @return boolean
+	 */
+	public abstract boolean validate(InstallerContext cxt) throws ValidationException;
+
+	/**
+	 * Used to validate the configuration, this can be run prior to distributing the
+	 * installer to check that the config is valid. Will not be used at runtime.
+	 * @throws ValidationException
+	 * @return boolean
+	 */
+	public abstract boolean validateObject();
+
+	//////////////////////Static convenience methods
+
+	    /** true if specified and true or yes.
+	     *  N.B it is possible for X,  isTrue(X) == isFalse(X); 
+	     *  This occurs if the value is null.
+	     */
+		public static boolean isTrue(String value){
+			if(value == null)return false;
+			return value.equalsIgnoreCase("true") || value.equalsIgnoreCase("yes");
+		}
+		/** same as isTrue() but default is false if not specified */
+		public static boolean isFalse(String value){
+			if(value == null)return false;
+			return value.equalsIgnoreCase("false") || value.equalsIgnoreCase("no");
+		}
+		/**
+		 * Return true if the value is set to true or false, returns false if the value is null
+		 * @param value String
+		 * @return boolean
+		 */
+		public static boolean requiredBoolean(String value){
+			return isTrue(value) || isFalse(value);
+		}
+		/**
+		 * Return true if the value is set to true or false, returns false if the value is null
+		 * @param value String
+		 * @return boolean
+		 */
+		public static boolean optionalBoolean(String value){
+			return value == null || isTrue(value) || isFalse(value);
+		}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/PasswordTextInput.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/PasswordTextInput.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/PasswordTextInput.java	(revision 21851)
@@ -0,0 +1,75 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.input;
+
+
+/**
+ *
+ * <p>Free validated text input type that does not echo the value in the GUI.</p>
+ * <p>This class implements SecretPropertyField so the
+ * values are not printed in the properties file.  It is the responsibility of the renderer
+ * not to show the password. Hiding is currently not supported on the console.</p>
+ * @author Paul Hinds
+ * @version $Id: PasswordTextInput.java,v 1.3 2006/12/21 00:03:09 teknopaul Exp $
+ */
+public class PasswordTextInput
+	extends ValidatedTextInput implements SecretPropertyField
+{
+
+	private String textMask = "false";
+
+	/**
+	 * @return Returns true if text masking is requested.
+	 */
+	public String getTextMask() {
+		return textMask;
+	}
+	/**
+	 * @param textMask The textMask value true or false.
+	 */
+	public void setTextMask(String textMask) {
+		this.textMask = textMask;
+	}
+	/**
+	 * Used by checkConfig to validate the configuration file
+	 * not at runtime
+	 * @return boolean
+	 */
+	public boolean validateObject() {
+		if( ! InputField.optionalBoolean(getTextMask())){
+			System.out.println("Comment:textMask must be true or false or null:" + getTextMask());
+			return false;
+		}
+		if(getDisplayText() == null){
+			System.out.println("Password:displayText must be set");
+			return false;
+		}
+		if(getProperty() == null){
+			System.out.println("Password:property must be set");
+			return false;
+		}
+		if(getDefaultValue() == null){
+			System.out.println("Password:defaultValue must be set");
+			return false;
+		}
+		if(getRegex() == null){
+			System.out.println("Password:regex must be set");
+			return false;
+		}
+		return true;
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ResultContainer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ResultContainer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ResultContainer.java	(revision 21851)
@@ -0,0 +1,190 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.input;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import org.tp23.antinstaller.InstallerContext;
+
+
+
+/**
+ * <p>Data Holder for results of the data collection and convenience methods for
+ * obtaining default values containing ${prop.name}/blah syntax </p>
+ * @todo   Ensure in the validator (and Docs) that developers only add ${refs} for properties set on earlier pages
+ * @author Paul Hinds
+ * @version $Id: ResultContainer.java,v 1.6 2007/01/28 10:25:48 teknopaul Exp $
+ */
+public class ResultContainer {
+
+	private HashMap properties = new HashMap();
+	private Properties environment = InstallerContext.getEnvironment();
+	private File installRoot;
+
+	public ResultContainer() {
+	}
+
+	/**
+	 * fetch a string for File and Directory inputs that expands ${refs} and
+	 * also creates absolute paths from relative paths in the default value
+	 * @param defaultString String
+	 * @return String
+	 */
+	public String getDefaultFileRef(String defaultString){
+		if(defaultString == null) {
+            return null;
+        }
+        
+		String expandedRefs = getDefaultValue(defaultString);
+		File ref = new File(expandedRefs);
+		if(!ref.isAbsolute()){
+			String path = null;
+			try {
+				path = new File(installRoot, expandedRefs).getCanonicalPath();
+			}
+			catch (IOException ex) {
+				// this is a bugger, but it should not happen it implies . or ..
+				// can not be resolved, all we can do is return the . or .. and hope
+				// it works later
+				 path = new File(installRoot, expandedRefs).getAbsolutePath();
+			}
+			return path;
+		} else {
+			String path = ref.getAbsolutePath();
+			return path;
+		}
+	}
+
+    /**
+	 *
+     * Handles dereferenceing ${propName} syntax in default value fields
+	 * @param defaultString String a plain String or a String with ${ref} references
+	 * @return String
+	 */
+	public String getDefaultValue(String defaultString) {
+		if(defaultString == null) {
+            return null;
+        }
+
+		char[] characters = defaultString.toCharArray();
+		char c;
+		StringBuffer result = new StringBuffer();
+
+		StringBuffer propertyNameBuffer = new StringBuffer();
+		boolean inProp = false; // state flag indicating parsing a propertyName
+		for (int i = 0; i < characters.length;) {
+			c = characters[i];
+			if ( c == '$' && ( characters.length > i + 1 && characters[i + 1] == '{' ) ){
+				if(inProp){
+                    //Nested property
+                    int endIndex = defaultString.indexOf( '}', i + 1 );
+                    if( endIndex != -1 ) {
+                        ++endIndex;
+                        propertyNameBuffer.append( getDefaultValue( defaultString.substring( i, endIndex ) ) );
+                        i = endIndex;
+                        continue;
+                    }
+                    else {
+                        result.append(propertyNameBuffer.toString());
+                        propertyNameBuffer = new StringBuffer();
+                    }
+                }
+				else{
+					inProp = true;
+					propertyNameBuffer.append(c);
+                    ++i;
+                    continue;
+				}
+			}
+			else if (c == '{') {
+				if (inProp) {
+					propertyNameBuffer.append(c);
+					if(characters[i - 1] != '$') {
+						inProp=false;
+						result.append(propertyNameBuffer.toString());
+						propertyNameBuffer = new StringBuffer();
+					}
+                    ++i;
+                    continue;
+				}
+			}
+			else if (c == '}') {
+				if (inProp) {
+					appendProperty(propertyNameBuffer, result);
+					propertyNameBuffer = new StringBuffer();
+					inProp = false;
+                    ++i;
+                    continue;
+				}
+			}
+			if (!inProp) result.append(c);
+			else propertyNameBuffer.append(c);
+            ++i;
+        }
+		if(propertyNameBuffer.length() != 0) {
+            result.append(propertyNameBuffer.toString());
+        }
+		return result.toString();
+	}
+
+
+
+	public HashMap getResults() {
+		return properties;
+	}
+	public void setProperty(String key, String value){
+		properties.put(key, value);
+	}
+	public String getProperty(String key){
+		return (String)properties.get(key);
+	}
+
+	public void setInstallRoot(File installRoot) {
+		this.installRoot = installRoot;
+	}
+	/**
+	 * @since 0.7.1 to support installs from readonly media
+	 * @return Map
+	 */
+	public Map getAllProperties(){
+		return properties;
+	}
+
+	/**
+	 * Appends the property if found or inserts an empty string.
+	 * This method now supports loading environment variables.
+	 * @param propertyNameBuffer StringBuffer
+	 * @param result StringBuffer
+	 */
+	private void appendProperty(StringBuffer propertyNameBuffer, StringBuffer result) {
+		String propertyName = propertyNameBuffer.toString();
+		String key = propertyName.substring(2);
+		String value = (String)properties.get(key);
+		if(value == null && key.startsWith(InstallerContext.ENV_PREFIX)) {
+			value = environment.getProperty(key);
+		}
+		if(value == null && key.startsWith(InstallerContext.JAVA_PREFIX)) {
+			value = environment.getProperty(key);
+		}
+		if (value != null) {
+			result.append(value);
+		}
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/SecretPropertyField.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/SecretPropertyField.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/SecretPropertyField.java	(revision 21851)
@@ -0,0 +1,30 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.input;
+
+/**
+ *
+ * <p>An InputField that should not have its property printed to the properties
+ * file, probably for security reasons such as a PasswordTextInput </p>
+ * <p>It is imperative that all classes that implement this interface extend
+* InputField </p>
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @author Paul Hinds
+ * @version $Id: SecretPropertyField.java,v 1.1.1.1 2005/10/18 18:20:55 teknopaul Exp $
+ */
+public interface SecretPropertyField{
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/SelectInput.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/SelectInput.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/SelectInput.java	(revision 21851)
@@ -0,0 +1,162 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.input;
+
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+import java.util.Locale;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.ValidationException;
+import org.tp23.antinstaller.Installer;
+
+
+/**
+ *
+ * <p>Input type to choose a single value from a (numbered) list of options </p>
+ * <p>N.B. subclassed for TargetSelectInput </p>
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @author Paul Hinds
+ * @version $Id: SelectInput.java,v 1.4 2006/12/07 02:50:27 teknopaul Exp $
+ */
+public class SelectInput
+	extends InputField {
+
+	private int optionIdx = 0;
+	private SelectInput.Option[] options;
+	private boolean useAsLocale = false;
+
+	public SelectInput() {
+	}
+
+	public void setUseAsLocale(boolean ual) {
+		this.useAsLocale = ual;
+	}
+
+
+	public SelectInput.Option[] getOptions() {
+		return options;
+	}
+
+	public void setOptions(SelectInput.Option[] options) {
+		this.options = options;
+	}
+	public Option getNewOption(){
+		return new Option();
+	}
+	
+	public class Option {
+		
+		private int idx = ++optionIdx;
+		private String text;
+		public String value;
+		
+		public void setText(String text) {
+			this.text = text;
+		}
+		public String getText() {
+			if( org.tp23.antinstaller.Installer.langPack != null ) {
+				try {
+					String r = org.tp23.antinstaller.Installer.langPack.getString( getProperty() + "." + idx + ".displayText" );
+					return r;
+				} catch ( java.util.MissingResourceException mre ) {}
+			}
+			return text;
+		}
+	}
+	
+	public void setValue(String value){
+		setInputResult(value);
+		if ( useAsLocale ) {
+			//expect something like 'en' or or something like 'en_US'
+			Locale newLocale = null;
+			if ( value.length() == 2 ) {
+				newLocale = new Locale(value);
+				Locale.setDefault( newLocale );
+			} else if ( value.length() == 5 ) {
+				newLocale = new Locale(value.substring(0,2), value.substring(3,5));
+				Locale.setDefault( newLocale );
+			} //else { you're out of luck }
+			org.tp23.antinstaller.Installer.langPack = ResourceBundle.getBundle("resources.LanguagePack", newLocale );
+		}
+	}
+	
+	public boolean validate(InstallerContext cxt) throws ValidationException{
+		if(getInputResult() == null){
+			return false;
+		}
+		String value = getInputResult();
+		boolean ok = false;
+		for (int i = 0; i < options.length; i++) {
+			ok |= options[i].value.equals(value);
+		}
+		return ok;
+	}
+
+
+
+	/**
+	 * Used by checkConfig to validate the configuration file.
+	 * Not used at runtime.
+	 * @return boolean
+	 */
+	public boolean validateObject() {
+		if(getDisplayText()==null){
+			System.out.println("Select:displayText must be set");
+			return false;
+		}
+		if(getProperty()==null){
+			System.out.println("Select:property must be set");
+			return false;
+		}
+		if(getDefaultValue()==null){
+			System.out.println("Select:defaultValue must be set");
+			return false;
+		}
+		if(getOptions()==null){
+			System.out.println("Select:option must have at least two options");
+			return false;
+		}
+		if(getOptions().length<2){
+			System.out.println("Select:option must have at least two options");
+			return false;
+		}
+		for (int i = 0; i < getOptions().length; i++) {
+			Option o = getOptions()[i];
+			if(o.getText()==null){
+				System.out.println("Select:option:text must be set");
+				return false;
+			}
+			if(o.value==null){
+				System.out.println("Select:option:value must be set");
+				return false;
+			}
+		}
+		boolean defaultExists = false;
+		for (int i = 0; i < getOptions().length; i++) {
+			Option o = getOptions()[i];
+			if(o.value.equals(getDefaultValue())){
+				defaultExists=true;
+			}
+		}
+		if(!defaultExists){
+			System.out.println("Select:option:Default must be one of the options");
+			return false;
+		}
+		return true;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/Target.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/Target.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/Target.java	(revision 21851)
@@ -0,0 +1,11 @@
+package org.tp23.antinstaller.input;
+/**
+ * Indicates the input type is a target based type and requires special
+ * processing in the properties loader
+ * @author teknopaul
+ *
+ */
+public interface Target {
+	public int getIdx();
+	public String getTarget();
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/TargetInput.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/TargetInput.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/TargetInput.java	(revision 21851)
@@ -0,0 +1,226 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.input;
+
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.ValidationException;
+
+
+/**
+ *
+ * <p>Input type to select targets to install </p>
+ * If the osSpecific flag is set the OS of the current system will
+ * be appended to the name of the target actually by ant run so that different
+ * Targets can be run according to the target platform.
+ * This feature goes against the principles of
+ * building cross platform installers, but is provided so that common installer
+ * tasks such as creating icons and shortcuts can be run on Windows for
+ * all those useless users who can't run a command script ;)
+ * <br>
+ * Currently there are two modes strict and not strict (lax).</p>
+ * <p>Strict target will return the target name plus the exact String in the
+ * System Property "os.name" this means you will have to provide targets for
+ * every possible OS version. See
+ * <a href="http://lopica.sourceforge.net/os.html">this page</a> for a list of possible values
+ * There are a great many but you may not want to consider some of the options.</p>
+ * <p>Lax target will return one of the following strings only
+ * <ul>
+ * <li>"[target-name]-linux" - Linux </li>
+ * <li>"[target-name]-mac" - Mac OS and Mac OS X</li>
+ * <li>"[target-name]-sun" - SunOS and Solaris</li>
+ * <li>"[target-name]-win" - Windows *</li>
+ * <li>"[target-name]-other" - any thing else</li>
+ * </ul></p> so you only have to create 5 ant targets to support all the cases.
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @author Paul Hinds
+ * @version $Id: TargetInput.java,v 1.3 2006/12/07 02:42:22 teknopaul Exp $
+ */
+public class TargetInput
+	extends InputField
+	implements Target{
+
+
+	private String target;
+	private String force;
+	private String osSpecific;
+	private String strict;
+	//targets are ordered
+	private int idx;
+	private String diskRequirement;
+	private boolean hidden;
+
+	private static int globalIdx = 1;
+
+	public TargetInput() {
+		idx = getGlobalIdx();
+	}
+
+	public String getTarget() {
+		if(isTrue(osSpecific)){
+			return getOSSpecificTarget();
+		} else {
+			return target;
+		}
+	}
+
+	/**
+	 * Used to fetch the target value that was set in the config file
+	 * @return
+	 */
+	public String getTargetName() {
+		return target;
+	}
+
+	public void setTarget(String target) {
+		this.target = target;
+		setProperty(target);
+	}
+
+	public void setDiskRequirement(String diskRequirement) {
+		this.diskRequirement = diskRequirement;
+	}
+
+	public boolean getHidden() {
+		return this.hidden;
+	}
+
+	public void setHidden(String hidden) {
+		this.hidden = hidden.equals("true");
+	}
+
+	public String getForce() {
+		return force;
+	}
+
+	public void setForce(String force) {
+		this.force = force;
+	}
+
+	public String getStrict() {
+		return strict;
+	}
+
+	public void setStrict(String strict) {
+		this.strict = strict;
+	}
+
+	public String getOsSpecific() {
+		return osSpecific;
+	}
+
+	public void setOsSpecific(String osSpecific) {
+		this.osSpecific = osSpecific;
+	}
+
+	public String getDiskRequirement() {
+		return diskRequirement;
+	}
+
+	/**
+	 * Called to validate the user input
+	 */
+	public boolean validate(InstallerContext cxt) throws ValidationException {
+		//setInputResult(target);
+		return true;
+	}
+
+
+
+	/**
+	 * Used by checkConfig to validate the configuration file.
+	 * Not used at runtime.
+	 * @return boolean
+	 */
+	public boolean validateObject() {
+		if(getDisplayText()==null){
+			System.out.println("Target:displayText must be set");
+			return false;
+		}
+		if(getTarget()==null){
+			System.out.println("Target:target must be set");
+			return false;
+		}
+//		if(getTarget().equals("default")){
+//			System.out.println("Target:target can not be \"default\"");
+//			return false;
+//		}
+		if(!InputField.optionalBoolean(getForce())){
+			System.out.println("Target:force must be true or false or null");
+			return false;
+		}
+		if(!InputField.optionalBoolean(getStrict())){
+			System.out.println("Target:strict must be true or false or null");
+			return false;
+		}
+		if(!InputField.optionalBoolean(getOsSpecific())){
+			System.out.println("Target:osSpecific must be true or false or null");
+			return false;
+		}
+		if(!InputField.requiredBoolean(getDefaultValue())){
+			System.out.println("Target:defaultValue must be true or false");
+			return false;
+		}
+		return true;
+	}
+    public int getIdx() {
+		return idx;
+    }
+	public static int getGlobalIdx() {
+		return globalIdx++;
+	}
+
+	public String getOSSpecificTarget() {
+		if(isTrue(strict)){
+			return getStrictTarget();
+		}
+		else return getLaxTarget();
+	}
+
+	private String getStrictTarget(){
+		return target + getOsSpecificSuffix();
+	}
+
+	private String getLaxTarget(){
+		return target + getLaxOsSpecificSuffix();
+	}
+
+	/**
+	 * N.B.  should have added a "-" but to late to change now and not important
+	 * @return
+	 */
+	public static String getOsSpecificSuffix(){
+		return System.getProperty("os.name");
+	}
+	public static String getLaxOsSpecificSuffix(){
+		String osName = System.getProperty("os.name").toLowerCase();
+		if(osName.indexOf("linux") != -1){
+			return "-linux";
+		}
+		if(osName.indexOf("mac") != -1){
+			return "-mac";
+		}
+		if(osName.indexOf("windows") != -1){
+			return "-win";
+		}
+		if(osName.indexOf("solaris") != -1 || osName.indexOf("sunos") != -1){
+			return "-sun";
+		}
+		return "-other";
+		
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/TargetSelectInput.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/TargetSelectInput.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/TargetSelectInput.java	(revision 21851)
@@ -0,0 +1,100 @@
+/* 
+ * Copyright 2005 Paul Hinds, Mark Anderson
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.input;
+
+
+/**
+ *
+ * <p>Input type to choose a single value from a (numbered) list of options
+ * which will be rendered as radio buttons in the Swing GUI </p>
+ * REF: 1177206
+ * @author Paul Hinds, Mark Anderson
+ * @version $Id: TargetSelectInput.java,v 1.4 2006/12/21 00:03:08 teknopaul Exp $
+ */
+public class TargetSelectInput
+	extends SelectInput
+	implements Target{
+
+	//targets are ordered
+	private int idx;
+
+	public TargetSelectInput() {
+		idx = TargetInput.getGlobalIdx();
+	}
+
+	public int getIdx() {
+		return idx;
+	}
+	
+	public String getTarget(){
+		return super.getDefaultValue();
+	}
+
+	/**
+	 * Used by checkConfig to validate the configuration file.
+	 * Not used at runtime.
+	 * @return boolean
+	 */
+	public boolean validateObject() {
+		if(getDisplayText() == null){
+			System.out.println("TargetSelect:displayText must be set");
+			return false;
+		}
+		if(getProperty() == null){
+			System.out.println("TargetSelect:property must be set");
+			return false;
+		}
+		if(getDefaultValue() == null){
+			System.out.println("TargetSelect:defaultValue must be set");
+			return false;
+		}
+		if(getOptions() == null){
+			System.out.println("TargetSelect:option must have at least two options");
+			return false;
+		}
+		if(getOptions().length < 2){
+			System.out.println("TargetSelect:option must have at least two options");
+			return false;
+		}
+		for (int i = 0; i < getOptions().length; i++) {
+			Option o = getOptions()[i];
+			if(o.getText() == null){
+				System.out.println("TargetSelect:option:text must be set");
+				return false;
+			}
+			if(o.value == null){
+				System.out.println("TargetSelect:option:value must be set");
+				return false;
+			}
+		}
+		boolean defaultExists = false;
+		for (int i = 0; i < getOptions().length; i++) {
+			Option o = getOptions()[i];
+			if(o.value.equals(getDefaultValue())){
+				defaultExists=true;
+			}
+//			if(o.value.equals("default")){
+//				System.out.println("Target:target can not be \"default\"");
+//				return false;
+//			}
+		}
+		if(!defaultExists){
+			System.out.println("TargetSelect:option:Default must be one of the options");
+			return false;
+		}
+		return true;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/UnvalidatedTextInput.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/UnvalidatedTextInput.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/UnvalidatedTextInput.java	(revision 21851)
@@ -0,0 +1,66 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.input;
+
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.ValidationException;
+
+
+/**
+ *
+ * <p>Free text input type </p>
+ * @author Paul Hinds
+ * @version $Id: UnvalidatedTextInput.java,v 1.1.1.1 2005/10/18 18:20:54 teknopaul Exp $
+ */
+public class UnvalidatedTextInput
+	extends InputField{
+
+	public UnvalidatedTextInput() {
+	}
+
+	public void setValue(String dir){
+		setInputResult(dir);
+	}
+
+	/**
+	 * Called to validate the user input
+	 */
+	public boolean validate(InstallerContext cxt) throws ValidationException{
+		return true;
+	}
+
+	/**
+	 * Used by checkConfig to validate the configuration file.
+	 * Not used at runtime.
+	 * @return boolean
+	 */
+	public boolean validateObject() {
+		if(getDisplayText()==null){
+			System.out.println("Simple:displayText must be set");
+			return false;
+		}
+		if(getProperty()==null){
+			System.out.println("Simple:property must be set");
+			return false;
+		}
+		if(getDefaultValue()==null){
+			System.out.println("Simple:defualtValue must be set");
+			return false;
+		}
+		return true;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ValidatedTextInput.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ValidatedTextInput.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ValidatedTextInput.java	(revision 21851)
@@ -0,0 +1,113 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.input;
+
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.tools.ant.BuildException;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.ValidationException;
+
+
+/**
+ *
+ * <p>Free text input type with validation using regular expressions</p>
+ * @author Paul Hinds
+ * @version $Id: ValidatedTextInput.java,v 1.2 2006/12/21 00:03:09 teknopaul Exp $
+ */
+public class ValidatedTextInput
+	extends InputField{
+
+    private String regex;
+	private Pattern pattern;
+	//private RegexpMatcher matcher; // use ant version in an attempt to support jdk1.3
+
+	public ValidatedTextInput() {
+	}
+
+	public void setValue(String dir){
+		setInputResult(dir);
+	}
+    public String getRegex() {
+		return regex;
+    }
+    public void setRegex(String regex) {
+		this.regex = regex;
+		try {
+			//matcher = new RegexpMatcherFactory().newRegexpMatcher();
+			//matcher.setPattern(regex);
+			pattern = Pattern.compile(regex);
+		}
+		catch (BuildException ex) {
+			throw new InputException("Invalid regex in Validated text input");
+		}
+    }
+
+	/**
+	 * Called to validate the user input
+	 */
+	public boolean validate(InstallerContext cxt) throws ValidationException{
+		try {
+			if (getInputResult() == null)return false;
+			String toTest = getInputResult();
+
+			Matcher matcher = pattern.matcher(toTest);
+			//boolean matches =  matcher.matches(toTest);
+			boolean matches =  matcher.matches();
+
+			return matches;
+		}
+		catch (Throwable e) {
+			cxt.log(e);
+			return false;
+		}
+	}
+
+	/**
+	 * Used by checkConfig to validate the configuration file.
+	 * Not used at runtime.
+	 * @return boolean
+	 */
+	public boolean validateObject() {
+		if(getDisplayText()==null){
+			System.out.println("Validated:displayText must be set");
+			return false;
+		}
+		if(getProperty()==null){
+			System.out.println("Validated:property must be set");
+			return false;
+		}
+		if(getDefaultValue()==null){
+			System.out.println("Validated:defaultValue must be set");
+			return false;
+		}
+		if(getRegex()==null){
+			System.out.println("Validated:regex must be set");
+			return false;
+		}
+		try{
+			//matcher = new RegexpMatcherFactory().newRegexpMatcher();
+			//matcher.setPattern(getRegex());
+		}
+		catch(Exception e){
+			System.out.println("Validated:regex must compile");
+			
+		}
+		return true;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/Validator.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/Validator.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/Validator.java	(revision 21851)
@@ -0,0 +1,40 @@
+package org.tp23.antinstaller.input;
+
+import java.util.Locale;
+
+import org.tp23.antinstaller.InstallerContext;
+
+
+/**
+ * A no args constructor should be provided
+ * @author Paul Hinds
+ * @version $Id: Validator.java,v 1.1.1.1 2005/10/18 18:20:54 teknopaul Exp $
+ */
+public interface Validator {
+
+	/**
+	 * Validate the user entry.  The InstallerContext is provided to allow
+	 * conditional failure based on user input. for example the implementation
+	 * of this class could call the following code after failing to open a socket
+	 * <pre>
+	 * boolean usrOverride = ctx.getMessageRenderer().prompt("Prot not available are you sure?");
+	 * if(userOverride)return true;
+	 * else{
+	 * 	throw new SocketException();
+	 * }
+	 * </pre>
+	 * @param text  may be null it is up to the validator to decide if null or ""
+	 * is acceptable
+	 * @throws Exception
+	 */
+	public void validate(String text,InstallerContext ctx)throws Exception;
+	/**
+	 * This method should return a string for every exception that might be 
+	 * thrown by the validate method.  The top level Throwable should be 
+	 * handled at least.  
+	 * @param ex
+	 * @param l Locale (ignored, but one day we should be internationalized)
+	 * @return
+	 */
+	public String getErrorMessage(Throwable ex,Locale l);
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/package.html
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/package.html	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/package.html	(revision 21851)
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head><!--
+  Copyright (c) 2004 tp23
+  All Rights Reserved.
+--></head>
+
+<body bgcolor="white">Contains classes for representing Input/Output elements and holding the data collected for each input type.</body>
+</html>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/LicensePage.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/LicensePage.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/LicensePage.java	(revision 21851)
@@ -0,0 +1,52 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.page;
+
+
+/**
+ *
+ * <p>Represents a license page witha  resouce that contains the text of the licenses </p>
+ * <p> </p>
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @author Paul Hinds
+ * @version $Id: LicensePage.java,v 1.1.1.1 2005/10/18 18:21:04 teknopaul Exp $
+ */
+public class LicensePage
+	extends Page {
+
+	private String resource;
+	private String usePaging;
+
+	public LicensePage() {
+	}
+
+	public String getResource() {
+		return resource;
+	}
+
+	public void setResource(String resource) {
+		this.resource = resource;
+	}
+
+	public String getUsePaging() {
+		return usePaging;
+	}
+
+	public void setUsePaging(String usePaging) {
+		this.usePaging = usePaging;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/Page.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/Page.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/Page.java	(revision 21851)
@@ -0,0 +1,286 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.page;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.TreeSet;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.input.TargetInput;
+import org.tp23.antinstaller.runtime.IfPropertyHelper;
+/**
+ *
+ * <p>Represents a page in the installer. </p>
+ * <p>This object maintians an ordered list of targets that have been selected
+* so that when ant is run the targets are run in the correct order.  If
+* Targets exist in multiple pages they are run in the order they appear in the config file.  </p>
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @author Paul Hinds
+ * @version $Id: Page.java,v 1.10 2007/01/19 00:24:36 teknopaul Exp $
+ */
+
+public abstract class Page {
+
+	//private static final int MAX_TARGETS = 10;
+	private String name;
+	private String displayText;
+	private String imageResource;
+	private OutputField[] outputField;
+	private boolean abort;
+
+	private boolean showNextButton = true;
+
+	/**
+	 *  target to be called as the installer is running
+	 */
+	private String postDisplayTarget;
+	private Set targets = new TreeSet();
+
+	public Page() {
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getDisplayText() {
+		if( org.tp23.antinstaller.Installer.langPack != null ) {
+			return org.tp23.antinstaller.Installer.langPack.getString("page." + getName() + ".displayText");
+		}
+		return displayText;
+	}
+
+	public void setDisplayText(String displayText) {
+		this.displayText = displayText;
+	}
+
+	public String getImageResource() {
+		return imageResource;
+	}
+
+	public void setImageResource(String imageResource) {
+		this.imageResource = imageResource;
+	}
+
+	public OutputField[] getOutputField() {
+		return outputField;
+	}
+
+	public void setOutputField(OutputField[] outputField) {
+		this.outputField = outputField;
+	}
+
+	public String getPostDisplayTarget() {
+		return postDisplayTarget;
+	}
+
+	public void setPostDisplayTarget(String runtimeTarget) {
+		this.postDisplayTarget = runtimeTarget;
+	}
+
+	public boolean isShowNextButton() {
+		return showNextButton;
+	}
+	public void setShowNextButton(boolean snb) {
+		this.showNextButton = snb;
+	}
+	public void setShowNextButton(String snb) {
+		this.showNextButton = OutputField.isTrue(snb);
+	}
+
+    /**
+	 * These are the ant targets that will be run, this is decided after
+	 * the Page has been displayed.  For example if the user chooses not
+	 * to enter a field that may signify that a target should not be run
+	 * @return A sorted List a list of Ant targets as Strings;
+     * @throws InstallException 
+	 */
+	public List getTargets(InstallerContext ctx) {
+		List results = new ArrayList(targets.size());
+		try {
+			Iterator iter = targets.iterator();
+			IfPropertyHelper helper = new IfPropertyHelper(ctx);
+			while(iter.hasNext()){
+				IndexedTarget idxTarget = (IndexedTarget)iter.next();
+				if( IndexedTarget.PAGE.equals(idxTarget.getTargetType()) ){
+					if( helper.ifProperty(this) || helper.ifTarget(this, ctx.getInstaller().getPages() ) ){
+						results.add(idxTarget.target);
+					}
+				}
+				else{
+					results.add(idxTarget.target);
+				}
+			}
+		} catch (InstallException e) {
+			// should not happen at runtime if ifProperty has been validated
+			e.printStackTrace();
+            ctx.log(ctx.getInstaller().isVerbose(), e);
+			throw new RuntimeException();
+		}
+		return results;
+	}
+	/**
+	 * get input targets that are selected and all page targets, independent of
+	 * the ifProperty value 
+	 * @return
+	 */
+	public List getAllTargets() {
+		List results = new ArrayList(targets.size());
+		Iterator iter = targets.iterator();
+		while(iter.hasNext()){
+			IndexedTarget idxTarget = (IndexedTarget)iter.next();
+			results.add(idxTarget.target);
+		}
+		return results;
+	}
+	/**
+	 * Comma separated list of targets for this page, called when parsing the
+	 * config file
+	 * @param target String
+	 */
+	public void setTarget(String targetList) {
+		StringTokenizer st = new StringTokenizer(targetList, ",");
+		while (st.hasMoreTokens()) {
+			targets.add(new IndexedTarget(TargetInput.getGlobalIdx(), 
+					st.nextToken(),
+					IndexedTarget.PAGE));
+		}
+	}
+	/**
+	 * Adds an INPUT target to the Page config
+	 * @param idx
+	 * @param target
+	 */
+	public void addTarget(int idx, String target) {
+		this.targets.add(new IndexedTarget(idx, target, IndexedTarget.INPUT));
+	}
+	public void removeTarget(int idx) {
+		this.targets.remove(new IndexedTarget(idx, null));
+	}
+	/**
+	 * returns true if the page has the current target set
+	 * @param target String
+	 * @return boolean
+	 */
+	public boolean isTarget(String target) {
+		if(target == null){
+			return false;
+		}
+		Iterator iter = targets.iterator();
+		while(iter.hasNext()) {
+			IndexedTarget idxTarget = (IndexedTarget)iter.next();
+			if(idxTarget.target.equals(target)){
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * @return a List of IndexedTarget objects
+	 */
+	public List getPageTargets(){
+		List toReturn = new ArrayList(targets.size());
+		Iterator iter = targets.iterator();
+		while(iter.hasNext()) {
+			IndexedTarget idxTarget = (IndexedTarget)iter.next();
+			if( IndexedTarget.PAGE.equals(idxTarget.targetType) ){
+				toReturn.add(idxTarget);
+			}
+		}
+		return toReturn;
+	}
+
+	/**
+	 * @return a List of IndexedTarget objects
+	 */
+	public List getElementTargets(){
+		List toReturn = new ArrayList(targets.size());
+		Iterator iter = targets.iterator();
+		while(iter.hasNext()) {
+			IndexedTarget idxTarget = (IndexedTarget)iter.next();
+			if( IndexedTarget.INPUT.equals(idxTarget.targetType) ){
+				toReturn.add(idxTarget);
+			}
+		}
+		return toReturn;
+	}
+    /**
+	 * This is called after the page is displayed, a page can return false to indicate
+	 * that the installation should abort.  Should be false if the cancel button is pressed.
+	 * System.exit is not called to allow the installer to clean up temporary files.
+	 * @return boolean
+	 */
+	public boolean isAbort() {
+		return abort;
+	}
+
+	public void setAbort(boolean abort) {
+		this.abort = abort;
+	}
+	public static class IndexedTarget implements Comparable{
+		
+		private static final String PAGE = "page";
+		private static final String INPUT = "input";
+		
+		int idx;
+		String target;
+		String targetType = INPUT;
+		
+		IndexedTarget(int idx, String target){
+			this.idx = idx;
+			this.target = target;
+		}
+		IndexedTarget(int idx, String target, String targetType){
+			this.idx = idx;
+			this.target = target;
+			this.targetType = targetType;
+		}
+		
+		public boolean equals(Object target){
+			IndexedTarget test = (IndexedTarget)target;
+			return test.idx == idx;
+		}
+        // FindBugs - part of equals() contract
+        public int hashCode(){
+            return this.idx;
+        }
+		public int compareTo(Object o) {
+			IndexedTarget test = (IndexedTarget)o;
+			return idx - test.idx;
+		}
+		public String getTarget() {
+			return target;
+		}
+		public String getTargetType() {
+			return targetType;
+		}
+
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/ProgressPage.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/ProgressPage.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/ProgressPage.java	(revision 21851)
@@ -0,0 +1,43 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.page;
+
+import org.tp23.antinstaller.input.OutputField;
+
+public class ProgressPage extends Page{
+	
+	private boolean showTargets = true;
+	
+	
+	public ProgressPage() {
+	}
+	/**
+	 * @return Returns the showTargets.
+	 */
+	public boolean isShowTargets() {
+		return showTargets;
+	}
+	/**
+	 * @param showTargets indicates that the graphical display of
+	 * progress should be used in the Swing renderer
+	 */
+	public void setShowTargets(boolean showTargets) {
+		this.showTargets = showTargets;
+	}
+	public void setShowTargets(String strShowTargets) {
+		this.showTargets = OutputField.isTrue(strShowTargets);
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/SimpleInputPage.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/SimpleInputPage.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/SimpleInputPage.java	(revision 21851)
@@ -0,0 +1,59 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.page;
+
+import org.tp23.antinstaller.input.OutputField;
+
+
+
+public class SimpleInputPage
+	extends Page {
+
+
+	private String ifTarget;
+	private String ifProperty;
+	private boolean overflow;
+
+	private boolean showNextButton;
+
+	public SimpleInputPage() {
+	}
+
+	public String getIfTarget() {
+		return ifTarget;
+	}
+
+	public void setIfTarget(String ifTarget) {
+		this.ifTarget = ifTarget;
+	}
+    public String getIfProperty() {
+    	return ifProperty;
+    }
+    public void setIfProperty(String ifProperty) {
+    	this.ifProperty = ifProperty;
+    }
+
+	public boolean isOverflow() {
+		return overflow;
+	}
+	public void setOverflow(boolean overflow) {
+		this.overflow = overflow;
+	}
+	public void setOverflow(String strOverflow) {
+		this.overflow = OutputField.isTrue(strOverflow);
+	}
+	
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/SplashPage.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/SplashPage.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/SplashPage.java	(revision 21851)
@@ -0,0 +1,40 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.page;
+
+public class SplashPage
+	extends Page {
+	private String splashResource;
+	private String altText;
+	public SplashPage() {
+	}
+
+	public String getSplashResource() {
+		return splashResource;
+	}
+
+	public void setSplashResource(String splashResource) {
+		this.splashResource = splashResource;
+	}
+
+	public String getAltText() {
+		return altText;
+	}
+
+	public void setAltText(String altText) {
+		this.altText = altText;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/TextPage.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/TextPage.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/TextPage.java	(revision 21851)
@@ -0,0 +1,42 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.page;
+
+public class TextPage
+	extends Page {
+	
+	private String htmlResource;
+	private String textResource;
+	
+	public TextPage() {
+	}
+
+	public String getHtmlResource() {
+		return htmlResource;
+	}
+
+	public void setHtmlResource(String htmlResource) {
+		this.htmlResource = htmlResource;
+	}
+
+	public String getTextResource() {
+		return textResource;
+	}
+
+	public void setTextResource(String textResource) {
+		this.textResource = textResource;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/package.html
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/package.html	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/package.html	(revision 21851)
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head><!--
+  Copyright (c) 2004 tp23
+  All Rights Reserved.
+--></head>
+
+<body bgcolor="white">Contains holders for the three different types of Page in an installer and the base class.</body>
+</html>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/AntOutputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/AntOutputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/AntOutputRenderer.java	(revision 21851)
@@ -0,0 +1,24 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer;
+
+import java.io.PrintStream;
+
+public interface AntOutputRenderer {
+	public PrintStream getOut();
+	public PrintStream getErr();
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/MessageRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/MessageRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/MessageRenderer.java	(revision 21851)
@@ -0,0 +1,42 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer;
+
+import org.tp23.antinstaller.InstallerContext;
+/**
+ *
+ * <p>Abstract message renderer asking user questions or providing feedback</p>
+ * <p> </p>
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @author Paul Hinds
+ * @version $Id: MessageRenderer.java,v 1.1.1.1 2005/10/18 18:20:59 teknopaul Exp $
+ */
+public interface MessageRenderer {
+
+	public void setInstallerContext(InstallerContext ctx);
+	/**
+	 * Print a message for which there is not option to reply
+	 * @param message String
+	 */
+	public void printMessage(String message);
+	/**
+	 * ask the user for Yes or No
+	 * @param message String
+	 * @return boolean  true = Yes  false = No
+	 */
+	public boolean prompt(String message);
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/PageRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/PageRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/PageRenderer.java	(revision 21851)
@@ -0,0 +1,25 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.page.Page;
+
+public interface PageRenderer {
+	public void setContext(InstallerContext ctx);
+	public InstallerContext getContext();
+	public boolean renderPage(Page page) throws Exception;
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/RendererFactory.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/RendererFactory.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/RendererFactory.java	(revision 21851)
@@ -0,0 +1,136 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer;
+
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.page.Page;
+import org.tp23.antinstaller.renderer.swing.SwingOutputFieldRenderer;
+import org.tp23.antinstaller.renderer.swing.SwingPageRenderer;
+import org.tp23.antinstaller.renderer.text.AbstractTextPageRenderer;
+import org.tp23.antinstaller.renderer.text.TextOutputFieldRenderer;
+
+
+
+/**
+ *
+ * <p>Fetches an instance of a Renderers by using the class of the method parameter and
+ * a naming convention </p>
+ * <p> </p>
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @author Paul Hinds
+ * @version $Id: RendererFactory.java,v 1.3 2006/12/21 00:03:30 teknopaul Exp $
+ */
+public class RendererFactory {
+	public RendererFactory() {
+	}
+
+	public static TextOutputFieldRenderer getTextRenderer(OutputField field) throws ClassNotFoundException {
+		String fullyQualified = field.getClass().getName();
+		int lastDot = fullyQualified.lastIndexOf('.');
+		if (lastDot == -1) {
+			throw new UnsupportedOperationException("InputField can not be a member of the default package");
+		}
+		int prevDot = fullyQualified.substring(0,lastDot-1).lastIndexOf('.', lastDot - 1);
+		if (prevDot == -1) {
+			throw new UnsupportedOperationException("InputField can not be a member of a single level package");
+		}
+		StringBuffer rendererClassName = new StringBuffer();
+		rendererClassName.append(fullyQualified.substring(0, prevDot));
+		rendererClassName.append(".renderer.text.");
+		rendererClassName.append(fullyQualified.substring(lastDot + 1));
+		rendererClassName.append("Renderer");
+		try {
+			Class clazz = Class.forName(rendererClassName.toString());
+			return (TextOutputFieldRenderer) clazz.newInstance();
+		}
+		catch (Exception ex) {
+			throw new ClassNotFoundException("Class does not meet the contract for TextInputFieldRenderer:" + rendererClassName);
+		}
+	}
+	
+	public static AbstractTextPageRenderer getTextPageRenderer(Page page) throws ClassNotFoundException {
+		String fullyQualified = page.getClass().getName();
+		int lastDot = fullyQualified.lastIndexOf('.');
+		if (lastDot == -1) {
+			throw new UnsupportedOperationException("Pages can not be a member of the default package");
+		}
+		int prevDot = fullyQualified.substring(0,lastDot-1).lastIndexOf('.', lastDot - 1);
+		if (prevDot == -1) {
+			throw new UnsupportedOperationException("Pages can not be a member of a single level package");
+		}
+		StringBuffer rendererClassName = new StringBuffer();
+		rendererClassName.append(fullyQualified.substring(0, prevDot));
+		rendererClassName.append(".renderer.text.");
+		rendererClassName.append(fullyQualified.substring(lastDot + 1));
+		rendererClassName.append("Renderer");
+		try {
+			Class clazz = Class.forName(rendererClassName.toString());
+			return (AbstractTextPageRenderer) clazz.newInstance();
+		}
+		catch (Exception ex) {
+			throw new ClassNotFoundException("Class does not meet the contract for TextPageRenderer:" + rendererClassName);
+		}
+	}
+	public static SwingPageRenderer getSwingPageRenderer(Page page) throws ClassNotFoundException {
+		String fullyQualified = page.getClass().getName();
+		int lastDot = fullyQualified.lastIndexOf('.');
+		if (lastDot == -1) {
+			throw new UnsupportedOperationException("Pages can not be a member of the default package");
+		}
+		int prevDot = fullyQualified.substring(0,lastDot-1).lastIndexOf('.', lastDot - 1);
+		if (prevDot == -1) {
+			throw new UnsupportedOperationException("Pages can not be a member of a single level package");
+		}
+		StringBuffer rendererClassName = new StringBuffer();
+		rendererClassName.append(fullyQualified.substring(0, prevDot));
+		rendererClassName.append(".renderer.swing.");
+		rendererClassName.append(fullyQualified.substring(lastDot + 1));
+		rendererClassName.append("Renderer");
+		try {
+			Class clazz = Class.forName(rendererClassName.toString());
+			return (SwingPageRenderer) clazz.newInstance();
+		}
+		catch (Exception ex) {
+			throw new ClassNotFoundException("Class does not meet the contract for SwingPageRenderer:" + rendererClassName);
+		}
+	}
+	
+	public static SwingOutputFieldRenderer getSwingRenderer(OutputField field) throws ClassNotFoundException {
+		String fullyQualified = field.getClass().getName();
+		int lastDot = fullyQualified.lastIndexOf('.');
+		if (lastDot == -1) {
+			throw new UnsupportedOperationException("OutputField can not be a member of the default package");
+		}
+		int prevDot = fullyQualified.substring(0,lastDot-1).lastIndexOf('.', lastDot - 1);
+		if (prevDot == -1) {
+			throw new UnsupportedOperationException("OutputField can not be a member of a single level package");
+		}
+		StringBuffer rendererClassName = new StringBuffer();
+		rendererClassName.append(fullyQualified.substring(0, prevDot));
+		rendererClassName.append(".renderer.swing.");
+		rendererClassName.append(fullyQualified.substring(lastDot + 1));
+		rendererClassName.append("Renderer");
+		try {
+			Class clazz = Class.forName(rendererClassName.toString());
+			return (SwingOutputFieldRenderer) clazz.newInstance();
+		}
+		catch (Exception ex) {
+			ex.printStackTrace();
+			throw new ClassNotFoundException("Class does not meet the contract for SwingInputFieldRenderer:" + rendererClassName);
+		}
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/Res.properties
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/Res.properties	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/Res.properties	(revision 21851)
@@ -0,0 +1,48 @@
+#resources.LanguagePack
+#Wed Nov 10 01:06:42 CET 2004
+
+dirNotExistCreate=The Directory does not exist, create it?
+dirNotExist=The Directory does not exist
+fileNotExist=The File does not exist
+dirNotCreated=The Directory could not be created
+canNotCreateFile=Can not create file
+appRootInvalid=This directory does not appear to be the root of the application
+selectFile=Select File
+selectFolder=Select Folder
+notValidSelection=Not a valid selection
+showDetails=Show Details
+
+#Default loading
+promptLoadDefaults=Installation configuration found. Load the existing configuration?
+promptMissingDefaultPassword=A password was not found it may have been omitted for security reasons, it will be set to the default.
+
+click=Click
+toContinue=to continue
+failed=Failed
+exit=Exit
+complete=Complete
+finished=Finished
+extracting=Extracting...
+installFinished=Install Finished
+running=Running:
+
+backButton=Back
+cancelButton=Cancel
+nextButton=Next
+
+output=Output
+errors=Errors
+notCorrectFormat=The field is not of the correct format
+notCorrectPasswordFormat=The password is not of the correct format
+passwordsDoNotMatch=The passwords do not match
+installationFailed=Install failed
+propertiesVersionMismatch=Some options are missing from the previous version and must be manually entered, continue?
+
+Finished=Finished
+Failed=Failed, view the error messages
+ant.failure=Ant run failed - examine the error logs for details
+
+#Text for license page buttons
+license.next.text=Accept
+license.cancel.text=Reject
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/Res_de.properties
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/Res_de.properties	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/Res_de.properties	(revision 21851)
@@ -0,0 +1,48 @@
+#resources.LanguagePack
+#Wed Nov 10 01:06:42 CET 2004
+
+dirNotExistCreate=Das Verzeichnis existiert nicht, erzeugen?
+dirNotExist=Das Verzeichnis existiert nicht
+fileNotExist=Die Datei existiert nicht
+dirNotCreated=Das Verzeichnis konnte nicht erzeugt werden
+canNotCreateFile=Kann die Datei nicht erzeugen
+appRootInvalid=Das Verzeichnis scheint nicht das Wurzelverzeichnis der Applikation zu sein
+selectFile=Datei auswählen
+selectFolder=Verzeichnis auswählen
+notValidSelection=Keine gültige Auswahl
+showDetails=Details anzeigen
+
+#Default loading
+promptLoadDefaults=Installation configuration found. Load the existing configuration?
+promptMissingDefaultPassword=A password was not found it may have been omitted for security reasons, it will be set to the default.
+
+click=Klicken
+toContinue=zum Fortfahren
+failed=fehlgeschlagen
+exit=Beenden
+complete=Fertigstellen
+finished=abgeschlossen
+extracting=Auspacken ...
+installFinished=Installation beendet
+running=Ausführung:
+
+backButton=Zurück
+cancelButton=Abbrechen
+nextButton=Weiter
+
+output=Ausgabe
+errors=Fehler
+notCorrectFormat=Der Wert hat nicht das vorgegebene Format
+notCorrectPasswordFormat=Das Kennwort hat nicht das vorgegebene Format
+passwordsDoNotMatch=The passwords do not match
+installationFailed=Installation fehlgeschlagen
+propertiesVersionMismatch=Some properties are missing from and must be manually entered, continue?
+
+Finished=Fertig
+Failed=Fehlgeschlagen, Details siehe Fehlermeldungen
+ant.failure=Ant run failed - examine the error logs for details
+
+#Text for license page buttons
+license.next.text=Accept
+license.cancel.text=Reject
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/Res_es.properties
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/Res_es.properties	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/Res_es.properties	(revision 21851)
@@ -0,0 +1,47 @@
+#resources.LanguagePack
+#Wed Nov 10 01:06:42 CET 2004
+
+dirNotExistCreate=El directorio no existe, quieres crearlo?
+dirNotExist=El directorio no existe.
+fileNotExist=El fichero no existe.
+dirNotCreated=El directorio no se ha creado.
+canNotCreateFile=No se puede crear el fichero.
+appRootInvalid=Este directorio no parece ser la raiz de la aplicaciòn.
+selectFile=Seleccionar fichero.
+selectFolder=Seleccionar carpeta.
+notValidSelection=No es una opciòn vàlida.
+showDetails=Enseñar detalles.
+
+#Default loading
+promptLoadDefaults=Configuracion de instalaciòn encontrada. Carga configuraciòn?
+promptMissingDefaultPassword=A password was not found it may have been omitted for security reasons, it will be set to the default.
+
+click=Click
+toContinue=Para continuar
+failed= Intento Fallido
+exit=Salir
+complete=Completar
+finished=Terminado
+extracting=Extrayendo...
+installFinished=Se ha terminado la instalaciòn
+running=Ejecutando:
+
+backButton=Atras
+cancelButton=Cancelar
+nextButton=Proxima
+
+output=Salida
+errors=Errores
+notCorrectFormat=El fichero no tiene un formato adecuado.
+notCorrectPasswordFormat=El fichero no tiene un formato adecuado.
+passwordsDoNotMatch=Las contraseñas tienen que ser iguales
+installationFailed=Instalaciòn fallado
+propertiesVersionMismatch=Faltan datos del versión anterior, continuar y entrar los manualmente?
+
+Finished=Terminado
+Failed=Intento fallido, enseñar mensajes de error
+ant.failure=Ant run failed - examine the error logs for details
+
+#Text for license page buttons
+license.next.text=Aceptar
+license.cancel.text=Cancellar
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/Res_es_EU.properties
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/Res_es_EU.properties	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/Res_es_EU.properties	(revision 21851)
@@ -0,0 +1,47 @@
+#resources.LanguagePack
+#Wed Nov 10 01:06:42 CET 2004
+
+dirNotExistCreate=Direktorioa ez da existitzen, sortu nahi al duzu?
+dirNotExist=Direktorioa ez da existitzen.
+fileNotExist=Fitxategia ez da existitzen.
+dirNotCreated=Ezin izan da direktorioa sortu.
+canNotCreateFile=Fitxategia ezin da sortu.
+appRootInvalid=Ez dirutdi direktorio hay aplikazioaren erroa denik.
+selectFile=Fitxategia aukeratu.
+selectFolder=karpeta aukeratu.
+notValidSelection=Ez da aukera onargarria.
+showDetails=Erakutsi xehetasunak.
+
+#Default loading
+promptLoadDefaults=Instalazio konfigurazio bat aurkituta. Kargatu instalazioa?
+promptMissingDefaultPassword=A password was not found it may have been omitted for security reasons, it will be set to the default.
+
+click=Sakatu
+toContinue=Jarraitzeko
+failed=Hutsegitea
+exit=Atera
+complete=Bukatu
+finished=Bukatuta
+extracting=Ateratzen...
+installFinished=Instalazioa bukatuta.
+running=Exekutatzen:
+
+backButton=Atzera
+cancelButton=Ezeztatu
+nextButton=Hurrengoa
+
+output=Irteera
+errors=Akatsak
+notCorrectFormat=Fitxategia ez da formatu egokikoa.
+notCorrectPasswordFormat=Fitxategia ez da formatu egokikoa.
+passwordsDoNotMatch=Pasa hitzak berdinak izan behar dira 
+installationFailed=Instalaciòn fallado
+propertiesVersionMismatch=Faltan datos del versión anterior, continuar y entrar los manualmente?
+
+Finished=Bukatuta
+Failed=Huts egin da, erakutsi akats mezuak
+ant.failure=Ant run failed - examine the error logs for details
+
+#Text for license page buttons
+license.next.text=Aceptar
+license.cancel.text=Cancellar
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/package.html
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/package.html	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/package.html	(revision 21851)
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head><!--
+  Copyright (c) 2004 tp23
+  All Rights Reserved.
+--></head>
+
+<body bgcolor="white">Classes of this package follow a strict naming convention to define the supported renderers
+for a specific input class.</body>
+</html>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIButton.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIButton.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIButton.java	(revision 21851)
@@ -0,0 +1,71 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.Dimension;
+
+import javax.swing.Action;
+import javax.swing.Icon;
+import javax.swing.JButton;
+
+
+/**
+ * A JButton with altered prefered size to facilitate fixing the width
+ * but still using a GridBagLayout
+ * @author Paul Hinds
+ * @version $Id: AIButton.java,v 1.2 2006/12/09 15:26:09 teknopaul Exp $
+ */
+public class AIButton extends JButton {
+
+	public AIButton() {
+		super();
+	}
+
+	public AIButton(String text) {
+		super(text);
+	}
+
+	public AIButton(Action a) {
+		super(a);
+	}
+
+	public AIButton(Icon icon) {
+		super(icon);
+	}
+
+	public AIButton(String text, Icon icon) {
+		super(text, icon);
+	}
+
+	private Dimension prefSize = new Dimension(SizeConstants.BUTTON_WIDTH, 
+					                           SizeConstants.FIELD_HEIGHT);
+
+	public Dimension getMinimumSize() {
+		return prefSize;
+	}
+
+	public Dimension getPreferredSize() {
+		return prefSize;
+	}
+	public void setOverflow(Dimension prefSize) {
+		this.prefSize = prefSize;
+	}
+
+	public Dimension getMaximumSize() {
+		return prefSize;
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AICheckBox.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AICheckBox.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AICheckBox.java	(revision 21851)
@@ -0,0 +1,82 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.Dimension;
+
+import javax.swing.Action;
+import javax.swing.Icon;
+import javax.swing.JCheckBox;
+
+
+/**
+ * A JCheckBox with altered prefered size to facilitate fixing the width
+ * but still using a GridBagLayout
+ * @author Paul Hinds
+ * @version $Id: AICheckBox.java,v 1.2 2006/12/09 15:26:09 teknopaul Exp $
+ */
+public class AICheckBox extends JCheckBox {
+
+	public AICheckBox() {
+		super();
+	}
+
+	public AICheckBox(String text) {
+		super(text);
+	}
+
+	public AICheckBox(String text, boolean selected) {
+		super(text, selected);
+	}
+
+	public AICheckBox(Action a) {
+		super(a);
+	}
+
+	public AICheckBox(Icon icon) {
+		super(icon);
+	}
+
+	public AICheckBox(Icon icon, boolean selected) {
+		super(icon, selected);
+	}
+
+	public AICheckBox(String text, Icon icon) {
+		super(text, icon);
+	}
+
+	public AICheckBox(String text, Icon icon, boolean selected) {
+		super(text, icon, selected);
+	}
+
+	private Dimension prefSize = new Dimension(SizeConstants.FIELD_WIDTH, SizeConstants.FIELD_HEIGHT);
+
+	public Dimension getMinimumSize() {
+		return prefSize;
+	}
+
+	public Dimension getPreferredSize() {
+		return prefSize;
+	}
+	public void setOverflow(Dimension prefSize) {
+		this.prefSize = prefSize;
+	}
+
+	public Dimension getMaximumSize() {
+		return prefSize;
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AILabel.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AILabel.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AILabel.java	(revision 21851)
@@ -0,0 +1,65 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.Dimension;
+
+import javax.swing.Icon;
+import javax.swing.JLabel;
+
+
+/**
+ * A JLabel with altered prefered size to facilitate fixing the width
+ * but still using a GridBagLayout
+ * @author Paul Hinds
+ * @version $Id: AILabel.java,v 1.2 2006/12/09 15:26:09 teknopaul Exp $
+ */
+public class AILabel extends JLabel {
+
+	public AILabel() {
+		super();
+	}
+	public AILabel(String text) {
+		super(text);
+	}
+	public AILabel(String text, int horizontalAlignment) {
+		super(text, horizontalAlignment);
+	}
+	public AILabel(Icon image) {
+		super(image);
+	}
+	public AILabel(Icon image, int horizontalAlignment) {
+		super(image, horizontalAlignment);
+	}
+	public AILabel(String text, Icon icon, int horizontalAlignment) {
+		super(text, icon, horizontalAlignment);
+	}
+	private Dimension prefSize= new Dimension(SizeConstants.LABEL_WIDTH,
+			SizeConstants.FIELD_HEIGHT);
+	public Dimension getMinimumSize() {
+		return prefSize;
+	}
+	public Dimension getPreferredSize() {
+		return prefSize;
+	}
+	public void setOverflow(Dimension prefSize) {
+		this.prefSize = prefSize;
+	}
+	public Dimension getMaximumSize() {
+		return prefSize;
+	}
+	
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIPasswordField.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIPasswordField.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIPasswordField.java	(revision 21851)
@@ -0,0 +1,52 @@
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.Dimension;
+
+import javax.swing.JPasswordField;
+import javax.swing.text.Document;
+
+
+/**
+ * @author Paul Hinds
+ * @version $Id: AIPasswordField.java,v 1.3 2006/12/21 00:02:59 teknopaul Exp $
+ */
+public class AIPasswordField extends JPasswordField {
+
+	public AIPasswordField() {
+		super();
+	}
+
+	public AIPasswordField(int columns) {
+		super(columns);
+	}
+
+	public AIPasswordField(String text) {
+		super(text);
+	}
+
+	public AIPasswordField(String text, int columns) {
+		super(text, columns);
+	}
+
+	public AIPasswordField(Document doc, String txt, int columns) {
+		super(doc, txt, columns);
+	}
+
+	private Dimension prefSize = new Dimension(SizeConstants.FIELD_WIDTH, SizeConstants.FIELD_HEIGHT);
+
+	public Dimension getMinimumSize() {
+		return prefSize;
+	}
+
+	public Dimension getPreferredSize() {
+		return prefSize;
+	}
+	public void setOverflow(Dimension prefSize) {
+		this.prefSize = prefSize;
+	}
+
+	public Dimension getMaximumSize() {
+		return prefSize;
+	}
+	
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIRadioButton.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIRadioButton.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIRadioButton.java	(revision 21851)
@@ -0,0 +1,82 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.Dimension;
+
+import javax.swing.Action;
+import javax.swing.Icon;
+import javax.swing.JRadioButton;
+
+
+/**
+ * A JRadioButton with altered prefered size to facilitate fixing the width
+ * but still using a GridBagLayout
+ * @author Paul Hinds
+ * @version $Id: AIRadioButton.java,v 1.2 2006/12/09 15:26:09 teknopaul Exp $
+ */
+public class AIRadioButton extends JRadioButton {
+
+	public AIRadioButton() {
+		super();
+	}
+
+	public AIRadioButton(String text) {
+		super(text);
+	}
+
+	public AIRadioButton(String text, boolean selected) {
+		super(text, selected);
+	}
+
+	public AIRadioButton(Action a) {
+		super(a);
+	}
+
+	public AIRadioButton(Icon icon) {
+		super(icon);
+	}
+
+	public AIRadioButton(Icon icon, boolean selected) {
+		super(icon, selected);
+	}
+
+	public AIRadioButton(String text, Icon icon) {
+		super(text, icon);
+	}
+
+	public AIRadioButton(String text, Icon icon, boolean selected) {
+		super(text, icon, selected);
+	}
+
+	private Dimension prefSize = new Dimension(SizeConstants.FIELD_WIDTH, SizeConstants.FIELD_HEIGHT);
+
+	public Dimension getMinimumSize() {
+		return prefSize;
+	}
+
+	public Dimension getPreferredSize() {
+		return prefSize;
+	}
+	public void setOverflow(Dimension prefSize) {
+		this.prefSize = prefSize;
+	}
+
+	public Dimension getMaximumSize() {
+		return prefSize;
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIShortLabel.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIShortLabel.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIShortLabel.java	(revision 21851)
@@ -0,0 +1,65 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.Dimension;
+
+import javax.swing.Icon;
+import javax.swing.JLabel;
+
+
+/**
+ * A JLabel with altered prefered size to facilitate fixing the width
+ * but still using a GridBagLayout
+ * @author Paul Hinds
+ * @version $Id: AILabel.java,v 1.2 2006/12/09 15:26:09 teknopaul Exp $
+ */
+public class AIShortLabel extends JLabel {
+
+	public AIShortLabel() {
+		super();
+	}
+	public AIShortLabel(String text) {
+		super(text);
+	}
+	public AIShortLabel(String text, int horizontalAlignment) {
+		super(text, horizontalAlignment);
+	}
+	public AIShortLabel(Icon image) {
+		super(image);
+	}
+	public AIShortLabel(Icon image, int horizontalAlignment) {
+		super(image, horizontalAlignment);
+	}
+	public AIShortLabel(String text, Icon icon, int horizontalAlignment) {
+		super(text, icon, horizontalAlignment);
+	}
+	private Dimension prefSize= new Dimension(60,
+			SizeConstants.FIELD_HEIGHT);
+	public Dimension getMinimumSize() {
+		return prefSize;
+	}
+	public Dimension getPreferredSize() {
+		return prefSize;
+	}
+	public void setOverflow(Dimension prefSize) {
+		this.prefSize = prefSize;
+	}
+	public Dimension getMaximumSize() {
+		return prefSize;
+	}
+	
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIShortTextField.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIShortTextField.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIShortTextField.java	(revision 21851)
@@ -0,0 +1,71 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.Dimension;
+
+import javax.swing.JTextField;
+import javax.swing.text.Document;
+
+
+/**
+ * A JTextField with altered prefered size to facilitate fixing the width
+ * but still using a GridBagLayout. This text field is for use inconjunction
+ * with a button for example file chooser.
+ * @author Paul Hinds
+ * @version $Id: AIShortTextField.java,v 1.2 2006/12/09 15:26:10 teknopaul Exp $
+ */
+public class AIShortTextField extends JTextField {
+
+	public AIShortTextField() {
+		super();
+	}
+
+	public AIShortTextField(int columns) {
+		super(columns);
+	}
+
+	public AIShortTextField(String text) {
+		super(text);
+	}
+
+	public AIShortTextField(String text, int columns) {
+		super(text, columns);
+	}
+
+	public AIShortTextField(Document doc, String text, int columns) {
+		super(doc, text, columns);
+	}
+
+	private Dimension prefSize = new Dimension(SizeConstants.SHORT_FIELD_WIDTH, SizeConstants.FIELD_HEIGHT);
+
+	public Dimension getMinimumSize() {
+		return prefSize;
+	}
+
+	public Dimension getPreferredSize() {
+		return prefSize;
+	}
+	public void setOverflow(Dimension prefSize) {
+		this.prefSize = prefSize;
+	}
+
+	public Dimension getMaximumSize() {
+		return prefSize;
+	}
+
+	
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AITextfield.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AITextfield.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AITextfield.java	(revision 21851)
@@ -0,0 +1,70 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.Dimension;
+
+import javax.swing.JTextField;
+import javax.swing.text.Document;
+
+
+/**
+ * A JTextField with altered prefered size to facilitate fixing the width
+ * but still using a GridBagLayout
+ * @author Paul Hinds
+ * @version $Id: AITextfield.java,v 1.2 2006/12/09 15:26:09 teknopaul Exp $
+ */
+public class AITextfield extends JTextField {
+
+	public AITextfield() {
+		super();
+	}
+
+	public AITextfield(int columns) {
+		super(columns);
+	}
+
+	public AITextfield(String text) {
+		super(text);
+	}
+
+	public AITextfield(String text, int columns) {
+		super(text, columns);
+	}
+
+	public AITextfield(Document doc, String text, int columns) {
+		super(doc, text, columns);
+	}
+
+	private Dimension prefSize = new Dimension(SizeConstants.FIELD_WIDTH, SizeConstants.FIELD_HEIGHT);
+
+	public Dimension getMinimumSize() {
+		return prefSize;
+	}
+
+	public Dimension getPreferredSize() {
+		return prefSize;
+	}
+	public void setOverflow(Dimension prefSize) {
+		this.prefSize = prefSize;
+	}
+
+	public Dimension getMaximumSize() {
+		return prefSize;
+	}
+
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AppRootInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AppRootInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AppRootInputRenderer.java	(revision 21851)
@@ -0,0 +1,20 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+public class AppRootInputRenderer
+	extends DirectoryInputRenderer {
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/CheckboxInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/CheckboxInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/CheckboxInputRenderer.java	(revision 21851)
@@ -0,0 +1,114 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import java.awt.FlowLayout;
+import java.awt.GridLayout;
+import java.awt.BorderLayout;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import java.awt.Dimension;
+import java.awt.Insets;
+import javax.swing.JTextField;
+
+
+import org.tp23.antinstaller.input.CheckboxInput;
+import org.tp23.antinstaller.input.InputField;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.gui.GBCF;
+
+public class CheckboxInputRenderer
+	extends SwingOutputFieldRenderer {
+
+	protected CheckboxInput inputField;
+
+    protected JLabel fieldLabel = new AILabel();
+	protected AICheckBox checkBox = new AICheckBox();
+
+	public CheckboxInputRenderer() {
+	}
+	public void initComponent(JPanel parent){
+		try {
+			jbInit();
+		}
+		catch(Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+
+
+	public void setOutputField(OutputField inputField) {
+		this.inputField = (CheckboxInput)inputField;
+	}
+	public void updateInputField(){
+		boolean selected = checkBox.isSelected();
+		if(selected)inputField.setValue("true");
+		else inputField.setValue("false");
+	}
+	public void updateDefaultValue(){
+		if(!inputField.isEditted()){
+			String newDefault = inputField.getDefaultValue();
+			checkBox.setSelected(InputField.isTrue(newDefault));
+		}
+	}
+
+    private void jbInit() throws Exception {
+		fieldLabel.setText(inputField.getDisplayText());
+		checkBox.setSelected(OutputField.isTrue(inputField.getDefaultValue()));
+		checkBox.setEnabled(!OutputField.isTrue(inputField.getForce()));
+		checkBox.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent e) {
+				updateInputField();
+				inputField.setEditted(true);
+			}
+		});
+    }
+	public int addSelf(JPanel content, GBCF cf,  int row, boolean overflow) {
+		JPanel p;
+
+		//p = new JPanel(new FlowLayout(FlowLayout.LEFT));
+		BorderLayout l = new BorderLayout();
+		p = new JPanel(l);
+		p.add( fieldLabel, BorderLayout.WEST );
+		p.add( checkBox, BorderLayout.CENTER );
+		content.add(p);
+
+		p = new JPanel();
+		p.setMinimumSize( new Dimension(0,1) );
+		content.add(p);
+		return ++row;
+/*
+		JPanel p = new JPanel();
+		p.add(fieldLabel);
+		p.add(checkBox);
+		if(overflow){
+			checkBox.setOverflow(SizeConstants.OVERFLOW_FIELD_SIZE);
+		}
+		content.add(p);
+
+*/
+	}
+
+	/**
+	 * renderError
+	 */
+	public void renderError() {
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ClasspathHTMLEditorKit.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ClasspathHTMLEditorKit.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ClasspathHTMLEditorKit.java	(revision 21851)
@@ -0,0 +1,54 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.net.URL;
+
+import javax.swing.text.Element;
+import javax.swing.text.View;
+import javax.swing.text.ViewFactory;
+import javax.swing.text.html.HTML;
+import javax.swing.text.html.HTMLEditorKit;
+import javax.swing.text.html.ImageView;
+/**
+ * HTMLEditor kit that replaces the source of images in the document
+ * with resources loaded from the classpath.
+ * @author teknopaul
+ */
+public class ClasspathHTMLEditorKit extends HTMLEditorKit {
+
+	public ViewFactory getViewFactory(){
+		
+		return new HTMLEditorKit.HTMLFactory(){
+			
+			public View create(Element elem){
+				if(! elem.getName().equals("img")){
+					return super.create(elem);
+				}
+				return new ImageView(elem){
+					public URL getImageURL() {
+						String src = (String)getElement().getAttributes().
+							getAttribute(HTML.Attribute.SRC);
+						return TextPageRenderer.class.getResource(src);
+					}
+				};
+			}
+			
+		};
+		
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/CommentOutputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/CommentOutputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/CommentOutputRenderer.java	(revision 21851)
@@ -0,0 +1,135 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Color;
+
+import javax.swing.JTextArea;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.text.JTextComponent;
+
+import org.tp23.antinstaller.input.CommentOutput;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.gui.GBCF;
+
+public class CommentOutputRenderer
+	extends SwingOutputFieldRenderer {
+
+    protected JTextArea fieldLabel = new JTextArea();
+    //protected AILabel fieldLabel = new AILabel();
+    // hack callback, should move this to superclass
+    protected JTextComponent explanatoryTextField;
+
+	private static Font boldCommentFont;
+	private static Font titleCommentFont;
+	static{
+		boldCommentFont = new JLabel().getFont();// reusing the variable
+		try {
+			boldCommentFont = new Font(boldCommentFont.getFamily(), Font.BOLD, boldCommentFont.getSize());
+			titleCommentFont = new Font(boldCommentFont.getFamily(), Font.BOLD, 16);
+		}
+		catch (Exception ex) {
+			// lets not fail due to font errors
+		}
+	}
+
+	public CommentOutputRenderer() {
+	}
+
+	public void initComponent(JPanel parent){
+		fieldLabel.setLineWrap(true);
+		fieldLabel.setWrapStyleWord(true);
+		fieldLabel.setEditable(false);
+		fieldLabel.setBackground( parent.getBackground() );
+		try {
+			jbInit();
+		}
+		catch(Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void setOutputField(OutputField outputField) {
+		this.outputField = (CommentOutput)outputField;// trap ClassCast bugs early
+	}
+	public void updateInputField(){
+	}
+
+//   hack callback, should move this to superclass
+    public JTextComponent getExplanatoryTextField() {
+        return explanatoryTextField;
+    }
+//  hack callback, should move this to superclass
+    public void setExplanatoryTextField(JTextComponent explanatoryTextField) {
+        this.explanatoryTextField = explanatoryTextField;
+    }
+    /**
+     * Since comments may now include expanded properties this should be called when the 
+     * field is rendered.  For no ONLY comment fields have property values expanded
+     */
+	public void updateDefaultValue(){
+        fieldLabel.setText(outputField.getDisplayText());
+        if(explanatoryTextField != null) {
+            explanatoryTextField.setText(outputField.getExplanatoryText());
+        }
+	}
+    private void jbInit() throws Exception {
+        
+        // FindBugs - cast is performed here to avoid overriding protected superclass field 
+        CommentOutput cOutputField = (CommentOutput)outputField;
+        
+		fieldLabel.setText(cOutputField.getDisplayText());
+		
+		if( OutputField.isTrue(cOutputField.getBold()) ){
+			fieldLabel.setFont(boldCommentFont);
+		}
+		if( OutputField.isTrue(cOutputField.getTitle()) ){
+			fieldLabel.setFont(titleCommentFont);
+		}
+    }
+	public int addSelf(JPanel content, GBCF cf,  int row, boolean overflow) {
+
+		//JPanel np = new JPanel();
+		//np.setLayout( new FlowLayout() );
+		//np.add( fieldLabel );
+
+		content.add(fieldLabel);
+
+		JPanel p = new JPanel();
+		p.setMinimumSize( new Dimension(0,1) );
+		content.add(p);
+
+		//content.add(fieldLabel);
+		/*
+		if(overflow){
+			fieldLabel.setOverflow(SizeConstants.OVERFLOW_TOTAL_SIZE);
+		} else {
+			fieldLabel.setOverflow(new Dimension(SizeConstants.FIELD_WIDTH + SizeConstants.LABEL_WIDTH, SizeConstants.FIELD_HEIGHT));
+		}
+		*/
+		return ++row;
+	}
+
+
+	/**
+	 * renderError
+	 */
+	public void renderError() {
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ConditionalFieldRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ConditionalFieldRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ConditionalFieldRenderer.java	(revision 21851)
@@ -0,0 +1,111 @@
+/*
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.util.ArrayList;
+
+import javax.swing.JPanel;
+
+import org.tp23.antinstaller.ResourceBundleHelper;
+import org.tp23.antinstaller.input.ConditionalField;
+import org.tp23.antinstaller.input.InputField;
+import org.tp23.antinstaller.renderer.RendererFactory;
+import org.tp23.antinstaller.runtime.ConfigurationException;
+import org.tp23.antinstaller.runtime.logic.Expression;
+import org.tp23.gui.GBCF;
+
+/**
+ * Conditionally render a collection of fields.
+ * For now, will ONLY handle <code>&lt;hiddeb&gt;</code> fields
+ *
+ * @author mwilson
+ * @version $Id
+ * @since 0.7.4 patch 7
+ */
+public class ConditionalFieldRenderer extends SwingOutputFieldRenderer {
+    
+    private ResourceBundleHelper resHelper = new ResourceBundleHelper( "resources.LanguagePack" );
+    private ConditionalField condField;
+    private ArrayList renderers = new ArrayList( );
+
+    public ConditionalFieldRenderer() {
+    }
+
+    public void initComponent( JPanel parent ) {
+
+        condField = (ConditionalField) outputField;
+        InputField[] fields = condField.getFields();
+
+        for (int i = 0; i < fields.length; i++) {
+            try {
+                SwingOutputFieldRenderer renderer = RendererFactory.getSwingRenderer(fields[i]);
+                renderer.setOutputField(fields[i]);
+                renderer.setInstallerContext(ctx);
+                renderers.add( renderer );
+            }
+            catch( ClassNotFoundException clsNotFndExc ) {
+
+            }
+        }
+
+    }
+
+    public void updateInputField() {
+
+        if( expressionIsTrue() ) {
+            int listSize  = renderers.size();
+            for( int i = 0; i < listSize; i++ ) {
+                SwingOutputFieldRenderer renderer = (SwingOutputFieldRenderer) renderers.get( i );
+                renderer.updateInputField();
+            }
+        }
+
+    }
+
+    public void updateDefaultValue() {
+        if( expressionIsTrue() ) {
+            int listSize  = renderers.size();
+            for( int i = 0; i < listSize; i++ ) {
+                SwingOutputFieldRenderer renderer = (SwingOutputFieldRenderer) renderers.get( i );
+                renderer.updateDefaultValue();
+            }
+        }
+    }
+
+    public void renderError() {
+        int listSize  = renderers.size();
+        for( int i = 0; i < listSize; i++ ) {
+            SwingOutputFieldRenderer renderer = (SwingOutputFieldRenderer) renderers.get( i );
+            renderer.renderError();
+        }
+    }
+
+    public int addSelf( JPanel content, GBCF cf, int row, boolean overflow ) {
+        return row;
+    }
+
+    private boolean expressionIsTrue() {
+        Expression expr = null;
+
+        try {
+            expr = condField.getExpression();
+        }
+        catch( ConfigurationException configExc ) {
+            ctx.log( resHelper.getMessage( "invalid.conditional.expression", configExc ) );
+            return false;
+        }
+
+         return expr.evaluate();
+    }
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ConfirmPasswordTextInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ConfirmPasswordTextInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ConfirmPasswordTextInputRenderer.java	(revision 21851)
@@ -0,0 +1,25 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.util.ResourceBundle;
+
+public class ConfirmPasswordTextInputRenderer extends PasswordTextInputRenderer{
+	
+	protected String getErrorMessage(){
+		return org.tp23.antinstaller.Installer.langPack.getString("passwordsDoNotMatch");
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/DateInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/DateInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/DateInputRenderer.java	(revision 21851)
@@ -0,0 +1,102 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.Color;
+import java.awt.event.FocusAdapter;
+import java.awt.event.FocusEvent;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.util.ResourceBundle;
+
+import javax.swing.JPanel;
+
+import org.tp23.antinstaller.input.DateInput;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.renderer.MessageRenderer;
+import org.tp23.gui.GBCF;
+
+public class DateInputRenderer
+	extends SwingOutputFieldRenderer {
+
+	protected DateInput inputField;
+
+    protected AILabel fieldLabel = new AILabel();
+    protected AITextfield jTextField = new AITextfield();
+	protected Color origFore;
+
+	public DateInputRenderer() {
+		origFore = jTextField.getForeground();
+	}
+
+	public void initComponent(JPanel parent){
+		try {
+			jbInit();
+		}
+		catch(Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void setOutputField(OutputField inputField) {
+		this.inputField = (DateInput)inputField;
+		this.inputField.setValue(this.inputField.getDefaultValue());
+	}
+	public void updateInputField(){
+		inputField.setValue(jTextField.getText());
+	}
+	public void updateDefaultValue(){
+		if(!inputField.isEditted())jTextField.setText(inputField.getDefaultValue());
+	}
+
+    private void jbInit() throws Exception {
+		fieldLabel.setText(inputField.getDisplayText());
+		jTextField.setText(inputField.getDefaultValue());
+		jTextField.addKeyListener(new KeyAdapter() {
+			public void keyTyped(KeyEvent e) {
+				if(e.getKeyChar() != '\t'){
+					inputField.setEditted(true);
+				}
+			}
+		});
+		jTextField.addFocusListener(new FocusAdapter() {
+			public void focusLost(FocusEvent fe){
+				jTextField.setForeground(origFore);
+			}
+		});
+    }
+	public int addSelf(JPanel content, GBCF cf,  int row,boolean overflow) {
+		content.add(fieldLabel, cf.getCell(row, 0));
+		content.add(jTextField, cf.getCell(row, 1));
+		if(overflow){
+			jTextField.setOverflow(SizeConstants.OVERFLOW_FIELD_SIZE);
+		}
+		return ++row;
+	}
+
+
+	/**
+	 * renderError
+	 */
+	public void renderError() {
+		MessageRenderer mr = ctx.getMessageRenderer();
+		mr.printMessage(org.tp23.antinstaller.Installer.langPack.getString("notCorrectFormat") + "\n\n " + inputField.getDateFormat());
+		//fixed BUG1295944 mr.printMessage("The field is not of the correct format\n\n "+inputField.getDateFormat());
+		this.jTextField.requestFocus();
+		this.jTextField.setForeground(Color.red);
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/DirectoryInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/DirectoryInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/DirectoryInputRenderer.java	(revision 21851)
@@ -0,0 +1,151 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.BorderLayout;
+import java.awt.FlowLayout;
+import javax.swing.BoxLayout;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.Insets;
+import java.io.File;
+import java.util.ResourceBundle;
+
+import javax.swing.JFileChooser;
+import javax.swing.JPanel;
+import javax.swing.JLabel;
+
+import org.tp23.antinstaller.input.DirectoryInput;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.gui.GBCF;
+import org.tp23.gui.widget.DefaultingDirectoryChooser;
+
+public class DirectoryInputRenderer
+	extends SwingOutputFieldRenderer {
+
+    private static final String EMPTY_STRING = "";
+	protected DirectoryInput inputField;
+	private boolean createMode;
+	private DefaultingDirectoryChooser chooser = null;
+
+	protected JLabel fieldLabel = new AILabel();
+	protected AIShortTextField jTextField = new AIShortTextField();
+	protected AIButton browseButton = new AIButton();
+	protected JPanel browsePanel = new JPanel();
+	private JPanel parent;
+
+	public DirectoryInputRenderer() {
+	}
+	public void initComponent(JPanel parent){
+		this.parent = parent;
+		try {
+			jbInit();
+		}
+		catch(Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void setOutputField(OutputField inputField) {
+		this.inputField = (DirectoryInput)inputField;
+		this.inputField.setValue(this.inputField.getDefaultValue(true));
+		this.createMode = OutputField.isTrue(this.inputField.getCreate());
+
+	}
+	public void updateInputField(){
+		if( !inputField.getDefaultValue(true).equals(jTextField.getText()) ){
+			inputField.setEditted(true);			
+		}
+		inputField.setValue(jTextField.getText());	
+	}
+	public void updateDefaultValue(){
+		if(!inputField.isEditted())jTextField.setText(inputField.getDefaultValue(true));
+	}
+
+	private void jbInit() throws Exception {
+		BorderLayout bl = new BorderLayout();
+		//bl.setHgap(3);
+		browsePanel.setLayout(bl);
+		fieldLabel.setText(inputField.getDisplayText());
+		jTextField.setText(inputField.getDefaultValue(true));
+		browsePanel.add(jTextField, BorderLayout.CENTER);
+
+		JPanel browseButtonWrapper = new JPanel( new BorderLayout() );
+		browseButtonWrapper.add( browseButton, BorderLayout.EAST );
+		browsePanel.add(browseButtonWrapper, BorderLayout.SOUTH);
+		browseButton.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent e) {
+				File selectedFile = null;
+				if(chooser==null){
+					chooser = new DefaultingDirectoryChooser(createMode);
+					//chooser.setFileHidingEnabled(false);
+				}
+
+                //PR 1468823 - if input is cleared, dialogue won't be displayed
+                String dirPath = jTextField.getText();
+                if( dirPath == null ) {
+                    dirPath = EMPTY_STRING;
+                }
+                dirPath = dirPath.trim();
+
+                if( dirPath.length() == 0 ) {
+                    dirPath = inputField.getDefaultValue(true);
+                    jTextField.setText(dirPath);
+                }
+                chooser.setDefaultDirectory(new File(dirPath));
+
+                int returnVal = chooser.showDialog(parent, org.tp23.antinstaller.Installer.langPack.getString("selectFolder") );
+				if (returnVal == JFileChooser.APPROVE_OPTION) {
+					selectedFile = chooser.getSelectedFile();
+				}
+				if (selectedFile != null) {
+					jTextField.setText(selectedFile.getAbsolutePath());
+					inputField.setValue(selectedFile.getAbsolutePath());
+					inputField.setEditted(true);
+				}
+			}
+		});
+		browseButton.setText(org.tp23.antinstaller.Installer.langPack.getString("browseDotDotDot"));
+		browseButton.setPreferredSize(new Dimension(150, SizeConstants.FIELD_HEIGHT));
+
+		jTextField.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent e) {
+				updateInputField();
+			}
+		});
+
+	}
+	public int addSelf(JPanel content,GBCF cf,  int row, boolean overflow) {
+		FlowLayout l = new FlowLayout(FlowLayout.LEFT);
+		JPanel p = new JPanel(l);
+		p.add(fieldLabel);
+		content.add(p);
+		content.add(browsePanel);
+		if(overflow){
+			jTextField.setOverflow(SizeConstants.OVERFLOW_SHORT_FIELD_SIZE);
+		}
+		return ++row;
+	}
+
+
+	/**
+	 * renderError
+	 */
+	public void renderError() {
+        jTextField.requestFocus();
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ExtValidatedTextInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ExtValidatedTextInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ExtValidatedTextInputRenderer.java	(revision 21851)
@@ -0,0 +1,40 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.Color;
+
+import org.tp23.antinstaller.input.ExtValidatedTextInput;
+import org.tp23.antinstaller.input.Validator;
+import org.tp23.antinstaller.renderer.MessageRenderer;
+
+public class ExtValidatedTextInputRenderer
+	extends ValidatedTextInputRenderer {
+
+	/**
+	 * renderError
+	 */
+	public void renderError() {
+		MessageRenderer mr = ctx.getMessageRenderer();
+		ExtValidatedTextInput extVal = (ExtValidatedTextInput)inputField;
+		Validator validator = extVal.getValidator();
+		Throwable t = extVal.getThrowable();
+		mr.printMessage(validator.getErrorMessage(t, null));
+		this.jTextField.requestFocus();
+		this.jTextField.setForeground(Color.red);
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/FileInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/FileInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/FileInputRenderer.java	(revision 21851)
@@ -0,0 +1,137 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.FocusAdapter;
+import java.awt.event.FocusEvent;
+import java.io.File;
+import java.util.ResourceBundle;
+
+import javax.swing.JFileChooser;
+import javax.swing.JPanel;
+
+import org.tp23.antinstaller.input.FileInput;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.renderer.MessageRenderer;
+import org.tp23.gui.GBCF;
+
+public class FileInputRenderer
+	extends SwingOutputFieldRenderer {
+
+	protected FileInput inputField;
+
+	protected AILabel fieldLabel = new AILabel();
+	protected AIShortTextField jTextField = new AIShortTextField();
+	protected AIButton browseButton = new AIButton();
+	protected JPanel browsePanel = new JPanel();
+	private Color origFore = jTextField.getForeground();
+	private JPanel parent;
+
+	public FileInputRenderer() {
+	}
+	public void initComponent(JPanel parent){
+		this.parent=parent;
+		try {
+			jbInit();
+		}
+		catch(Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void setOutputField(OutputField inputField) {
+		this.inputField = (FileInput)inputField;
+		this.inputField.setValue(this.inputField.getDefaultValue(true));
+	}
+	public void updateInputField(){
+		if( !inputField.getDefaultValue(true).equals(jTextField.getText()) ){
+			inputField.setEditted(true);			
+		}
+		inputField.setValue(jTextField.getText());
+	}
+	public void updateDefaultValue(){
+		if(!inputField.isEditted())jTextField.setText(inputField.getDefaultValue(true));
+	}
+
+	private void jbInit() throws Exception {
+		BorderLayout bl = new BorderLayout();
+		//bl.setHgap(3);
+		browsePanel.setLayout(bl);
+		fieldLabel.setText(inputField.getDisplayText());
+		jTextField.setText(inputField.getDefaultValue(true));
+		browsePanel.add(jTextField, BorderLayout.CENTER);
+		browsePanel.add(browseButton, BorderLayout.EAST);
+		browseButton.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent e) {
+				File selectedFile = null;
+
+				JFileChooser chooser = new JFileChooser();
+				chooser.setFileHidingEnabled(false);
+				chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
+				if (jTextField.getText() != null) {
+					chooser.setCurrentDirectory(new File(jTextField.getText()).getParentFile());
+				}
+				int returnVal = chooser.showDialog(parent, e.getActionCommand());
+				if (returnVal == JFileChooser.APPROVE_OPTION) {
+					selectedFile = chooser.getSelectedFile();
+				}
+				if (selectedFile != null) {
+					jTextField.setText(selectedFile.getAbsolutePath());
+					inputField.setValue(selectedFile.getAbsolutePath());
+					inputField.setEditted(true);
+				}
+			}
+		});
+		browseButton.setText(org.tp23.antinstaller.Installer.langPack.getString("selectFile"));
+		browseButton.setPreferredSize(new Dimension(150, SizeConstants.FIELD_HEIGHT));
+
+		jTextField.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent e) {
+				updateInputField();
+			}
+		});
+		jTextField.addFocusListener(new FocusAdapter() {
+			public void focusLost(FocusEvent fe){
+				jTextField.setForeground(origFore);
+			}
+		});
+
+	}
+	public int addSelf(JPanel content,GBCF cf,  int row,boolean overflow) {
+		content.add(fieldLabel,cf.getCell(row,0));
+		content.add(browsePanel,cf.getCell(row,1));
+		if(overflow){
+			jTextField.setOverflow(SizeConstants.OVERFLOW_SHORT_FIELD_SIZE);
+		}
+		return ++row;
+	}
+
+
+	/**
+	 * renderError
+	 */
+	public void renderError() {
+		MessageRenderer mr = ctx.getMessageRenderer();
+		mr.printMessage(org.tp23.antinstaller.Installer.langPack.getString("fileNotExist"));
+		this.jTextField.requestFocus();
+		this.jTextField.setForeground(Color.red);
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/HiddenPropertyInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/HiddenPropertyInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/HiddenPropertyInputRenderer.java	(revision 21851)
@@ -0,0 +1,66 @@
+/*
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import javax.swing.JPanel;
+
+import org.tp23.antinstaller.input.HiddenPropertyInput;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.gui.GBCF;
+
+/**
+ * Swing UI hidden property renderer - displays nothing
+ *
+ * @author mwilson
+ * @version $Id
+ * @since 0.7.4 patch 6
+ */
+public class HiddenPropertyInputRenderer extends SwingOutputFieldRenderer
+{
+    HiddenPropertyInput inputField;
+
+    public void setOutputField( OutputField ioField )
+    {
+        inputField = (HiddenPropertyInput) ioField;
+        inputField.setInputResult( inputField.getDefaultValue() );
+    }
+
+    public void initComponent( JPanel parent )
+    {
+
+    }
+
+    public void updateInputField()
+    {
+
+    }
+
+    public void updateDefaultValue()
+    {
+        if( !inputField.isEditted() )
+        {
+            inputField.setInputResult( inputField.getDefaultValue() );
+        }
+    }
+
+    public void renderError()
+    {
+
+    }
+
+    public int addSelf( JPanel content, GBCF cf, int row, boolean overflow )
+    {
+        return row;
+    }
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/LargeSelectInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/LargeSelectInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/LargeSelectInputRenderer.java	(revision 21851)
@@ -0,0 +1,114 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.util.ResourceBundle;
+
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+
+import org.tp23.antinstaller.input.LargeSelectInput;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.gui.GBCF;
+
+public class LargeSelectInputRenderer
+	extends SwingOutputFieldRenderer {
+
+	protected LargeSelectInput inputField;
+
+	protected JLabel fieldLabel = new AILabel();
+	protected JComboBox optionCombo = new JComboBox();
+
+	//private int numOfEntries = 2;
+
+	public LargeSelectInputRenderer() {
+	}
+	public void initComponent(JPanel parent){
+		try {
+			jbInit();
+		}
+		catch(Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+
+
+	public void setOutputField(OutputField inputField) {
+		this.inputField=(LargeSelectInput)inputField;
+		//this.numOfEntries=this.inputField.getOptions().length;
+	}
+	public void updateInputField(){
+
+		int selectedIdx = optionCombo.getSelectedIndex();
+		if (selectedIdx != -1) {
+			inputField.setValue(inputField.getOptions()[selectedIdx].value);
+
+		}else{
+			inputField.setValue(inputField.getDefaultValue());
+		}
+	}
+	public void updateDefaultValue(){
+		if(!inputField.isEditted()){
+
+			String newDefault = inputField.getDefaultValue();
+
+			for(int i=0;i<optionCombo.getItemCount();i++){
+				if(newDefault.equals(inputField.getOptions()[i].value)){
+					optionCombo.setSelectedIndex(i);
+					break;
+				}
+			}
+		}
+	}
+
+    private void jbInit() throws Exception {
+		fieldLabel.setText(inputField.getDisplayText());
+		LargeSelectInput.Option[] options = inputField.getOptions();
+
+
+		for (int i = 0; i < options.length; i++) {
+			optionCombo.addItem(options[i].getText());
+			if(options[i].value.equals(inputField.getDefaultValue())){
+				optionCombo.setSelectedIndex(i);
+			}
+		}
+		optionCombo.addItemListener(new ItemListener(){
+			public void itemStateChanged(ItemEvent e) {
+				inputField.setEditted(true);
+			}
+		});
+    }
+	public int addSelf(JPanel content,GBCF cf,  int row,boolean overflow) {
+		content.add(fieldLabel,cf.getCell(row,0));
+		content.add(optionCombo,cf.getCell(row,1));
+		if(overflow){
+			optionCombo.setPreferredSize(SizeConstants.OVERFLOW_FIELD_SIZE);
+		}
+		return ++row;
+	}
+
+	/**
+	 * renderError
+	 */
+	public void renderError() {
+		ctx.getMessageRenderer().printMessage(org.tp23.antinstaller.Installer.langPack.getString("notValidSelection"));
+		optionCombo.requestFocus();
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/LicensePageRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/LicensePageRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/LicensePageRenderer.java	(revision 21851)
@@ -0,0 +1,113 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.BorderLayout;
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ResourceBundle;
+
+import javax.swing.BorderFactory;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+
+import org.tp23.antinstaller.ValidationException;
+import org.tp23.antinstaller.page.LicensePage;
+import org.tp23.antinstaller.runtime.ConfigurationException;
+
+/**
+ *
+ * <p>Renders the license page </p>
+ * <p> </p>
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+* @todo this could be an input type and simple renderer
+ * @author Paul Hinds
+ * @version $Id: LicensePageRenderer.java,v 1.5 2007/01/12 10:49:09 anothermwilson Exp $
+ */
+public class LicensePageRenderer
+	extends SwingPageRenderer {
+
+	private JTextArea licenseTextArea = new JTextArea();
+	private JScrollPane scrollPane = new JScrollPane();
+
+	public LicensePageRenderer(){
+	}
+
+	public boolean validateFields()throws ValidationException{
+		return true; // @todo option to force accepting or tick box to accept
+	}
+
+	public void reInstanceInit() {
+		getNextButton().setText( org.tp23.antinstaller.Installer.langPack.getString( "license.next.text" ) );
+		getCancelButton().setText( org.tp23.antinstaller.Installer.langPack.getString( "license.cancel.text" ) );
+	}
+
+	public void instanceInit() throws Exception {
+
+		String resource = ((LicensePage)page).getResource();
+		InputStream licensein = this.getClass().getResourceAsStream(resource);
+		if (licensein == null) {
+			//delete me
+			System.out.println( "licensein is null" );
+			throw new ConfigurationException("License resource '" + resource + "' is missing from installer");
+		}
+		BufferedReader reader = new BufferedReader(new InputStreamReader(licensein));
+		StringBuffer sb = new StringBuffer();
+		String line;
+		while((line = reader.readLine()) != null){
+			sb.append(line);
+			sb.append('\n');
+		}
+
+		licenseTextArea.setText(sb.toString());
+		licenseTextArea.setTabSize(4);
+		licenseTextArea.setAutoscrolls(true);
+		licenseTextArea.setCaretPosition(0);
+		licenseTextArea.setEditable(false);
+		licenseTextArea.setLineWrap(true);
+		licenseTextArea.setWrapStyleWord(true);
+		licenseTextArea.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
+		scrollPane.getViewport().add(licenseTextArea);
+		scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
+
+		scrollPane.setBorder(
+			BorderFactory.createCompoundBorder(
+				BorderFactory.createEmptyBorder(4, 4, 4, 4),
+				BorderFactory.createEtchedBorder()
+				)
+			);
+		this.add(scrollPane, BorderLayout.CENTER);
+
+		getNextButton().setText( org.tp23.antinstaller.Installer.langPack.getString( "license.next.text" ) );
+		getNextButton().setIcon(getImage("/resources/icons/ok.png"));
+		getCancelButton().setText( org.tp23.antinstaller.Installer.langPack.getString( "license.cancel.text" ) );
+
+    }
+
+	public void updateInputFields(){
+		;
+	}
+
+
+
+	/**
+	 * updateDefaultValues
+	 */
+	public void updateDefaultValues() {
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/PageCompletionListener.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/PageCompletionListener.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/PageCompletionListener.java	(revision 21851)
@@ -0,0 +1,33 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import org.tp23.antinstaller.page.Page;
+/**
+ *
+ * <p>Called when a page is complete and the user presses next.
+* At this point the pages fields are validated.  If validation passes
+* the next page is shown </p>
+ * <p> </p>
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @author Paul Hinds
+ * @version $Id: PageCompletionListener.java,v 1.1.1.1 2005/10/18 18:21:01 teknopaul Exp $
+ */
+public interface PageCompletionListener {
+	public void pageComplete(Page page);
+	public void pageBack(Page page);
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/PasswordTextInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/PasswordTextInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/PasswordTextInputRenderer.java	(revision 21851)
@@ -0,0 +1,64 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.Color;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.util.ResourceBundle;
+
+import javax.swing.JPanel;
+
+import org.tp23.antinstaller.renderer.MessageRenderer;
+import org.tp23.gui.GBCF;
+
+public class PasswordTextInputRenderer extends ValidatedTextInputRenderer{
+	
+    public PasswordTextInputRenderer() {
+		this.jTextField = new AIPasswordField();
+		origFore = jTextField.getForeground(); // this is lazy there must be a way to shift this line of code to the superclass (is it worth it)
+    }
+
+
+	public void renderError() {
+		MessageRenderer mr = ctx.getMessageRenderer();
+		mr.printMessage( getErrorMessage() );
+		// fixed BUG:1295944 mr.printMessage("The password is not of the correct format\n\n e.g. "+inputField.getDefaultValue());
+		this.jTextField.requestFocus();
+		this.jTextField.setForeground(Color.red);
+		jTextField.addKeyListener(new KeyAdapter() {
+			public void keyTyped(KeyEvent e) {
+				if(e.getKeyChar() != '\t'){
+					inputField.setEditted(true);
+				}
+			}
+		});
+	}
+	public int addSelf(JPanel content, GBCF cf,  int row, boolean overflow) {
+		content.add(fieldLabel, cf.getCell(row, 0));
+		content.add(jTextField, cf.getCell(row, 1));
+		if(overflow){
+			((AIPasswordField)jTextField).setOverflow(SizeConstants.OVERFLOW_FIELD_SIZE);
+		}
+		return ++row;
+	}
+	protected String getErrorMessage(){
+		return org.tp23.antinstaller.Installer.langPack.getString("notCorrectPasswordFormat") + 
+				"\n\n e.g. " + 
+				inputField.getDefaultValue();
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ProgressPageRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ProgressPageRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ProgressPageRenderer.java	(revision 21851)
@@ -0,0 +1,251 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.Insets;
+import java.awt.Rectangle;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.PrintStream;
+import java.util.ResourceBundle;
+
+import javax.swing.BorderFactory;
+import javax.swing.JLabel;
+import javax.swing.JButton;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
+import javax.swing.JToggleButton;
+import javax.swing.ImageIcon;
+
+import org.tp23.antinstaller.page.ProgressPage;
+import org.tp23.antinstaller.renderer.AntOutputRenderer;
+import org.tp23.gui.widget.SystemOutJTextArea;
+/**
+ *
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @todo change absolute to Border layout and panels
+ * @author Paul Hinds
+ * @version $Id: ProgressPageRenderer.java,v 1.4 2006/12/21 00:03:00 teknopaul Exp $
+ */
+public class ProgressPageRenderer
+	extends SwingPageRenderer
+	implements AntOutputRenderer {
+
+	private static final int MESSAGE_PANEL_HEIGHT = 30;
+
+	private JPanel contentPanel = new JPanel();
+
+	private JTabbedPane jTabbedPane = new JTabbedPane();
+	private JPanel messagesPanel = new JPanel();
+	private BorderLayout borderLayout1 = new BorderLayout();
+	private JToggleButton jToggleButton = new JToggleButton();
+	private JLabel feedBackLabel = new JLabel();
+	private JLabel progressOn = null;
+	private JLabel progressOff = null;
+	private JPanel messagesLeft = null;
+	private JPanel messagesRight = null;
+
+	private SystemOutJTextArea outPanel = new SystemOutJTextArea();
+	private SystemOutJTextArea errPanel = new SystemOutJTextArea();
+	
+	private boolean showTargets = true;
+	private JScrollPane progressScrollPane = new JScrollPane();;
+	private ProgressPanel progressPanel;
+
+	public ProgressPageRenderer() {
+		errPanel.setAsSystemErr();
+		outPanel.setAsSystemOut();
+	}
+    /**
+	 * getErr
+	 * @return PrintStream
+	 */
+	public PrintStream getErr() {
+		return errPanel.getOut();
+	}
+    /**
+	 * getOut
+	 * @return PrintStream
+	 */
+	public PrintStream getOut() {
+		return outPanel.getOut();
+	}
+
+	/**
+	 * instanceInit
+	 */
+	public void reInstanceInit() {
+		feedBackLabel.setText(org.tp23.antinstaller.Installer.langPack.getString("click")+" "+ctx.getInstaller().getFinishButtonText()+" "+org.tp23.antinstaller.Installer.langPack.getString("toContinue"));
+		jToggleButton.setText(org.tp23.antinstaller.Installer.langPack.getString("showDetails"));
+
+		jTabbedPane.removeAll();
+		jTabbedPane.add(org.tp23.antinstaller.Installer.langPack.getString("output"), outPanel);
+		jTabbedPane.add(org.tp23.antinstaller.Installer.langPack.getString("errors"), errPanel);
+	}
+
+	public void instanceInit() {
+		showTargets = ((ProgressPage)page).isShowTargets();
+		contentPanel.setLayout(borderLayout1);
+		this.add(contentPanel,BorderLayout.CENTER);
+		
+		messagesPanel.setLayout( new BorderLayout() );
+		//Dimension messPanelSize = new Dimension(SizeConstants.PAGE_WIDTH,MESSAGE_PANEL_HEIGHT);
+		//messagesPanel.setSize(messPanelSize);
+		//messagesPanel.setPreferredSize(messPanelSize);
+		//messagesPanel.setMaximumSize(messPanelSize);
+		//messagesPanel.setMinimumSize(messPanelSize);
+
+		ImageIcon progressOnIcon = createImageIcon("/resources/icons/progressOn.gif");
+		progressOn = new JLabel( progressOnIcon );
+		progressOnIcon.setImageObserver(progressOn);
+		progressOff = new JLabel( createImageIcon("/resources/icons/progressOff.gif") );
+
+		//FIXME not i18n properly since the sentence is not correct ordering in German
+		feedBackLabel.setText(org.tp23.antinstaller.Installer.langPack.getString("click")+" "+ctx.getInstaller().getFinishButtonText()+" "+org.tp23.antinstaller.Installer.langPack.getString("toContinue"));
+		//feedBackLabel.setBounds(new Rectangle(115, 7, 272, 22));
+		jToggleButton.setText(org.tp23.antinstaller.Installer.langPack.getString("showDetails"));
+		//jToggleButton.setBounds(new Rectangle(5, 7, 104, 22));
+		//jToggleButton.setMargin(new Insets(0,0,0,0));
+
+		messagesLeft = new JPanel();
+		messagesLeft.add(jToggleButton, null);
+		messagesLeft.add(feedBackLabel, null);
+
+		messagesRight = new JPanel();
+		messagesRight.add( progressOff );
+
+		messagesPanel.add(messagesLeft, BorderLayout.WEST);
+		messagesPanel.add(messagesRight, BorderLayout.EAST);
+		
+		jToggleButton.addActionListener(new ActionListener(){
+			public void actionPerformed(ActionEvent e) {
+				if(jToggleButton.isSelected()){
+					if(showTargets){
+						contentPanel.remove(progressScrollPane);
+					}
+					contentPanel.add(jTabbedPane, BorderLayout.CENTER);
+					contentPanel.doLayout();
+					contentPanel.repaint();
+				}
+				else {
+					contentPanel.remove(jTabbedPane);
+					if(showTargets){
+						contentPanel.add(progressScrollPane, BorderLayout.CENTER);
+						progressScrollPane.revalidate();
+					}
+					contentPanel.doLayout();
+					contentPanel.repaint();
+				}
+			}
+		});
+
+		jToggleButton.setIcon(getImage("/resources/icons/showdetails.png"));
+		contentPanel.add(messagesPanel, BorderLayout.NORTH);
+
+
+		if(showTargets){
+			progressScrollPane.setBorder(BorderFactory.createEmptyBorder(10,5,5,5));
+			contentPanel.add(progressScrollPane, BorderLayout.CENTER);
+		}
+		jTabbedPane.add(org.tp23.antinstaller.Installer.langPack.getString("output"), outPanel);
+		jTabbedPane.add(org.tp23.antinstaller.Installer.langPack.getString("errors"), errPanel);
+//		if(OutputField.isTrue( ctx.getInstaller().getAntialiased())){
+//			outPanel.setAntialiased(true);
+//			errPanel.setAntialiased(true);
+//		}
+
+
+		//jTabbedPane.setVisible(false);
+		jTabbedPane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
+		contentPanel.setMaximumSize(new Dimension(SizeConstants.PAGE_WIDTH, Integer.MAX_VALUE));
+		contentPanel.setMinimumSize(new Dimension(SizeConstants.PAGE_WIDTH, 100));
+		contentPanel.setPreferredSize(new Dimension(SizeConstants.PAGE_WIDTH, SizeConstants.PAGE_HEIGHT-100));
+		//contentPanel.add(jTabbedPane, null);
+		//jTabbedPane.setBounds(new Rectangle(4, MESSAGE_PANEL_HEIGHT, PAGE_WIDTH-12, 214));
+
+
+		this.getNextButton().setVisible(false);
+		this.getFinishButton().setText(ctx.getInstaller().getFinishButtonText());
+		this.getFinishButton().setVisible(true);
+		this.getFinishButton().addActionListener(
+			new ActionListener() {
+				public void actionPerformed( ActionEvent e ) {
+					messagesRight.removeAll();
+					messagesRight.add( progressOn );
+				}
+			}
+		);
+
+	}
+
+	public void setContext(SwingInstallerContext swingCtx){
+		super.setContext(swingCtx);
+		if(showTargets){
+			progressPanel = new ProgressPanel(swingCtx.getInstallerContext());
+			progressScrollPane.getViewport().add(progressPanel);
+			this.swingCtx.setProgressPanel(progressPanel);
+		}
+		this.swingCtx.setFeedBackLabel(feedBackLabel);
+	}
+
+
+	/**
+	 * updateInputFields
+	 */
+	public void updateInputFields() {
+
+	}
+
+
+
+	/**
+	 * validateFields
+	 *
+	 * @return boolean
+	 */
+	public boolean validateFields() {
+		return true;
+	}
+
+
+
+	/**
+	 * updateDefaultValues
+	 */
+	public void updateDefaultValues() {
+	}
+
+    /** Returns an ImageIcon, or null if the path was invalid. */
+    protected static ImageIcon createImageIcon(String path) {
+        java.net.URL imgURL = org.tp23.antinstaller.Installer.class.getResource(path);
+        if (imgURL != null) {
+            return new ImageIcon(imgURL);
+        } else {
+            System.err.println("Couldn't find file: " + path);
+            return null;
+        }
+    }
+
+	public void stopPage() {
+		messagesRight.removeAll();
+		messagesRight.add( progressOff );
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ProgressPanel.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ProgressPanel.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ProgressPanel.java	(revision 21851)
@@ -0,0 +1,279 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.swing.JPanel;
+import javax.swing.Scrollable;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.Target;
+import org.tp23.antinstaller.InstallerContext;
+
+
+/**
+ * Progress panel prints a graphical view of the progress of the Ant targets
+ * being run.  It supports displaying one layer of dependent targets.
+ * @author Paul Hinds
+ * @version $Id: ProgressPanel.java,v 1.5 2006/12/21 00:02:59 teknopaul Exp $
+ */
+public class ProgressPanel extends JPanel implements Scrollable{
+
+	public static final int tHeight = 19;
+	public static final int leftIndent = 15;
+	public static final int DONE = 0;
+	public static final int INPROGRESS = 1;
+	public static final int TODO = 2;
+	private static final Color progressColor = new Color(0, 125, 0);
+	private static final Font mainFont = new Font("Dialog", Font.PLAIN, 11);
+	private static final Font subFont = new Font("Dialog", Font.PLAIN, 10);
+	List targets = null;
+	
+	private final InstallerContext ctx;
+	private int mainTargetPos = 0;
+	private ProgressModel currentPM = null;
+
+	public ProgressPanel(InstallerContext ctx) {
+		super(true);
+		this.ctx = ctx;
+	}
+
+	public synchronized void prepareCalledTargets(){
+		List targetStrings = ctx.getInstaller().getTargets(ctx);
+		Iterator iter = targetStrings.iterator();
+		targets = new ArrayList();
+		while (iter.hasNext()) {
+			String tgt = (String) iter.next();
+			targets.add(new ProgressModel(tgt));
+		}
+		this.setSize(getSize());// panel size changes
+		revalidate();
+		repaint();
+	}
+	/**
+	 * This method assumes that we are send target started methods in order
+	 * but that we do not have the information about "depends" targets and have to
+	 * insert the information as it arrives.  If a TargetStarted event arrives that
+	 * is not the expected target is is assumed to be a depends.
+	 * @param buildEvent
+	 */
+	public synchronized void targetStarted(BuildEvent buildEvent){
+		try {
+			Target tgt = buildEvent.getTarget();
+			ProgressModel pm = (ProgressModel)targets.get(mainTargetPos);
+            pm.state = INPROGRESS;
+			if(tgt.getName().equals(pm.name)){
+				// main target
+				currentPM = pm;
+				mainTargetPos++;
+				revalidate();
+				repaint();
+			}
+			else {
+				//dependency
+				ProgressModel dependency = new ProgressModel(tgt.getName());
+				dependency.state = INPROGRESS;
+				if(currentPM != null){
+					currentPM.state = DONE;// this to catch antcall strangenesses
+				}
+				currentPM = dependency;
+				pm.subTargets.add(dependency);
+				this.setSize(getSize());// panel size changes
+				revalidate();
+				repaint();
+			}
+		}
+		catch (Exception e) {
+			ctx.log(e);
+		}
+	}
+	public synchronized void targetFinished() {
+		// BUG 1494105 reports NPE here, looks like no targets specified in his antinstaller-config.xml
+		currentPM.state = DONE;
+	}
+
+	/**
+	 * N.B. buildFinished must be fired manually in Ant
+	 */
+	public synchronized void buildFinished() {
+        // this is done because antcall sometimes results in targetFinished not being called
+        setToDone(targets);
+		repaint();
+	}
+    
+    private void setToDone(List pModels){
+        if(pModels == null || pModels.size() == 0){
+        	return;
+        }
+        Iterator iter = pModels.iterator();
+        while (iter.hasNext()) {
+            ProgressModel pm = (ProgressModel)iter.next();
+            pm.state = DONE;
+            setToDone(pm.subTargets);
+        }
+    }
+    /**
+     */
+	public synchronized void paintComponent(Graphics g){
+		super.paintComponent(g);
+		if(targets == null){
+			return;
+		}
+//		g.setColor(getBackground());
+//		g.fillRect(g.getClipBounds().x,
+//					g.getClipBounds().y,
+//					g.getClipBounds().width,
+//					g.getClipBounds().height);
+		Iterator iter = targets.iterator();
+		int offset = 0;
+		for(int i = 1; iter.hasNext(); i++){
+			ProgressModel pmodel = (ProgressModel)iter.next();
+			drawTarget(pmodel, (Graphics2D)g, offset, i < targets.size(), i > 1);
+			offset += tHeight;
+			offset += pmodel.subTargets.size() * tHeight;
+		}
+	}
+
+	public synchronized Dimension getPreferredSize(){
+		return getSize();
+	}
+	/**
+	 * @see java.awt.Component#getSize()
+	 */
+	public synchronized Dimension getSize() {
+		if(targets == null){
+			return new Dimension(SizeConstants.PAGE_WIDTH, tHeight * 5);
+		}
+		int count = targets.size();
+		Iterator iter = targets.iterator();
+		while(iter.hasNext()){
+			ProgressModel pmodel = (ProgressModel)iter.next();
+			count += pmodel.subTargets.size();
+		}
+		return new Dimension(SizeConstants.PAGE_WIDTH, count * tHeight);
+	}
+	/**
+	 *
+	 * @param target the main target to be rendered
+	 * @param g
+	 * @param yOffset the vertical offset where this target should be drawn
+	 * @param hasMore if false this target is the last in the list
+	 * @param hasPrev if false this target is the first in the list
+	 */
+	private void drawTarget(ProgressModel target, Graphics2D g,
+			int yOffset, boolean hasMore, boolean hasPrev){
+		g.setFont(mainFont);
+		g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+		g.setColor(Color.gray);
+		//7 vertical line (up)
+		if(hasPrev){
+			g.drawLine(leftIndent + 8, yOffset, leftIndent + 8, yOffset + 8);
+		}
+		//7 vertical line (down)
+		if(hasMore || target.subTargets.size() > 0){
+			g.drawLine(leftIndent + 8, (tHeight/2) + yOffset, 
+					leftIndent + 8, tHeight + yOffset);
+		}
+		// sideways line
+		int xOffset = 0;
+		g.drawLine(leftIndent + 8, 8 + yOffset, leftIndent + xOffset + 20, 8 + yOffset);
+		if(target.state == DONE){
+			g.setColor(Color.darkGray);
+		}
+		if(target.state == INPROGRESS){
+			g.setColor(progressColor);
+		}
+		if(target.state == TODO){
+			g.setColor(Color.gray);
+		}
+		g.fillRoundRect(leftIndent + xOffset + 3, yOffset + 4, 11, 9, 7, 7);
+		g.setColor(Color.black);
+		g.drawString(target.name, leftIndent + xOffset + 22, 13 + yOffset);
+		if(target.subTargets.size() > 0){
+			Iterator iter = target.subTargets.iterator();
+			for(int i = 1; iter.hasNext(); i++){
+				drawSubTarget((ProgressModel)iter.next(), g, 
+						yOffset += tHeight, hasMore | i < target.subTargets.size());
+			}
+		}
+	}
+	private void drawSubTarget(ProgressModel target, Graphics2D g, 
+			int yOffset, boolean hasMore){
+		g.setFont(subFont);
+		g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+		g.setColor(Color.gray);
+		//7 vertical line (up)
+		g.drawLine(leftIndent + 8, yOffset, leftIndent + 8, yOffset + 8);
+		//7 vertical line (down)
+		if(hasMore){
+			g.drawLine(leftIndent + 8, (tHeight/2) + yOffset, leftIndent + 8, tHeight + yOffset);
+		}
+		int xOffset = 15;
+		// sideways line
+		g.drawLine(leftIndent + 8, 8 + yOffset, leftIndent + xOffset + 4, 8 + yOffset);
+		if(target.state == DONE){
+			g.setColor(Color.darkGray);
+		}
+		if(target.state == INPROGRESS){
+			g.setColor(progressColor);
+		}
+		if(target.state == TODO){
+			g.setColor(Color.gray);
+		}
+		g.fillRoundRect(leftIndent + xOffset + 4, yOffset + 5, 9, 7, 7, 7);
+		g.setColor(Color.black);
+		g.drawString(target.name, leftIndent + xOffset + 15, 12 + yOffset);
+	}
+
+    public synchronized Dimension getPreferredScrollableViewportSize(){
+    	return getPreferredSize();
+    }
+    public synchronized int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction){
+    	return tHeight;
+    }
+    public synchronized int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction){
+    	return tHeight * 3;
+    }
+    public synchronized boolean getScrollableTracksViewportWidth(){
+    	return true;
+    }
+    public synchronized boolean getScrollableTracksViewportHeight(){
+    	return false;
+    }
+	public static class ProgressModel{
+		int state = TODO;
+		String name;
+		List subTargets = new ArrayList();
+
+		public ProgressModel(String name){
+			this.name = name;
+		}
+
+		int getHeight(){
+			return tHeight + subTargets.size() * tHeight;
+		}
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SelectInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SelectInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SelectInputRenderer.java	(revision 21851)
@@ -0,0 +1,151 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.BorderLayout;
+import javax.swing.BoxLayout;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.util.Enumeration;
+import java.util.ResourceBundle;
+
+import javax.swing.ButtonGroup;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.input.SelectInput;
+import org.tp23.gui.GBCF;
+
+public class SelectInputRenderer
+	extends SwingOutputFieldRenderer {
+	
+	protected SelectInput inputField;
+
+	protected JLabel fieldLabel = new AILabel();
+	protected ButtonGroup optionGroup = new ButtonGroup();
+
+	public SelectInputRenderer() {
+	}
+	public void initComponent(JPanel parent){
+		try {
+			jbInit();
+		}
+		catch(Exception e) {
+            ctx.log(e.getMessage());
+            if(ctx.getInstaller().isVerbose()) {
+                ctx.log(e);
+            }
+		}
+	}
+
+
+
+	public void setOutputField(OutputField inputField) {
+		this.inputField = (SelectInput)inputField;
+	}
+	public void updateInputField(){
+		Enumeration enumumeration = optionGroup.getElements();
+		int i = 0;
+		for(; enumumeration.hasMoreElements(); i++){
+			JRadioButton o = (JRadioButton)enumumeration.nextElement();
+			if(o.isSelected()) {
+				inputField.setValue(inputField.getOptions()[i].value);
+				break;
+			}
+		}
+		if(i > inputField.getOptions().length) {
+			inputField.setValue(inputField.getDefaultValue());
+		}
+	}
+	public void updateDefaultValue() {
+		if(!inputField.isEditted()) {
+			String newDefault = inputField.getDefaultValue();
+			Enumeration enumeration = optionGroup.getElements();
+			for(int i = 0; enumeration.hasMoreElements(); i++){
+				if(newDefault.equals(inputField.getOptions()[i].value)) {
+					JRadioButton jrb = (JRadioButton) enumeration.nextElement();
+					jrb.setSelected(true);
+					// @todo should break?
+				} else {
+					enumeration.nextElement();
+				}
+			}
+		}
+	}
+
+    private void jbInit() throws Exception {
+		fieldLabel.setText( "<html>" + inputField.getDisplayText() + "</html>" );
+		SelectInput.Option[] options = inputField.getOptions();
+
+		for (int i = 0; i < options.length; i++) {
+			JRadioButton jrb = new AIRadioButton( "<html><font size=+0>" + options[i].getText() + "</font></html>" );
+			optionGroup.add(jrb);
+			if(options[i].value.equals(inputField.getDefaultValue())){
+				jrb.setSelected(true);
+			}
+			jrb.addItemListener(new ItemListener(){
+				public void itemStateChanged(ItemEvent e) {
+					inputField.setEditted(true);
+				}
+			});
+		}
+    }
+	public int addSelf(JPanel content,GBCF cf,  int row,boolean overflow) {
+
+		JPanel superContainer = new JPanel(new BorderLayout());
+
+		JPanel container = new JPanel();
+		container.setLayout(new BoxLayout(container, BoxLayout.Y_AXIS));
+
+		if ( !fieldLabel.getText().equals("") ) {
+			container.add(fieldLabel);
+		}
+
+		Enumeration enumeration = optionGroup.getElements();
+		// there should be at least two
+		enumeration.hasMoreElements();
+		AIRadioButton jrb = (AIRadioButton)enumeration.nextElement();
+		container.add(jrb);
+		if( overflow ) {
+			jrb.setOverflow(SizeConstants.OVERFLOW_FIELD_SIZE);
+		}
+		JPanel empty = new JPanel();
+		while(enumeration.hasMoreElements()){
+			jrb = (AIRadioButton)enumeration.nextElement();
+			//content.add(empty,cf.getCell(row, 0));
+			container.add(jrb);
+			if(overflow) {
+				jrb.setOverflow(SizeConstants.OVERFLOW_FIELD_SIZE);
+			}
+		}
+		container.add(empty);
+		superContainer.add(BorderLayout.WEST,container);
+		content.add(superContainer);
+
+		return row;
+	}
+
+	/**
+	 * renderError
+	 */
+	public void renderError() {
+		ctx.getMessageRenderer().printMessage(org.tp23.antinstaller.Installer.langPack.getString("notValidSelection"));
+		// fixed BUG:1295944  ctx.getMessageRenderer().printMessage("Not a valid selection");
+		//optionGroup.requestFocus();
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SimpleInputPageRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SimpleInputPageRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SimpleInputPageRenderer.java	(revision 21851)
@@ -0,0 +1,187 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.GridBagLayout;
+import java.awt.GridLayout;
+import javax.swing.BoxLayout;
+import java.awt.FlowLayout;
+import java.awt.Insets;
+import java.util.ArrayList;
+
+import javax.swing.BorderFactory;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import javax.swing.ToolTipManager;
+
+import org.tp23.antinstaller.ValidationException;
+import org.tp23.antinstaller.input.CommentOutput;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.page.SimpleInputPage;
+import org.tp23.antinstaller.renderer.RendererFactory;
+import org.tp23.gui.GBCF;
+
+/**
+ *
+ * <p>This PageRenderer just renders a list of SwingInputRenderers using
+* a BoxLayout </p>
+ * <p> </p>
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @author Paul Hinds
+ * @version $Id: SimpleInputPageRenderer.java,v 1.6 2006/12/27 21:46:35 teknopaul Exp $
+ */
+public class SimpleInputPageRenderer
+	extends SwingPageRenderer {
+
+     //Prevent displayText and explanatoryText being rendered using different fonts
+    private static final Font defaultFont = new JLabel().getFont();
+
+	private JPanel contentPanel = new JPanel();
+
+	
+	//private GridBagLayout gridLayout = new GridBagLayout();
+	private BoxLayout layout = new BoxLayout(contentPanel,BoxLayout.Y_AXIS);
+	//private BorderLayout layout = new BorderLayout();
+	private GBCF cf = new GBCF(); // GridBagConstraintsFactory
+	private boolean overflow = false;
+	// used in overflow
+	JScrollPane scroller = null;
+	
+
+	private ArrayList renderers = new ArrayList();
+
+	public SimpleInputPageRenderer(){
+	}
+		
+	public boolean validateFields() throws ValidationException {
+		OutputField[] fields = page.getOutputField();
+		for (int i = 0; i < fields.length; i++) {
+			if(!fields[i].validate(ctx)){
+				SwingOutputFieldRenderer renderer = (SwingOutputFieldRenderer)renderers.get(i);
+				renderer.renderError();
+				return false;
+			}
+		}
+		return true;
+	}
+	public void updateInputFields(){
+		for (int i = 0; i < renderers.size(); i++) {
+			((SwingOutputFieldRenderer)renderers.get(i)).updateInputField();
+		}
+	}
+
+	public void updateDefaultValues(){
+		for (int i = 0; i < renderers.size(); i++) {
+			((SwingOutputFieldRenderer)renderers.get(i)).updateDefaultValue();
+		}
+	}
+
+	public void reInstanceInit() {}
+
+	public void instanceInit() throws Exception {
+		ToolTipManager.sharedInstance().setInitialDelay(0);
+		ToolTipManager.sharedInstance().setDismissDelay(Integer.MAX_VALUE);
+		overflow = ((SimpleInputPage)page).isOverflow();
+		if(overflow){
+			//WARNING this causes flickering in the UI 
+			//contentPanel.setMaximumSize(new Dimension(SizeConstants.PAGE_WIDTH - 50, SizeConstants.PAGE_HEIGHT));
+			scroller = new JScrollPane();
+			scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+			scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
+			scroller.setBorder(BorderFactory.createCompoundBorder(
+							BorderFactory.createEmptyBorder(4,4,4,4),
+							BorderFactory.createEtchedBorder()				
+							));
+			scroller.getViewport().add(contentPanel);
+
+			masterPanel.add( scroller, BorderLayout.CENTER );
+			//contentPanel.setBackground(Color.red);
+		}
+		else {
+			masterPanel.add(contentPanel, BorderLayout.CENTER);
+			contentPanel.setBorder(BorderFactory.createEmptyBorder(SizeConstants.TOP_INDENT, 4, 4, 4));
+		}
+
+		OutputField[] fields = page.getOutputField();
+		contentPanel.setDoubleBuffered(true);
+		contentPanel.setLayout(layout);
+		int row = 0;
+		for (int i = 0; i < fields.length; i++) {
+			SwingOutputFieldRenderer renderer = RendererFactory.getSwingRenderer(fields[i]);
+/*			String text = fields[i].getExplanatoryText();
+			if(fields[i].getExplanatoryText() != null){
+				JTextArea area = new DisplayTextArea(contentPanel.getBackground(), contentPanel.getForeground());
+				//JTextArea area = new JTextArea();
+				//area.setBackground( new Color(0xaaaaff) );
+				area.setIgnoreRepaint(true);
+            area.setFont( defaultFont );
+            area.setText(text);
+				//area.setLineWrap(true);
+				contentPanel.add(area, cf.getSpan(row++));
+            if(fields[i] instanceof CommentOutput){
+               CommentOutputRenderer crenderer = (CommentOutputRenderer)renderer;
+               crenderer.setExplanatoryTextField(area);
+               if(fields[i].getDisplayText() == null){
+                  continue;
+               }
+				}
+			}
+*/
+			renderer.setOutputField(fields[i]);
+			renderer.setInstallerContext(ctx);
+			renderer.initComponent(contentPanel);
+			row = renderer.addSelf(contentPanel, cf, row, overflow);
+			renderers.add(renderer);
+		}
+		contentPanel.add(new JPanel(), cf.getVertGlue(row++));
+	}
+}
+/**
+ * A JTextArea that is not editable and looks like a JLabel but uses 
+ * JTextAreas ability to wrap.  Also has a fixed prefered width; 
+ * @author Paul Hinds
+ * @version $Id: SimpleInputPageRenderer.java,v 1.6 2006/12/27 21:46:35 teknopaul Exp $
+ */
+class DisplayTextArea extends JTextArea{
+	DisplayTextArea(Color back, Color fore){
+		super();
+		this.setBackground(back);
+		this.setForeground(fore);
+		this.setLineWrap(true);
+		this.setWrapStyleWord(true);
+		this.setEditable(false);
+		this.setSelectionColor(back);
+		this.setSelectionColor(back);
+		this.setMargin(new Insets(5,0,0,0));
+	}
+
+/*	public Dimension getPreferredSize(){
+		Dimension pref = super.getPreferredSize();
+		return new Dimension(SizeConstants.PAGE_WIDTH - 40, pref.height);
+	}
+	public Dimension getMinimumSize(){
+		Dimension pref = super.getMinimumSize();
+		return new Dimension(SizeConstants.PAGE_WIDTH - 40, pref.height);
+	}*/
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SizeConstants.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SizeConstants.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SizeConstants.java	(revision 21851)
@@ -0,0 +1,49 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.Dimension;
+/**
+ * Extracted contants with aim of making these variables configurable
+ * @author teknopaul
+ */
+public class SizeConstants {
+
+	// Page size constants
+	public static int PAGE_WIDTH = 640; // orig value 472
+	public static int PAGE_HEIGHT = 480;// orig value 400
+	public static int LABEL_WIDTH = 200;// orig value 175
+	
+	public static int TITLE_IMAGE_HEIGHT = 100;
+	public static int TITLE_PANEL_HEIGHT = 75; // suspect this is irrelevant
+
+	// Field size constants
+	public static int LEFT_INDENT = 15;
+	public static int TOP_INDENT = 8;
+	public static int BUTTON_WIDTH = 90; // file and directory chooser
+	public static int FIELD_HEIGHT = 20;// field Y
+	public static int FIELD_WIDTH = SizeConstants.PAGE_WIDTH - SizeConstants.LABEL_WIDTH - SizeConstants.LEFT_INDENT;
+	public static int SHORT_FIELD_WIDTH = FIELD_WIDTH - SizeConstants.BUTTON_WIDTH;
+
+	// overflow resizing
+	// in the gridbaglayout it seems that only preferred size
+	// is significant
+	private static int OVERFLOW_REDUCTION = 40;
+	public static Dimension OVERFLOW_FIELD_SIZE = new Dimension(FIELD_WIDTH - OVERFLOW_REDUCTION, FIELD_HEIGHT);
+	public static Dimension OVERFLOW_SHORT_FIELD_SIZE = new Dimension(FIELD_WIDTH - SizeConstants.BUTTON_WIDTH - OVERFLOW_REDUCTION, FIELD_HEIGHT);
+	public static Dimension OVERFLOW_TOTAL_SIZE = new Dimension(FIELD_WIDTH + SizeConstants.LABEL_WIDTH - OVERFLOW_REDUCTION, FIELD_HEIGHT);
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SplashPageRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SplashPageRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SplashPageRenderer.java	(revision 21851)
@@ -0,0 +1,73 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.BorderLayout;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+
+import javax.swing.ImageIcon;
+import javax.swing.JLabel;
+
+import org.tp23.antinstaller.ValidationException;
+import org.tp23.antinstaller.page.SplashPage;
+import org.tp23.antinstaller.runtime.ConfigurationException;
+/**
+ * A page containing only a single image. 
+ * 
+ * @author teknopaul
+ */
+public class SplashPageRenderer extends SwingPageRenderer{
+
+	private JLabel imagePanel = new JLabel();
+
+	public SplashPageRenderer() {
+	}
+	public boolean validateFields()throws ValidationException{
+		return true;
+	}
+
+	public void reInstanceInit() {}
+	
+	public void instanceInit() throws Exception {
+		String resource = ((SplashPage)page).getSplashResource();
+		ByteArrayOutputStream baos = new ByteArrayOutputStream();
+		InputStream in = this.getClass().getResourceAsStream(resource);
+		if(in == null) {
+            throw new ConfigurationException("Splash page resource is missing: " + resource);
+        }
+		byte[] buffer = new byte[2048];
+		int read = -1;
+		while ( (read = in.read(buffer)) != -1) {
+			baos.write(buffer, 0, read);
+		}
+		ImageIcon icon = new ImageIcon(baos.toByteArray());
+		imagePanel.setHorizontalAlignment(JLabel.CENTER);
+		imagePanel.setIcon(icon);
+		this.add(imagePanel, BorderLayout.CENTER);
+	}
+
+	public void updateInputFields(){
+		;
+	}
+
+	/**
+	 * updateDefaultValues
+	 */
+	public void updateDefaultValues() {
+	}
+	
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingInstallerContext.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingInstallerContext.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingInstallerContext.java	(revision 21851)
@@ -0,0 +1,149 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.SwingUtilities;
+
+import org.apache.tools.ant.BuildEvent;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.runtime.SwingRunner;
+
+public class SwingInstallerContext{
+
+	private static JFrame masterFrame;
+    private JLabel feedBackPanel;
+    private ProgressPanel progressPanel;
+    private InstallerContext ctx;
+
+	public SwingInstallerContext(InstallerContext ctx,
+								 JFrame masterFrame) {
+		this.ctx = ctx;
+		SwingInstallerContext.masterFrame = masterFrame;
+	}
+
+	public JFrame getMasterFrame() {
+		return masterFrame;
+	}
+    public SwingRunner getSwingRunner() {
+		return (SwingRunner)ctx.getRunner();
+    }
+
+	public void setFeedBackLabel(JLabel feedBackPanel) {
+		this.feedBackPanel = feedBackPanel;
+	}
+	/**
+	 * The progress panel is optional so not calling this method
+	 * should not cause errors or NPEs
+	 * @param progressPanel
+	 */
+	public void setProgressPanel(ProgressPanel progressPanel) {
+		this.progressPanel = progressPanel;
+	}
+	
+	public void buildStarted(BuildEvent buildEvent) {
+		provideAntFeedBack(buildEvent.getMessage());
+		try {
+			SwingUtilities.invokeAndWait(new Runnable(){
+				public void run(){
+					if(SwingInstallerContext.this.progressPanel != null){
+						SwingInstallerContext.this.progressPanel.prepareCalledTargets();
+					}
+				}
+			});
+		} catch (Exception e) { //Interrupted or InvocationTarget
+			SwingInstallerContext.this.ctx.log(e);
+		}
+	}
+    
+	public void buildFinished(BuildEvent buildEvent) {
+		if(this.progressPanel != null){
+			try {
+				SwingUtilities.invokeLater(new Runnable(){
+					public void run(){
+						SwingInstallerContext.this.progressPanel.buildFinished();
+					}
+				});
+			} catch (Exception e) { //Interrupted or InvocationTarget
+				SwingInstallerContext.this.ctx.log(e);
+			}			
+		}
+	}
+    
+	public void targetStarted(BuildEvent buildEvent) {
+		TargetStarted targetStarted = new TargetStarted();
+		targetStarted.buildEvent = buildEvent;
+		try {
+			if(this.progressPanel != null){
+				//Invoke and wait used since strict ordering od started and finished is requried
+				SwingUtilities.invokeAndWait(targetStarted);
+			}
+		} catch (Exception e) { //Interrupted or InvocationTarget
+			SwingInstallerContext.this.ctx.log(e);
+		}			
+	}
+    
+	public void targetFinished(BuildEvent buildEvent) {
+		try {
+			//Invoke and wait used since strict ordering od started and finished is requried
+			SwingUtilities.invokeAndWait(new Runnable(){
+				public void run(){
+					if(SwingInstallerContext.this.progressPanel != null){
+						SwingInstallerContext.this.progressPanel.targetFinished();
+					}
+				}
+			});
+		} catch (Exception e) { //Interrupted or InvocationTarget
+			SwingInstallerContext.this.ctx.log(e);
+		}
+	}
+	
+	public void provideAntFeedBack(String message){
+		// We should never have Ant running without a ProgressPane
+		// but do an if null here in case future FilterChains are different
+		ProvideAntFeedBack provideAntFeedBack = new ProvideAntFeedBack();
+		provideAntFeedBack.message = message;
+		try {
+			if(feedBackPanel != null){
+				SwingUtilities.invokeLater(provideAntFeedBack);
+			}
+		} catch (Exception e) { //Interrupted or InvocationTarget
+			SwingInstallerContext.this.ctx.log(e);
+		}
+	}
+	
+	
+	/**
+	 * @return Returns the ctx.
+	 */
+	public InstallerContext getInstallerContext() {
+		return ctx;
+	}
+	
+	private class TargetStarted implements Runnable{
+		private BuildEvent buildEvent;
+		public void run(){
+			SwingInstallerContext.this.progressPanel.targetStarted(buildEvent);
+		}
+	}
+	private class ProvideAntFeedBack implements Runnable{
+		private String message;
+		public void run(){
+			SwingInstallerContext.this.feedBackPanel.setText(message);
+		}
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingMessageRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingMessageRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingMessageRenderer.java	(revision 21851)
@@ -0,0 +1,113 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import javax.swing.JFrame;
+import javax.swing.JOptionPane;
+import javax.swing.SwingUtilities;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.renderer.MessageRenderer;
+/**
+ *
+ * <p>Render User messages in Popup windows </p>
+ * <p> </p>
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @author Paul Hinds
+ * @version $Id: SwingMessageRenderer.java,v 1.4 2006/12/21 00:02:59 teknopaul Exp $
+ */
+public class SwingMessageRenderer
+	implements MessageRenderer {
+
+	private InstallerContext ctx = null;
+	private JFrame owner = null;
+
+
+	public SwingMessageRenderer() {
+	}
+	public SwingMessageRenderer(InstallerContext ctx) {
+		this.ctx = ctx;
+	}
+
+	public void setInstallerContext(InstallerContext ctx){
+		this.ctx = ctx;
+	}
+	public void printMessage(String message){
+		MessageRunnable messageRunnable = new MessageRunnable();
+		messageRunnable.message = message;
+		if(SwingUtilities.isEventDispatchThread()){
+			messageRunnable.run();
+		}
+		else{
+			try {
+				SwingUtilities.invokeAndWait(messageRunnable);
+			} catch (Exception e) { // Interrupted or InvocationTarget
+				ctx.log(e);
+			}
+		}
+	}
+
+	public boolean prompt(String message){
+		OptionRunnable optionRunnable = new OptionRunnable();
+		optionRunnable.message = message;
+		if(SwingUtilities.isEventDispatchThread()){
+			optionRunnable.run();
+		}
+		else{
+			try {
+				SwingUtilities.invokeAndWait(optionRunnable);
+			} catch (Exception e) { // Interrupted or InvocationTarget
+				ctx.log(e);
+			}
+		}
+		return optionRunnable.ok;
+	}
+	/**
+	 * @param owner The owner to set.
+	 */
+	public void setOwner(JFrame owner) {
+		this.owner = owner;
+	}
+	
+	private class MessageRunnable implements Runnable{
+		String message;
+
+		public void run() {
+			JOptionPane.showMessageDialog(SwingMessageRenderer.this.owner, 
+					message, "Message", JOptionPane.INFORMATION_MESSAGE );
+		}
+		
+	}
+	
+	private class OptionRunnable implements Runnable{
+		String message;
+		boolean ok;
+		public void run() {
+			int ret = JOptionPane.showConfirmDialog(SwingMessageRenderer.this.owner,
+					message,
+					"Question",
+					JOptionPane.YES_NO_OPTION);
+			if (ret == JOptionPane.YES_OPTION) {
+				ok = true;
+			}
+			else {
+				ok = false;
+			}
+		}
+		
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingOutputFieldRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingOutputFieldRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingOutputFieldRenderer.java	(revision 21851)
@@ -0,0 +1,86 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import javax.swing.JPanel;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.gui.GBCF;
+/**
+ *
+ * <p>Instances of this interface should have a no args constructor.
+* They sould
+* be Swing JComponent (e.g. subclass JPanel) and render normally responding
+* to update paint and requests to change Look & Feel in a normal way. </p>
+ * <p>Instances of this class should follow the naming convention. for each OutputField
+* Xxx in the package org.tp23.antinstaller.input  there should exist a SwingOutputFieldRenderer
+* called org.tp23.antinstaller.renderer.swing.XxxRenderer</p>
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @author Paul Hinds
+ * @version $Id: SwingOutputFieldRenderer.java,v 1.5 2007/01/04 22:57:17 teknopaul Exp $
+ */
+public abstract class SwingOutputFieldRenderer{
+
+    //TODO From FindBugs - sometimes this field is not used in subclasses to avoid casting
+    // replace with for example, getInputField() that casts in InputRenderers
+    // requires work in ConditionalFieldRenderer
+	protected OutputField outputField;
+	protected InstallerContext ctx;
+	
+	/**
+	 * this should hold a local reference and set the input fields default value
+	 * if one exists
+	 * @param inputField InputField
+	 */
+	public void setOutputField(OutputField outputField){
+		this.outputField = outputField;
+	}
+	/**
+	 * Init the swing components
+	 */
+	public abstract void initComponent(JPanel parent);
+	/**
+	 * Called by the Page prior to firing pagecompletion events
+	 */
+	public abstract void updateInputField();
+	/**
+	 * Called to update the defaults from the ResultContainer
+	 */
+	public abstract void updateDefaultValue();
+
+	/**
+	 * Called when validation fails
+	 */
+	public abstract void renderError();
+	/**
+	 * Called when the renderer should add itself to the content pane;
+	 * @param content the panel to which the Renderer should add itself
+	 * @param GridBagConstraintsFactory
+	 * @param row the current row index in the table
+	 * @param components should adjust preferred size when the overflow flag is set
+	 * to compensate for width loss due to the scroll bar
+	 * @return the row index after adding all its components
+	 */
+	public abstract int addSelf(JPanel content, GBCF cf, int row, boolean overflow);
+
+	public void setInstallerContext(InstallerContext ctx){
+		this.ctx = ctx;
+	}
+
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingPageRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingPageRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingPageRenderer.java	(revision 21851)
@@ -0,0 +1,281 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.BorderLayout;
+import java.awt.FlowLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.util.ResourceBundle;
+
+import javax.swing.BorderFactory;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.border.Border;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.ValidationException;
+import org.tp23.antinstaller.page.Page;
+
+/**
+ *
+ * <p>Abstract super class for page renderers.  setPage will always be called. </p>
+ * <p>Subclasses should implement instanceInit for initialising swing components
+ * on the page. </p>
+ * @author Paul Hinds
+ * @version $Id: SwingPageRenderer.java,v 1.10 2007/01/19 00:24:35 teknopaul Exp $
+ */
+public abstract class SwingPageRenderer
+	extends JPanel {
+	
+	// gui components
+	private BorderLayout borderLayout1 = new BorderLayout();
+	
+    // holds the next back buttons etc
+	private JPanel controlPanel = new JPanel(new FlowLayout(FlowLayout.CENTER,12,3));
+
+	private JButton backButton = new JButton();
+	private JButton cancelButton = new JButton();
+	private JButton nextButton = new JButton();
+	private JButton finishButton = new JButton();
+
+	public JPanel masterPanel = new JPanel( new BorderLayout() );
+
+	private JPanel titlePanel = new JPanel();
+	private JLabel titleLabel = new JLabel();
+	private JLabel imagePanel = new JLabel(); // Graphic for the installer
+	private GridLayout titleLayout = new GridLayout();
+
+	// app components
+	protected Page page;
+	protected SwingInstallerContext swingCtx;
+	protected InstallerContext ctx;
+	protected PageCompletionListener listener;
+	private Border bevelBorder;
+		
+
+	private static Font titleFont;
+	static{
+		titleFont = new JLabel().getFont();
+		try {
+			titleFont = new Font(titleFont.getFamily(), Font.BOLD, 14);
+		}
+		catch (Exception ex) {
+			// lets not fail due to font errors
+		}
+	}
+
+	public SwingPageRenderer(){
+		super();
+	}
+	public void setPage(Page page){
+		this.page = page;
+		try {
+			jbInit();
+		}
+		catch (Exception e) {
+            ctx.log(e.getMessage());
+            if(ctx.getInstaller().isVerbose()) {
+                ctx.log(e);
+            }
+		}
+	}
+
+	public void setContext(SwingInstallerContext swingCtx){
+		this.ctx = swingCtx.getInstallerContext();
+		this.swingCtx = swingCtx;
+	}
+		
+	public void reInit() {
+		backButton.setText(org.tp23.antinstaller.Installer.langPack.getString("backButton"));// "<< Back");
+		cancelButton.setText(org.tp23.antinstaller.Installer.langPack.getString("cancelButton"));// "Cancel");
+		nextButton.setText(org.tp23.antinstaller.Installer.langPack.getString("nextButton"));// "Next >>");
+		finishButton.setText(ctx.getInstaller().getFinishButtonText());
+		titleLabel.setText(page.getDisplayText());
+	}
+
+	private void jbInit() throws Exception {
+		
+		this.setDoubleBuffered(true);
+        //emptyBorder = BorderFactory.createEmptyBorder(2,5,2,2);
+		//bevelBorder = BorderFactory.createCompoundBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED,Color.white,Color.white,new Color(116, 116, 112),new Color(166, 166, 161)),BorderFactory.createEmptyBorder(2,SwingInputFieldRenderer.LEFT_INDENT,2,2));
+		bevelBorder = BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.black,1),BorderFactory.createEmptyBorder(2,SizeConstants.LEFT_INDENT,2,2));
+		bevelBorder = BorderFactory.createCompoundBorder(BorderFactory.createEtchedBorder(),BorderFactory.createEmptyBorder(2,SizeConstants.LEFT_INDENT,2,2));
+		Border tripleBorder = BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(3,4,1,4),bevelBorder);
+		this.setLayout(borderLayout1);
+		titleLabel.setBorder(tripleBorder);
+		controlPanel.setBorder(tripleBorder);
+
+		masterPanel.add(titlePanel, BorderLayout.NORTH);
+		this.add(masterPanel, BorderLayout.NORTH);
+		this.add(controlPanel, BorderLayout.SOUTH);
+
+		// title panel
+		titlePanel.add(imagePanel, null);
+		titlePanel.add(titleLabel, null);
+
+		titlePanel.setLayout(titleLayout);
+		titleLayout.setColumns(1);
+		titleLayout.setHgap(0);
+		titleLayout.setRows(2);
+		titleLayout.setVgap(2);
+		titlePanel.setMinimumSize(new Dimension(SizeConstants.PAGE_WIDTH, SizeConstants.TITLE_PANEL_HEIGHT));
+		titlePanel.setMaximumSize(new Dimension(SizeConstants.PAGE_WIDTH, SizeConstants.TITLE_PANEL_HEIGHT));
+		titlePanel.setPreferredSize(new Dimension(SizeConstants.PAGE_WIDTH, SizeConstants.TITLE_PANEL_HEIGHT));
+
+		titleLabel.setText(page.getDisplayText());
+		titleLabel.setFont(titleFont);
+		setImage(page.getImageResource());
+		imagePanel.setMinimumSize(new Dimension(SizeConstants.PAGE_WIDTH, SizeConstants.TITLE_IMAGE_HEIGHT));
+		imagePanel.setMaximumSize(new Dimension(SizeConstants.PAGE_WIDTH, SizeConstants.TITLE_IMAGE_HEIGHT));
+		imagePanel.setPreferredSize(new Dimension(SizeConstants.PAGE_WIDTH, SizeConstants.TITLE_IMAGE_HEIGHT));
+
+		// Ctrl Panel
+		controlPanel.add(cancelButton, null);
+		controlPanel.add(backButton, null);
+		controlPanel.add(nextButton, null);
+		controlPanel.add(finishButton, null);
+		backButton.setText(org.tp23.antinstaller.Installer.langPack.getString("backButton"));// "<< Back");
+		cancelButton.setText(org.tp23.antinstaller.Installer.langPack.getString("cancelButton"));// "Cancel");
+		nextButton.setText(org.tp23.antinstaller.Installer.langPack.getString("nextButton"));// "Next >>");
+		nextButton.setVisible( page.isShowNextButton() );
+		finishButton.setText(ctx.getInstaller().getFinishButtonText());
+		finishButton.setVisible(false);
+		setEventListeners();
+		setIcons();
+	}
+	public abstract void instanceInit() throws Exception ;
+	public abstract void reInstanceInit();
+	public abstract void updateInputFields();
+	public abstract void updateDefaultValues();
+	public abstract boolean validateFields()throws ValidationException;
+
+	public void setPageCompletionListener(PageCompletionListener listener){
+		this.listener = listener;
+	}
+
+	public void stopPage() {}
+
+	private void setImage(String resource) throws Exception{
+		if(resource == null){
+		   resource = ctx.getInstaller().getDefaultImageResource();
+		}
+		ImageIcon icon = getImage(resource);
+		imagePanel.setIcon(icon);
+	}
+	
+	protected ImageIcon getImage(String resource){
+		try {
+			if (resource != null) {
+				ByteArrayOutputStream baos = new ByteArrayOutputStream();
+				InputStream in = this.getClass().getResourceAsStream(resource);
+				byte[] buffer = new byte[2048];
+				int read = -1;
+				while ( (read = in.read(buffer)) != -1) {
+					baos.write(buffer, 0, read);
+				}
+				ImageIcon icon = new ImageIcon(baos.toByteArray());
+				return icon;
+			}
+		}
+		catch (Exception ex) {
+			ctx.log("Can't load image resource:" + resource);
+			if(ctx.getInstaller().isVerbose()){
+				ctx.log(ex);
+			}
+		}
+		return null;
+	}
+	
+	
+	private void setEventListeners(){
+		backButton.addActionListener(new ActionListener(){
+			public void actionPerformed(ActionEvent e){
+				listener.pageBack(page);
+			}
+		});
+		cancelButton.addActionListener(new ActionListener(){
+			public void actionPerformed(ActionEvent e){
+				page.setAbort(true);
+                if (ctx.getInstaller().isVerbose()) {
+                    ctx.log("Abort called");
+                }
+				listener.pageComplete(page);
+			}
+		});
+		nextButton.addActionListener(new ActionListener(){
+			public void actionPerformed(ActionEvent e){
+				listener.pageComplete(page);
+
+			}
+		});
+		finishButton.addActionListener(new ActionListener(){
+			public void actionPerformed(ActionEvent e){
+				if(finishButton.getText().equals(org.tp23.antinstaller.Installer.langPack.getString("exit"))) {
+                    //TODO FindBugs this will prevent cleanup in FinalizerFilter
+					System.exit(0);
+				}
+				listener.pageComplete(page);
+				//((SwingInstallerContext)ctx).getSwingRunner().finish();
+			}
+		});
+	}
+	
+	private void setIcons(){
+		backButton.setIcon(getImage("/resources/icons/back.png"));
+		cancelButton.setIcon(getImage("/resources/icons/cancel.png"));
+		nextButton.setIcon(getImage("/resources/icons/next.png"));
+		finishButton.setIcon(getImage("/resources/icons/finish.png"));
+	}
+
+	public JButton getCancelButton() {
+		return cancelButton;
+	}
+
+	public InstallerContext getCtx() {
+		return ctx;
+	}
+
+	public JPanel getControlPanel() {
+		return controlPanel;
+	}
+
+	public JLabel getImagePanel() {
+		return imagePanel;
+	}
+
+	public JButton getNextButton() {
+		return nextButton;
+	}
+
+	public JLabel getTitleLabel() {
+		return titleLabel;
+	}
+    public JButton getFinishButton() {
+		return finishButton;
+    }
+    public JButton getBackButton() {
+		return backButton;
+    }
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/TargetInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/TargetInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/TargetInputRenderer.java	(revision 21851)
@@ -0,0 +1,156 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import java.awt.BorderLayout;
+import java.awt.FlowLayout;
+import java.awt.Dimension;
+
+import javax.swing.JPanel;
+import javax.swing.JLabel;
+import javax.swing.JCheckBox;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JOptionPane;
+
+import org.tp23.antinstaller.input.InputField;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.input.TargetInput;
+import org.tp23.gui.GBCF;
+
+public class TargetInputRenderer
+	extends SwingOutputFieldRenderer {
+
+	protected TargetInput outputField;
+
+	protected AILabel fieldLabel = new AILabel();
+	protected AIShortLabel sizeLabel = new AIShortLabel();
+	protected JCheckBox targetCheckBox = new JCheckBox();
+
+	JPanel parent = null;
+	public TargetInputRenderer() {
+	}
+	public void initComponent(JPanel parent){
+		this.parent = parent;
+
+		try {
+			jbInit();
+		}
+		catch(Exception e) {
+            ctx.log(e.getMessage());
+            if(ctx.getInstaller().isVerbose()) {
+                ctx.log(e);
+            }
+
+		}
+	}
+
+
+
+	public void setOutputField(OutputField outputField) {
+		this.outputField = (TargetInput)outputField;
+	}
+	public void updateInputField(){
+		String target = outputField.getTarget();
+		int targetIdx = outputField.getIdx();
+		boolean selected = targetCheckBox.isSelected();
+		outputField.setInputResult(String.valueOf(selected));
+		if(selected && !ctx.getCurrentPage().getAllTargets().contains(target)){
+			ctx.getCurrentPage().addTarget(targetIdx, target);
+		}
+		else if(!selected && ctx.getCurrentPage().isTarget(target)){
+			ctx.getCurrentPage().removeTarget(targetIdx);
+		}
+	}
+	public void updateDefaultValue(){
+		if(!outputField.isEditted()){
+			targetCheckBox.setSelected(InputField.isTrue(outputField.getDefaultValue()));
+		}
+	}
+
+    private void jbInit() throws Exception {
+		fieldLabel.setText(outputField.getDisplayText());
+		sizeLabel.setText(outputField.getDiskRequirement());
+		sizeLabel.setMinimumSize( new Dimension( 80, 0 ) );
+		targetCheckBox.setSelected(InputField.isTrue(outputField.getDefaultValue()));
+		if(InputField.isTrue(outputField.getForce())){
+			targetCheckBox.setEnabled(false);
+		}
+
+		targetCheckBox.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent e) {
+				updateInputField();
+				outputField.setEditted(true);
+			}
+		});
+    }
+	public int addSelf(JPanel content,GBCF cf,  int row,boolean overflow) {
+		if ( outputField.getHidden() ) {
+			return row;
+		}
+
+		ImageIcon helpIcon = createImageIcon("/resources/help.png");
+		JButton hlp = new JButton(helpIcon);
+
+		hlp.addActionListener(
+			new ActionListener() {
+				public void actionPerformed(ActionEvent e) {
+					JOptionPane.showMessageDialog(parent, outputField.getExplanatoryText(), outputField.getDisplayText(), JOptionPane.QUESTION_MESSAGE);
+				}
+			}
+		);
+
+		//hlp.setToolTipText();
+
+		JPanel spacer = new JPanel();
+		spacer.setPreferredSize(new Dimension(50, 1));
+
+		JPanel p;
+
+		p = new JPanel(new FlowLayout(FlowLayout.LEFT));
+		p.add( fieldLabel );
+		p.add( sizeLabel );
+		p.add( targetCheckBox );
+		p.add( spacer );
+		p.add( hlp );
+		content.add(p);
+
+		return ++row;
+	}
+
+
+
+	/**
+	 * renderError
+	 */
+	public void renderError() {
+	}
+
+    /** Returns an ImageIcon, or null if the path was invalid. */
+    protected static ImageIcon createImageIcon(String path) {
+        java.net.URL imgURL = org.tp23.antinstaller.Installer.class.getResource(path);
+        if (imgURL != null) {
+            return new ImageIcon(imgURL);
+        } else {
+            //System.err.println("Couldn't find file: " + path);
+            return null;
+        }
+    }
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/TargetSelectInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/TargetSelectInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/TargetSelectInputRenderer.java	(revision 21851)
@@ -0,0 +1,53 @@
+/* 
+ * Copyright 2005 Paul Hinds, Mark Anderson
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.util.Enumeration;
+
+import javax.swing.JRadioButton;
+
+import org.tp23.antinstaller.input.TargetSelectInput;
+/**
+ * 
+ * @author Paul Hinds, Mark Anderson
+ * @version $Id: TargetSelectInputRenderer.java,v 1.3 2006/08/04 17:13:24 anothermwilson Exp $
+ */
+public class TargetSelectInputRenderer
+	extends SelectInputRenderer {
+
+	public TargetSelectInputRenderer() {
+	}
+
+	public void updateInputField(){
+		Enumeration enumeration = optionGroup.getElements();
+		int targetIdx = ((TargetSelectInput)inputField).getIdx();
+		int i = 0;
+		for(; enumeration.hasMoreElements(); i++){
+			JRadioButton o = (JRadioButton)enumeration.nextElement();
+			ctx.getCurrentPage().removeTarget(targetIdx);
+			if(o.isSelected()){
+				String target = inputField.getOptions()[i].value;        
+				ctx.getCurrentPage().addTarget(targetIdx, target);
+				inputField.setValue(target);
+				break;
+			}
+		}
+		if(i > inputField.getOptions().length){
+			inputField.setValue(inputField.getDefaultValue());
+		}
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/TextPageRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/TextPageRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/TextPageRenderer.java	(revision 21851)
@@ -0,0 +1,115 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.BorderLayout;
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import javax.swing.BorderFactory;
+import javax.swing.JLabel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextPane;
+import javax.swing.text.html.HTMLEditorKit;
+
+import org.tp23.antinstaller.ValidationException;
+import org.tp23.antinstaller.page.TextPage;
+import org.tp23.antinstaller.runtime.ConfigurationException;
+/**
+ * A page containing a text file's contents, may be HTML in swing.
+ * The HTML supported is the standard Swing subset of HTML3.2 so 
+ * it really just adds a bit of formatting and looks pretty bad.
+ * The page is also parsed and property references in the document
+ * are converted to the runtime values.
+ * e.g. ${java.user.name} would be replaced with the current user in the HTML text.
+ * 
+ * Both the html page and embeded images are loaded from the classpath so
+ * can be packaged in the jar.
+ * 
+ * The default font and background are determined by 
+ * the LAF.
+ * @author teknopaul
+ *
+ */
+public class TextPageRenderer extends SwingPageRenderer{
+
+	private JTextPane textPane = new JTextPane();
+	private StringBuffer buffer = new StringBuffer();
+	
+	public TextPageRenderer() {
+	}
+	
+	public boolean validateFields()throws ValidationException{
+		return true;
+	}
+
+	public void reInstanceInit() {}
+	
+	public void instanceInit() throws Exception {
+		final String resource = ((TextPage)page).getHtmlResource();
+		InputStream in = this.getClass().getResourceAsStream(resource);
+		if(in == null){
+			throw new ConfigurationException("Html page resource is missing:" + resource);
+		}
+		BufferedReader br = new BufferedReader(new InputStreamReader(in));
+		String read = null;
+		while ( (read = br.readLine()) != null) {
+			buffer.append(read);
+		}
+		// as per FindBugs 
+        br.close();
+		
+		JLabel defaults = new JLabel();
+		textPane.setBackground(defaults.getBackground());
+		textPane.setEditable(false);
+		textPane.setContentType("text/html");
+		HTMLEditorKit classpathKit = new ClasspathHTMLEditorKit();
+		textPane.setEditorKit(classpathKit);
+		textPane.setAutoscrolls(true);
+		
+		String rule = "body{font-family:" + defaults.getFont().getFamily() + 
+		";font-size:" + defaults.getFont().getSize() + "}";
+		classpathKit.getStyleSheet().addRule(rule);
+		textPane.setBorder(BorderFactory.createEmptyBorder());
+
+		JScrollPane scroller = new JScrollPane();
+		scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+		scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
+		scroller.setBorder(BorderFactory.createCompoundBorder(
+						BorderFactory.createEmptyBorder(4, 4, 4, 4),
+						BorderFactory.createEtchedBorder()				
+						));
+		add(scroller, BorderLayout.CENTER);
+		scroller.getViewport().add(textPane);
+		this.add(scroller, BorderLayout.CENTER);
+	}
+
+	public void updateInputFields(){
+	}
+
+
+
+	/**
+	 * updateDefaultValues
+	 */
+	public void updateDefaultValues() {
+		// parse property references
+		String parsedHtml = ctx.getInstaller().getResultContainer().getDefaultValue(buffer.toString());
+		textPane.setText(parsedHtml);
+		textPane.setCaretPosition(0);
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/UnvalidatedTextInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/UnvalidatedTextInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/UnvalidatedTextInputRenderer.java	(revision 21851)
@@ -0,0 +1,114 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.awt.Dimension;
+import java.awt.Insets;
+
+import java.awt.FlowLayout;
+import java.awt.GridLayout;
+import java.awt.BorderLayout;
+import javax.swing.JPanel;
+
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.input.UnvalidatedTextInput;
+import org.tp23.gui.GBCF;
+
+public class UnvalidatedTextInputRenderer
+	extends SwingOutputFieldRenderer {
+
+	protected UnvalidatedTextInput inputField;
+
+    protected AILabel fieldLabel = new AILabel();
+    protected AITextfield jTextField = new AITextfield();
+
+	public UnvalidatedTextInputRenderer() {
+	}
+
+	public void initComponent(JPanel parent){
+		try {
+			jbInit();
+		}
+		catch(Exception e) {
+            ctx.log(e.getMessage());
+            if(ctx.getInstaller().isVerbose()) {
+                ctx.log(e);
+            }
+
+		}
+	}
+
+	public void setOutputField(OutputField inputField) {
+		this.inputField=(UnvalidatedTextInput)inputField;
+		this.inputField.setValue(this.inputField.getDefaultValue());
+	}
+	public void updateInputField(){
+		inputField.setValue(jTextField.getText());
+	}
+	public void updateDefaultValue(){
+		if(!inputField.isEditted())jTextField.setText(inputField.getDefaultValue());
+	}
+
+    private void jbInit() throws Exception {
+		fieldLabel.setText(inputField.getDisplayText());
+		fieldLabel.setMinimumSize( new Dimension( SizeConstants.LABEL_WIDTH, 0) );
+
+		jTextField.setText(inputField.getDefaultValue());
+		jTextField.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent e) {
+				updateInputField();
+			}
+		});
+		jTextField.addKeyListener(new KeyAdapter() {
+			public void keyTyped(KeyEvent e) {
+				if (e.getKeyChar() != '\t') {
+					inputField.setEditted(true);
+				}
+			}
+		});
+
+    }
+	public int addSelf(JPanel content,GBCF cf,  int row,boolean overflow) {
+		JPanel p;
+
+		//p = new JPanel(new FlowLayout(FlowLayout.LEFT));
+		BorderLayout l = new BorderLayout();
+		p = new JPanel(l);
+		p.add( fieldLabel, BorderLayout.WEST );
+		p.add( jTextField, BorderLayout.CENTER );
+		content.add(p);
+
+		p = new JPanel();
+		p.setMinimumSize( new Dimension(0,1) );
+		content.add(p);
+
+
+		if(overflow){
+			jTextField.setOverflow(SizeConstants.OVERFLOW_FIELD_SIZE);
+		}
+		return ++row;
+	}
+
+	/**
+	 * renderError
+	 */
+	public void renderError() {
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ValidatedTextInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ValidatedTextInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ValidatedTextInputRenderer.java	(revision 21851)
@@ -0,0 +1,123 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing;
+
+import java.awt.Color;
+import java.awt.event.FocusAdapter;
+import java.awt.event.FocusEvent;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.util.ResourceBundle;
+
+import java.awt.Dimension;
+import java.awt.Insets;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import java.awt.FlowLayout;
+import java.awt.GridLayout;
+import java.awt.BorderLayout;
+
+
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.input.ValidatedTextInput;
+import org.tp23.antinstaller.renderer.MessageRenderer;
+import org.tp23.gui.GBCF;
+
+public class ValidatedTextInputRenderer extends SwingOutputFieldRenderer {
+
+    protected ValidatedTextInput inputField;
+    protected AILabel fieldLabel = new AILabel();
+    protected JTextField jTextField = new AITextfield();
+    protected Color origFore;
+
+    public ValidatedTextInputRenderer() {
+        origFore = jTextField.getForeground();
+    }
+
+    public void initComponent(JPanel parent) {
+        try {
+            jbInit();
+        } catch (Exception e) {
+            ctx.log(e.getMessage());
+            if (ctx.getInstaller().isVerbose()) {
+                ctx.log(e);
+            }
+
+        }
+    }
+
+    public void setOutputField(OutputField inputField) {
+        this.inputField = (ValidatedTextInput) inputField;
+        this.inputField.setValue(this.inputField.getDefaultValue());
+    }
+
+    public void updateInputField() {
+        inputField.setValue(jTextField.getText());
+    }
+
+    public void updateDefaultValue() {
+        if (!inputField.isEditted()) {
+            jTextField.setText(inputField.getDefaultValue());
+        }
+    }
+
+    private void jbInit() throws Exception {
+        fieldLabel.setText(inputField.getDisplayText());
+        jTextField.setText(inputField.getDefaultValue());
+
+        jTextField.addFocusListener(new FocusAdapter() {
+            public void focusLost(FocusEvent fe) {
+                jTextField.setForeground(origFore);
+            }
+        });
+        jTextField.addKeyListener(new KeyAdapter() {
+            public void keyTyped(KeyEvent e) {
+                if (e.getKeyChar() != '\t') {
+                    inputField.setEditted(true);
+                }
+            }
+        });
+    }
+
+    public int addSelf(JPanel content, GBCF cf, int row, boolean overflow) {
+
+		JPanel p;
+
+		//p = new JPanel(new FlowLayout(FlowLayout.LEFT));
+		BorderLayout l = new BorderLayout();
+		p = new JPanel(l);
+		p.add( fieldLabel, BorderLayout.WEST );
+		p.add( jTextField, BorderLayout.CENTER );
+		content.add(p);
+
+		p = new JPanel();
+		p.setMinimumSize( new Dimension(0,1) );
+		content.add(p);
+
+		return ++row;
+    }
+
+    /**
+     * renderError
+     */
+    public void renderError() {
+        MessageRenderer mr = ctx.getMessageRenderer();
+        mr.printMessage( org.tp23.antinstaller.Installer.langPack.getString("notCorrectFormat") );
+        this.jTextField.requestFocus();
+        this.jTextField.setForeground(Color.red);
+    }
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/package.html
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/package.html	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/package.html	(revision 21851)
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head><!--
+  Copyright (c) 2004 tp23
+  All Rights Reserved.
+--></head>
+
+<body bgcolor="white">Renderers for the Swing UI.</body>
+</html>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/plaf/LookAndFeelFactory.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/plaf/LookAndFeelFactory.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/plaf/LookAndFeelFactory.java	(revision 21851)
@@ -0,0 +1,105 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing.plaf;
+
+import java.lang.reflect.Method;
+
+import javax.swing.LookAndFeel;
+import javax.swing.UIManager;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.input.OutputField;
+
+
+/**
+ * @author Paul Hinds
+ * @version $Id: LookAndFeelFactory.java,v 1.9 2007/01/28 21:31:08 teknopaul Exp $
+ */
+public class LookAndFeelFactory {
+
+	public static final String DEFAULT_LAF = "org.tp23.jgoodies.plaf.plastic.PlasticXPLookAndFeel";
+	public static final String GREYMETAL_LAF = "greymetal";
+	public static final String NATIVE_LAF = "native";
+	public static final String JGOODIES_LAF = "jgoodies";
+	public static final String NULL_LAF = "null";
+	
+	private final String specifiedLAF;
+	private final InstallerContext ctx;
+	/**
+	 * 
+	 */
+	public LookAndFeelFactory(InstallerContext ctx) {
+		this.ctx = ctx;
+		this.specifiedLAF = ctx.getInstaller().getLookAndFeel();
+	}
+
+	public void setLAF(){
+		String lafClassName = null;
+		try{
+			lafClassName = getLafFromToken(specifiedLAF);
+			if(lafClassName == null){
+				return;
+			}
+			LookAndFeel look = (LookAndFeel)Class.forName(lafClassName).newInstance();
+			ctx.log("Setting look and feel:" + lafClassName);
+			UIManager.setLookAndFeel(look);
+
+			boolean antialias = OutputField.isTrue(ctx.getInstaller().getAntialiased());
+			// Reflection used here to avoid dependencies on JGoodies
+			if(antialias){
+				Method setAntialiased = look.getClass().getMethod("setAntiAliased", new Class[]{boolean.class});
+				if(setAntialiased != null){
+					ctx.log("Setting antialiasing:" + antialias);
+                    // JDK1.5 warning fix
+                    Object[] args = new Boolean[]{new Boolean(antialias)};
+					setAntialiased.invoke(null, args);
+				}
+			}
+		}catch(Exception ex ){
+			ctx.getLogger().log("Can not correctly set Look And Feel:" + ex.getMessage());
+			ctx.getLogger().log(ctx.getInstaller(), ex);
+		}
+	}
+    
+    public static boolean isDefault(String laf){
+        return ( laf == null || laf.equals(JGOODIES_LAF) || laf.equals(DEFAULT_LAF) );
+    }
+	/**
+	 * Gets a look and feel class name respecting the tokens supported
+	 * such as jgoodies, null, native and greymetal
+	 * @param token
+	 * @return look and feel class name
+	 */
+	public static String getLafFromToken(String token) {
+		String laf = null;
+        if(token == null || token.equals(JGOODIES_LAF)) {
+            laf = DEFAULT_LAF;
+        }
+        else if(token.equals(NULL_LAF)) {
+			laf = null;
+		}
+		else if(token.equals(NATIVE_LAF)) {
+			laf = UIManager.getSystemLookAndFeelClassName();
+		}
+		else if(token.equals(GREYMETAL_LAF)) {
+			laf = "org.tp23.antinstaller.renderer.swing.plaf.ModMetalLookAndFeel";
+		}
+		else {
+			laf = token;
+		}
+		return laf;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/plaf/ModMetalLookAndFeel.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/plaf/ModMetalLookAndFeel.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/plaf/ModMetalLookAndFeel.java	(revision 21851)
@@ -0,0 +1,118 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing.plaf;
+
+import java.awt.Font;
+import java.awt.Insets;
+
+import javax.swing.LookAndFeel;
+import javax.swing.UIDefaults;
+import javax.swing.UIManager;
+import javax.swing.plaf.metal.MetalLookAndFeel;
+		
+		
+/**
+ * This LAF is a replacement for Metal for those of us who can't stand the
+ * exsessive use of the <b>BOLD</b> font in the default MetalLookAndFeel
+ * but don't want a heavy LAF that uses excessive memory or increases download
+ * size.  The excessive use of Sun's corporate color purple has also been
+ * removed, but icons have been left as they are since they would add
+ * to the download size significantly.
+ * @author Paul Hinds
+ * @version $Id: ModMetalLookAndFeel.java,v 1.3 2006/12/21 00:03:03 teknopaul Exp $
+ */		 
+public class ModMetalLookAndFeel extends MetalLookAndFeel {
+		
+	private static final long serialVersionUID = 1L;
+	private static boolean isInstalled = false;
+    protected static final Font defaultFont = new Font("Dialog",Font.PLAIN,11);
+     
+     
+     public ModMetalLookAndFeel(){
+         if(!isInstalled){
+             isInstalled = true;
+             UIManager.installLookAndFeel(new javax.swing.UIManager.LookAndFeelInfo("ModMetal", "org.tp23.laf.modmetal.ModMetalLookAndFeel"));
+         }
+     }
+     public static void setAntiAliased(boolean antialiased){
+         
+     }
+
+     public String getID(){
+         return "ModMetalLookAndFeel";
+     }
+
+     public String getName()
+     {
+         return "ModMetalLookAndFeel";
+     }
+
+     public String getDescription(){
+         return "Metal LAF with minor changes to default Fonts";
+     }
+
+     public boolean isNativeLookAndFeel(){
+         return false;
+     }
+
+     public boolean isSupportedLookAndFeel(){
+         return true;
+     }
+
+     protected void initClassDefaults(UIDefaults table){
+         super.initClassDefaults(table);
+     }
+
+     protected void createDefaultTheme(){
+         setCurrentTheme(new ModMetalTheme());
+         super.createDefaultTheme();
+     }
+
+     protected void initSystemColorDefaults(UIDefaults table){
+         super.initSystemColorDefaults(table);
+     }
+
+     protected void initComponentDefaults(UIDefaults table){
+         super.initComponentDefaults(table);
+         table.put("Button.font", defaultFont);
+         table.put("Checkbox.font", defaultFont);
+         table.put("CheckboxMenuItem.font", defaultFont);
+         table.put("ComboBox.font", defaultFont);
+         table.put("ComboBox.font", defaultFont);
+         table.put("FormattedTextField.font", defaultFont);
+         table.put("Label.font", defaultFont);
+         table.put("List.font", defaultFont);
+         table.put("Menu.font", defaultFont);
+         table.put("MenuItem.font", defaultFont);
+         table.put("PopupMenu.font", defaultFont);
+         table.put("ProgressBar.font", defaultFont);
+         table.put("RadioButton.font", defaultFont);
+         table.put("RadioButtonMenuItem.font", defaultFont);
+         table.put("TextArea.font", defaultFont);
+         table.put("TextField.font", defaultFont);
+         table.put("TextPane.font", defaultFont);
+         table.put("TabbedPane.font", defaultFont);
+         table.put("ToggleButton.font", defaultFont);
+         table.put("Tree.font", defaultFont);
+         table.put("Viewport.font", defaultFont);
+         table.put("OptionPane.errorIcon", LookAndFeel.makeIcon(MetalLookAndFeel.class, "icons/Error.gif"));
+         table.put("OptionPane.informationIcon", LookAndFeel.makeIcon(MetalLookAndFeel.class, "icons/Inform.gif"));
+         table.put("OptionPane.warningIcon", LookAndFeel.makeIcon(MetalLookAndFeel.class, "icons/Warn.gif"));
+         table.put("Button.margin", new Insets(2,4,2,4));
+     }
+	
+}
+		
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/plaf/ModMetalTheme.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/plaf/ModMetalTheme.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/plaf/ModMetalTheme.java	(revision 21851)
@@ -0,0 +1,53 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.swing.plaf;
+
+import javax.swing.plaf.ColorUIResource;
+import javax.swing.plaf.metal.DefaultMetalTheme;
+
+/**
+ * @author Paul Hinds
+ * @version $Id: ModMetalTheme.java,v 1.4 2006/12/21 00:03:03 teknopaul Exp $
+ */
+public class ModMetalTheme extends DefaultMetalTheme{
+
+        private static final ColorUIResource primary1 = new ColorUIResource(
+                                  102, 102, 102);
+        private static final ColorUIResource primary2 = new ColorUIResource(
+                				  153, 153, 153);
+        private static final ColorUIResource primary3 = new ColorUIResource(
+                                  204, 204, 204);
+        
+        
+        private static final ColorUIResource secondary1 = new ColorUIResource(
+        						  192, 192, 192);
+        private static final ColorUIResource secondary2 = new ColorUIResource(
+                                  213, 213, 213);
+        private static final ColorUIResource secondary3 = new ColorUIResource(
+                                  234, 234, 234);
+
+
+        // these are blue in Metal Default Theme
+        protected ColorUIResource getPrimary1() { return primary1; } 
+        protected ColorUIResource getPrimary2() { return primary2; }
+        protected ColorUIResource getPrimary3() { return primary3; }
+
+        // these are gray in Metal Default Theme
+        protected ColorUIResource getSecondary1() { return secondary1; }
+        protected ColorUIResource getSecondary2() { return secondary2; }
+        protected ColorUIResource getSecondary3() { return secondary3; }
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/AbstractTextPageRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/AbstractTextPageRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/AbstractTextPageRenderer.java	(revision 21851)
@@ -0,0 +1,120 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.text;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.ResourceBundle;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.page.Page;
+import org.tp23.antinstaller.renderer.PageRenderer;
+/**
+ * renamed from TextPageRenderer in version 0.8 to enable
+ * the use of the page type TextPage, TextPageRenderer is now 
+ * the renderer for these page types
+ * @author teknopaul
+ *
+ */
+public abstract class AbstractTextPageRenderer
+	implements PageRenderer {
+
+	public static final int PAGE_BLANK_LINES = 20;
+	public static final int PAGE_DECO_WIDTH = 80;
+
+	protected BufferedReader reader;
+	protected PrintStream out;
+	private InstallerContext ctx;
+
+
+	public AbstractTextPageRenderer() {
+	}
+
+	public void setContext(InstallerContext ctx){
+		this.ctx = ctx;
+	}
+	public InstallerContext getContext(){
+		return ctx;
+	}
+
+	public void init( BufferedReader reader, PrintStream out){
+		this.out = out;
+		this.reader = reader;
+	}
+	/**
+	 *
+	 * @param page Page
+	 * @throws InstallException
+	 * @return boolean false implys user aborted
+	 */
+	public abstract boolean renderPage(Page page) throws InstallException;
+
+	protected void printHeader(Page page) throws IOException{
+		for (int i = 0; i < PAGE_BLANK_LINES; i++) {
+			out.println();
+		}
+
+
+		for (int i = 0; i < PAGE_DECO_WIDTH; i++) {
+			out.print('~');
+		}
+		out.println();
+		out.println("  " + page.getDisplayText());
+		for (int i = 0; i < PAGE_DECO_WIDTH; i++) {
+			out.print('~');
+		}
+		out.println();
+		out.println();
+		out.println();
+	}
+
+	private static final char[] affimativeChars = parseChars(org.tp23.antinstaller.Installer.langPack.getString("affirmativeChars"));
+    
+	private static char[] parseChars(String commaSeparated){
+		char[] input = commaSeparated.toCharArray();
+		char[] theChars = new char[input.length];
+		int j = 0;
+		for (int i = 0; i < input.length; i++) {
+			if(Character.isWhitespace(input[i]))continue;
+			if(',' == input[i]) {
+                continue;
+            }
+			else theChars[j++] = input[i];
+		}
+		char[] toReturn = new char[j];
+		System.arraycopy(theChars,0,toReturn,0,j);
+		return toReturn;
+	}
+
+	/**
+	 * does the string represent true default = true
+	 * @param entered String
+	 * @return boolean
+	 */
+	protected boolean isTrue(String entered){
+		if(entered.length() == 0) {
+            return true;
+        }
+		char first = entered.charAt(0);
+		boolean isTrue= false;
+		for (int i = 0; i < affimativeChars.length; i++) {
+			isTrue |= Character.toUpperCase(first) == affimativeChars[i];
+		}
+		return isTrue;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/AppRootInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/AppRootInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/AppRootInputRenderer.java	(revision 21851)
@@ -0,0 +1,20 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.text;
+
+public class AppRootInputRenderer
+	extends DirectoryInputRenderer {
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/CheckboxInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/CheckboxInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/CheckboxInputRenderer.java	(revision 21851)
@@ -0,0 +1,91 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.text;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.ResourceBundle;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.input.CheckboxInput;
+import org.tp23.antinstaller.input.InputField;
+import org.tp23.antinstaller.input.OutputField;
+
+
+public class CheckboxInputRenderer
+	implements TextOutputFieldRenderer {
+
+	protected InstallerContext ctx;
+
+	public CheckboxInputRenderer() {
+	}
+
+	public void setContext(InstallerContext ctx) {
+		this.ctx = ctx;
+	}
+
+	public void renderOutput(OutputField field, BufferedReader reader, PrintStream out) throws IOException {
+		CheckboxInput iField = (CheckboxInput) field;
+		out.print(iField.getDisplayText());
+		out.print("   [");
+		out.print(org.tp23.antinstaller.Installer.langPack.getString("_default_"));
+		out.print(":");
+		out.print(iField.getDefaultValue());
+		out.print("]");
+		if (InputField.isTrue(iField.getForce())) {
+			out.println(org.tp23.antinstaller.Installer.langPack.getString("_required_"));
+			iField.setValue(iField.getDefaultValue());
+			return;
+		}
+		else {
+			out.println();
+		}
+
+
+		String input = reader.readLine();
+		out.println();
+		if (input == null || input.trim().equals("")) {
+			input = iField.getDefaultValue();
+		}
+		if(InputField.isTrue(input)){
+			iField.setValue("true");
+		}
+		//@TODO should accept true or false only and complain toher wise looping till sensible input
+		//else if (InputField.isFalse(input)){
+		//	iField.setValue("false");
+		//}
+		else{
+			iField.setValue("false");
+		}
+	}
+
+	public boolean isAbort() {
+		return false;
+	}
+
+
+
+	/**
+	 * renderError
+	 *
+	 * @param field InputField
+	 * @param in InputStream
+	 * @param out PrintStream
+	 */
+	public void renderError(OutputField field, BufferedReader reader, PrintStream out) {
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/CommentOutputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/CommentOutputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/CommentOutputRenderer.java	(revision 21851)
@@ -0,0 +1,68 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.text;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintStream;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.input.CommentOutput;
+import org.tp23.antinstaller.input.OutputField;
+
+
+public class CommentOutputRenderer
+	implements TextOutputFieldRenderer {
+	protected InstallerContext ctx;
+	
+	public CommentOutputRenderer() {
+	}
+
+	public void setContext(InstallerContext ctx) {
+		this.ctx = ctx;
+	}
+
+	public void renderOutput(OutputField field, BufferedReader reader, PrintStream out) throws IOException {
+		CommentOutput comField = (CommentOutput) field;
+		String text = field.getDisplayText();
+		if(text == null){
+			return;
+		}
+
+		if( OutputField.isTrue(comField.getBold()) ){
+			text = text.toUpperCase();
+		}
+		else if( OutputField.isTrue(comField.getTitle()) ){
+			text = text.toUpperCase();
+		}
+
+		out.println(text);
+	}
+	public boolean isAbort(){
+		return false;
+	}
+
+
+
+	/**
+	 * renderError
+	 *
+	 * @param field InputField
+	 * @param out PrintStream
+	 */
+	public void renderError(OutputField field, BufferedReader reader, PrintStream out) {
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ConditionalFieldRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ConditionalFieldRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ConditionalFieldRenderer.java	(revision 21851)
@@ -0,0 +1,85 @@
+/*
+ * Licensed 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.
+ */
+
+package org.tp23.antinstaller.renderer.text;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintStream;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.ResourceBundleHelper;
+import org.tp23.antinstaller.ValidationException;
+import org.tp23.antinstaller.input.ConditionalField;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.runtime.ConfigurationException;
+
+/**
+ * Conditionally render a collection of fields
+ *
+ * @author mwilson
+ * @version $Id
+ * @since 0.7.4.patch 7
+ */
+public class ConditionalFieldRenderer implements TextOutputFieldRenderer
+{
+
+    private ResourceBundleHelper resHelper = new ResourceBundleHelper( "resources.LanguagePack" );
+    private InstallerContext context;
+
+    public void setContext( InstallerContext context )
+    {
+        this.context = context;
+    }
+
+    public void renderOutput( OutputField field, BufferedReader reader, PrintStream out )
+            throws ValidationException, InstallException, IOException
+    {
+        ConditionalField conditional = (ConditionalField) field;
+
+        try
+        {
+
+            OutputField[] fields = null;
+
+            if( conditional.getExpression().evaluate() )
+            {
+                fields = conditional.getFields();
+
+                SimpleInputPageRenderer.renderFields( context, fields, reader, out);
+            }
+        }
+        catch( ConfigurationException configExc )
+        {
+            throw new InstallException( resHelper.getMessage( "invalid.conditional.expression", conditional.getIfProperty()),
+                                                        configExc );
+        }
+        catch( ClassNotFoundException clsNotFoundExc )
+        {
+            throw new InstallException( resHelper.getMessage( "text.render.not.found" ),
+                                                        clsNotFoundExc );
+        }
+    }
+
+    public void renderError( OutputField field, BufferedReader reader, PrintStream out ) throws IOException
+    {
+        //renderOutput will have already rendered any errors
+    }
+
+    public boolean isAbort()
+    {
+        return false;
+    }
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ConfirmPasswordTextInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ConfirmPasswordTextInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ConfirmPasswordTextInputRenderer.java	(revision 21851)
@@ -0,0 +1,11 @@
+package org.tp23.antinstaller.renderer.text;
+
+import java.util.ResourceBundle;
+
+public class ConfirmPasswordTextInputRenderer extends PasswordTextInputRenderer {
+	
+	protected String getErrorMessage(){
+		return org.tp23.antinstaller.Installer.langPack.getString("passwordsDoNotMatch");
+	}	
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/DateInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/DateInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/DateInputRenderer.java	(revision 21851)
@@ -0,0 +1,64 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.text;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.ResourceBundle;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.input.DateInput;
+import org.tp23.antinstaller.input.OutputField;
+
+
+public class DateInputRenderer
+	implements TextOutputFieldRenderer {
+
+	protected InstallerContext ctx;
+	public DateInputRenderer() {
+	}
+
+	public void setContext(InstallerContext ctx) {
+		this.ctx = ctx;
+	}
+
+	public void renderOutput(OutputField field, BufferedReader reader, PrintStream out) throws IOException {
+		DateInput iField = (DateInput) field;
+		out.print(field.getDisplayText());
+
+		out.print("   [");
+		out.print(org.tp23.antinstaller.Installer.langPack.getString("_default_"));
+		out.print(":");
+		out.print(iField.getDefaultValue());
+		out.println("]");
+
+// @TODO check this from the patch submitted for bug 1469254
+		String input = reader.readLine();
+		
+		out.println();
+		if(input==null || input.equals(""))input = iField.getDefaultValue();
+		iField.setInputResult(input);
+	}
+	public void renderError(OutputField field, BufferedReader reader, PrintStream out) throws IOException{
+		DateInput iField = (DateInput) field;
+		out.println("The input is not in the correct format:"+iField.getDateFormat());
+		renderOutput(field, reader, out);
+	}
+	public boolean isAbort(){
+		return false;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/DirectoryInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/DirectoryInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/DirectoryInputRenderer.java	(revision 21851)
@@ -0,0 +1,84 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.text;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.ResourceBundle;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.input.DirectoryInput;
+import org.tp23.antinstaller.input.OutputField;
+
+public class DirectoryInputRenderer implements TextOutputFieldRenderer {
+
+    protected InstallerContext ctx;
+
+    public DirectoryInputRenderer() {
+    }
+
+    public void setContext(InstallerContext ctx) {
+        this.ctx = ctx;
+    }
+
+    public void renderOutput(OutputField field, BufferedReader reader, PrintStream out) throws IOException {
+        DirectoryInput iField = (DirectoryInput) field;
+        out.print(iField.getDisplayText());
+
+        out.print("   [");
+        out.print(org.tp23.antinstaller.Installer.langPack.getString("_default_"));
+        out.print(":");
+        out.print(iField.getDefaultValue(true));
+        out.print("]");
+
+        out.println();
+        String input = reader.readLine();
+        out.println();
+        if (input == null || input.equals("")) {
+            input = iField.getDefaultValue(true);
+            if("".equals(input)) { // if we have empty default and empty input getAbsolutePath() produces a temporary directory
+                iField.setInputResult("");
+            }
+            else {
+                iField.setInputResult(new File(input).getAbsolutePath());
+            }
+        }
+        else {
+            iField.setInputResult(new File(input).getAbsolutePath());
+        }
+    }
+
+    public boolean isAbort() {
+        return false;
+    }
+
+    /**
+     * renderError
+     * 
+     * @param field
+     *            InputField
+     * @param in
+     *            InputStream
+     * @param out
+     *            PrintStream
+     */
+    public void renderError(OutputField field, BufferedReader reader, PrintStream out) throws IOException {
+        renderOutput(field, reader, out);
+    }
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ExtValidatedTextInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ExtValidatedTextInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ExtValidatedTextInputRenderer.java	(revision 21851)
@@ -0,0 +1,38 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.text;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintStream;
+
+import org.tp23.antinstaller.input.ExtValidatedTextInput;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.input.Validator;
+
+
+public class ExtValidatedTextInputRenderer
+	extends ValidatedTextInputRenderer {
+
+	public void renderError(OutputField field, BufferedReader reader, PrintStream out) throws IOException{
+		ExtValidatedTextInput extVal = (ExtValidatedTextInput) field;
+		Validator validator = extVal.getValidator();
+		Throwable t = extVal.getThrowable();
+		String message = validator.getErrorMessage(t,null);
+		out.println(message);
+		renderOutput(field, reader, out);
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/FileInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/FileInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/FileInputRenderer.java	(revision 21851)
@@ -0,0 +1,68 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.text;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.ResourceBundle;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.input.FileInput;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.renderer.MessageRenderer;
+
+
+public class FileInputRenderer
+	implements TextOutputFieldRenderer {
+
+	protected InstallerContext ctx;
+	public FileInputRenderer() {
+	}
+
+	public void setContext(InstallerContext ctx) {
+		this.ctx = ctx;
+	}
+
+	public void renderOutput(OutputField field, BufferedReader reader, PrintStream out) throws IOException {
+		FileInput iField = (FileInput) field;
+		out.print(iField.getDisplayText());
+
+		out.print("   [");
+		out.print(org.tp23.antinstaller.Installer.langPack.getString("_default_"));
+		out.print(":");
+		out.print(iField.getDefaultValue(true));
+		out.print("]");
+
+		out.println();
+		String input = reader.readLine();
+		out.println();
+		if(input == null || input.equals("")){
+			input = iField.getDefaultValue(true);
+		}
+		iField.setInputResult(new File(input).getAbsolutePath());
+	}
+	public void renderError(OutputField field, BufferedReader reader, PrintStream out) throws IOException{
+		MessageRenderer mr = ctx.getMessageRenderer();
+		mr.printMessage(org.tp23.antinstaller.Installer.langPack.getString("fileDoesNotExist"));
+		renderOutput(field, reader, out);
+	}
+	public boolean isAbort(){
+		return false;
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/HiddenPropertyInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/HiddenPropertyInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/HiddenPropertyInputRenderer.java	(revision 21851)
@@ -0,0 +1,58 @@
+/*
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.text;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintStream;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.input.HiddenPropertyInput;
+import org.tp23.antinstaller.input.OutputField;
+
+/**
+ * Text UI Renderer for hidden properties - displays nothing
+ *
+ * @author mwilson
+ * @version $Id
+ * @since 0.7.4 patch 6
+ */
+public class HiddenPropertyInputRenderer implements TextOutputFieldRenderer
+{
+
+    public void setContext( InstallerContext ctx )
+    {
+
+    }
+
+    public void renderOutput( OutputField field, BufferedReader reader, PrintStream out ) throws IOException
+    {
+        HiddenPropertyInput propertyField = (HiddenPropertyInput) field;
+
+        if( !propertyField.isEditted() )
+        {
+            propertyField.setInputResult( propertyField.getDefaultValue() );
+        }
+    }
+
+    public void renderError( OutputField field, BufferedReader reader, PrintStream out ) throws IOException
+    {
+
+    }
+
+    public boolean isAbort()
+    {
+        return false;
+    }
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/LargeSelectInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/LargeSelectInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/LargeSelectInputRenderer.java	(revision 21851)
@@ -0,0 +1,114 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.text;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.ResourceBundle;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.input.LargeSelectInput;
+import org.tp23.antinstaller.input.OutputField;
+
+
+public class LargeSelectInputRenderer
+	implements TextOutputFieldRenderer {
+
+	private static final String nextChar = org.tp23.antinstaller.Installer.langPack.getString("nextChar");
+
+	protected InstallerContext ctx;
+	public LargeSelectInputRenderer() {
+	}
+
+	public void setContext(InstallerContext ctx) {
+		this.ctx = ctx;
+	}
+
+	public void renderOutput(OutputField field, BufferedReader reader, PrintStream out) throws IOException {
+		LargeSelectInput iField = (LargeSelectInput) field;
+
+		printText(iField,out,reader);
+		String input = reader.readLine();
+		out.println();
+		if(input == null || input.equals("")) {
+            input = iField.getDefaultValue();
+        }
+		else {
+			try {
+				int idx = Integer.parseInt(input.trim());
+				input = iField.getOptions()[idx - 1].value;
+			} catch(Exception numFormatOrIndexOutOfBounds) {
+				return;
+			}
+		}
+		iField.setInputResult(input);
+	}
+	
+	public boolean isAbort(){
+		return false;
+	}
+	private void printText(LargeSelectInput iField, PrintStream out,BufferedReader reader) throws IOException{
+		out.println(iField.getDisplayText());
+		LargeSelectInput.Option[] options = iField.getOptions();
+		out.print("  ");
+		out.println(org.tp23.antinstaller.Installer.langPack.getString("availableOptions"));
+		StringBuffer optionsData = new StringBuffer();
+		for (int i = 0; i < options.length; i++) {
+			optionsData.append("  ");
+			optionsData.append(i+1);
+			optionsData.append(") ");
+			optionsData.append(options[i].getText());
+			if(iField.getDefaultValue().equals(options[i].value)){
+				optionsData.append(" [");
+				optionsData.append(org.tp23.antinstaller.Installer.langPack.getString("_default_"));
+				optionsData.append("]");
+			}
+			optionsData.append("\n");
+		}
+		optionsData.append("  ");
+		optionsData.append(org.tp23.antinstaller.Installer.langPack.getString("enterNumber")).append("\n");
+		Pager pager = new Pager(optionsData.toString());
+		String command = null;
+		do {
+			if (!pager.next(out)) {
+				break;
+			}
+			out.println();
+			out.println(getNextInstructions());
+			command = reader.readLine();
+		}
+		while (command.toUpperCase().startsWith( nextChar ));
+		pager.rest(out);
+
+	}
+
+
+
+	/**
+	 * renderError
+	 *
+	 * @param field InputField
+	 * @param out PrintStream
+	 */
+	public void renderError(OutputField field, BufferedReader reader, PrintStream out) throws IOException {
+		ctx.getMessageRenderer().printMessage("Not a valid selection");
+		renderOutput(field, reader, out);
+	}
+	private String getNextInstructions() {
+		return org.tp23.antinstaller.Installer.langPack.getString("large_select_next");
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/LicensePageRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/LicensePageRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/LicensePageRenderer.java	(revision 21851)
@@ -0,0 +1,118 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.text;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ResourceBundle;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.runtime.ConfigurationException;
+import org.tp23.antinstaller.page.LicensePage;
+import org.tp23.antinstaller.page.Page;
+
+
+public class LicensePageRenderer
+	extends AbstractTextPageRenderer {
+
+	private static final String nextChar = org.tp23.antinstaller.Installer.langPack.getString("nextChar");
+	
+	private boolean usePaging = false;
+
+	public LicensePageRenderer() {
+	}
+
+	public boolean renderPage(Page page) throws InstallException {
+		if (page instanceof LicensePage) {
+			LicensePage lPage = (LicensePage) page;
+			String strUsePaging = lPage.getUsePaging();
+			usePaging = strUsePaging!=null && isTrue(strUsePaging);
+			return renderLicensePage(lPage);
+		}
+		else {
+			throw new InstallException("Wrong Renderer in LicensePageRenderer.renderPage");
+		}
+	}
+
+	private boolean renderLicensePage(LicensePage page) throws InstallException {
+		try {
+			BufferedReader commandReader = reader;
+			out.println();
+			out.println(org.tp23.antinstaller.Installer.langPack.getString("clickViewLicense"));
+			commandReader.readLine();
+
+			String resource = page.getResource();
+			InputStream licensein = this.getClass().getResourceAsStream(resource);
+			if (licensein == null) {
+				throw new ConfigurationException("License resource '" + resource + "' is missing from installer");
+			}
+			BufferedReader reader = new BufferedReader(new InputStreamReader(licensein));
+			printHeader(page);
+			String lineread = null;
+			StringBuffer sb = new StringBuffer();
+
+			while ( (lineread = reader.readLine()) != null) {
+				sb.append(lineread);
+				sb.append('\n');
+			}
+            // as per FindBugs
+            reader.close();
+
+			String command = null;
+			Pager pager = new Pager(sb.toString());
+			if (usePaging) {
+				do {
+					if (!pager.next(out)) {
+						break;
+					}
+					out.println();
+					out.println(getNextInstructions());
+					command = commandReader.readLine();
+				}
+				while (command.toUpperCase().startsWith(nextChar));
+				pager.rest(out);
+			}
+			else {
+				out.println(pager.getText());
+			}
+
+			for (int i = 0; i < PAGE_DECO_WIDTH; i++) {
+				out.print('~');
+			}
+			out.println();
+			out.println(org.tp23.antinstaller.Installer.langPack.getString("licenseAccept"));
+			command = commandReader.readLine();
+			command = command.trim();
+			if (isTrue(command)) {
+				return true;
+			}
+			else {
+				page.setAbort(true);
+				return false;
+			}
+		}
+		catch (IOException ex) {
+			throw new InstallException("Not able to read license file", ex);
+		}
+	}
+
+	private String getNextInstructions() {
+		return org.tp23.antinstaller.Installer.langPack.getString("license_next");
+	}
+}
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Pager.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Pager.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Pager.java	(revision 21851)
@@ -0,0 +1,101 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.text;
+
+import java.io.PrintStream;
+
+
+/**
+ *
+ * <p>Used for the Text/Console input to show pages of text as opposed to displaying
+* a long list of text that scrolls off the top of the page. </p>
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @author Paul Hinds
+ * @version $Id: Pager.java,v 1.2 2006/12/21 00:09:19 teknopaul Exp $
+ */
+public class Pager {
+
+	private char[] text;
+	private int linesPerPage = 20;
+	private int charsPerLine = 80;
+	private int stringIndex = 0;
+
+	public Pager(String text) {
+		this.text = text.toCharArray();
+	}
+	public Pager(){
+	}
+
+	public String getText() {
+		return new String(text);
+	}
+
+	public void setText(String text) {
+		this.text = text.toCharArray();
+	}
+	/**
+	 * Print the rest of the text
+	 */
+	public void rest(PrintStream out){
+		while(next(out));
+}
+	/**
+	 * Print the next page
+	 * @param out PrintStream
+	 * @return boolean true if there is more text
+	 */
+	public boolean next(PrintStream out){
+		int lineChars = 0;
+		int lastSpace = -1;
+		// loop past charaters, increment with lines
+		char[] lineBuffer = new char[charsPerLine+1];
+		for (int lines = 0; lines < linesPerPage;) {
+			if(stringIndex >= text.length){
+				return false;
+			}
+			lineBuffer[lineChars] = text[stringIndex];
+			if(text[stringIndex] == ' '){
+				lastSpace = lineChars;
+			}
+			if(text[stringIndex] == '\n'){
+				String tmp = new String(lineBuffer, 0, lineChars + 1);
+				out.print(tmp);
+				lines++;
+				lineChars = 0;
+				lastSpace = -1;
+			}
+			else if(lineChars == charsPerLine){
+				// handle lines ending with the last full word
+				if(lastSpace != -1){
+					out.println(new String(lineBuffer, 0, lastSpace));
+					stringIndex = stringIndex - (charsPerLine - lastSpace);
+				}
+				else {
+					out.println(new String(lineBuffer, 0, lineChars));
+				}
+				lines++;
+				lineChars = 0;
+				lastSpace = -1;
+			}
+			else{
+				lineChars++;
+			}
+			stringIndex++;
+		}
+		return true;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/PasswordTextInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/PasswordTextInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/PasswordTextInputRenderer.java	(revision 21851)
@@ -0,0 +1,165 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.text;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.ResourceBundle;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.input.PasswordTextInput;
+
+
+public class PasswordTextInputRenderer extends ValidatedTextInputRenderer
+
+	implements TextOutputFieldRenderer {
+
+	public PasswordTextInputRenderer() {
+	}
+
+	public void setContext(InstallerContext ctx) {
+		this.ctx = ctx;
+	}
+
+	public void renderOutput(OutputField field, BufferedReader reader, PrintStream out) throws IOException {
+		PasswordTextInput iField = (PasswordTextInput) field;
+		StringBuffer displayText = new StringBuffer();
+		displayText.append(field.getDisplayText());
+		displayText.append("   [");
+		displayText.append(org.tp23.antinstaller.Installer.langPack.getString("_default_"));
+		displayText.append(":");
+		displayText.append(iField.getDefaultValue());
+		displayText.append("]");
+
+		String input = null;
+		if(OutputField.isTrue(iField.getTextMask())){
+			input = new PasswordField().getPassword(displayText.toString());
+			System.out.print("\r                                                      ");
+		}
+		else {
+			out.println(displayText.toString());
+			input = reader.readLine();
+		}
+
+		out.println();
+		out.println();
+		if(input == null || input.equals("")){
+            input = iField.getDefaultValue();
+        }
+		iField.setInputResult(input);
+	}
+	public void renderError(OutputField field, BufferedReader reader, PrintStream out) throws IOException{
+		out.println(getErrorMessage());
+		renderOutput(field, reader, out);
+	}
+	public boolean isAbort(){
+		return false;
+	}
+
+	protected String getErrorMessage(){
+		return org.tp23.antinstaller.Installer.langPack.getString("notCorrectPasswordFormat");
+	}
+	
+	// shame this does not work
+	// does any one know a way to not echo passwords?
+//	private String readInput(InputStreamReader reader, PrintStream out) throws IOException{
+//		StringBuffer sb = new StringBuffer();
+//		char c = 0;
+//		while((c=(char)reader.read())!='\n'){
+//			if(c==8)sb.setLength(sb.length()-1);
+//			sb.append(c);
+//			out.print((char)8);
+//			out.flush();
+//		}
+//		return sb.toString();
+//	}
+	
+	/*
+	 * 
+	 * Taken from the SUN website
+	 * @author Paul Hinds
+	 * @version $Id: PasswordTextInputRenderer.java,v 1.4 2007/01/04 22:57:18 teknopaul Exp $
+	 */
+	class MaskingThread extends Thread {
+		private boolean stop = false;
+		private int index;
+		private String prompt;
+
+		public MaskingThread(String prompt) {
+			this.prompt = prompt;
+		}
+
+		public void run() {
+			while (!stop) {
+				try {
+					// attempt masking at this rate
+					this.sleep(1);
+				}
+				catch (InterruptedException iex) {
+					iex.printStackTrace();
+				}
+				if (!stop) {
+					System.out.print("\r" + prompt + " \r" + prompt);
+				}
+				System.out.flush();
+			}
+		}
+
+		public void stopMasking() {
+			this.stop = true;
+		}
+	}
+	
+	public class PasswordField {
+
+		/**
+		 *@param prompt The prompt to display to the user.
+		 *@return The password as entered by the user.
+		 */
+		String getPassword(String prompt) throws IOException {
+			// password holder
+			StringBuffer password = new StringBuffer();
+			MaskingThread maskingthread = new MaskingThread(prompt);
+			Thread thread = new Thread(maskingthread);
+			thread.start();
+			// block until enter is pressed
+			while (true) {
+				char c = (char) System.in.read();
+				// assume enter pressed, stop masking
+				maskingthread.stopMasking();
+				if (c == '\r') {
+					c = (char) System.in.read();
+					if (c == '\n') {
+						break;
+					}
+					else {
+						continue;
+					}
+				}
+				else if (c == '\n') {
+					break;
+				}
+				else {
+					// store the password
+					password.append(c);
+				}
+			}
+			return password.toString();
+		}
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ProgressPageRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ProgressPageRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ProgressPageRenderer.java	(revision 21851)
@@ -0,0 +1,68 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.text;
+
+import java.io.IOException;
+import java.io.PrintStream;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.page.Page;
+import org.tp23.antinstaller.renderer.AntOutputRenderer;
+
+
+public class ProgressPageRenderer extends AbstractTextPageRenderer implements AntOutputRenderer {
+
+	public ProgressPageRenderer() {
+	}
+
+	/**
+	 * getErr
+	 *
+	 * @return PrintStream
+	 */
+	public PrintStream getErr() {
+		return System.err;
+	}
+
+
+
+	/**
+	 * getOut
+	 *
+	 * @return PrintStream
+	 */
+	public PrintStream getOut() {
+		return System.out;
+	}
+
+
+
+	/**
+	 * renderPage
+	 *
+	 * @param page Page
+	 * @return boolean
+	 */
+	public boolean renderPage(Page page) throws InstallException {
+		try {
+			printHeader(page);
+		}
+		catch (IOException ex) {
+			throw new InstallException("Can not print header");// not very likely!!
+		}
+		return true;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Res.properties
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Res.properties	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Res.properties	(revision 21851)
@@ -0,0 +1,16 @@
+#org.tp23.antinstaller.renderer.text.Res
+#Wed Nov 10 00:25:59 CET 2004
+
+_required_=required
+_default_=default
+true=true
+affirmativeChars=T,Y
+licenseAccept=Do you accept the license? Y or N   [default\:Y]
+clickViewLicense=Press enter to view the license agreement
+clickViewText=Press enter to continue
+enterNumber=Enter a number
+fileDoesNotExist=The File does not exist
+license_next=enter 'N' for the next page, enter anything else to scroll to the the end
+large_select_next=enter 'N' for the next page, enter anything else to scroll to the the end
+nextChar=N
+availableOptions=view available options
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Res_de.properties
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Res_de.properties	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Res_de.properties	(revision 21851)
@@ -0,0 +1,17 @@
+#org.tp23.antinstaller.renderer.text.Res
+#Wed Nov 10 00:25:59 CET 2004
+
+_required_=erforderlich
+_default_=Voreinstellung
+true=wahr
+affirmativeChars=W,J
+licenseAccept=Akzeptieren Sie diese Lizenz? J oder N  [Vorgabe\:J]
+clickViewLicense=Drücken Sie die Eingabetaste, um die Lizenzvereinbarung anzusehen
+clickViewText=Press enter to continue
+enterNumber=Geben Sie eine Zahl ein
+fileDoesNotExist=Die Datei existiert nicht
+license_next=Geben Sie 'N' für die nächste Seite ein, oder eine andere
+Taste, um zum Ende zu springen
+large_select_next=Geben Sie 'N' für die nächste Seite ein, oder eine andere Taste, um zum Ende zu springen
+nextChar=N
+availableOptions=Verfügbare Optionen ansehen
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Res_es.properties
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Res_es.properties	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Res_es.properties	(revision 21851)
@@ -0,0 +1,15 @@
+#org.tp23.antinstaller.renderer.text.Res
+#Wed Nov 10 00:25:59 CET 2004
+_required_=Requerido
+_default_=Por defecto
+true=Verdad
+affirmativeChars=S,V
+licenseAccept=Aceptar la licencia? S o N   [Por defecto\:Y]
+clickViewLicense=Pulsar intro para ver licencia.
+clickViewText=Pulsar intro para continuar.
+enterNumber=Introduzca un nmero.
+fileDoesNotExist=El fichero no existe.
+license_next=Pulse 'S' para ver la siguiente página, pulse cualquier otra tecla para ir al final.
+large_select_next=Pulse 'S' para ver la siguiente pàgina, pulse cualquier otra tecla para ir al final.
+nextChar=S
+availableOptions=Ver opciones disponibles.
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Res_es_EU.properties
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Res_es_EU.properties	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Res_es_EU.properties	(revision 21851)
@@ -0,0 +1,15 @@
+#org.tp23.antinstaller.renderer.text.Res
+#Wed Nov 10 00:25:59 CET 2004
+_required_=Beharrezkoa
+_default_=Lehenetsia
+true=Egia
+affirmativeChars=E,B
+licenseAccept=Baimena onartzen duzu? E,B edo N   [Lehenetsia\:Y]
+clickViewLicense=Sakatu hemen baimena ikusteko.
+clickViewText=Pulsar intro para continuar.
+enterNumber=Sartu zenbaki bat.
+fileDoesNotExist=Fitztegia ez da existitzen.
+license_next=Sakatu 'N' hurrengo horrialdea ikusteko, sakatu beste edozer gauza bukaerara joateko.
+large_select_next=Sakatu 'N' hurrengo horrialdea ikusteko, sakatu beste edozer gauza bukaerara joateko.
+nextChar=N
+availableOptions=ikusi aukerak
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/SelectInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/SelectInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/SelectInputRenderer.java	(revision 21851)
@@ -0,0 +1,93 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.text;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.ResourceBundle;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.input.SelectInput;
+
+
+public class SelectInputRenderer
+	implements TextOutputFieldRenderer {
+
+	protected InstallerContext ctx;
+	public SelectInputRenderer() {
+	}
+
+	public void setContext(InstallerContext ctx) {
+		this.ctx = ctx;
+	}
+
+	public void renderOutput(OutputField field, BufferedReader reader, PrintStream out) throws IOException {
+		SelectInput iField = (SelectInput) field;
+		printText(iField,out);
+		
+		String input = reader.readLine();
+		out.println();
+		if(input == null || input.equals("")){
+			input = iField.getDefaultValue();
+		}
+		else {
+			try {
+				int idx = Integer.parseInt(input.trim());
+				input = iField.getOptions()[idx - 1].value;
+			} catch(Exception numFormatOrIndexOutOfBounds){
+				return;
+			}
+		}
+		iField.setInputResult(input);
+	}
+	public boolean isAbort(){
+		return false;
+	}
+	private void printText(SelectInput iField, PrintStream out) throws IOException{
+		out.println(iField.getDisplayText());
+		SelectInput.Option[] options = iField.getOptions();
+		out.print("  ");
+		out.println(org.tp23.antinstaller.Installer.langPack.getString("enterNumber"));
+		for (int i = 0; i < options.length; i++) {
+			out.print("  ");
+			out.print(i+1);
+			out.print(") ");
+			out.print(options[i].getText());
+			if(iField.getDefaultValue().equals(options[i].value)){
+				out.print(" [");
+				out.print(org.tp23.antinstaller.Installer.langPack.getString("_default_"));
+				out.print("]");
+			}
+			out.println();
+		}
+	}
+
+
+
+	/**
+	 * renderError
+	 *
+	 * @param field InputField
+	 * @param in InputStream
+	 * @param out PrintStream
+	 */
+	public void renderError(OutputField field, BufferedReader reader, PrintStream out) throws IOException {
+		ctx.getMessageRenderer().printMessage("Not a valid selection");
+		renderOutput(field, reader, out);
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/SimpleInputPageRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/SimpleInputPageRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/SimpleInputPageRenderer.java	(revision 21851)
@@ -0,0 +1,91 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.text;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintStream;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.ValidationException;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.page.Page;
+import org.tp23.antinstaller.page.SimpleInputPage;
+import org.tp23.antinstaller.renderer.RendererFactory;
+
+public class SimpleInputPageRenderer
+	extends AbstractTextPageRenderer {
+	
+	public SimpleInputPageRenderer() {
+	}
+
+	public boolean renderPage(Page page) throws InstallException{
+		if (page instanceof SimpleInputPage) {
+			try {
+				return renderSimpleInputPage( (SimpleInputPage) page);
+			}
+			catch (ClassNotFoundException ex) {
+				// this would be a code error
+				throw new InstallException("Cant find acceptable TextField renderer in SimpleInputPageRenderer.renderPage:" + ex.getMessage(),
+										   ex);
+			}
+		}
+		else {
+			//this would be a code error
+			throw new InstallException("Wrong Renderer in SimpleInputPageRenderer.renderPage");
+		}
+	}
+
+	private boolean renderSimpleInputPage(SimpleInputPage page)
+            throws InstallException, ClassNotFoundException, ValidationException
+    {
+
+		try {
+			printHeader(page);
+			OutputField[] fields = page.getOutputField();
+            return renderFields( getContext(), fields, reader, out );
+		}
+		catch (IOException ex) {
+			// If you cant write to the console there is not much you can do
+			throw new InstallException("IOException",ex);
+		}
+	}
+
+    public static boolean renderFields( InstallerContext context, OutputField[] fields, BufferedReader reader, PrintStream out )
+            throws ClassNotFoundException, IOException, ValidationException, InstallException
+    {
+
+        for (int f = 0; f < fields.length; f++) {
+            String text = fields[f].getExplanatoryText();
+            if(text != null){
+                out.println(text);
+                out.println();
+            }
+
+            TextOutputFieldRenderer frenderer = RendererFactory.getTextRenderer(fields[f]);
+            frenderer.setContext( context );
+            frenderer.renderOutput(fields[f], reader, out);
+            if (frenderer.isAbort()) {
+                return false;
+            }
+            while(!fields[f].validate( context ) ){
+                frenderer.renderError(fields[f], reader, out);
+            };
+        }
+        return true;
+    }
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/SplashPageRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/SplashPageRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/SplashPageRenderer.java	(revision 21851)
@@ -0,0 +1,49 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.text;
+
+import java.io.IOException;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.page.Page;
+import org.tp23.antinstaller.page.SplashPage;
+
+public class SplashPageRenderer extends AbstractTextPageRenderer {
+	public SplashPageRenderer() {
+	}
+	public boolean renderPage(Page page) throws InstallException {
+		if (page instanceof SplashPage) {
+			SplashPage sPage = (SplashPage) page;
+			return renderSplashPage(sPage);
+		}
+		else {
+			throw new InstallException("Wrong Renderer in SplashPageRenderer.renderPage");
+		}
+	}
+	private boolean renderSplashPage(SplashPage page) throws InstallException {
+		try {
+			printHeader(page);
+			out.println();
+			out.println(page.getAltText());
+
+			reader.read();
+			return true;
+		}
+		catch (IOException ex) {
+			throw new InstallException("IOException");
+		}
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TargetInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TargetInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TargetInputRenderer.java	(revision 21851)
@@ -0,0 +1,94 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.text;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.ResourceBundle;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.input.InputField;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.input.TargetInput;
+
+
+public class TargetInputRenderer
+	implements TextOutputFieldRenderer {
+
+	protected InstallerContext ctx;
+	public TargetInputRenderer() {
+	}
+
+	public void setContext(InstallerContext ctx) {
+		this.ctx = ctx;
+	}
+
+	public void renderOutput(OutputField field, BufferedReader reader, PrintStream out) throws IOException {
+		TargetInput iField = (TargetInput) field;
+		out.println("Install the following component?");
+		out.print(iField.getDisplayText());
+
+		out.print("   [");
+		out.print(org.tp23.antinstaller.Installer.langPack.getString("_default_"));
+		out.print(":");
+		out.print(iField.getDefaultValue());
+		out.print("]");
+
+		if (InputField.isTrue(iField.getForce())) {
+			out.print("   [");
+			out.print(org.tp23.antinstaller.Installer.langPack.getString("_required_"));
+			out.println("]");
+			ctx.getCurrentPage().addTarget(iField.getIdx(), iField.getTarget());
+			iField.setInputResult("true");
+			out.println();
+			return;
+		}
+
+
+
+		out.println();
+		String input = reader.readLine();
+		out.println();
+		if (input == null || input.trim().equals("")){
+			input = iField.getDefaultValue();
+		}
+		if(InputField.isTrue(input)){
+			ctx.getCurrentPage().addTarget(iField.getIdx(), iField.getTarget());
+			iField.setInputResult("true");
+		}
+		else{
+			ctx.getCurrentPage().removeTarget(iField.getIdx());
+			iField.setInputResult("false");
+		}
+		
+	}
+
+	public boolean isAbort() {
+		return false;
+	}
+
+
+
+	/**
+	 * renderError
+	 *
+	 * @param field InputField
+	 * @param out PrintStream
+	 */
+	public void renderError(OutputField field, BufferedReader reader, PrintStream out) {
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TargetSelectInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TargetSelectInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TargetSelectInputRenderer.java	(revision 21851)
@@ -0,0 +1,77 @@
+/* 
+ * Copyright 2005 Paul Hinds, Mark Anderson
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.text;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.ResourceBundle;
+
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.input.TargetSelectInput;
+
+/**
+ * 
+ * @author Paul Hinds, Mark Anderson
+ * @version $Id: TargetSelectInputRenderer.java,v 1.3 2007/01/09 22:41:40 teknopaul Exp $
+ */
+public class TargetSelectInputRenderer
+	extends SelectInputRenderer {
+
+	public TargetSelectInputRenderer() {
+	}
+
+	public void renderOutput(OutputField field, BufferedReader reader, PrintStream out) throws IOException {
+		TargetSelectInput iField = (TargetSelectInput) field;
+		printText(iField,out);
+
+		String input = reader.readLine();
+		out.println();
+		if(input == null || input.equals(""))
+			input = iField.getDefaultValue();
+		else{
+			try{
+				int idx = Integer.parseInt(input.trim());
+				input = iField.getOptions()[idx - 1].value;
+			} catch(Exception numFormatOrIndexOutOfBounds) {
+				return;
+			}
+		}
+		ctx.getCurrentPage().removeTarget(iField.getIdx());
+		ctx.getCurrentPage().addTarget(iField.getIdx(), input);
+		iField.setInputResult(input);
+	}
+
+	private void printText(TargetSelectInput iField, PrintStream out) throws IOException{
+		out.println(iField.getDisplayText());
+		TargetSelectInput.Option[] options = iField.getOptions();
+		out.print("  ");
+		out.println(org.tp23.antinstaller.Installer.langPack.getString("enterNumber"));
+		for (int i = 0; i < options.length; i++) {
+			out.print("  ");
+			out.print(i+1);
+			out.print(") ");
+			out.print(options[i].getText());
+			if(iField.getDefaultValue().equals(options[i].value)){
+				out.print(" [");
+				out.print(org.tp23.antinstaller.Installer.langPack.getString("_default_"));
+				out.print("]");
+			}
+			out.println();
+		}
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TextMessageRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TextMessageRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TextMessageRenderer.java	(revision 21851)
@@ -0,0 +1,74 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.text;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.renderer.MessageRenderer;
+
+/**
+ *
+ * <p>Render user messages to the console </p>
+ * <p> </p>
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @author Paul Hinds
+ * @version $Id: TextMessageRenderer.java,v 1.3 2007/01/09 22:41:40 teknopaul Exp $
+ */
+public class TextMessageRenderer
+	implements MessageRenderer {
+
+	private InstallerContext ctx = null;
+
+	public TextMessageRenderer() {
+	}
+
+	public void setInstallerContext(InstallerContext ctx){
+		this.ctx = ctx;
+	}
+	public void printMessage(String message){
+		System.out.println(message);
+	}
+
+	public boolean prompt(String message){
+		try {
+			System.out.println(message);
+			// FIXME need to read directly from InputStreamReader and stop at first \n or \r
+			// test the following
+//			InputStreamReader isr = new InputStreamReader(System.in);			
+//			int intChar = -1;
+//			StringBuffer sb = new StringBuffer();
+//			while((intChar = isr.read()) != -1 && intChar != '\n' && intChar != '\r'){
+//				sb.append((char)intChar);
+//			}
+//			String line = sb.toString();
+
+			BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
+			String line = reader.readLine();
+			if (line != null && !line.equals("") && line.trim().length() > 0) {
+				return Character.toUpperCase(line.trim().charAt(0)) == 'Y' ||
+					Character.toUpperCase(line.trim().charAt(0)) == 'T' ;
+			}
+			return false;
+		}
+		catch (IOException ex) {
+			throw new RuntimeException("IOException", ex);
+		}
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TextOutputFieldRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TextOutputFieldRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TextOutputFieldRenderer.java	(revision 21851)
@@ -0,0 +1,53 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.text;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintStream;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.input.OutputField;
+
+
+
+/**
+ *
+ * <p>Renders text OutputFields, TextOutputFieldRenderer should provide a no args constructor. </p>
+ * <p>The package name for TextOutputFieldRenderer is critical</p>
+ * BufferedInputStream is used for input to prevent new Buffered reader swallowing more input from the
+ * input stream than is strictly required
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @author Paul Hinds
+ * @version $Id: TextOutputFieldRenderer.java,v 1.4 2006/12/21 00:03:01 teknopaul Exp $
+ */
+public interface TextOutputFieldRenderer {
+	public void setContext(InstallerContext ctx);
+
+	public void renderOutput(OutputField field, BufferedReader reader, PrintStream out) throws InstallException, IOException;
+	/**
+	 * Called when validation fails
+	 * @param field InputField
+	 * @param in InputStream
+	 * @param out PrintStream
+	 * @throws IOException
+	 */
+	public void renderError(OutputField field, BufferedReader reader, PrintStream out) throws IOException;
+	/** fields have abort for text since each field has its own input line*/
+	public boolean isAbort();
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TextPageRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TextPageRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TextPageRenderer.java	(revision 21851)
@@ -0,0 +1,100 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.text;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ResourceBundle;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.page.Page;
+import org.tp23.antinstaller.page.TextPage;
+
+
+public class TextPageRenderer
+	extends AbstractTextPageRenderer {
+
+	private static final String nextChar = org.tp23.antinstaller.Installer.langPack.getString("nextChar");
+
+	public TextPageRenderer() {
+	}
+
+	public boolean renderPage(Page page) throws InstallException {
+		if (page instanceof TextPage) {
+			TextPage lPage = (TextPage) page;
+			return renderTextPage(lPage);
+		}
+		else {
+			throw new InstallException("Wrong Renderer in TextPageRenderer.renderPage");
+		}
+	}
+
+	private boolean renderTextPage(TextPage page) throws InstallException {
+		try {
+			BufferedReader commandReader = reader;//new BufferedReader(new InputStreamReader(in));
+
+			String resource = page.getTextResource();
+			InputStream textin = this.getClass().getResourceAsStream(resource);
+			BufferedReader reader = new BufferedReader(new InputStreamReader(textin));
+			printHeader(page);
+			String lineread = null;
+			StringBuffer sb = new StringBuffer();
+
+			while ( (lineread = reader.readLine()) != null) {
+				sb.append(lineread);
+				sb.append('\n');
+			}
+            // as per FindBugs
+            reader.close();
+
+			// parse property references
+			String parsedText = getContext().getInstaller().getResultContainer().getDefaultValue(sb.toString());
+
+			String command = null;
+			Pager pager = new Pager(parsedText);
+			do {
+				if (!pager.next(out)) {
+					break;
+				}
+				out.println();
+				out.println(getNextInstructions());
+				command = commandReader.readLine();
+			}
+			while (command.toUpperCase().startsWith(nextChar));
+			pager.rest(out);
+
+			for (int i = 0; i < PAGE_DECO_WIDTH; i++) {
+				out.print('~');
+			}
+			
+			out.println();
+			out.println(org.tp23.antinstaller.Installer.langPack.getString("clickViewText"));
+			commandReader.readLine();
+			
+			return true;
+		}
+		catch (IOException ex) {
+			throw new InstallException("Not able to read text file", ex);
+		}
+	}
+
+	private String getNextInstructions() {
+		return org.tp23.antinstaller.Installer.langPack.getString("license_next");
+	}
+}
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/UnvalidatedTextInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/UnvalidatedTextInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/UnvalidatedTextInputRenderer.java	(revision 21851)
@@ -0,0 +1,72 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.text;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.ResourceBundle;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.input.UnvalidatedTextInput;
+
+
+public class UnvalidatedTextInputRenderer
+	implements TextOutputFieldRenderer {
+
+	protected InstallerContext ctx;
+	public UnvalidatedTextInputRenderer() {
+	}
+
+	public void setContext(InstallerContext ctx) {
+		this.ctx = ctx;
+	}
+
+	public void renderOutput(OutputField field, BufferedReader reader, PrintStream out) throws IOException {
+		UnvalidatedTextInput iField = (UnvalidatedTextInput) field;
+		out.print(field.getDisplayText());
+
+		out.print("   [");
+		out.print(org.tp23.antinstaller.Installer.langPack.getString("_default_"));
+		out.print(":");
+		out.print(iField.getDefaultValue());
+		out.print("]");
+
+
+		//BufferedReader reader = new BufferedReader(new InputStreamReader(in));
+		out.println();
+		String input = reader.readLine();
+		out.println();
+		if(input==null || input.equals(""))input=iField.getDefaultValue();
+		iField.setInputResult(input);
+	}
+	public boolean isAbort(){
+		return false;
+	}
+
+
+
+	/**
+	 * renderError
+	 *
+	 * @param field InputField
+	 * @param in InputStream
+	 * @param out PrintStream
+	 */
+	public void renderError(OutputField field, BufferedReader reader, PrintStream out) {
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ValidatedTextInputRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ValidatedTextInputRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ValidatedTextInputRenderer.java	(revision 21851)
@@ -0,0 +1,64 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.renderer.text;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.ResourceBundle;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.input.ValidatedTextInput;
+
+
+public class ValidatedTextInputRenderer
+	implements TextOutputFieldRenderer {
+
+	protected InstallerContext ctx;
+	public ValidatedTextInputRenderer() {
+	}
+
+	public void setContext(InstallerContext ctx) {
+		this.ctx = ctx;
+	}
+
+	public void renderOutput(OutputField field, BufferedReader reader, PrintStream out) throws IOException {
+		ValidatedTextInput iField = (ValidatedTextInput) field;
+		out.print(field.getDisplayText());
+
+		out.print("   [");
+		out.print(org.tp23.antinstaller.Installer.langPack.getString("_default_"));
+		out.print(":");
+		out.print(iField.getDefaultValue());
+		out.println("]");
+
+
+		//BufferedReader reader = new BufferedReader(new InputStreamReader(in));
+		String input = reader.readLine();
+		out.println();
+		if(input==null || input.equals(""))input=iField.getDefaultValue();
+		iField.setInputResult(input);
+	}
+	public void renderError(OutputField field, BufferedReader reader, PrintStream out) throws IOException{
+		//ValidatedTextInput iField = (ValidatedTextInput) field;
+		out.println("The input is not of the correct format");
+		renderOutput(field, reader, out);
+	}
+	public boolean isAbort(){
+		return false;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/package.html
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/package.html	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/package.html	(revision 21851)
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head><!--
+  Copyright (c) 2004 tp23
+  All Rights Reserved.
+--></head>
+
+<body bgcolor="white">Renderers for the command line interface.</body>
+</html>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/AntRunner.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/AntRunner.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/AntRunner.java	(revision 21851)
@@ -0,0 +1,54 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.antmod.RuntimeLauncher;
+import org.tp23.antinstaller.page.Page;
+
+/**
+ * Abstract Runner superclass that handles the runPost(page) to execute
+ * ant tasks mid display.
+ * @author teknopaul
+ */
+public abstract class AntRunner implements Runner{
+
+	private RuntimeLauncher launcher = null;
+	private InstallerContext ctx;
+	
+	public AntRunner(InstallerContext ctx) {
+		this.ctx = ctx;
+	}
+
+	protected void runPost(Page page){
+		String postTarget = page.getPostDisplayTarget();
+		if(postTarget != null){
+			if(launcher == null){
+				prepareLauncher();
+			}
+			launcher.updateProps();
+			launcher.run(postTarget);
+		}
+	}
+	/**
+	 * This should never get run if there are no postTargets
+	 *
+	 */
+	private void prepareLauncher(){
+		launcher = new RuntimeLauncher(ctx);
+		launcher.parseProject();
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/AutoSwingRunner.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/AutoSwingRunner.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/AutoSwingRunner.java	(revision 21851)
@@ -0,0 +1,53 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime;
+
+import java.util.List;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.page.Page;
+import org.tp23.antinstaller.renderer.swing.SwingPageRenderer;
+/**
+ * Swing runner that starts with the last page bypassing all the other pages.
+ * This will be used during auto builds where the properties are already known.
+ * @author teknopaul
+ *
+ */
+public class AutoSwingRunner extends SwingRunner {
+
+	public AutoSwingRunner(InstallerContext ctx){
+		super(ctx);
+	}
+	protected void showFirstPage() throws Exception {
+		Page[] pages = installer.getPages();
+		// run all postDisplayTargets as if the pages were shown
+		for (int i = 0; i < pages.length; i++) {
+			Page page = pages[i];
+			if(page.getPostDisplayTarget() != null){
+				if( ifHelper.ifProperty(page) && 
+					ifHelper.ifTarget(page, ctx.getInstaller().getPages()) ){ // page would have been shown
+					runPost(page);
+				}
+			}
+		}
+		
+		// shows the LAST page directly which should be the Progress page
+		ctx.setCurrentPage(pages[pages.length - 1]);
+		List pageRenderers = getPageRenderers();
+		renderNext((SwingPageRenderer)pageRenderers.get(pageRenderers.size() - 1));
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/AutoTextRunner.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/AutoTextRunner.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/AutoTextRunner.java	(revision 21851)
@@ -0,0 +1,45 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime;
+
+import java.io.IOException;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.page.Page;
+
+public class AutoTextRunner extends TextRunner {
+	
+	public AutoTextRunner(InstallerContext ctx) throws IOException{
+		super(ctx);
+	}
+
+	public boolean runInstaller() throws InstallException {
+		Page[] pages = installer.getPages();
+		// run all postDisplayTargets as if the pages were shown
+		for (int i = 0; i < pages.length; i++) {
+			Page page = pages[i];
+			if(page.getPostDisplayTarget() != null) {
+				if( ifHelper.ifProperty(page) && 
+				    ifHelper.ifTarget(page, ctx.getInstaller().getPages()) ) { // page would have been shown
+					runPost(page);
+				}
+			}
+		}
+
+		return true;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/ConfigurationException.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/ConfigurationException.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/ConfigurationException.java	(revision 21851)
@@ -0,0 +1,38 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime;
+
+import org.tp23.antinstaller.InstallException;
+
+
+/**
+ * <p>A Runtime exception that implies the config file is wrong.</p>
+ */
+public class ConfigurationException
+	extends InstallException {
+	public ConfigurationException() {
+		super();
+	}
+
+	public ConfigurationException(String message) {
+		super(message);
+	}
+
+	public ConfigurationException(String message, Throwable cause) {
+		super(message, cause);
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/ConfigurationLoader.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/ConfigurationLoader.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/ConfigurationLoader.java	(revision 21851)
@@ -0,0 +1,379 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.Installer;
+import org.tp23.antinstaller.PropertiesFileRenderer;
+import org.tp23.antinstaller.input.ConditionalField;
+import org.tp23.antinstaller.input.InputField;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.input.ResultContainer;
+import org.tp23.antinstaller.input.SelectInput;
+import org.tp23.antinstaller.input.TargetInput;
+import org.tp23.antinstaller.input.TargetSelectInput;
+import org.tp23.antinstaller.page.Page;
+import org.tp23.antinstaller.page.ProgressPage;
+import org.tp23.antinstaller.page.SimpleInputPage;
+import org.tp23.antinstaller.renderer.swing.plaf.LookAndFeelFactory;
+import org.tp23.antinstaller.runtime.exe.LoadConfigFilter;
+import org.tp23.antinstaller.runtime.exe.PropertyLoaderFilter;
+import org.tp23.antinstaller.runtime.logic.ExpressionBuilder;
+
+
+/**
+ *
+ * <p>Loads the configuration file into memory as an Installer object. </p>
+ * <p>This class also contains the main() method to check the config files for common errors </p>
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @todo this should be an interface not a class
+ * @author Paul Hinds
+ * @version $Id: ConfigurationLoader.java,v 1.15 2007/01/28 08:44:43 teknopaul Exp $
+ */
+public class ConfigurationLoader extends LoadConfigFilter{
+	
+
+	/**
+	 * Command line config checker
+	 * @param args String[]
+	 * @throws InstallException 
+	 */
+	public static void main(String[] args) {
+        ConfigurationLoader configurationLoader = new ConfigurationLoader();
+		String configFile = INSTALLER_CONFIG_FILE;
+		if(args.length > 1 && args[1].endsWith(".xml")){
+			configFile = args[1];
+		}
+		int ret = 1;
+		try {
+
+			System.out.println( "reading..." );
+			configurationLoader.readConfig(new File(args[0]), configFile);
+			
+			System.out.println( "validating..." );
+			ret = configurationLoader.validate();
+            
+			if(ret > 0){
+				System.out.println("VALIDATION FAILED");
+			}
+		}
+		catch (ConfigurationException ex) {
+			ex.printStackTrace();
+			System.exit(ret);
+		}
+		catch (IOException ex) {
+			ex.printStackTrace();
+			System.exit(ret);
+		} catch (InstallException ex) {
+			// probably ifProperty syntax wrong
+			ex.printStackTrace();
+			System.exit(ret);
+		}
+	}
+
+	// add logging to configuration loader
+	/*
+	Installer installer;    
+	public ConfigurationLoader() {}
+
+	public ConfigurationLoader( Installer ins ) {
+		installer = ins;
+	}
+	private void log( String message ) {
+		if ( installer != null ) {
+			installer.log( message );
+		}
+	}
+	*/
+
+
+    /**
+     * This method is not valid until super.readConfig() has been run
+     * @return
+     */
+    public Installer getInstaller(){
+        return installer;
+    }
+	
+	public int validate() throws IOException, ConfigurationException, InstallException{
+		System.out.println( "get pages" );
+		Page[] pages = installer.getPages();
+		boolean foundErrors = false;
+		Set pageNames = new HashSet();
+		Set targets = new HashSet();
+		Set propertyNames = new HashSet();
+		Set pagePropertyNames = null;
+		
+		System.out.println( "validate attributes" );
+		if( validateInstallerAttributes() ){
+			System.out.println( "(validate attributes returned true)" );
+			foundErrors = true;
+		}
+		
+		for (int p = 0; p < pages.length; p++) {
+           System.out.println("Checking page: " + pages[p].getName() );
+			if(pageNames.contains(pages[p].getName())){
+				System.out.println("Error: page name '"
+                                    + pages[p].getName()
+                                    + "' repeated - auto loading of configuration will fail");
+				foundErrors = true;
+			}
+			pageNames.add(pages[p].getName());
+			
+			//TODO check page requirements
+			//test ifProperty syntax
+			// TODO passes validation even if nothing will evaluate
+			if (pages[p] instanceof SimpleInputPage) {
+				SimpleInputPage sPage = (SimpleInputPage)pages[p];
+				if(sPage.getIfProperty() != null){
+	                try {
+	                	ResultContainer mock = new ResultContainer();
+	                	ExpressionBuilder.parseLogicalExpressions( mock,
+	                			sPage.getIfProperty() );
+	                }
+	                catch( ConfigurationException configExc ){
+	                	System.out.println("Error: loading ifProperty," + sPage.getIfProperty() + " ,page: " + pages[p].getName() );
+	                	foundErrors = true;   
+	                }
+				}
+            }
+
+			
+			pagePropertyNames = new HashSet();
+			
+			OutputField[] fields = pages[p].getOutputField();
+			for (int f = 0; f < fields.length; f++) {
+				if(!fields[f].validateObject()){
+					foundErrors = true;
+					System.out.println("Error in page:" + pages[p].getName());
+				}
+				if(fields[f] instanceof TargetInput){
+					TargetInput tgtInput = (TargetInput)fields[f];
+					targets.add(tgtInput.getTarget());
+				}
+                if(fields[f] instanceof InputField && !(fields[f] instanceof ConditionalField) ){
+					InputField genericInput = (InputField)fields[f];
+					if(genericInput.getProperty().endsWith(PropertiesFileRenderer.TARGETS_SUFFIX)){
+						System.out.println("Error: invalid property name:" + genericInput.getProperty());
+						System.out.println("InputField names must not end with -targets");
+					}
+					String propertyName = genericInput.getProperty();
+					//System.out.println("Checking page.property: " + pages[p].getName() + "," + propertyName );
+					if(propertyNames.contains(propertyName)){
+						//foundErrors = true;
+						System.out.println("Repeated property name:"  + propertyName);
+						System.out.println("Loading defaults from file will probably not work:"  + propertyName);
+					}
+					else{
+						propertyNames.add(propertyName);
+					}
+					// repeated properties on the same page are an error always
+					if(pagePropertyNames.contains(propertyName)){
+						foundErrors = true;
+						System.out.println("Repeated property name: page=" + 
+								pages[p].getName() + ", property=" + propertyName);
+					}
+					else{
+						pagePropertyNames.add(propertyName);
+					}
+					
+				}
+			}
+			
+		}
+		System.out.println("Finished checking config inputs");
+		// check page structure
+		if(!(pages[pages.length-1] instanceof ProgressPage)){
+			foundErrors = true;
+			System.out.println("Last Page should be a progress page");
+		}
+		else{
+			if (pages[pages.length-1].getPostDisplayTarget() != null){
+				foundErrors = true;
+				System.out.println("Progress pages do not support postDisplayTarget");
+			}
+		}
+		// check for targets
+		int numOfPageTargets = 0;
+		for (int p = 0; p < pages.length; p++) {
+            numOfPageTargets += pages[p].getAllTargets().size();
+		}
+		if(numOfPageTargets == 0){
+			System.out.println("Warning: No Page Targets (not a problem if there are target input types)");
+		}
+		
+		Iterator iter = targets.iterator();
+		while (iter.hasNext()) {
+			String tgt = (String) iter.next();
+			if(tgt.endsWith(PropertiesFileRenderer.TARGETS_SUFFIX)){
+				System.out.println("Error: invalid target name:" + tgt);
+				System.out.println("Target names must not end with -targets");
+				foundErrors = true;
+			}
+		}
+
+		//@todo check targets exist in build.xml remember OSSpecific could be tricky to validate
+		
+		int numOfTargetInputs = 0;
+		// check ifTargets
+		ArrayList targetsSoFar = new ArrayList();
+		for (int p = 0; p < pages.length; p++) {
+			if(pages[p] instanceof SimpleInputPage){
+				SimpleInputPage simple = (SimpleInputPage)pages[p];
+				String ifTarget = simple.getIfTarget();
+				if(ifTarget != null && !targetsSoFar.contains(ifTarget)){
+					System.out.println("ifTarget=" + ifTarget);
+					System.out.println("ifTarget will never test true, no prior target in page:"+pages[p].getName());
+					// disabled due to bug 1412658 could be reinstated with proper test and OSSpecific handling 
+					//foundErrors = true;
+				}
+			}
+			// add after to ensure testing previous pages
+			targetsSoFar.addAll(pages[p].getAllTargets());
+			OutputField[] fields = pages[p].getOutputField();
+			for (int f = 0; f < fields.length; f++) {
+				if(fields[f] instanceof TargetInput){
+					if(numOfTargetInputs == 0){
+						System.out.println("Found target input type");
+					}
+                    numOfTargetInputs++;
+					TargetInput ti = (TargetInput)fields[f];
+					targetsSoFar.add(ti.getTarget());
+				}
+				if(fields[f] instanceof TargetSelectInput){
+					if(numOfTargetInputs == 0){
+						System.out.println("Found target input type");
+					}
+                    numOfTargetInputs++;
+					TargetSelectInput ti = (TargetSelectInput)fields[f];
+					SelectInput.Option[] options = ti.getOptions();
+					for (int i = 0; i < options.length; i++) {
+						SelectInput.Option option = options[i];
+						targetsSoFar.add(option.value);
+					}
+				}
+			}
+		}
+		if(numOfPageTargets == 0 && numOfTargetInputs == 0){
+			System.out.println("Warning: No targets found, installer may do nothing.");
+		}
+//		if(targetsSoFar.contains("default")){
+//			System.out.println("Target:target can not be \"default\"");
+//			foundErrors = true;
+//		}
+
+
+		System.out.println("Finished checking config");
+		if(!foundErrors){
+			return 0;
+		}
+		return 1;
+	}
+
+	private boolean validateInstallerAttributes(){
+        
+        System.out.println("Checking installer: " + installer.getName() );
+		boolean foundErrors = false;
+		
+		String[] validBooleanValues = {"true", "false"};
+		foundErrors |= validateValue("antialiased", installer.getAntialiased(), true, validBooleanValues);
+
+		// done in DTD
+		//foundErrors |= validateValue("verbose", installer.isVerbose(), true, validBooleanValues);
+		//foundErrors |= validateValue("debug", installer.isDebug(), true, validBooleanValues);
+		
+		String[] validLAFValues = {LookAndFeelFactory.DEFAULT_LAF,
+				LookAndFeelFactory.GREYMETAL_LAF,
+				LookAndFeelFactory.NATIVE_LAF,
+				LookAndFeelFactory.JGOODIES_LAF,
+				LookAndFeelFactory.NULL_LAF };
+		if( validateValue("lookAndFeel", installer.getLookAndFeel(), true, validLAFValues) ){
+			System.out.println("Warning: non standard LookAndFeel ensure the correct classes are on the classpath at runtime:" + installer.getLookAndFeel());
+		}
+		
+		if (installer.getName() == null){
+			System.out.println("Error: installer element attribute does not exist: name");
+			foundErrors = true;
+		}
+		
+		try {
+			String wide = installer.getWide();
+			if(wide != null){
+				installer.parseWideValue(wide);
+			}
+		} catch (Exception e) {
+			System.out.println("Error: installer element attribute incorrect format (e.g. 600:275): wide");
+			foundErrors = true;
+		}
+		
+		String[] validLoadDefaultValues = {PropertyLoaderFilter.FALSE,
+                PropertyLoaderFilter.LOAD,
+                PropertyLoaderFilter.PROMPT, 
+                PropertyLoaderFilter.PROMPT_AUTO};
+        
+        boolean loadDefaultsNull = true;
+        if( installer.supportsAutoBuild() ){
+            loadDefaultsNull = false;
+        }
+		foundErrors |= validateValue("loadDefaults", installer.getLoadDefaults(), loadDefaultsNull, validLoadDefaultValues);
+
+        VersionHelper vHelper = new VersionHelper();
+        if( installer.supportsAutoBuild() ){
+            if( ! vHelper.isValid(installer.getVersion()) ){
+                System.out.println("Error: invalid version attribute, required for -auto builds:" + installer.getVersion());
+                foundErrors = true;
+            }
+        }
+        if(installer.getVersion() != null){
+            if( ! vHelper.isValid(installer.getVersion()) ){
+                System.out.println("Error: invalid version attribute format examples 1.2.0 , 0.2beta:" + installer.getVersion());
+                foundErrors = true;
+            }
+        }
+        
+		return foundErrors;
+	}
+	/**
+	 * @return foundErrors  (true if there was an error)
+	 */
+	private boolean validateValue(String att, String value, boolean allowsNull, String[] validValues){
+		if(value == null){
+			if(!allowsNull){
+				System.out.println("Error: installer element attribute does not exist: " + att);
+				return true;
+			}
+			return false;
+		}
+		else {
+			for (int i = 0; i < validValues.length; i++) {
+				if(validValues[i].equals(value)){
+					return false;
+				}
+			}
+			System.out.println("Error: installer element attribute not valid value: " + att);
+			return true;
+		}
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/ExecInstall.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/ExecInstall.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/ExecInstall.java	(revision 21851)
@@ -0,0 +1,265 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime;
+
+import java.io.File;
+import java.util.ResourceBundle;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.renderer.MessageRenderer;
+import org.tp23.antinstaller.runtime.exe.ExecuteFilter;
+import org.tp23.antinstaller.runtime.exe.ExecuteRunnerFilter;
+import org.tp23.antinstaller.runtime.exe.FilterChain;
+import org.tp23.antinstaller.runtime.exe.FilterFactory;
+import org.tp23.antinstaller.runtime.exe.FinalizerFilter;
+import org.tp23.antinstaller.selfextract.SelfExtractor;
+
+
+
+/**
+ * This is the Applications entry point, it has a main method to run the
+ * installer. The main method is only for scripted installs.
+ * 
+ * It is here that the command line options are parsed and it
+ * is determined which type of install (swing or text) will be run.
+ * <p>Reads the config, determines the runner, runs it and outputs the
+ * properties file,  The Ant targets are then called by the AntRunner.
+ * This class also builds the internal Objects from the XML config file.</p>
+ * <p>This class can also be called by external tools to launch the installer
+ * currently two options are provided to lauch from Jars. </p>
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @author Paul Hinds
+ * @version $Id: ExecInstall.java,v 1.9 2007/01/19 00:24:36 teknopaul Exp $
+ */
+public class ExecInstall {
+
+	public static final String CONFIG_RESOURCE = "/org/tp23/antinstaller/runtime/exe/script.fconfig";
+	
+	private final InstallerContext ctx = new InstallerContext();
+	private FilterChain chain;
+	/**
+	 * @param chain chain of filters to be executed
+	 */
+	public ExecInstall(FilterChain chain){
+		this.chain = chain;
+	}
+
+
+
+	/**
+	 * Execute the installer, this reads the config fetches a runner and runs the install.
+	 * Once the install pages have finished an AntRunner is used to run Ant
+	 */
+	public void exec() {
+	
+		ExecuteFilter[] filters = null;
+		try {
+			chain.init(ctx);
+			filters = chain.getFilters();
+		}
+		catch (Exception e) {
+			// This is a developer error or the package has not been built correctly
+			// It should never happen in a tested build
+			e.printStackTrace();
+			System.exit(1); // called manually since in Win it was not shutting down properly
+		}
+loop:	for (int i = 0; i < filters.length; i++) {
+			try{
+				ctx.log("Filter: " + filters[i].getClass().getName());
+				filters[i].exec(ctx);
+			}
+			catch (ExecuteRunnerFilter.AbortException abort){
+				MessageRenderer vLogger = ctx.getMessageRenderer();
+				vLogger.printMessage(abort.getMessage());
+				ctx.log("Aborted");
+				FinalizerFilter ff = (FinalizerFilter)filters[filters.length - 1];
+				ff.exec(ctx);
+				System.exit(0);
+			}
+			catch (Exception ex) {
+
+				// write errors to the log
+				ctx.log("Installation error: " + ex.getMessage() + ": " + ex.getClass().toString());
+				boolean verbose = true; // be verbose if we cant load the config
+				if(ctx.getInstaller() != null) {
+					verbose =  ctx.getInstaller().isVerbose();
+				}
+				ctx.log(verbose, ex);
+
+				// write detailed errors to stdout for the GUI screens and text
+				if (ctx.getRunner() instanceof TextRunner) {
+					if(verbose){
+                        ex.printStackTrace();
+                    }
+				}
+				else {
+					if(verbose){
+                        ex.printStackTrace(System.err);
+                    }
+				}
+				
+				// report the error to the user
+				MessageRenderer vLogger = ctx.getMessageRenderer();
+				if(vLogger != null){
+					vLogger.printMessage(org.tp23.antinstaller.Installer.langPack.getString("installationFailed") + "\n" + ex.getMessage());
+					//Fixed BUG:1295944 vLogger.printMessage("Install failed\n" + ex.getMessage());
+				} else {
+					System.err.println(org.tp23.antinstaller.Installer.langPack.getString("installationFailed") + ex.getClass().getName());
+					System.err.println(ex.getMessage());
+				}
+
+				if(ctx.getRunner() != null){
+					ctx.getRunner().fatalError();
+					break loop;
+				}
+				else {  // the screens did not even start e.g. XML config error
+					System.exit(1);
+				}
+			}
+		}
+
+	}
+
+
+
+
+
+	/**
+	 * <p>Runs the installer from a script.</p>
+	 * 
+	 * This install can be run from a set of files for example from a CD.
+	 * @see org.tp23.antinstaller.selfextract.NonExtractor
+	 * @see org.tp23.antinstaller.selfextract.SelfExtractor
+	 * 
+	 * @param args String[]  args are "default" or "swing" or "text" followed by the root directory of the install
+	 */
+	public static void main(String[] args) {
+		try {
+			FilterChain chain = FilterFactory.factory(CONFIG_RESOURCE);		
+			ExecInstall installExec = new ExecInstall(chain);
+			if(installExec.parseArgs(args, true)){
+				installExec.exec();
+			}
+		}
+		catch (InstallException e) {
+            // Installer developer error
+			System.out.println("Cant load filter chain:/org/tp23/antinstaller/runtime/exe/script.fconfig");
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * This method has been designed for backward compatibility with
+	 * existing scripts.  The root dir is passed on the command line for scripted
+	 * installs but is determined automatically for installs from self-extracting Jars
+	 * @param args
+	 * @param requiresRootDir set to true if the args must include the root directory
+	 */
+	public boolean parseArgs(String[] args, boolean requiresRootDir){
+		String uiOverride = null;
+		String installType = null;
+		String installRoot = null;
+		
+		int i = 0;
+		if(args.length > i && !args[i].startsWith("-")) {
+			uiOverride = args[i];
+			i++;
+			ctx.setUIOverride(uiOverride);
+		}
+		
+		if(requiresRootDir){
+			if(args.length > i && !args[i].startsWith("-")) {
+				installRoot = args[i];
+				i++;
+				ctx.setFileRoot(new File(installRoot));
+			}
+			else{
+				printUsage();
+				return false;
+			}
+		}
+		// additional params should all have a -something prefix
+		for (; i < args.length; i++) {
+			// RFE 1569628
+			if("-type".equals(args[i]) && args.length > i + 1){
+				installType = args[i + 1];
+				i++;
+				String configFileName = "antinstall-config-" + installType + ".xml";
+				String buildFileName = "build-" + installType + ".xml";
+				ctx.setInstallerConfigFile(configFileName);
+				ctx.setAntBuildFile(buildFileName);
+			}
+		}
+		
+		return true;
+	}
+
+	private static void printUsage(){
+		System.out.println("Usage java -cp $CLASSPATH org.tp23.antinstaller.ExecInstall [text|swing|default] [install root] (-type [buildtype])");
+	}
+
+
+	/**
+	 * Sets the UI override from the command line
+	 * @param installRoot
+	 */
+//	public void setUIOverride(String override) {
+//		ctx.setUIOverride(override);
+//	}
+	/**
+	 * This is generated by the Main class which knows where it has
+	 * extracted or where it has run from
+	 * @param installRoot
+	 */
+	public void setInstallRoot(File installRoot) {
+		ctx.setFileRoot(installRoot);
+	}
+
+	/**
+	 * This is AntInstalls temporary space which will generally be deleted
+	 * except in debug mode when it is left to view the build process.
+	 * installRoot and tempRoot can be the same if the directory
+	 * is a new empty directory
+	 * @param tempDir directory to be used for temporary storage
+	 */
+	public void setTempRoot(File tempDir) {
+		addShutdownHook(tempDir);
+	}
+	/**
+	 * This shutdown hook is to facilitate debugging the app can be left open
+	 * in the GUI view and the resources will not be deleted.  Upon exit
+	 * temporary files will be removed.  This is required because the 
+	 * deleteOnExit() method fails if the directory is filled with files.
+	 * @param tempDir
+	 */
+	private void addShutdownHook(final File tempDir){
+		Runnable hook = new Runnable(){
+			public void run(){
+				if(ctx.getInstaller() != null &&
+				   ctx.getInstaller().isDebug()) return;
+				if(tempDir != null && tempDir.exists() && tempDir.isDirectory()){
+					SelfExtractor.deleteRecursive(tempDir);
+				}
+			}
+		};
+		Thread cleanUp = new Thread(hook);
+        cleanUp.setDaemon(true);
+        Runtime.getRuntime().addShutdownHook(cleanUp);
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/IfPropertyHelper.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/IfPropertyHelper.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/IfPropertyHelper.java	(revision 21851)
@@ -0,0 +1,89 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.page.Page;
+import org.tp23.antinstaller.page.SimpleInputPage;
+import org.tp23.antinstaller.runtime.logic.Expression;
+import org.tp23.antinstaller.runtime.logic.ExpressionBuilder;
+
+
+/**
+ * <p>Encapsulates code fo the ifProperty feature</p>
+ * N.B.  It is the installer generator's responsibility to ensure that properties passed
+ * to the less than or greater than test are valid Numbers.
+ * The internal Java format used is a Double so avalid regex would be
+ * something like [0-9]+\.*[0-9]*  or [0-9]+ for an Integer.
+ * The rather strange -=  and += syntax is used because &gt; and &lt;
+ * must be escaped to &amp;gt; and &amp;lt; in XML attributes and the legibility
+ * of the configuration files would be impared.
+ * REF: 1145496
+ * @author Paul Hinds
+ * @version $Id: IfPropertyHelper.java,v 1.5 2007/01/19 00:24:36 teknopaul Exp $
+ */
+public class IfPropertyHelper {
+	
+	private InstallerContext ctx = null;
+	public IfPropertyHelper(InstallerContext ctx){
+		this.ctx = ctx;
+	}
+
+	/**
+	 * @return boolean true to SHOW the page
+	 */
+	public boolean ifProperty(Page next) throws InstallException {
+		// show page if ifProperty is specified and property is correct
+		if(next instanceof SimpleInputPage) {
+			SimpleInputPage conditionalPage = (SimpleInputPage) next;
+			String ifProperty = conditionalPage.getIfProperty();
+			if (ifProperty != null) {
+                Expression expression;
+                try {
+                    expression = ExpressionBuilder.parseLogicalExpressions( ctx.getInstaller().getResultContainer(),
+                                                                                   ifProperty );
+                }
+                catch( ConfigurationException configExc ) {
+                    throw new InstallException( "Error parsing ifProperty condition for page " + next.getName(),
+                                                configExc );    
+                }
+                return expression.evaluate();
+            }
+
+        }
+		return true; // show the page by default
+	}
+	
+	/**
+	 * @return boolean true to SHOW the page
+	 */
+	public boolean ifTarget(Page next, Page[] pages){
+		// skip iftarget specified and target is missing
+		if(next instanceof SimpleInputPage){
+			SimpleInputPage conditionalPage = (SimpleInputPage) next;
+			String ifTarget = conditionalPage.getIfTarget();
+			if (ifTarget != null) {
+				boolean show = false;
+				for (int p = 0; p < pages.length; p++) {
+					show |= pages[p].isTarget(ifTarget);
+				}
+				return show;
+			}
+		}
+		return true;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/Logger.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/Logger.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/Logger.java	(revision 21851)
@@ -0,0 +1,44 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime;
+
+import java.io.IOException;
+
+import org.tp23.antinstaller.Installer;
+
+public interface Logger {
+
+	public void log(String message);
+
+	public void log(Throwable exception);
+
+    /**
+     * Logs the stack trace only if the installer is in verbose mode
+     * @param installer
+     * @param exception
+     */
+    public void log(Installer installer, Throwable exception);
+
+	public void setFileName(String fileName) throws IOException;
+
+    /**
+     * Get the name of the file used for logging
+     * @return path to file or <code>null</code> if not initialised
+     */
+    public String getFileName();
+
+    public void close();
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/Runner.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/Runner.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/Runner.java	(revision 21851)
@@ -0,0 +1,56 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime;
+
+import org.tp23.antinstaller.InstallException;
+
+
+
+/**
+ *
+ * <p>A Runner runs the user interaction screens, not ant.
+ * The base interface for TextRunner and SwingRunner </p>
+ * <p>Instances of this interface should have a constructor that takes
+ * an InstallerContext as an argument</p>
+ * Due to historic bad naming convention there exists an AntRunner which has
+ * no connection to this interface. 
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @author Paul Hinds
+ * @version $Id: Runner.java,v 1.2 2006/03/24 18:27:28 teknopaul Exp $
+ */
+
+public interface Runner {
+
+	/**
+	 * Renders the installer screens.  This method should block until
+	 * the UI has finished
+	 * @throws InstallException
+	 * @return boolean false implies user aborted
+	 */
+	public boolean runInstaller() throws InstallException;
+
+	/**
+	 * Called after Ant has finished so the Runner can clean up or provide feedback
+	 */
+	public void antFinished();
+
+	/**
+	 * Called if the install failed for some reason and can not continue;
+	 *
+	 */
+	public void fatalError();
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/SimpleLogger.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/SimpleLogger.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/SimpleLogger.java	(revision 21851)
@@ -0,0 +1,120 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime;
+
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import org.tp23.antinstaller.Installer;
+
+/**
+ * A Logger class that does not report errors
+ * 
+ * @author Paul Hinds
+ * @version $Id: SimpleLogger.java,v 1.4 2007/01/19 00:24:36 teknopaul Exp $
+ */
+public class SimpleLogger implements Logger {
+
+    BufferedWriter fos;
+
+    private String fileName;
+
+    public SimpleLogger() {
+    }
+
+    /**
+     * This method initialises the logger
+     */
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+        try {
+            fos = new BufferedWriter(new FileWriter(fileName, false));
+            fos.write("Logger initialized");
+            fos.newLine();
+        } catch (IOException e) {
+            fos = null;
+        }
+    }
+
+    public String getFileName() {
+        return fileName;
+    }
+
+    public void log(String message) {
+        if (fos == null) {
+            return;
+        }
+        try {
+            fos.write(message);
+            fos.newLine();
+            fos.flush();
+        } catch (Exception ex) {
+            throw new RuntimeException("Can not write to logs");
+        }
+    }
+
+    public void log(Installer installer, Throwable exception) {
+        if (installer != null && installer.isVerbose()) {
+            log(exception);
+        }
+    }
+
+    public void log(Throwable exception) {
+        if (fos == null) {
+            return;
+        }
+        try {
+            StringWriter writer = new StringWriter();
+            exception.printStackTrace(new PrintWriter(writer));
+            String s = writer.getBuffer().toString();
+            fos.write(s);
+            fos.newLine();
+        } catch (IOException ex) {
+            throw new RuntimeException("Can not write to logs");
+        }
+    }
+
+    public void close() {
+        try {
+            if (fos != null) {
+                fos.flush();
+                fos.close();
+                fos = null;
+            }
+        } catch (IOException e) {
+            System.err.println("Can't close logger");
+        }
+    }
+
+    /**
+     * Called by the garbage collector on an object when garbage collection
+     * determines that there are no more references to the object.
+     * 
+     * @throws Throwable
+     *             the <code>Exception</code> raised by this method
+     * @todo Implement this java.lang.Object method
+     */
+    protected void finalize() throws Throwable {
+        if (fos != null) {
+            fos.flush();
+            fos.close();
+        }
+    }
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/SwingRunner.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/SwingRunner.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/SwingRunner.java	(revision 21851)
@@ -0,0 +1,423 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime;
+
+import java.awt.GraphicsConfiguration;
+import java.awt.Toolkit;
+import java.awt.Dimension;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ResourceBundle;
+
+import javax.swing.ImageIcon;
+import javax.swing.JFrame;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.Installer;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.ValidationException;
+import org.tp23.antinstaller.antmod.FeedbackListener;
+import org.tp23.antinstaller.page.Page;
+import org.tp23.antinstaller.renderer.AntOutputRenderer;
+import org.tp23.antinstaller.renderer.RendererFactory;
+import org.tp23.antinstaller.renderer.swing.PageCompletionListener;
+import org.tp23.antinstaller.renderer.swing.SizeConstants;
+import org.tp23.antinstaller.renderer.swing.SwingInstallerContext;
+import org.tp23.antinstaller.renderer.swing.SwingMessageRenderer;
+import org.tp23.antinstaller.renderer.swing.SwingPageRenderer;
+
+import java.util.Enumeration;
+import java.awt.Font;
+import javax.swing.plaf.FontUIResource;
+import javax.swing.UIManager;
+
+
+
+/**
+ * <p>Runs the installer in a JFrame window </p>
+ * <p>This class uses the Installer object tree as its data source and renderers
+ * from the org.tp23.antinstaller.renderer.swing package </p>
+ * Runners must also create a MessageRenderer and make it available in the
+ * InstallerContext
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ *
+ * @author Paul Hinds
+ * @version $Id: SwingRunner.java,v 1.11 2007/01/19 00:24:36 teknopaul Exp $
+ */
+public class SwingRunner extends AntRunner implements Runner, PageCompletionListener {
+
+	protected SwingInstallerContext swingCtx = null;
+	private JFrame frame = new JFrame();
+	private List pageRenderers;
+	private volatile boolean doAnt = false;
+	protected Thread initialThread;
+	protected IfPropertyHelper ifHelper;
+	// context local property refs
+	protected InstallerContext ctx;
+	protected Logger logger;
+	protected Installer installer;
+
+	public SwingRunner(InstallerContext ctx) {
+		super(ctx);
+		swingCtx = new SwingInstallerContext(ctx, frame);
+
+		SwingMessageRenderer smr = new SwingMessageRenderer();
+		smr.setOwner(frame);
+		ctx.setMessageRenderer(smr);
+
+		ctx.setBuildListener(new FeedbackListener(swingCtx));
+
+		ifHelper = new IfPropertyHelper(ctx);
+		logger = ctx.getLogger();
+		installer = ctx.getInstaller();
+		this.ctx = ctx;
+	}
+
+	/**
+	 * Renders the installer in a Swing GUI, this method blocks until
+	 * the UI has finished
+	 *
+	 * @return boolean false implies user aborted
+	 * @throws InstallException
+	 */
+	public boolean runInstaller() throws InstallException {
+		try {
+			frame.setTitle(installer.getName());
+			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+			frame.setSize(SizeConstants.PAGE_WIDTH, SizeConstants.PAGE_HEIGHT);
+			frame.getRootPane().setDoubleBuffered(true);
+			frame.setResizable( true );
+
+			Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
+			frame.setLocation(screenSize.width/2 - frame.getWidth()/2, screenSize.height/2 - frame.getHeight()/2);
+
+			//setLocation(frame);
+			setIcon(frame, installer);
+
+			//set font
+			String new_default_font_str = null;
+			if ( System.getProperty("os.name").equals("Linux") ) {
+				new_default_font_str = "Bitstream Cyberbit";
+			} else if ( System.getProperty("os.name").startsWith("Windows") ) {
+				new_default_font_str = "Arial Unicode MS";
+			}
+
+			if ( new_default_font_str != null ) {
+
+				FontUIResource default_font = new FontUIResource(new_default_font_str, Font.PLAIN, 12);
+				Enumeration keys = UIManager.getDefaults().keys();
+				while (keys.hasMoreElements()) {
+					Object key = keys.nextElement();
+					Object value = UIManager.get(key);
+					if (value instanceof FontUIResource) {
+						UIManager.put(key, default_font);
+					}
+				}
+
+			}
+
+			preparePages(installer.getPages(), ctx);
+			showFirstPage();
+			// need to  block here until pages are complete
+			initialThread = Thread.currentThread();
+			try {
+				Thread.sleep(Long.MAX_VALUE);
+			}
+			catch (InterruptedException ex1) {
+
+			}
+			return doAnt;
+		}
+		catch (Exception ex) {
+			logger.log("Fatal exception: " + ex.getMessage());
+			if (ctx.getInstaller().isVerbose()) {
+				logger.log(ex);
+			}
+			ctx.getMessageRenderer().printMessage("Fatal exception: " + ex.getMessage());
+			throw new InstallException("", ex);
+		}
+	}
+
+	public void pageBack(Page page) {
+		if (page.isAbort()) {
+			abort();
+			return;
+		}
+		Page[] pages = installer.getPages();
+		for (int i = 0; i < pages.length; i++) {
+			if (pages[i] == page) {
+				// found current page
+				if (i > 0) {
+
+					//skip pages if the ifTarget or ifProperty attributes exist and fail
+					int nextIdx = i - 1;
+					try {
+						while (true) {
+							if (!ifHelper.ifTarget(pages[nextIdx], pages) ||
+									!ifHelper.ifProperty(pages[nextIdx])) {
+								//Continue looping
+								--nextIdx;
+							} else {
+								break;
+							}
+						}
+					}
+					catch (InstallException instExc) {
+						logger.log("InstallException rendering page:" + page.getName());
+						logger.log(installer, instExc);
+					}
+
+					//for(;ifTargetSkip(pages[nextIdx], pages);nextIdx--);
+
+					SwingPageRenderer renderer = (SwingPageRenderer) pageRenderers.get(nextIdx);
+					ctx.setCurrentPage(pages[nextIdx]);
+					try {
+						renderNext(renderer);
+					}
+					catch (InstallException ex) {
+						logger.log("InstallExcepiton rendering page:" + page.getName());
+						logger.log(installer, ex);
+					}
+					catch (ClassNotFoundException ex) {
+						logger.log("ClassNotFoundException rendering page:" + page.getName());
+						logger.log(installer, ex);
+					}
+					return;
+				}
+			}
+		}
+	}
+
+	/**
+	 * Called when a page is complete and the next button is pressed.
+	 * This method is called by the event thread that looses exceptions so Throwable
+	 * is caught
+	 *
+	 * @param page Page
+	 */
+	public void pageComplete(Page page) {
+		try {
+			if (page.isAbort()) {
+				abort();
+				return;
+			}
+			runPost(page);
+			Page[] pages = installer.getPages();
+			SwingPageRenderer currentRenderer;
+			for (int i = 0; i < pages.length; i++) {
+				if (pages[i] == page) { // found current page
+					currentRenderer = (SwingPageRenderer) pageRenderers.get(i);
+					// check validation
+					boolean validationPassed = false;
+					try {
+						currentRenderer.updateInputFields();
+						validationPassed = currentRenderer.validateFields();
+					} catch (ValidationException ve) {
+						logger.log("ValidationException rendering page:" + page.getName());
+						logger.log(installer, ve);
+						return;
+					}
+					if (!validationPassed) {
+						return;
+					}
+
+
+					if (i < pages.length - 1) {
+
+						//more pages left
+
+						// skip the page if the ifTarget or ifProperty dictate it
+						int nextIdx = i + 1;
+						while (true) {
+							if (!ifHelper.ifTarget(pages[nextIdx], pages) ||
+									!ifHelper.ifProperty(pages[nextIdx])) {
+								//Continue looping
+								nextIdx++;
+							} else {
+								break;
+							}
+						}
+
+
+						SwingPageRenderer renderer = (SwingPageRenderer) pageRenderers.get(nextIdx);
+						ctx.setCurrentPage(pages[nextIdx]);
+						try {
+							renderNext(renderer);
+						}
+						catch (InstallException ex) {
+							logger.log("InstallException rendering page:" + page.getName());
+							logger.log(installer, ex);
+						}
+						catch (ClassNotFoundException ex) {
+							logger.log("ClassNotFoundException rendering page:" + page.getName());
+							logger.log(installer, ex);
+						}
+						return;
+					}
+					if (i == pages.length - 1) {
+						// all done
+						currentRenderer.getBackButton().setEnabled(false);
+						currentRenderer.getNextButton().setEnabled(false);
+						currentRenderer.getFinishButton().setEnabled(false);
+						doAnt = true;
+						initialThread.interrupt();
+						return;
+					}
+				}
+			}
+		}
+		catch (Throwable e) {
+			ctx.log("Throwable during page completion:" + e.getMessage());
+			if (ctx.getInstaller().isVerbose()) {
+				ctx.log(e);
+			}
+		}
+	}
+
+	protected void showFirstPage() throws Exception {
+		ctx.setCurrentPage(installer.getPages()[0]);
+		renderNext((SwingPageRenderer) pageRenderers.get(0));
+	}
+
+
+	private void preparePages(Page[] pages, InstallerContext ctx) throws Exception {
+		pageRenderers = new ArrayList();
+		for (int i = 0; i < pages.length; i++) {
+			SwingPageRenderer renderer = RendererFactory.getSwingPageRenderer(pages[i]);
+			if (i == 0) renderer.getBackButton().setEnabled(false);
+			renderer.setContext(swingCtx);
+			renderer.setPageCompletionListener(this);
+			renderer.setPage(pages[i]);
+			renderer.instanceInit();
+			pageRenderers.add(renderer);
+			if (renderer instanceof AntOutputRenderer) {
+				ctx.setAntOutputRenderer((AntOutputRenderer) renderer);
+			}
+		}
+	}
+
+	protected void renderNext(SwingPageRenderer renderer) throws ClassNotFoundException, InstallException {
+		renderer.reInit();
+		renderer.reInstanceInit();
+
+		renderer.updateDefaultValues();
+		frame.getContentPane().removeAll();
+		frame.getContentPane().add(renderer);
+		frame.getContentPane().repaint();
+		frame.show();
+		if (renderer.getNextButton().isEnabled()) {
+			renderer.getNextButton().requestFocus();
+		} else if (renderer.getFinishButton().isEnabled()) {
+			renderer.getFinishButton().requestFocus();
+		}
+	}
+
+	private void setLocation(JFrame frame) {
+		GraphicsConfiguration config = frame.getGraphicsConfiguration();
+		int x = (int) config.getBounds().getCenterX() - (SizeConstants.PAGE_WIDTH / 2);
+		int y = (int) config.getBounds().getCenterY() - (SizeConstants.PAGE_HEIGHT / 2);
+		frame.setLocation(x, y);
+		frame.setResizable(false);
+	}
+
+	private void setIcon(JFrame frame, Installer installer) {
+		String iconResource = installer.getWindowIcon();
+		try {
+			if (iconResource == null) {
+				return;
+			}
+			InputStream in = this.getClass().getResourceAsStream(iconResource);
+			ByteArrayOutputStream baos = new ByteArrayOutputStream();
+			byte[] buffer = new byte[256];
+			int read = 0; // The number of bytes read from the stream
+			for (read = in.read(buffer); read != -1; read = in.read(buffer)) {
+				baos.write(buffer, 0, read);
+			}
+			ImageIcon icon = new ImageIcon(baos.toByteArray());
+			//Image icon = Toolkit.getDefaultToolkit().createImage(baos.toByteArray());
+			frame.setIconImage(icon.getImage());
+		}
+		catch (Exception ex) {
+			// we can live with out an icon
+			logger.log("Can not load icon resource: " + iconResource);
+			logger.log(installer, ex);
+		}
+	}
+
+	public void antFinished() {
+		SwingPageRenderer renderer = (SwingPageRenderer) pageRenderers.get(pageRenderers.size() - 1);
+		renderer.getBackButton().setEnabled(false);
+		renderer.getNextButton().setEnabled(false);
+		renderer.getCancelButton().setEnabled(false);
+		renderer.getFinishButton().setText(org.tp23.antinstaller.Installer.langPack.getString("exit"));
+		renderer.getFinishButton().setEnabled(true);
+		renderer.getFinishButton().requestFocus();
+		renderer.getTitleLabel().setText(org.tp23.antinstaller.Installer.langPack.getString("complete"));
+		renderer.stopPage();
+		ctx.getAntOutputRenderer().getErr().flush();
+		ctx.getAntOutputRenderer().getOut().flush();
+		ctx.getMessageRenderer().printMessage(org.tp23.antinstaller.Installer.langPack.getString("finished"));
+	}
+
+	public void fatalError() {
+		List renderers = getPageRenderers();
+		if ((renderers != null) && (renderers.size() > 0)) {
+			SwingPageRenderer renderer = (SwingPageRenderer) renderers.get(renderers.size() - 1);
+			renderer.getBackButton().setEnabled(false);
+			renderer.getNextButton().setEnabled(false);
+			renderer.getCancelButton().setEnabled(false);
+			renderer.getFinishButton().setText(org.tp23.antinstaller.Installer.langPack.getString("exit"));
+			renderer.getFinishButton().setEnabled(true);
+			renderer.getFinishButton().requestFocus();
+			renderer.stopPage();
+			renderer.getTitleLabel().setText(org.tp23.antinstaller.Installer.langPack.getString("failed"));
+		}
+		// else - we're done here, or should we call abort()?
+	}
+
+	/**
+	 * Returns a string representation of the object.
+	 *
+	 * @return a string representation of the object.
+	 */
+	public String toString() {
+		return "SwingRunner";
+	}
+
+	private void abort() {
+		this.doAnt = false;
+		initialThread.interrupt();
+	}
+
+	/**
+	 * @return Returns the frame.
+	 */
+	public JFrame getFrame() {
+		return frame;
+	}
+
+	/**
+	 * This method is only valid after the PageRenderers have been generated
+	 *
+	 * @return Returns the pageRenderers.
+	 */
+	public List getPageRenderers() {
+		return pageRenderers;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/TextRunner.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/TextRunner.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/TextRunner.java	(revision 21851)
@@ -0,0 +1,141 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintStream;
+import java.util.ResourceBundle;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.Installer;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.page.Page;
+import org.tp23.antinstaller.page.SimpleInputPage;
+import org.tp23.antinstaller.renderer.AntOutputRenderer;
+import org.tp23.antinstaller.renderer.RendererFactory;
+import org.tp23.antinstaller.renderer.text.AbstractTextPageRenderer;
+import org.tp23.antinstaller.renderer.text.TextMessageRenderer;
+
+
+
+/**
+ *
+ * <p>Runs the installer from the text only command line (console) </p>
+ * <p>This class uses the Installer object tree as its data source and renderers
+ * from the org.tp23.antinstaller.renderer.text package </p>
+ * <p>Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @author Paul Hinds
+ * @version $Id: TextRunner.java,v 1.10 2007/01/19 00:24:36 teknopaul Exp $
+ */
+public class TextRunner extends AntRunner 
+	implements Runner {
+	
+	protected final InstallerContext ctx;
+	protected final Installer installer;
+	private final Logger logger;
+	protected final IfPropertyHelper ifHelper;
+
+	public TextRunner(InstallerContext ctx) throws IOException {
+		super(ctx);
+		this.ctx = ctx;
+		this.installer = ctx.getInstaller();
+		this.logger = ctx.getLogger();
+		ctx.setMessageRenderer(new TextMessageRenderer());
+		ctx.setAntOutputRenderer(new AntOutputRenderer(){
+			public PrintStream getErr() {
+				return System.err;
+			}
+			public PrintStream getOut() {
+				return System.out;
+			}
+
+		});
+		this.ifHelper = new IfPropertyHelper(ctx);
+	}
+
+	/**
+	 * Renders the installer on the command line, this method blocks until
+	 * the UI has finished
+	 * @throws InstallException
+	 * @return boolean false implies the install was aborted
+	 */
+	public boolean runInstaller() throws InstallException {
+		try {
+			return renderPages(installer.getPages());
+		}
+		catch (Exception ex) {
+			logger.log("FATAL exception during installation:"+ex.getMessage());
+            logger.log(installer, ex);
+			
+			ctx.getMessageRenderer().printMessage(org.tp23.antinstaller.Installer.langPack.getString("installationFailed") + ":" + ex.getMessage());
+			//Fixed BUG: ctx.getMessageRenderer().printMessage("Installation failed:"+ex.getMessage());
+			throw new InstallException("Installation failed", ex);
+		}
+	}
+
+
+	private boolean renderPages(Page[] pages) throws ClassNotFoundException, InstallException{
+		Page next = null;
+		for (int i = 0; i < pages.length; i++) {
+			next = pages[i];
+
+			if(next instanceof SimpleInputPage){
+				// skip iftarget specified and missing
+				if(!ifHelper.ifTarget(next, pages))continue;
+				// skip page if ifProperty is specified and property is missing
+				if(!ifHelper.ifProperty(next))continue;
+			}
+
+			AbstractTextPageRenderer renderer = RendererFactory.getTextPageRenderer(next);
+			renderer.setContext(ctx);
+			renderer.init( new BufferedReader(new InputStreamReader(System.in)), System.out);
+			ctx.setCurrentPage(next);
+			renderer.renderPage(next);
+			if (next.isAbort()){
+				return false;
+			}
+			runPost(next);
+		}
+		return true;
+	}
+    public InstallerContext getInstallerContext() {
+		return ctx;
+    }
+
+
+
+	/**
+	 * Called when Ant has finished its work
+	 */
+	public void antFinished() {
+		System.out.println(org.tp23.antinstaller.Installer.langPack.getString("finished"));
+		//System.exit(0);
+	}
+	/**
+	 * Called is Ant failed to install correctly
+	 */
+	public void fatalError(){
+		System.out.println(org.tp23.antinstaller.Installer.langPack.getString("failed"));
+		//System.exit(1);
+	}
+
+	public String toString() {
+		return "TextRunner";
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/VersionHelper.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/VersionHelper.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/VersionHelper.java	(revision 21851)
@@ -0,0 +1,234 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime;
+
+import java.util.StringTokenizer;
+
+/**
+ * Version helper accepts version numbers of the following format.
+ * [major][clause].[minor][clause].[minor][clause].... ad infinitum
+ * 
+ * If the Java flag is set to true an attempt is made to parse the string as if it were
+ * returned by System.getProperty("java.version");
+ * Since pre 1.3.1 the system is not parsable the default is to accept the string
+ * if there is a format error.
+ * 
+ * For the non java syntax getting the string wrong will result in failed tests
+ * @author teknopaul
+ *
+ */
+public class VersionHelper {
+    
+    public static final String CLAUSE_ALPHA = "alpha";
+    public static final String CLAUSE_BETA = "beta";
+    public static final String CLAUSE_GAMMA = "gamma";
+    public static final String CLAUSE_JAVA_BETA = "ea";
+
+    public boolean equalOrHigher(final String test, final String version) {
+        return equalOrHigher(test, version, false);
+    }
+
+    public boolean majorVersionCompatible(final String test, final String version) {
+        return getMajorVersion(test) == getMajorVersion(version);
+    }
+
+    /**
+     * 
+     * @param test java version string being tested
+     * @param version java version string being used as reference
+     * @param javaSyntax
+     * @return true if the value of <code>test</code> is greater than or equal to the value of <code>version</code>
+     */
+    public boolean equalOrHigher(final String test, final String version, final boolean javaSyntax) {
+        try {
+            StringTokenizer testSt = new StringTokenizer(test, ".");
+            StringTokenizer verSt = new StringTokenizer(version, ".");
+            
+            while (true) {
+                boolean testMore = testSt.hasMoreTokens(); 
+                boolean verMore = verSt.hasMoreTokens();
+                if( ! testMore || ! verMore ){
+                    break;
+                }
+                String testToken = testSt.nextToken();
+                String verToken = verSt.nextToken();
+                short testVer = getVersion(testToken);
+                short versionVer = getVersion(verToken);
+                if( testVer == versionVer ) {
+                    if ( equalClause(getClause( testToken ), getClause(verToken)) ) {
+                        continue;
+                    }
+                    else {
+                        return higherClause(getClause( testToken ), getClause( verToken ), javaSyntax);
+                    }
+                }
+                return testVer > versionVer ;
+            }
+            // equal up to one not having minor details
+            if( countDots(test) >= countDots(version) ){
+                return true;
+            }
+            return test.equals(version);
+        } catch (Exception e) {
+            // syntax exceptions
+            if(javaSyntax){
+                return true; // return true for Java since pre 1.3.1 or other JVMs could get any old rubbish
+            }
+            return false;
+        }
+    }
+    
+    public boolean isValid(final String version) {
+        try {
+            StringTokenizer verSt = new StringTokenizer(version, ".");
+            
+            boolean verMore = false;
+            int i = 0;
+            for (; verMore = verSt.hasMoreTokens(); i++) {
+                
+                String verToken = verSt.nextToken();
+                if("".equals(verToken)){
+                    return false;
+                }
+                // may throw NumberFormatExceptions
+                getVersion(verToken);
+                String clause = getClause(verToken);
+                if( ! "".equals(clause)){
+                    short clauseS = clauseToShort(clause);
+                    if( ! (clauseS == 1 || clauseS == 2 || clauseS == 3 )){
+                        return false;
+                    }
+                }         
+            }
+            if( ! verMore && i == 0) {
+                return false; // nothing there!
+            }
+            return true;
+
+        } 
+        catch (Exception e) {
+            // syntax exceptions
+            return false;
+        }
+    }
+    /**
+     * @return the number part of the clause
+     */
+    private short getVersion(final String section) {
+        StringBuffer sb = new StringBuffer();
+        for (int i = 0; i < section.length(); i++) {
+            char c = section.charAt(i);
+            if(Character.isDigit(c)) {
+                sb.append(c);
+            }
+            else{
+                return Short.parseShort( sb.toString() );
+            }
+        }
+        if(sb.length() > 0) {
+            return Short.parseShort( sb.toString() );
+        }
+        return 0;
+    }
+    
+    /**
+     * @return  the clause eg beta or ""
+     */
+    private String getClause(final String section) {
+        for (int i = 0; i < section.length(); i++) {
+            char c = section.charAt(i);
+            if(Character.isDigit(c)) {
+                continue;
+            }
+            else {
+                return section.substring(i);
+            }
+        }
+        return "";
+    }
+
+    private boolean higherClause(final String test, final String clause, final boolean javaSyntax) {
+        if(javaSyntax) {
+            return clauseJavaToShort(test) > clauseJavaToShort(clause);
+        }
+        else {
+            return clauseToShort(test) > clauseToShort(clause);
+        }
+            
+    }
+    private boolean equalClause(final String test, final String clause) {
+        return clauseToShort(test) == clauseToShort(clause);
+    }
+    
+    private short clauseToShort(String clause) {
+        if(clause.startsWith("-")){
+            clause = clause.substring(1); // knock off java style 1-beta dashes
+        }
+        if( CLAUSE_ALPHA.equals(clause) ) {
+            return 3;
+        }
+        else if( CLAUSE_BETA.equals(clause) ) {
+            return 2;
+        }
+        else if( CLAUSE_GAMMA.equals(clause) ) {
+            return 1;
+        }
+        if(clause.startsWith("_")) { // java build version support 1_03-ea-beta  (discarding the sub sub clause "-ea-beta" because I'm lazy)
+            int hasDash = clause.indexOf('-');
+            if(hasDash > -1) {
+                return Short.parseShort(clause.substring(1, hasDash));
+            }
+            else {
+                return Short.parseShort(clause.substring(1));
+            }
+        }
+        else return Short.MAX_VALUE; // no clause assumes higher
+    }
+    
+    private short clauseJavaToShort(String clause) {
+        if(clause.startsWith("-")){
+            clause = clause.substring(1); // knock off java style 1-beta dashes
+        }
+        else if( CLAUSE_JAVA_BETA.equals(clause) ) {  // -ea early access are assumed to be less good
+            return -2;
+        }
+        if(clause.startsWith("_")) { // java build version support 1_03-ea-beta  (discarding the sub sub clause "-ea-beta" because I'm lazy)
+            int hasDash = clause.indexOf('-');
+            if(hasDash > -1) {
+                return Short.parseShort(clause.substring(1, hasDash));
+            }
+            else {
+                return Short.parseShort(clause.substring(1));
+            }
+        }
+        else return 0; // no clause assumes lower in Java speak
+    }
+
+    private short countDots(final String fullver){
+        short count = 0;
+        for (int i = 0; i < fullver.length(); i++) {
+            if(fullver.charAt(i) == '.') {
+                count++;
+            }
+        }
+        return count;
+    }
+    
+    private short getMajorVersion(String test){
+        return getVersion(test);
+    }
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/AntLauncherFilter.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/AntLauncherFilter.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/AntLauncherFilter.java	(revision 21851)
@@ -0,0 +1,106 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime.exe;
+
+import java.util.List;
+import java.util.Map;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.ResourceBundleHelper;
+import org.tp23.antinstaller.antmod.Launcher;
+import org.tp23.antinstaller.Installer;
+
+/**
+ *
+ * <p>Runs the Ant script using the Apache Ant launcher.</p>
+ * <p>This runner uses a modified version of the Apache launcher to provide us
+ * with feed back as to the state of the install </p>
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @todo get better feed back and progress for the targets that have run successfully
+ * @todo this should be an interface not a class
+ * @author Paul Hinds
+ * @version $Id: AntLauncherFilter.java,v 1.6 2007/01/12 14:47:44 anothermwilson Exp $
+ */
+public class AntLauncherFilter implements ExecuteFilter {
+
+    private ResourceBundleHelper resHelper = new ResourceBundleHelper( "resources.LanguagePack" );
+
+	public AntLauncherFilter() {
+	}
+
+	public void exec(InstallerContext ctx) throws InstallException {
+		if(ctx.getInstaller().isVerbose())ctx.log("Starting Ant Launcher");
+
+		try {
+
+			//TODO this should be refactored to installer
+			List argsList = ctx.getInstaller().getTargets(ctx);
+			
+			String[] argsArr = new String[argsList.size() + 4];
+			argsList.toArray(argsArr);
+
+			if (ctx.getInstaller().isVerbose()) {
+				ctx.log("Running targets:" + printArray(argsArr));
+			}
+			System.out.println("Targets:"+printArray(argsArr));
+
+			argsArr[argsArr.length-2] = "-lib";
+			argsArr[argsArr.length-1] = "antlib";
+
+			argsArr[argsArr.length-4] = "-buildfile";
+			argsArr[argsArr.length - 3] = ctx.getFileRoot().getAbsolutePath() +
+					System.getProperty("file.separator") +
+					ctx.getAntBuildFile();
+
+			//Launcher uses stdout and stderr by default
+			System.setOut(ctx.getAntOutputRenderer().getOut());
+			System.setErr(ctx.getAntOutputRenderer().getErr());
+			
+			Map properties = ctx.getInstaller().getResultContainer().getAllProperties();
+			Launcher launcher = new Launcher(properties);
+			int ok = launcher.run(argsArr, ctx);
+			if(ok!=0) {
+                throw new InstallException( resHelper.getMessage( "ant.failure" ) );
+                //the default ctx.setInstallSucceded(false);
+			}
+			else {
+				ctx.setInstallSucceded(true);
+			}
+			ctx.log("Ant finished");
+            ctx.getRunner().antFinished();
+        }
+		catch (Throwable ex) {
+			throw new InstallException("Error running the install, " + ex.getMessage(), ex);
+		}
+	}
+	/**
+	 * Used for debug to print the targets to system.out
+	 * @param args Object[]
+	 * @return String
+	 */
+	private String printArray(Object[] args){
+		StringBuffer sb = new StringBuffer();
+		for (int i = 0; i < args.length-4; i++) {
+			if (i > 0) {
+				sb.append(',');
+			}
+			sb.append(args[i]);
+		}
+		return sb.toString();
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/AntProjectFilter.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/AntProjectFilter.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/AntProjectFilter.java	(revision 21851)
@@ -0,0 +1,289 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime.exe;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.BuildListener;
+import org.apache.tools.ant.DefaultLogger;
+import org.apache.tools.ant.Diagnostics;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.ProjectHelper;
+import org.apache.tools.ant.input.DefaultInputHandler;
+import org.apache.tools.ant.launch.Locator;
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.antmod.ProjectHelper3;
+import org.tp23.antinstaller.selfextract.NonExtractor;
+import org.tp23.antinstaller.selfextract.SelfExtractor;
+/**
+ *
+ * <p>This AntRunner runs Ant builds directly from a Jar without having to extract
+ * the build.xml to temporary space.</p>
+ * <p> </p>
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @author Paul Hinds
+ * @version $Id: AntProjectFilter.java,v 1.10 2007/01/28 08:44:39 teknopaul Exp $
+ */
+public class AntProjectFilter implements ExecuteFilter{
+    
+    //TODO certain jars are added from Ant default directories that are probably not needed
+
+	private static String antVersion = null;
+	
+	/** The Ant Home property - from default Launcher  */
+	public static final String ANTHOME_PROPERTY = "ant.home";
+
+	/** The location of a per-user library directory - from default Launcher */
+	public static final String USER_LIBDIR = ".ant/lib";
+
+	public AntProjectFilter() {
+	}
+
+	/**
+	 * run Ant
+	 *
+	 * @param ctx InstallerContext
+	 * @throws InstallException
+	 * @todo Implement this org.tp23.antinstaller.runtime.AntRunner method
+	 */
+	public void exec(InstallerContext ctx) throws InstallException {
+		if(ctx.getInstaller().isVerbose()) {
+            ctx.log("Starting Ant Project");
+        }
+
+		try {
+			
+			Project project = new Project();
+			appendClassPath();
+			setAntHome(ctx);
+			project.setCoreLoader(this.getClass().getClassLoader());
+			
+			DefaultLogger antLogger = new DefaultLogger();
+			antLogger.setOutputPrintStream(ctx.getAntOutputRenderer().getOut());
+			antLogger.setErrorPrintStream(ctx.getAntOutputRenderer().getErr());
+			antLogger.setMessageOutputLevel(Project.MSG_INFO);
+			BuildListener bl = ctx.getBuildListener();
+			if(bl != null){
+				project.addBuildListener(bl);
+			}
+			project.addBuildListener(antLogger);
+
+            /*
+             * Log useful ant task output to the log file to help debugging
+             * and for customer support
+             */
+            final String logFileName = ctx.getLogger().getFileName();
+            if( logFileName != null && logFileName.length() > 0 )
+            {
+                PrintStream stream = new PrintStream( new FileOutputStream(logFileName, true), true);
+                DefaultLogger antFileLogger = new DefaultLogger();
+                antFileLogger.setOutputPrintStream( stream );
+                antFileLogger.setErrorPrintStream( stream );
+                int logLevel = (ctx.getInstaller().isVerbose())
+                                    ? Project.MSG_VERBOSE
+                                    : Project.MSG_INFO;
+                antFileLogger.setMessageOutputLevel( logLevel );
+
+                project.addBuildListener( antFileLogger );
+            }
+
+            // irrelevant really but might help someone on a command line
+			project.setInputHandler(new DefaultInputHandler());
+			project.fireBuildStarted();
+			
+			project.init();
+			project.setUserProperty("ant.version", getAntVersion());
+
+
+			// add properties
+			// N.B. properties are not loaded from the file it exists for debugging installers
+			String arg;
+			String value;
+			Map properties = ctx.getInstaller().getResultContainer().getAllProperties();
+			Iterator iter = properties.keySet().iterator();
+			while (iter.hasNext()) {
+				arg = (String) iter.next();
+				value = (String) properties.get(arg);
+				project.setUserProperty(arg, value);
+			}
+			
+			// From here we immitate Main
+			try {
+			    Diagnostics.validateVersion();
+			} catch (Throwable exc) {
+				// minimal messages for the benefit of the command line install
+				System.err.println("Version error:" + exc.getClass() + "," + exc.getMessage());
+			    return;
+			}
+			 
+			ProjectHelper helper = new ProjectHelper3();
+			project.addReference("ant.projectHelper", helper);
+			
+			File buildXml = new File(ctx.getFileRoot(), ctx.getAntBuildFile());
+			if(buildXml.exists()){
+				helper.parse(project, buildXml);
+				project.setUserProperty("ant.file",buildXml.getAbsolutePath());
+			} else {
+				URL buildIS = this.getClass().getResource("/" + ctx.getAntBuildFile());
+				helper.parse(project, buildIS);
+				project.setUserProperty("ant.file", buildIS.toExternalForm());
+			}
+			
+			File enclosingJar = SelfExtractor.getEnclosingJar(this);
+			project.setUserProperty(NonExtractor.ANTINSTALLER_JAR_PROPERTY , enclosingJar.getAbsolutePath());
+			System.out.println(NonExtractor.ANTINSTALLER_JAR_PROPERTY + enclosingJar.getAbsolutePath());
+
+			//what is this !?! project.setKeepGoingMode(keepGoingMode);
+
+			project.setBaseDir(ctx.getFileRoot());
+
+			project.executeTargets(ctx.getInstaller().getTargets(ctx));
+			project.fireBuildFinished(null);
+			ctx.setInstallSucceded(true);
+			ctx.log("Ant finished");
+		}
+		catch (Throwable e) {
+			throw new InstallException("Error running the install, " + e.getMessage(), e);
+		}
+        finally {
+			ctx.getRunner().antFinished();
+		}
+	}
+
+
+	public static synchronized String getAntVersion() throws BuildException {
+		 if (antVersion == null) {
+			 try {
+				 Properties props = new Properties();
+				 InputStream in =
+					 AntProjectFilter.class.getResourceAsStream("/org/apache/tools/ant/version.txt");
+				 props.load(in);
+				 in.close();
+
+				 StringBuffer msg = new StringBuffer();
+				 msg.append("Apache Ant version ");
+				 msg.append(props.getProperty("VERSION"));
+				 msg.append(" compiled on ");
+				 msg.append(props.getProperty("DATE"));
+				 antVersion = msg.toString();
+			 } catch (IOException ioe) {
+				 throw new BuildException("Could not load the version information:"
+										  + ioe.getMessage());
+			 } catch (NullPointerException npe) {
+				 throw new BuildException("Could not load the version information.");
+			 }
+		 }
+		 return antVersion;
+	 }
+	
+	/**
+	 * Append extra Ant jars to the classpath the original classpath 
+	 * is not removed incase the installer is launched from a script
+	 *
+	 */
+	private static void appendClassPath(){
+		try {
+			// now update the class.path property
+			StringBuffer baseClassPath
+				= new StringBuffer(System.getProperty("java.class.path"));
+			if (baseClassPath.charAt(baseClassPath.length() - 1)
+				== File.pathSeparatorChar) {
+				baseClassPath.setLength(baseClassPath.length() - 1);
+			}
+			URL[] jars = getLibPaths();
+			for (int i = 0; i < jars.length; ++i) {
+				baseClassPath.append(File.pathSeparatorChar);
+				baseClassPath.append(Locator.fromURI(jars[i].toString()));
+			}
+
+			System.setProperty("java.class.path", baseClassPath.toString());
+
+			URLClassLoader loader = new URLClassLoader(jars);
+			Thread.currentThread().setContextClassLoader(loader);
+		}
+		catch (MalformedURLException e) {
+			// swallow exception, normally all resources are already loaded
+			System.err.println("Invalid Jar path");
+		}
+	}
+	
+	
+	/**
+	 * Ant home is not a requirement but can exist prior to loading
+	 * the default Ant mechanism of using the current Jars parent
+	 * is consipicuously absent, do not rely on ANT_HOME out side of a 
+	 * controlled environment (e.g. a normal install)
+	 */
+	private static void setAntHome(InstallerContext ctx){
+		String antHomeProperty = System.getProperty(ANTHOME_PROPERTY);
+		if(antHomeProperty==null){
+			System.setProperty(ANTHOME_PROPERTY, ctx.getFileRoot().getAbsolutePath());
+		}
+	}
+	
+	/**
+	 * To maintain compatability with previous verisons currently the only
+	 * Ant command line argument supported is the -lib parameter with the value
+	 * "antlib"
+     * @TODO this should probably be removed
+	 * @throws MalformedURLException
+	 */
+	private static URL[] getLibPaths() throws MalformedURLException{
+		
+		// add all Jars from the ./antlib directory at the time of the build
+		// this is NOT based on ANT_HOME
+		URL[] libJars = Locator.getLocationURLs(new File("antlib"));
+
+		// add all the Jars from ~/.ant/lib
+		// this is probably irrelevant for a normal install
+		URL[] userJars = Locator.getLocationURLs(new File(USER_LIBDIR));
+
+		// Now try and find JAVA_HOME
+		File toolsJar = Locator.getToolsJar();
+
+		int jarsLength = libJars.length + userJars.length + (toolsJar!=null?1:0);
+		URL[] allJars = new URL[jarsLength];
+		int i = 0;
+		if(toolsJar != null){
+			allJars[i++] = toolsJar.toURL();
+		}
+		if(libJars.length != 0){
+			System.arraycopy(libJars, 0, allJars, i, libJars.length);
+			i += libJars.length;
+		}
+		if(userJars.length != 0){
+			System.arraycopy(userJars, 0, allJars, i, userJars.length);
+			//i+=userJars.length;
+			//assert(allJars.length=i-1);
+		}
+		return libJars;
+	}
+	
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/CreateLoggerFilter.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/CreateLoggerFilter.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/CreateLoggerFilter.java	(revision 21851)
@@ -0,0 +1,68 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime.exe;
+
+import java.io.File;
+
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.runtime.SimpleLogger;
+
+
+/**
+ * Creates a suitable logger for the install.  The logging does not
+ * throw exceptions since it is mainly for debug and we dont want to 
+ * stop an install just because logging is not working
+ * @author Paul Hinds
+ * @version $Id: CreateLoggerFilter.java,v 1.3 2007/01/09 22:41:40 teknopaul Exp $
+ */
+public class CreateLoggerFilter implements ExecuteFilter {
+
+	public static final String LOG_FILE_NAME = "ant.install.log";
+	
+	/**
+	 */
+	public void exec(InstallerContext ctx){
+		SimpleLogger logger = new SimpleLogger();
+		ctx.setLogger( logger );
+		try {
+			String defaultName = "./ant.install.log";
+			// @since 0.7.1 RFE-1154368 for installs from CD where ./ is not writable
+			File defaultFile = new File(defaultName);
+			try {
+				if( !defaultFile.exists() ){
+                    defaultFile.createNewFile();
+                }
+			}
+			catch(Exception e) {
+				;// ignore canWrite() will return false
+			}
+			if(defaultFile.canWrite()) {
+				logger.setFileName(defaultName);
+			}
+			else {
+				String tempDir = ctx.getFileRoot().getAbsolutePath();
+				logger.setFileName(tempDir+System.getProperty("file.separator") + LOG_FILE_NAME);
+			}
+			ctx.log("Ant basedir:" + ctx.getFileRoot().getCanonicalPath());
+		}
+		catch (Throwable ex1) {
+			ex1.printStackTrace();
+			logger.close();
+			// swallow exceptions
+		}
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/CreateUIFilter.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/CreateUIFilter.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/CreateUIFilter.java	(revision 21851)
@@ -0,0 +1,132 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime.exe;
+
+import java.io.IOException;
+import java.util.StringTokenizer;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.renderer.swing.plaf.LookAndFeelFactory;
+import org.tp23.antinstaller.runtime.AutoSwingRunner;
+import org.tp23.antinstaller.runtime.AutoTextRunner;
+import org.tp23.antinstaller.runtime.Runner;
+import org.tp23.antinstaller.runtime.SwingRunner;
+import org.tp23.antinstaller.runtime.TextRunner;
+
+
+/**
+ * Creates the Runner instance for the execution UI and sets up an appropriate
+ * message renderer.
+ * @author Paul Hinds
+ * @version $Id: CreateUIFilter.java,v 1.7 2007/01/28 17:49:15 teknopaul Exp $
+ */
+public class CreateUIFilter implements ExecuteFilter {
+
+	/**
+	 * @see org.tp23.antinstaller.runtime.exe.ExecuteFilter#exec(org.tp23.antinstaller.InstallerContext)
+	 */
+	public void exec(InstallerContext ctx) throws InstallException {
+		try {
+			if(ctx.getInstaller().isVerbose()){
+				ctx.log("Creating UI classes");
+			}
+			ctx.setRunner(getRunner(ctx));
+			ctx.log("Created UI classes");
+		}
+		catch (IOException e) {
+			throw new InstallException("Unable to create the user interface", e);
+		}
+		catch (InstallException e) {
+			throw new InstallException(e.getMessage(), e);
+		}
+	}
+	/**
+	 * Determines which Runner to use text or swing or "auto" UIs which skip past the properties sreens.
+	 * @param override String if this paramter is not null it will be used. If
+	 * swing and there is no graphics environment the install will fail, if it is left
+	 * as null a check is made to see if there is a Graphics Environment and swing is used
+	 * if there are no errors, if there are errors the system falls back to the text console
+	 *
+	 * @throws IOException
+	 * @return Runner
+	 */
+	private Runner getRunner(InstallerContext ctx) throws IOException, InstallException {
+
+		if(ctx.getUIOverride() != null){
+			if (ctx.getUIOverride().equalsIgnoreCase("swing")){
+				if(isUi("swing", ctx.getInstaller().getUi())){
+					new LookAndFeelFactory(ctx).setLAF();
+					return new SwingRunner(ctx);
+				}else{
+					throw new InstallException("Not a permited UI override, swing is not allowed");
+				}
+			}
+
+			if (ctx.getUIOverride().equalsIgnoreCase("text")){
+				if(isUi("text", ctx.getInstaller().getUi())){
+					return new TextRunner(ctx);
+				}else{
+					throw new InstallException("Not a permited UI override, text is not allowed");
+				}
+			}
+			
+			if (ctx.getUIOverride().equalsIgnoreCase("swing-auto")){
+				if(isUi("swing-auto", ctx.getInstaller().getUi())){
+					new LookAndFeelFactory(ctx).setLAF();
+					return new AutoSwingRunner(ctx);
+				}else{
+					throw new InstallException("Not a permited UI override, swing-auto is not allowed");
+				}
+			}
+			
+			if (ctx.getUIOverride().equalsIgnoreCase("text-auto")){
+				if(isUi("text-auto", ctx.getInstaller().getUi())){
+					return new AutoTextRunner(ctx);
+				}else{
+					throw new InstallException("Not a permited UI override, text-auto is not allowed");
+				}
+			}
+
+		}
+		//else do stuff to work out if there is a graphics context
+		try{
+			java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment();
+            /*
+             * Above test is not enough to be sure that we can use the graphics env
+             * so do remaining setup within try/catch block
+             */
+            new LookAndFeelFactory(ctx).setLAF();
+            return new SwingRunner(ctx);
+		} catch (Throwable e){
+			System.out.println("No graphics environment available, reverting to text");
+			System.out.println();
+			return new TextRunner(ctx);
+		}
+	}
+	
+	
+	private boolean isUi(String ui, String commaSeparatedUiList){
+		StringTokenizer st = new StringTokenizer(commaSeparatedUiList, ",");
+		while(st.hasMoreTokens()){
+			if(st.nextToken().equals(ui)){
+				return true;
+			}
+		}
+		return false;
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/ExecuteFilter.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/ExecuteFilter.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/ExecuteFilter.java	(revision 21851)
@@ -0,0 +1,31 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime.exe;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.InstallerContext;
+
+
+/**
+ * The Execute engine is being replaced with a filter pattern to enable
+ * further extension of the system,  Initiallly a hardcoded filter chain
+ * will be used subsequently to be replaced by a pluggable mechanism.
+ * @author Paul Hinds
+ * @version $Id: ExecuteFilter.java,v 1.1.1.1 2005/10/18 18:20:57 teknopaul Exp $
+ */
+public interface ExecuteFilter {
+	public void exec(InstallerContext ctx) throws InstallException;
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/ExecuteRunnerFilter.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/ExecuteRunnerFilter.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/ExecuteRunnerFilter.java	(revision 21851)
@@ -0,0 +1,49 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime.exe;
+
+import java.util.ResourceBundle;
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.Installer;
+
+/**
+ * Executes the Screens part of the build
+ * @author Paul Hinds
+ * @version $Id: ExecuteRunnerFilter.java,v 1.3 2006/12/21 01:48:51 teknopaul Exp $
+ */
+public class ExecuteRunnerFilter implements ExecuteFilter {
+
+	/**
+	 * @see org.tp23.antinstaller.runtime.exe.ExecuteFilter#exec(org.tp23.antinstaller.InstallerContext)
+	 */
+	public void exec(InstallerContext ctx) throws InstallException {
+		if(ctx.getInstaller().isVerbose()){
+			ctx.log("Starting UI Screens");
+		}
+		boolean ok = ctx.getRunner().runInstaller();
+		if(!ok){
+			throw new AbortException(Installer.langPack.getString("install-cancelled"));
+		}
+		ctx.log("Install screens rendered");
+	}
+
+	public static class AbortException extends InstallException{
+		public AbortException(String message){
+			super(message);
+		}
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/FilterChain.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/FilterChain.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/FilterChain.java	(revision 21851)
@@ -0,0 +1,32 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime.exe;
+
+import org.tp23.antinstaller.InstallerContext;
+
+
+/**
+ * A filter chain is a series of operations to be run by the ExecInstall class.
+ * This defines the sequence of events in the installer and provides for pluggable
+ * extra sequences for example post installtion messages or running the application.
+ * All FilterChains should end in a FinalizerFilter.
+ * @author Paul Hinds
+ * @version $Id: FilterChain.java,v 1.1.1.1 2005/10/18 18:20:57 teknopaul Exp $
+ */
+public interface FilterChain {
+	public void init(InstallerContext ctx);
+	public ExecuteFilter[] getFilters();
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/FilterFactory.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/FilterFactory.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/FilterFactory.java	(revision 21851)
@@ -0,0 +1,86 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime.exe;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.InstallerContext;
+
+
+/**
+ * Loads FilterChains from resource files on the classpath with lists of class
+ * names listed in order.  In the files lines starting with # and blank
+ * lines are ignored
+ * @author Paul Hinds
+ * @version $Id: FilterFactory.java,v 1.4 2007/01/04 22:57:18 teknopaul Exp $
+ */
+public class FilterFactory {
+	
+	public static final String FILTER_RESOURCE = "/antinstall-config.fconfig";
+
+	private FilterFactory() {
+	}
+
+	public static FilterChain factory(String configResource) throws InstallException{
+		try {
+			InputStream is = FilterFactory.class.getResourceAsStream(configResource);
+			BufferedReader br = new BufferedReader(new InputStreamReader(is));
+			String filterClass = null;
+			final List filterChain = new ArrayList();
+			while((filterClass = br.readLine())!=null){
+				if(filterClass.startsWith("#"))continue;
+				filterClass = filterClass.trim();
+				if(filterClass.equals("")){
+                    continue;
+                }
+				filterChain.add( Class.forName(filterClass).newInstance() );
+			}
+            br.close();
+			return new DynamicFilterChain(configResource, filterChain);
+		}
+		catch (IOException e) {
+			e.printStackTrace();
+		}
+		catch (Exception e) {
+			e.printStackTrace();
+		}
+		throw new InstallException("Can not create FilterChain");
+	}
+		
+	static class DynamicFilterChain implements FilterChain{
+		
+		private ExecuteFilter[] filters;
+		private String configResource;
+		
+		private DynamicFilterChain(String configResource, List filterChain){
+			this.configResource = configResource;
+			filters = new ExecuteFilter[filterChain.size()];
+			filterChain.toArray(filters);
+		}
+		public void init(InstallerContext ctx){
+			ctx.setConfigResource(configResource);
+		}
+		public ExecuteFilter[] getFilters(){
+			return filters;
+		}
+	};
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/FinalizerFilter.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/FinalizerFilter.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/FinalizerFilter.java	(revision 21851)
@@ -0,0 +1,47 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime.exe;
+
+import org.tp23.antinstaller.InstallerContext;
+
+
+/**
+ * This filter is called at the end of the install. This is not the 
+ * last Java operation since a shutDownHook is present to delete temporary
+ * files and in the GUI version the screen should not dissappear.
+ * All filter chains must end in a FinalizerFilter or subclass
+ * and the exec method must not throw an Exception.
+ * 
+ * @author Paul Hinds
+ * @version $Id: FinalizerFilter.java,v 1.3 2007/01/04 22:57:17 teknopaul Exp $
+ */
+public class FinalizerFilter implements ExecuteFilter {
+    
+    // TODO as per FindBugs the System.exit(0) in SwingPageRenderer prevents this running
+	/**
+	 * @see org.tp23.antinstaller.runtime.exe.ExecuteFilter#exec(org.tp23.antinstaller.InstallerContext)
+	 */
+	public void exec(InstallerContext ctx){
+		try {
+			ctx.log("Finalizing");
+			ctx.getLogger().close();
+		}
+		catch (Throwable e) {
+			e.printStackTrace();
+		}
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/InputStreamLoadConfigFilter.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/InputStreamLoadConfigFilter.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/InputStreamLoadConfigFilter.java	(revision 21851)
@@ -0,0 +1,51 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime.exe;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.runtime.ConfigurationException;
+
+
+/**
+ * @author Paul Hinds
+ * @version $Id: InputStreamLoadConfigFilter.java,v 1.4 2007/01/28 08:44:39 teknopaul Exp $
+ */
+public class InputStreamLoadConfigFilter extends LoadConfigFilter {
+
+	public void exec(InstallerContext ctx) throws InstallException {
+		this.ctx = ctx;
+
+		try {
+			InputStream config = this.getClass().getResourceAsStream("/" + ctx.getInstallerConfigFile());
+			if(config == null){ // passed in incorrectly on the command line or bad installer
+				throw new IOException();
+			}
+			readConfig(ctx.getFileRoot(), config);
+			ctx.setInstaller(installer);
+			ctx.log("Config loaded");
+		}
+		catch (IOException e) {
+			throw new InstallException("Not able to load and read the AntInstaller config",e);
+		}
+		catch (ConfigurationException e) {
+			throw new InstallException("Not able to load and read the AntInstaller config",e);
+		}
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/LoadConfigFilter.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/LoadConfigFilter.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/LoadConfigFilter.java	(revision 21851)
@@ -0,0 +1,501 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime.exe;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.Installer;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.input.AppRootInput;
+import org.tp23.antinstaller.input.CheckboxInput;
+import org.tp23.antinstaller.input.CommentOutput;
+import org.tp23.antinstaller.input.ConditionalField;
+import org.tp23.antinstaller.input.ConfirmPasswordTextInput;
+import org.tp23.antinstaller.input.DateInput;
+import org.tp23.antinstaller.input.DirectoryInput;
+import org.tp23.antinstaller.input.ExtValidatedTextInput;
+import org.tp23.antinstaller.input.FileInput;
+import org.tp23.antinstaller.input.HiddenPropertyInput;
+import org.tp23.antinstaller.input.InputField;
+import org.tp23.antinstaller.input.LargeSelectInput;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.input.PasswordTextInput;
+import org.tp23.antinstaller.input.SelectInput;
+import org.tp23.antinstaller.input.TargetInput;
+import org.tp23.antinstaller.input.TargetSelectInput;
+import org.tp23.antinstaller.input.UnvalidatedTextInput;
+import org.tp23.antinstaller.input.ValidatedTextInput;
+import org.tp23.antinstaller.page.LicensePage;
+import org.tp23.antinstaller.page.Page;
+import org.tp23.antinstaller.page.ProgressPage;
+import org.tp23.antinstaller.page.SimpleInputPage;
+import org.tp23.antinstaller.page.SplashPage;
+import org.tp23.antinstaller.page.TextPage;
+import org.tp23.antinstaller.runtime.ConfigurationException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.InputSource;
+
+
+/**
+ * Loads the Ant Install configuration and sets the Installer object back
+ * into the context.  A similar technique to the apache digester is used to
+ * populate object attributes in this class.
+ * N.B. The only types that can be set for object attributes are Strings, booleans
+ * or ints.
+ * @author Paul Hinds
+ * @version $Id: LoadConfigFilter.java,v 1.9 2007/01/28 08:44:39 teknopaul Exp $
+ */
+public class LoadConfigFilter implements ExecuteFilter {
+
+	//TODO move to InstallerContext
+	public static final String INSTALLER_CONFIG_FILE = "antinstall-config.xml";
+	
+	protected Installer installer = new Installer();
+	protected InstallerContext ctx;
+
+	/**
+	 * @see org.tp23.antinstaller.runtime.exe.ExecuteFilter#exec(org.tp23.antinstaller.InstallerContext)
+	 */
+	public void exec(InstallerContext ctx) throws InstallException {
+		this.ctx = ctx;
+		
+		try {
+            installer = readConfig(ctx.getFileRoot(), ctx.getInstallerConfigFile());
+			ctx.setInstaller(installer);
+			ctx.log("Config loaded");
+		}
+		catch (IOException e) {
+			throw new InstallException("Not able to load and read the AntInstaller config", e);
+		}
+		catch (ConfigurationException e) {
+			throw new InstallException("Not able to load and read the AntInstaller config", e);
+		}
+	}
+
+	/**
+	 * Currently read the config using any available XML parser
+	 * This method reads the config from the file system
+     * @param fileRoot The directory where the config file is stored
+     * @param the name of the configuration file (usually antinstall-config.xml)
+	 * @return Installer
+	 */
+	public Installer readConfig(File fileRoot, String fileName) throws IOException, ConfigurationException {
+
+        installer.getResultContainer().setInstallRoot(fileRoot);
+
+		File config = new File(fileRoot, fileName);
+		if(!config.exists()){ // passed in incorrectly on the command line or bad installer
+			throw new IOException();
+		}
+		InputSource xmlInp = new InputSource(new FileInputStream(config));
+		readConfig(xmlInp);
+		
+		return installer;
+	}
+	/**
+	 * This overloaded method reads from the provided input stream to facilitate
+	 * reading configs directly from the Jar, the file root is still needed 
+	 * for Ant's basedir. Used by InputStreamLoadConfigFilter
+	 * @return Installer
+	 */
+	protected Installer readConfig(File fileRoot, InputStream configSource) throws IOException, ConfigurationException {
+
+        installer.getResultContainer().setInstallRoot(fileRoot);
+
+		InputSource xmlInp = new InputSource(configSource);
+		readConfig(xmlInp);
+		
+		return installer;
+	}
+	/**
+	 * Currently read the config using any available XML parser
+	 * @todo read the installer with only xerces
+	 * @return Installer
+	 */
+	protected Installer readConfig(InputSource xmlInp) throws IOException, ConfigurationException {
+
+		Document doc = null;
+		int line=0;
+		try {
+			line=1;
+			DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
+			line=2;
+			DocumentBuilder parser = docBuilderFactory.newDocumentBuilder();
+			line=3;
+			// RFE [ 1475361 ] Using a custom entity resolver
+			String entityResolverClass = System.getProperty("antinstaller.EntityResolverClass");
+
+			line=4;
+			EntityResolver er = null;
+
+			line=5;
+			if(entityResolverClass != null){
+				line=6;
+				try{
+					line=7;
+					er = (EntityResolver)Class.forName(entityResolverClass).newInstance();
+				}
+				catch(Exception e){
+					// Property error use default this is a very specific requirement
+					line=8;
+					er = new CustomEntityResolver();
+				}
+				line=9;
+			}
+			else{
+				line=10;
+				er = new CustomEntityResolver();
+			}
+			line=11;
+			parser.setEntityResolver(er);
+
+			line=12;
+			doc = parser.parse(xmlInp);
+			line=13;
+			Element root = doc.getDocumentElement();
+			line=14;
+			root.normalize();
+			line=15;
+			setProperties(installer, root.getAttributes());
+			line=16;
+			NodeList allPages = root.getElementsByTagName("page");
+			//TODO make this pluggable
+			line=17;
+			getPages(installer, allPages);
+		}
+		catch (Exception e) {
+			e.printStackTrace();
+			System.out.println( e.getMessage() );
+			throw new IOException("DomFactory error: caused by:" + e.getClass() + ":" + e.getMessage() + ". Line: " + line);
+		}
+		return installer;
+	}
+
+
+	/**
+	 * Used when reading the config
+	 * @param allPages NodeList
+	 * @throws ConfigurationException
+	 */
+	private void getPages(Installer installerConfig, NodeList allPages) throws ConfigurationException {
+		ArrayList pages = new ArrayList();
+		for (int i = 0; i < allPages.getLength(); i++) {
+			Element pageElem = (Element) allPages.item(i);
+			Page page = getPageType(pageElem.getAttribute("type"));
+			setProperties(page, pageElem.getAttributes());
+			pages.add(page);
+			getOutputFields(page, pageElem);
+		}
+		Page[] pageArr = new Page[pages.size()];
+		pages.toArray(pageArr);
+		installerConfig.setPages(pageArr);
+	}
+	/**
+	 * Used when reading the config
+	 * @param page Page
+	 * @param pageElem Element
+	 * @throws ConfigurationException
+	 */
+    private void getOutputFields(Page page, Element pageElem) throws ConfigurationException {
+        page.setOutputField( getInnerOutputFields( pageElem ));
+    }
+
+    private OutputField[] getInnerOutputFields( Element elem) throws ConfigurationException {
+         NodeList allFields = elem.getChildNodes();
+         ArrayList fields = new ArrayList();
+         for (int i = 0; i < allFields.getLength(); i++) {
+             if(! (allFields.item(i) instanceof Element))continue;
+             Element fieldElem = (Element)allFields.item(i);
+             OutputField field = getOutputFieldType(fieldElem.getNodeName(), fieldElem);
+             if(field != null){
+                 setProperties(field, fieldElem.getAttributes());
+                 fields.add(field);
+                 field.setResultContainer(installer.getResultContainer());
+             }
+         }
+         OutputField[] fieldArr = new OutputField[fields.size()];
+
+         return (OutputField[])fields.toArray(fieldArr);
+     }
+
+    /**
+	 * Used when reading the config
+	 * @param type String
+	 * @throws ConfigurationException
+	 * @return Page
+	 */
+	private Page getPageType(String type) throws ConfigurationException {
+		if (type.equalsIgnoreCase("license")) {
+			return new LicensePage();
+		}
+		else if (type.equalsIgnoreCase("input")) {
+			return new SimpleInputPage();
+		}
+		else if (type.equalsIgnoreCase("progress")) {
+			return new ProgressPage();
+		}
+		else if (type.equalsIgnoreCase("splash")) {
+			return new SplashPage();
+		}
+		else if (type.equalsIgnoreCase("text")) {
+			return new TextPage();
+		}
+		throw new ConfigurationException("Unknown Page type:" + type);
+	}
+	/**
+	 * Used when reading the config
+	 * @param type String
+	 * @param field Element
+	 * @throws ConfigurationException
+	 * @return InputField
+	 */
+	private OutputField getOutputFieldType(String type, Element field) throws ConfigurationException {
+
+		if (type.equalsIgnoreCase("text")) {
+			return new UnvalidatedTextInput();
+		}
+		else if (type.equalsIgnoreCase("directory")) {
+			return new DirectoryInput();
+		}
+		else if (type.equalsIgnoreCase("target")) {
+			return new TargetInput();
+		}
+		else if (type.equalsIgnoreCase("file")) {
+			return new FileInput();
+		}
+		else if (type.equalsIgnoreCase("comment")) {
+			return new CommentOutput();
+		}
+		else if (type.equalsIgnoreCase("checkbox")) {
+			return new CheckboxInput();
+		}
+		else if (type.equalsIgnoreCase("validated")) {
+			return new ValidatedTextInput();
+		}
+		else if (type.equalsIgnoreCase("ext-validated")) {
+			return new ExtValidatedTextInput();
+		}
+		else if (type.equalsIgnoreCase("password")) {
+			return new PasswordTextInput();
+		}
+		else if (type.equalsIgnoreCase("password-confirm")) {
+			return new ConfirmPasswordTextInput();
+		}
+        else if (type.equalsIgnoreCase("hidden")) {
+             return new HiddenPropertyInput();
+         }
+        else if (type.equalsIgnoreCase("date")) {
+			return new DateInput();
+		}
+		else if (type.equalsIgnoreCase("app-root")) {
+			return new AppRootInput();
+		}
+        else if (type.equalsIgnoreCase("conditional")) {
+            ConditionalField conditionalField = new ConditionalField();
+            OutputField[] outFields = getInnerOutputFields( field );
+            InputField[] inFields = new InputField[ outFields.length ];
+            for( int i = 0; i < outFields.length; i++ ) {
+                inFields[i] = (InputField) outFields[i];
+            }
+            conditionalField.setFields( inFields );
+            return conditionalField;
+        }
+        else if (type.equalsIgnoreCase("select")) {
+			SelectInput sInput = new SelectInput();
+			NodeList allOptions = field.getElementsByTagName("option");
+			ArrayList options = new ArrayList();
+			for (int i = 0; i < allOptions.getLength(); i++) {
+				Element optionElem = (Element) allOptions.item(i);
+				SelectInput.Option option = sInput.getNewOption();
+				option.setText(optionElem.getAttribute("text"));
+				option.value = optionElem.getAttribute("value");
+				options.add(option);
+			}
+			SelectInput.Option[] optionArr = new SelectInput.Option[options.size()];
+			options.toArray(optionArr);
+			sInput.setOptions(optionArr);
+
+			String s = field.getAttribute("useAsLocale");
+			if ( s != null || !s.equals("") ) {
+				sInput.setUseAsLocale(true);
+			}
+
+			return sInput;
+		}
+		else if (type.equalsIgnoreCase("target-select")) {
+			TargetSelectInput sInput = new TargetSelectInput();
+			NodeList allOptions = field.getElementsByTagName("option");
+			ArrayList options = new ArrayList();
+			for (int i = 0; i < allOptions.getLength(); i++) {
+				Element optionElem = (Element) allOptions.item(i);
+				SelectInput.Option option = sInput.getNewOption();
+				option.setText(optionElem.getAttribute("text"));
+				option.value = optionElem.getAttribute("value");
+				options.add(option);
+			}
+			SelectInput.Option[] optionArr = new SelectInput.Option[options.size()];
+			options.toArray(optionArr);
+			sInput.setOptions(optionArr);
+
+			return sInput;
+		}
+		else if (type.equalsIgnoreCase("large-select")) {
+			LargeSelectInput sInput = new LargeSelectInput();
+			NodeList allOptions = field.getElementsByTagName("option");
+			ArrayList options = new ArrayList();
+			for (int i = 0; i < allOptions.getLength(); i++) {
+				Element optionElem = (Element) allOptions.item(i);
+				LargeSelectInput.Option option = sInput.getNewOption();
+				option.setText(optionElem.getAttribute("text"));
+				option.value = optionElem.getAttribute("value");
+				options.add(option);
+			}
+			LargeSelectInput.Option[] optionArr = new LargeSelectInput.Option[options.size()];
+			options.toArray(optionArr);
+			sInput.setOptions(optionArr);
+
+			return sInput;
+		}
+		System.out.println("Unrecognised Input Element:"+type);
+		return null;
+		//throw new ConfigurationException("Unknown Input Field type:" + type);
+	}
+
+
+
+    /**
+	 * Calls bean setter methods based on attribures found. Could use BeanUtils here
+	 * but we want to stay clear of external dependencies.
+	 * @param bean Object
+	 * @param map NamedNodeMap
+	 */
+	private void setProperties(Object bean, NamedNodeMap map) {
+		int numAtts = map.getLength();
+		for (int a = 0; a < numAtts; a++) {
+			Node attribute = map.item(a);
+			String name = attribute.getNodeName();
+			String value = attribute.getNodeValue();
+			String methodName = "set" + Character.toUpperCase(name.charAt(0)) + name.substring(1);
+			Method[] allMethods = bean.getClass().getMethods();
+			for (int m = 0; m < allMethods.length; m++) {
+				if (allMethods[m].getName().equals(methodName)) {
+					try {
+						Class[] parameters = allMethods[m].getParameterTypes();
+						Object[] paramValues;
+						if (parameters[0].equals(Boolean.class)) {
+							paramValues = new Boolean[1];
+							if ( OutputField.isTrue(value) ) {
+								paramValues[0] = Boolean.TRUE;
+							}
+							else {
+								paramValues[0] = Boolean.FALSE;
+							}
+						}
+						else
+						if (parameters[0].equals(Integer.class)) {
+							paramValues = new Integer[1];
+							paramValues[0] = new Integer(value);
+						}
+						else {
+							paramValues = new String[1];
+							paramValues[0] = value;
+						}
+						allMethods[m].invoke(bean, paramValues);
+						continue;
+					}
+					catch (IndexOutOfBoundsException ex) {
+					    // not the setter we are looking for
+                        // this is the wrong overloaded method
+						continue; 
+					}
+					// Ignore reflection errors and continue
+					catch (IllegalArgumentException e) {
+					}
+					catch (IllegalAccessException e) {					
+					}
+					catch (InvocationTargetException e) {						
+					}
+				}
+			}
+		}
+	}
+
+	private static class CustomEntityResolver implements EntityResolver{
+		public InputSource resolveEntity(String publicId, String systemId) {
+			
+			if (publicId.equals("-//tp23 //DTD Ant Installer Config//EN") &&
+				systemId.equals("http://antinstaller.sf.net/dtd/antinstall-config-0.2.dtd")) {
+				InputSource localSrc = new InputSource(this.getClass().getResourceAsStream(
+					"/org/tp23/antinstaller/antinstall-config-0.2.dtd"));
+				return localSrc;
+			}
+			if (publicId.equals("-//tp23 //DTD Ant Installer Config//EN") &&
+				systemId.equals("http://antinstaller.sf.net/dtd/antinstall-config-0.3.dtd")) {
+				InputSource localSrc = new InputSource(this.getClass().getResourceAsStream(
+					"/org/tp23/antinstaller/antinstall-config-0.3.dtd"));
+				return localSrc;
+			}
+			if (publicId.equals("-//tp23 //DTD Ant Installer Config//EN") &&
+				systemId.equals("http://antinstaller.sf.net/dtd/antinstall-config-0.4.dtd")) {
+				InputSource localSrc = new InputSource(this.getClass().getResourceAsStream(
+					"/org/tp23/antinstaller/antinstall-config-0.4.dtd"));
+				return localSrc;
+			}
+			if (publicId.equals("-//tp23 //DTD Ant Installer Config//EN") &&
+				systemId.equals("http://antinstaller.sf.net/dtd/antinstall-config-0.5.dtd")) {
+				InputSource localSrc = new InputSource(this.getClass().getResourceAsStream(
+					"/org/tp23/antinstaller/antinstall-config-0.5.dtd"));
+				return localSrc;
+			}
+			if (publicId.equals("-//tp23 //DTD Ant Installer Config//EN") &&
+				systemId.equals("http://antinstaller.sf.net/dtd/antinstall-config-0.6.dtd")) {
+				InputSource localSrc = new InputSource(this.getClass().getResourceAsStream(
+					"/org/tp23/antinstaller/antinstall-config-0.6.dtd"));
+				return localSrc;
+			}
+			if (publicId.equals("-//tp23 //DTD Ant Installer Config//EN") &&
+				systemId.equals("http://antinstaller.sf.net/dtd/antinstall-config-0.7.dtd")) {
+				InputSource localSrc = new InputSource(this.getClass().getResourceAsStream(
+					"/org/tp23/antinstaller/antinstall-config-0.7.dtd"));
+				return localSrc;
+			}
+			if (publicId.equals("-//tp23 //DTD Ant Installer Config//EN") &&
+				systemId.equals("http://antinstaller.sf.net/dtd/antinstall-config-0.8.dtd")) {
+				InputSource localSrc = new InputSource(this.getClass().getResourceAsStream(
+					"/org/tp23/antinstaller/antinstall-config-0.8.dtd"));
+				return localSrc;
+			}
+			else {
+				return null;
+			}
+		}
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/PropertyLoaderFilter.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/PropertyLoaderFilter.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/PropertyLoaderFilter.java	(revision 21851)
@@ -0,0 +1,416 @@
+/*
+ * Licensed 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
+ * limiations under the License.
+ */
+
+package org.tp23.antinstaller.runtime.exe;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+import java.util.ResourceBundle;
+import java.util.StringTokenizer;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.Installer;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.PropertiesFileRenderer;
+import org.tp23.antinstaller.input.ConditionalField;
+import org.tp23.antinstaller.input.InputField;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.input.PasswordTextInput;
+import org.tp23.antinstaller.input.TargetInput;
+import org.tp23.antinstaller.input.TargetSelectInput;
+import org.tp23.antinstaller.page.Page;
+import org.tp23.antinstaller.runtime.VersionHelper;
+import org.tp23.antinstaller.runtime.exe.ExecuteRunnerFilter.AbortException;
+
+/**
+ * Loads properties from a file of default properties if found.
+ * the Installer element should define an attribute
+ * loadDefaults with one of the following values.
+ * <li>false - do not look for defaults</li>
+ * <li>prompt - look for properties and ask if they should be used if found</li>
+ * <li>load - look for defaults if found load them</li>
+ * <li>prompt-auto - wierd case where installer permits zero user interaction running only from antinstaller-config.xml defaults</li>
+ * 
+ * N.B. this is not a generic property loader but one specifically for properties files
+ * generated by a previous run of an identical installer or one that according to the version
+ * number is compatible, see PropertyTask for loading other property sets
+ * FIXME i18n for AbortExceptoins
+ * @author teknopaul
+ *
+ */
+public class PropertyLoaderFilter implements ExecuteFilter {
+	
+	public static final String LOAD = "true";
+	public static final String PROMPT = "prompt";
+	public static final String PROMPT_AUTO = "prompt-auto";
+	public static final String FALSE = "false";
+    public static final String DEFAULT_PROPERTIES_FILE_PROPERTY = "antinstaller.properties";
+
+    private final String fileNameProperty;
+
+    private int definedPropertiesCount;
+
+    /**
+     * Default constructor required for an ExecuteFilter implementation.
+     * The default property name given by @see{DEFAULT_PROPERTIES_FILE_PROPERTY}
+     * is used with this constructor
+     */
+    public PropertyLoaderFilter() {
+        this( DEFAULT_PROPERTIES_FILE_PROPERTY );
+    }
+
+    /**
+     * Constructor that allows the name of the property containg the properties file
+     * to be specified
+     *
+     * @param fileNameProperty property containing the name of file
+     */
+    public PropertyLoaderFilter( final String fileNameProperty ) {
+        this.fileNameProperty = fileNameProperty;
+    }
+
+    /**
+     * Execute the filter action - in this case pre-setting InputField values
+     * with values loaded from a properties file (if present)
+     *
+     * @see org.tp23.antinstaller.runtime.exe.ExecuteFilter
+     * @param ctx context data
+     * @throws InstallException if an error occurred loading pre-defined properties
+     */
+    public void exec(InstallerContext ctx) throws InstallException {
+
+		Installer installer = ctx.getInstaller();
+		String loadDefaults = installer.getLoadDefaults();
+		if(installer.isVerbose()) {
+			ctx.log("loadDefaults attribute:" + loadDefaults);
+		}
+		boolean load = false;
+		if(loadDefaults == null || FALSE.equals(loadDefaults)) {
+			if(installer.isVerbose()) {
+				ctx.log("Not loading defaults");
+			}
+			return;
+		}
+		
+        ctx.log( "Checking for predefined properties");
+        Properties predefinedProps = loadPredefinedProperties( ctx, fileNameProperty );
+
+        definedPropertiesCount = predefinedProps.size();
+
+        boolean foundProps = false;
+        if( definedPropertiesCount == 0 ) {
+            ctx.log( "No predefined properties");
+        }
+        else{
+        	foundProps = true;
+        }
+
+		if( foundProps && PROMPT.equals(loadDefaults) ) {
+			load = ctx.getMessageRenderer().prompt(org.tp23.antinstaller.Installer.langPack.getString("promptLoadDefaults"));
+		}
+		else if( foundProps && PROMPT_AUTO.equals(loadDefaults)) {
+			load = ctx.getMessageRenderer().prompt(org.tp23.antinstaller.Installer.langPack.getString("promptLoadDefaults"));
+		}
+		else if( foundProps && LOAD.equals(loadDefaults) ) {
+			load = true;
+		}
+		
+		if( (!foundProps || !load) && 
+				ctx.isAutoBuild() && 
+				PROMPT.equals(loadDefaults) ) {
+			ctx.log( "Cant run -auto install without properties");
+			throw new AbortException("Install Aborted: cant load ant.install.properties");
+		}
+
+		if(load) {
+			if(installer.isVerbose()) {
+				ctx.log("Loading defaults");
+			}
+            
+            // version control
+            String propertiesVersion = predefinedProps.getProperty(PropertiesFileRenderer.INSTALLER_VERSION_PROPERTY);
+            String configVersion = ctx.getInstaller().getVersion();
+            if(propertiesVersion != null) {
+                VersionHelper helper = new VersionHelper();
+                if( ( ! propertiesVersion.equals(configVersion)) && 
+                        helper.equalOrHigher(configVersion , propertiesVersion) ) {
+                    
+                    // let major versions pass but prompt for differences
+                    if( (! ctx.isAutoBuild()) && helper.majorVersionCompatible(configVersion , propertiesVersion) ){
+                        if( ! ctx.getMessageRenderer().prompt(org.tp23.antinstaller.Installer.langPack.getString("propertiesVersionMismatch")) ){
+                            throw new AbortException("Install Aborted: existing configuration is not compatible, config version: " + configVersion);
+                        }
+                    }
+                    else {
+                        throw new AbortException("Install Aborted: existing configuration is not compatible, config version: " + configVersion);
+                    }
+                }
+                
+            }
+            else {
+                throw new AbortException("Install Aborted: local ant.install.properties missing config version, must be equal or lower than: " + configVersion);
+            }
+            // end version control
+
+            Page[] allPages = installer.getPages();
+            handleDefaults( ctx, allPages, predefinedProps );
+
+		}
+	}
+
+    /*
+     * Use the supplied properties to pre-populate the page fields
+     */
+	private void handleDefaults( InstallerContext ctx, Page[] allPages, Properties props ) throws InstallException {
+		for( int i = 0; i < allPages.length; i++ ) {
+            OutputField[] fields = allPages[i].getOutputField();
+            setInputValues( ctx, allPages[i], fields, props );
+        }
+    }
+
+    private void setInputValues( InstallerContext ctx, Page page, OutputField[] outputFields, Properties props )
+            throws InstallException {
+        //Should never happen, but guard against it
+        if( outputFields == null ) {
+            return;
+        }
+
+        // find relevant targets
+        String targets = props.getProperty(page.getName() + PropertiesFileRenderer.TARGETS_SUFFIX);
+        List targetsList = splitTargets(targets);
+
+        for (int j = 0; j < outputFields.length; j++) {
+            OutputField field = outputFields[j];
+
+            if( field instanceof ConditionalField )  {
+                ConditionalField condField = (ConditionalField) field;
+                setInputValues( ctx, page, condField.getFields(), props );
+            }
+            else if( field instanceof InputField ) {
+                InputField input = (InputField)field;
+                String propName = input.getProperty();
+                if( props.containsKey( propName ) ) {
+                    String value = props.getProperty(propName);
+
+                    if( ctx.getInstaller().isDebug() ) {
+                           ctx.log( "Setting " + propName + "=" + value );
+                    }
+
+                    input.setDefaultValue(value); // does not evaluate references
+                    input.setInputResult(value);
+                    input.setEditted( true );
+
+                    if(field instanceof PasswordTextInput) {
+                        if(value == null ){
+                            ctx.getMessageRenderer().printMessage(org.tp23.antinstaller.Installer.langPack.getString("promptMissingDefaultPassword"));
+
+                        }
+                    }
+
+                    // TARGET TYPES
+                    if(field instanceof TargetInput) {
+                        // Target and SelectTarget
+                        TargetInput tgtInput = (TargetInput)field;
+                        page.removeTarget(tgtInput.getIdx());
+                        // if target was selected
+                        if( ! InputField.isFalse(value)) {
+                            page.addTarget(tgtInput.getIdx(), tgtInput.getTarget()); // returns the OS specific suffix if relevant
+                            // DEBUG
+                            if( ! targetsList.contains(tgtInput.getTarget()) ){ 
+                                // could be caused by someone trying to copy a file across platforms (not a good idea)
+                                ctx.log("Defaults error: targets list for page " + page.getName()
+                                        + " should contain a TargetInput that was true");
+                            }
+                        }
+                        else {
+                            if(InputField.isTrue( tgtInput.getForce()) ) {
+                                String msg = "Defaults error: forced target for page " + page.getName()
+                                + " has been removed";
+                                ctx.log(msg);
+                                throw new InstallException(msg);
+                            }
+                        }
+                    }
+                    if(field instanceof TargetSelectInput) {
+                        TargetSelectInput tgtInput = (TargetSelectInput)field;
+                        page.removeTarget(tgtInput.getIdx());
+                        // one target must be selected (what if the page was not shown??)
+                        page.addTarget(tgtInput.getIdx(), value);
+                    }
+                }
+            }
+            //TODO: Should properties that are present in properties file but which do not appear
+            //      as an InputField be set in the ResultContainer so that they can be used by later
+            //      "if" conditions? - no other properties should be loaded separately from additional
+            //      resource files if there is a requirement for that using an postDisplayTarget - PH
+        }
+
+        //Page targets should be handled by the config loader process and indexed correctly
+        List pageTargets = page.getTargets(ctx);
+        Iterator iter = targetsList.iterator();
+        while (iter.hasNext()) {
+            String targetPerProps = (String) iter.next();
+            if( ! pageTargets.contains(targetPerProps)) {
+                ctx.log("Defaults warning: targets list for page " + page.getName()
+                        + " should contain " + targetPerProps);
+            }
+        }
+
+    }
+
+    /**
+     * Check if external properties have been loaded
+     *
+     * @return <code>true</code> if an external properties file was configured and contained
+     *       at least one property
+     */
+    protected boolean isPropertiesLoaded() {
+        return (definedPropertiesCount > 0);
+    }
+
+    /*
+     * Primarily for unit testing
+     */
+    int getPropertiesFoundCount() {
+        return definedPropertiesCount;
+    }
+
+    /**
+     * Load properties from a properties file if present.
+     * The name of the properties file is checked for in the following order.
+     * <p>
+     * If the parameter fileNamePropertyName is not null:
+     * <ul>
+     * <li>the environment is checked for an environmentvariable with that name</li>
+     * <li>java system properties are checked for a property with that name</li>
+     * </ul>
+     * If the file name has not been found, or if <code>fileNamePropertyName == null</code>
+     * then the default file name is used - @see{org.tp23.antinstaller.PropertiesFileRenderer#PROPERTIES_FILE_NAME}
+     *
+     * @param context installer context
+     * @param fileNamePropertyName name of environment variable or java system property containing the
+     *                             name of the properties file to be loaded or <code>null</code>
+     * @return properties
+     * @throws InstallException if the properties file is missing or an error occurs loading it
+     */
+    private Properties loadPredefinedProperties( final InstallerContext context,
+                                                 final String           fileNamePropertyName )
+            throws InstallException {
+
+        Properties contextProps = InstallerContext.getEnvironment();
+        String propertiesFileName = null;
+        boolean failSilently = true;
+
+        if( fileNamePropertyName != null ) {
+            propertiesFileName = contextProps.getProperty( InstallerContext.ENV_PREFIX + fileNamePropertyName );
+
+            if( propertiesFileName == null ) {
+                propertiesFileName =
+                        contextProps.getProperty( InstallerContext.JAVA_PREFIX + fileNamePropertyName );
+            }
+
+            if( propertiesFileName != null ) {
+                //Properties have been passed explicitly to installer so must load them
+                failSilently = false;
+            }
+        }
+
+        if( propertiesFileName == null ) {
+            propertiesFileName = PropertiesFileRenderer.PROPERTIES_FILE_NAME;
+        }
+
+        Properties definedProperties = new Properties( );
+
+        if( propertiesFileName != null ) {
+            File definedPropertiesFile = new File( propertiesFileName );
+            context.log( "Loading pre-defined properties from file "
+                           + definedPropertiesFile.getAbsolutePath());
+
+            //TODO: Support loading properties file from via classloader as a resource
+            try {
+                FileInputStream istream = new FileInputStream( definedPropertiesFile );
+                definedProperties.load( istream );
+                istream.close();
+            }
+            catch( FileNotFoundException fnfExc ) {
+                if( !failSilently ) {
+                    throw new InstallException( "Defined properties file "
+                                                + definedPropertiesFile.getAbsolutePath()
+                                                + " doesn't exist" );
+                }
+            }
+            catch( IOException ioExc ) {
+                if( !failSilently ) {
+                    throw new InstallException( "Unable to read contents of defined properties file "
+                                                 + definedPropertiesFile.getAbsolutePath(),
+                                                ioExc );
+                }
+            }
+
+            if( context.getInstaller().isDebug() ) {
+                logPropertiesLoaded( context, definedProperties, definedPropertiesFile );
+            }
+
+        }
+
+        return definedProperties;
+    }
+
+
+    // Debug - log properties loaded
+    private void logPropertiesLoaded( final InstallerContext context,
+                                      final Properties properties,
+                                      final File propertiesFile ) {
+        Iterator iterator = properties.keySet().iterator();
+        context.log( "Predefined properties ("
+                        + definedPropertiesCount
+                        + ") loaded from "
+                        + propertiesFile.getAbsolutePath()
+                        + "..." );
+        while( iterator.hasNext() ) {
+            String key = (String) iterator.next();
+            context.log( key + "=" + properties.getProperty( key ) );
+        }
+    }
+
+	/*
+	 * Could do a String.split(",") but want to avoid 1.4 specific stuff generally
+	 * @param commaSeparated
+	 * @return
+	 */
+	private List splitTargets(String commaSeparated) {
+		if(commaSeparated == null) {
+			return Collections.EMPTY_LIST;
+		}
+		StringTokenizer st = new StringTokenizer(commaSeparated, ",");
+		List targets = new ArrayList();
+		while (st.hasMoreElements()) {
+			String element = st.nextToken();
+			if(element != null){
+				element = element.trim();
+				if(element.length() > 0){
+					targets.add(element.trim());
+				}
+			}
+		}
+		return targets;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/PropertyPrinterFilter.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/PropertyPrinterFilter.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/PropertyPrinterFilter.java	(revision 21851)
@@ -0,0 +1,83 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime.exe;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.tp23.antinstaller.DefaultPropertiesFileRenderer;
+import org.tp23.antinstaller.ExplicitPropertiesFileRenderer;
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.PropertiesFileRenderer;
+import org.tp23.antinstaller.input.ResultContainer;
+
+
+/**
+ * @author Paul Hinds
+ * @version $Id: PropertyPrinterFilter.java,v 1.5 2006/12/28 00:57:53 teknopaul Exp $
+ */
+public class PropertyPrinterFilter implements ExecuteFilter {
+
+	/**
+	 * @see org.tp23.antinstaller.runtime.exe.ExecuteFilter#exec(org.tp23.antinstaller.InstallerContext)
+	 */
+	public void exec(InstallerContext ctx) throws InstallException {
+		ResultContainer results = ctx.getInstaller().getResultContainer();
+		results.setProperty(PropertiesFileRenderer.FILE_ROOT_PROPERTY,
+							ctx.getFileRoot().getAbsolutePath());
+
+        printProperties(ctx);
+		
+		if(ctx.getInstaller().isVerbose()){
+			ctx.log("Properties printed:" + ctx.getFileRoot().getAbsolutePath() 
+                    + File.separatorChar + PropertiesFileRenderer.PROPERTIES_FILE_NAME);
+		}
+	}
+	/**
+	 *
+	 * @param installer Installer
+	 * @throws IOException
+	 */
+	private void printProperties(InstallerContext ctx) {
+		PropertiesFileRenderer propRenderer;
+		if(ctx.getInstaller().isVerbose()){
+			propRenderer = new ExplicitPropertiesFileRenderer();
+		}
+		else{
+			propRenderer = new DefaultPropertiesFileRenderer();
+		}
+		// render properties for reuse in auto builds
+		File currentDir = new File(".");
+        ctx.log("auto build supported: " + ctx.getInstaller().supportsAutoBuild());
+        boolean alreadyWritten = false;
+		if(currentDir.canWrite() && ctx.getInstaller().supportsAutoBuild()){
+            if(ctx.getInstaller().isVerbose()){
+                try {
+                    ctx.log("Rendering properties in the current directory: " + currentDir.getCanonicalPath());
+                } catch (IOException e) {
+                    // oh well never mind
+                }
+            }
+			propRenderer.renderProperties(ctx, currentDir);
+            alreadyWritten = true;
+		}
+		if( ! currentDir.equals(ctx.getFileRoot()) || !alreadyWritten){
+			propRenderer.renderProperties(ctx, ctx.getFileRoot());
+		}
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/nonextractor.fconfig
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/nonextractor.fconfig	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/nonextractor.fconfig	(revision 21851)
@@ -0,0 +1,11 @@
+#
+# Default config for the NonExtractor
+#
+org.tp23.antinstaller.runtime.exe.CreateLoggerFilter
+org.tp23.antinstaller.runtime.exe.InputStreamLoadConfigFilter
+org.tp23.antinstaller.runtime.exe.CreateUIFilter
+org.tp23.antinstaller.runtime.exe.PropertyLoaderFilter
+org.tp23.antinstaller.runtime.exe.ExecuteRunnerFilter
+org.tp23.antinstaller.runtime.exe.PropertyPrinterFilter
+org.tp23.antinstaller.runtime.exe.AntProjectFilter
+org.tp23.antinstaller.runtime.exe.FinalizerFilter
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/script.fconfig
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/script.fconfig	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/script.fconfig	(revision 21851)
@@ -0,0 +1,11 @@
+#
+# Default config for the Install started with a script
+#
+org.tp23.antinstaller.runtime.exe.CreateLoggerFilter
+org.tp23.antinstaller.runtime.exe.LoadConfigFilter
+org.tp23.antinstaller.runtime.exe.CreateUIFilter
+org.tp23.antinstaller.runtime.exe.PropertyLoaderFilter
+org.tp23.antinstaller.runtime.exe.ExecuteRunnerFilter
+org.tp23.antinstaller.runtime.exe.PropertyPrinterFilter
+org.tp23.antinstaller.runtime.exe.AntLauncherFilter
+org.tp23.antinstaller.runtime.exe.FinalizerFilter
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/selfextractor.fconfig
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/selfextractor.fconfig	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/selfextractor.fconfig	(revision 21851)
@@ -0,0 +1,11 @@
+#
+# Default config for the SelfExtractor
+#
+org.tp23.antinstaller.runtime.exe.CreateLoggerFilter
+org.tp23.antinstaller.runtime.exe.LoadConfigFilter
+org.tp23.antinstaller.runtime.exe.CreateUIFilter
+org.tp23.antinstaller.runtime.exe.PropertyLoaderFilter
+org.tp23.antinstaller.runtime.exe.ExecuteRunnerFilter
+org.tp23.antinstaller.runtime.exe.PropertyPrinterFilter
+org.tp23.antinstaller.runtime.exe.AntLauncherFilter
+org.tp23.antinstaller.runtime.exe.FinalizerFilter
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/CompoundExpression.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/CompoundExpression.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/CompoundExpression.java	(revision 21851)
@@ -0,0 +1,38 @@
+/*
+ * Licensed 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.
+ */
+
+package org.tp23.antinstaller.runtime.logic;
+
+/**
+ * @author mwilson
+ * @version $Id: CompoundExpression.java,v 1.1 2006/09/08 19:16:22
+ *          anothermwilson Exp $
+ * @since 0.7.4 patch 2
+ */
+public class CompoundExpression implements Expression {
+
+	private Expression expression1;
+	private LogicalTest test;
+	private Expression expression2;
+
+	public CompoundExpression(Expression expr1, final LogicalTest logicalTest, Expression expr2) {
+		this.expression1 = expr1;
+		this.expression2 = expr2;
+		this.test = logicalTest;
+	}
+
+	public boolean evaluate() {
+		return test.getTestResult(expression1, expression2);
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/EndsWithTest.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/EndsWithTest.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/EndsWithTest.java	(revision 21851)
@@ -0,0 +1,33 @@
+/*
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime.logic;
+
+/**
+ * @author mwilson
+ * @version $Id: EndsWithTest.java,v 1.2 2006/12/21 00:03:18 teknopaul Exp $
+ * @since 0.7.4 patch 2
+ */
+public class EndsWithTest extends ValuesTest {
+	
+	private static final String[] TEST_TOKENS = { "$=" };
+
+	public String[] getTestTokens() {
+		return TEST_TOKENS;
+	}
+
+	protected boolean getTestResult(final String value, final String expectedValue) {
+		return (value != null) && value.endsWith(expectedValue);
+
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/EqualsTest.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/EqualsTest.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/EqualsTest.java	(revision 21851)
@@ -0,0 +1,42 @@
+/*
+ * Licensed 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.
+ */
+
+package org.tp23.antinstaller.runtime.logic;
+
+/**
+ * @author mwilson
+ * @version $Id: EqualsTest.java,v 1.2 2006/12/21 00:03:18 teknopaul Exp $
+ * @since 0.7.4 patch 2
+ */
+public class EqualsTest extends ValuesTest {
+
+	private static final String[] TEST_TOKENS = { "==", "=" };
+
+	public String[] getTestTokens() {
+		return TEST_TOKENS;
+	}
+
+	protected boolean getTestResult(final String propValue, final String expectedValue) {
+		// Where the expected value is null, empty string must also match
+		if (expectedValue == null) {
+			return (propValue == null) || propValue.equals("");
+		}
+
+		if ((propValue != null) && propValue.equals(expectedValue)) {
+			return true;
+		}
+
+		return false;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/Expression.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/Expression.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/Expression.java	(revision 21851)
@@ -0,0 +1,25 @@
+/*
+ * Licensed 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.
+ */
+
+package org.tp23.antinstaller.runtime.logic;
+
+/**
+ * @author mwilson
+ * @version $Id: Expression.java,v 1.2 2006/12/21 00:03:18 teknopaul Exp $
+ * @since 0.7.4 patch 2
+ */
+
+public interface Expression {
+	public boolean evaluate();
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/ExpressionBuilder.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/ExpressionBuilder.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/ExpressionBuilder.java	(revision 21851)
@@ -0,0 +1,211 @@
+/*
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime.logic;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.tp23.antinstaller.input.ResultContainer;
+import org.tp23.antinstaller.runtime.ConfigurationException;
+
+/**
+ * @author mwilson
+ * @version $Id: ExpressionBuilder.java,v 1.2 2006/12/21 00:03:18 teknopaul Exp $
+ * @since 0.7.4 patch 2
+ */
+public class ExpressionBuilder {
+	private static final int GROUPING_START_OPERATOR = '(';
+
+	private static final int GROUPING_END_OPERATOR = ')';
+
+	private static final ValuesTest[] testValueConditions = { 
+		new EndsWithTest(), 
+		new EqualsTest(), 
+		new GreaterThanOrEqualsTest(),
+		new LessThanOrEqualsTest(), 
+		new NotEqualsTest(), 
+		new StartsWithTest() 
+	};
+
+	private static final LogicalTest[] testLogicalConditions = { 
+		new LogicalAndTest(), 
+		new LogicalOrTest() 
+	};
+
+	private static final SingleExpressionTest SINGLE_EXPRESSION_TEST = new SingleExpressionTest();
+
+	private static Map tokenMap = new HashMap();
+
+	private static String[] valueTokens;
+
+	private static String[] logicalTokens;
+
+	static {
+		for (int i = 0; i < testValueConditions.length; i++) {
+			String[] tmpTokens = testValueConditions[i].getTestTokens();
+			for (int j = 0; j < tmpTokens.length; j++) {
+				tokenMap.put(tmpTokens[j], testValueConditions[i]);
+			}
+		}
+
+		valueTokens = new String[tokenMap.size()];
+		int index = 0;
+		for (int i = 0; i < testValueConditions.length; i++) {
+			String[] tmpTokens = testValueConditions[i].getTestTokens();
+			for (int j = 0; j < tmpTokens.length; j++) {
+				valueTokens[index++] = tmpTokens[j];
+			}
+		}
+
+		Comparator lengthComparator = new StringLengthComparator();
+
+		//Have to sort so that longest test operator is checked for first
+		Arrays.sort(valueTokens, lengthComparator);
+
+		index = 0;
+		final int mapInitialSize = tokenMap.size();
+
+		for (int i = 0; i < testLogicalConditions.length; i++) {
+			String[] tmpTokens = testLogicalConditions[i].getTestTokens();
+			for (int j = 0; j < tmpTokens.length; j++) {
+				tokenMap.put(tmpTokens[j], testLogicalConditions[i]);
+			}
+		}
+
+		logicalTokens = new String[tokenMap.size() - mapInitialSize];
+		for (int i = 0; i < testLogicalConditions.length; i++) {
+			String[] tmpTokens = testLogicalConditions[i].getTestTokens();
+			for (int j = 0; j < tmpTokens.length; j++) {
+				logicalTokens[index++] = tmpTokens[j];
+			}
+		}
+
+		Arrays.sort(logicalTokens, lengthComparator);
+
+	}
+
+	public static Expression parseLogicalExpressions(ResultContainer container, String exprStr) throws ConfigurationException {
+		int startIndex = skipWhiteSpace(exprStr, 0);
+		int index = exprStr.indexOf(GROUPING_START_OPERATOR, startIndex);
+
+		if (index == -1) {
+			return getSimpleExpression(container, exprStr.substring(startIndex));
+		}
+
+		if (index != 0) {
+			throw new ConfigurationException("Illegal ifProperty value: If present, grouping operator " + GROUPING_START_OPERATOR
+					+ " must be at start of property string");
+		}
+
+		++startIndex; //Skip over grouping operator
+
+		int endIndex = exprStr.indexOf(GROUPING_END_OPERATOR, startIndex);
+
+		if (endIndex == -1) {
+			throw new ConfigurationException("Missing closing grouping bracket " + GROUPING_END_OPERATOR + " in expression " + exprStr);
+		}
+
+		//Check that this isn't an attempt tu use nested logical tests - not supported
+		int tstIndex = exprStr.indexOf(GROUPING_START_OPERATOR, startIndex);
+		if ((tstIndex != -1) && (tstIndex < endIndex)) {
+			throw new ConfigurationException("Nesting of logical operations is not supported: " + exprStr);
+		}
+
+		try {
+			Expression expr1 = parseLogicalExpressions(container, exprStr.substring(startIndex, endIndex));
+
+			LogicalTest test = null;
+
+			startIndex = endIndex + 1;
+
+			//Look for logical operator token
+			String logicalToken = getLogicalToken(exprStr, startIndex);
+
+			for (int i = 0; i < logicalTokens.length; i++) {
+
+				if (logicalTokens[i].compareTo(logicalToken) == 0) {
+					test = (LogicalTest) tokenMap.get(logicalTokens[i]);
+					index = exprStr.indexOf(logicalTokens[i], startIndex);
+					startIndex = index + logicalTokens[i].length();
+					break;
+				}
+			}
+
+			if (test == null) {
+				return new CompoundExpression(expr1, SINGLE_EXPRESSION_TEST, null);
+			} else {
+				startIndex = skipWhiteSpace(exprStr, startIndex);
+				String expr2Str = exprStr.substring(startIndex, exprStr.length());
+				return new CompoundExpression(expr1, test, parseLogicalExpressions(container, expr2Str));
+
+			}
+		} catch (Exception e) {
+			throw new ConfigurationException("Invalid ifProperty expression");
+		}
+	}
+
+	private static Expression getSimpleExpression(ResultContainer resultContainer, String exprStr) throws ConfigurationException {
+		try {
+			int index = -1;
+			int i;
+
+			for (i = 0; i < valueTokens.length; i++) {
+				index = exprStr.indexOf(valueTokens[i]);
+
+				if (index != -1) {
+					break;
+				}
+			}
+
+			return new SimpleExpression(resultContainer, exprStr.substring(0, index), (ValuesTest) tokenMap.get(valueTokens[i]), exprStr
+					.substring(index + valueTokens[i].length()));
+		} catch (Exception e) { // can be StringIndexOutOfBoundsException - PH
+			throw new ConfigurationException("Invalid ifProperty expression");
+		}
+	}
+
+	private static int skipWhiteSpace(final String str, final int startIndex) {
+		final int strLen = str.length();
+		int index = startIndex;
+
+		while (index < strLen) {
+			if ((str.charAt(index) != ' ') && (str.charAt(index) != '\t')) {
+				break;
+			}
+
+			++index;
+		}
+
+		return index;
+	}
+
+	private static String getLogicalToken(final String str, final int startIndex) {
+		final int strLen = str.length();
+		int tokenStart = skipWhiteSpace(str, startIndex);
+		int endIndex = tokenStart;
+
+		while (endIndex < strLen) {
+			int chr = str.charAt(endIndex);
+			if ((chr == ' ') || (chr == '\t') || (chr == GROUPING_START_OPERATOR)) {
+				break;
+			}
+
+			++endIndex;
+		}
+
+		return str.substring(tokenStart, endIndex);
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/GreaterThanOrEqualsTest.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/GreaterThanOrEqualsTest.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/GreaterThanOrEqualsTest.java	(revision 21851)
@@ -0,0 +1,33 @@
+/*
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime.logic;
+
+/**
+ * @author mwilson
+ * @version $Id: GreaterThanOrEqualsTest.java,v 1.1 2006/09/08 19:16:27
+ *          anothermwilson Exp $
+ * @since 0.7.4 patch 2
+ */
+public class GreaterThanOrEqualsTest extends ValuesTest {
+	
+	private static final String[] TEST_TOKENS = { "+=" };
+
+	public String[] getTestTokens() {
+		return TEST_TOKENS;
+	}
+
+	protected boolean getTestResult(final String value1, final String value2) {
+		return Double.parseDouble(value1) >= Double.parseDouble(value2);
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LessThanOrEqualsTest.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LessThanOrEqualsTest.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LessThanOrEqualsTest.java	(revision 21851)
@@ -0,0 +1,33 @@
+/*
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime.logic;
+
+/**
+ * @author mwilson
+ * @version $Id: LessThanOrEqualsTest.java,v 1.1 2006/09/08 19:16:27
+ *          anothermwilson Exp $
+ * @since 0.7.4 patch 2
+ */
+public class LessThanOrEqualsTest extends ValuesTest {
+	
+	private static final String[] TEST_TOKENS = { "-=" };
+
+	public String[] getTestTokens() {
+		return TEST_TOKENS;
+	}
+
+	protected boolean getTestResult(final String value1, final String value2) {
+		return Double.parseDouble(value1) <= Double.parseDouble(value2);
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LiteralValue.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LiteralValue.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LiteralValue.java	(revision 21851)
@@ -0,0 +1,38 @@
+/*
+ * Licensed 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.
+ */
+
+package org.tp23.antinstaller.runtime.logic;
+
+/**
+ * @author mwilson
+ * @version $Id: LiteralValue.java,v 1.2 2006/12/21 00:03:18 teknopaul Exp $
+ * @since 0.7.4 patch 2
+ */
+public class LiteralValue implements Value {
+	
+	public static final String NULL = "null";
+	private final String value;
+
+	public LiteralValue(final String value) {
+		if ((value != null) && (value.equals(NULL))) {
+			this.value = null;
+		} else {
+			this.value = value;
+		}
+	}
+
+	public String getValue() {
+		return value;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LogicalAndTest.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LogicalAndTest.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LogicalAndTest.java	(revision 21851)
@@ -0,0 +1,41 @@
+/*
+ * Licensed 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.
+ */
+
+package org.tp23.antinstaller.runtime.logic;
+
+/**
+ * @author mwilson
+ * @version $Id: LogicalAndTest.java,v 1.1 2006/09/08 19:16:28 anothermwilson
+ *          Exp $
+ * @since 0.7.4 patch 2
+ */
+public class LogicalAndTest implements LogicalTest {
+
+	private static final String[] TEST_TOKENS = { "&&", "AND" };
+
+	public String[] getTestTokens() {
+		return TEST_TOKENS;
+	}
+
+	public boolean getTestResult(Expression expression1, Expression expression2) {
+
+		boolean result = false;
+
+		if (expression1 != null && expression2 != null) {
+			result = expression1.evaluate() && expression2.evaluate();
+		}
+
+		return result;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LogicalOrTest.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LogicalOrTest.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LogicalOrTest.java	(revision 21851)
@@ -0,0 +1,43 @@
+/*
+ * Licensed 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.
+ */
+
+package org.tp23.antinstaller.runtime.logic;
+
+/**
+ * @author mwilson
+ * @version $Id: LogicalOrTest.java,v 1.2 2006/12/21 00:03:18 teknopaul Exp $
+ * @since 0.7.4 patch 2
+ */
+public class LogicalOrTest implements LogicalTest {
+	
+	private static final String[] TEST_TOKENS = { "||", "OR" };
+
+	public String[] getTestTokens() {
+		return TEST_TOKENS;
+	}
+
+	public boolean getTestResult(Expression expression1, Expression expression2) {
+		boolean isTrue = false;
+
+		if (expression1 != null) {
+			isTrue = expression1.evaluate();
+		}
+		if (!isTrue && (expression2 != null)) {
+			isTrue = expression2.evaluate();
+		}
+
+		return isTrue;
+
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LogicalTest.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LogicalTest.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LogicalTest.java	(revision 21851)
@@ -0,0 +1,27 @@
+/*
+ * Licensed 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.
+ */
+
+package org.tp23.antinstaller.runtime.logic;
+
+/**
+ * @author mwilson
+ * @version $Id: LogicalTest.java,v 1.2 2006/12/21 00:03:18 teknopaul Exp $
+ * @since 0.7.4 patch 2
+ */
+
+public interface LogicalTest extends TestOperator {
+	
+	public boolean getTestResult(Expression expression1, Expression expression2);
+	
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/NotEqualsTest.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/NotEqualsTest.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/NotEqualsTest.java	(revision 21851)
@@ -0,0 +1,38 @@
+/*
+ * Licensed 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.
+ */
+
+package org.tp23.antinstaller.runtime.logic;
+
+/**
+ * @author mwilson
+ * @version $Id: NotEqualsTest.java,v 1.2 2006/12/21 00:03:18 teknopaul Exp $
+ * @since 0.7.4 patch 2
+ */
+public class NotEqualsTest extends ValuesTest {
+	
+	private static final String[] TEST_TOKENS = { "!=" };
+
+	public String[] getTestTokens() {
+		return TEST_TOKENS;
+	}
+
+	protected boolean getTestResult(final String propValue, final String expectedValue) {
+		if (expectedValue == null) {
+			return propValue != null && !propValue.equals("");
+		}
+
+		return (propValue == null) || !propValue.equals(expectedValue);
+
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/SimpleExpression.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/SimpleExpression.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/SimpleExpression.java	(revision 21851)
@@ -0,0 +1,68 @@
+/*
+ * Licensed 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.
+ */
+
+package org.tp23.antinstaller.runtime.logic;
+
+import org.tp23.antinstaller.input.ResultContainer;
+import org.tp23.antinstaller.runtime.ConfigurationException;
+
+/**
+ * @author mwilson
+ * @version $Id: SimpleExpression.java,v 1.1 2006/09/08 19:16:30 anothermwilson
+ *          Exp $
+ * @since 0.7.4 patch 2
+ */
+public class SimpleExpression implements Expression {
+
+	private final Value value1;
+	private final ValuesTest testCondition;
+	private final Value value2;
+	private final String literalValue1;
+	private final String literalValue2;
+
+	public SimpleExpression(
+				final ResultContainer resultContainer, 
+				final String value1, 
+				final ValuesTest test, 
+				final String value2)
+			throws ConfigurationException {
+		
+		this.literalValue1 = value1;
+		this.value1 = getValue(resultContainer, value1);
+		this.testCondition = test;
+		this.literalValue2 = value2;
+		this.value2 = getValue(resultContainer, value2);
+		
+	}
+
+	public boolean evaluate() {
+		return testCondition.getTestResult(value1, value2);
+	}
+
+	private Value getValue(ResultContainer container, String valueStr) throws ConfigurationException {
+		if ( (valueStr.length() > 0) && (valueStr.charAt(0) == '$') ) {
+			if ( valueStr.startsWith("${") && valueStr.endsWith("}") ) {
+				return new VariableValue(container, valueStr);
+			} else {
+				throw new ConfigurationException("Badly formed variable: '" + valueStr + "'");
+			}
+		} else {
+			return new LiteralValue(valueStr);
+		}
+	}
+
+	public String toString() {
+		return "[" + literalValue1 + "==" + literalValue2 + "]";
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/SingleExpressionTest.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/SingleExpressionTest.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/SingleExpressionTest.java	(revision 21851)
@@ -0,0 +1,34 @@
+/*
+ * Licensed 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.
+ */
+
+package org.tp23.antinstaller.runtime.logic;
+
+/**
+ * @author mwilson
+ * @version $Id: SingleExpressionTest.java,v 1.1 2006/09/08 19:16:30
+ *          anothermwilson Exp $
+ * @since 0.7.4 patch 2
+ */
+public class SingleExpressionTest implements LogicalTest {
+	
+	private static final String[] EMPTY_TOKEN_LIST = new String[0];
+
+	public boolean getTestResult(Expression expression1, Expression expression2) {
+		return expression1.evaluate();
+	}
+
+	public String[] getTestTokens() {
+		return EMPTY_TOKEN_LIST;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/StartsWithTest.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/StartsWithTest.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/StartsWithTest.java	(revision 21851)
@@ -0,0 +1,35 @@
+/*
+ * Licensed 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.
+ */
+
+package org.tp23.antinstaller.runtime.logic;
+
+/**
+ * @author mwilson
+ * @version $Id: StartsWithTest.java,v 1.1 2006/09/08 19:16:30 anothermwilson
+ *          Exp $
+ * @since 0.7.4 patch 2
+ */
+public class StartsWithTest extends ValuesTest {
+	
+	private static final String[] TEST_TOKENS = { "^=" };
+
+	public String[] getTestTokens() {
+		return TEST_TOKENS;
+	}
+
+	protected boolean getTestResult(final String value1, final String value2) {
+		return (value1 != null) && value1.startsWith(value2);
+
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/StringLengthComparator.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/StringLengthComparator.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/StringLengthComparator.java	(revision 21851)
@@ -0,0 +1,46 @@
+/*
+ * Licensed 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.
+ */
+
+package org.tp23.antinstaller.runtime.logic;
+
+import java.util.Comparator;
+
+import org.apache.tools.ant.taskdefs.Length;
+
+/**
+ * Compare strings based on their length. Used by ExpressionBuilder to ensure
+ * that longest match is attempted first.
+ * 
+ * @author mwilson
+ * @version $Id: StringLengthComparator.java,v 1.1 2006/09/08 19:16:31
+ *          anothermwilson Exp $
+ * @since 0.7.4 patch 2
+ */
+
+public class StringLengthComparator implements Comparator {
+
+	/**
+	 * Sort by descending String length
+	 * 
+	 * @param o1 first string
+	 * @param o2 second string
+	 * @return difference between the length of o2 and o1
+	 */
+	public int compare(Object o1, Object o2) {
+		String str1 = (String) o1;
+		String str2 = (String) o2;
+		return (str2.length() - str1.length());
+	}
+    
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/TestOperator.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/TestOperator.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/TestOperator.java	(revision 21851)
@@ -0,0 +1,27 @@
+/*
+ * Licensed 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.
+ */
+
+package org.tp23.antinstaller.runtime.logic;
+
+/**
+ * @author mwilson
+ * @version $Id: TestOperator.java,v 1.2 2006/12/21 00:03:18 teknopaul Exp $
+ * @since 0.7.4 patch 2
+ */
+
+public interface TestOperator {
+	
+	public String[] getTestTokens();
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/Value.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/Value.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/Value.java	(revision 21851)
@@ -0,0 +1,26 @@
+/*
+ * Licensed 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.
+ */
+
+package org.tp23.antinstaller.runtime.logic;
+
+/**
+ * @author mwilson
+ * @version $Id: Value.java,v 1.2 2006/12/21 00:03:18 teknopaul Exp $
+ * @since 0.7.4 patch 2
+ */
+
+public interface Value {
+
+	public String getValue();
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/ValuesTest.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/ValuesTest.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/ValuesTest.java	(revision 21851)
@@ -0,0 +1,30 @@
+/*
+ * Licensed 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.
+ */
+
+package org.tp23.antinstaller.runtime.logic;
+
+/**
+ * @author mwilson
+ * @version $Id: ValuesTest.java,v 1.2 2006/12/21 00:03:18 teknopaul Exp $
+ * @since 0.7.4 patch 2
+ */
+
+public abstract class ValuesTest implements TestOperator {
+
+	public boolean getTestResult(final Value value1, final Value value2) {
+		return getTestResult(value1.getValue(), value2.getValue());
+	}
+
+	abstract protected boolean getTestResult(final String value1Str, final String value2Str);
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/VariableValue.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/VariableValue.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/VariableValue.java	(revision 21851)
@@ -0,0 +1,42 @@
+/*
+ * Licensed 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.
+ */
+
+package org.tp23.antinstaller.runtime.logic;
+
+import org.tp23.antinstaller.input.ResultContainer;
+
+/**
+ * @author mwilson
+ * @version $Id: VariableValue.java,v 1.2 2006/12/21 00:03:18 teknopaul Exp $
+ * @since 0.7.4 patch 2
+ */
+public class VariableValue implements Value {
+
+	private final ResultContainer valueHolder;
+	private final String propertyName;
+
+	public VariableValue(final ResultContainer container, final String propertyName) {
+		valueHolder = container;
+		this.propertyName = propertyName;
+	}
+
+	public String getValue() {
+		/*
+		 * Use somewhat misleadingly named method getDefaultValue() It doesn't
+		 * return the default value, it returns the current value of a property
+		 * referenced by the use of ${propertyname} syntax
+		 */
+		return valueHolder.getDefaultValue(propertyName);
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/NonExtractor.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/NonExtractor.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/NonExtractor.java	(revision 21851)
@@ -0,0 +1,66 @@
+ /* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.selfextract;
+
+import java.io.File;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.runtime.ExecInstall;
+import org.tp23.antinstaller.runtime.exe.FilterChain;
+import org.tp23.antinstaller.runtime.exe.FilterFactory;
+
+/**
+ * This class is a replacement for the SelfExtractor that provides a similar
+ * function to the SelfExtractor but avoids the need to extract all the
+ * files prior to running the build.  When using this extractor the project
+ * is run from the Jar but It is the Ant builds responsibility to access
+ * resources from within the Jar the Jar itself can be referenced using 
+ * the Ant property "antinstaller.jar".  The build file is automatically read
+ * from the Jar.
+ * @author Paul Hinds
+ * @version $Id: NonExtractor.java,v 1.4 2006/12/15 21:16:39 teknopaul Exp $
+ */
+public class NonExtractor extends SelfExtractor{
+	
+	/** used by AntProjectFilter */
+	public static final String ANTINSTALLER_JAR_PROPERTY = "antinstaller.jar";
+	public static final String CONFIG_RESOURCE = "/org/tp23/antinstaller/runtime/exe/nonextractor.fconfig";
+	
+	/**
+	 * Run method to use from the command line. This is fired via an entry in the 
+	 * MANIFEST.MF in the Jar
+	 *@param  args  The command line arguments
+	 */
+	public static void main(String[] args) {
+		try {
+			SelfExtractor extractor = null;
+			extractor = new NonExtractor();
+			FilterChain chain = FilterFactory.factory(CONFIG_RESOURCE);
+			ExecInstall installExec = new ExecInstall(chain);
+			installExec.parseArgs(args, false);
+
+			// create temporary space for the build to be removed on exit
+			File temp = extractor.makeTempDir();
+			installExec.setTempRoot(temp);
+			installExec.setInstallRoot(temp);
+			installExec.exec();
+		}
+		catch (InstallException e) {
+			System.out.println("Can't load filter chain: " + CONFIG_RESOURCE);
+			e.printStackTrace();
+		}
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/ProgressIndicator.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/ProgressIndicator.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/ProgressIndicator.java	(revision 21851)
@@ -0,0 +1,162 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.selfextract;
+
+import java.awt.BorderLayout;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.GraphicsConfiguration;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.util.ResourceBundle;
+
+import javax.swing.BorderFactory;
+import javax.swing.ImageIcon;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JProgressBar;
+import javax.swing.UIManager;
+import javax.swing.border.BevelBorder;
+import javax.swing.border.Border;
+
+
+
+/**
+ *
+ * <p>Frame to indicate progress of the extraction of a SelfExctracting archive </p>
+ * <p> </p>
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: tp23</p>
+ * @author Paul Hinds
+ * @version $Id: ProgressIndicator.java,v 1.3 2007/01/28 08:44:40 teknopaul Exp $
+ */
+public class ProgressIndicator
+	extends JFrame {
+
+	public static final String IMAGE_RESOURCE = "/resources/extract-image.png";
+
+	private JPanel jPanel1 = new JPanel();
+	private JProgressBar jProgressBar1 = new JProgressBar();
+	private JLabel textLabel = new JLabel();
+	private Border border1;
+	private int max = 0;
+	private static int PAGE_WIDTH = 160;
+	private static int PAGE_HEIGHT = 110; // 35 is text + bar
+	private String title = org.tp23.antinstaller.Installer.langPack.getString("extracting");
+	private JLabel imagePanel = new JLabel();
+	GridBagLayout gridBagLayout1 = new GridBagLayout();
+	private boolean useIcon = true;
+
+
+
+	public ProgressIndicator(int max) {
+		this.max = max;
+		jbInit();
+	}
+
+	public ProgressIndicator(int max, String title) {
+		this.max = max;
+		this.title = title;
+		jbInit();
+	}
+
+	private void setLocation() {
+		GraphicsConfiguration config = getGraphicsConfiguration();
+		int x = (int) config.getBounds().getCenterX() - (PAGE_WIDTH / 2);
+		int y = (int) config.getBounds().getCenterY() - (PAGE_HEIGHT / 2);
+		setLocation(x, y);
+	}
+
+
+	private void jbInit() {
+		border1 = BorderFactory.createCompoundBorder(
+			BorderFactory.createBevelBorder(BevelBorder.RAISED),
+			BorderFactory.createEmptyBorder(4, 4, 4, 4));
+		jPanel1.setLayout(gridBagLayout1);
+		int row = 0;
+		this.getContentPane().add(jPanel1, BorderLayout.CENTER);
+		if (useIcon) {
+			PAGE_HEIGHT = 110;
+			setImage();
+			jPanel1.add(imagePanel, new GridBagConstraints(0, row++, 1, 1, 0.1, 0.9
+				, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
+			this.setSize(new Dimension(PAGE_WIDTH, PAGE_HEIGHT));
+		}
+		else {
+			PAGE_HEIGHT = 40;
+			this.setSize(new Dimension(PAGE_WIDTH, 35));
+		}
+		jPanel1.setBorder(border1);
+		jPanel1.setMaximumSize(new Dimension(PAGE_WIDTH, PAGE_HEIGHT));
+		jPanel1.setMinimumSize(new Dimension(PAGE_WIDTH, PAGE_HEIGHT));
+		jPanel1.setPreferredSize(new Dimension(PAGE_WIDTH, PAGE_HEIGHT));
+		textLabel.setText(title);
+		this.setTitle(title);
+		jPanel1.add(textLabel, new GridBagConstraints(0, row++, 1, 1, 0.1, 0.1
+			, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
+		jPanel1.add(jProgressBar1, new GridBagConstraints(0, row++, 1, 1, 0.1, 0.1
+			, GridBagConstraints.SOUTH, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
+		jProgressBar1.setMinimum(0);
+		jProgressBar1.setMaximum(max);
+		this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+		this.setSize(new Dimension(PAGE_WIDTH, PAGE_HEIGHT));
+		this.setResizable(false);
+		this.setUndecorated(true);
+		setLocation();
+	}
+
+	public void tick() {
+		jProgressBar1.setValue(jProgressBar1.getValue() + 1);
+	}
+
+	private void setImage() {
+		try {
+			ByteArrayOutputStream baos = new ByteArrayOutputStream();
+			InputStream in = this.getClass().getResourceAsStream(IMAGE_RESOURCE);
+			byte[] buffer = new byte[2048];
+			int read = -1;
+			while ( (read = in.read(buffer)) != -1) {
+				baos.write(buffer, 0, read);
+			}
+			ImageIcon icon = new ImageIcon(baos.toByteArray());
+			imagePanel.setHorizontalAlignment(JLabel.CENTER);
+			imagePanel.setIcon(icon);
+		}
+		catch (Exception ex) {
+		}
+	}
+
+    /**
+     * TODO move to JUnit
+     * @param args
+     */
+	public static void main(String[] args) {
+		try {
+			ProgressIndicator indicator = null;
+			indicator = new ProgressIndicator(200);
+			indicator.show();
+			UIManager.setLookAndFeel("org.tp23.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
+		}
+		catch (Exception ex) {
+			// not concerned about Look and Feel
+		}
+
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/ResourceExtractor.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/ResourceExtractor.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/ResourceExtractor.java	(revision 21851)
@@ -0,0 +1,74 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.selfextract;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+/**
+ * Copies resources from the Classpath to the filesystem replacing regex with replacement
+ * and correcting line endings
+ * @author teknopaul
+ *
+ */
+public class ResourceExtractor {
+	
+	/**
+	 * @param resource Must start with / e.g. /org/tp23/myFile.txt
+	 * @param dest
+	 * @throws IOException 
+	 */
+	public void copyResource(String resource, File dest, String regex, String replace) throws IOException{
+		InputStream is = this.getClass().getResourceAsStream(resource);
+		if(is == null){
+			throw new IOException("Can not find resource: " + resource);
+		}
+		InputStreamReader isr = new InputStreamReader(is);
+		BufferedReader br = new BufferedReader(isr);
+		FileOutputStream bos = new FileOutputStream(dest);
+		String line = null;
+		while((line = br.readLine()) != null){
+			bos.write(line.replaceAll(regex, replace).getBytes());
+			bos.write(System.getProperty("line.separator").getBytes());
+		}
+        bos.flush();
+        bos.close();
+        br.close();
+	}
+	/**
+	 * @param resource Must start with / e.g. /org/tp23/myFile.txt
+	 * @param dest
+	 * @throws IOException 
+	 */
+	public void copyResourceBinary(String resource, File dest) throws IOException{
+		InputStream is = this.getClass().getResourceAsStream(resource);
+		if(is == null){
+			throw new IOException("Can not find resource: " + resource);
+		}
+		FileOutputStream bos = new FileOutputStream(dest);
+		byte[] buffer = new byte[1024];
+		for(int read = 0; (read = is.read(buffer)) > 0; ){
+			bos.write(buffer, 0, read);
+		}
+        bos.flush();
+        bos.close();
+        is.close();
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/SelfExtractor.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/SelfExtractor.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/SelfExtractor.java	(revision 21851)
@@ -0,0 +1,469 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.selfextract;
+
+import java.awt.HeadlessException;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.jar.JarInputStream;
+
+import javax.swing.JOptionPane;
+import javax.swing.UIManager;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.renderer.swing.plaf.LookAndFeelFactory;
+import org.tp23.antinstaller.runtime.ExecInstall;
+import org.tp23.antinstaller.runtime.exe.FilterChain;
+import org.tp23.antinstaller.runtime.exe.FilterFactory;
+
+/**
+ *
+ * <p>Finds a file reference to the Jar that loads this class and then extracts that Jar
+ * to a temporary directory </p>
+ * <p> </p>
+ * @author Paul Hinds
+ * @version $Id: SelfExtractor.java,v 1.10 2007/01/28 08:44:40 teknopaul Exp $
+ */
+public class SelfExtractor {
+
+	public static final String CONFIG_RESOURCE = "/org/tp23/antinstaller/runtime/exe/selfextractor.fconfig";
+	
+	private File extractDir;
+	private File archiveFile;
+	private boolean overwrite = true;
+
+	private static int DEFAULT_BUFFER_SIZE = 1024;
+	private int BUFFER_SIZE = DEFAULT_BUFFER_SIZE;
+	private static boolean graphicsEnv = false;
+	private static String lookAndFeel = null;
+
+	/**
+     * returns the Jar that the reference object was loaded from.  If it was not
+     * loaded from a jar this methods behaviour is undefined
+     * @TODO define what happens
+     * @param reference
+     * @return A java.io.File reference to the Jar
+	 */
+	public static File getEnclosingJar(Object reference) {
+		String thisClass = "/" + reference.getClass().getName().replace('.','/') + ".class";
+		URL jarUrl = reference.getClass().getResource(thisClass);
+		String stringForm = jarUrl.toString();
+		//String fileForm = jarUrl.getFile();
+
+		File file = null;
+		int endIdx = stringForm.indexOf("!/");
+		if(endIdx != -1){
+			String unescaped = null;
+			String fileNamePart = stringForm.substring("jar:file:".length(), endIdx);
+			file = new File(fileNamePart);
+			if ( ! file.exists()) {
+				// try to unescape encase the URL Handler has escaped the " " to %20
+				unescaped = unescape(fileNamePart);
+				file = new File(unescaped);
+			}
+			return file;
+		}
+		throw new RuntimeException("Failed expanding Jar.");
+	}
+
+    /**
+	 * Constructor for the SelfExtractor object.  Directly after constructing
+	 * an instance the init() method should be called unless subclassing
+	 */
+	public SelfExtractor() {
+	}
+
+    /**
+	 * This has been moved from the default constructor to facilitate subclassing
+	 * @return true if the lookAndFeel worked
+	 */
+	public void init(){
+		System.out.println("Loading self extractor...");
+		archiveFile = getEnclosingJar(this);
+		makeTempDir();
+		try {
+			JarFile thisJar = new JarFile(archiveFile);
+			lookAndFeel = thisJar.getManifest().getMainAttributes().getValue("Look-And-Feel");
+			lookAndFeel = LookAndFeelFactory.getLafFromToken(lookAndFeel);
+			if(lookAndFeel != null) {
+                UIManager.setLookAndFeel(lookAndFeel);
+            }
+		}
+		catch (Throwable ex) {
+			// not concerned about Look and Feel
+		}
+	}
+	
+    /**
+     * Creates a new empty temporary directory for the file extraction
+     * @return
+     */
+	protected File makeTempDir(){
+		// String tempDir = System.getProperty("java.io.tmpdir");
+		File curDir = new File("t.tmp").getParentFile();
+		extractDir = new File(curDir, "antinstall");
+		for ( int i=0; extractDir.exists(); i++) {
+			extractDir = new File(curDir, "antinstall" + i);
+		}
+		extractDir.mkdirs();
+		extractDir.deleteOnExit();
+		System.setProperty("antinstall.tmpdir",extractDir.getAbsolutePath());
+		return extractDir;
+	}
+
+    /**
+	 *  Constructor for the SelfExtractor object that sets the buffersize in use.
+	 *  The write buffer is the same size as the write buffer size because the read buffer reads
+	 *  decompressed bytes
+	 *  @param newBufferSize the size of the read buffer
+	 */
+	public SelfExtractor(int newBufferSize) {
+		BUFFER_SIZE = newBufferSize;
+		archiveFile = getEnclosingJar(this);
+	}
+
+    /**
+	 *  Sets the Directory into which the file will be extracted
+	 *
+	 *@param  newExtractDir  The new extract directory
+	 */
+	public void setExtractDir(File newExtractDir) {
+		extractDir = newExtractDir;
+	}
+
+    /**
+	 *  changes the archive to be extracted
+	 *@param  newArchiveFile  The new archiveFile value
+	 */
+	public void setArchiveFile(File newArchiveFile) {
+		archiveFile = newArchiveFile;
+	}
+
+    /**
+	 *  Gets the Directory into which the files will be extracted that
+	 *  is currently set in the ZipExtractor object
+	 *@return    The extract directory value
+	 */
+	public File getExtractDir() {
+		return extractDir;
+	}
+
+    /**
+	 *  Gets the set in the ZipExtractor
+	 *@return    The archiveFile value
+	 */
+	public boolean isOverwrite() {
+		return overwrite;
+	}
+
+    /**
+	 *  Gets the Directory into which the files will be extracted that
+	 *  is currently set in the ZipExtractor object
+	 *@return    The extract directory value
+	 */
+	public void setOverwrite(boolean overwrite) {
+		this.overwrite = overwrite;
+	}
+
+    /**
+	 *  Gets the set in the ZipExtractor
+	 *@return    The archiveFile value
+	 */
+	public File getArchiveFile() {
+		return archiveFile;
+	}
+
+    /**
+	 *  Opens up the zip and gets a list of the files in it.  If the zip file
+	 *  or the temp file have not been set NullPointerExceptions will get thrown
+	 *@param  vebose  if true Prints out a list of the zips
+	 *      contents on to the command line
+	 *@return  an ArrayList of String objects that will
+	 *         be as per the path in the zip
+	 *@exception  FileNotFoundException  Description of Exception
+	 *@exception  IOException            Description of Exception
+	 */
+	public ArrayList getList(boolean vebose) throws FileNotFoundException, IOException {
+		JarInputStream zis = new JarInputStream(new FileInputStream(archiveFile));
+		JarEntry entry = null;
+		ArrayList result = new ArrayList();
+		while ( (entry = zis.getNextJarEntry()) != null) {
+			if (vebose) {
+				System.out.println(entry.getName());
+			}
+			result.add(entry.getName());
+		}
+		return result;
+	}
+
+    /**
+     * @return the number of files in the jar
+     * @throws FileNotFoundException
+     * @throws IOException
+     */
+	public int getFileCount() throws FileNotFoundException, IOException {
+		JarInputStream zis = new JarInputStream(new FileInputStream(archiveFile));
+		int count = 0;
+		while (  zis.getNextJarEntry() != null) {
+			count++;
+		}
+		return count;
+	}
+
+    /**
+	 *  Opens up the zip and extracts the files to the temp dir.
+	 *
+	 *@param  vebose  if true Prints out a list of the zips contents on to System.out
+	 *@return an ArrayList of java.io.File objects that
+	 *      will be as per the path in the zip with the root being the temp dir
+	 *@exception  FileNotFoundException
+	 *@exception  IOException
+	 */
+	public ArrayList extract(boolean vebose, boolean isX) throws FileNotFoundException, IOException {
+		int fileCount = getFileCount();
+		ProgressIndicator indicator = null;
+        if(isX){
+            try {
+                    indicator = new ProgressIndicator(fileCount);
+                    indicator.show();
+            }
+            catch ( Exception exc ) {
+                /*
+                 * Chances are, there are problems with the graphics environment
+                 * so trying falling back to text mode
+                 */
+                graphicsEnv = false;
+                isX = false;
+            }
+
+        }
+		JarInputStream zis = new JarInputStream(new FileInputStream(archiveFile));
+		JarEntry entry = null;
+		ArrayList result = new ArrayList();
+		while ( (entry = zis.getNextJarEntry()) != null) {
+			if (vebose) {
+				System.out.println("Extracting:" + entry.getName());
+			}
+			result.add(extract(zis, entry));
+			if (isX) {
+				indicator.tick();
+			}
+		}
+		if (isX) {
+			indicator.hide();
+		}
+		zis.close();
+		return result;
+	}
+
+
+
+    /**
+	 *  Extract a single file from the stream. N.B. the stream must be in the correct
+	 *  position for this to work
+	 *@param  zis                        ZipInputStream open and ready
+	 *@param  entry                      A valid entry read from the stream
+	 *@return                            The inflated file generated in the temp dir
+	 *@exception  FileNotFoundException
+	 *@exception  IOException
+	 */
+	private File extract(JarInputStream zis, JarEntry entry) throws FileNotFoundException, IOException {
+		createPath(entry.getName());
+		File fileToUse = new File(extractDir, entry.getName());
+		if (fileToUse.exists()) {
+			if (!overwrite) {
+                return fileToUse;
+            }
+		}
+		else {
+			fileToUse.createNewFile();
+		}
+		if (fileToUse.isDirectory()) {
+            return fileToUse;
+        }
+
+		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fileToUse), BUFFER_SIZE);
+		byte[] bytes = new byte[BUFFER_SIZE];
+		int len = 0;
+		while ( (len = zis.read(bytes)) >= 0) {
+			bos.write(bytes, 0, len);
+		}
+		bos.close();
+		zis.closeEntry();
+		return fileToUse;
+	}
+
+    /**
+	 *  This adds all the necessary directories in the root of the zip path to the
+	 *  temp dir.
+	 *@param  entryName        The string name in the Zip file (virtual path)
+	 *@exception  IOException  if the directories can not be made
+	 */
+	private void createPath(String entryName) throws IOException {
+		int slashIdx = entryName.lastIndexOf('/');
+		if (slashIdx >= 0) {
+			// there is path info
+			String firstPath = entryName.substring(0, slashIdx);
+			File dir = new File(extractDir, firstPath);
+			if (!dir.exists()) {
+				dir.mkdirs();
+			}
+		}
+	}
+
+    /**
+	 * Run method to use from the command line. This is fired via an entry in the 
+	 * MANIFEST.MF in the Jar
+	 *@param  args  The command line arguments
+	 */
+	public static void main(String[] args) {
+		testX();
+		// FIXME move after parseArgs() and set graphicsEnv if text selected
+		// will need to test SelfExtractor and comment parseArgs() to ensure
+		// no side effects in the future.
+		SelfExtractor extractor = null;
+		try {
+			boolean verbose = false;
+			extractor = new SelfExtractor();
+			extractor.init();
+			extractor.extract(verbose, graphicsEnv);
+		}
+		catch (Exception e) {
+			e.printStackTrace();
+			String tempDir = "unknown";
+			if(extractor != null){
+				tempDir = extractor.getExtractDir().getAbsolutePath();
+			}
+			String warning = "Could not extract Jar file to directory:" + tempDir;
+			printXorTextWarning(warning);
+		}
+		
+		try {
+			FilterChain chain = FilterFactory.factory(CONFIG_RESOURCE);		
+			ExecInstall installExec = new ExecInstall(chain);
+			installExec.parseArgs(args, false);
+			installExec.setInstallRoot(extractor.getExtractDir());
+			// removes files on exit
+			installExec.setTempRoot(extractor.getExtractDir());
+
+            installExec.exec();
+		}
+		catch (InstallException e1) {
+			System.out.println("Cant load filter chain:/org/tp23/antinstaller/runtime/exe/selfextractor.fconfig");
+			e1.printStackTrace();
+		}
+	}
+
+	/**
+	 * This tests for the existence of a  graphics environment and sets an
+	 * internal flag so the test does not have to be repeated, it may be expensive.
+	 * Prior to running this method the isGraphicsEnv() method will be invalid.
+	 */
+	protected static void testX(){
+		try {
+			java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment();
+            try {
+                boolean headless = java.awt.GraphicsEnvironment.isHeadless();
+                if(headless) {
+                    graphicsEnv = false;
+                    return;
+                }
+            } catch (Throwable e) {
+                // JDK 1.3 does not have the isHeadless() method but may still work in other situations
+            }
+			graphicsEnv = true;
+		}
+		catch (Throwable e) {
+            // thus graphicsEnv stays false;
+		}
+	}
+    
+	/**
+	 * @see #testX()
+	 * @return true if an X or windows environment is available
+	 */
+	protected boolean isGraphicsEnv(){
+		return graphicsEnv;
+	}
+
+	protected static void printXorTextWarning(String warning){
+		if(graphicsEnv){
+            try {
+                JOptionPane.showMessageDialog(null, warning);
+            }
+            catch( HeadlessException headlessExc ) {
+                graphicsEnv = false;
+                System.out.println(warning);
+            }
+        }
+		else {
+			System.out.println(warning);
+		}
+	}
+
+	public static int deleteRecursive(File directory) {
+		int count = 0;
+		File[] files = directory.listFiles(new FileFilter() {
+			public boolean accept(File file) {
+				return!file.isDirectory();
+			}
+		});
+		for (int i = 0; i < files.length; i++) {
+			files[i].delete();
+			count++;
+		}
+		File[] dirs = directory.listFiles(new FileFilter() {
+			public boolean accept(File file) {
+				return file.isDirectory();
+			}
+		});
+		for (int i = 0; i < dirs.length; i++) {
+			count += deleteRecursive(dirs[i]);
+		}
+		directory.delete();
+		return count;
+	}
+
+    /**
+	 * UN-URL encode string
+     * TODO should this not support UNICODE escapes
+	 */
+	private static String unescape(final String s) {
+
+		URLDecoder ud = new URLDecoder();
+
+		String decoded = null;
+
+		try {
+			decoded = ud.decode( s, "UTF-8" );
+		} catch ( java.io.UnsupportedEncodingException uee ) {
+			System.err.println( "unsupported encoding" );
+			return s;
+		}
+		return decoded;
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/package.html
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/package.html	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/package.html	(revision 21851)
@@ -0,0 +1,14 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head><!--
+  Copyleft (c) 2004 tp23
+  All Rights Reserved.
+--></head>
+
+<body bgcolor="white">Classes to extract the jar from which this package is loaded.
+
+The self extracting method is to obtain a temporary directory from java.io.File
+and extract the files there.  The baseDir for Ant is then set to this directory and it is
+treated as if it were the current directory (although it is not and ./ references
+will not work.</body>
+</html>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/gui/GBCF.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/gui/GBCF.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/gui/GBCF.java	(revision 21851)
@@ -0,0 +1,117 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.gui;
+
+import java.awt.GridBagConstraints;
+import java.awt.Insets;
+/**
+ * GBCF  Grib Bag Constraints Factory.  This class exists mostly
+ * for tidying up code that used the exsivly verbose GridBagConstraints
+ * object, hence the shortened class name.
+ * By default a two column equal with table is assumed, to support other
+ * column layouts use the constructor that take an array of column wieghts
+ * Factory class for generating constraints for a equal width column table.
+ * the table is similar to the following table rendered in HTML
+ * <table border="2">
+ *   <tr>
+ *     <td>data</td><td>data</td>
+ *   </tr>
+ *   <tr>
+ *     <td colspan="2">data</td>
+ *   </tr>
+ *   <tr>
+ *     <td>data</td><td>data</td>
+ *   </tr>
+ *   <tr>
+ *     <td>data</td><td>data</td>
+ *   </tr>
+ * <table>
+ * @author not attributable
+ * @version 1.0
+ */
+public class GBCF {
+
+	protected Insets insets = new Insets(1,4,1,4);
+	protected Insets noinsets = new Insets(0,0,0,0);
+	protected double[] columnWeights= new double[]{0.5,0.5};
+
+	public GBCF(){
+
+    }
+	/**
+	 * to support more than two columns or vary the column wieghtings
+	 * @param columnWeights double[]
+	 */
+	public GBCF(double[] columnWeights){
+		this.columnWeights=columnWeights;
+	}
+	/**
+	 *
+	 * @param row int the 0 indexed row
+	 * @param col int the 0 indexed column
+	 * @param span boolean does cell span both columns
+	 * @return GridBagConstraints
+	 */
+	public GridBagConstraints getCell(int row,int col){
+		return new GridBagConstraints(col,              //gridx
+									  row,              //gridy
+									  1,                //gridwidth
+									  1,                //gridheight
+									  columnWeights[col],//weightx
+									  0.0,              //weithty
+									  GridBagConstraints.WEST, // anchor
+									  GridBagConstraints.NONE, //fill
+									  insets,  // insets
+									  1, //ipadx
+									  1  //ipady
+									  );
+   }
+   /**
+	*
+	* @param row int the 0 indexed row
+	* @param first boolean is this the first column or the second
+	* @param span boolean does cell span both columns
+	* @return GridBagConstraints
+	*/
+   public GridBagConstraints getSpan(int row){
+	   return new GridBagConstraints(0,               //gridx
+									 row,             //gridy
+									 2,               //gridwidth
+									 1,               //gridheight
+									 columnWeights[0],//weightx
+									 0.0,             //weithty
+									 GridBagConstraints.WEST, // anchor
+									 GridBagConstraints.NONE, //fill
+									 insets,  // insets
+									 1, //ipadx
+									 1  //ipady
+									 );
+  }
+  public GridBagConstraints getVertGlue(int row){
+	  return new GridBagConstraints(0,               //gridx
+									row,             //gridy
+									2,               //gridwidth
+									1,               //gridheight
+									columnWeights[0],//weightx
+									1.0,             //weithty
+									GridBagConstraints.NORTHWEST, // anchor
+									GridBagConstraints.NONE, //fill
+									noinsets,  // insets
+									0, //ipadx
+									0  //ipady
+									);
+  }
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/DefaultingDirectoryChooser.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/DefaultingDirectoryChooser.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/DefaultingDirectoryChooser.java	(revision 21851)
@@ -0,0 +1,180 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.gui.widget;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.File;
+
+import javax.swing.JFileChooser;
+import javax.swing.filechooser.FileFilter;
+import javax.swing.filechooser.FileSystemView;
+/**
+ * A file chooser that makes a beter default if the default directory is not available.
+* Basically the default looks for the suggested directory and if it does not find it moves back
+* up the directories.  If still nothing is found (for example it may get to My Computer
+* which you can not add file to) the home directory is selected, as in the default file chooser.
+*
+* To use this class call new DefaultingDirectoryChooser(boolean) and immediately call
+* setDefaultDirectory(File) to determine the default. If you don't it behaves like the default JFileChooser
+* Also if you call setCurrentDirectory(File) it will behave like JFileChooser
+*
+* This chooser has two modes CREATE_MODE and EXISTING_MODE.   <br/><br/>
+*
+* In existing mode it is assumed the chooser is being used to identify an existing directory
+* the default directory should exist if not the directory shown will be the next existing parent.<br/><br/>
+*
+* In create mode it is
+* assumed that the last directory in the default directory is to be created and may not
+* exist yet. Therefor the default directory displayed is the parent (with suitable defaulting)
+* and the text box will contain the name of the last directory.
+* e.g. if default is C:\Program Files\MyApp  C:\Program Files will be displayed and
+* MyApp will be shown in the text box (even if it does not exist yet)  If C:\Program Files does not exist
+* C:\ will be shown as with existing mode.
+* Choosing select can lead to the creation of the file.  It will not be automatically
+* created that is the responsibility of the client code.<br/>
+*
+* This class uses FileSystemView and will only display folders that return true to fsv.isFileSystem()
+*
+* This class also uses a bit of a hack by in CREATE_MODE it sets the selectables to files and directories
+* although only shows the directories this way a non-existing Directory can be chosen.  This is the only way I can
+* get it to work on my Java version but I would not be supprised if it did not work on
+* other versions of the Java API.  It also means that setFileSelectionMode() should
+* never be called by clients as it will break this hack.
+ * @author Paul Hinds
+ * @version 1.0
+ */
+public class DefaultingDirectoryChooser extends JFileChooser{
+
+    public static final boolean CREATE_MODE = true;
+    public static final boolean EXISTING_MODE = false;
+
+    /**
+     * Determines that the default includes a directory name that is requried
+     * e.g. C:\Program Files\MyApp where even if Program Files does not exist
+     * MyApp should be part of the default even if it does not exist.
+     */
+    private boolean createMode = false;
+    private File selectedFile = null;
+    private String desiredName = null;
+    
+    public DefaultingDirectoryChooser(boolean createMode) {
+        this.createMode=createMode;
+        if(createMode){
+            setFileSelectionMode(FILES_AND_DIRECTORIES);
+            removeChoosableFileFilter(getAcceptAllFileFilter());
+            addChoosableFileFilter(new FileFilter(){
+                public boolean accept(File f) {
+                    if(f.exists() && f.isDirectory())return true;
+                    if(!f.exists() && getFileSystemView().getParentDirectory(f).isDirectory())return true;
+                    return false;
+                }
+                public String getDescription() {
+                    return "Folders";
+                }
+            });
+            
+            addPropertyChangeListener(JFileChooser.DIRECTORY_CHANGED_PROPERTY, new PropertyChangeListener(){
+				public void propertyChange(PropertyChangeEvent evt) {
+					File directory = (File)evt.getNewValue();
+					DefaultingDirectoryChooser.this.setCurrentDirectory(new File(directory, "newfolder"));
+					setSelectedFile(new File(directory, desiredName));
+				}            	
+            });
+        }
+        else {
+            setFileSelectionMode(DIRECTORIES_ONLY);
+        }
+    }
+
+
+    /**
+     * Sets the default directory.
+     * @param dir the current directory to point to
+     * @todo Implement this javax.swing.JFileChooser method
+     */
+    public void setDefaultDirectory(File dir) {
+        if(dir==null)return;// called by the default consructor
+        if(createMode){
+        	if(desiredName == null)desiredName = dir.getName();
+            File selected = determineCreateDir(dir);
+            super.setCurrentDirectory(selected.getParentFile());
+            setSelectedFile(selected);
+        }else{
+            super.setCurrentDirectory(determineExistingDir(dir));
+        }
+    }
+
+
+
+    private File determineExistingDir(File defaultDir){
+        if(defaultDir.exists())return defaultDir;
+        FileSystemView fsv = this.getFileSystemView();
+        File validParent = getFSVParent(fsv,defaultDir);
+        if(validParent!=null) {
+            return validParent;
+        }
+        else {
+            return fsv.getHomeDirectory();
+        }
+    }
+    /**
+     * Select a base path for the default even if it does not exist.  The order of preference is as follows
+     * if the directory exists use it
+     * if the parent does not exist try finding the next parent
+     * if the next parent is a root directory e.g. / or C:\ use the users home directory
+     * @param defaultDir File
+     * @return File
+     */
+    private File determineCreateDir(File defaultDir){
+        if(defaultDir.exists())return defaultDir;
+        FileSystemView fsv = this.getFileSystemView();
+        String dirName = defaultDir.getName();
+        File validParent = getFSVParent(fsv,defaultDir);
+        if(validParent!=null){
+            return new File(validParent, dirName);
+        }
+        else {
+            return new File(fsv.getHomeDirectory(), dirName);
+        }
+    }
+    /**
+     * Step back up trying to find a parent if none if found return null.
+     * null can be found if the path starts e:\ and e: does not exist
+     * @param fsv FileSystemView
+     * @param dir File
+     * @return File
+     */
+    private File getFSVParent(FileSystemView fsv,File dir){
+        File parent = dir.getParentFile();
+        if(fsv.isRoot(parent) && !parent.exists()){
+            return null;
+        }
+        if(!parent.exists() || !fsv.isFileSystem(parent)){
+            parent = getFSVParent(fsv,parent);
+        }
+        return parent;
+    }
+
+    public static void main(String[] args) {
+        DefaultingDirectoryChooser chooser = new DefaultingDirectoryChooser(CREATE_MODE);
+        chooser.setDefaultDirectory(new File("/usr/local/dibble/MyApp"));
+
+        chooser.showDialog(null,"Select");
+        System.out.println("Selected:"+chooser.getSelectedFile().getAbsolutePath());
+        System.exit(0);
+    }
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/FollowingJTextArea.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/FollowingJTextArea.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/FollowingJTextArea.java	(revision 21851)
@@ -0,0 +1,125 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.gui.widget;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.io.FileNotFoundException;
+import java.io.FileWriter;
+import java.io.IOException;
+
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.JTextArea;
+
+public class FollowingJTextArea extends JTextArea{
+
+    private boolean follow = true;
+
+    public FollowingJTextArea() {
+        jInit();
+    }
+
+
+    private void jInit(){
+        final JPopupMenu popUp = getPopupMenu();
+        this.add(popUp);
+        this.addMouseListener(new MouseAdapter(){
+            public void mouseClicked(MouseEvent e) {
+                if (e.getButton() == e.BUTTON3) {
+                    popUp.show(FollowingJTextArea.this,e.getX(),e.getY());
+                }
+            }
+        });
+    }
+
+    public boolean isFollow() {
+        return follow;
+    }
+    public void setFollow(boolean follow) {
+        this.follow = follow;
+    }
+
+    private void scrollToEnd(){
+        setCaretPosition(getDocument().getLength());
+    }
+    private void toggleFollow(){
+        setFollow(!isFollow());
+    }
+
+    /**
+     * Appends the given text to the end of the document.
+     *
+     * @param str the text to insert
+     * @todo Implement this javax.swing.JTextArea method
+     */
+    public void append(String str) {
+        super.append(str);
+        if(follow)scrollToEnd();
+    }
+    private JPopupMenu getPopupMenu() {
+        JPopupMenu contextMenu = new JPopupMenu("Options");
+        JMenuItem saveMenu = new JMenuItem("Save Text");
+        saveMenu.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                SelectFileAction action = new SelectFileAction("Save Output", null, null);
+                try {
+                    action.actionPerformed(new ActionEvent(this, 0, "Save Output"));
+                    if (action.selectedFile != null) {
+                        FileWriter fos = new FileWriter(action.selectedFile);
+                        fos.write(getText());
+                        fos.close();
+                    }
+
+                }
+                catch (FileNotFoundException ex) {
+                    System.err.println("FileNotFoundException");
+                }
+                catch (IOException ex) {
+                    System.err.println("IOException");
+                }
+            }
+        });
+        contextMenu.add(saveMenu);
+
+        JMenuItem toggleFollowMenu = new JMenuItem("Toggle Follow");
+        toggleFollowMenu.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                toggleFollow();
+            }
+        });
+        contextMenu.add(toggleFollowMenu);
+
+        JMenuItem jumpToEndMenu = new JMenuItem("Jump To End");
+        jumpToEndMenu.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                setCaretPosition(getDocument().getLength());
+            }
+        });
+        contextMenu.add(toggleFollowMenu);
+
+        JMenuItem clearTextMenu = new JMenuItem("Clear Text");
+        clearTextMenu.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                setText("");
+            }
+        });
+        contextMenu.add(clearTextMenu);
+        return contextMenu;
+    }
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/JTextAreaPrintStream.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/JTextAreaPrintStream.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/JTextAreaPrintStream.java	(revision 21851)
@@ -0,0 +1,244 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.gui.widget;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+
+import javax.swing.JTextArea;
+
+/**
+ * <p>This subclass of PrintStream is designed to be compatible with System.out and System.err but it provides
+* its own functionality and does not borrow from PrintStream. All methods are overridden.  The calls to each method
+* behave as expected with the exception of flush() which appears to insert a new line for each call. flush() sends
+* the current line to the JTextArea with a call to JTextArea.append(String) which adds a
+* line in the buffer.</p>
+ * @author Paul Hinds
+ * @version 1.0
+ */
+public class JTextAreaPrintStream extends PrintStream{
+
+    private JTextArea textArea;
+    private StringBuffer line;
+
+    public JTextAreaPrintStream(JTextArea textArea) {
+        super(new ByteArrayOutputStream(0));// wasted all methods are overridden
+        this.textArea = textArea;
+        line = new StringBuffer();
+    }
+
+    /**
+     * The stream can not be closed
+     */
+    public void close(){
+    }
+
+    public synchronized void flush(){
+        if(line.length()>0){
+			textArea.append(line.toString());
+            line = new StringBuffer();
+        }
+    }
+
+    public synchronized void write(byte[] b){
+        line.append(new String(b));
+    }
+
+    public synchronized void write(byte[] b, int off, int len){
+        line.append(new String(b,off,len));
+    }
+
+
+    public synchronized void write(int c){
+        line.append(c);
+    }
+
+    public synchronized boolean checkError() {
+        return false;
+    }
+
+    public synchronized void print(Object obj) {
+        line.append(obj);
+    }
+
+
+    public synchronized void print(String s) {
+        line.append(s);
+    }
+
+
+    public synchronized void print(boolean b) {
+        line.append(b);
+    }
+
+
+    public synchronized void print(char c) {
+        line.append(c);
+    }
+
+
+    public synchronized void print(char[] s) {
+        line.append(s);
+    }
+
+
+    public synchronized void print(double d) {
+        line.append(d);
+    }
+
+
+    public synchronized void print(float f) {
+        line.append(f);
+    }
+
+
+    public synchronized void print(int i) {
+        line.append(i);
+    }
+
+
+    public synchronized void print(long l) {
+        line.append(l);
+    }
+
+
+    public synchronized void println() {
+    	line.append('\n');
+        flush();
+    }
+
+
+    public synchronized void println(Object x) {
+        if(line.length()>0){
+            textArea.append(line.append(String.valueOf(x)).toString());
+            textArea.append("\n");
+            line = new StringBuffer();
+        }
+        else {
+            textArea.append(String.valueOf(x));
+            textArea.append("\n");
+        }
+    }
+
+
+    public synchronized void println(String x) {
+        if(line.length()>0){
+            textArea.append(line.append(x).toString());
+            textArea.append("\n");
+            line = new StringBuffer();
+        }
+        else {
+            textArea.append(x);
+            textArea.append("\n");
+        }
+    }
+
+    public synchronized void println(boolean x) {
+        if(line.length()>0){
+            textArea.append(line.append(String.valueOf(x)).toString());
+            textArea.append("\n");
+            line = new StringBuffer();
+        }
+        else {
+            textArea.append(String.valueOf(x));
+            textArea.append("\n");
+        }
+    }
+
+
+    public synchronized void println(char x) {
+        if(line.length()>0){
+            textArea.append(line.append(String.valueOf(x)).toString());
+            textArea.append("\n");
+            line = new StringBuffer();
+        }
+        else {
+            textArea.append(String.valueOf(x));
+            textArea.append("\n");
+        }
+    }
+
+
+    public synchronized void println(char[] x) {
+        if(line.length()>0){
+            textArea.append(line.append(String.valueOf(x)).toString());
+            textArea.append("\n");
+            line = new StringBuffer();
+        }
+        else {
+            textArea.append(String.valueOf(x));
+            textArea.append("\n");
+        }
+    }
+
+
+    public synchronized void println(double x) {
+        if(line.length()>0){
+            textArea.append(line.append(String.valueOf(x)).toString());
+            textArea.append("\n");
+            line = new StringBuffer();
+        }
+        else {
+            textArea.append(String.valueOf(x));
+            textArea.append("\n");
+        }
+    }
+
+
+    public synchronized void println(float x) {
+        if(line.length()>0){
+            textArea.append(line.append(String.valueOf(x)).toString());
+            textArea.append("\n");
+            line = new StringBuffer();
+        }
+        else {
+            textArea.append(String.valueOf(x));
+            textArea.append("\n");
+        }
+    }
+
+
+    public synchronized void println(int x) {
+        if(line.length()>0){
+            textArea.append(line.append(String.valueOf(x)).toString());
+            textArea.append("\n");
+            line = new StringBuffer();
+        }
+        else {
+            textArea.append(String.valueOf(x));
+            textArea.append("\n");
+        }
+    }
+
+
+    public synchronized void println(long x) {
+        if(line.length()>0){
+            textArea.append(line.append(String.valueOf(x)).toString());
+            textArea.append("\n");
+            line = new StringBuffer();
+        }
+        else {
+            textArea.append(String.valueOf(x));
+            textArea.append("\n");
+        }
+    }
+
+
+    protected void setError() {
+    }
+
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/SelectFileAction.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/SelectFileAction.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/SelectFileAction.java	(revision 21851)
@@ -0,0 +1,60 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.gui.widget;
+
+import java.awt.event.ActionEvent;
+import java.io.File;
+
+import javax.swing.AbstractAction;
+import javax.swing.ImageIcon;
+import javax.swing.JComponent;
+import javax.swing.JFileChooser;
+
+public class SelectFileAction extends AbstractAction {
+    protected JComponent component = null;
+    protected File selectedFile = null;
+    protected String buttonText = null;
+
+    public SelectFileAction(String text, ImageIcon icon, JComponent component) {
+        super(text, icon);
+        this.component = component;
+    }
+    public SelectFileAction(String text, ImageIcon icon, JComponent component,String buttonText) {
+        super(text, icon);
+        this.component = component;
+    }
+    public void actionPerformed(ActionEvent e) {
+        JFileChooser chooser = new JFileChooser();
+        if(buttonText!=null)chooser.setApproveButtonText(buttonText);
+        if(selectedFile!=null && selectedFile.isFile()){
+        	if(selectedFile.exists())chooser.setSelectedFile(selectedFile);
+        	else chooser.setCurrentDirectory(selectedFile.getParentFile());
+        }
+        else if(selectedFile!=null && selectedFile.isDirectory()){
+        	chooser.setCurrentDirectory(selectedFile);
+        }
+        else if(selectedFile!=null && !selectedFile.exists()){
+        	chooser.setCurrentDirectory(selectedFile.getParentFile());
+        }
+        
+        int returnVal = chooser.showDialog(component,e.getActionCommand());
+        if(returnVal == JFileChooser.APPROVE_OPTION) {
+            selectedFile = chooser.getSelectedFile();
+        } else {
+        	selectedFile = null;
+        }
+    }
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/SystemOutJTextArea.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/SystemOutJTextArea.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/SystemOutJTextArea.java	(revision 21851)
@@ -0,0 +1,75 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.gui.widget;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.PrintStream;
+
+import javax.swing.JButton;
+import javax.swing.JScrollPane;
+
+/**
+ *
+ * <p>Title: A JTextArea that can be set to show System.out or System.err</p>
+ * <p>Description: </p>
+ * <p>Copyright: Copyright (c) 2004</p>
+ * <p>Company: </p>
+ * @author Paul Hinds
+ * @version 1.0
+ */
+
+public class SystemOutJTextArea extends JScrollPane{
+
+    private JTextAreaPrintStream stream;
+    private FollowingJTextArea textArea = new FollowingJTextArea();
+
+    public SystemOutJTextArea() {
+        jInit();
+    }
+
+    private void jInit(){
+        this.getViewport().setView(textArea);
+        textArea.setEditable(false);
+        JButton jumpButton = new JButton("");
+        setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_ALWAYS);
+        setHorizontalScrollBarPolicy(HORIZONTAL_SCROLLBAR_NEVER);
+        setCorner(this.LOWER_RIGHT_CORNER,jumpButton);
+        jumpButton.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e) {
+                textArea.setCaretPosition(textArea.getDocument().getLength());
+            }
+        });
+        jumpButton.setToolTipText("Click to jump to the end");
+
+
+    }
+
+    public synchronized PrintStream getOut(){
+        if(stream==null){
+            stream = new JTextAreaPrintStream(textArea);
+        }
+        return stream;
+    }
+    public void setAsSystemErr(){
+        System.setErr(getOut());
+    }
+    public void setAsSystemOut(){
+        System.setOut(getOut());
+    }
+
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/resources/LICENSE-ant-install.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/resources/LICENSE-ant-install.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/resources/LICENSE-ant-install.txt	(revision 21851)
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright 2005 Paul Hinds
+
+   Licensed 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.
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/resources/icons/LICENSE
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/resources/icons/LICENSE	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src/resources/icons/LICENSE	(revision 21851)
@@ -0,0 +1,13 @@
+This copyright and license notice covers the images in this directory.
+Note the license notice contains an add-on.
+
+KDE Crystal theme icons.
+Copyright (C) 2002 and following years KDE Artists
+This library is free software; you can redistribute it and/or modify it under
+the terms of the GNU Lesser General Public License as published by the Free
+Software Foundation, version 2.1 of the License.
+
+This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+License for more details. You should have received a copy of the GNU Lesser General Public License along
+with this library; if not, write to the
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/runtime/exe/ReleaseNotesFilter.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/runtime/exe/ReleaseNotesFilter.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/runtime/exe/ReleaseNotesFilter.java	(revision 21851)
@@ -0,0 +1,102 @@
+/*
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime.exe;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ResourceBundle;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.renderer.text.Pager;
+import org.tp23.antinstaller.runtime.Runner;
+import org.tp23.antinstaller.runtime.SwingRunner;
+import org.tp23.antinstaller.runtime.TextRunner;
+
+
+/**
+ * A filter that launches a window with release notes if a property has been selected
+ * during the install.  The notes are loaded from a resource on the classpath
+ * called /release-notes.txt
+ * @author Paul Hinds
+ * @version $Id: ReleaseNotesFilter.java,v 1.4 2007/01/04 22:57:18 teknopaul Exp $
+ */
+public class ReleaseNotesFilter implements ExecuteFilter {
+	
+	private static final ResourceBundle res = ResourceBundle.getBundle("org.tp23.antinstaller.renderer.text.Res");
+	private static final String nextChar = res.getString("nextChar");
+
+	/**
+	 * The AntInstaller property that must be "true" for the release notes to show
+	 */
+	public static final String RELEASE_NOTES_PROPERTY = "show.release.notes";
+
+	public ReleaseNotesFilter() {
+	}
+
+	public void exec(InstallerContext ctx) throws InstallException {
+		if(ctx.isInstallSucceded() ){
+			String showReleaseNotes = ctx.getInstaller().getResultContainer().getProperty(RELEASE_NOTES_PROPERTY);
+			if(OutputField.isTrue(showReleaseNotes)){
+				try {
+					InputStream is = ReleaseNotesFilter.class.getResourceAsStream("/release-notes.txt");
+					BufferedReader br = new BufferedReader(new InputStreamReader(is));
+					String line = null;
+					StringBuffer file = new StringBuffer();
+					while((line = br.readLine())!=null){
+						file.append(line).append('\n');
+					}
+                    br.close();
+					Runner runner = ctx.getRunner();
+					if(runner instanceof TextRunner){
+						renderText(file.toString());
+
+					}
+					else{ // if(runner instanceof SwingRunner){
+						//SwingRunner sRunner = (SwingRunner)runner;
+						ReleaseNotesFrame rFrame = new ReleaseNotesFrame("Readme");
+						rFrame.init(file.toString());
+					}
+				}
+				catch (IOException e) {
+					throw new InstallException("Could not render Release notes",e);
+				}
+			}
+		}
+	}
+	
+	private void renderText(String text) throws IOException{
+		BufferedReader commandReader = new BufferedReader(new InputStreamReader(System.in));
+		Pager pager = new Pager(text);
+		String command = null;
+		do {
+			if (!pager.next(System.out)) {
+				break;
+			}
+			System.out.println();
+			System.out.println(getNextInstructions());
+			command = commandReader.readLine();
+		}
+		while (command.toUpperCase().startsWith(nextChar));
+		pager.rest(System.out);
+		
+	}
+	private String getNextInstructions() {
+		return res.getString("large_select_next");
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/runtime/exe/ReleaseNotesFrame.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/runtime/exe/ReleaseNotesFrame.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/runtime/exe/ReleaseNotesFrame.java	(revision 21851)
@@ -0,0 +1,63 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.runtime.exe;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.GraphicsConfiguration;
+import java.awt.HeadlessException;
+
+import javax.swing.JEditorPane;
+import javax.swing.JFrame;
+import javax.swing.JScrollPane;
+
+
+/**
+ * ReleaseNotes frame for displaying plain text
+ * @author Paul Hinds
+ * @version $Id: ReleaseNotesFrame.java,v 1.3 2006/12/21 00:03:23 teknopaul Exp $
+ */
+public class ReleaseNotesFrame extends JFrame {
+
+	private BorderLayout borderLayout1 = new BorderLayout();
+	private JEditorPane contentsEditorPane = new JEditorPane();
+	private JScrollPane hPanelScrollPane = new JScrollPane();
+
+	public ReleaseNotesFrame(String title) throws HeadlessException {
+		super(title);
+	}
+
+	public void init(String text){
+		contentsEditorPane.setMinimumSize(new Dimension(200, 200));
+		contentsEditorPane.setPreferredSize(new Dimension(1000, Integer.MAX_VALUE));
+		contentsEditorPane.setEditable(false);
+		contentsEditorPane.setContentType("text/plain");
+		contentsEditorPane.setCaretPosition(0);
+		contentsEditorPane.setText(text);
+		this.getContentPane().setLayout(borderLayout1);
+		hPanelScrollPane.setMinimumSize(new Dimension(200, 200));
+		hPanelScrollPane.setPreferredSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE));
+		this.getContentPane().add(hPanelScrollPane, BorderLayout.CENTER);
+		hPanelScrollPane.getViewport().add(contentsEditorPane);
+		hPanelScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
+		this.setSize(new Dimension(500,500));
+		hPanelScrollPane.setWheelScrollingEnabled(true);
+		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+		this.show();
+		
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/taskdefs/Installer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/taskdefs/Installer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/taskdefs/Installer.java	(revision 21851)
@@ -0,0 +1,407 @@
+/*
+ * Copyright  2005 Paul Hinds
+ *
+ *  Licensed 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.
+ *
+ */
+package org.tp23.antinstaller.taskdefs;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.taskdefs.Jar;
+import org.apache.tools.ant.taskdefs.Manifest;
+import org.apache.tools.ant.taskdefs.ManifestException;
+import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.types.ZipFileSet;
+import org.apache.tools.zip.ZipOutputStream;
+import org.tp23.antinstaller.renderer.swing.plaf.LookAndFeelFactory;
+import org.tp23.antinstaller.runtime.ConfigurationLoader;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * Creates a Installer archive.
+ * 
+ *
+ * @ant.task category="packaging"
+ */
+public class Installer extends Jar {
+
+    public static final String NON_EXTRACTOR = "NonExtractor";
+    public static final String SELF_EXTRACTOR = "SelfExtractor";
+    
+    /** The extract type to use NonExtractor or SelfExtractor */
+    private String extractType;
+
+    /** The AntInstall config file */
+    private File installConfig;
+
+    /** The Ant build.xml to be used*/
+    private File buildFile;
+
+    /** The location of ant-installer.jar and ant-installer-ext.jar and possibly jgoodies-edited-1_2_2.jar */
+    private File antInstallLib;
+
+    /** The location of xercesImpl.jar and xml-apis.jar 
+     * This is not requried Xerces is optional and will increase the download size */
+    private File xercesLib;
+
+    /** The location of ant.jar and ant-launcher.jar */
+    private File antLib;
+
+    /** The AntInstaller Look And Feel to be used */
+    private String laf;
+    
+    /** The icon set to use */
+    private String icons;
+
+    /** Stop the build if there is a known error in the config */
+    protected boolean failOnError = false;
+    
+    /** perform the validation */
+    protected boolean validateConfig = false;
+    
+    private boolean buildFileSet = false;
+    private boolean configFileSet = false;
+    /** Indicates that the build.xml and antinstall-config.xml have been added to the fileset already */
+    private boolean startCheckDuplicates = false; 
+
+    /** constructor */
+    public Installer() {
+        super();
+        archiveType = "jar";
+        emptyBehavior = "create";
+        setEncoding("UTF8");
+    }
+ 
+    protected void cleanUp() {
+        super.cleanUp();
+    }
+
+    public void reset() {
+        super.reset();
+        extractType = null;
+        installConfig = null;
+        buildFile = null;
+    }
+
+	/**
+	 * @param installConfig The installConfig to set.
+	 */
+	public void setInstallConfig(File installConfig) {
+		this.installConfig = installConfig;
+        if (!installConfig.exists()) {
+            throw new BuildException("AntInstall config: "
+                                     + installConfig
+                                     + " does not exist.");
+        }
+        // Create a ZipFileSet for this file, and pass it up.
+        ZipFileSet fs = new ZipFileSet();
+        fs.setFile(installConfig);
+        fs.setFullpath("antinstall-config.xml");
+        super.addFileset(fs);
+        if(this.buildFile != null) {
+            startCheckDuplicates = true;
+        }
+	}
+	/**
+	 * @param buildFile The buildFile to set.
+	 */
+	public void setBuildFile(File buildFile) {
+		this.buildFile = buildFile;
+        if (!buildFile.exists()) {
+            throw new BuildException("AntInstall build file: "
+                                     + buildFile
+                                     + " does not exist.");
+        }
+        // Create a ZipFileSet for this file, and pass it up.
+        ZipFileSet fs = new ZipFileSet();
+        fs.setFile(buildFile);
+        fs.setFullpath("build.xml");
+        super.addFileset(fs);
+        if(this.installConfig != null) {
+            startCheckDuplicates = true;
+        }
+	}
+	/**
+	 * @param icons The ocons pack to use for buttons.
+	 */
+	public void setIcons(String icons) {
+		this.icons = icons;
+
+        // Create a ZipFileSet for this file, and pass it up.
+		FileSet set = null;
+		File iconJar = new File(antInstallLib, "ai-icons-" + icons + ".jar");
+        if (!iconJar.exists()) {
+            throw new BuildException("Missing icons: "
+                                     + iconJar
+                                     + " does not exist.");
+        }
+		set = new ZipFileSet();
+		set.setFile(iconJar);
+		addZipGroupFileset(set);
+
+	}
+	/**
+	 * @param extractType The extractType to set.
+	 */
+	public void setExtractType(String extractType) {
+		this.extractType = extractType;
+	}
+	
+    public void setFailOnError(boolean fail) {
+        failOnError = fail;
+    }
+    
+    public void setValidateConfig(boolean validate) {
+    	validateConfig = validate;
+    }
+
+    /**
+     * The location of ant-installer.jar and possibly jgoodies-edited-1_2_2.jar
+     * @param antInstallLib The antInstallLib to set.
+     */
+    public void setAntInstallLib(File antInstallLib) {
+        this.antInstallLib = antInstallLib;
+        FileSet set = new FileSet();
+        set.setFile(new File(antInstallLib, "ant-installer.jar"));
+        addZipGroupFileset(set);
+    }
+    /**
+     * The location of ant.jar and ant-launcher.jar
+     * @param antLib The antLib to set.
+     */
+    public void setAntLib(File antLib) {
+        this.antLib = antLib;
+        FileSet set = new FileSet();
+        set.setFile(new File(antLib, "ant.jar"));
+        set.setFile(new File(antLib, "ant-launcher.jar"));
+        addZipGroupFileset(set);
+    }
+    /**
+     * @param xercesLib The xercesLib to set.
+     */
+    public void setXercesLib(File xercesLib) {
+        this.xercesLib = xercesLib;
+        FileSet set = new FileSet();
+        set.setFile(new File(xercesLib, "xercesImpl.jar"));
+        set.setFile(new File(xercesLib, "xml-apis.jar"));
+        addZipGroupFileset(set);
+    }
+
+    /**
+     * Overrides the ZIP execute() method which creates filesets
+     */
+    public void execute(){
+        log(".-------------------------------.");
+        log("|-(o--~AntInstaller.sf.net~--o)-|");
+        log("`-----------------by-Paul-Hinds-ÂŽ");
+        
+        if(validateConfig) {
+            validateConfig();
+        } else if(extractType.equals(SELF_EXTRACTOR)){
+            // this reads the config just 
+            // to extract the lookAndFeel attribute for the manifest at the moment
+            readConfig();
+        }
+        if( LookAndFeelFactory.isDefault(getLaf()) ){
+            FileSet set = new FileSet();
+            set.setFile(new File(antInstallLib, "jgoodies-edited-1_2_2.jar"));
+            addZipGroupFileset(set);
+        }
+
+        super.execute();
+    }
+
+    /**
+     * override of  parent; validates configuration
+     * before initializing the output stream.  The Manifest is set in the Jar superclass's
+     * method so Manifest modifications must be performed in this method
+     */
+    protected void initZipOutputStream(ZipOutputStream zOut)
+        throws IOException, BuildException {
+        // If no buildFile file is specified, it's an error.
+        if (buildFile == null && !isInUpdateMode()) {
+            throw new BuildException("buildFile attribute is required", getLocation());
+        }
+        // If no installConfig file is specified, it's an error.
+        if (installConfig == null && !isInUpdateMode()) {
+            throw new BuildException("installConfig attribute is required", getLocation());
+        }
+        try{ 
+        	addConfiguredManifest(this.getManifest());
+        }
+        catch(ManifestException me){
+        	throw new BuildException("Cant add AntInstaller Manifest", me, getLocation());
+        }        
+        super.initZipOutputStream(zOut);
+    }
+	
+    protected void zipFile(InputStream is, ZipOutputStream zOut, String vPath,
+            long lastModified, File fromArchive, int mode)
+            throws IOException {
+        
+        if(vPath.equalsIgnoreCase("antinstall-config.xml")) {
+            if(buildFileSet) {
+                log("Two antinstall-config.xml files in jar", Project.MSG_WARN);
+            }
+            buildFileSet = true;
+        }
+        if(vPath.equalsIgnoreCase("build.xml")) {
+            if(configFileSet) {
+                log("Two build.xml files in jar", Project.MSG_WARN);
+            }
+            configFileSet = true;
+        }
+
+        super.zipFile(is, zOut, vPath, lastModified, fromArchive, mode);
+    }
+
+    /**
+     * This method is only valid after readConfig() or validateConfig() have been run
+     * @return Returns the Look And Feel class.
+     */
+    private String getLaf() {
+        if(laf == null){
+            return LookAndFeelFactory.DEFAULT_LAF;
+        }
+        return laf;
+    }
+
+    private Manifest getManifest() throws ManifestException{
+    	if(extractType.equalsIgnoreCase(NON_EXTRACTOR)){
+    		return getNonExtractorManifest();
+    	}
+        else if(extractType.equalsIgnoreCase(SELF_EXTRACTOR)){
+            return getSelfExtractorManifest();
+        }
+        else {
+            throw new BuildException("Invalid extractType: " + extractType);
+        }
+    }
+    
+    private Manifest getNonExtractorManifest() throws ManifestException{
+    	return getCustomManifest("org.tp23.antinstaller.selfextract.NonExtractor");
+    }
+    private Manifest getSelfExtractorManifest() throws ManifestException{
+    	return getCustomManifest("org.tp23.antinstaller.selfextract.SelfExtractor");
+    }
+    private Manifest getCustomManifest(String mainClass) throws ManifestException{
+    	log("Creating MANIFEST.mf");
+    	Manifest newManifest = new Manifest();
+    	Manifest.Section mainSection = newManifest.getMainSection();
+    	Manifest.Attribute attmc = new Manifest.Attribute();
+    	attmc.setName("Main-Class");
+    	attmc.setValue(mainClass);
+    	mainSection.addAttributeAndCheck(attmc);
+    	Manifest.Attribute attlaf = new Manifest.Attribute();
+    	attlaf.setName("Look-And-Feel");
+    	attlaf.setValue(getLaf());
+    	mainSection.addAttributeAndCheck(attlaf);
+    	return newManifest;
+    	
+    }
+	
+	protected void validateConfig() {
+		
+		int ret = 1;
+		try {
+			log("reading config...");
+			ConfigurationLoader configurationLoader = new ConfigurationLoader();
+
+			log("parent file: " + installConfig.getParentFile() );
+			log("name of install config: " + installConfig.getName() );
+
+			configurationLoader.readConfig(installConfig.getParentFile(), installConfig.getName());
+			log("validating config...");
+			ret = configurationLoader.validate();
+			laf = configurationLoader.getInstaller().getLookAndFeel();
+			if(ret != 0){
+				err();
+			}
+		}
+		catch (Exception ex) {
+			log("validation failed");
+			ex.printStackTrace();
+			err();
+		}
+		
+		try{
+			log("parsing included build.xml...");
+			InputSource xmlInp = new InputSource(new FileInputStream(buildFile));
+			SAXParserFactory parserFactory = SAXParserFactory.newInstance();
+			SAXParser parser = parserFactory.newSAXParser();
+			parser.parse(xmlInp, new DefaultHandler(){
+				public void error(SAXParseException e) throws SAXException{
+					throw e;
+				}
+				public void fatalError(SAXParseException e) throws SAXException{
+					throw e;
+				}
+			} );
+			log("build.xml is well formed");
+		}
+		catch (Exception ex) {
+			ex.printStackTrace();
+			errNestedBuildXml();
+		}
+	}
+
+    protected void readConfig(){
+        
+        try {
+            log("reading config...");
+            ConfigurationLoader configurationLoader = new ConfigurationLoader();
+            configurationLoader.readConfig(installConfig.getParentFile(), installConfig.getName());
+            laf = configurationLoader.getInstaller().getLookAndFeel();
+        }
+        catch (Exception ex) {
+            ex.printStackTrace();
+            err();
+        }
+    }
+    
+    /**
+	 * error found on validation of the antinstall config
+	 */
+	private void err(){
+		String errorMsg = "Error in config file:" + installConfig.getAbsolutePath();
+        if (failOnError) {
+            throw new BuildException(errorMsg);
+        } else {
+            log(errorMsg, Project.MSG_ERR);
+        }
+	}
+	/**
+	 * error found in the build.xml used by ant installer (not the one
+	 * running this task)
+	 */
+	private void errNestedBuildXml(){
+		String errorMsg = "Error in included build file:" + buildFile.getAbsolutePath();
+        if (failOnError) {
+            throw new BuildException(errorMsg);
+        } else {
+            log(errorMsg, Project.MSG_ERR);
+        }
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/taskdefs/KdeIconTask.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/taskdefs/KdeIconTask.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/taskdefs/KdeIconTask.java	(revision 21851)
@@ -0,0 +1,146 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.taskdefs;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import org.tp23.antinstaller.selfextract.ResourceExtractor;
+/**
+ * 
+ * @author teknopaul
+ *
+ */
+public class KdeIconTask extends Task{
+
+	private String desktop;
+	private String icon;
+	private String installDir;
+	
+	public void execute() throws BuildException{
+		if(desktop == null || icon == null || installDir == null){
+            throw new BuildException("Missing attribute in KdeIconTask");
+        }
+		
+		ResourceExtractor re = new ResourceExtractor();
+
+		File appsDir = null;
+		try {
+			appsDir = getAppsDir();
+		} catch (Exception e) {
+			throw new BuildException("Can not determine KDE directory");
+		}
+		if( appsDir != null && appsDir.exists() ) {
+			try {
+				String desktopFileName = desktop.substring( desktop.lastIndexOf('/') + 1 );
+				log("creating: " + new File( appsDir, desktopFileName).getCanonicalPath());
+				re.copyResource(desktop, new File( appsDir, desktopFileName), "@installDir@", installDir);
+			} catch (Exception e) {
+				StringWriter sw = new StringWriter();
+				e.printStackTrace(new PrintWriter(sw));
+				throw new BuildException(sw.getBuffer().toString());
+			}
+		}
+		else{
+			log("apps dir does not exist");
+		}
+		File iconDir = null;
+		try {
+			iconDir = getIconDir();
+		} catch (Exception e) {
+			throw new BuildException("Can not determine KDE directory");
+		}
+		if(iconDir != null && iconDir.exists()){
+			try {				
+				String iconFileName = icon.substring( icon.lastIndexOf('/') + 1 );
+				log("creating: " + new File( iconDir, iconFileName).getCanonicalPath());
+				re.copyResourceBinary(icon, new File( iconDir, iconFileName ));
+			} catch (IOException e) {
+				throw new BuildException(e.getMessage());
+			}
+		}
+		else{
+			log("icon dir does not exist");
+		}
+		try {	
+			Process proc = Runtime.getRuntime().exec("kbuildsycoca");
+		} catch (Exception e) {
+			log("error running kbuildsycoca: " + e.getMessage());
+		}
+		
+	}
+	
+	private File getKdeDir(String pathdef, String extension) throws IOException, InterruptedException{
+		String[] args = {"kde-config", "--path", pathdef};
+		Process proc = Runtime.getRuntime().exec(args);
+		BufferedReader br = new BufferedReader( new InputStreamReader(proc.getInputStream()));
+		String appsDirs = br.readLine();
+		int idx = -1;
+        if(appsDirs != null) {
+            idx = appsDirs.indexOf(':');
+        }
+        br.close();
+	
+		if(idx > -1 && idx < appsDirs.length() - 1){
+			String privatedir = appsDirs.substring(0, idx - 1);
+			if(!privatedir.endsWith("/")){
+				privatedir = privatedir + "/"; 
+			}
+			return new File(privatedir + extension);
+		}
+		else{
+			if(!appsDirs.endsWith("/")){
+				appsDirs = appsDirs + "/"; 
+			}
+			return  new File(appsDirs + extension);
+		}
+	}
+	private File getAppsDir() throws IOException, InterruptedException{
+		return getKdeDir("xdgdata-apps", "");
+	}
+	private File getIconDir() throws IOException, InterruptedException{
+		return getKdeDir("icon", "hicolor/48x48/apps");
+	}
+	
+	
+	public String getDesktop() {
+		return desktop;
+	}
+	public void setDesktop(String desktop) {
+		this.desktop = desktop;
+	}
+	public String getIcon() {
+		return icon;
+	}
+	public void setIcon(String icon) {
+		this.icon = icon;
+	}
+
+	public String getInstallDir() {
+		return installDir;
+	}
+
+	public void setInstallDir(String installDir) {
+		this.installDir = installDir;
+	}
+	
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/taskdefs/ValidateConfig.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/taskdefs/ValidateConfig.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/taskdefs/ValidateConfig.java	(revision 21851)
@@ -0,0 +1,26 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.taskdefs;
+
+public class ValidateConfig extends Installer {
+
+    public void execute(){
+        log(".-------------------------------.");
+        log("|-(o--~AntInstaller.sf.net~--o)-|");
+        log("`-----------------by-Paul-Hinds-ÂŽ");
+        validateConfig();
+    }
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/util/CreateLanguagePack.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/util/CreateLanguagePack.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/util/CreateLanguagePack.java	(revision 21851)
@@ -0,0 +1,112 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.util;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import javax.swing.JDialog;
+import javax.swing.JFileChooser;
+import javax.swing.JFrame;
+import javax.swing.JOptionPane;
+import javax.swing.filechooser.FileFilter;
+
+import org.tp23.antinstaller.InstallException;
+import org.tp23.antinstaller.Installer;
+import org.tp23.antinstaller.InstallerContext;
+import org.tp23.antinstaller.runtime.exe.LoadConfigFilter;
+
+public class CreateLanguagePack {
+
+	
+	public static void main(String[] args) {
+		try {
+			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+			System.out.println("Create LanguagePack for antinstall-config.xml in the current directory?");
+			br.readLine();
+			
+			System.out.println("Enter Locale to create e.g. es_EU");
+			String locale = br.readLine().trim();
+			
+			createLanguagePack(loadConfigFile(new File("."), "antinstall-config.xml" ), locale, new File("."));
+			
+			System.out.println("done.");
+		} catch (IOException e) {
+			e.printStackTrace();
+		} catch (InstallException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	public static File guiMain(JFrame root) {
+		try {
+			JFileChooser chooser = new JFileChooser();
+			chooser.setDialogTitle("Select antinstall-config.xml file");
+			chooser.setApproveButtonText("Select file");
+			FileFilter ff = new FileFilter(){
+				public boolean accept(File file){
+					return file.getName().equals("antinstall-config.xml") || file.isDirectory();
+				}
+				public String getDescription() {
+					return "antinstall-config.xml files";
+				}
+			};
+			chooser.setFileFilter(ff);
+			chooser.showOpenDialog(root);
+			File chosen = chooser.getSelectedFile();
+			if(chosen != null){
+				chooser = new JFileChooser();
+				chooser.setDialogTitle("Select output directory");
+				chooser.setApproveButtonText("Internationalise file");
+				chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
+				chooser.setCurrentDirectory(chosen.getParentFile());
+				chooser.showOpenDialog(root);
+				File dir = chooser.getSelectedFile();
+				if(dir != null){
+					createLanguagePack(loadConfigFile(chosen.getParentFile(), chosen.getName()), null, dir);
+					if(! dir.getName().equals("resources")){
+						JOptionPane.showMessageDialog(root, "When the resources files are added to the installer jar\n the parent directory must be /resources/");
+					}
+					return new File(dir, "LanguagePack.properties");
+				}
+			}
+
+		} catch (IOException e) {
+			e.printStackTrace();
+		} catch (InstallException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+	
+	private static Installer loadConfigFile(File rootDir, String configName) throws InstallException{
+		InstallerContext ctx = new InstallerContext();
+		ctx.setFileRoot(rootDir);
+        ctx.setInstallerConfigFile(configName);
+		LoadConfigFilter configLoader = new LoadConfigFilter();
+		configLoader.exec(ctx);
+		Installer installer = ctx.getInstaller();
+		return installer;
+	}
+	
+	private static void createLanguagePack(Installer installer, String locale, File outputDir) throws IOException{
+		LangPackFileRenderer renderer = new LangPackFileRenderer();
+		renderer.renderProperties(installer, outputDir, locale);
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/util/LangPackFileRenderer.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/util/LangPackFileRenderer.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/util/LangPackFileRenderer.java	(revision 21851)
@@ -0,0 +1,227 @@
+/* 
+ * Copyright 2005 Paul Hinds
+ *
+ * Licensed 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.
+ */
+package org.tp23.antinstaller.util;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+
+import org.tp23.antinstaller.Installer;
+import org.tp23.antinstaller.PropertiesFileRenderer;
+import org.tp23.antinstaller.input.CommentOutput;
+import org.tp23.antinstaller.input.InputField;
+import org.tp23.antinstaller.input.LargeSelectInput;
+import org.tp23.antinstaller.input.OutputField;
+import org.tp23.antinstaller.input.SecretPropertyField;
+import org.tp23.antinstaller.input.ConditionalField;
+import org.tp23.antinstaller.input.SelectInput;
+import org.tp23.antinstaller.input.TargetSelectInput;
+import org.tp23.antinstaller.input.SelectInput.Option;
+import org.tp23.antinstaller.page.Page;
+
+/**
+ * <p>Outputs the text from Pages as a Java Properties file. The file produced is compatible
+ * with java.util.Properties. </p>
+ * <p>It can be used as a stub for creating language packs,  the default text is included as a guide but can be deleted</p>
+ * @author Paul Hinds
+ */
+public class LangPackFileRenderer{
+
+	private static String newLine = System.getProperty("line.separator");
+	private static final char[] hexidecimals = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+
+	public LangPackFileRenderer() {
+	}
+
+	public void renderProperties(Installer installer, File baseDir, String locale) throws IOException {
+		Page[] pages = installer.getPages();
+
+		StringBuffer propertiesData = new StringBuffer();
+		propertiesData.append("### Ant Installer - language pack auto generated on ");
+		propertiesData.append(new Date().toString());
+		propertiesData.append(newLine);
+		propertiesData.append(newLine);
+
+		propertiesData.append("finishButtonText = " + installer.getFinishButtonText());
+		propertiesData.append(newLine);
+		propertiesData.append(newLine);
+
+		String property = null;
+        String value = null;
+
+        for (int i = 0; i < pages.length; i++) {
+			OutputField[] fields = pages[i].getOutputField();
+
+			propertiesData.append(newLine);
+			propertiesData.append("## Text from Page:" + pages[i].getName());
+			propertiesData.append(newLine);
+            property = "page." + pages[i].getName() + ".displayText";
+			value = convert(pages[i].getDisplayText(), false);
+			propertiesData.append(property + " = " + value);
+			propertiesData.append(newLine);
+
+            retrievePropertiesData( fields, propertiesData );
+
+		}
+        // create the stub
+        if(locale != null) {
+			File languagePackStub = new File(baseDir.getAbsolutePath(), "LanguagePack_" + locale + ".properties");
+			FileWriter fos = new FileWriter(languagePackStub);
+			BufferedWriter writer = new BufferedWriter(fos);
+			writer.write(propertiesData.toString());
+			writer.flush();
+			fos.close();
+        }
+        else {
+			// create the default
+			File languagePack = new File(baseDir.getAbsolutePath(), "LanguagePack.properties");
+			FileWriter fos = new FileWriter(languagePack);
+			BufferedWriter writer = new BufferedWriter(fos);
+			writer.write(propertiesData.toString());
+			writer.flush();
+			fos.close();
+        }
+	}
+	
+    private void retrievePropertiesData( OutputField[] fields, StringBuffer propertiesData ) {
+        String property = null;
+        String value = null;
+        String explProperty = null;
+        String explValue = null;
+
+        for (int f = 0; f < fields.length; f++) {
+        	
+        	// use getName() for comments
+        	if(fields[f] instanceof CommentOutput){
+	            property = fields[f].getName() + ".displayText";
+				value = convert(fields[f].getDisplayText(), false);
+				propertiesData.append(property + " = " + value);
+				propertiesData.append(newLine);
+
+				if (fields[f].getExplanatoryText() != null && fields[f].getExplanatoryText().trim().length() > 0) {
+					explProperty = fields[f].getName() + ".explanatoryText";
+					explValue = convert(fields[f].getExplanatoryText(), false);
+					propertiesData.append(explProperty + " = " + explValue);
+					propertiesData.append(newLine);
+				}
+        	}
+        	// use getProperty for input types
+        	else {
+        		InputField iField = (InputField)fields[f];
+	            property = iField.getProperty() + ".displayText";
+				value = convert(iField.getDisplayText(), false);
+				propertiesData.append(property + " = " + value);
+				propertiesData.append(newLine);
+				if (iField.getExplanatoryText() != null && iField.getExplanatoryText().trim().length() > 0) {
+					explProperty = iField.getProperty() + ".explanatoryText";
+					explValue = convert(iField.getExplanatoryText(), false);
+					propertiesData.append(explProperty + " = " + explValue);
+					propertiesData.append(newLine);
+ 				}
+				if(iField instanceof SelectInput) {
+					SelectInput selectInput = (SelectInput)iField;
+					for (int o = 0; o < selectInput.getOptions().length; o++) {
+						SelectInput.Option option =  selectInput.getOptions()[o];
+			            property = selectInput.getProperty() + "." + (o + 1) + ".displayText";
+						value = convert(option.getText(), false);
+						propertiesData.append(property + " = " + value);
+						propertiesData.append(newLine);
+					}
+				}
+				if(fields[f] instanceof LargeSelectInput) {
+					LargeSelectInput selectInput = (LargeSelectInput)iField;
+					for (int o = 0; o < selectInput.getOptions().length; o++) {
+						LargeSelectInput.Option option =  selectInput.getOptions()[o];
+			            property = selectInput.getProperty() + "." + (o + 1) + ".displayText";
+						value = convert(option.getText(), false);
+						propertiesData.append(property + " = " + value);
+						propertiesData.append(newLine);
+					}
+				}
+        	}			
+        }
+    }
+
+	private String convert(String input, boolean doSpaces) {
+		if (input == null) {
+			// this happens when a page is skipped in text mode
+			return "";
+		}
+		int num = input.length();
+		StringBuffer sb = new StringBuffer(num);
+
+		for (int i = 0; i < num; i++) {
+			char c = input.charAt(i);
+			switch (c) {
+				case ' ':
+					if (i == 0 || doSpaces) {
+						sb.append('\\');
+					}
+					sb.append(' ');
+					break;
+				case '\n':
+					sb.append("\\n");
+					break;
+				case '\r':
+					sb.append("\\r");
+					break;
+				case '\\':
+					sb.append("\\\\");
+					break;
+				case '\t':
+					sb.append("\\t");
+					break;
+				case '\f':
+					sb.append("\\f");
+					break;
+				case '=':
+					sb.append("\\=");
+					break;
+				case ':':
+					sb.append("\\:");
+					break;
+				case '#':
+					sb.append("\\#");
+					break;
+				case '!':
+					sb.append("\\!");
+					break;
+
+				default:
+					if ( (c < 0x0020) || (c > 0x007e) ) {
+						sb.append("\\u")
+							.append(hex( (c >> 12) & 0xF))
+							.append(hex( (c >> 8) & 0xF))
+							.append(hex( (c >> 4) & 0xF))
+							.append(hex(c & 0xF));
+					}
+					else {
+						sb.append(c);
+					}
+			}
+		}
+		return sb.toString();
+	}
+
+	private char hex(int val) {
+		return hexidecimals[ (val & 0xF)];
+	}
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/README.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/README.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/README.txt	(revision 21851)
@@ -0,0 +1,115 @@
+---+ Default Project Template Builder
+
+This template is a method of getting up and running with
+AntInstaller quickly.  The template will help you create
+an installer for a Java project.  
+
+
+---++ Output
+
+   * create-installer.xml - An ant build script to package the installer
+   * build.xml - An Ant script used by the installer
+   * antinstall-config.xml - The definition of the installer
+All of the above can be edited to suit your needs
+   * Optionally the script will run the create-installer.xml Ant script to make the Jar immediately
+
+
+---++ Usage
+
+Read this README first
+Change directory to the location of this README file
+Set the ANT_INSTALL_HOME variable to the directory where you have installed AntInstaller.
+Set JAVA_HOME
+> export ANT_INSTALL_HOME=/usr/local/AntInstaller-beta0.7.2
+Start the runtemplate.sh script
+> ./runtemplate.sh
+Follow the instructions
+
+---++ Project Structure
+
+AntInstaller launches and asks you for your project information
+Generally it is assumed that your projects follow this structure
+
+/projects_root/
+
+/projects_root/project-name/
+
+for example if you use eclipse and CVS this will be
+/workspace/cvs-module-name/
+
+By default the template selects the following subdirectories
+which can be modified.
+/projects_root/project-name/src/ - source code
+/projects_root/project-name/bin/ - scripts (these get chmod u+x) in the installer
+/projects_root/project-name/doc/ - documentation
+/projects_root/project-name/lib/ - Jars
+/projects_root/project-name/classes/ - err... classes?
+
+The template only lets you select one directory for each, dont worry
+AntInstaller itself is infinately configurable.
+
+
+First time you run the script you should let the template
+create a new empty directory for creating installers
+/usr/local/installers/
+From this directory subdirectories will be created for each project 
+/usr/local/installers/project-name/
+
+---++ Configuring the installer
+
+This template is NOT designed to create you the final installer you will
+deploy.  If you have a very simple standard project it may suffice, 
+but it is expected that you will want to modify the XML files created
+to customise the build.
+
+Following the documentation on the web you can modify the 
+antinstall-config.xml file to add extra pages and collect extra input 
+when the user installs your application.
+http://antinstaller.sourceforge.net
+
+The build.xml file can be modified to customise the install proces
+that is run by AntInstaller on the users machine.  
+You have the full power of Ant so you can easily 
+   * move files around
+   * replace text
+   * Zip Unzip
+   * run scripts
+   * call Java
+   * run sub ant build.xml files
+   * call SQL files via JDBC
+   * fix line ending s
+   * and anything in the CoreTypes in Ant.
+
+The create-installer.xml file is an Ant script that creates the installer
+by modifying this file you can add extra resources to the final Jar 
+such as images that you want in the installer or extra source directories.
+By adding Ant optional Jars to the installer you can then access any
+additional features of Ant during the install enabling you to
+   * Call SSH or Telnet commands
+   * SCP/ FTP files 
+   * Send emails
+   * and anything in the OptionaTypes in Ant
+
+
+
+---++ Contributions
+
+This tool itself (obviously) uses AntInstaller.
+You are free to modify the scripts to extend the features of the tool.
+If you do I would encourage you to submit the changes back so
+everyone can benefit from your enhancement.
+It is a good example of using AntInstaller to acheive tasks other
+than just installing apps.
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/ant.install.log
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/ant.install.log	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/ant.install.log	(revision 21851)
@@ -0,0 +1,13 @@
+Logger initialized
+Ant basedir:/research/oranfry/programs/ant-installer/templates/defaultproject
+Filter: org.tp23.antinstaller.runtime.exe.LoadConfigFilter
+Config loaded
+Filter: org.tp23.antinstaller.runtime.exe.CreateUIFilter
+Creating UI classes
+Setting look and feel:org.tp23.jgoodies.plaf.plastic.PlasticXPLookAndFeel
+Created UI classes
+Filter: org.tp23.antinstaller.runtime.exe.PropertyLoaderFilter
+loadDefaults attribute:null
+Not loading defaults
+Filter: org.tp23.antinstaller.runtime.exe.ExecuteRunnerFilter
+Starting UI Screens
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/ant.install.properties
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/ant.install.properties	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/ant.install.properties	(revision 21851)
@@ -0,0 +1,65 @@
+### Ant Installer - properties auto generated on Tue\ Dec\ 18\ 15\:27\:39\ NZDT\ 2007
+
+basedir = /research/oranfry/programs/ant-installer/templates/defaultproject/.
+ant.install.config.version = 0.0
+
+
+## Properties from Page:intro
+# Targets selected for page
+intro-targets = Base,
+
+## Properties from Page:properties
+# .UnvalidatedTextInput
+PROJECT_NAME = Test Project
+# .DirectoryInput
+PROJECT_ROOT = /research/oranfry/sandbox/ant-installer/installers
+# .ValidatedTextInput
+PROJECT_SHORT_NAME = TestProject
+# .DirectoryInput
+RESOURCE_ROOT = /research/oranfry/sandbox/ant-installer/projects
+# .AppRootInput
+ANT_INSTALL_ROOT = /research/oranfry/programs/ant-installer
+# .FileInput
+PROJECT_LIC = /research/oranfry/programs/ant-installer/lib/LICENSE-ant-install.txt
+
+## Properties from Page:targets
+# .TargetInput
+SourceCode = true
+# .TargetInput
+Libraries = true
+# .TargetInput
+Scripts = true
+# .TargetInput
+Documentation = true
+# .TargetInput
+Classes = true
+# Targets selected for page
+targets-targets = SourceCode,Libraries,Scripts,Documentation,Classes,
+
+## Properties from Page:resources
+# .DirectoryInput
+PROJECT_SRC = /research/oranfry/sandbox/gsdl-trunk
+
+## Properties from Page:resources
+# .DirectoryInput
+PROJECT_LIB = /research/oranfry/sandbox/gsdl-trunk/lib
+
+## Properties from Page:resources
+# .DirectoryInput
+PROJECT_BIN = /research/oranfry/sandbox/gsdl-trunk/bin/script
+
+## Properties from Page:resources
+# .DirectoryInput
+PROJECT_DOC = /research/oranfry/sandbox/gsdl-trunk/images
+
+## Properties from Page:resources
+# .DirectoryInput
+PROJECT_CLASSES = /research/oranfry/sandbox/gsdl-trunk/etc
+
+## Properties from Page:createinstaller
+# .TargetInput
+CreateInstaller = true
+# Targets selected for page
+createinstaller-targets = CreateInstaller,
+
+## Properties from Page:progress
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/antinstall-config-template.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/antinstall-config-template.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/antinstall-config-template.xml	(revision 21851)
@@ -0,0 +1,71 @@
+<?xml version="1.0"?>
+<!DOCTYPE installer PUBLIC "-//tp23 //DTD Ant Installer Config//EN" "http://antinstaller.sf.net/dtd/antinstall-config-0.8.dtd">
+<installer
+			ui="swing,text"
+			verbose="true"
+			debug="false"
+			lookAndFeel="org.tp23.jgoodies.plaf.plastic.PlasticXPLookAndFeel"
+			name="@PROJECT_NAME@ Installer"
+			windowIcon="/resources/gkmain_inv.png"
+			defaultImageResource="/resources/makewavesdawn.png"
+			minJavaVersion="1.4">
+	<!--  each page element represents a page of the installer -->
+	<page
+			type="input"
+			name="intro"
+			displayText="Welcome to the @PROJECT_NAME@ installer">
+	</page>
+	<!--  type="license" shows a license page to click through -->
+	<page
+			type="license"
+			name="license"
+			displayText="License conditions"
+			resource="/resources/License.txt">
+	</page>
+	<!--  type="input" shows a list of editable options for the installer -->
+	<page
+			type="input"
+			name="properties"
+			displayText="Required install options">
+		<directory
+				property="installDir"
+				defaultValue="/usr/local/@PROJECT_SHORT_NAME@"
+				defaultValueWin="${env.ProgramFiles}\@PROJECT_SHORT_NAME@"
+				displayText="Select an installation directory"
+				create="true"/>
+	</page>
+	<page
+			type="input"
+			name="selector"
+			displayText="Components to install">
+		<comment
+				displayText="Choose the components you want to install"
+				bold="true"/>
+		<target
+			displayText="Core components"
+			target="default"
+			defaultValue="true"
+			force="true"/>
+		<!--SourceCode
+		<target
+			displayText="Source code"
+			target="tgsrc"
+			defaultValue="false"/>
+		SourceCode-->
+		<!--Documentation
+		<target
+			displayText="Documentation"
+			target="tgdoc"
+			defaultValue="true"/>
+		Documentation-->
+	</page>
+	<page
+			type="progress"
+			name="progress"
+			displayText="Installation progress"
+			showTargets="false"
+			target="cleanuptarget">
+	</page>
+</installer>
+
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/antinstall-config.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/antinstall-config.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/antinstall-config.xml	(revision 21851)
@@ -0,0 +1,177 @@
+<?xml version="1.0"?>
+<!DOCTYPE installer PUBLIC "-//tp23 //DTD Ant Installer Config//EN" "http://antinstaller.sf.net/dtd/antinstall-config-0.8.dtd">
+<installer
+			ui="swing,text"
+			verbose="true"
+			lookAndFeel="org.tp23.jgoodies.plaf.plastic.PlasticXPLookAndFeel"
+			name="Installer Wizard"
+			windowIcon="/resources/gkmain_inv.png"
+			defaultImageResource="/resources/makewavesdawn.png"
+			minJavaVersion="1.4"
+			finishButtonText="Create Project">
+	<!--  each page element represents a page of the installer -->
+	<page
+			type="input"
+			name="intro"
+			displayText="Welcome to the Default Installer Wizard"
+			target="Base">
+			<comment
+			displayText="This tool creates a default installer project"/>
+	</page>
+	<!--  type="input" shows a list of editable options for the installer -->
+	<page
+			type="input"
+			name="properties"
+			displayText="Project Options">
+		<text
+			property="PROJECT_NAME"
+			displayText="Project name"
+			defaultValue="My Project"/>
+		<directory
+				property="PROJECT_ROOT"
+				defaultValue="${java.user.home}/installers"
+				defaultValueWin="${java.user.home}\installers"
+				explanatoryText="The build directory is used to create the installer and some temporary files, it should be empty"
+				displayText="Select your build directory"
+				checkExists="true"
+				create="true"/>
+		<validated
+			property="PROJECT_SHORT_NAME"
+			displayText="Short name (no spaces)"
+			explanatoryText="The short name is generally the module name in CVS or the name used in Eclipse"
+			defaultValue="MyProject"
+			regex="^[a-zA-Z][_a-zA-Z0-9]+$"/>
+		<directory
+				property="RESOURCE_ROOT"
+				defaultValue="${java.user.home}/projects"
+				defaultValueWin="C:\projects"
+				displayText="Select your projects root"
+				explanatoryText="The projects root is the root directory where you keep your projects, for 
+example this might be the eclipse workspace or CVS root"
+				checkExists="true"
+				create="true"/>
+		<app-root
+				property="ANT_INSTALL_ROOT"
+				defaultValue="${env.ANT_INSTALL_HOME}"
+				displayText="Confirm the AntInstall directory"
+				checkFile1="antlib/ant.jar"
+				checkFile2="lib/ant-installer.jar"
+				checkDir1="lib"
+				checkDir2="antlib"
+				/>
+		<file
+				property="PROJECT_LIC"
+				defaultValue="${env.ANT_INSTALL_HOME}/lib/LICENSE-ant-install.txt"
+				defaultValueWin="${env.ANT_INSTALL_HOME}\lib\LICENSE-ant-install.txt"
+				displayText="Choose a License File"
+				checkExists="true"/>
+	</page>
+	<page
+			type="input"
+			name="targets"
+			displayText="Select resources to include in the installer">
+		<target 
+			target="SourceCode"
+			displayText="Include Source Code"
+			defaultValue="true"/>
+		<target 
+			target="Libraries"
+			displayText="Include Libraries (Jars)"
+			defaultValue="true"/>
+		<target 
+			target="Scripts"
+			displayText="Include Scripts"
+			defaultValue="true"/>
+		<target 
+			target="Documentation"
+			displayText="Include Documents"
+			defaultValue="true"/>
+		<target 
+			target="Classes"
+			displayText="Include Classes"
+			defaultValue="true"/>
+	</page>
+	<page
+			type="input"
+			name="resources"
+			displayText="Source Code"
+			ifTarget="SourceCode">
+		<directory
+				property="PROJECT_SRC"
+				defaultValue="${RESOURCE_ROOT}/${PROJECT_SHORT_NAME}/src"
+				defaultValueWin="${RESOURCE_ROOT}\${PROJECT_SHORT_NAME}\src"
+				displayText="Select the source code"
+				checkExists="true"
+				create="false"/>
+	</page>
+	<page
+			type="input"
+			name="resources"
+			displayText="Libraries"
+			ifTarget="Libraries">
+		<directory
+				property="PROJECT_LIB"
+				defaultValue="${RESOURCE_ROOT}/${PROJECT_SHORT_NAME}/lib"
+				defaultValueWin="${RESOURCE_ROOT}\${PROJECT_SHORT_NAME}\lib"
+				displayText="Select the libraries"
+				checkExists="true"
+				create="false"/>
+	</page>
+	<page
+			type="input"
+			name="resources"
+			displayText="Scripts"
+			ifTarget="Scripts">
+		<directory
+				property="PROJECT_BIN"
+				defaultValue="${RESOURCE_ROOT}/${PROJECT_SHORT_NAME}/bin"
+				defaultValueWin="${RESOURCE_ROOT}\${PROJECT_SHORT_NAME}\bin"
+				displayText="Select the scripts"
+				checkExists="true"
+				create="false"/>
+	</page>
+	<page
+			type="input"
+			name="resources"
+			displayText="Documentation"
+			ifTarget="Documentation">
+		<directory
+				property="PROJECT_DOC"
+				defaultValue="${RESOURCE_ROOT}/${PROJECT_SHORT_NAME}/doc"
+				defaultValueWin="${RESOURCE_ROOT}\${PROJECT_SHORT_NAME}\doc"
+				displayText="Select the documentation"
+				checkExists="true"
+				create="false"/>
+	</page>
+	<page
+			type="input"
+			name="resources"
+			displayText="Classes"
+			ifTarget="Classes">
+		<directory
+				property="PROJECT_CLASSES"
+				defaultValue="${RESOURCE_ROOT}/${PROJECT_SHORT_NAME}/classes"
+				defaultValueWin="${RESOURCE_ROOT}\${PROJECT_SHORT_NAME}\classes"
+				displayText="Select the classes"
+				checkExists="true"
+				create="false"/>
+	</page>
+	<page
+			type="input"
+			name="createinstaller"
+			displayText="Create Installer">
+		<target
+				target="CreateInstaller"
+				defaultValue="true"
+				explanatoryText="You may wish to edit the project files this tool will create. If not, select 'Create the installer' to create a selfextracting jar file from the resources previously chosen"
+				displayText="Create the installer"/>
+	</page>
+	<page
+			type="progress"
+			name="progress"
+			displayText="Build progress"
+			showTargets="false">
+	</page>
+</installer>
+
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/build-self-extractor-template.sh
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/build-self-extractor-template.sh	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/build-self-extractor-template.sh	(revision 21851)
@@ -0,0 +1,25 @@
+#!/bin/sh
+dir=`expr  match "$0" '\(.*\)build-self-extractor.sh'`
+#  if it we did not call ./  change to the directory we called
+if [ "$dir" != "./" ] ; then
+   if [ "$dir" != "" ] ;  then
+      echo changing to $dir
+      cd "$dir" ;
+   fi
+fi
+
+
+
+if [ "$JAVA_HOME" = "" ] ; then
+	echo set JAVA_HOME;
+	exit 1;
+fi
+
+# Ant classpath
+ANT_INSTALLER_HOME=@ANT_INSTALL_ROOT@
+CLASSPATH=$ANT_INSTALLER_HOME/antlib/ant.jar
+CLASSPATH=$CLASSPATH:$ANT_INSTALLER_HOME/antlib/xml-apis.jar
+CLASSPATH=$CLASSPATH:$ANT_INSTALLER_HOME/antlib/xercesImpl.jar
+CLASSPATH=$CLASSPATH:$ANT_INSTALLER_HOME/antlib/ant-launcher.jar
+
+$JAVA_HOME/bin/java -cp $CLASSPATH org.apache.tools.ant.Main -buildfile ./create-installer.xml 
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/build-template.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/build-template.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/build-template.xml	(revision 21851)
@@ -0,0 +1,80 @@
+<?xml version="1.0"?>
+<!--
+This is the build.xml run by AntInstaller for the installer
+-->
+
+<project name="Installation"  default=""  basedir="${basedir}">
+
+	<!-- this is required to pick up the properties generated during the install pages -->
+	<property file="${basedir}/ant.install.properties"/>
+
+
+	<target name="default" depends="">
+		<echo message="Createing Installation directory"/>
+		<mkdir dir="${installDir}"/>
+	
+		<!--Scripts
+		<echo message="Installing Scripts files"/>
+		<mkdir dir="${installDir}/bin"/>
+		<unzip src="${antinstaller.jar}" dest="${installDir}">
+			<patternset>
+				<include name="bin/*.sh"/>
+				<include name="bin/*.ksh"/>
+				<include name="bin/*.csh"/>
+				<include name="bin/*.cmd"/>
+				<include name="bin/*.bat"/>
+			</patternset>
+		</unzip>
+		<chmod file="${installDir}/bin/*.sh" perm="774"/>
+		<chmod file="${installDir}/bin/*.ksh" perm="774"/>
+		<chmod file="${installDir}/bin/*.csh" perm="774"/>
+		Scripts-->
+	
+		<!--Libraries
+		<echo message="Installing Libraries files"/>
+		<mkdir dir="${installDir}/lib"/>
+		<unzip src="${antinstaller.jar}" dest="${installDir}">
+			<patternset>
+				<include name="lib/*"/>
+			</patternset>
+		</unzip>
+		Libraries-->
+	
+		<!--Classes
+		<echo message="Installing Class files"/>
+		<mkdir dir="${installDir}/classes"/>
+		<unzip src="${antinstaller.jar}" dest="${installDir}">
+			<patternset>
+				<include name="classes/**/*"/>
+			</patternset>
+		</unzip>
+		Classes-->
+	</target>
+
+	<!--Documentation
+	<target name="tgdoc" depends="">
+		<echo message="Installing Documentation files"/>
+		<mkdir dir="${installDir}/doc"/>
+		<unzip src="${antinstaller.jar}" dest="${installDir}">
+			<patternset>
+				<include name="doc/**/*"/>
+			</patternset>
+		</unzip>
+	</target>
+	Documentation-->
+	
+	<!--SourceCode
+	<target name="tgsrc" depends="">
+		<echo message="Installing Source files"/>
+		<mkdir dir="${installDir}/src"/>
+		<unzip src="${antinstaller.jar}" dest="${installDir}">
+			<patternset>
+				<include name="src/**/*"/>
+			</patternset>
+		</unzip>
+	</target>
+	SourceCode-->
+
+	<target name="cleanuptarget" depends="">
+	</target>
+</project>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/build.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/build.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/build.xml	(revision 21851)
@@ -0,0 +1,143 @@
+<?xml version="1.0"?>
+
+<!--  this file is creates a build directory -->
+<project name="Create Default Installer"  default=""  basedir="${basedir}">
+
+
+	<property file="${basedir}/ant.install.properties"/>
+	<!-- the above file sets the following -->
+	<property name="ANT_INSTALL_ROOT"   value=""/>
+	<property name="PROJECT_NAME"       value=""/>
+	<property name="PROJECT_SHORT_NAME" value=""/>
+	<property name="PROJECT_ROOT"       value=""/>
+	<property name="PROJECT_SRC"        value=""/>
+	<property name="PROJECT_LIB"        value=""/>
+	<property name="PROJECT_LIC"        value=""/>
+	<property name="PROJECT_BIN"        value=""/>
+	<property name="PROJECT_DOC"        value=""/>
+	<property name="PROJECT_CLASSES"    value=""/>
+		
+	<property name="THIS_PROJECT_ROOT"     value="${PROJECT_ROOT}/${PROJECT_SHORT_NAME}"/>
+
+	<target name="Base">
+		<mkdir dir="${THIS_PROJECT_ROOT}"/>
+		<copy
+			file="${ANT_INSTALL_ROOT}/templates/defaultproject/build-template.xml"
+			tofile="${THIS_PROJECT_ROOT}/build.xml">
+		</copy>
+		<copy
+			file="${ANT_INSTALL_ROOT}/templates/defaultproject/antinstall-config-template.xml"
+			tofile="${THIS_PROJECT_ROOT}/antinstall-config.xml">
+		</copy>
+		<replace file="${THIS_PROJECT_ROOT}/antinstall-config.xml">
+			<replacefilter token="@PROJECT_NAME@"       value="${PROJECT_NAME}"/>
+			<replacefilter token="@PROJECT_SHORT_NAME@" value="${PROJECT_SHORT_NAME}"/>
+		</replace>
+		<copy
+			file="${ANT_INSTALL_ROOT}/templates/defaultproject/create-installer-template.xml"
+			tofile="${THIS_PROJECT_ROOT}/create-installer.xml">
+		</copy>
+		<replace file="${THIS_PROJECT_ROOT}/create-installer.xml">
+			<replacefilter token="@ANT_INSTALL_ROOT@" value="${ANT_INSTALL_ROOT}"/>
+			<replacefilter token="@PROJECT_NAME@"     value="${PROJECT_NAME}"/>
+			<replacefilter token="@PROJECT_SHORT_NAME@"     value="${PROJECT_SHORT_NAME}"/>
+			<replacefilter token="@PROJECT_ROOT@"     value="${PROJECT_ROOT}"/>
+			<replacefilter token="@PROJECT_SRC@"      value="${PROJECT_SRC}"/>
+			<replacefilter token="@PROJECT_LIB@"      value="${PROJECT_LIB}"/>
+			<replacefilter token="@PROJECT_LIC@"      value="${PROJECT_LIC}"/>
+			<replacefilter token="@PROJECT_BIN@"      value="${PROJECT_BIN}"/>
+			<replacefilter token="@PROJECT_DOC@"      value="${PROJECT_DOC}"/>
+			<replacefilter token="@PROJECT_CLASSES@"  value="${PROJECT_CLASSES}"/>
+		</replace>
+	
+		<copy
+			file="${ANT_INSTALL_ROOT}/templates/defaultproject/build-self-extractor-template.sh"
+			tofile="${THIS_PROJECT_ROOT}/build-self-extractor.sh">
+		</copy>
+		<replace file="${THIS_PROJECT_ROOT}/build-self-extractor.sh">
+			<replacefilter token="@ANT_INSTALL_ROOT@"       value="${ANT_INSTALL_ROOT}"/>
+		</replace>
+		<chmod file="${THIS_PROJECT_ROOT}/build-self-extractor.sh" perm="774"/>
+	</target>
+
+	<target name="SourceCode">
+		<replace file="${THIS_PROJECT_ROOT}/create-installer.xml">
+			<replacefilter token="&lt;!--SourceCode" value=""/>
+			<replacefilter token="SourceCode--&gt;"  value=""/>
+		</replace>
+		<replace file="${THIS_PROJECT_ROOT}/build.xml">
+			<replacefilter token="&lt;!--SourceCode" value=""/>
+			<replacefilter token="SourceCode--&gt;"  value=""/>
+		</replace>
+		<replace file="${THIS_PROJECT_ROOT}/antinstall-config.xml">
+			<replacefilter token="&lt;!--SourceCode" value=""/>
+			<replacefilter token="SourceCode--&gt;"  value=""/>
+		</replace>
+	</target>
+
+	<target name="Libraries">
+		<replace file="${THIS_PROJECT_ROOT}/create-installer.xml">
+			<replacefilter token="&lt;!--Libraries" value=""/>
+			<replacefilter token="Libraries--&gt;"  value=""/>
+		</replace>
+		<replace file="${THIS_PROJECT_ROOT}/build.xml">
+			<replacefilter token="&lt;!--Libraries" value=""/>
+			<replacefilter token="Libraries--&gt;"  value=""/>
+		</replace>
+		<replace file="${THIS_PROJECT_ROOT}/antinstall-config.xml">
+			<replacefilter token="&lt;!--Libraries" value=""/>
+			<replacefilter token="Libraries--&gt;"  value=""/>
+		</replace>
+	</target>
+
+	<target name="Documentation">
+		<replace file="${THIS_PROJECT_ROOT}/create-installer.xml">
+			<replacefilter token="&lt;!--Documentation" value=""/>
+			<replacefilter token="Documentation--&gt;"  value=""/>
+		</replace>
+		<replace file="${THIS_PROJECT_ROOT}/build.xml">
+			<replacefilter token="&lt;!--Documentation" value=""/>
+			<replacefilter token="Documentation--&gt;"  value=""/>
+		</replace>
+		<replace file="${THIS_PROJECT_ROOT}/antinstall-config.xml">
+			<replacefilter token="&lt;!--Documentation" value=""/>
+			<replacefilter token="Documentation--&gt;"  value=""/>
+		</replace>
+	</target>
+
+	<target name="Classes">
+		<replace file="${THIS_PROJECT_ROOT}/create-installer.xml">
+			<replacefilter token="&lt;!--Classes" value=""/>
+			<replacefilter token="Classes--&gt;"  value=""/>
+		</replace>
+		<replace file="${THIS_PROJECT_ROOT}/build.xml">
+			<replacefilter token="&lt;!--Classes" value=""/>
+			<replacefilter token="Classes--&gt;"  value=""/>
+		</replace>
+		<replace file="${THIS_PROJECT_ROOT}/antinstall-config.xml">
+			<replacefilter token="&lt;!--Classes" value=""/>
+			<replacefilter token="Classes--&gt;"  value=""/>
+		</replace>
+	</target>
+
+	<target name="Scripts">
+		<replace file="${THIS_PROJECT_ROOT}/create-installer.xml">
+			<replacefilter token="&lt;!--Scripts" value=""/>
+			<replacefilter token="Scripts--&gt;"  value=""/>
+		</replace>
+		<replace file="${THIS_PROJECT_ROOT}/build.xml">
+			<replacefilter token="&lt;!--Scripts" value=""/>
+			<replacefilter token="Scripts--&gt;"  value=""/>
+		</replace>
+		<replace file="${THIS_PROJECT_ROOT}/antinstall-config.xml">
+			<replacefilter token="&lt;!--Scripts" value=""/>
+			<replacefilter token="Scripts--&gt;"  value=""/>
+		</replace>
+	</target>
+
+	<target name="CreateInstaller">
+		<echo message="Creating the Selfextracting installer"/>
+		<ant antfile="${THIS_PROJECT_ROOT}/create-installer.xml"/>
+	</target>
+
+</project>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/create-installer-template.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/create-installer-template.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/create-installer-template.xml	(revision 21851)
@@ -0,0 +1,81 @@
+<?xml version="1.0"?>
+<!--
+this ant build file can be re-run with the following command if Ant is installer locally
+> ant -buildfile create-installer.xml
+or by running the script @PROJECT_ROOT@/@PROJECT_SHORT_NAME@/build-self-extractor.sh
+-->
+<!--  this file is creates an installer for the Project @PROJECT_NAME@ -->
+<project name="Create @PROJECT_NAME@ Installer"  default="MakeNonExtractor"  basedir=".">
+
+	<path id="taskdef.cp" path="@ANT_INSTALL_ROOT@/lib/ant-installer-ext.jar"/>
+	<taskdef 
+		name="installer" 
+		classname="org.tp23.antinstaller.taskdefs.Installer"
+		classpathref="taskdef.cp"/>
+
+
+		<property name="ANT_INSTALL_ROOT" value="@ANT_INSTALL_ROOT@"/>
+		<property name="PROJECT_NAME"     value="@PROJECT_NAME@"/>
+		<property name="PROJECT_SHORT_NAME"     value="@PROJECT_SHORT_NAME@"/>
+		<property name="PROJECT_ROOT"     value="@PROJECT_ROOT@"/>
+		<property name="PROJECT_SRC"      value="@PROJECT_SRC@"/>
+		<property name="PROJECT_LIB"      value="@PROJECT_LIB@"/>
+		<property name="PROJECT_LIC"      value="@PROJECT_LIC@"/>
+		<property name="PROJECT_BIN"      value="@PROJECT_BIN@"/>
+		<property name="PROJECT_DOC"      value="@PROJECT_DOC@"/>
+		<property name="PROJECT_CLASSES"  value="@PROJECT_CLASSES@"/>
+		
+		<property name="THIS_PROJECT_ROOT"     value="${PROJECT_ROOT}/${PROJECT_SHORT_NAME}"/>
+
+		<!-- This task only needs to run once it can be deleted once the self-extract files exist on the build host  -->
+	<target name="Base">
+			<echo message="Building NonExtractor runnable jar file"/>
+	</target>
+
+
+	<target name="MakeNonExtractor" depends="Base">
+		
+		<installer file="${THIS_PROJECT_ROOT}/${PROJECT_SHORT_NAME}-installer.jar" compress="true"
+				extractType="NonExtractor"
+				installConfig="${THIS_PROJECT_ROOT}/antinstall-config.xml"
+				buildFile="${THIS_PROJECT_ROOT}/build.xml"
+				antInstallLib="${ANT_INSTALL_ROOT}/lib"
+				antLib="${ANT_INSTALL_ROOT}/antlib"
+				validateConfig="true"
+				icons="bluecurve">
+			<zipfileset fullpath="resources/License.txt" file="${PROJECT_LIC}"/>
+			<zipfileset dir="cp" includes="resources/*"/>
+		<!--SourceCode
+			<zipfileset dir="${PROJECT_SRC}" prefix="src">
+				<include name="**/*"/>
+			</zipfileset>
+		SourceCode-->
+		<!--Libraries
+			<zipfileset dir="${PROJECT_LIB}" prefix="lib">
+				<include name="**/*.jar"/>
+			</zipfileset>
+		Libraries-->
+		<!--Documentation
+			<zipfileset dir="${PROJECT_DOC}" prefix="docs">
+				<include name="**/*"/>
+			</zipfileset>
+		Documentation-->
+		<!--Classes
+			<zipfileset dir="${PROJECT_CLASSES}" prefix="classes">
+				<include name="**/*"/>
+			</zipfileset>
+		Classes-->
+		<!--Scripts
+			<zipfileset dir="${PROJECT_BIN}" prefix="bin" >
+				<include name="**/*.sh"/>
+				<include name="**/*.ksh"/>
+				<include name="**/*.csh"/>
+				<include name="**/*.cmd"/>
+				<include name="**/*.bat"/>
+			</zipfileset>
+		Scripts-->
+		</installer>
+	</target>
+
+
+</project>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/runtemplate.cmd
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/runtemplate.cmd	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/runtemplate.cmd	(revision 21851)
@@ -0,0 +1,56 @@
+@echo off
+
+if  "%JAVA_HOME%" == "" goto nojava
+if  "%ANT_INSTALL_HOME%" == "" goto trydot
+
+goto setclasspath
+
+:trydot
+if EXIST ..\..\lib\ant-installer.jar set ANT_INSTALL_HOME=..\..
+if NOT EXIST ..\..\lib\ant-installer.jar goto noai
+echo ANT_INSTALL_HOME = %ANT_INSTALL_HOME%
+
+:setclasspath
+REM Ant classpath
+set CLASSPATH=%ANT_INSTALL_HOME%\antlib\ant.jar;%ANT_INSTALL_HOME%\antlib\ant-launcher.jar
+
+REM Images classpath
+set CLASSPATH=%CLASSPATH%;.\cp
+set CLASSPATH=%CLASSPATH%;..\..\images\navicons\amaranth
+
+REM XML classpath
+set CLASSPATH=%CLASSPATH%;%ANT_INSTALL_HOME%\lib\xercesImpl.jar;%ANT_INSTALL_HOME%\lib\xml-apis.jar
+
+REM AntInstaller classpath
+set CLASSPATH=%CLASSPATH%;%ANT_INSTALL_HOME%\lib\ant-installer.jar
+set CLASSPATH=%CLASSPATH%;%ANT_INSTALL_HOME%\lib\jgoodies-edited-1_2_2.jar
+
+if "%1" == "text" goto settext
+if "%1" == "swing" goto setswing
+goto setswing
+
+:settext
+set COMMAND=%JAVA_HOME%\bin\java
+set INTERFACE=text
+goto install
+
+:setswing
+set COMMAND=%JAVA_HOME%\bin\javaw
+set INTERFACE=swing
+goto install
+
+:install
+start "Antinstaller" "%COMMAND%" -classpath "%CLASSPATH%"  org.tp23.antinstaller.runtime.ExecInstall %INTERFACE% .
+goto end
+
+:nojava
+echo set JAVA_HOME
+echo you must install java to install this application
+goto end
+
+:noai
+echo set ANT_INSTALL_HOME
+echo you must install AntInstaller to install this application
+goto end
+
+:end
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/runtemplate.sh
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/runtemplate.sh	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/templates/defaultproject/runtemplate.sh	(revision 21851)
@@ -0,0 +1,39 @@
+#!/bin/sh
+
+dir=`expr  match "$0" '\(.*\)runtemplate.sh'`
+#  if it we did not call ./  change to the directory we called
+if [ "$dir" != "./" ] ; then
+   if [ "$dir" != "" ] ;  then
+      echo changing to $dir
+      cd "$dir" ;
+   fi
+fi
+
+if [ "$ANT_INSTALL_HOME" == "" ] ; then 
+  export ANT_INSTALL_HOME=../..
+fi
+
+if [ ! -f $ANT_INSTALL_HOME/lib/ant-installer.jar ] ; then 
+  echo "set ANT_INSTALL_HOME"
+  exit 1;
+fi
+
+if [ "$JAVA_HOME" = "" ] ; then
+	echo set JAVA_HOME;
+	exit 1;
+fi
+
+
+CLASSPATH=$ANT_INSTALL_HOME/lib/xercesImpl.jar:$ANT_INSTALL_HOME/lib/xml-apis.jar:$ANT_INSTALL_HOME/lib/ant-installer.jar:$ANT_INSTALL_HOME/lib/ai-icons-eclipse.jar
+CLASSPATH=$CLASSPATH:$ANT_INSTALL_HOME/antlib/ant.jar:$ANT_INSTALL_HOME/antlib/ant-launcher.jar
+CLASSPATH=$CLASSPATH:$ANT_INSTALL_HOME/lib/jgoodies-edited-1_2_2.jar
+CLASSPATH=$CLASSPATH:./cp
+CLASSPATH=$CLASSPATH:../../images/navicons/amaranth
+
+COMMAND=$JAVA_HOME/bin/java
+INTERFACE=swing
+if [ "$1" = "text" ] ; then
+	INTERFACE=text;
+fi
+
+$COMMAND -classpath $CLASSPATH  org.tp23.antinstaller.runtime.ExecInstall $INTERFACE .
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/windows-icons/installIcons-docs.cmd
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/windows-icons/installIcons-docs.cmd	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/windows-icons/installIcons-docs.cmd	(revision 21851)
@@ -0,0 +1,3 @@
+@echo off
+REM this batch file exists so that the parameters of this line are NOT quoted
+rundll32 setupapi,InstallHinfSection DefaultInstall 128 @installDir@\windows-icons\installIcons-docs.inf
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/windows-icons/installIcons-docs.inf
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/windows-icons/installIcons-docs.inf	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/windows-icons/installIcons-docs.inf	(revision 21851)
@@ -0,0 +1,11 @@
+[version]
+signature="$chicago$"
+
+[DefaultInstall]
+UpdateInis=Addlink
+
+[AddLink]
+setup.ini, progman.groups,, "group0=AntInstaller"
+setup.ini, group0,, ""AntInstaller""
+setup.ini, group0,, """AntInstaller Docs"",""cmd /c """"@installDir@\web\index.html"""""", ""@installDir@\AntInstaller.ico"",0,"
+setup.ini, group0,, """AntInstaller Wizard"",""cmd /c """"@installDir@\wizard.cmd"""""", ""@installDir@\AntInstaller.ico"",0,"
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/wizard.cmd
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/wizard.cmd	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/wizard.cmd	(revision 21851)
@@ -0,0 +1,19 @@
+@echo off
+
+if  "%JAVA_HOME%" == "" goto nojava
+
+set DIR=%~dp0
+cd %DIR%
+
+cd .\templates\defaultproject
+call runtemplate.cmd %1
+cd ..\..
+goto end
+
+:nojava
+echo set JAVA_HOME
+echo you must install java use the wizard
+pause
+goto end
+
+:end
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-installer/wizard.sh
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-installer/wizard.sh	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-installer/wizard.sh	(revision 21851)
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+dir=`expr  match "$0" '\(.*\)wizard.sh'`
+#  if it we did not call ./  change to the directory we called
+if [ "$dir" != "./" ] ; then
+   if [ "$dir" != "" ] ;  then
+      echo changing to $dir
+      cd "$dir" ;
+   fi
+fi
+./templates/defaultproject/runtemplate.sh $1
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-scripts/create-installer.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-scripts/create-installer.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-scripts/create-installer.xml	(revision 21851)
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<project name="create-installer">
+
+	<target name="create-installer" depends="init">
+
+		<!-- create installer directory -->
+		<mkdir dir="installer/classes"/>
+
+		<!-- insert the installer descriptors -->
+		<copy todir="installer" overwrite="true">
+			<fileset dir="${rk.home}/kits/${rk.name}/installer" includes="antinstall-config.xml,build.xml"/>
+		</copy>
+
+		<!-- insert the language bundle -->
+		<native2ascii
+			implementation="sun"
+			encoding="UTF-8"
+			src="${rk.home}/shared/core/language-strings"
+			dest="${basedir}/installer/classes/resources"/>
+
+		<!-- insert core, rk-specific and os-specific installer classes -->
+		<copy todir="${basedir}/installer/classes" overwrite="true">
+			<fileset dir="${rk.home}/shared/core/installer-classes" erroronmissingdir="false"/>
+			<fileset dir="${rk.home}/kits/${rk.name}/installer-classes" erroronmissingdir="false"/>
+			<fileset dir="${rk.home}/shared/${rk.os}/installer-classes" erroronmissingdir="false"/>
+		</copy>
+
+		<!-- insert the licence -->
+		<copy file="compiled/LICENSE.txt" todir="${basedir}/installer/classes" overwrite="true"/>
+
+		<!-- insert greenstone's ant tasks -->
+		<unjar src="${rk.home}/shared/core/ant-tasks/greenstone/anttasks.jar" dest="installer/classes"/>
+
+		<!-- (windows only) -->
+		<if><bool><equals arg1="${rk.os}" arg2="windows"/></bool>
+			<!-- insert 7za.exe tool -->
+			<copy todir="installer/classes" overwrite="true" file="${rk.home}/shared/windows/7za/7za.exe"/>
+
+			<!-- insert roxes and orangevolt for windows tricks in ant -->
+			<unjar src="${rk.home}/shared/core/ant-tasks/orangevolt/roxes-win32forjava-1.1.1.jar" dest="installer/classes"/>
+			<unjar src="${rk.home}/shared/core/ant-tasks/orangevolt/orangevolt-ant-tasks-1.3.8.jar" dest="installer/classes"/>
+
+		<!-- (linux and mac only) -->
+		<else><if><bool><or><equals arg1="${rk.os}" arg2="linux"/><equals arg1="${rk.os}" arg2="mac"/></or></bool>
+			<!-- insert 7zip ant task -->
+			<unjar src="${rk.home}/shared/core/ant-tasks/7z-ant/7z.jar" dest="installer/classes"/>
+
+		</if></else></if>
+
+		<!-- clean up meta directory -->
+		<delete dir="installer/classes/META-INF"/>
+
+		<!-- calculate the size of: core -->
+		<length property="component.bytesize.core-without-jre" mode="all"><fileset file="${basedir}/components/core.comp"/></length>
+		<if><bool><equals arg1="${rk.os}" arg2="windows"/></bool>
+			<math result="component.bytesize.core" operand1="${component.bytesize.core-without-jre}" operation="+" operand2="${component.bytesize.windows-java}" datatype="int"/>
+		<else><if><bool><equals arg1="${rk.os}" arg2="linux"/></bool>
+			<math result="component.bytesize.core" operand1="${component.bytesize.core-without-jre}" operation="+" operand2="${component.bytesize.linux-java}" datatype="int"/>
+		<else>
+			<property name="component.bytesize.core" value="${component.bytesize.core-without-jre}"/>
+		</else></if></else></if>
+		<math result="component.megabytesize.core" operand1="${component.bytesize.core}" operation="/" operand2="1048576" datatype="int"/>
+		<property name="component.size.core" value="${component.megabytesize.core} MB"/>
+
+		<!-- calculate the size of: imagemagick -->
+		<length property="component.bytesize.imagemagick" mode="all"><fileset file="${basedir}/components/imagemagick.comp"/></length>
+		<math result="component.megabytesize.imagemagick" operand1="${component.bytesize.imagemagick}" operation="/" operand2="1048576" datatype="int"/>
+		<property name="component.size.imagemagick" value="${component.megabytesize.imagemagick} MB"/>
+
+		<!-- calculate the size of: ghostscript -->
+		<length property="component.bytesize.ghostscript" mode="all"><fileset file="${basedir}/components/ghostscript.comp"/></length>
+		<math result="component.megabytesize.ghostscript" operand1="${component.bytesize.ghostscript}" operation="/" operand2="1048576" datatype="int"/>
+		<property name="component.size.ghostscript" value="${component.megabytesize.ghostscript} MB"/>
+
+		<!-- calculate the size of: tomcat -->
+		<length property="component.bytesize.tomcat" mode="all"><fileset file="${basedir}/components/tomcat.comp"/></length>
+		<math result="component.megabytesize.tomcat" operand1="${component.bytesize.tomcat}" operation="/" operand2="1048576" datatype="int"/>
+		<property name="component.size.tomcat" value="${component.megabytesize.tomcat} MB"/>
+
+		<!-- make the installer descriptors relevant to the current os -->
+		<dcff file="installer/antinstall-config.xml" startTag="&lt;!--\s*if\s*(?!.*${rk.os})[^ ]+\s*--&gt;" endTag="&lt;!--\s*/if\s*--&gt;" />
+		<dcff file="installer/build.xml" startTag="&lt;!--\s*if\s*(?!.*${rk.os})[^ ]+\s*--&gt;" endTag="&lt;!--\s*/if\s*--&gt;" />
+
+		<!-- put the concrete values of things in the config -->
+		<rsr>
+			<fileset dir="${basedir}/installer" includes="*.xml"/>
+			<job pattern="@version@" replacement="${version}"/>
+			<job pattern="@component.size.core@" replacement="${component.size.core}"/>
+			<job pattern="@component.size.tomcat@" replacement="${component.size.tomcat}"/>
+			<job pattern="@component.size.imagemagick@" replacement="${component.size.imagemagick}"/>
+			<job pattern="@component.size.ghostscript@" replacement="${component.size.ghostscript}"/>
+			<job pattern="@java.min.version@" replacement="${java.min.version}"/>
+			<job pattern="@java.extracted@" replacement="${java.extracted}"/>
+		</rsr>
+
+		<!-- put the concrete values of things in the text -->
+		<rsr>
+			<fileset dir="${basedir}/installer/classes/resources" includes="*.properties"/>
+			<job pattern="@version@" replacement="${version}"/>
+			<job pattern="@version.major@" replacement="${version.major}"/>
+			<job pattern="@java.min.version@" replacement="${java.min.version}"/>
+			<job pattern="@bundled.version.imagemagick@" replacement="${bundled.version.imagemagick}"/>
+			<job pattern="@bundled.version.ghostscript@" replacement="${bundled.version.ghostscript}"/>
+			<job pattern="@bundled.version.tomcat@" replacement="${bundled.version.tomcat}"/>
+			<job pattern="@bundled.version.windows-java@" replacement="${bundled.version.windows-java}"/>
+			<job pattern="@bundled.version.linux-java@" replacement="${bundled.version.linux-java}"/>
+		</rsr>
+
+		<!-- now ready to run "compile-*-installer" targets -->
+
+		<antcall target="compile-binary-installer"/>
+
+	</target>
+
+	<target name="compile-binary-installer">
+
+		<!-- strip out lines for the cdrom installer -->
+		<copy file="installer/antinstall-config.xml" tofile="installer/antinstall-config-binary.xml" overwrite="true"/>
+		<dcff file="installer/antinstall-config-binary.xml" startTag=".*&lt;!-- start cdrom --&gt;.*" endTag=".*&lt;!-- end cdrom --&gt;.*" />
+		<copy file="installer/build.xml" tofile="installer/build-binary.xml" overwrite="true"/>
+		<dcff file="installer/build-binary.xml" startTag=".*&lt;!-- start cdrom --&gt;.*" endTag=".*&lt;!-- end cdrom --&gt;.*" />
+
+		<!-- create insaller jar with ant-installer's ant task -->
+		<installer file="installer/Greenstone-${version}-${os.suffix}.jar"
+			compress="true"
+			extractType="NonExtractor"
+			installConfig="installer/antinstall-config-binary.xml"
+			buildFile="installer/build-binary.xml"
+			antInstallLib="${rk.home}/shared/core/ant-installer/lib"
+			antLib="${ant.home}/lib"
+			validateConfig="true"
+			icons="bluecurve">
+
+			<zipfileset dir="installer/classes" includes="**/*" />
+			<zipfileset dir="components" includes="*.lzma"/>
+		</installer>
+		
+	</target>
+
+	<target name="compile-cdrom-installer">
+
+		<!-- strip out lines for the binary(web) installer -->
+		<copy file="installer/antinstall-config.xml" tofile="installer/antinstall-config-cdrom.xml"/>
+		<dcff file="installer/antinstall-config-cdrom.xml" startTag=".*&lt;!-- start web --&gt;.*" endTag=".*&lt;!-- end web --&gt;.*" />
+		<copy file="installer/build.xml" tofile="installer/build-cdrom.xml"/>
+		<dcff file="installer/build-cdrom.xml" startTag=".*&lt;!-- start web --&gt;.*" endTag=".*&lt;!-- end web --&gt;.*" />
+
+		<installer file="installer/cdrom.jar"
+			compress="true"
+			extractType="NonExtractor"
+			installConfig="installer/antinstall-config-cdrom.xml"
+			buildFile="installer/build-cdrom.xml"
+			antInstallLib="${rk.home}/shared/core/ant-installer/lib"
+			antLib="${ant.home}/lib"
+			validateConfig="true"
+			icons="bluecurve">
+
+			<zipfileset dir="installer/classes" includes="**/*" />
+		</installer>
+		
+	</target>
+
+</project>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-scripts/shared.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-scripts/shared.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-scripts/shared.xml	(revision 21851)
@@ -0,0 +1,386 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<project name="rk-init">
+
+	<!-- CHECK PRE-CONDITIONS  -->
+	<target name="init">
+
+		<!-- load in static properties from build.properties -->
+		<property file="${rk.name}-build.properties" />
+
+		<!-- load environment properties -->
+		<property environment="env"/>
+
+		<!-- CONSTANTS (overridable in build.properties) -->
+
+		<!-- svn root -->
+		<property name="svn.root" value="http://svn.greenstone.org" />
+
+		<!-- default revision and branch path -->
+		<property name="branch.path" value="trunk" />
+		<property name="branch.revision" value="HEAD" />
+	
+		<!-- the minimum version of java which the installer should be run with (this gets used in search4j) -->
+		<property name="java.min.version" value="1.4.0_00"/>
+
+		<!-- create a localised basedir property -->
+		<path id="basedir.path"><pathelement location="${basedir}"/></path>
+		<property name="basedir.local" refid="basedir.path"/>
+
+		<!-- size of resource chunks (windows wrapper) -->
+		<property name="resources.chunksize" value="8388608"/>
+
+		<!-- the extra space for the dmg image in KB (mac wrapper) -->
+        	<property name="dmg.overhead" value="2048"/>
+
+		<!-- current date and time -->
+		<tstamp>
+			<format property="current.month" pattern="MMM"/>
+			<format property="current.year" pattern="yyyy"/>
+			<format property="date" pattern="yyyy.MM.dd"/>
+		</tstamp>
+
+		<!-- BUNDLED JAVA INFO -->
+		<!-- the bundled javas are kept in shared/linux/wrapper and shared/windows/wrapper in the repository -->
+		<!-- change this info when the bundled version changes -->
+		<property name="java.extracted" value="jre"/> <!-- set this to the name of the top level directory in the above archive -->
+
+		<!-- linux -->
+		<property name="linux-java.installer" value="jre_bin"/>
+		<property name="bundled.version.linux-java" value="1.6.0_05"/> <!-- set this to the version number of java in the above archive -->
+		<property name="component.bytesize.linux-java" value="101245987"/> <!-- set this to the size of the extract archive -->
+
+		<!-- windows -->
+		<property name="windows-java.installer" value="jre.exe"/>
+		<property name="bundled.version.windows-java" value="1.6.0_07"/> <!-- set this to the version number of java in the above archive -->
+		<property name="component.bytesize.windows-java" value="75000000"/> <!-- set this to the size of the extract archive -->
+
+		<!-- version numbers of other bundled things -->
+		<property name="bundled.version.imagemagick" value="6.4.3"/>
+		<property name="bundled.version.ghostscript" value="8.63"/>
+		<property name="bundled.version.tomcat" value="6.0.20"/>
+	
+		<!-- CLASSPATH -->
+		<path id="project.classpath">
+
+			<!-- our classes -->
+			<fileset dir="${rk.home}/shared/core">
+				<include name="ant-tasks/antelope/AntelopeTasks_3.4.2.jar"/>
+				<include name="ant-tasks/orangevolt/roxes-win32forjava-1.1.1.jar"/>
+				<include name="ant-tasks/orangevolt/orangevolt-ant-tasks-1.3.8.jar"/>
+				<include name="ant-tasks/greenstone/anttasks.jar"/>
+				<include name="ant-tasks/7z-ant/7z.jar"/>
+				<include name="lib/crypt.jar"/>
+				<include name="lib/serializer.jar"/>
+				<include name="lib/xalan.jar"/>
+				<include name="lib/xercesImpl.jar"/>
+				<include name="lib/xml-apis.jar"/>
+				<include name="ant-installer/lib/ant-installer-ext.jar"/>
+				<include name="ant-installer/lib/ant-installer.jar"/>
+			</fileset>
+
+		</path>
+
+		<!-- SELF DEFINED TASKS AND TYPES -->
+		<taskdef name="if" classname="ise.antelope.tasks.IfTask" classpathref="project.classpath"/>
+		<taskdef name="try" classname="ise.antelope.tasks.TryTask" classpathref="project.classpath"/>
+		<taskdef name="math" classname="ise.antelope.tasks.MathTask" classpathref="project.classpath"/>
+		<taskdef name="sevenzip" classname="org.apache.tools.ant.SevenZip" classpathref="project.classpath"/>
+		<taskdef name="installer" classname="org.tp23.antinstaller.taskdefs.Installer" classpathref="project.classpath"/>
+		<typedef name="rsr" classname="org.greenstone.anttasks.RegexSearchReplace" classpathref="project.classpath"/>
+		<typedef name="dcff" classname="org.greenstone.anttasks.DeleteChunkFromFile" classpathref="project.classpath"/>
+		<typedef name="rsplit" classname="org.greenstone.anttasks.SplitResource" classpathref="project.classpath"/>
+		<typedef name="get-property-value" classname="org.greenstone.anttasks.GetPropertyValue" classpathref="project.classpath"/>
+	
+		<!-- DATES IN DIFFERENT LANGUAGES -->
+		<get-property-value propertiesFile="${rk.home}/shared/core/lib/dates.properties" propertyName="ar.Dates.${current.month}" outputProperty="month.ar"/>
+		<get-property-value propertiesFile="${rk.home}/shared/core/lib/dates.properties" propertyName="ca.Dates.${current.month}" outputProperty="month.ca"/>
+		<get-property-value propertiesFile="${rk.home}/shared/core/lib/dates.properties" propertyName="el.Dates.${current.month}" outputProperty="month.el"/>
+		<get-property-value propertiesFile="${rk.home}/shared/core/lib/dates.properties" propertyName="es.Dates.${current.month}" outputProperty="month.es"/>
+		<get-property-value propertiesFile="${rk.home}/shared/core/lib/dates.properties" propertyName="fr.Dates.${current.month}" outputProperty="month.fr"/>
+		<get-property-value propertiesFile="${rk.home}/shared/core/lib/dates.properties" propertyName="lv.Dates.${current.month}" outputProperty="month.lv"/>
+		<get-property-value propertiesFile="${rk.home}/shared/core/lib/dates.properties" propertyName="mr.Dates.${current.month}" outputProperty="month.mr"/>
+		<get-property-value propertiesFile="${rk.home}/shared/core/lib/dates.properties" propertyName="ro.Dates.${current.month}" outputProperty="month.ro"/>
+		<get-property-value propertiesFile="${rk.home}/shared/core/lib/dates.properties" propertyName="ru.Dates.${current.month}" outputProperty="month.ru"/>
+		<get-property-value propertiesFile="${rk.home}/shared/core/lib/dates.properties" propertyName="vi.Dates.${current.month}" outputProperty="month.vi"/>
+		<get-property-value propertiesFile="${rk.home}/shared/core/lib/dates.properties" propertyName="zh.Dates.${current.month}" outputProperty="month.zh"/>
+		<get-property-value propertiesFile="${rk.home}/shared/core/lib/dates.properties" propertyName="default.Dates.${current.month}" outputProperty="month.default"/>
+
+
+		<!-- version number -->
+		<if><bool><not><isset property="version"/></not></bool>
+			<fail>Version number not set. Check that the file '${rk.name}-build.properties' exists and defines property 'version'.</fail>
+		</if>
+		<property name="app.version" value="${version}"/>
+
+		<!-- work out rk.os -->
+		<if>
+			<bool>
+				<or>
+					<equals arg1="${rk.os}" arg2="linux"/>
+					<equals arg1="${rk.os}" arg2="mac"/>
+					<equals arg1="${rk.os}" arg2="windows"/>
+				</or>
+			</bool>
+			<echo>Using user-specified value for rk.os: '${rk.os}'</echo>
+
+		<else><if>
+			<bool><equals arg1="${os.name}" arg2="Linux"/></bool>
+			<property name="rk.os" value="linux"/>
+
+		<else><if>
+			<bool><equals arg1="${os.name}" arg2="Mac OS X"/></bool>
+			<property name="rk.os" value="mac"/>
+
+		<else><if>
+			<bool>
+				<or>
+					<equals arg1="${os.name}" arg2="Windows 95"/>
+					<equals arg1="${os.name}" arg2="Windows 98"/>
+					<equals arg1="${os.name}" arg2="Windows 2000"/>
+					<equals arg1="${os.name}" arg2="Windows XP"/>
+					<equals arg1="${os.name}" arg2="Windows NT"/>
+					<equals arg1="${os.name}" arg2="Windows ME"/>
+					<equals arg1="${os.name}" arg2="Windows Vista"/>
+				</or>
+			</bool>
+			<property name="rk.os" value="windows"/>
+
+		<else>
+			<fail>Can't work out what to set rk.os to. Please report this to greenstone_team@cs.waikato.ac.nz . In the mean time, manually set rk.os to 'windows', 'mac', or 'linux' by reinvoking the release kit with, for example, '-Drk.os=windows'</fail>
+
+		</else></if></else></if></else></if></else></if>
+
+		<!-- set os.suffix and os.shell -->
+		<if><bool><equals arg1="${rk.os}" arg2="mac"/></bool>
+			<property name="os.suffix" value="MacOS-intel"/>
+			<property name="os.shell" value="darwin"/>
+		</if>
+		<property name="os.suffix" value="${rk.os}"/>
+		<property name="os.shell" value="${rk.os}"/>
+
+		<!-- set os.script.format -->
+		<if><bool><or><equals arg1="${rk.os}" arg2="linux"/><equals arg1="${rk.os}" arg2="mac"/></or></bool>
+			<property name="os.script.format" value="sh"/>
+		<else><if><bool><equals arg1="${rk.os}" arg2="windows"/></bool>
+			<property name="os.script.format" value="bat"/>
+		</if></else></if>
+
+		<!-- show important properties -->
+		<echo level="info">Version (version): ${version}</echo>
+		<echo level="info">Major Version (version.major): ${version.major}</echo>
+		<echo level="info">Branch Path (branch.path): ${branch.path}</echo>
+		<echo level="info">Date (date): ${date}</echo>
+		<echo level="info">Current Month (current.month): ${current.month}</echo>
+		<echo level="info">Current Year (current.year): ${current.year}</echo>
+		<echo level="info">Operating System (rk.os): ${rk.os}</echo>
+		<echo level="info">Operating System Suffix (os.suffix): ${os.suffix}</echo>
+		<echo level="info">Operating System Script format (os.script.format): ${os.script.format}</echo>
+		<echo level="info">Operating System Shell (os.shell): ${os.shell}</echo>
+		<!--
+		<echo level="info">Current Date</echo>
+		<echo level="info">ar: ${month.ar} ${current.year}</echo>
+		<echo level="info">ca: ${month.el} ${current.year}</echo>
+		<echo level="info">el: ${month.el} ${current.year}</echo>
+		<echo level="info">es: ${month.es} ${current.year}</echo>
+		<echo level="info">fr: ${month.fr} ${current.year}</echo>
+		<echo level="info">lv: ${month.lv} ${current.year}</echo>
+		<echo level="info">mr: ${month.mr} ${current.year}</echo>
+		<echo level="info">ro: ${month.ro} ${current.year}</echo>
+		<echo level="info">ru: ${month.ru} ${current.year}</echo>
+		<echo level="info">vi: ${month.vi} ${current.year}</echo>
+		<echo level="info">zh: ${month.zh} ${current.year}</echo>
+		<echo level="info">default: (${month.default} ${current.year})</echo>
+		-->
+	</target>
+
+	<!-- show the core properties of all release-kits -->
+	<target name="core-properties">
+		<echo>version             (required)  the version string for the release</echo>
+		<echo>branch.path         (optional)  the branch of Greenstone to make a release of. Eg: tags/2.81. Default: trunk.</echo>
+		<echo>branch.revision     (optional)  the revision of Greenstone to make a release of. Eg: 18273. Default: HEAD.</echo>
+	</target>
+
+	<!-- a target to strip any directory of .svn folders -->
+	<target name="strip-svn-dirs">
+		<delete includeemptydirs="true">
+			<fileset dir="${dir}" defaultexcludes="false">
+				<include name="**/.svn/**" />
+				<include name="**/.svn/" />
+				<include name=".svn/**" />
+				<include name=".svn/" />
+			</fileset>
+		</delete>
+	</target>
+
+	<!-- target to insert the uninstaller into 'compiled' and compile it -->
+	<target name="insert-and-compile-uninstaller">
+
+		<!-- create working build directory -->
+		<mkdir dir="compiled/uninstaller/build/resources" />
+
+		<!-- copile to build -->
+		<javac
+			srcdir="${rk.home}/shared/core/uninstaller"
+			destdir="compiled/uninstaller/build" />
+
+		<!-- copy language bundle into place -->
+		<native2ascii
+			implementation="sun"
+			src="${rk.home}/shared/core/language-strings"
+			dest="compiled/uninstaller/build/resources"/>
+
+		<!-- jar it all up -->
+		<jar
+			destfile="compiled/uninst.jar"
+			manifest="${rk.home}/shared/core/uninstaller/manifest.mf"
+			basedir="compiled/uninstaller/build" />
+
+		<!-- clean up build directory -->
+		<delete dir="compiled/uninstaller"/>
+
+		<!-- put the associated script in place -->
+		<copy file="${rk.home}/shared/core/uninstaller/Uninstall.${os.script.format}" todir="compiled"/>
+
+	</target>
+
+	<!-- target to set all the version numbers in a greenstone2 or gs2build directory -->
+	<target name="gsdl-set-version-numbers">
+
+		<if><bool><available file="${gsdl.basedir}/common-src/src/lib/gsdlconf.h"/></bool>
+			<rsr file="${gsdl.basedir}/common-src/src/lib/gsdlconf.h" pattern="(#define GSDL_VERSION) &quot;.*&quot;" replacement="$1 &quot;${version}&quot;" />
+		</if>
+
+		<if><bool><available file="${gsdl.basedir}/etc/VERSION"/></bool>
+			<rsr file="${gsdl.basedir}/etc/VERSION" pattern="(gsdl version: ).*" replacement="$1${version}" />
+		</if>
+
+		<if><bool><available file="${gsdl.basedir}/lib/java/server.properties"/></bool>
+			<rsr file="${gsdl.basedir}/lib/java/server.properties" pattern="^(Server2Control.Version[:=]).*" replacement="$1${version}" />
+		</if>
+
+		<if><bool><available file="${gsdl.basedir}/lib/java/log4j.properties.in"/></bool>
+			<rsr file="${gsdl.basedir}/lib/java/log4j.properties.in" pattern="^(log4j.category.org.greenstone.server[:=].*)INFO(.*)" replacement="$1WARN$2" />
+		</if>
+
+		<antcall target="gsdl-set-dates-in-readmes"><param name="gsdl.basedir" value="${gsdl.basedir}"/></antcall>
+
+	</target>
+
+	<!-- target to set dates in readme files -->
+	<target name="gsdl-set-dates-in-readmes">
+
+		<!-- en -->
+		<if><bool><available file="${gsdl.basedir}/READMEen.txt"/></bool>
+			<rsr file="${gsdl.basedir}/READMEen.txt">
+				<job pattern="^(Date\s*)(.*)" replacement="$1${month.default} ${current.year}" />
+				<job pattern="^(Version\s*)(.*)" replacement="$1${version}" />
+			</rsr>
+		</if>
+
+		<!-- ar -->
+		<if><bool><available file="${gsdl.basedir}/READMEar.txt"/></bool>
+			<rsr file="${gsdl.basedir}/READMEar.txt">
+				<job pattern="(Ø§ÙØªØ§Ø±ÙØ® : \s*)(.*)" replacement="$1${month.ar} ${current.year}"/>
+				<job pattern="(Ø§ÙÙØ³Ø®Ù : \s*)(.*)" replacement="$1${version}"/>
+			</rsr>
+		</if>
+
+		<!-- es -->
+		<if><bool><available file="${gsdl.basedir}/READMEes.txt"/></bool>
+			<rsr file="${gsdl.basedir}/READMEes.txt">
+				<job pattern="^(Fecha\s*)(.*)" replacement="$1${month.es} de ${current.year}"/>
+				<job pattern="^(Versi.?n\s*)(.*)" replacement="$1${version}"/>
+			</rsr>
+		</if>
+
+		<!-- fr -->
+		<if><bool><available file="${gsdl.basedir}/READMEfr.txt"/></bool>
+			<rsr file="${gsdl.basedir}/READMEfr.txt">
+				<job pattern="^(Date\s*)(.*)" replacement="$1${month.fr} ${current.year}"/>
+				<job pattern="^(Version\s*)(.*)" replacement="$1${version}"/>
+			</rsr>
+		</if>
+
+		<!-- ru -->
+		<if><bool><available file="${gsdl.basedir}/READMEru.txt"/></bool>
+			<rsr file="${gsdl.basedir}/READMEru.txt">
+				<job pattern="^(ÐÐ°ÑÐ°\s*)(.*)" replacement="$1${month.ru} ${current.year}"/>
+				<job pattern="^(ÐÐµÑÑÐžÑ\s*)(.*)" replacement="$1${version}"/>
+			</rsr>
+		</if>
+
+	</target>
+
+	<!-- target to set version numbers in gli -->
+	<target name="gli-set-version-numbers">
+
+			<!-- DICTIOANRY FILES (AboutDialog.Date) -->
+			<echo level="info">Changing AboutDialog.Date in all dictionaries</echo>
+
+			<rsr file="${glibasedir}/classes/dictionary_ar.properties" pattern="AboutDialog.Date:.*" replacement="AboutDialog.Date:(${month.ar} ${current.year})" />
+			<rsr file="${glibasedir}/classes/dictionary_ca.properties" pattern="AboutDialog.Date:.*" replacement="AboutDialog.Date:(${month.ca} de ${current.year})" />
+			<rsr file="${glibasedir}/classes/dictionary_el.properties" pattern="AboutDialog.Date:.*" replacement="AboutDialog.Date:(${month.el} ${current.year})" />
+			<rsr file="${glibasedir}/classes/dictionary_es.properties" pattern="AboutDialog.Date:.*" replacement="AboutDialog.Date:(${month.es} ${current.year})" />
+			<rsr file="${glibasedir}/classes/dictionary_fr.properties" pattern="AboutDialog.Date:.*" replacement="AboutDialog.Date:(${month.fr} ${current.year})" />
+			<rsr file="${glibasedir}/classes/dictionary_lv.properties" pattern="AboutDialog.Date:.*" replacement="AboutDialog.Date:(${month.lv} ${current.year})" />
+			<rsr file="${glibasedir}/classes/dictionary_mr.properties" pattern="AboutDialog.Date:.*" replacement="AboutDialog.Date:(${month.mr} ${current.year})" />
+			<rsr file="${glibasedir}/classes/dictionary_ro.properties" pattern="AboutDialog.Date:.*" replacement="AboutDialog.Date:(${month.ro} ${current.year})" />
+			<rsr file="${glibasedir}/classes/dictionary_ru.properties" pattern="AboutDialog.Date:.*" replacement="AboutDialog.Date:(${month.ru} ${current.year})" />
+			<rsr file="${glibasedir}/classes/dictionary_vi.properties" pattern="AboutDialog.Date:.*" replacement="AboutDialog.Date:(${month.vi} ${current.year})" />
+			<rsr file="${glibasedir}/classes/dictionary_zh.properties" pattern="AboutDialog.Date:.*" replacement="AboutDialog.Date:(${month.zh} ${current.year})" />
+			<rsr file="${glibasedir}/classes/dictionary.properties" pattern="AboutDialog.Date:.*" replacement="AboutDialog.Date:(${month.default} ${current.year})" />
+
+			<!-- GLI GATHERER -->
+			<echo level="info">Changing version number in gli Gatherer</echo>
+			<rsr file="${glibasedir}/src/org/greenstone/gatherer/Gatherer.java" pattern="^(.*)String\s*PROGRAM_VERSION\s*=\s*&quot;(.*)&quot;" replacement="$1String PROGRAM_VERSION = &quot;${version}&quot;"/>
+
+			<!-- CONFIG XML FILES -->
+			<echo level="info">Changing configuration version in classes/xml/config.xml</echo>
+			<rsr file="${glibasedir}/classes/xml/config.xml" pattern="^(\s*&lt;Configuration.* version=&quot;)[^&quot;]*(&quot;.*&gt;)" replacement="$1${version}$2"/>
+
+			<echo level="info">Changing configuration version in gli/classes/xml/configRemote.xml</echo>
+			<rsr file="${glibasedir}/classes/xml/configRemote.xml" pattern="^(\s*&lt;Configuration.* version=&quot;)[^&quot;]*(&quot;.*&gt;)" replacement="$1${version}$2"/>
+
+	</target>
+
+	<!-- target to tidy gli up for distribution -->
+	<target name="gli-tidy-for-dist">
+		<!-- delete unneeded things -->
+		<delete file="${glibasedir}/.greenstonestore"/>		
+		<delete dir="${glibasedir}/classes/META-INF"/>
+		<delete dir="${glibasedir}/classes/org"/>
+		<delete dir="${glibasedir}/classes/images"/>
+		<delete dir="${glibasedir}/metadata"/>
+		<delete dir="${glibasedir}/help"/>
+		<delete dir="${glibasedir}/jar"/>
+		<delete dir="${glibasedir}/lib"/>
+		<if><bool><not><equals arg1="windows" arg2="${rk.os}"/></not></bool>
+			<delete dir="${glibasedir}/winutil"/>
+		</if>
+	</target>
+
+
+	<!-- target to archive and compress a given component -->
+	<target name="create-component">
+		<mkdir dir="components"/>
+		<zip destfile="components/${component}.comp" compress="false">
+			<zipfileset dir="compiled">
+				<patternset refid="greenstone${version.major}.${component}.component"/>
+			</zipfileset>
+		</zip>
+		<!-- windows -->
+		<if><bool><equals arg1="${rk.os}" arg2="windows"/></bool>
+			<exec executable="${rk.home}/shared/windows/7za/7za.exe" dir="components"><arg line="a -t7z -mx=9 ${component}.lzma ${component}.comp"/></exec>
+		
+		<!-- linux, mac -->
+		<else><if><bool><or><equals arg1="${rk.os}" arg2="linux"/><equals arg1="${rk.os}" arg2="mac"/></or></bool>
+			<sevenzip task="encode" input="components/${component}.comp" output="components/${component}.lzma" dictionnary="26"/>
+
+		<!-- else warn -->
+		<else>
+			<fail>this target does not support this os (was a new release-kit os added?)</fail>
+
+		</else></if></else></if>
+	</target>	
+
+</project>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-scripts/wrap.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-scripts/wrap.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-scripts/wrap.xml	(revision 21851)
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<project name="wrap" default="wrap">
+
+	<target name="wrap" depends="init">
+
+		<!-- create products directory -->
+		<mkdir dir="products"/>
+
+		<!-- (windows) -->
+		<if><bool><equals arg1="${rk.os}" arg2="windows"/></bool>
+
+			<!--create a directory to build the wrapped installer in -->
+			<mkdir dir="wrapped-installer"/>
+
+			<!-- copy wrapper source into place -->
+			<copy todir="wrapped-installer" overwrite="true">
+				<fileset dir="${rk.home}/shared/windows/wrapper"/>
+				<fileset file="${rk.home}/shared/core/icon/icon.ico"/>
+				<fileset dir="${rk.home}/shared/core/search4j" includes="libsearch4j.cpp,libsearch4j.h"/>
+			</copy>
+
+			<!-- substitute in concrete values -->
+			<rsr file="wrapped-installer/wrapper.cpp">
+				<job pattern="@java.installer@" replacement="${windows-java.installer}"/>
+				<job pattern="@java.min.version@" replacement="${java.min.version}"/>
+				<job pattern="@bundled.version.java@" replacement="${bundled.version.windows-java}"/>
+				<job pattern="@java.extracted@" replacement="${java.extracted}"/>
+			</rsr>
+
+			<!-- get the template resource script -->
+			<copy todir="wrapped-installer" file="${rk.home}/shared/windows/wrapper/wrapper.rc" overwrite="true"/>
+
+			<!-- split the resources into chunks, creating a resource script of the chunks -->
+			<rsplit
+				resource="${rk.home}/shared/windows/wrapper/${windows-java.installer}"
+				outputDir="wrapped-installer"					
+				resourceScript="wrapped-installer/wrapper.rc"
+				resourceName="JAVA"
+				resourceType="EXE"
+				chunkSize="${resources.chunksize}"/>
+			<rsplit
+				resource="installer/Greenstone-${version}-${os.suffix}.jar"
+				outputDir="wrapped-installer"
+				resourceScript="wrapped-installer/wrapper.rc"
+				resourceName="JAR"
+				resourceType="JAR"
+				chunkSize="${resources.chunksize}"
+				/>
+
+			<!-- compile the resources -->
+			<exec executable="rc" dir="wrapped-installer">
+				<arg line="wrapper.rc"/>
+			</exec>
+
+			<!-- compile the wrapper -->
+			<exec executable="cl" dir="wrapped-installer">
+				<arg line="/c -GX /DWINDOWS=yes libsearch4j.cpp /out:libsearch4j.obj"/>
+			</exec>
+			<exec executable="cl" dir="wrapped-installer">
+				<arg line="/c -GX /DWINDOWS=yes wrapper.cpp /out:wrapper.obj"/>
+			</exec>
+
+			<!-- link wrapper -->
+			<exec executable="link" dir="wrapped-installer">
+				<arg line="/OUT:..\products\Greenstone-${version}-${os.suffix}.exe gdi32.lib advapi32.lib shell32.lib user32.lib libsearch4j.obj wrapper.obj wrapper.res"/>
+			</exec>
+
+		<!-- (linux) -->
+		<else><if><bool><equals arg1="${rk.os}" arg2="linux"/></bool>
+			<!-- create the build directory -->
+			<mkdir dir="wrapped-installer"/>
+
+			<!-- copy the source into place --> 
+			<copy todir="wrapped-installer" overwrite="true">
+				<fileset file="${rk.home}/shared/linux/wrapper.cpp"/>
+				<fileset dir="${rk.home}/shared/core/search4j" includes="libsearch4j.cpp,libsearch4j.h"/>
+			</copy>
+
+			<!-- copy bundled files into place -->
+			<copy todir="wrapped-installer" file="${rk.home}/shared/linux/${linux-java.installer}"/>
+			<copy tofile="wrapped-installer/greenstone.jar" file="installer/Greenstone-${version}-${os.suffix}.jar"/>
+
+			<!-- substitute in real values -->
+			<rsr file="wrapped-installer/wrapper.cpp">
+				<job pattern="@java.installer@" replacement="${linux-java.installer}"/>
+				<job pattern="@java.extracted@" replacement="${java.extracted}"/>
+				<job pattern="@java.min.version@" replacement="${java.min.version}"/>
+			</rsr>
+
+			<!-- create an object file (extension .o) for each file to bundle -->
+			<exec executable="/usr/bin/objcopy" dir="wrapped-installer">
+				<arg line="-I binary -O elf32-i386 -B i386 --redefine-sym _binary_greenstone_jar_start=greenstonejar --readonly-text greenstone.jar greenstone.jar.o"/>
+			</exec>
+			<exec executable="/usr/bin/objcopy" dir="wrapped-installer">
+				<arg line="-I binary -O elf32-i386 -B i386 --redefine-sym _binary_${linux-java.installer}_start=java --readonly-text ${linux-java.installer} java.o"/>
+			</exec>
+
+			<!-- compile libsearch4j -->
+			<exec executable="g++" dir="wrapped-installer">
+				<arg line="-Wall -static -static-libgcc -c -o libsearch4j.o libsearch4j.cpp"/>
+			</exec>
+
+			<!-- figure out jar size (web jar) -->
+			<exec executable="ls" dir="wrapped-installer" outputproperty="greenstone.jar.ls"><arg line="-l greenstone.jar"/></exec>
+			<exec executable="sed" inputstring="${greenstone.jar.ls}" outputproperty="greenstone.jar.size"><arg line="-e 's/^[^\ ]*\ *[^\ ]*\ *[^\ ]*\ *[^\ ]*\ *\([0-9]*\).*$/\1/g'"/></exec>
+
+			<!-- figure out java size -->
+			<exec executable="ls" dir="wrapped-installer" outputproperty="java.ls"><arg line="-l ${linux-java.installer}"/></exec>
+			<exec executable="sed" inputstring="${java.ls}" outputproperty="java.size"><arg line="-e 's/^[^\ ]*\ *[^\ ]*\ *[^\ ]*\ *[^\ ]*\ *\([0-9]*\).*$/\1/g'"/></exec>
+
+			<!-- creating wrapper header file -->
+			<delete file="wrapper.h"/>
+			<exec executable="echo" output="wrapped-installer/wrapper.h"><arg line="extern const char greenstonejar[${greenstone.jar.size}];"/></exec>
+			<exec executable="echo" output="wrapped-installer/wrapper.h" append="true"><arg line="extern const char java[${java.size}];"/></exec>
+			<exec executable="echo" output="wrapped-installer/wrapper.h" append="true"><arg line="#define java_is_bundled yes"/></exec>
+
+			<!-- compile the wrapper program -->
+			<exec executable="g++" dir="wrapped-installer">
+				<arg line="-Wall -static -static-libgcc -c -o wrapper.o wrapper.cpp"/>
+			</exec>
+
+			<!-- link the compiled code and bundled files -->
+			<exec executable="g++" dir="wrapped-installer">
+				<arg line="-static -static-libgcc -o ../products/Greenstone-${version}-linux wrapper.o libsearch4j.o greenstone.jar.o java.o"/>
+			</exec>
+
+		<!-- (mac) -->
+		<else><if><bool><equals arg1="${rk.os}" arg2="mac"/></bool>
+
+			<!-- create and setup the build directory -->
+			<delete dir="wrapped-installer"/>
+			<mkdir dir="wrapped-installer"/>
+
+			<!-- create app for main installer -->
+			<copy todir="wrapped-installer/Greenstone${version}.app"><fileset dir="${rk.home}/shared/mac/Wrapper.app"/></copy>
+			<copy todir="wrapped-installer/Greenstone${version}.app/Contents/Resources" file="${rk.home}/shared/core/icon/icon.icns"/>
+			<chmod file="wrapped-installer/Greenstone${version}.app/Contents/MacOS/JavaApplicationStub" perm="ug+x"/>
+
+			<!-- copy bundled files -->
+			<copy todir="wrapped-installer/Greenstone${version}.app/Contents/Resources/Java" file="installer/Greenstone-${version}-${os.suffix}.jar"/>
+
+			<!-- substitute in real values -->
+			<rsr file="wrapped-installer/Greenstone${version}.app/Contents/Info.plist">
+				<job pattern="@jar@" replacement="Greenstone-${version}-${os.suffix}.jar"/>
+				<job pattern="@version@" replacement="${version}"/>
+			</rsr>
+
+			<!-- turn app into a dmg -->
+
+			<!-- get size of app -->
+			<exec executable="du" dir="wrapped-installer" outputproperty="app.du"><arg line="-ks Greenstone${version}.app"/></exec>
+			<exec executable="sed" inputstring="${app.du}" outputproperty="app.size"><arg line="-e 's/^\([0-9]*\).*$/\1/g'"/></exec>
+			<math result="dmg.size" operand1="${app.size}" operation="+" operand2="${dmg.overhead}" datatype="int"/>
+
+			<!-- create disk image -->
+			<property name="dmg.name" value="Greenstone-${version}-${os.suffix}"/>
+			<exec dir="products" executable="hdiutil" failonerror="true"><arg line="create -ov -size ${dmg.size}k -fs HFS+ -volname ${dmg.name} ${dmg.name}.dmg"/></exec>
+			<!-- mount it -->
+			<exec executable="hdiutil" dir="products" failonerror="true"><arg line="attach ${dmg.name}.dmg"/></exec>
+			<!-- copy file into it -->
+			<exec executable="cp"><arg line="-r wrapped-installer/Greenstone${version}.app /Volumes/${dmg.name}"/></exec>
+			<!-- unmount it-->
+			<exec executable="hdiutil" failonerror="true"><arg line="detach /Volumes/${dmg.name}"/></exec>
+		</if></else></if></else></if>
+
+
+	</target>
+
+</project>
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/build.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/build.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/build.xml	(revision 21851)
@@ -0,0 +1,62 @@
+<project name="test-7z-task" default="all">
+
+	<path id="compile.classpath">
+		<pathelement path="."/>
+	</path>
+	<path id="test.classpath">
+		<pathelement path="build"/>
+		<pathelement path="lib/7z.jar"/>
+	</path>
+
+	
+	<target name="compile">
+		<mkdir dir="build"/>
+		<javac srcdir="src\SevenZip\Compression\LZ" destdir="build" classpathref="compile.classpath" debug="on"/>
+		<javac srcdir="src\SevenZip\Compression\RangeCoder" destdir="build" classpathref="compile.classpath" debug="on"/>
+		<javac srcdir="src\SevenZip" destdir="build" classpathref="compile.classpath" debug="on" includes="ICodeProgress.java"/>
+		<javac srcdir="src\SevenZip\Compression\LZMA" destdir="build" classpathref="compile.classpath" debug="on"/>
+		<javac srcdir="src\SevenZip" destdir="build" classpathref="compile.classpath" debug="on"/>
+		<javac srcdir="src\org\apache\tools\ant" destdir="build" classpathref="compile.classpath" debug="on"/>
+		<javac srcdir="src\LZMA" destdir="build" classpathref="compile.classpath" debug="on"/>
+		<javac srcdir="src" destdir="build" classpathref="compile.classpath" debug="on" includes="UnLzma.java"/>
+	</target>
+	
+	<target name="jar">
+		<mkdir dir="lib"/>
+		<jar destfile="lib/7z.jar" basedir="build"/>
+	</target>
+	
+	<target name="all">
+		<antcall target="compile"/>
+		<antcall target="jar"/>
+	</target>
+	
+	<target name="test">
+		<taskdef name="sevenzip" classname="org.apache.tools.ant.SevenZip" classpath="build"/>
+		<echo>------------------------------------------------------------------------------------------------</echo>
+		<echo>NOTE: To run the test requires some extra memory to be allocated to the Java Virtual Machine.</echo>
+		<echo>This can be done by setting the environment variable 'ANT_OPTS' to '-Xmx256M' before running ant</echo>
+		<echo>Otherwise you might find the test fails with 'java.lang.OutOfMemoryError: Java heap space'</echo>
+		<echo>------------------------------------------------------------------------------------------------</echo>
+		<echo/>
+		<mkdir dir="test"/>
+		<echo>Compressing resources/test.zip to test/test.lzma</echo>
+		<sevenzip task="encode" input="resources/test.zip" output="test/test.lzma"/>
+		<echo>Uncompressing test/test.lzma to test/test.zip</echo>
+		<sevenzip task="decode" input="test/test.lzma" output="test/test.zip"/>
+	</target>
+	
+	<target name="test-clean">
+		<delete dir="test"/>
+	</target>
+
+	<target name="compile-clean">
+		<delete dir="lib"/>
+		<delete dir="build"/>
+	</target>
+	
+	<target name="clean">
+		<antcall target="compile-clean"/>
+		<antcall target="test-clean"/>
+	</target>
+</project>
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/LZMA/CRangeDecoder.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/LZMA/CRangeDecoder.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/LZMA/CRangeDecoder.java	(revision 21851)
@@ -0,0 +1,165 @@
+package LZMA;
+
+import java.io.InputStream;
+import java.io.IOException;
+
+class CRangeDecoder {
+
+	final static int kNumTopBits = 24;
+	final static int kTopValue = (1 << kNumTopBits);
+	final static int kTopValueMask = ~(kTopValue-1);
+
+	final static int kNumBitModelTotalBits = 11;
+	final static int kBitModelTotal = (1 << kNumBitModelTotalBits);
+	final static int kNumMoveBits = 5;
+
+	InputStream inStream;
+
+	int Range;
+	int Code;
+
+	byte buffer[];
+	int buffer_size;
+	int buffer_ind;
+
+	CRangeDecoder( InputStream iStream ) throws IOException {
+		this.buffer = new byte[1<<14];
+		this.inStream = iStream;
+		this.Code = 0;
+		this.Range = -1; // 0xFFFFFFFFL;
+		for(int i = 0; i < 5; i++)
+			this.Code = (this.Code << 8) | (Readbyte());
+	}
+
+	int Readbyte() throws IOException {
+		if (buffer_size == buffer_ind) {
+			buffer_size = inStream.read(buffer);
+			buffer_ind = 0;
+
+			if (buffer_size < 1)
+				throw new LzmaException ("LZMA : Data Error");
+		}
+		return buffer[buffer_ind++] & 0xFF;
+	}
+
+	int DecodeDirectBits(int numTotalBits) throws IOException {
+		int result = 0;
+		for (int i = numTotalBits; i > 0; i--) {
+			Range >>>= 1;
+			int t = ((Code - Range) >>> 31);
+			Code -= Range & (t - 1);
+			result = (result << 1) | (1 - t);
+            
+			if (Range < kTopValue) // because of "Range >>>= 1",   0 <= Range <= 0x7FFFFFFF
+			{
+				Code = (Code << 8) | Readbyte();
+				Range <<= 8;
+			}
+		}
+		return result;
+	}
+
+	int BitDecode(int prob[],int index) throws IOException {
+		int newBound = (this.Range >>> kNumBitModelTotalBits) * prob[index];
+		if ((this.Code & 0xFFFFFFFFL) < (newBound & 0xFFFFFFFFL)) // unsigned comparison
+		{
+			this.Range = newBound;
+			prob[index] += (kBitModelTotal - prob[index]) >>> kNumMoveBits;
+			// if ((this.Range & 0xFFFFFFFFL) < Decoder.kTopValue)
+			if ((this.Range & kTopValueMask) == 0) {
+				this.Code = (this.Code << 8) | Readbyte();
+			this.Range <<= 8;
+			}
+			return 0;
+		} else {
+			this.Range -= newBound;
+			this.Code -= newBound;
+			prob[index] -= (prob[index]) >>> kNumMoveBits;
+			// if ((this.Range & 0xFFFFFFFFL) < Decoder.kTopValue)
+			if ((this.Range & kTopValueMask) == 0) {
+				this.Code = (this.Code << 8) | this.Readbyte();
+				this.Range <<= 8;
+			}
+			return 1;
+		}
+	}
+
+	int BitTreeDecode(int probs [], int index , int numLevels) throws IOException {
+		int mi = 1;
+		for(int i = numLevels; i > 0; i--) {
+			mi = (mi + mi) + BitDecode(probs, index + mi);
+		}
+		return mi - (1 << numLevels);
+	}
+
+	int ReverseBitTreeDecode(int probs[] ,int index, int numLevels) throws IOException {
+		int mi = 1;
+		int symbol = 0;
+
+		for(int i = 0; i < numLevels; i++) {
+			int bit = BitDecode(probs, index + mi);
+			mi = mi + mi + bit;
+			symbol |= (bit << i);
+		}
+		return symbol;
+	}
+
+	byte LzmaLiteralDecode(int probs[],int index) throws IOException {
+		int symbol = 1;
+		do {
+			symbol = (symbol + symbol) | BitDecode(probs, index + symbol);
+		} while (symbol < 0x100);
+
+		return (byte)symbol;
+	}
+
+	byte LzmaLiteralDecodeMatch(int probs [], int index, byte matchbyte) throws IOException {
+		int symbol = 1;
+		do {
+			int matchBit = (matchbyte >> 7) & 1;
+			matchbyte <<= 1;
+			int bit = BitDecode(probs , index + ((1 + matchBit) << 8) + symbol);
+			symbol = (symbol << 1) | bit;
+
+			if (matchBit != bit) {
+				while (symbol < 0x100) {
+					symbol = (symbol + symbol) | BitDecode(probs , index + symbol);
+				}
+				break;
+			}
+		} while (symbol < 0x100);
+
+		return (byte)symbol;
+	}
+
+	final static int kNumPosBitsMax = 4;
+	final static int kNumPosStatesMax = (1 << kNumPosBitsMax);
+
+	final static int kLenNumLowBits = 3;
+	final static int kLenNumLowSymbols = (1 << kLenNumLowBits);
+	final static int kLenNumMidBits = 3;
+	final static int kLenNumMidSymbols = (1 << kLenNumMidBits);
+	final static int kLenNumHighBits = 8;
+	final static int kLenNumHighSymbols = (1 << kLenNumHighBits);
+
+	final static int LenChoice = 0;
+	final static int LenChoice2 = (LenChoice + 1);
+	final static int LenLow = (LenChoice2 + 1);
+	final static int LenMid = (LenLow + (kNumPosStatesMax << kLenNumLowBits));
+	final static int LenHigh = (LenMid + (kNumPosStatesMax << kLenNumMidBits));
+	final static int kNumLenProbs = (LenHigh + kLenNumHighSymbols);
+
+	int LzmaLenDecode(int probs[], int index, int posState) throws IOException {
+		if(BitDecode(probs, index + LenChoice) == 0)
+			return BitTreeDecode(probs, index + LenLow +
+			                     (posState << kLenNumLowBits), kLenNumLowBits);
+
+		if(BitDecode(probs, index + LenChoice2) == 0)
+			return kLenNumLowSymbols + BitTreeDecode(probs, index + LenMid +
+			        (posState << kLenNumMidBits), kLenNumMidBits);
+
+		return kLenNumLowSymbols + kLenNumMidSymbols +
+		       BitTreeDecode(probs, index + LenHigh, kLenNumHighBits);
+	}
+}
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/LZMA/LzmaException.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/LZMA/LzmaException.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/LZMA/LzmaException.java	(revision 21851)
@@ -0,0 +1,15 @@
+package LZMA;
+
+public class LzmaException extends java.io.IOException {
+	/**
+	 * Comment for <code>serialVersionUID</code>
+	 */
+	private static final long serialVersionUID = 3689351022372206390L;
+
+	public LzmaException() {}
+
+	public LzmaException (String msg) {
+		super(msg);
+	}
+}
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/LZMA/LzmaInputStream.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/LZMA/LzmaInputStream.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/LZMA/LzmaInputStream.java	(revision 21851)
@@ -0,0 +1,328 @@
+package LZMA;
+
+import java.io.InputStream;
+import java.io.IOException;
+
+public class LzmaInputStream extends java.io.FilterInputStream {
+	boolean isClosed;
+	CRangeDecoder RangeDecoder;
+	byte  [] dictionary;
+	int dictionarySize;
+	int dictionaryPos;
+	int GlobalPos;
+	int rep0, rep1, rep2, rep3;
+	int lc;
+	int lp;
+	int pb;
+	int State;
+	boolean PreviousIsMatch;
+	int RemainLen;
+	int [] probs;
+
+	byte [] uncompressed_buffer;
+	int uncompressed_size;
+	int uncompressed_offset;
+	long GlobalNowPos;
+	long GlobalOutSize;
+
+	static final int LZMA_BASE_SIZE = 1846;
+	static final int LZMA_LIT_SIZE  = 768;
+
+	final static int kBlockSize = 0x10000;
+
+	static final int kNumStates = 12;
+
+	static final int kStartPosModelIndex = 4;
+	static final int kEndPosModelIndex   = 14;
+	static final int kNumFullDistances   = (1 << (kEndPosModelIndex >> 1));
+
+	static final int kNumPosSlotBits    = 6;
+	static final int kNumLenToPosStates = 4;
+
+	static final int kNumAlignBits   = 4;
+	static final int kAlignTableSize = (1 << kNumAlignBits);
+
+	static final int kMatchMinLen = 2;
+
+	static final int IsMatch     = 0;
+	static final int IsRep       = (IsMatch + (kNumStates << CRangeDecoder.kNumPosBitsMax));
+	static final int IsRepG0     = (IsRep + kNumStates);
+	static final int IsRepG1     = (IsRepG0 + kNumStates);
+	static final int IsRepG2     = (IsRepG1 + kNumStates);
+	static final int IsRep0Long  = (IsRepG2 + kNumStates);
+	static final int PosSlot     = (IsRep0Long + (kNumStates << CRangeDecoder.kNumPosBitsMax));
+	static final int SpecPos     = (PosSlot + (kNumLenToPosStates << kNumPosSlotBits));
+	static final int Align       = (SpecPos + kNumFullDistances - kEndPosModelIndex);
+	static final int LenCoder    = (Align + kAlignTableSize);
+	static final int RepLenCoder = (LenCoder + CRangeDecoder.kNumLenProbs);
+	static final int Literal     = (RepLenCoder + CRangeDecoder.kNumLenProbs);
+
+	public LzmaInputStream (InputStream in) throws IOException {
+		super(in);
+
+		isClosed = false;
+
+		readHeader();
+
+		fill_buffer();
+	}
+
+	private void LzmaDecode(int outSize)  throws IOException {
+		byte previousbyte;
+		int posStateMask = (1 << (pb)) - 1;
+		int literalPosMask = (1 << (lp)) - 1;
+
+		uncompressed_size = 0;
+
+		if (RemainLen == -1) {
+			return ;
+		}
+
+		while(RemainLen > 0 && uncompressed_size < outSize) {
+			int pos = dictionaryPos - rep0;
+			if (pos < 0)
+				pos += dictionarySize;
+			uncompressed_buffer[uncompressed_size++] = dictionary[dictionaryPos] = dictionary[pos];
+			if (++dictionaryPos == dictionarySize)
+				dictionaryPos = 0;
+			RemainLen--;
+		}
+		if (dictionaryPos == 0)
+			previousbyte = dictionary[dictionarySize - 1];
+		else
+			previousbyte = dictionary[dictionaryPos - 1];
+
+		while(uncompressed_size < outSize) {
+			int posState = (int)( (uncompressed_size + GlobalPos ) & posStateMask);
+
+			if (RangeDecoder.BitDecode(probs, IsMatch + (State << CRangeDecoder.kNumPosBitsMax) + posState) == 0) {
+				int ind_prob = Literal + (LZMA_LIT_SIZE * (((
+				                                (uncompressed_size + GlobalPos )
+				                                & literalPosMask) << lc) + ((previousbyte & 0xFF) >> (8 - lc))));
+
+				if (State < 4)
+					State = 0;
+				else if (State < 10)
+					State -= 3;
+				else
+					State -= 6;
+				if (PreviousIsMatch) {
+					int pos = dictionaryPos - rep0;
+					if (pos < 0)
+						pos += dictionarySize;
+					byte matchbyte = dictionary[pos];
+
+					previousbyte = RangeDecoder.LzmaLiteralDecodeMatch(probs,ind_prob, matchbyte);
+					PreviousIsMatch = false;
+				} else {
+					previousbyte = RangeDecoder.LzmaLiteralDecode(probs,ind_prob);
+				}
+
+				uncompressed_buffer[uncompressed_size++] = previousbyte;
+
+				dictionary[dictionaryPos] = previousbyte;
+				if (++dictionaryPos == dictionarySize)
+					dictionaryPos = 0;
+
+			} else {
+				PreviousIsMatch = true;
+				if (RangeDecoder.BitDecode(probs, IsRep + State) == 1) {
+					if (RangeDecoder.BitDecode(probs, IsRepG0 + State) == 0) {
+						if (RangeDecoder.BitDecode(probs, IsRep0Long + (State << CRangeDecoder.kNumPosBitsMax) + posState) == 0) {
+
+							if ((uncompressed_size + GlobalPos) == 0) {
+								throw new LzmaException ("LZMA : Data Error");
+							}
+							State = State < 7 ? 9 : 11;
+
+							int pos = dictionaryPos - rep0;
+							if (pos < 0)
+								pos += dictionarySize;
+							previousbyte = dictionary[pos];
+							dictionary[dictionaryPos] = previousbyte;
+							if (++dictionaryPos == dictionarySize)
+								dictionaryPos = 0;
+
+							uncompressed_buffer[uncompressed_size++] = previousbyte;
+							continue;
+						}
+					} else {
+						int distance;
+						if(RangeDecoder.BitDecode(probs, IsRepG1 + State) == 0)
+							distance = rep1;
+						else {
+							if(RangeDecoder.BitDecode(probs, IsRepG2 + State) == 0)
+								distance = rep2;
+							else {
+								distance = rep3;
+								rep3 = rep2;
+							}
+							rep2 = rep1;
+						}
+						rep1 = rep0;
+						rep0 = distance;
+					}
+					RemainLen = RangeDecoder.LzmaLenDecode(probs, RepLenCoder, posState);
+					State = State < 7 ? 8 : 11;
+				} else {
+					rep3 = rep2;
+					rep2 = rep1;
+					rep1 = rep0;
+					State = State < 7 ? 7 : 10;
+					RemainLen = RangeDecoder.LzmaLenDecode(probs, LenCoder, posState);
+					int posSlot = RangeDecoder.BitTreeDecode(probs , PosSlot +
+					                                     ((RemainLen < kNumLenToPosStates ? RemainLen : kNumLenToPosStates - 1) <<
+					                                      kNumPosSlotBits), kNumPosSlotBits);
+					if (posSlot >= kStartPosModelIndex) {
+						int numDirectBits = ((posSlot >> 1) - 1);
+						rep0 = ((2 | (posSlot & 1)) << numDirectBits);
+						if (posSlot < kEndPosModelIndex) {
+							rep0 += RangeDecoder.ReverseBitTreeDecode(
+							            probs, SpecPos + rep0 - posSlot - 1, numDirectBits);
+						} else {
+							rep0 += RangeDecoder.DecodeDirectBits(
+							            numDirectBits - kNumAlignBits) << kNumAlignBits;
+							rep0 += RangeDecoder.ReverseBitTreeDecode(probs, Align, kNumAlignBits);
+						}
+					} else
+						rep0 = posSlot;
+					rep0++;
+				}
+				if (rep0 == 0) {
+
+					RemainLen = -1;
+					break;
+				}
+				if (rep0 > uncompressed_size
+
+				        + GlobalPos
+
+				   ) {
+					throw new LzmaException ("LZMA : Data Error");
+				}
+				RemainLen += kMatchMinLen;
+				do {
+
+					int pos = dictionaryPos - rep0;
+					if (pos < 0)
+						pos += dictionarySize;
+					previousbyte = dictionary[pos];
+					dictionary[dictionaryPos] = previousbyte;
+					if (++dictionaryPos == dictionarySize)
+						dictionaryPos = 0;
+
+					uncompressed_buffer[uncompressed_size++] = previousbyte;
+					RemainLen--;
+				} while(RemainLen > 0 && uncompressed_size < outSize);
+			}
+		}
+
+		GlobalPos = GlobalPos + uncompressed_size;
+	}
+
+	private void fill_buffer() throws IOException {
+		if (GlobalNowPos < GlobalOutSize) {
+			uncompressed_offset = 0;
+			long lblockSize = GlobalOutSize - GlobalNowPos;
+			int blockSize;
+			if (lblockSize > kBlockSize)
+				blockSize = kBlockSize;
+			else
+				blockSize = (int)lblockSize;
+
+			LzmaDecode(blockSize);
+
+			if (uncompressed_size == 0) {
+				GlobalOutSize = GlobalNowPos;
+			} else {
+				GlobalNowPos += uncompressed_size;
+			}
+		}
+	}
+
+	private void readHeader() throws IOException {
+		byte [] properties = new byte[5];
+
+		if (5 != in.read(properties))
+			throw new LzmaException ("LZMA header corrupted : Properties error");
+
+		GlobalOutSize = 0;
+		for (int ii = 0; ii < 8; ii++) {
+			int b = in.read();
+			if (b == -1)
+				throw new LzmaException ("LZMA header corrupted : Size error");
+			GlobalOutSize += ((long)b) << (ii * 8);
+		}
+
+                if (GlobalOutSize == -1) GlobalOutSize=Long.MAX_VALUE;
+
+		int prop0 = properties[0] & 0xFF;
+		if (prop0 >= (9*5*5)) {
+			throw new LzmaException ("LZMA header corrupted : Properties error");
+		}
+
+		for (pb = 0; prop0 >= (9 * 5); pb++, prop0 -= (9 * 5))
+			;
+		for (lp = 0; prop0 >= 9; lp++, prop0 -= 9)
+			;
+		lc = prop0;
+
+		int lzmaInternalSize = (LZMA_BASE_SIZE + (LZMA_LIT_SIZE << (lc + lp)));
+
+		probs = new int[lzmaInternalSize];
+
+		dictionarySize = 0;
+		for (int i = 0; i < 4; i++)
+			dictionarySize += (properties[1 + i]&0xFF) << (i * 8);
+		dictionary = new byte[dictionarySize];
+		if (dictionary == null) {
+			throw new LzmaException ("LZMA : can't allocate");
+		}
+
+		int numProbs = Literal + (LZMA_LIT_SIZE << (lc + lp));
+
+		RangeDecoder = new CRangeDecoder(in);
+		dictionaryPos = 0;
+		GlobalPos = 0;
+		rep0 = rep1 = rep2 = rep3 = 1;
+		State = 0;
+		PreviousIsMatch = false;
+		RemainLen = 0;
+		dictionary[dictionarySize - 1] = 0;
+		for (int i = 0; i < numProbs; i++)
+			probs[i] = CRangeDecoder.kBitModelTotal >> 1;
+
+		uncompressed_buffer = new byte [kBlockSize];
+		uncompressed_size = 0;
+		uncompressed_offset = 0;
+
+		GlobalNowPos = 0;
+	}
+
+	public int read (byte[] buf, int off, int len) throws IOException {
+		if (isClosed)
+			throw new IOException ("stream closed");
+
+		if ((off | len | (off + len) | (buf.length - (off + len))) < 0) {
+			throw new IndexOutOfBoundsException();
+		}
+		if (len == 0)
+			return 0;
+
+		if (uncompressed_offset == uncompressed_size)
+			fill_buffer();
+		if (uncompressed_offset == uncompressed_size)
+			return -1;
+
+		int l = Math.min(len,uncompressed_size-uncompressed_offset);
+		System.arraycopy (uncompressed_buffer, uncompressed_offset, buf, off, l);
+		uncompressed_offset += l;
+		return l;
+	}
+
+	public void close () throws IOException {
+		isClosed = true;
+		super.close ();
+	}
+}
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/CRC.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/CRC.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/CRC.java	(revision 21851)
@@ -0,0 +1,52 @@
+// SevenZip/CRC.java
+
+package SevenZip;
+
+public class CRC
+{
+	static public int[] Table = new int[256];
+	
+	static
+	{
+		for (int i = 0; i < 256; i++)
+		{
+			int r = i;
+			for (int j = 0; j < 8; j++)
+				if ((r & 1) != 0)
+					r = (r >>> 1) ^ 0xEDB88320;
+				else
+					r >>>= 1;
+			Table[i] = r;
+		}
+	}
+	
+	int _value = -1;
+	
+	public void Init()
+	{
+		_value = -1;
+	}
+	
+	public void Update(byte[] data, int offset, int size)
+	{
+		for (int i = 0; i < size; i++)
+			_value = Table[(_value ^ data[offset + i]) & 0xFF] ^ (_value >>> 8);
+	}
+	
+	public void Update(byte[] data)
+	{
+		int size = data.length;
+		for (int i = 0; i < size; i++)
+			_value = Table[(_value ^ data[i]) & 0xFF] ^ (_value >>> 8);
+	}
+	
+	public void UpdateByte(int b)
+	{
+		_value = Table[(_value ^ b) & 0xFF] ^ (_value >>> 8);
+	}
+	
+	public int GetDigest()
+	{
+		return _value ^ (-1);
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/LZ/BinTree.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/LZ/BinTree.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/LZ/BinTree.java	(revision 21851)
@@ -0,0 +1,382 @@
+// LZ.BinTree
+
+package SevenZip.Compression.LZ;
+import java.io.IOException;
+
+
+public class BinTree extends InWindow
+{
+	int _cyclicBufferPos;
+	int _cyclicBufferSize = 0;
+	int _matchMaxLen;
+	
+	int[] _son;
+	int[] _hash;
+	
+	int _cutValue = 0xFF;
+	int _hashMask;
+	int _hashSizeSum = 0;
+	
+	boolean HASH_ARRAY = true;
+
+	static final int kHash2Size = 1 << 10;
+	static final int kHash3Size = 1 << 16;
+	static final int kBT2HashSize = 1 << 16;
+	static final int kStartMaxLen = 1;
+	static final int kHash3Offset = kHash2Size;
+	static final int kEmptyHashValue = 0;
+	static final int kMaxValForNormalize = (1 << 30) - 1;
+	
+	int kNumHashDirectBytes = 0;
+	int kMinMatchCheck = 4;
+	int kFixHashSize = kHash2Size + kHash3Size;
+
+	public void SetType(int numHashBytes)
+	{
+		HASH_ARRAY = (numHashBytes > 2);
+		if (HASH_ARRAY)
+		{
+			kNumHashDirectBytes = 0;
+			kMinMatchCheck = 4;
+			kFixHashSize = kHash2Size + kHash3Size;
+		}
+		else
+		{
+			kNumHashDirectBytes = 2;
+			kMinMatchCheck = 2 + 1;
+			kFixHashSize = 0;
+		}
+	}
+	
+
+	
+
+	public void Init() throws IOException
+	{
+		super.Init();
+		for (int i = 0; i < _hashSizeSum; i++)
+			_hash[i] = kEmptyHashValue;
+		_cyclicBufferPos = 0;
+		ReduceOffsets(-1);
+	}
+	
+	public void MovePos() throws IOException
+	{
+		if (++_cyclicBufferPos >= _cyclicBufferSize)
+			_cyclicBufferPos = 0;
+		super.MovePos();
+		if (_pos == kMaxValForNormalize)
+			Normalize();
+	}
+	
+
+	
+	
+	
+	
+	
+	
+	public boolean Create(int historySize, int keepAddBufferBefore,
+			int matchMaxLen, int keepAddBufferAfter)
+	{
+		if (historySize > kMaxValForNormalize - 256)
+			return false;
+		_cutValue = 16 + (matchMaxLen >> 1);
+
+		int windowReservSize = (historySize + keepAddBufferBefore +
+				matchMaxLen + keepAddBufferAfter) / 2 + 256;
+		
+		super.Create(historySize + keepAddBufferBefore, matchMaxLen + keepAddBufferAfter, windowReservSize);
+		
+		_matchMaxLen = matchMaxLen;
+
+		int cyclicBufferSize = historySize + 1;
+		if (_cyclicBufferSize != cyclicBufferSize)
+			_son = new int[(_cyclicBufferSize = cyclicBufferSize) * 2];
+
+		int hs = kBT2HashSize;
+
+		if (HASH_ARRAY)
+		{
+			hs = historySize - 1;
+			hs |= (hs >> 1);
+			hs |= (hs >> 2);
+			hs |= (hs >> 4);
+			hs |= (hs >> 8);
+			hs >>= 1;
+			hs |= 0xFFFF;
+			if (hs > (1 << 24))
+				hs >>= 1;
+			_hashMask = hs;
+			hs++;
+			hs += kFixHashSize;
+		}
+		if (hs != _hashSizeSum)
+			_hash = new int [_hashSizeSum = hs];
+		return true;
+	}
+	public int GetMatches(int[] distances) throws IOException
+	{
+		int lenLimit;
+		if (_pos + _matchMaxLen <= _streamPos)
+			lenLimit = _matchMaxLen;
+		else
+		{
+			lenLimit = _streamPos - _pos;
+			if (lenLimit < kMinMatchCheck)
+			{
+				MovePos();
+				return 0;
+			}
+		}
+
+		int offset = 0;
+		int matchMinPos = (_pos > _cyclicBufferSize) ? (_pos - _cyclicBufferSize) : 0;
+		int cur = _bufferOffset + _pos;
+		int maxLen = kStartMaxLen; // to avoid items for len < hashSize;
+		int hashValue, hash2Value = 0, hash3Value = 0;
+		
+		if (HASH_ARRAY)
+		{
+			int temp = CrcTable[_bufferBase[cur] & 0xFF] ^ (_bufferBase[cur + 1] & 0xFF);
+			hash2Value = temp & (kHash2Size - 1);
+			temp ^= ((int)(_bufferBase[cur + 2] & 0xFF) << 8);
+			hash3Value = temp & (kHash3Size - 1);
+			hashValue = (temp ^ (CrcTable[_bufferBase[cur + 3] & 0xFF] << 5)) & _hashMask;
+		}
+		else
+			hashValue = ((_bufferBase[cur] & 0xFF) ^ ((int)(_bufferBase[cur + 1] & 0xFF) << 8));
+
+		int curMatch = _hash[kFixHashSize + hashValue];
+		if (HASH_ARRAY)
+		{
+			int curMatch2 = _hash[hash2Value];
+			int curMatch3 = _hash[kHash3Offset + hash3Value];
+			_hash[hash2Value] = _pos;
+			_hash[kHash3Offset + hash3Value] = _pos;
+			if (curMatch2 > matchMinPos)
+				if (_bufferBase[_bufferOffset + curMatch2] == _bufferBase[cur])
+				{
+					distances[offset++] = maxLen = 2;
+					distances[offset++] = _pos - curMatch2 - 1;
+				}
+			if (curMatch3 > matchMinPos)
+				if (_bufferBase[_bufferOffset + curMatch3] == _bufferBase[cur])
+				{
+					if (curMatch3 == curMatch2)
+						offset -= 2;
+					distances[offset++] = maxLen = 3;
+					distances[offset++] = _pos - curMatch3 - 1;
+					curMatch2 = curMatch3;
+				}
+			if (offset != 0 && curMatch2 == curMatch)
+			{
+				offset -= 2;
+				maxLen = kStartMaxLen;
+			}
+		}
+
+		_hash[kFixHashSize + hashValue] = _pos;
+
+		int ptr0 = (_cyclicBufferPos << 1) + 1;
+		int ptr1 = (_cyclicBufferPos << 1);
+
+		int len0, len1;
+		len0 = len1 = kNumHashDirectBytes;
+
+		if (kNumHashDirectBytes != 0)
+		{
+			if (curMatch > matchMinPos)
+			{
+				if (_bufferBase[_bufferOffset + curMatch + kNumHashDirectBytes] !=
+						_bufferBase[cur + kNumHashDirectBytes])
+				{
+					distances[offset++] = maxLen = kNumHashDirectBytes;
+					distances[offset++] = _pos - curMatch - 1;
+				}
+			}
+		}
+
+		int count = _cutValue;
+
+		while (true)
+		{
+			if (curMatch <= matchMinPos || count-- == 0)
+			{
+				_son[ptr0] = _son[ptr1] = kEmptyHashValue;
+				break;
+			}
+			int delta = _pos - curMatch;
+			int cyclicPos = ((delta <= _cyclicBufferPos) ?
+				(_cyclicBufferPos - delta) :
+				(_cyclicBufferPos - delta + _cyclicBufferSize)) << 1;
+
+			int pby1 = _bufferOffset + curMatch;
+			int len = Math.min(len0, len1);
+			if (_bufferBase[pby1 + len] == _bufferBase[cur + len])
+			{
+				while(++len != lenLimit)
+					if (_bufferBase[pby1 + len] != _bufferBase[cur + len])
+						break;
+				if (maxLen < len)
+				{
+					distances[offset++] = maxLen = len;
+					distances[offset++] = delta - 1;
+					if (len == lenLimit)
+					{
+						_son[ptr1] = _son[cyclicPos];
+						_son[ptr0] = _son[cyclicPos + 1];
+						break;
+					}
+				}
+			}
+			if ((_bufferBase[pby1 + len] & 0xFF) < (_bufferBase[cur + len] & 0xFF))
+			{
+				_son[ptr1] = curMatch;
+				ptr1 = cyclicPos + 1;
+				curMatch = _son[ptr1];
+				len1 = len;
+			}
+			else
+			{
+				_son[ptr0] = curMatch;
+				ptr0 = cyclicPos;
+				curMatch = _son[ptr0];
+				len0 = len;
+			}
+		}
+		MovePos();
+		return offset;
+	}
+
+	public void Skip(int num) throws IOException
+	{
+		do
+		{
+			int lenLimit;
+			if (_pos + _matchMaxLen <= _streamPos)
+			lenLimit = _matchMaxLen;
+			else
+			{
+				lenLimit = _streamPos - _pos;
+				if (lenLimit < kMinMatchCheck)
+				{
+					MovePos();
+					continue;
+				}
+			}
+
+			int matchMinPos = (_pos > _cyclicBufferSize) ? (_pos - _cyclicBufferSize) : 0;
+			int cur = _bufferOffset + _pos;
+			
+			int hashValue;
+
+			if (HASH_ARRAY)
+			{
+				int temp = CrcTable[_bufferBase[cur] & 0xFF] ^ (_bufferBase[cur + 1] & 0xFF);
+				int hash2Value = temp & (kHash2Size - 1);
+				_hash[hash2Value] = _pos;
+				temp ^= ((int)(_bufferBase[cur + 2] & 0xFF) << 8);
+				int hash3Value = temp & (kHash3Size - 1);
+				_hash[kHash3Offset + hash3Value] = _pos;
+				hashValue = (temp ^ (CrcTable[_bufferBase[cur + 3] & 0xFF] << 5)) & _hashMask;
+			}
+			else
+				hashValue = ((_bufferBase[cur] & 0xFF) ^ ((int)(_bufferBase[cur + 1] & 0xFF) << 8));
+
+			int curMatch = _hash[kFixHashSize + hashValue];
+			_hash[kFixHashSize + hashValue] = _pos;
+
+			int ptr0 = (_cyclicBufferPos << 1) + 1;
+			int ptr1 = (_cyclicBufferPos << 1);
+
+			int len0, len1;
+			len0 = len1 = kNumHashDirectBytes;
+
+			int count = _cutValue;
+			while (true)
+			{
+				if (curMatch <= matchMinPos || count-- == 0)
+				{
+					_son[ptr0] = _son[ptr1] = kEmptyHashValue;
+					break;
+				}
+
+				int delta = _pos - curMatch;
+				int cyclicPos = ((delta <= _cyclicBufferPos) ?
+					(_cyclicBufferPos - delta) :
+					(_cyclicBufferPos - delta + _cyclicBufferSize)) << 1;
+
+				int pby1 = _bufferOffset + curMatch;
+				int len = Math.min(len0, len1);
+				if (_bufferBase[pby1 + len] == _bufferBase[cur + len])
+				{
+					while (++len != lenLimit)
+						if (_bufferBase[pby1 + len] != _bufferBase[cur + len])
+							break;
+					if (len == lenLimit)
+					{
+						_son[ptr1] = _son[cyclicPos];
+						_son[ptr0] = _son[cyclicPos + 1];
+						break;
+					}
+				}
+				if ((_bufferBase[pby1 + len] & 0xFF) < (_bufferBase[cur + len] & 0xFF))
+				{
+					_son[ptr1] = curMatch;
+					ptr1 = cyclicPos + 1;
+					curMatch = _son[ptr1];
+					len1 = len;
+				}
+				else
+				{
+					_son[ptr0] = curMatch;
+					ptr0 = cyclicPos;
+					curMatch = _son[ptr0];
+					len0 = len;
+				}
+			}
+			MovePos();
+		}
+		while (--num != 0);
+	}
+	
+	void NormalizeLinks(int[] items, int numItems, int subValue)
+	{
+		for (int i = 0; i < numItems; i++)
+		{
+			int value = items[i];
+			if (value <= subValue)
+				value = kEmptyHashValue;
+			else
+				value -= subValue;
+			items[i] = value;
+		}
+	}
+	
+	void Normalize()
+	{
+		int subValue = _pos - _cyclicBufferSize;
+		NormalizeLinks(_son, _cyclicBufferSize * 2, subValue);
+		NormalizeLinks(_hash, _hashSizeSum, subValue);
+		ReduceOffsets(subValue);
+	}
+	
+	public void SetCutValue(int cutValue) { _cutValue = cutValue; }
+
+	private static final int[] CrcTable = new int[256];
+
+	static
+	{
+		for (int i = 0; i < 256; i++)
+		{
+			int r = i;
+			for (int j = 0; j < 8; j++)
+				if ((r & 1) != 0)
+					r = (r >>> 1) ^ 0xEDB88320;
+				else
+					r >>>= 1;
+			CrcTable[i] = r;
+		}
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/LZ/InWindow.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/LZ/InWindow.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/LZ/InWindow.java	(revision 21851)
@@ -0,0 +1,131 @@
+// LZ.InWindow
+
+package SevenZip.Compression.LZ;
+
+import java.io.IOException;
+
+public class InWindow
+{
+	public byte[] _bufferBase; // pointer to buffer with data
+	java.io.InputStream _stream;
+	int _posLimit;  // offset (from _buffer) of first byte when new block reading must be done
+	boolean _streamEndWasReached; // if (true) then _streamPos shows real end of stream
+	
+	int _pointerToLastSafePosition;
+	
+	public int _bufferOffset;
+	
+	public int _blockSize;  // Size of Allocated memory block
+	public int _pos;             // offset (from _buffer) of curent byte
+	int _keepSizeBefore;  // how many BYTEs must be kept in buffer before _pos
+	int _keepSizeAfter;   // how many BYTEs must be kept buffer after _pos
+	public int _streamPos;   // offset (from _buffer) of first not read byte from Stream
+	
+	public void MoveBlock()
+	{
+		int offset = _bufferOffset + _pos - _keepSizeBefore;
+		// we need one additional byte, since MovePos moves on 1 byte.
+		if (offset > 0)
+			offset--;
+
+		int numBytes = _bufferOffset + _streamPos - offset;
+		
+		// check negative offset ????
+		for (int i = 0; i < numBytes; i++)
+			_bufferBase[i] = _bufferBase[offset + i];
+		_bufferOffset -= offset;
+	}
+	
+	public void ReadBlock() throws IOException
+	{
+		if (_streamEndWasReached)
+			return;
+		while (true)
+		{
+			int size = (0 - _bufferOffset) + _blockSize - _streamPos;
+			if (size == 0)
+				return;
+			int numReadBytes = _stream.read(_bufferBase, _bufferOffset + _streamPos, size);
+			if (numReadBytes == -1)
+			{
+				_posLimit = _streamPos;
+				int pointerToPostion = _bufferOffset + _posLimit;
+				if (pointerToPostion > _pointerToLastSafePosition)
+					_posLimit = _pointerToLastSafePosition - _bufferOffset;
+				
+				_streamEndWasReached = true;
+				return;
+			}
+			_streamPos += numReadBytes;
+			if (_streamPos >= _pos + _keepSizeAfter)
+				_posLimit = _streamPos - _keepSizeAfter;
+		}
+	}
+	
+	void Free() { _bufferBase = null; }
+	
+	public void Create(int keepSizeBefore, int keepSizeAfter, int keepSizeReserv)
+	{
+		_keepSizeBefore = keepSizeBefore;
+		_keepSizeAfter = keepSizeAfter;
+		int blockSize = keepSizeBefore + keepSizeAfter + keepSizeReserv;
+		if (_bufferBase == null || _blockSize != blockSize)
+		{
+			Free();
+			_blockSize = blockSize;
+			_bufferBase = new byte[_blockSize];
+		}
+		_pointerToLastSafePosition = _blockSize - keepSizeAfter;
+	}
+	
+	public void SetStream(java.io.InputStream stream) { _stream = stream; 	}
+	public void ReleaseStream() { _stream = null; }
+
+	public void Init() throws IOException
+	{
+		_bufferOffset = 0;
+		_pos = 0;
+		_streamPos = 0;
+		_streamEndWasReached = false;
+		ReadBlock();
+	}
+	
+	public void MovePos() throws IOException
+	{
+		_pos++;
+		if (_pos > _posLimit)
+		{
+			int pointerToPostion = _bufferOffset + _pos;
+			if (pointerToPostion > _pointerToLastSafePosition)
+				MoveBlock();
+			ReadBlock();
+		}
+	}
+	
+	public byte GetIndexByte(int index)	{ return _bufferBase[_bufferOffset + _pos + index]; }
+	
+	// index + limit have not to exceed _keepSizeAfter;
+	public int GetMatchLen(int index, int distance, int limit)
+	{
+		if (_streamEndWasReached)
+			if ((_pos + index) + limit > _streamPos)
+				limit = _streamPos - (_pos + index);
+		distance++;
+		// Byte *pby = _buffer + (size_t)_pos + index;
+		int pby = _bufferOffset + _pos + index;
+		
+		int i;
+		for (i = 0; i < limit && _bufferBase[pby + i] == _bufferBase[pby + i - distance]; i++);
+		return i;
+	}
+	
+	public int GetNumAvailableBytes()	{ return _streamPos - _pos; }
+	
+	public void ReduceOffsets(int subValue)
+	{
+		_bufferOffset += subValue;
+		_posLimit -= subValue;
+		_pos -= subValue;
+		_streamPos -= subValue;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/LZ/OutWindow.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/LZ/OutWindow.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/LZ/OutWindow.java	(revision 21851)
@@ -0,0 +1,85 @@
+// LZ.OutWindow
+
+package SevenZip.Compression.LZ;
+
+import java.io.IOException;
+
+public class OutWindow
+{
+	byte[] _buffer;
+	int _pos;
+	int _windowSize = 0;
+	int _streamPos;
+	java.io.OutputStream _stream;
+	
+	public void Create(int windowSize)
+	{
+		if (_buffer == null || _windowSize != windowSize)
+			_buffer = new byte[windowSize];
+		_windowSize = windowSize;
+		_pos = 0;
+		_streamPos = 0;
+	}
+	
+	public void SetStream(java.io.OutputStream stream) throws IOException
+	{
+		ReleaseStream();
+		_stream = stream;
+	}
+	
+	public void ReleaseStream() throws IOException
+	{
+		Flush();
+		_stream = null;
+	}
+	
+	public void Init(boolean solid)
+	{
+		if (!solid)
+		{
+			_streamPos = 0;
+			_pos = 0;
+		}
+	}
+	
+	public void Flush() throws IOException
+	{
+		int size = _pos - _streamPos;
+		if (size == 0)
+			return;
+		_stream.write(_buffer, _streamPos, size);
+		if (_pos >= _windowSize)
+			_pos = 0;
+		_streamPos = _pos;
+	}
+	
+	public void CopyBlock(int distance, int len) throws IOException
+	{
+		int pos = _pos - distance - 1;
+		if (pos < 0)
+			pos += _windowSize;
+		for (; len != 0; len--)
+		{
+			if (pos >= _windowSize)
+				pos = 0;
+			_buffer[_pos++] = _buffer[pos++];
+			if (_pos >= _windowSize)
+				Flush();
+		}
+	}
+	
+	public void PutByte(byte b) throws IOException
+	{
+		_buffer[_pos++] = b;
+		if (_pos >= _windowSize)
+			Flush();
+	}
+	
+	public byte GetByte(int distance)
+	{
+		int pos = _pos - distance - 1;
+		if (pos < 0)
+			pos += _windowSize;
+		return _buffer[pos];
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/LZMA/Base.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/LZMA/Base.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/LZMA/Base.java	(revision 21851)
@@ -0,0 +1,88 @@
+// Base.java
+
+package SevenZip.Compression.LZMA;
+
+public class Base
+{
+	public static final int kNumRepDistances = 4;
+	public static final int kNumStates = 12;
+	
+	public static final int StateInit()
+	{
+		return 0;
+	}
+	
+	public static final int StateUpdateChar(int index)
+	{
+		if (index < 4) 
+			return 0;
+		if (index < 10) 
+			return index - 3;
+		return index - 6;
+	}
+	
+	public static final int StateUpdateMatch(int index)
+	{
+		return (index < 7 ? 7 : 10); 
+	}
+
+	public static final int StateUpdateRep(int index)
+	{ 
+		return (index < 7 ? 8 : 11); 
+	}
+	
+	public static final int StateUpdateShortRep(int index)
+	{ 
+		return (index < 7 ? 9 : 11); 
+	}
+
+	public static final boolean StateIsCharState(int index)
+	{ 
+		return index < 7; 
+	}
+	
+	public static final int kNumPosSlotBits = 6;
+	public static final int kDicLogSizeMin = 0;
+	// public static final int kDicLogSizeMax = 28;
+	// public static final int kDistTableSizeMax = kDicLogSizeMax * 2;
+	
+	public static final int kNumLenToPosStatesBits = 2; // it's for speed optimization
+	public static final int kNumLenToPosStates = 1 << kNumLenToPosStatesBits;
+	
+	public static final int kMatchMinLen = 2;
+	
+	public static final int GetLenToPosState(int len)
+	{
+		len -= kMatchMinLen;
+		if (len < kNumLenToPosStates)
+			return len;
+		return (int)(kNumLenToPosStates - 1);
+	}
+	
+	public static final int kNumAlignBits = 4;
+	public static final int kAlignTableSize = 1 << kNumAlignBits;
+	public static final int kAlignMask = (kAlignTableSize - 1);
+	
+	public static final int kStartPosModelIndex = 4;
+	public static final int kEndPosModelIndex = 14;
+	public static final int kNumPosModels = kEndPosModelIndex - kStartPosModelIndex;
+	
+	public static final  int kNumFullDistances = 1 << (kEndPosModelIndex / 2);
+	
+	public static final  int kNumLitPosStatesBitsEncodingMax = 4;
+	public static final  int kNumLitContextBitsMax = 8;
+	
+	public static final  int kNumPosStatesBitsMax = 4;
+	public static final  int kNumPosStatesMax = (1 << kNumPosStatesBitsMax);
+	public static final  int kNumPosStatesBitsEncodingMax = 4;
+	public static final  int kNumPosStatesEncodingMax = (1 << kNumPosStatesBitsEncodingMax);
+	
+	public static final  int kNumLowLenBits = 3;
+	public static final  int kNumMidLenBits = 3;
+	public static final  int kNumHighLenBits = 8;
+	public static final  int kNumLowLenSymbols = 1 << kNumLowLenBits;
+	public static final  int kNumMidLenSymbols = 1 << kNumMidLenBits;
+	public static final  int kNumLenSymbols = kNumLowLenSymbols + kNumMidLenSymbols +
+			(1 << kNumHighLenBits);
+	public static final  int kMatchMaxLen = kMatchMinLen + kNumLenSymbols - 1;
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/LZMA/Decoder.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/LZMA/Decoder.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/LZMA/Decoder.java	(revision 21851)
@@ -0,0 +1,329 @@
+package SevenZip.Compression.LZMA;
+
+import SevenZip.Compression.RangeCoder.BitTreeDecoder;
+import SevenZip.Compression.LZMA.Base;
+import SevenZip.Compression.LZ.OutWindow;
+import java.io.IOException;
+
+public class Decoder
+{
+	class LenDecoder
+	{
+		short[] m_Choice = new short[2];
+		BitTreeDecoder[] m_LowCoder = new BitTreeDecoder[Base.kNumPosStatesMax];
+		BitTreeDecoder[] m_MidCoder = new BitTreeDecoder[Base.kNumPosStatesMax];
+		BitTreeDecoder m_HighCoder = new BitTreeDecoder(Base.kNumHighLenBits);
+		int m_NumPosStates = 0;
+		
+		public void Create(int numPosStates)
+		{
+			for (; m_NumPosStates < numPosStates; m_NumPosStates++)
+			{
+				m_LowCoder[m_NumPosStates] = new BitTreeDecoder(Base.kNumLowLenBits);
+				m_MidCoder[m_NumPosStates] = new BitTreeDecoder(Base.kNumMidLenBits);
+			}
+		}
+		
+		public void Init()
+		{
+			SevenZip.Compression.RangeCoder.Decoder.InitBitModels(m_Choice);
+			for (int posState = 0; posState < m_NumPosStates; posState++)
+			{
+				m_LowCoder[posState].Init();
+				m_MidCoder[posState].Init();
+			}
+			m_HighCoder.Init();
+		}
+		
+		public int Decode(SevenZip.Compression.RangeCoder.Decoder rangeDecoder, int posState) throws IOException
+		{
+			if (rangeDecoder.DecodeBit(m_Choice, 0) == 0)
+				return m_LowCoder[posState].Decode(rangeDecoder);
+			int symbol = Base.kNumLowLenSymbols;
+			if (rangeDecoder.DecodeBit(m_Choice, 1) == 0)
+				symbol += m_MidCoder[posState].Decode(rangeDecoder);
+			else
+				symbol += Base.kNumMidLenSymbols + m_HighCoder.Decode(rangeDecoder);
+			return symbol;
+		}
+	}
+	
+	class LiteralDecoder
+	{
+		class Decoder2
+		{
+			short[] m_Decoders = new short[0x300];
+			
+			public void Init()
+			{
+				SevenZip.Compression.RangeCoder.Decoder.InitBitModels(m_Decoders);
+			}
+			
+			public byte DecodeNormal(SevenZip.Compression.RangeCoder.Decoder rangeDecoder) throws IOException
+			{
+				int symbol = 1;
+				do
+					symbol = (symbol << 1) | rangeDecoder.DecodeBit(m_Decoders, symbol);
+				while (symbol < 0x100);
+				return (byte)symbol;
+			}
+			
+			public byte DecodeWithMatchByte(SevenZip.Compression.RangeCoder.Decoder rangeDecoder, byte matchByte) throws IOException
+			{
+				int symbol = 1;
+				do
+				{
+					int matchBit = (matchByte >> 7) & 1;
+					matchByte <<= 1;
+					int bit = rangeDecoder.DecodeBit(m_Decoders, ((1 + matchBit) << 8) + symbol);
+					symbol = (symbol << 1) | bit;
+					if (matchBit != bit)
+					{
+						while (symbol < 0x100)
+							symbol = (symbol << 1) | rangeDecoder.DecodeBit(m_Decoders, symbol);
+						break;
+					}
+				}
+				while (symbol < 0x100);
+				return (byte)symbol;
+			}
+		}
+		
+		Decoder2[] m_Coders;
+		int m_NumPrevBits;
+		int m_NumPosBits;
+		int m_PosMask;
+		
+		public void Create(int numPosBits, int numPrevBits)
+		{
+			if (m_Coders != null && m_NumPrevBits == numPrevBits && m_NumPosBits == numPosBits)
+				return;
+			m_NumPosBits = numPosBits;
+			m_PosMask = (1 << numPosBits) - 1;
+			m_NumPrevBits = numPrevBits;
+			int numStates = 1 << (m_NumPrevBits + m_NumPosBits);
+			m_Coders = new Decoder2[numStates];
+			for (int i = 0; i < numStates; i++)
+				m_Coders[i] = new Decoder2();
+		}
+		
+		public void Init()
+		{
+			int numStates = 1 << (m_NumPrevBits + m_NumPosBits);
+			for (int i = 0; i < numStates; i++)
+				m_Coders[i].Init();
+		}
+		
+		Decoder2 GetDecoder(int pos, byte prevByte)
+		{
+			return m_Coders[((pos & m_PosMask) << m_NumPrevBits) + ((prevByte & 0xFF) >>> (8 - m_NumPrevBits))];
+		}
+	}
+	
+	OutWindow m_OutWindow = new OutWindow();
+	SevenZip.Compression.RangeCoder.Decoder m_RangeDecoder = new SevenZip.Compression.RangeCoder.Decoder();
+	
+	short[] m_IsMatchDecoders = new short[Base.kNumStates << Base.kNumPosStatesBitsMax];
+	short[] m_IsRepDecoders = new short[Base.kNumStates];
+	short[] m_IsRepG0Decoders = new short[Base.kNumStates];
+	short[] m_IsRepG1Decoders = new short[Base.kNumStates];
+	short[] m_IsRepG2Decoders = new short[Base.kNumStates];
+	short[] m_IsRep0LongDecoders = new short[Base.kNumStates << Base.kNumPosStatesBitsMax];
+	
+	BitTreeDecoder[] m_PosSlotDecoder = new BitTreeDecoder[Base.kNumLenToPosStates];
+	short[] m_PosDecoders = new short[Base.kNumFullDistances - Base.kEndPosModelIndex];
+	
+	BitTreeDecoder m_PosAlignDecoder = new BitTreeDecoder(Base.kNumAlignBits);
+	
+	LenDecoder m_LenDecoder = new LenDecoder();
+	LenDecoder m_RepLenDecoder = new LenDecoder();
+	
+	LiteralDecoder m_LiteralDecoder = new LiteralDecoder();
+	
+	int m_DictionarySize = -1;
+	int m_DictionarySizeCheck =  -1;
+	
+	int m_PosStateMask;
+	
+	public Decoder()
+	{
+		for (int i = 0; i < Base.kNumLenToPosStates; i++)
+			m_PosSlotDecoder[i] = new BitTreeDecoder(Base.kNumPosSlotBits);
+	}
+	
+	boolean SetDictionarySize(int dictionarySize)
+	{
+		if (dictionarySize < 0)
+			return false;
+		if (m_DictionarySize != dictionarySize)
+		{
+			m_DictionarySize = dictionarySize;
+			m_DictionarySizeCheck = Math.max(m_DictionarySize, 1);
+			m_OutWindow.Create(Math.max(m_DictionarySizeCheck, (1 << 12)));
+		}
+		return true;
+	}
+	
+	boolean SetLcLpPb(int lc, int lp, int pb)
+	{
+		if (lc > Base.kNumLitContextBitsMax || lp > 4 || pb > Base.kNumPosStatesBitsMax)
+			return false;
+		m_LiteralDecoder.Create(lp, lc);
+		int numPosStates = 1 << pb;
+		m_LenDecoder.Create(numPosStates);
+		m_RepLenDecoder.Create(numPosStates);
+		m_PosStateMask = numPosStates - 1;
+		return true;
+	}
+	
+	void Init() throws IOException
+	{
+		m_OutWindow.Init(false);
+		
+		SevenZip.Compression.RangeCoder.Decoder.InitBitModels(m_IsMatchDecoders);
+		SevenZip.Compression.RangeCoder.Decoder.InitBitModels(m_IsRep0LongDecoders);
+		SevenZip.Compression.RangeCoder.Decoder.InitBitModels(m_IsRepDecoders);
+		SevenZip.Compression.RangeCoder.Decoder.InitBitModels(m_IsRepG0Decoders);
+		SevenZip.Compression.RangeCoder.Decoder.InitBitModels(m_IsRepG1Decoders);
+		SevenZip.Compression.RangeCoder.Decoder.InitBitModels(m_IsRepG2Decoders);
+		SevenZip.Compression.RangeCoder.Decoder.InitBitModels(m_PosDecoders);
+		
+		m_LiteralDecoder.Init();
+		int i;
+		for (i = 0; i < Base.kNumLenToPosStates; i++)
+			m_PosSlotDecoder[i].Init();
+		m_LenDecoder.Init();
+		m_RepLenDecoder.Init();
+		m_PosAlignDecoder.Init();
+		m_RangeDecoder.Init();
+	}
+	
+	public boolean Code(java.io.InputStream inStream, java.io.OutputStream outStream,
+			long outSize) throws IOException
+	{
+		m_RangeDecoder.SetStream(inStream);
+		m_OutWindow.SetStream(outStream);
+		Init();
+		
+		int state = Base.StateInit();
+		int rep0 = 0, rep1 = 0, rep2 = 0, rep3 = 0;
+		
+		long nowPos64 = 0;
+		byte prevByte = 0;
+		while (outSize < 0 || nowPos64 < outSize)
+		{
+			int posState = (int)nowPos64 & m_PosStateMask;
+			if (m_RangeDecoder.DecodeBit(m_IsMatchDecoders, (state << Base.kNumPosStatesBitsMax) + posState) == 0)
+			{
+				LiteralDecoder.Decoder2 decoder2 = m_LiteralDecoder.GetDecoder((int)nowPos64, prevByte);
+				if (!Base.StateIsCharState(state))
+					prevByte = decoder2.DecodeWithMatchByte(m_RangeDecoder, m_OutWindow.GetByte(rep0));
+				else
+					prevByte = decoder2.DecodeNormal(m_RangeDecoder);
+				m_OutWindow.PutByte(prevByte);
+				state = Base.StateUpdateChar(state);
+				nowPos64++;
+			}
+			else
+			{
+				int len;
+				if (m_RangeDecoder.DecodeBit(m_IsRepDecoders, state) == 1)
+				{
+					len = 0;
+					if (m_RangeDecoder.DecodeBit(m_IsRepG0Decoders, state) == 0)
+					{
+						if (m_RangeDecoder.DecodeBit(m_IsRep0LongDecoders, (state << Base.kNumPosStatesBitsMax) + posState) == 0)
+						{
+							state = Base.StateUpdateShortRep(state);
+							len = 1;
+						}
+					}
+					else
+					{
+						int distance;
+						if (m_RangeDecoder.DecodeBit(m_IsRepG1Decoders, state) == 0)
+							distance = rep1;
+						else
+						{
+							if (m_RangeDecoder.DecodeBit(m_IsRepG2Decoders, state) == 0)
+								distance = rep2;
+							else
+							{
+								distance = rep3;
+								rep3 = rep2;
+							}
+							rep2 = rep1;
+						}
+						rep1 = rep0;
+						rep0 = distance;
+					}
+					if (len == 0)
+					{
+						len = m_RepLenDecoder.Decode(m_RangeDecoder, posState) + Base.kMatchMinLen;
+						state = Base.StateUpdateRep(state);
+					}
+				}
+				else
+				{
+					rep3 = rep2;
+					rep2 = rep1;
+					rep1 = rep0;
+					len = Base.kMatchMinLen + m_LenDecoder.Decode(m_RangeDecoder, posState);
+					state = Base.StateUpdateMatch(state);
+					int posSlot = m_PosSlotDecoder[Base.GetLenToPosState(len)].Decode(m_RangeDecoder);
+					if (posSlot >= Base.kStartPosModelIndex)
+					{
+						int numDirectBits = (posSlot >> 1) - 1;
+						rep0 = ((2 | (posSlot & 1)) << numDirectBits);
+						if (posSlot < Base.kEndPosModelIndex)
+							rep0 += BitTreeDecoder.ReverseDecode(m_PosDecoders,
+									rep0 - posSlot - 1, m_RangeDecoder, numDirectBits);
+						else
+						{
+							rep0 += (m_RangeDecoder.DecodeDirectBits(
+									numDirectBits - Base.kNumAlignBits) << Base.kNumAlignBits);
+							rep0 += m_PosAlignDecoder.ReverseDecode(m_RangeDecoder);
+							if (rep0 < 0)
+							{
+								if (rep0 == -1)
+									break;
+								return false;
+							}
+						}
+					}
+					else
+						rep0 = posSlot;
+				}
+				if (rep0 >= nowPos64 || rep0 >= m_DictionarySizeCheck)
+				{
+					// m_OutWindow.Flush();
+					return false;
+				}
+				m_OutWindow.CopyBlock(rep0, len);
+				nowPos64 += len;
+				prevByte = m_OutWindow.GetByte(0);
+			}
+		}
+		m_OutWindow.Flush();
+		m_OutWindow.ReleaseStream();
+		m_RangeDecoder.ReleaseStream();
+		return true;
+	}
+	
+	public boolean SetDecoderProperties(byte[] properties)
+	{
+		if (properties.length < 5)
+			return false;
+		int val = properties[0] & 0xFF;
+		int lc = val % 9;
+		int remainder = val / 9;
+		int lp = remainder % 5;
+		int pb = remainder / 5;
+		int dictionarySize = 0;
+		for (int i = 0; i < 4; i++)
+			dictionarySize += ((int)(properties[1 + i]) & 0xFF) << (i * 8);
+		if (!SetLcLpPb(lc, lp, pb))
+			return false;
+		return SetDictionarySize(dictionarySize);
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/LZMA/Encoder.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/LZMA/Encoder.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/LZMA/Encoder.java	(revision 21851)
@@ -0,0 +1,1416 @@
+package SevenZip.Compression.LZMA;
+
+import SevenZip.Compression.RangeCoder.BitTreeEncoder;
+import SevenZip.Compression.LZMA.Base;
+import SevenZip.Compression.LZ.BinTree;
+import SevenZip.ICodeProgress;
+import java.io.IOException;
+
+public class Encoder
+{
+	public static final int EMatchFinderTypeBT2 = 0;
+	public static final int EMatchFinderTypeBT4 = 1;
+
+
+
+
+	static final int kIfinityPrice = 0xFFFFFFF;
+
+	static byte[] g_FastPos = new byte[1 << 11];
+
+	static
+	{
+		int kFastSlots = 22;
+		int c = 2;
+		g_FastPos[0] = 0;
+		g_FastPos[1] = 1;
+		for (int slotFast = 2; slotFast < kFastSlots; slotFast++)
+		{
+			int k = (1 << ((slotFast >> 1) - 1));
+			for (int j = 0; j < k; j++, c++)
+				g_FastPos[c] = (byte)slotFast;
+		}
+	}
+
+	static int GetPosSlot(int pos)
+	{
+		if (pos < (1 << 11))
+			return g_FastPos[pos];
+		if (pos < (1 << 21))
+			return (g_FastPos[pos >> 10] + 20);
+		return (g_FastPos[pos >> 20] + 40);
+	}
+
+	static int GetPosSlot2(int pos)
+	{
+		if (pos < (1 << 17))
+			return (g_FastPos[pos >> 6] + 12);
+		if (pos < (1 << 27))
+			return (g_FastPos[pos >> 16] + 32);
+		return (g_FastPos[pos >> 26] + 52);
+	}
+
+	int _state = Base.StateInit();
+	byte _previousByte;
+	int[] _repDistances = new int[Base.kNumRepDistances];
+
+	void BaseInit()
+	{
+		_state = Base.StateInit();
+		_previousByte = 0;
+		for (int i = 0; i < Base.kNumRepDistances; i++)
+			_repDistances[i] = 0;
+	}
+
+	static final int kDefaultDictionaryLogSize = 22;
+	static final int kNumFastBytesDefault = 0x20;
+
+	class LiteralEncoder
+	{
+		class Encoder2
+		{
+			short[] m_Encoders = new short[0x300];
+
+			public void Init() { SevenZip.Compression.RangeCoder.Encoder.InitBitModels(m_Encoders); }
+
+
+
+			public void Encode(SevenZip.Compression.RangeCoder.Encoder rangeEncoder, byte symbol) throws IOException
+			{
+				int context = 1;
+				for (int i = 7; i >= 0; i--)
+				{
+					int bit = ((symbol >> i) & 1);
+					rangeEncoder.Encode(m_Encoders, context, bit);
+					context = (context << 1) | bit;
+				}
+			}
+
+			public void EncodeMatched(SevenZip.Compression.RangeCoder.Encoder rangeEncoder, byte matchByte, byte symbol) throws IOException
+			{
+				int context = 1;
+				boolean same = true;
+				for (int i = 7; i >= 0; i--)
+				{
+					int bit = ((symbol >> i) & 1);
+					int state = context;
+					if (same)
+					{
+						int matchBit = ((matchByte >> i) & 1);
+						state += ((1 + matchBit) << 8);
+						same = (matchBit == bit);
+					}
+					rangeEncoder.Encode(m_Encoders, state, bit);
+					context = (context << 1) | bit;
+				}
+			}
+
+			public int GetPrice(boolean matchMode, byte matchByte, byte symbol)
+			{
+				int price = 0;
+				int context = 1;
+				int i = 7;
+				if (matchMode)
+				{
+					for (; i >= 0; i--)
+					{
+						int matchBit = (matchByte >> i) & 1;
+						int bit = (symbol >> i) & 1;
+						price += SevenZip.Compression.RangeCoder.Encoder.GetPrice(m_Encoders[((1 + matchBit) << 8) + context], bit);
+						context = (context << 1) | bit;
+						if (matchBit != bit)
+						{
+							i--;
+							break;
+						}
+					}
+				}
+				for (; i >= 0; i--)
+				{
+					int bit = (symbol >> i) & 1;
+					price += SevenZip.Compression.RangeCoder.Encoder.GetPrice(m_Encoders[context], bit);
+					context = (context << 1) | bit;
+				}
+				return price;
+			}
+		}
+
+		Encoder2[] m_Coders;
+		int m_NumPrevBits;
+		int m_NumPosBits;
+		int m_PosMask;
+
+		public void Create(int numPosBits, int numPrevBits)
+		{
+			if (m_Coders != null && m_NumPrevBits == numPrevBits && m_NumPosBits == numPosBits)
+				return;
+			m_NumPosBits = numPosBits;
+			m_PosMask = (1 << numPosBits) - 1;
+			m_NumPrevBits = numPrevBits;
+			int numStates = 1 << (m_NumPrevBits + m_NumPosBits);
+			m_Coders = new Encoder2[numStates];
+			for (int i = 0; i < numStates; i++)
+				m_Coders[i] = new Encoder2();
+		}
+
+		public void Init()
+		{
+			int numStates = 1 << (m_NumPrevBits + m_NumPosBits);
+			for (int i = 0; i < numStates; i++)
+				m_Coders[i].Init();
+		}
+
+		public Encoder2 GetSubCoder(int pos, byte prevByte)
+		{ return m_Coders[((pos & m_PosMask) << m_NumPrevBits) + ((prevByte & 0xFF) >>> (8 - m_NumPrevBits))]; }
+	}
+
+	class LenEncoder
+	{
+		short[] _choice = new short[2];
+		BitTreeEncoder[] _lowCoder = new BitTreeEncoder[Base.kNumPosStatesEncodingMax];
+		BitTreeEncoder[] _midCoder = new BitTreeEncoder[Base.kNumPosStatesEncodingMax];
+		BitTreeEncoder _highCoder = new BitTreeEncoder(Base.kNumHighLenBits);
+
+
+		public LenEncoder()
+		{
+			for (int posState = 0; posState < Base.kNumPosStatesEncodingMax; posState++)
+			{
+				_lowCoder[posState] = new BitTreeEncoder(Base.kNumLowLenBits);
+				_midCoder[posState] = new BitTreeEncoder(Base.kNumMidLenBits);
+			}
+		}
+
+		public void Init(int numPosStates)
+		{
+			SevenZip.Compression.RangeCoder.Encoder.InitBitModels(_choice);
+
+			for (int posState = 0; posState < numPosStates; posState++)
+			{
+				_lowCoder[posState].Init();
+				_midCoder[posState].Init();
+			}
+			_highCoder.Init();
+		}
+
+		public void Encode(SevenZip.Compression.RangeCoder.Encoder rangeEncoder, int symbol, int posState) throws IOException
+		{
+			if (symbol < Base.kNumLowLenSymbols)
+			{
+				rangeEncoder.Encode(_choice, 0, 0);
+				_lowCoder[posState].Encode(rangeEncoder, symbol);
+			}
+			else
+			{
+				symbol -= Base.kNumLowLenSymbols;
+				rangeEncoder.Encode(_choice, 0, 1);
+				if (symbol < Base.kNumMidLenSymbols)
+				{
+					rangeEncoder.Encode(_choice, 1, 0);
+					_midCoder[posState].Encode(rangeEncoder, symbol);
+				}
+				else
+				{
+					rangeEncoder.Encode(_choice, 1, 1);
+					_highCoder.Encode(rangeEncoder, symbol - Base.kNumMidLenSymbols);
+				}
+			}
+		}
+
+		public void SetPrices(int posState, int numSymbols, int[] prices, int st)
+		{
+			int a0 = SevenZip.Compression.RangeCoder.Encoder.GetPrice0(_choice[0]);
+			int a1 = SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_choice[0]);
+			int b0 = a1 + SevenZip.Compression.RangeCoder.Encoder.GetPrice0(_choice[1]);
+			int b1 = a1 + SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_choice[1]);
+			int i = 0;
+			for (i = 0; i < Base.kNumLowLenSymbols; i++)
+			{
+				if (i >= numSymbols)
+					return;
+				prices[st + i] = a0 + _lowCoder[posState].GetPrice(i);
+			}
+			for (; i < Base.kNumLowLenSymbols + Base.kNumMidLenSymbols; i++)
+			{
+				if (i >= numSymbols)
+					return;
+				prices[st + i] = b0 + _midCoder[posState].GetPrice(i - Base.kNumLowLenSymbols);
+			}
+			for (; i < numSymbols; i++)
+				prices[st + i] = b1 + _highCoder.GetPrice(i - Base.kNumLowLenSymbols - Base.kNumMidLenSymbols);
+		}
+	};
+
+	public static final int kNumLenSpecSymbols = Base.kNumLowLenSymbols + Base.kNumMidLenSymbols;
+
+	class LenPriceTableEncoder extends LenEncoder
+	{
+		int[] _prices = new int[Base.kNumLenSymbols<<Base.kNumPosStatesBitsEncodingMax];
+		int _tableSize;
+		int[] _counters = new int[Base.kNumPosStatesEncodingMax];
+
+		public void SetTableSize(int tableSize) { _tableSize = tableSize; }
+
+		public int GetPrice(int symbol, int posState)
+		{
+			return _prices[posState * Base.kNumLenSymbols + symbol];
+		}
+
+		void UpdateTable(int posState)
+		{
+			SetPrices(posState, _tableSize, _prices, posState * Base.kNumLenSymbols);
+			_counters[posState] = _tableSize;
+		}
+
+		public void UpdateTables(int numPosStates)
+		{
+			for (int posState = 0; posState < numPosStates; posState++)
+				UpdateTable(posState);
+		}
+
+		public void Encode(SevenZip.Compression.RangeCoder.Encoder rangeEncoder, int symbol, int posState) throws IOException
+		{
+			super.Encode(rangeEncoder, symbol, posState);
+			if (--_counters[posState] == 0)
+				UpdateTable(posState);
+		}
+	}
+
+	static final int kNumOpts = 1 << 12;
+	class Optimal
+	{
+		public int State;
+
+		public boolean Prev1IsChar;
+		public boolean Prev2;
+
+		public int PosPrev2;
+		public int BackPrev2;
+
+		public int Price;
+		public int PosPrev;
+		public int BackPrev;
+
+		public int Backs0;
+		public int Backs1;
+		public int Backs2;
+		public int Backs3;
+
+		public void MakeAsChar() { BackPrev = -1; Prev1IsChar = false; }
+		public void MakeAsShortRep() { BackPrev = 0; ; Prev1IsChar = false; }
+		public boolean IsShortRep() { return (BackPrev == 0); }
+	};
+	Optimal[] _optimum = new Optimal[kNumOpts];
+	SevenZip.Compression.LZ.BinTree _matchFinder = null;
+	SevenZip.Compression.RangeCoder.Encoder _rangeEncoder = new SevenZip.Compression.RangeCoder.Encoder();
+
+	short[] _isMatch = new short[Base.kNumStates<<Base.kNumPosStatesBitsMax];
+	short[] _isRep = new short[Base.kNumStates];
+	short[] _isRepG0 = new short[Base.kNumStates];
+	short[] _isRepG1 = new short[Base.kNumStates];
+	short[] _isRepG2 = new short[Base.kNumStates];
+	short[] _isRep0Long = new short[Base.kNumStates<<Base.kNumPosStatesBitsMax];
+
+	BitTreeEncoder[] _posSlotEncoder = new BitTreeEncoder[Base.kNumLenToPosStates]; // kNumPosSlotBits
+
+	short[] _posEncoders = new short[Base.kNumFullDistances-Base.kEndPosModelIndex];
+	BitTreeEncoder _posAlignEncoder = new BitTreeEncoder(Base.kNumAlignBits);
+
+	LenPriceTableEncoder _lenEncoder = new LenPriceTableEncoder();
+	LenPriceTableEncoder _repMatchLenEncoder = new LenPriceTableEncoder();
+
+	LiteralEncoder _literalEncoder = new LiteralEncoder();
+
+	int[] _matchDistances = new int[Base.kMatchMaxLen*2+2];
+
+	int _numFastBytes = kNumFastBytesDefault;
+	int _longestMatchLength;
+	int _numDistancePairs;
+
+	int _additionalOffset;
+
+	int _optimumEndIndex;
+	int _optimumCurrentIndex;
+
+	boolean _longestMatchWasFound;
+
+	int[] _posSlotPrices = new int[1<<(Base.kNumPosSlotBits+Base.kNumLenToPosStatesBits)];
+	int[] _distancesPrices = new int[Base.kNumFullDistances<<Base.kNumLenToPosStatesBits];
+	int[] _alignPrices = new int[Base.kAlignTableSize];
+	int _alignPriceCount;
+
+	int _distTableSize = (kDefaultDictionaryLogSize * 2);
+
+	int _posStateBits = 2;
+	int _posStateMask = (4 - 1);
+	int _numLiteralPosStateBits = 0;
+	int _numLiteralContextBits = 3;
+
+	int _dictionarySize = (1 << kDefaultDictionaryLogSize);
+	int _dictionarySizePrev = -1;
+	int _numFastBytesPrev = -1;
+
+	long nowPos64;
+	boolean _finished;
+	java.io.InputStream _inStream;
+
+	int _matchFinderType = EMatchFinderTypeBT4;
+	boolean _writeEndMark = false;
+
+	boolean _needReleaseMFStream = false;
+
+	void Create()
+	{
+		if (_matchFinder == null)
+		{
+			SevenZip.Compression.LZ.BinTree bt = new SevenZip.Compression.LZ.BinTree();
+			int numHashBytes = 4;
+			if (_matchFinderType == EMatchFinderTypeBT2)
+				numHashBytes = 2;
+			bt.SetType(numHashBytes);
+			_matchFinder = bt;
+		}
+		_literalEncoder.Create(_numLiteralPosStateBits, _numLiteralContextBits);
+
+		if (_dictionarySize == _dictionarySizePrev && _numFastBytesPrev == _numFastBytes)
+			return;
+		_matchFinder.Create(_dictionarySize, kNumOpts, _numFastBytes, Base.kMatchMaxLen + 1);
+		_dictionarySizePrev = _dictionarySize;
+		_numFastBytesPrev = _numFastBytes;
+	}
+
+	public Encoder()
+	{
+		for (int i = 0; i < kNumOpts; i++)
+			_optimum[i] = new Optimal();
+		for (int i = 0; i < Base.kNumLenToPosStates; i++)
+			_posSlotEncoder[i] = new BitTreeEncoder(Base.kNumPosSlotBits);
+	}
+
+	void SetWriteEndMarkerMode(boolean writeEndMarker)
+	{
+		_writeEndMark = writeEndMarker;
+	}
+
+	void Init()
+	{
+		BaseInit();
+		_rangeEncoder.Init();
+
+		SevenZip.Compression.RangeCoder.Encoder.InitBitModels(_isMatch);
+		SevenZip.Compression.RangeCoder.Encoder.InitBitModels(_isRep0Long);
+		SevenZip.Compression.RangeCoder.Encoder.InitBitModels(_isRep);
+		SevenZip.Compression.RangeCoder.Encoder.InitBitModels(_isRepG0);
+		SevenZip.Compression.RangeCoder.Encoder.InitBitModels(_isRepG1);
+		SevenZip.Compression.RangeCoder.Encoder.InitBitModels(_isRepG2);
+		SevenZip.Compression.RangeCoder.Encoder.InitBitModels(_posEncoders);
+
+
+
+
+
+
+
+		_literalEncoder.Init();
+		for (int i = 0; i < Base.kNumLenToPosStates; i++)
+			_posSlotEncoder[i].Init();
+
+
+
+		_lenEncoder.Init(1 << _posStateBits);
+		_repMatchLenEncoder.Init(1 << _posStateBits);
+
+		_posAlignEncoder.Init();
+
+		_longestMatchWasFound = false;
+		_optimumEndIndex = 0;
+		_optimumCurrentIndex = 0;
+		_additionalOffset = 0;
+	}
+
+	int ReadMatchDistances() throws java.io.IOException
+	{
+		int lenRes = 0;
+		_numDistancePairs = _matchFinder.GetMatches(_matchDistances);
+		if (_numDistancePairs > 0)
+		{
+			lenRes = _matchDistances[_numDistancePairs - 2];
+			if (lenRes == _numFastBytes)
+				lenRes += _matchFinder.GetMatchLen((int)lenRes - 1, _matchDistances[_numDistancePairs - 1],
+					Base.kMatchMaxLen - lenRes);
+		}
+		_additionalOffset++;
+		return lenRes;
+	}
+
+	void MovePos(int num) throws java.io.IOException
+	{
+		if (num > 0)
+		{
+			_matchFinder.Skip(num);
+			_additionalOffset += num;
+		}
+	}
+
+	int GetRepLen1Price(int state, int posState)
+	{
+		return SevenZip.Compression.RangeCoder.Encoder.GetPrice0(_isRepG0[state]) +
+				SevenZip.Compression.RangeCoder.Encoder.GetPrice0(_isRep0Long[(state << Base.kNumPosStatesBitsMax) + posState]);
+	}
+
+	int GetPureRepPrice(int repIndex, int state, int posState)
+	{
+		int price;
+		if (repIndex == 0)
+		{
+			price = SevenZip.Compression.RangeCoder.Encoder.GetPrice0(_isRepG0[state]);
+			price += SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isRep0Long[(state << Base.kNumPosStatesBitsMax) + posState]);
+		}
+		else
+		{
+			price = SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isRepG0[state]);
+			if (repIndex == 1)
+				price += SevenZip.Compression.RangeCoder.Encoder.GetPrice0(_isRepG1[state]);
+			else
+			{
+				price += SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isRepG1[state]);
+				price += SevenZip.Compression.RangeCoder.Encoder.GetPrice(_isRepG2[state], repIndex - 2);
+			}
+		}
+		return price;
+	}
+
+	int GetRepPrice(int repIndex, int len, int state, int posState)
+	{
+		int price = _repMatchLenEncoder.GetPrice(len - Base.kMatchMinLen, posState);
+		return price + GetPureRepPrice(repIndex, state, posState);
+	}
+
+	int GetPosLenPrice(int pos, int len, int posState)
+	{
+		int price;
+		int lenToPosState = Base.GetLenToPosState(len);
+		if (pos < Base.kNumFullDistances)
+			price = _distancesPrices[(lenToPosState * Base.kNumFullDistances) + pos];
+		else
+			price = _posSlotPrices[(lenToPosState << Base.kNumPosSlotBits) + GetPosSlot2(pos)] +
+				_alignPrices[pos & Base.kAlignMask];
+		return price + _lenEncoder.GetPrice(len - Base.kMatchMinLen, posState);
+	}
+
+	int Backward(int cur)
+	{
+		_optimumEndIndex = cur;
+		int posMem = _optimum[cur].PosPrev;
+		int backMem = _optimum[cur].BackPrev;
+		do
+		{
+			if (_optimum[cur].Prev1IsChar)
+			{
+				_optimum[posMem].MakeAsChar();
+				_optimum[posMem].PosPrev = posMem - 1;
+				if (_optimum[cur].Prev2)
+				{
+					_optimum[posMem - 1].Prev1IsChar = false;
+					_optimum[posMem - 1].PosPrev = _optimum[cur].PosPrev2;
+					_optimum[posMem - 1].BackPrev = _optimum[cur].BackPrev2;
+				}
+			}
+			int posPrev = posMem;
+			int backCur = backMem;
+
+			backMem = _optimum[posPrev].BackPrev;
+			posMem = _optimum[posPrev].PosPrev;
+
+			_optimum[posPrev].BackPrev = backCur;
+			_optimum[posPrev].PosPrev = cur;
+			cur = posPrev;
+		}
+		while (cur > 0);
+		backRes = _optimum[0].BackPrev;
+		_optimumCurrentIndex = _optimum[0].PosPrev;
+		return _optimumCurrentIndex;
+	}
+
+	int[] reps = new int[Base.kNumRepDistances];
+	int[] repLens = new int[Base.kNumRepDistances];
+	int backRes;
+
+	int GetOptimum(int position) throws IOException
+	{
+		if (_optimumEndIndex != _optimumCurrentIndex)
+		{
+			int lenRes = _optimum[_optimumCurrentIndex].PosPrev - _optimumCurrentIndex;
+			backRes = _optimum[_optimumCurrentIndex].BackPrev;
+			_optimumCurrentIndex = _optimum[_optimumCurrentIndex].PosPrev;
+			return lenRes;
+		}
+		_optimumCurrentIndex = _optimumEndIndex = 0;
+
+		int lenMain, numDistancePairs;
+		if (!_longestMatchWasFound)
+		{
+			lenMain = ReadMatchDistances();
+		}
+		else
+		{
+			lenMain = _longestMatchLength;
+			_longestMatchWasFound = false;
+		}
+		numDistancePairs = _numDistancePairs;
+
+		int numAvailableBytes = _matchFinder.GetNumAvailableBytes() + 1;
+		if (numAvailableBytes < 2)
+		{
+			backRes = -1;
+			return 1;
+		}
+		if (numAvailableBytes > Base.kMatchMaxLen)
+			numAvailableBytes = Base.kMatchMaxLen;
+
+		int repMaxIndex = 0;
+		int i;
+		for (i = 0; i < Base.kNumRepDistances; i++)
+		{
+			reps[i] = _repDistances[i];
+			repLens[i] = _matchFinder.GetMatchLen(0 - 1, reps[i], Base.kMatchMaxLen);
+			if (repLens[i] > repLens[repMaxIndex])
+				repMaxIndex = i;
+		}
+		if (repLens[repMaxIndex] >= _numFastBytes)
+		{
+			backRes = repMaxIndex;
+			int lenRes = repLens[repMaxIndex];
+			MovePos(lenRes - 1);
+			return lenRes;
+		}
+
+		if (lenMain >= _numFastBytes)
+		{
+			backRes = _matchDistances[numDistancePairs - 1] + Base.kNumRepDistances;
+			MovePos(lenMain - 1);
+			return lenMain;
+		}
+
+		byte currentByte = _matchFinder.GetIndexByte(0 - 1);
+		byte matchByte = _matchFinder.GetIndexByte(0 - _repDistances[0] - 1 - 1);
+
+		if (lenMain < 2 && currentByte != matchByte && repLens[repMaxIndex] < 2)
+		{
+			backRes = -1;
+			return 1;
+		}
+
+		_optimum[0].State = _state;
+
+		int posState = (position & _posStateMask);
+
+		_optimum[1].Price = SevenZip.Compression.RangeCoder.Encoder.GetPrice0(_isMatch[(_state << Base.kNumPosStatesBitsMax) + posState]) +
+				_literalEncoder.GetSubCoder(position, _previousByte).GetPrice(!Base.StateIsCharState(_state), matchByte, currentByte);
+		_optimum[1].MakeAsChar();
+
+		int matchPrice = SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isMatch[(_state << Base.kNumPosStatesBitsMax) + posState]);
+		int repMatchPrice = matchPrice + SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isRep[_state]);
+
+		if (matchByte == currentByte)
+		{
+			int shortRepPrice = repMatchPrice + GetRepLen1Price(_state, posState);
+			if (shortRepPrice < _optimum[1].Price)
+			{
+				_optimum[1].Price = shortRepPrice;
+				_optimum[1].MakeAsShortRep();
+			}
+		}
+
+		int lenEnd = ((lenMain >= repLens[repMaxIndex]) ? lenMain : repLens[repMaxIndex]);
+
+		if (lenEnd < 2)
+		{
+			backRes = _optimum[1].BackPrev;
+			return 1;
+		}
+
+		_optimum[1].PosPrev = 0;
+
+		_optimum[0].Backs0 = reps[0];
+		_optimum[0].Backs1 = reps[1];
+		_optimum[0].Backs2 = reps[2];
+		_optimum[0].Backs3 = reps[3];
+
+		int len = lenEnd;
+		do
+			_optimum[len--].Price = kIfinityPrice;
+		while (len >= 2);
+
+		for (i = 0; i < Base.kNumRepDistances; i++)
+		{
+			int repLen = repLens[i];
+			if (repLen < 2)
+				continue;
+			int price = repMatchPrice + GetPureRepPrice(i, _state, posState);
+			do
+			{
+				int curAndLenPrice = price + _repMatchLenEncoder.GetPrice(repLen - 2, posState);
+				Optimal optimum = _optimum[repLen];
+				if (curAndLenPrice < optimum.Price)
+				{
+					optimum.Price = curAndLenPrice;
+					optimum.PosPrev = 0;
+					optimum.BackPrev = i;
+					optimum.Prev1IsChar = false;
+				}
+			}
+			while (--repLen >= 2);
+		}
+
+		int normalMatchPrice = matchPrice + SevenZip.Compression.RangeCoder.Encoder.GetPrice0(_isRep[_state]);
+
+		len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2);
+		if (len <= lenMain)
+		{
+			int offs = 0;
+			while (len > _matchDistances[offs])
+				offs += 2;
+			for (; ; len++)
+			{
+				int distance = _matchDistances[offs + 1];
+				int curAndLenPrice = normalMatchPrice + GetPosLenPrice(distance, len, posState);
+				Optimal optimum = _optimum[len];
+				if (curAndLenPrice < optimum.Price)
+				{
+					optimum.Price = curAndLenPrice;
+					optimum.PosPrev = 0;
+					optimum.BackPrev = distance + Base.kNumRepDistances;
+					optimum.Prev1IsChar = false;
+				}
+				if (len == _matchDistances[offs])
+				{
+					offs += 2;
+					if (offs == numDistancePairs)
+						break;
+				}
+			}
+		}
+
+		int cur = 0;
+
+		while (true)
+		{
+			cur++;
+			if (cur == lenEnd)
+				return Backward(cur);
+			int newLen = ReadMatchDistances();
+			numDistancePairs = _numDistancePairs;
+			if (newLen >= _numFastBytes)
+			{
+
+				_longestMatchLength = newLen;
+				_longestMatchWasFound = true;
+				return Backward(cur);
+			}
+			position++;
+			int posPrev = _optimum[cur].PosPrev;
+			int state;
+			if (_optimum[cur].Prev1IsChar)
+			{
+				posPrev--;
+				if (_optimum[cur].Prev2)
+				{
+					state = _optimum[_optimum[cur].PosPrev2].State;
+					if (_optimum[cur].BackPrev2 < Base.kNumRepDistances)
+						state = Base.StateUpdateRep(state);
+					else
+						state = Base.StateUpdateMatch(state);
+				}
+				else
+					state = _optimum[posPrev].State;
+				state = Base.StateUpdateChar(state);
+			}
+			else
+				state = _optimum[posPrev].State;
+			if (posPrev == cur - 1)
+			{
+				if (_optimum[cur].IsShortRep())
+					state = Base.StateUpdateShortRep(state);
+				else
+					state = Base.StateUpdateChar(state);
+			}
+			else
+			{
+				int pos;
+				if (_optimum[cur].Prev1IsChar && _optimum[cur].Prev2)
+				{
+					posPrev = _optimum[cur].PosPrev2;
+					pos = _optimum[cur].BackPrev2;
+					state = Base.StateUpdateRep(state);
+				}
+				else
+				{
+					pos = _optimum[cur].BackPrev;
+					if (pos < Base.kNumRepDistances)
+						state = Base.StateUpdateRep(state);
+					else
+						state = Base.StateUpdateMatch(state);
+				}
+				Optimal opt = _optimum[posPrev];
+				if (pos < Base.kNumRepDistances)
+				{
+					if (pos == 0)
+					{
+						reps[0] = opt.Backs0;
+						reps[1] = opt.Backs1;
+						reps[2] = opt.Backs2;
+						reps[3] = opt.Backs3;
+					}
+					else if (pos == 1)
+					{
+						reps[0] = opt.Backs1;
+						reps[1] = opt.Backs0;
+						reps[2] = opt.Backs2;
+						reps[3] = opt.Backs3;
+					}
+					else if (pos == 2)
+					{
+						reps[0] = opt.Backs2;
+						reps[1] = opt.Backs0;
+						reps[2] = opt.Backs1;
+						reps[3] = opt.Backs3;
+					}
+					else
+					{
+						reps[0] = opt.Backs3;
+						reps[1] = opt.Backs0;
+						reps[2] = opt.Backs1;
+						reps[3] = opt.Backs2;
+					}
+				}
+				else
+				{
+					reps[0] = (pos - Base.kNumRepDistances);
+					reps[1] = opt.Backs0;
+					reps[2] = opt.Backs1;
+					reps[3] = opt.Backs2;
+				}
+			}
+			_optimum[cur].State = state;
+			_optimum[cur].Backs0 = reps[0];
+			_optimum[cur].Backs1 = reps[1];
+			_optimum[cur].Backs2 = reps[2];
+			_optimum[cur].Backs3 = reps[3];
+			int curPrice = _optimum[cur].Price;
+
+			currentByte = _matchFinder.GetIndexByte(0 - 1);
+			matchByte = _matchFinder.GetIndexByte(0 - reps[0] - 1 - 1);
+
+			posState = (position & _posStateMask);
+
+			int curAnd1Price = curPrice +
+				SevenZip.Compression.RangeCoder.Encoder.GetPrice0(_isMatch[(state << Base.kNumPosStatesBitsMax) + posState]) +
+				_literalEncoder.GetSubCoder(position, _matchFinder.GetIndexByte(0 - 2)).
+				GetPrice(!Base.StateIsCharState(state), matchByte, currentByte);
+
+			Optimal nextOptimum = _optimum[cur + 1];
+
+			boolean nextIsChar = false;
+			if (curAnd1Price < nextOptimum.Price)
+			{
+				nextOptimum.Price = curAnd1Price;
+				nextOptimum.PosPrev = cur;
+				nextOptimum.MakeAsChar();
+				nextIsChar = true;
+			}
+
+			matchPrice = curPrice + SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isMatch[(state << Base.kNumPosStatesBitsMax) + posState]);
+			repMatchPrice = matchPrice + SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isRep[state]);
+
+			if (matchByte == currentByte &&
+				!(nextOptimum.PosPrev < cur && nextOptimum.BackPrev == 0))
+			{
+				int shortRepPrice = repMatchPrice + GetRepLen1Price(state, posState);
+				if (shortRepPrice <= nextOptimum.Price)
+				{
+					nextOptimum.Price = shortRepPrice;
+					nextOptimum.PosPrev = cur;
+					nextOptimum.MakeAsShortRep();
+					nextIsChar = true;
+				}
+			}
+
+			int numAvailableBytesFull = _matchFinder.GetNumAvailableBytes() + 1;
+			numAvailableBytesFull = Math.min(kNumOpts - 1 - cur, numAvailableBytesFull);
+			numAvailableBytes = numAvailableBytesFull;
+
+			if (numAvailableBytes < 2)
+				continue;
+			if (numAvailableBytes > _numFastBytes)
+				numAvailableBytes = _numFastBytes;
+			if (!nextIsChar && matchByte != currentByte)
+			{
+				// try Literal + rep0
+				int t = Math.min(numAvailableBytesFull - 1, _numFastBytes);
+				int lenTest2 = _matchFinder.GetMatchLen(0, reps[0], t);
+				if (lenTest2 >= 2)
+				{
+					int state2 = Base.StateUpdateChar(state);
+
+					int posStateNext = (position + 1) & _posStateMask;
+					int nextRepMatchPrice = curAnd1Price +
+						SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isMatch[(state2 << Base.kNumPosStatesBitsMax) + posStateNext]) +
+						SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isRep[state2]);
+					{
+						int offset = cur + 1 + lenTest2;
+						while (lenEnd < offset)
+							_optimum[++lenEnd].Price = kIfinityPrice;
+						int curAndLenPrice = nextRepMatchPrice + GetRepPrice(
+								0, lenTest2, state2, posStateNext);
+						Optimal optimum = _optimum[offset];
+						if (curAndLenPrice < optimum.Price)
+						{
+							optimum.Price = curAndLenPrice;
+							optimum.PosPrev = cur + 1;
+							optimum.BackPrev = 0;
+							optimum.Prev1IsChar = true;
+							optimum.Prev2 = false;
+						}
+					}
+				}
+			}
+
+			int startLen = 2; // speed optimization 
+
+			for (int repIndex = 0; repIndex < Base.kNumRepDistances; repIndex++)
+			{
+				int lenTest = _matchFinder.GetMatchLen(0 - 1, reps[repIndex], numAvailableBytes);
+				if (lenTest < 2)
+					continue;
+				int lenTestTemp = lenTest;
+				do
+				{
+					while (lenEnd < cur + lenTest)
+						_optimum[++lenEnd].Price = kIfinityPrice;
+					int curAndLenPrice = repMatchPrice + GetRepPrice(repIndex, lenTest, state, posState);
+					Optimal optimum = _optimum[cur + lenTest];
+					if (curAndLenPrice < optimum.Price)
+					{
+						optimum.Price = curAndLenPrice;
+						optimum.PosPrev = cur;
+						optimum.BackPrev = repIndex;
+						optimum.Prev1IsChar = false;
+					}
+				}
+				while (--lenTest >= 2);
+				lenTest = lenTestTemp;
+
+				if (repIndex == 0)
+					startLen = lenTest + 1;
+
+				// if (_maxMode)
+				if (lenTest < numAvailableBytesFull)
+				{
+					int t = Math.min(numAvailableBytesFull - 1 - lenTest, _numFastBytes);
+					int lenTest2 = _matchFinder.GetMatchLen(lenTest, reps[repIndex], t);
+					if (lenTest2 >= 2)
+					{
+						int state2 = Base.StateUpdateRep(state);
+
+						int posStateNext = (position + lenTest) & _posStateMask;
+						int curAndLenCharPrice =
+								repMatchPrice + GetRepPrice(repIndex, lenTest, state, posState) +
+								SevenZip.Compression.RangeCoder.Encoder.GetPrice0(_isMatch[(state2 << Base.kNumPosStatesBitsMax) + posStateNext]) +
+								_literalEncoder.GetSubCoder(position + lenTest,
+								_matchFinder.GetIndexByte(lenTest - 1 - 1)).GetPrice(true,
+								_matchFinder.GetIndexByte(lenTest - 1 - (reps[repIndex] + 1)),
+								_matchFinder.GetIndexByte(lenTest - 1));
+						state2 = Base.StateUpdateChar(state2);
+						posStateNext = (position + lenTest + 1) & _posStateMask;
+						int nextMatchPrice = curAndLenCharPrice + SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isMatch[(state2 << Base.kNumPosStatesBitsMax) + posStateNext]);
+						int nextRepMatchPrice = nextMatchPrice + SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isRep[state2]);
+
+						// for(; lenTest2 >= 2; lenTest2--)
+						{
+							int offset = lenTest + 1 + lenTest2;
+							while (lenEnd < cur + offset)
+								_optimum[++lenEnd].Price = kIfinityPrice;
+							int curAndLenPrice = nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext);
+							Optimal optimum = _optimum[cur + offset];
+							if (curAndLenPrice < optimum.Price)
+							{
+								optimum.Price = curAndLenPrice;
+								optimum.PosPrev = cur + lenTest + 1;
+								optimum.BackPrev = 0;
+								optimum.Prev1IsChar = true;
+								optimum.Prev2 = true;
+								optimum.PosPrev2 = cur;
+								optimum.BackPrev2 = repIndex;
+							}
+						}
+					}
+				}
+			}
+
+			if (newLen > numAvailableBytes)
+			{
+				newLen = numAvailableBytes;
+				for (numDistancePairs = 0; newLen > _matchDistances[numDistancePairs]; numDistancePairs += 2) ;
+				_matchDistances[numDistancePairs] = newLen;
+				numDistancePairs += 2;
+			}
+			if (newLen >= startLen)
+			{
+				normalMatchPrice = matchPrice + SevenZip.Compression.RangeCoder.Encoder.GetPrice0(_isRep[state]);
+				while (lenEnd < cur + newLen)
+					_optimum[++lenEnd].Price = kIfinityPrice;
+
+				int offs = 0;
+				while (startLen > _matchDistances[offs])
+					offs += 2;
+
+				for (int lenTest = startLen; ; lenTest++)
+				{
+					int curBack = _matchDistances[offs + 1];
+					int curAndLenPrice = normalMatchPrice + GetPosLenPrice(curBack, lenTest, posState);
+					Optimal optimum = _optimum[cur + lenTest];
+					if (curAndLenPrice < optimum.Price)
+					{
+						optimum.Price = curAndLenPrice;
+						optimum.PosPrev = cur;
+						optimum.BackPrev = curBack + Base.kNumRepDistances;
+						optimum.Prev1IsChar = false;
+					}
+
+					if (lenTest == _matchDistances[offs])
+					{
+						if (lenTest < numAvailableBytesFull)
+						{
+							int t = Math.min(numAvailableBytesFull - 1 - lenTest, _numFastBytes);
+							int lenTest2 = _matchFinder.GetMatchLen(lenTest, curBack, t);
+							if (lenTest2 >= 2)
+							{
+								int state2 = Base.StateUpdateMatch(state);
+
+								int posStateNext = (position + lenTest) & _posStateMask;
+								int curAndLenCharPrice = curAndLenPrice +
+									SevenZip.Compression.RangeCoder.Encoder.GetPrice0(_isMatch[(state2 << Base.kNumPosStatesBitsMax) + posStateNext]) +
+									_literalEncoder.GetSubCoder(position + lenTest,
+									_matchFinder.GetIndexByte(lenTest - 1 - 1)).
+									GetPrice(true,
+									_matchFinder.GetIndexByte(lenTest - (curBack + 1) - 1),
+									_matchFinder.GetIndexByte(lenTest - 1));
+								state2 = Base.StateUpdateChar(state2);
+								posStateNext = (position + lenTest + 1) & _posStateMask;
+								int nextMatchPrice = curAndLenCharPrice + SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isMatch[(state2 << Base.kNumPosStatesBitsMax) + posStateNext]);
+								int nextRepMatchPrice = nextMatchPrice + SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isRep[state2]);
+
+								int offset = lenTest + 1 + lenTest2;
+								while (lenEnd < cur + offset)
+									_optimum[++lenEnd].Price = kIfinityPrice;
+								curAndLenPrice = nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext);
+								optimum = _optimum[cur + offset];
+								if (curAndLenPrice < optimum.Price)
+								{
+									optimum.Price = curAndLenPrice;
+									optimum.PosPrev = cur + lenTest + 1;
+									optimum.BackPrev = 0;
+									optimum.Prev1IsChar = true;
+									optimum.Prev2 = true;
+									optimum.PosPrev2 = cur;
+									optimum.BackPrev2 = curBack + Base.kNumRepDistances;
+								}
+							}
+						}
+						offs += 2;
+						if (offs == numDistancePairs)
+							break;
+					}
+				}
+			}
+		}
+	}
+
+	boolean ChangePair(int smallDist, int bigDist)
+	{
+		int kDif = 7;
+		return (smallDist < (1 << (32 - kDif)) && bigDist >= (smallDist << kDif));
+	}
+
+	void WriteEndMarker(int posState) throws IOException
+	{
+		if (!_writeEndMark)
+			return;
+
+		_rangeEncoder.Encode(_isMatch, (_state << Base.kNumPosStatesBitsMax) + posState, 1);
+		_rangeEncoder.Encode(_isRep, _state, 0);
+		_state = Base.StateUpdateMatch(_state);
+		int len = Base.kMatchMinLen;
+		_lenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState);
+		int posSlot = (1 << Base.kNumPosSlotBits) - 1;
+		int lenToPosState = Base.GetLenToPosState(len);
+		_posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot);
+		int footerBits = 30;
+		int posReduced = (1 << footerBits) - 1;
+		_rangeEncoder.EncodeDirectBits(posReduced >> Base.kNumAlignBits, footerBits - Base.kNumAlignBits);
+		_posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced & Base.kAlignMask);
+	}
+
+	void Flush(int nowPos) throws IOException
+	{
+		ReleaseMFStream();
+		WriteEndMarker(nowPos & _posStateMask);
+		_rangeEncoder.FlushData();
+		_rangeEncoder.FlushStream();
+	}
+
+	public void CodeOneBlock(long[] inSize, long[] outSize, boolean[] finished) throws IOException
+	{
+		inSize[0] = 0;
+		outSize[0] = 0;
+		finished[0] = true;
+
+		if (_inStream != null)
+		{
+			_matchFinder.SetStream(_inStream);
+			_matchFinder.Init();
+			_needReleaseMFStream = true;
+			_inStream = null;
+		}
+
+		if (_finished)
+			return;
+		_finished = true;
+
+
+		long progressPosValuePrev = nowPos64;
+		if (nowPos64 == 0)
+		{
+			if (_matchFinder.GetNumAvailableBytes() == 0)
+			{
+				Flush((int)nowPos64);
+				return;
+			}
+
+			ReadMatchDistances();
+			int posState = (int)(nowPos64) & _posStateMask;
+			_rangeEncoder.Encode(_isMatch, (_state << Base.kNumPosStatesBitsMax) + posState, 0);
+			_state = Base.StateUpdateChar(_state);
+			byte curByte = _matchFinder.GetIndexByte(0 - _additionalOffset);
+			_literalEncoder.GetSubCoder((int)(nowPos64), _previousByte).Encode(_rangeEncoder, curByte);
+			_previousByte = curByte;
+			_additionalOffset--;
+			nowPos64++;
+		}
+		if (_matchFinder.GetNumAvailableBytes() == 0)
+		{
+			Flush((int)nowPos64);
+			return;
+		}
+		while (true)
+		{
+
+			int len = GetOptimum((int)nowPos64);
+			int pos = backRes;
+			int posState = ((int)nowPos64) & _posStateMask;
+			int complexState = (_state << Base.kNumPosStatesBitsMax) + posState;
+			if (len == 1 && pos == -1)
+			{
+				_rangeEncoder.Encode(_isMatch, complexState, 0);
+				byte curByte = _matchFinder.GetIndexByte((int)(0 - _additionalOffset));
+				LiteralEncoder.Encoder2 subCoder = _literalEncoder.GetSubCoder((int)nowPos64, _previousByte);
+				if (!Base.StateIsCharState(_state))
+				{
+					byte matchByte = _matchFinder.GetIndexByte((int)(0 - _repDistances[0] - 1 - _additionalOffset));
+					subCoder.EncodeMatched(_rangeEncoder, matchByte, curByte);
+				}
+				else
+					subCoder.Encode(_rangeEncoder, curByte);
+				_previousByte = curByte;
+				_state = Base.StateUpdateChar(_state);
+			}
+			else
+			{
+				_rangeEncoder.Encode(_isMatch, complexState, 1);
+				if (pos < Base.kNumRepDistances)
+				{
+					_rangeEncoder.Encode(_isRep, _state, 1);
+					if (pos == 0)
+					{
+						_rangeEncoder.Encode(_isRepG0, _state, 0);
+						if (len == 1)
+							_rangeEncoder.Encode(_isRep0Long, complexState, 0);
+						else
+							_rangeEncoder.Encode(_isRep0Long, complexState, 1);
+					}
+					else
+					{
+						_rangeEncoder.Encode(_isRepG0, _state, 1);
+						if (pos == 1)
+							_rangeEncoder.Encode(_isRepG1, _state, 0);
+						else
+						{
+							_rangeEncoder.Encode(_isRepG1, _state, 1);
+							_rangeEncoder.Encode(_isRepG2, _state, pos - 2);
+						}
+					}
+					if (len == 1)
+						_state = Base.StateUpdateShortRep(_state);
+					else
+					{
+						_repMatchLenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState);
+						_state = Base.StateUpdateRep(_state);
+					}
+					int distance = _repDistances[pos];
+					if (pos != 0)
+					{
+						for (int i = pos; i >= 1; i--)
+							_repDistances[i] = _repDistances[i - 1];
+						_repDistances[0] = distance;
+					}
+				}
+				else
+				{
+					_rangeEncoder.Encode(_isRep, _state, 0);
+					_state = Base.StateUpdateMatch(_state);
+					_lenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState);
+					pos -= Base.kNumRepDistances;
+					int posSlot = GetPosSlot(pos);
+					int lenToPosState = Base.GetLenToPosState(len);
+					_posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot);
+
+					if (posSlot >= Base.kStartPosModelIndex)
+					{
+						int footerBits = (int)((posSlot >> 1) - 1);
+						int baseVal = ((2 | (posSlot & 1)) << footerBits);
+						int posReduced = pos - baseVal;
+
+						if (posSlot < Base.kEndPosModelIndex)
+							BitTreeEncoder.ReverseEncode(_posEncoders,
+									baseVal - posSlot - 1, _rangeEncoder, footerBits, posReduced);
+						else
+						{
+							_rangeEncoder.EncodeDirectBits(posReduced >> Base.kNumAlignBits, footerBits - Base.kNumAlignBits);
+							_posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced & Base.kAlignMask);
+							_alignPriceCount++;
+						}
+					}
+					int distance = pos;
+					for (int i = Base.kNumRepDistances - 1; i >= 1; i--)
+						_repDistances[i] = _repDistances[i - 1];
+					_repDistances[0] = distance;
+					_matchPriceCount++;
+				}
+				_previousByte = _matchFinder.GetIndexByte(len - 1 - _additionalOffset);
+			}
+			_additionalOffset -= len;
+			nowPos64 += len;
+			if (_additionalOffset == 0)
+			{
+				// if (!_fastMode)
+				if (_matchPriceCount >= (1 << 7))
+					FillDistancesPrices();
+				if (_alignPriceCount >= Base.kAlignTableSize)
+					FillAlignPrices();
+				inSize[0] = nowPos64;
+				outSize[0] = _rangeEncoder.GetProcessedSizeAdd();
+				if (_matchFinder.GetNumAvailableBytes() == 0)
+				{
+					Flush((int)nowPos64);
+					return;
+				}
+
+				if (nowPos64 - progressPosValuePrev >= (1 << 12))
+				{
+					_finished = false;
+					finished[0] = false;
+					return;
+				}
+			}
+		}
+	}
+
+	void ReleaseMFStream()
+	{
+		if (_matchFinder != null && _needReleaseMFStream)
+		{
+			_matchFinder.ReleaseStream();
+			_needReleaseMFStream = false;
+		}
+	}
+
+	void SetOutStream(java.io.OutputStream outStream)
+	{ _rangeEncoder.SetStream(outStream); }
+	void ReleaseOutStream()
+	{ _rangeEncoder.ReleaseStream(); }
+
+	void ReleaseStreams()
+	{
+		ReleaseMFStream();
+		ReleaseOutStream();
+	}
+
+	void SetStreams(java.io.InputStream inStream, java.io.OutputStream outStream,
+			long inSize, long outSize)
+	{
+		_inStream = inStream;
+		_finished = false;
+		Create();
+		SetOutStream(outStream);
+		Init();
+
+		// if (!_fastMode)
+		{
+			FillDistancesPrices();
+			FillAlignPrices();
+		}
+
+		_lenEncoder.SetTableSize(_numFastBytes + 1 - Base.kMatchMinLen);
+		_lenEncoder.UpdateTables(1 << _posStateBits);
+		_repMatchLenEncoder.SetTableSize(_numFastBytes + 1 - Base.kMatchMinLen);
+		_repMatchLenEncoder.UpdateTables(1 << _posStateBits);
+
+		nowPos64 = 0;
+	}
+
+	long[] processedInSize = new long[1]; long[] processedOutSize = new long[1]; boolean[] finished = new boolean[1];
+	public void Code(java.io.InputStream inStream, java.io.OutputStream outStream,
+			long inSize, long outSize, ICodeProgress progress) throws IOException
+	{
+		_needReleaseMFStream = false;
+		try
+		{
+			SetStreams(inStream, outStream, inSize, outSize);
+			while (true)
+			{
+
+
+
+				CodeOneBlock(processedInSize, processedOutSize, finished);
+				if (finished[0])
+					return;
+				if (progress != null)
+				{
+					progress.SetProgress(processedInSize[0], processedOutSize[0]);
+				}
+			}
+		}
+		finally
+		{
+			ReleaseStreams();
+		}
+	}
+
+	public static final int kPropSize = 5;
+	byte[] properties = new byte[kPropSize];
+
+	public void WriteCoderProperties(java.io.OutputStream outStream) throws IOException
+	{
+		properties[0] = (byte)((_posStateBits * 5 + _numLiteralPosStateBits) * 9 + _numLiteralContextBits);
+		for (int i = 0; i < 4; i++)
+			properties[1 + i] = (byte)(_dictionarySize >> (8 * i));
+		outStream.write(properties, 0, kPropSize);
+	}
+
+	int[] tempPrices = new int[Base.kNumFullDistances];
+	int _matchPriceCount;
+
+	void FillDistancesPrices()
+	{
+		for (int i = Base.kStartPosModelIndex; i < Base.kNumFullDistances; i++)
+		{
+			int posSlot = GetPosSlot(i);
+			int footerBits = (int)((posSlot >> 1) - 1);
+			int baseVal = ((2 | (posSlot & 1)) << footerBits);
+			tempPrices[i] = BitTreeEncoder.ReverseGetPrice(_posEncoders,
+				baseVal - posSlot - 1, footerBits, i - baseVal);
+		}
+
+		for (int lenToPosState = 0; lenToPosState < Base.kNumLenToPosStates; lenToPosState++)
+		{
+			int posSlot;
+			BitTreeEncoder encoder = _posSlotEncoder[lenToPosState];
+
+			int st = (lenToPosState << Base.kNumPosSlotBits);
+			for (posSlot = 0; posSlot < _distTableSize; posSlot++)
+				_posSlotPrices[st + posSlot] = encoder.GetPrice(posSlot);
+			for (posSlot = Base.kEndPosModelIndex; posSlot < _distTableSize; posSlot++)
+				_posSlotPrices[st + posSlot] += ((((posSlot >> 1) - 1) - Base.kNumAlignBits) << SevenZip.Compression.RangeCoder.Encoder.kNumBitPriceShiftBits);
+
+			int st2 = lenToPosState * Base.kNumFullDistances;
+			int i;
+			for (i = 0; i < Base.kStartPosModelIndex; i++)
+				_distancesPrices[st2 + i] = _posSlotPrices[st + i];
+			for (; i < Base.kNumFullDistances; i++)
+				_distancesPrices[st2 + i] = _posSlotPrices[st + GetPosSlot(i)] + tempPrices[i];
+		}
+		_matchPriceCount = 0;
+	}
+
+	void FillAlignPrices()
+	{
+		for (int i = 0; i < Base.kAlignTableSize; i++)
+			_alignPrices[i] = _posAlignEncoder.ReverseGetPrice(i);
+		_alignPriceCount = 0;
+	}
+
+
+	public boolean SetAlgorithm(int algorithm)
+	{
+		/*
+		_fastMode = (algorithm == 0);
+		_maxMode = (algorithm >= 2);
+		*/
+		return true;
+	}
+
+	public boolean SetDictionarySize(int dictionarySize)
+	{
+		int kDicLogSizeMaxCompress = 29;
+		if (dictionarySize < (1 << Base.kDicLogSizeMin) || dictionarySize > (1 << kDicLogSizeMaxCompress))
+			return false;
+		_dictionarySize = dictionarySize;
+		int dicLogSize;
+		for (dicLogSize = 0; dictionarySize > (1 << dicLogSize); dicLogSize++) ;
+		_distTableSize = dicLogSize * 2;
+		return true;
+	}
+
+	public boolean SeNumFastBytes(int numFastBytes)
+	{
+		if (numFastBytes < 5 || numFastBytes > Base.kMatchMaxLen)
+			return false;
+		_numFastBytes = numFastBytes;
+		return true;
+	}
+
+	public boolean SetMatchFinder(int matchFinderIndex)
+	{
+		if (matchFinderIndex < 0 || matchFinderIndex > 2)
+			return false;
+		int matchFinderIndexPrev = _matchFinderType;
+		_matchFinderType = matchFinderIndex;
+		if (_matchFinder != null && matchFinderIndexPrev != _matchFinderType)
+		{
+			_dictionarySizePrev = -1;
+			_matchFinder = null;
+		}
+		return true;
+	}
+
+	public boolean SetLcLpPb(int lc, int lp, int pb)
+	{
+		if (
+				lp < 0 || lp > Base.kNumLitPosStatesBitsEncodingMax ||
+				lc < 0 || lc > Base.kNumLitContextBitsMax ||
+				pb < 0 || pb > Base.kNumPosStatesBitsEncodingMax)
+			return false;
+		_numLiteralPosStateBits = lp;
+		_numLiteralContextBits = lc;
+		_posStateBits = pb;
+		_posStateMask = ((1) << _posStateBits) - 1;
+		return true;
+	}
+
+	public void SetEndMarkerMode(boolean endMarkerMode)
+	{
+		_writeEndMark = endMarkerMode;
+	}
+}
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/RangeCoder/BitTreeDecoder.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/RangeCoder/BitTreeDecoder.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/RangeCoder/BitTreeDecoder.java	(revision 21851)
@@ -0,0 +1,55 @@
+package SevenZip.Compression.RangeCoder;
+
+public class BitTreeDecoder
+{
+	short[] Models;
+	int NumBitLevels;
+	
+	public BitTreeDecoder(int numBitLevels)
+	{
+		NumBitLevels = numBitLevels;
+		Models = new short[1 << numBitLevels];
+	}
+	
+	public void Init()
+	{
+		Decoder.InitBitModels(Models);
+	}
+	
+	public int Decode(Decoder rangeDecoder) throws java.io.IOException
+	{
+		int m = 1;
+		for (int bitIndex = NumBitLevels; bitIndex != 0; bitIndex--)
+			m = (m << 1) + rangeDecoder.DecodeBit(Models, m);
+		return m - (1 << NumBitLevels);
+	}
+	
+	public int ReverseDecode(Decoder rangeDecoder) throws java.io.IOException
+	{
+		int m = 1;
+		int symbol = 0;
+		for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
+		{
+			int bit = rangeDecoder.DecodeBit(Models, m);
+			m <<= 1;
+			m += bit;
+			symbol |= (bit << bitIndex);
+		}
+		return symbol;
+	}
+	
+	public static int ReverseDecode(short[] Models, int startIndex,
+			Decoder rangeDecoder, int NumBitLevels) throws java.io.IOException
+	{
+		int m = 1;
+		int symbol = 0;
+		for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
+		{
+			int bit = rangeDecoder.DecodeBit(Models, startIndex + m);
+			m <<= 1;
+			m += bit;
+			symbol |= (bit << bitIndex);
+		}
+		return symbol;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/RangeCoder/BitTreeEncoder.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/RangeCoder/BitTreeEncoder.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/RangeCoder/BitTreeEncoder.java	(revision 21851)
@@ -0,0 +1,99 @@
+package SevenZip.Compression.RangeCoder;
+import java.io.IOException;
+
+public class BitTreeEncoder
+{
+	short[] Models;
+	int NumBitLevels;
+	
+	public BitTreeEncoder(int numBitLevels)
+	{
+		NumBitLevels = numBitLevels;
+		Models = new short[1 << numBitLevels];
+	}
+	
+	public void Init()
+	{
+		Decoder.InitBitModels(Models);
+	}
+	
+	public void Encode(Encoder rangeEncoder, int symbol) throws IOException
+	{
+		int m = 1;
+		for (int bitIndex = NumBitLevels; bitIndex != 0; )
+		{
+			bitIndex--;
+			int bit = (symbol >>> bitIndex) & 1;
+			rangeEncoder.Encode(Models, m, bit);
+			m = (m << 1) | bit;
+		}
+	}
+	
+	public void ReverseEncode(Encoder rangeEncoder, int symbol) throws IOException
+	{
+		int m = 1;
+		for (int  i = 0; i < NumBitLevels; i++)
+		{
+			int bit = symbol & 1;
+			rangeEncoder.Encode(Models, m, bit);
+			m = (m << 1) | bit;
+			symbol >>= 1;
+		}
+	}
+	
+	public int GetPrice(int symbol)
+	{
+		int price = 0;
+		int m = 1;
+		for (int bitIndex = NumBitLevels; bitIndex != 0; )
+		{
+			bitIndex--;
+			int bit = (symbol >>> bitIndex) & 1;
+			price += Encoder.GetPrice(Models[m], bit);
+			m = (m << 1) + bit;
+		}
+		return price;
+	}
+	
+	public int ReverseGetPrice(int symbol)
+	{
+		int price = 0;
+		int m = 1;
+		for (int i = NumBitLevels; i != 0; i--)
+		{
+			int bit = symbol & 1;
+			symbol >>>= 1;
+			price += Encoder.GetPrice(Models[m], bit);
+			m = (m << 1) | bit;
+		}
+		return price;
+	}
+	
+	public static int ReverseGetPrice(short[] Models, int startIndex,
+			int NumBitLevels, int symbol)
+	{
+		int price = 0;
+		int m = 1;
+		for (int i = NumBitLevels; i != 0; i--)
+		{
+			int bit = symbol & 1;
+			symbol >>>= 1;
+			price += Encoder.GetPrice(Models[startIndex + m], bit);
+			m = (m << 1) | bit;
+		}
+		return price;
+	}
+	
+	public static void ReverseEncode(short[] Models, int startIndex,
+			Encoder rangeEncoder, int NumBitLevels, int symbol) throws IOException
+	{
+		int m = 1;
+		for (int i = 0; i < NumBitLevels; i++)
+		{
+			int bit = symbol & 1;
+			rangeEncoder.Encode(Models, startIndex + m, bit);
+			m = (m << 1) | bit;
+			symbol >>= 1;
+		}
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/RangeCoder/Decoder.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/RangeCoder/Decoder.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/RangeCoder/Decoder.java	(revision 21851)
@@ -0,0 +1,88 @@
+package SevenZip.Compression.RangeCoder;
+import java.io.IOException;
+
+public class Decoder
+{
+	static final int kTopMask = ~((1 << 24) - 1);
+	
+	static final int kNumBitModelTotalBits = 11;
+	static final int kBitModelTotal = (1 << kNumBitModelTotalBits);
+	static final int kNumMoveBits = 5;
+	
+	int Range;
+	int Code;
+
+	java.io.InputStream Stream;
+	
+	public final void SetStream(java.io.InputStream stream)
+	{ 
+		Stream = stream; 
+	}
+	
+	public final void ReleaseStream()
+	{ 
+		Stream = null; 
+	}
+	
+	public final void Init() throws IOException
+	{
+		Code = 0;
+		Range = -1;
+		for (int i = 0; i < 5; i++)
+			Code = (Code << 8) | Stream.read();
+	}
+	
+	public final int DecodeDirectBits(int numTotalBits) throws IOException
+	{
+		int result = 0;
+		for (int i = numTotalBits; i != 0; i--)
+		{
+			Range >>>= 1;
+			int t = ((Code - Range) >>> 31);
+			Code -= Range & (t - 1);
+			result = (result << 1) | (1 - t);
+			
+			if ((Range & kTopMask) == 0)
+			{
+				Code = (Code << 8) | Stream.read();
+				Range <<= 8;
+			}
+		}
+		return result;
+	}
+	
+	public int DecodeBit(short []probs, int index) throws IOException
+	{
+		int prob = probs[index];
+		int newBound = (Range >>> kNumBitModelTotalBits) * prob;
+		if ((Code ^ 0x80000000) < (newBound ^ 0x80000000))
+		{
+			Range = newBound;
+			probs[index] = (short)(prob + ((kBitModelTotal - prob) >>> kNumMoveBits));
+			if ((Range & kTopMask) == 0)
+			{
+				Code = (Code << 8) | Stream.read();
+				Range <<= 8;
+			}
+			return 0;
+		}
+		else
+		{
+			Range -= newBound;
+			Code -= newBound;
+			probs[index] = (short)(prob - ((prob) >>> kNumMoveBits));
+			if ((Range & kTopMask) == 0)
+			{
+				Code = (Code << 8) | Stream.read();
+				Range <<= 8;
+			}
+			return 1;
+		}
+	}
+	
+	public static void InitBitModels(short []probs)
+	{
+		for (int i = 0; i < probs.length; i++)
+			probs[i] = (kBitModelTotal >>> 1);
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/RangeCoder/Encoder.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/RangeCoder/Encoder.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/Compression/RangeCoder/Encoder.java	(revision 21851)
@@ -0,0 +1,151 @@
+package SevenZip.Compression.RangeCoder;
+import java.io.IOException;
+
+public class Encoder
+{
+	static final int kTopMask = ~((1 << 24) - 1);
+	
+	static final int kNumBitModelTotalBits = 11;
+	static final int kBitModelTotal = (1 << kNumBitModelTotalBits);
+	static final int kNumMoveBits = 5;
+	
+	java.io.OutputStream Stream;
+
+	long Low;
+	int Range;
+	int _cacheSize;
+	int _cache;
+	
+	long _position;
+	
+	public void SetStream(java.io.OutputStream stream)
+	{
+		Stream = stream;
+	}
+	
+	public void ReleaseStream()
+	{
+		Stream = null;
+	}
+	
+	public void Init()
+	{
+		_position = 0;
+		Low = 0;
+		Range = -1;
+		_cacheSize = 1;
+		_cache = 0;
+	}
+	
+	public void FlushData() throws IOException
+	{
+		for (int i = 0; i < 5; i++)
+			ShiftLow();
+	}
+	
+	public void FlushStream() throws IOException
+	{
+		Stream.flush();
+	}
+	
+	public void ShiftLow() throws IOException
+	{
+		int LowHi = (int)(Low >>> 32);
+		if (LowHi != 0 || Low < 0xFF000000L)
+		{
+			_position += _cacheSize;
+			int temp = _cache;
+			do
+			{
+				Stream.write(temp + LowHi);
+				temp = 0xFF;
+			}
+			while(--_cacheSize != 0);
+			_cache = (((int)Low) >>> 24);
+		}
+		_cacheSize++;
+		Low = (Low & 0xFFFFFF) << 8;
+	}
+	
+	public void EncodeDirectBits(int v, int numTotalBits) throws IOException
+	{
+		for (int i = numTotalBits - 1; i >= 0; i--)
+		{
+			Range >>>= 1;
+			if (((v >>> i) & 1) == 1)
+				Low += Range;
+			if ((Range & Encoder.kTopMask) == 0)
+			{
+				Range <<= 8;
+				ShiftLow();
+			}
+		}
+	}
+	
+	
+	public long GetProcessedSizeAdd()
+	{
+		return _cacheSize + _position + 4;
+	}
+	
+	
+	
+	static final int kNumMoveReducingBits = 2;
+	public static final int kNumBitPriceShiftBits = 6;
+	
+	public static void InitBitModels(short []probs)
+	{
+		for (int i = 0; i < probs.length; i++)
+			probs[i] = (kBitModelTotal >>> 1);
+	}
+	
+	public void Encode(short []probs, int index, int symbol) throws IOException
+	{
+		int prob = probs[index];
+		int newBound = (Range >>> kNumBitModelTotalBits) * prob;
+		if (symbol == 0)
+		{
+			Range = newBound;
+			probs[index] = (short)(prob + ((kBitModelTotal - prob) >>> kNumMoveBits));
+		}
+		else
+		{
+			Low += (newBound & 0xFFFFFFFFL);
+			Range -= newBound;
+			probs[index] = (short)(prob - ((prob) >>> kNumMoveBits));
+		}
+		if ((Range & kTopMask) == 0)
+		{
+			Range <<= 8;
+			ShiftLow();
+		}
+	}
+	
+	private static int[] ProbPrices = new int[kBitModelTotal >>> kNumMoveReducingBits];
+	
+	static
+	{
+		int kNumBits = (kNumBitModelTotalBits - kNumMoveReducingBits);
+		for (int i = kNumBits - 1; i >= 0; i--)
+		{
+			int start = 1 << (kNumBits - i - 1);
+			int end = 1 << (kNumBits - i);
+			for (int j = start; j < end; j++)
+				ProbPrices[j] = (i << kNumBitPriceShiftBits) +
+						(((end - j) << kNumBitPriceShiftBits) >>> (kNumBits - i - 1));
+		}
+	}
+	
+	static public int GetPrice(int Prob, int symbol)
+	{
+		return ProbPrices[(((Prob - symbol) ^ ((-symbol))) & (kBitModelTotal - 1)) >>> kNumMoveReducingBits];
+	}
+	static public int GetPrice0(int Prob)
+	{ 
+		return ProbPrices[Prob >>> kNumMoveReducingBits]; 
+	}
+	static public int GetPrice1(int Prob)
+	{ 
+		return ProbPrices[(kBitModelTotal - Prob) >>> kNumMoveReducingBits]; 
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/ICodeProgress.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/ICodeProgress.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/ICodeProgress.java	(revision 21851)
@@ -0,0 +1,6 @@
+package SevenZip;
+
+public interface ICodeProgress
+{
+	public void SetProgress(long inSize, long outSize);
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/LzmaAlone.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/LzmaAlone.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/LzmaAlone.java	(revision 21851)
@@ -0,0 +1,257 @@
+package SevenZip;
+
+public class LzmaAlone
+{
+	static public class CommandLine
+	{
+		public static final int kEncode = 0;
+		public static final int kDecode = 1;
+		public static final int kBenchmak = 2;
+		
+		public int Command = -1;
+		public int NumBenchmarkPasses = 10;
+		
+		public int DictionarySize = 1 << 23;
+		public boolean DictionarySizeIsDefined = false;
+		
+		public int Lc = 3;
+		public int Lp = 0;
+		public int Pb = 2;
+		
+		public int Fb = 128;
+		public boolean FbIsDefined = false;
+		
+		public boolean Eos = false;
+		
+		public int Algorithm = 2;
+		public int MatchFinder = 1;
+		
+		public String InFile;
+		public String OutFile;
+		
+		boolean ParseSwitch(String s)
+		{
+			if (s.startsWith("d"))
+			{
+				DictionarySize = 1 << Integer.parseInt(s.substring(1));
+				DictionarySizeIsDefined = true;
+			}
+			else if (s.startsWith("fb"))
+			{
+				Fb = Integer.parseInt(s.substring(2));
+				FbIsDefined = true;
+			}
+			else if (s.startsWith("a"))
+				Algorithm = Integer.parseInt(s.substring(1));
+			else if (s.startsWith("lc"))
+				Lc = Integer.parseInt(s.substring(2));
+			else if (s.startsWith("lp"))
+				Lp = Integer.parseInt(s.substring(2));
+			else if (s.startsWith("pb"))
+				Pb = Integer.parseInt(s.substring(2));
+			else if (s.startsWith("eos"))
+				Eos = true;
+			else if (s.startsWith("mf"))
+			{
+				String mfs = s.substring(2);
+				if (mfs.equals("bt2"))
+					MatchFinder = 0;
+				else if (mfs.equals("bt4"))
+					MatchFinder = 1;
+				else if (mfs.equals("bt4b"))
+					MatchFinder = 2;
+				else
+					return false;
+			}
+			else
+				return false;
+			return true;
+		}
+		
+		public boolean Parse(String[] args) throws Exception
+		{
+			int pos = 0;
+			boolean switchMode = true;
+			for (int i = 0; i < args.length; i++)
+			{
+				String s = args[i];
+				if (s.length() == 0)
+					return false;
+				if (switchMode)
+				{
+					if (s.compareTo("--") == 0)
+					{
+						switchMode = false;
+						continue;
+					}
+					if (s.charAt(0) == '-')
+					{
+						String sw = s.substring(1).toLowerCase();
+						if (sw.length() == 0)
+							return false;
+						try
+						{
+							if (!ParseSwitch(sw))
+								return false;
+						}
+						catch (NumberFormatException e)
+						{
+							return false;
+						}
+						continue;
+					}
+				}
+				if (pos == 0)
+				{
+					if (s.equalsIgnoreCase("e"))
+						Command = kEncode;
+					else if (s.equalsIgnoreCase("d"))
+						Command = kDecode;
+					else if (s.equalsIgnoreCase("b"))
+						Command = kBenchmak;
+					else
+						return false;
+				}
+				else if(pos == 1)
+				{
+					if (Command == kBenchmak)
+					{
+						try
+						{
+							NumBenchmarkPasses = Integer.parseInt(s);
+							if (NumBenchmarkPasses < 1)
+								return false;
+						}
+						catch (NumberFormatException e)
+						{
+							return false;
+						}
+					}
+					else
+						InFile = s;
+				}
+				else if(pos == 2)
+					OutFile = s;
+				else
+					return false;
+				pos++;
+				continue;
+			}
+			return true;
+		}
+	}
+	
+	
+	static void PrintHelp()
+	{
+		System.out.println(
+				"\nUsage:  LZMA <e|d> [<switches>...] inputFile outputFile\n" +
+				"  e: encode file\n" +
+				"  d: decode file\n" +
+				"  b: Benchmark\n" +
+				"<Switches>\n" +
+				// "  -a{N}:  set compression mode - [0, 1], default: 1 (max)\n" +
+				"  -d{N}:  set dictionary - [0,28], default: 23 (8MB)\n" +
+				"  -fb{N}: set number of fast bytes - [5, 273], default: 128\n" +
+				"  -lc{N}: set number of literal context bits - [0, 8], default: 3\n" +
+				"  -lp{N}: set number of literal pos bits - [0, 4], default: 0\n" +
+				"  -pb{N}: set number of pos bits - [0, 4], default: 2\n" +
+				"  -mf{MF_ID}: set Match Finder: [bt2, bt4], default: bt4\n" +
+				"  -eos:   write End Of Stream marker\n"
+				);
+	}
+
+	public static void main2(String[] args) throws Exception	{
+		main( args );
+	}
+	
+	public static void main(String[] args) throws Exception
+	{
+		System.out.println("\nLZMA (Java) 4.42 Copyright (c) 1999-2006 Igor Pavlov  2006-05-15\n");
+		
+		if (args.length < 1)
+		{
+			PrintHelp();
+			return;
+		}
+		
+		CommandLine params = new CommandLine();
+		if (!params.Parse(args))
+		{
+			System.out.println("\nIncorrect command");
+			return;
+		}
+		
+		if (params.Command == CommandLine.kBenchmak)
+		{
+			int dictionary = (1 << 21);
+			if (params.DictionarySizeIsDefined)
+				dictionary = params.DictionarySize;
+			if (params.MatchFinder > 1)
+				throw new Exception("Unsupported match finder");
+			SevenZip.LzmaBench.LzmaBenchmark(params.NumBenchmarkPasses, dictionary);
+		}
+		else if (params.Command == CommandLine.kEncode || params.Command == CommandLine.kDecode)
+		{
+			java.io.File inFile = new java.io.File(params.InFile);
+			java.io.File outFile = new java.io.File(params.OutFile);
+			
+			java.io.BufferedInputStream inStream  = new java.io.BufferedInputStream(new java.io.FileInputStream(inFile));
+			java.io.BufferedOutputStream outStream = new java.io.BufferedOutputStream(new java.io.FileOutputStream(outFile));
+			
+			boolean eos = false;
+			if (params.Eos)
+				eos = true;
+			if (params.Command == CommandLine.kEncode)
+			{
+				SevenZip.Compression.LZMA.Encoder encoder = new SevenZip.Compression.LZMA.Encoder();
+				if (!encoder.SetAlgorithm(params.Algorithm))
+					throw new Exception("Incorrect compression mode");
+				if (!encoder.SetDictionarySize(params.DictionarySize))
+					throw new Exception("Incorrect dictionary size");
+				if (!encoder.SeNumFastBytes(params.Fb))
+					throw new Exception("Incorrect -fb value");
+				if (!encoder.SetMatchFinder(params.MatchFinder))
+					throw new Exception("Incorrect -mf value");
+				if (!encoder.SetLcLpPb(params.Lc, params.Lp, params.Pb))
+					throw new Exception("Incorrect -lc or -lp or -pb value");
+				encoder.SetEndMarkerMode(eos);
+				encoder.WriteCoderProperties(outStream);
+				long fileSize;
+				if (eos)
+					fileSize = -1;
+				else
+					fileSize = inFile.length();
+				for (int i = 0; i < 8; i++)
+					outStream.write((int)(fileSize >>> (8 * i)) & 0xFF);
+				encoder.Code(inStream, outStream, -1, -1, null);
+			}
+			else
+			{
+				int propertiesSize = 5;
+				byte[] properties = new byte[propertiesSize];
+				if (inStream.read(properties, 0, propertiesSize) != propertiesSize)
+					throw new Exception("input .lzma file is too short");
+				SevenZip.Compression.LZMA.Decoder decoder = new SevenZip.Compression.LZMA.Decoder();
+				if (!decoder.SetDecoderProperties(properties))
+					throw new Exception("Incorrect stream properties");
+				long outSize = 0;
+				for (int i = 0; i < 8; i++)
+				{
+					int v = inStream.read();
+					if (v < 0)
+						throw new Exception("Can't read stream size");
+					outSize |= ((long)v) << (8 * i);
+				}
+				if (!decoder.Code(inStream, outStream, outSize))
+					throw new Exception("Error in data stream");
+			}
+			outStream.flush();
+			outStream.close();
+			inStream.close();
+		}
+		else
+			throw new Exception("Incorrect command");
+		return;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/LzmaBench.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/LzmaBench.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/SevenZip/LzmaBench.java	(revision 21851)
@@ -0,0 +1,392 @@
+package SevenZip;
+
+import java.io.ByteArrayOutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+
+public class LzmaBench
+{
+	static final int kAdditionalSize = (1 << 21);
+	static final int kCompressedAdditionalSize = (1 << 10);
+	
+	static class CRandomGenerator
+	{
+		int A1;
+		int A2;
+		public CRandomGenerator() { Init(); }
+		public void Init() { A1 = 362436069; A2 = 521288629; }
+		public int GetRnd()
+		{
+			return
+				((A1 = 36969 * (A1 & 0xffff) + (A1 >>> 16)) << 16) ^
+				((A2 = 18000 * (A2 & 0xffff) + (A2 >>> 16)));
+		}
+	};
+	
+	static class CBitRandomGenerator
+	{
+		CRandomGenerator RG = new CRandomGenerator();
+		int Value;
+		int NumBits;
+		public void Init()
+		{
+			Value = 0;
+			NumBits = 0;
+		}
+		public int GetRnd(int numBits)
+		{
+			int result;
+			if (NumBits > numBits)
+			{
+				result = Value & ((1 << numBits) - 1);
+				Value >>>= numBits;
+				NumBits -= numBits;
+				return result;
+			}
+			numBits -= NumBits;
+			result = (Value << numBits);
+			Value = RG.GetRnd();
+			result |= Value & (((int)1 << numBits) - 1);
+			Value >>>= numBits;
+			NumBits = 32 - numBits;
+			return result;
+		}
+	};
+	
+	static class CBenchRandomGenerator
+	{
+		CBitRandomGenerator RG = new CBitRandomGenerator();
+		int Pos;
+		int Rep0;
+
+		public int BufferSize;
+		public byte[] Buffer = null;
+
+		public CBenchRandomGenerator() { }
+		public void Set(int bufferSize)
+		{
+			Buffer = new byte[bufferSize];
+			Pos = 0;
+			BufferSize = bufferSize;
+		}
+		int GetRndBit() { return RG.GetRnd(1); }
+		int GetLogRandBits(int numBits)
+		{
+			int len = RG.GetRnd(numBits);
+			return RG.GetRnd((int)len);
+		}
+		int GetOffset()
+		{
+			if (GetRndBit() == 0)
+				return GetLogRandBits(4);
+			return (GetLogRandBits(4) << 10) | RG.GetRnd(10);
+		}
+		int GetLen1() { return RG.GetRnd(1 + (int)RG.GetRnd(2)); }
+		int GetLen2() { return RG.GetRnd(2 + (int)RG.GetRnd(2)); }
+		public void Generate()
+		{
+			RG.Init();
+			Rep0 = 1;
+			while (Pos < BufferSize)
+			{
+				if (GetRndBit() == 0 || Pos < 1)
+					Buffer[Pos++] = (byte)(RG.GetRnd(8));
+				else
+				{
+					int len;
+					if (RG.GetRnd(3) == 0)
+						len = 1 + GetLen1();
+					else
+					{
+						do
+							Rep0 = GetOffset();
+						while (Rep0 >= Pos);
+						Rep0++;
+						len = 2 + GetLen2();
+					}
+					for (int i = 0; i < len && Pos < BufferSize; i++, Pos++)
+						Buffer[Pos] = Buffer[Pos - Rep0];
+				}
+			}
+		}
+	};
+	
+	static class CrcOutStream extends java.io.OutputStream
+	{
+		public CRC CRC = new CRC();
+		
+		public void Init()
+		{ 
+			CRC.Init(); 
+		}
+		public int GetDigest()
+		{ 
+			return CRC.GetDigest(); 
+		}
+		public void write(byte[] b)
+		{
+			CRC.Update(b);
+		}
+		public void write(byte[] b, int off, int len)
+		{
+			CRC.Update(b, off, len);
+		}
+		public void write(int b)
+		{
+			CRC.UpdateByte(b);
+		}
+	};
+
+	static class MyOutputStream extends java.io.OutputStream
+	{
+		byte[] _buffer;
+		int _size;
+		int _pos;
+		
+		public MyOutputStream(byte[] buffer)
+		{
+			_buffer = buffer;
+			_size = _buffer.length;
+		}
+		
+		public void reset()
+		{ 
+			_pos = 0; 
+		}
+		
+		public void write(int b) throws IOException
+		{
+			if (_pos >= _size)
+				throw new IOException("Error");
+			_buffer[_pos++] = (byte)b;
+		}
+		
+		public int size()
+		{
+			return _pos;
+		}
+	};
+
+	static class MyInputStream extends java.io.InputStream
+	{
+		byte[] _buffer;
+		int _size;
+		int _pos;
+		
+		public MyInputStream(byte[] buffer, int size)
+		{
+			_buffer = buffer;
+			_size = size;
+		}
+		
+		public void reset()
+		{ 
+			_pos = 0; 
+		}
+		
+		public int read()
+		{
+			if (_pos >= _size)
+				return -1;
+			return _buffer[_pos++] & 0xFF;
+		}
+	};
+	
+	static class CProgressInfo implements ICodeProgress
+	{
+		public long ApprovedStart;
+		public long InSize;
+		public long Time;
+		public void Init()
+		{ InSize = 0; }
+		public void SetProgress(long inSize, long outSize)
+		{
+			if (inSize >= ApprovedStart && InSize == 0)
+			{
+				Time = System.currentTimeMillis();
+				InSize = inSize;
+			}
+		}
+	}
+	static final int kSubBits = 8;
+	
+	static int GetLogSize(int size)
+	{
+		for (int i = kSubBits; i < 32; i++)
+			for (int j = 0; j < (1 << kSubBits); j++)
+				if (size <= ((1) << i) + (j << (i - kSubBits)))
+					return (i << kSubBits) + j;
+		return (32 << kSubBits);
+	}
+	
+	static long MyMultDiv64(long value, long elapsedTime)
+	{
+		long freq = 1000; // ms
+		long elTime = elapsedTime;
+		while (freq > 1000000)
+		{
+			freq >>>= 1;
+			elTime >>>= 1;
+		}
+		if (elTime == 0)
+			elTime = 1;
+		return value * freq / elTime;
+	}
+	
+	static long GetCompressRating(int dictionarySize, long elapsedTime, long size)
+	{
+		long t = GetLogSize(dictionarySize) - (18 << kSubBits);
+		long numCommandsForOne = 1060 + ((t * t * 10) >> (2 * kSubBits));
+		long numCommands = (long)(size) * numCommandsForOne;
+		return MyMultDiv64(numCommands, elapsedTime);
+	}
+	
+	static long GetDecompressRating(long elapsedTime, long outSize, long inSize)
+	{
+		long numCommands = inSize * 220 + outSize * 20;
+		return MyMultDiv64(numCommands, elapsedTime);
+	}
+	
+	static long GetTotalRating(
+			int dictionarySize,
+			long elapsedTimeEn, long sizeEn,
+			long elapsedTimeDe,
+			long inSizeDe, long outSizeDe)
+	{
+		return (GetCompressRating(dictionarySize, elapsedTimeEn, sizeEn) +
+				GetDecompressRating(elapsedTimeDe, inSizeDe, outSizeDe)) / 2;
+	}
+	
+	static void PrintValue(long v)
+	{
+		String s = "";
+		s += v;
+		for (int i = 0; i + s.length() < 6; i++)
+			System.out.print(" ");
+		System.out.print(s);
+	}
+	
+	static void PrintRating(long rating)
+	{
+		PrintValue(rating / 1000000);
+		System.out.print(" MIPS");
+	}
+	
+	static void PrintResults(
+			int dictionarySize,
+			long elapsedTime,
+			long size,
+			boolean decompressMode, long secondSize)
+	{
+		long speed = MyMultDiv64(size, elapsedTime);
+		PrintValue(speed / 1024);
+		System.out.print(" KB/s  ");
+		long rating;
+		if (decompressMode)
+			rating = GetDecompressRating(elapsedTime, size, secondSize);
+		else
+			rating = GetCompressRating(dictionarySize, elapsedTime, size);
+		PrintRating(rating);
+	}
+	
+	static public int LzmaBenchmark(int numIterations, int dictionarySize) throws Exception
+	{
+		if (numIterations <= 0)
+			return 0;
+		if (dictionarySize < (1 << 18))
+		{
+			System.out.println("\nError: dictionary size for benchmark must be >= 18 (256 KB)");
+			return 1;
+		}
+		System.out.print("\n       Compressing                Decompressing\n\n");
+		
+		SevenZip.Compression.LZMA.Encoder encoder = new SevenZip.Compression.LZMA.Encoder();
+		SevenZip.Compression.LZMA.Decoder decoder = new SevenZip.Compression.LZMA.Decoder();
+		
+		if (!encoder.SetDictionarySize(dictionarySize))
+			throw new Exception("Incorrect dictionary size");
+		
+		int kBufferSize = dictionarySize + kAdditionalSize;
+		int kCompressedBufferSize = (kBufferSize / 2) + kCompressedAdditionalSize;
+		
+		ByteArrayOutputStream propStream = new ByteArrayOutputStream();
+		encoder.WriteCoderProperties(propStream);
+		byte[] propArray = propStream.toByteArray();
+		decoder.SetDecoderProperties(propArray);
+		
+		CBenchRandomGenerator rg = new CBenchRandomGenerator();
+
+		rg.Set(kBufferSize);
+		rg.Generate();
+		CRC crc = new CRC();
+		crc.Init();
+		crc.Update(rg.Buffer, 0, rg.BufferSize);
+		
+		CProgressInfo progressInfo = new CProgressInfo();
+		progressInfo.ApprovedStart = dictionarySize;
+		
+		long totalBenchSize = 0;
+		long totalEncodeTime = 0;
+		long totalDecodeTime = 0;
+		long totalCompressedSize = 0;
+		
+		MyInputStream inStream = new MyInputStream(rg.Buffer, rg.BufferSize);
+
+		byte[] compressedBuffer = new byte[kCompressedBufferSize];
+		MyOutputStream compressedStream = new MyOutputStream(compressedBuffer);
+		CrcOutStream crcOutStream = new CrcOutStream();
+		MyInputStream inputCompressedStream = null;
+		int compressedSize = 0;
+		for (int i = 0; i < numIterations; i++)
+		{
+			progressInfo.Init();
+			inStream.reset();
+			compressedStream.reset();
+			encoder.Code(inStream, compressedStream, -1, -1, progressInfo);
+			long encodeTime = System.currentTimeMillis() - progressInfo.Time;
+			
+			if (i == 0)
+			{
+				compressedSize = compressedStream.size();
+				inputCompressedStream = new MyInputStream(compressedBuffer, compressedSize);
+			}
+			else if (compressedSize != compressedStream.size())
+				throw (new Exception("Encoding error"));
+				
+			if (progressInfo.InSize == 0)
+				throw (new Exception("Internal ERROR 1282"));
+
+			long decodeTime = 0;
+			for (int j = 0; j < 2; j++)
+			{
+				inputCompressedStream.reset();
+				crcOutStream.Init();
+				
+				long outSize = kBufferSize;
+				long startTime = System.currentTimeMillis();
+				if (!decoder.Code(inputCompressedStream, crcOutStream, outSize))
+					throw (new Exception("Decoding Error"));;
+				decodeTime = System.currentTimeMillis() - startTime;
+				if (crcOutStream.GetDigest() != crc.GetDigest())
+					throw (new Exception("CRC Error"));
+			}
+			long benchSize = kBufferSize - (long)progressInfo.InSize;
+			PrintResults(dictionarySize, encodeTime, benchSize, false, 0);
+			System.out.print("     ");
+			PrintResults(dictionarySize, decodeTime, kBufferSize, true, compressedSize);
+			System.out.println();
+			
+			totalBenchSize += benchSize;
+			totalEncodeTime += encodeTime;
+			totalDecodeTime += decodeTime;
+			totalCompressedSize += compressedSize;
+		}
+		System.out.println("---------------------------------------------------");
+		PrintResults(dictionarySize, totalEncodeTime, totalBenchSize, false, 0);
+		System.out.print("     ");
+		PrintResults(dictionarySize, totalDecodeTime,
+				kBufferSize * (long)numIterations, true, totalCompressedSize);
+		System.out.println("    Average");
+		return 0;
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/UnLzma.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/UnLzma.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/UnLzma.java	(revision 21851)
@@ -0,0 +1,67 @@
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+import LZMA.LzmaInputStream;
+
+
+
+public class UnLzma {
+
+	static int main2(String args[]) {
+		System.out.println("\nLZMA Decoder 4.02 Copyright (c) 1999-2004 Igor Pavlov  2004-06-10");
+		System.out.println("JAVA LZMA Decoder 0.90  myspace\n");
+
+		if (args.length < 1 || args.length > 2) {
+			System.out.println("\nUsage:  UnLzma file.lzma [outFile]\n");
+			return 1;
+		}
+		try {
+			File fileInput = new File(args[0]);
+			FileInputStream fileInputHandle = new FileInputStream(fileInput);
+			LzmaInputStream inputHandle = new LzmaInputStream(fileInputHandle);
+
+			OutputStream outputHandle;
+			if (args.length > 1) {
+				outputHandle = new FileOutputStream(new File(args[1]));
+			} else {
+				outputHandle = new ByteArrayOutputStream();
+			}
+
+			byte [] buffer = new byte [1<<14];
+
+			int ret = inputHandle.read(buffer);
+			while (ret >= 1) {
+				outputHandle.write(buffer,0,ret);
+				ret = inputHandle.read(buffer);
+			}
+
+			inputHandle.close();
+			outputHandle.close();
+
+			outputHandle = null;
+			inputHandle = null;
+			return 0;
+		} catch (FileNotFoundException e) {
+			System.out.println(e.getMessage());
+			return 1;
+		} catch (IOException e) {
+			System.out.println(e.getMessage());
+			return 1;
+		}
+	}
+
+	public static void main(String[] args) {
+		long temps = System.currentTimeMillis();
+		int code = main2(args);
+		temps = System.currentTimeMillis() - temps;
+		System.out.println("time : " + temps + " ms");
+		System.exit(code);
+	}
+}
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/org/apache/tools/ant/SevenZip.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/org/apache/tools/ant/SevenZip.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/7z-ant/src/org/apache/tools/ant/SevenZip.java	(revision 21851)
@@ -0,0 +1,143 @@
+package org.apache.tools.ant;
+
+import java.io.File;
+import java.util.Vector;
+
+import SevenZip.LzmaAlone;
+
+/**
+ * @author Jean Lycoops
+ * Bansions 33
+ * B-4845 Sart-lez-Spa
+ * Belgium
+ * 7z-apache-ant@pharmasoft.be
+ */
+public class SevenZip extends Task {
+	private String input;
+	private String output;
+	private static final int ENCODE = 0;
+	private static final int DECODE = 1;
+	private static final int BENCHMARK = 2;
+	private static final int NONE = -1;
+	private String a;
+	private String d;
+	private String fb;
+	private String lc;
+	private String lp;
+	private String pb;
+	private String mf;
+	private String eos;
+	private static final String[] TASKS = { "encode", "decode", "benchmark" };
+	private static final String[] MATCH_FINDERS = { "bt2", "bt4", "bt4b" };
+	private int task;
+	public SevenZip() {
+		super();
+		this.input = null;
+		this.output = null;
+		this.task = NONE;
+		this.a = null;
+		this.d = null;
+		this.fb = null;
+		this.lc = null;
+		this.lp = null;
+		this.pb = null;
+		this.mf = null;
+		this.eos = null;
+	}
+	private void parseInt(String value, String tag, String switch_, int min, int max, Vector args) throws BuildException {
+		if (value == null) return;
+		try {
+			Integer parsed = new Integer(value);
+			if ((parsed.intValue() < min) || (parsed.intValue() > max))
+				throw new BuildException(tag + " out if range [" + min + "-" + max + "]");
+			args.addElement(switch_ + value);
+		} catch (NumberFormatException numberFormatException) {
+			new BuildException(tag + " is'nt a numeric");
+		}
+	}
+	private void parseMatchfinder(String value, Vector args) throws BuildException {
+		if (value == null) return;
+		for (int i=0; i<MATCH_FINDERS.length; i++) {
+			if (MATCH_FINDERS[i].equalsIgnoreCase(value)) {
+				args.addElement("-mf" + value);
+				return;
+			}
+		} 
+		throw new BuildException("unvalid match finder : " + value);
+	}
+    public void execute() {
+    	this.log("LZMA# 4.12 beta Copyright (c) 1999-2004 Igor Pavlov  2004-12-10");
+    	this.log("JAVA LZMA Encoder 4.12  myspace");
+    	long timestamp = System.currentTimeMillis();
+		Vector vargs = new Vector();
+        if (this.task == NONE) throw new BuildException("work requested.");
+        vargs.addElement(TASKS[this.task].substring(0, 1));
+        if (this.input == null) throw new BuildException("input requested.");
+        if (this.output == null) throw new BuildException("output requested.");
+        if (!new File(this.input).exists()) throw new BuildException("input does'nt exists.");
+       	this.parseInt(this.a, "mode", "-a", 0, 2, vargs);
+       	this.parseInt(this.d, "dictionnary", "-d", 0, 28, vargs);
+       	this.parseInt(this.fb, "fastbytes", "-fb", 5, 255, vargs);
+       	this.parseInt(this.lc, "litteralcontextbits", "-lc", 0, 8, vargs);
+       	this.parseInt(this.lp, "litteralposbits", "-lp", 0, 4, vargs);
+       	this.parseInt(this.pb, "posbits", "-pb", 0, 4, vargs);
+       	this.parseMatchfinder(this.mf, vargs);
+       	if (this.eos != null) vargs.addElement("-eos");
+        vargs.addElement(this.input);
+        vargs.addElement(this.output);
+        String[] args = new String[vargs.size()];
+		//String[] args = new String[vargs.size()+1];
+        for (int arg=0; arg<vargs.size(); arg++) {
+        	args[arg] = (String)vargs.elementAt(arg);
+        }
+		//args[vargs.size()] = "-mx=9";
+        try {
+        	this.log(vargs.toString());
+        	LzmaAlone.main2(args);
+        	long duration = System.currentTimeMillis() - timestamp;
+        	if (duration > 9999) {
+        		this.log("time : " + (duration / 1000) + " s");        	
+        	} else {
+        		this.log("time : " + duration + " ms");        	
+        	}
+
+        } catch (Exception exception) {
+        	throw new BuildException(exception);
+        }
+    }
+	public void setTask(String task) {
+		for (int i=0; i<TASKS.length; i++) {
+			if (task.trim().equalsIgnoreCase(TASKS[i])) this.task = i;
+		}
+	}
+	public void setOutput(String output) {
+		this.output = output.trim();
+	}
+	public void setInput(String input) {
+		this.input = input.trim();
+	}
+	public void setMode(String mode) {
+		this.a = mode.trim();
+	}
+	public void setDictionnary(String dictionnary) {
+		this.d = dictionnary.trim();
+	}
+	public void setFastbytes(String fastbytes) {
+		this.fb = fastbytes.trim();
+	}
+	public void setLiteralcontextbits(String literalcontextbits) {
+		this.lc = literalcontextbits;
+	}
+	public void setLiteralposbits(String literalposbits) {
+		this.lp = literalposbits.trim();
+	}
+	public void setPosbits(String posbits) {
+		this.pb = posbits.trim();
+	}
+	public void setMatchfinder(String matchfinder) {
+		this.mf = matchfinder.trim();
+	}
+	public void setEndofstreammarker(String endofstreammarker) {
+		this.eos = "true";
+	}
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/antelope/ChangeLog.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/antelope/ChangeLog.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/antelope/ChangeLog.txt	(revision 21851)
@@ -0,0 +1,348 @@
+Antelope Change Log
+Version: @buildnum@
+
+3.4.0:
+o updated for Ant 1.7.
+o finally, <import> is fully supported
+o targets are now sorted in edit mode.
+
+3.2.10:
+o fixed Trace so it works more or less correctly.
+o removed use of the Constant Interface Anti-pattern.
+o rearranged packaging of tasks to better organize typdefs.
+
+3.2.9:
+Oct 2005
+o added Hostname, Split, Repeat, FileUtil, and StringUtil tasks.
+o some general cleanup.
+
+3.2.6:
+11 Jun 2005
+o added Grep, Suite, and TestCase Ant tasks.
+o updated antlib.xml and antelope.taskdefs with missing typedefs
+
+3.2.2:
+10 Apr 2005
+o various minor updates.
+o fixed build files, in particular the build-src.xml file so that all the source, images, docs, etc, is actually included.
+
+3.2.0:
+Looks like I missed a few updates to this file...
+23 Dec 2004
+o added ability to call the "implicit" target explicitly.  The implicit target is the anonymous target that Ant uses to hold top-level tasks like <property> and <import>. Previously, the only way to run the implicit target was to run an explicit target, so Antelope was unable to rerun the implicit target for build files that did not have an explicit target. The button labeled "_implicit_" will run the implicit target.  Note that in multi-target mode, the "_implicit_" button does not show, the implicit target will (as usual) be ran before other targets are executed.
+o Updated the launcher so the run.xml file to start Antelope is no longer required. Just "java -jar Antelope.jar" will start Antelope.
+o Fixed several other minor bugs, but exactly what they were escapes me at the moment.
+
+3.1.10:
+29 Aug 2004
+o Fixed error in StopWatchTask that incorrectly showed total time for
+elapsed time. (Thanks to Wolf Schlegel for pointing this out.)
+o I've used 'enum' as a variable name for an Enumeration for years, but now
+Sun has decided that is a key word, so I've replaced all 'enum' with 'en'.
+(Thanks to Dennis Hofs for pointing this out.)
+o Fixed issue #21, silently ignore property files not found when the build
+file is loaded.
+o Fixed issue #22, caret position is restored properly when build file is
+saved.
+o Fixed issue #24, clicking on "Trace" button automatically selects the
+"Output" tab.
+
+
+3.1.9:
+29 July 2004
+o fix for issue #20, imported targets now have buttons.
+
+3.1.8:
+23 May 2004
+o Completed issue #12, added 'tail' to output window in app.
+o Completed issue #9, fixed NPE on trace target with non-existant target in antcall.
+
+3.1.7:
+19 May 2004
+o Completed issue #13, added line number display to app.
+o Completed issue #14, added option to not sort the target buttons alphabetically.
+o Completed issue #15, added support for native look and feel to app.
+o Completed issue #16, added support for wheel mouse in edit window.
+o Completed issue #9, backward compatibility with Ant 1.5.x.
+
+3.1.6:
+5 May 2004
+o Fixed a bug in the run.xml file, it was looking for a non-existant 'lib' directory in the classpath.
+o Fixed a bug that caused the Antelope plugin to delete Ant when the plugin was deleted from jEdit.
+
+
+3.1.5:
+o Fixed a number of bugs that broke backwards compatibility with Ant 1.5.x. Antelope should now work well with Ant 1.5.0 and later. Note that Ant 1.4.x and earlier are no longer supported.
+
+3.1.4:
+o Added ability to assign a jEdit shortcut to rerun the last ran target.
+o Fixed bug in auto-refresh in multiple target mode.
+
+3.1.3:
+12 Apr 2004
+o Fixed the threading for running the default target from a jEdit shortcut.
+
+3.1.2:
+9 Apr 2004
+o Fixed a bug introduced in 3.1.0 that caused a NPE on an fresh install of Antelope as a jEdit plugin. I had added some icons to the button panel, but forgot that the default settings wouldn't be read unless there was a previously opened build file, which isn't the case on a new install.
+o The default target is now shown with a green color text.
+o Running the default target can be added as a short cut in jEdit. There's something a bit weird about how this works, no output is displayed until the target is complete, so it looks like nothing is happening, then all of a sudden the entire output is shown. Coincidentally, this specific feature was requested in e-mail yesterday.
+o Added some new icons to the Edit tree. Private targets have gray target icons, the default target is green, public targets are black target icons. Imported (via the <import> task) are the same colors, except bulls eye on the targets is red.
+
+3.1.0:
+30 Mar 2004
+o added reload button to control panel.
+o added "About" tab to propery dialog.
+o changed text to icons on all buttons in conrol panel.
+o updated build file to make building the docs while disconnected easier.
+
+3.0.7:
+o Changed the preferences again. The custom preferences are now used on all platforms and all jvm versions, but the custom preferences no longer are the system default preferences. This means if you ran version 3.0.6 (and 3.0.6 only), you will loose any stored settings, but all settings from any previous version of Antelope are available and will be use. I never felt comfortable about doing that anyway. The point of implementing the custom preferences was to get around an annoying bug in the Unix/Linux implementation of java.util.prefs. If you are still running with a jvm that has that bug (see bugs 4868444 and 4751177 at java.sun.com) and want to get rid of all the annoying messages, add this to your command line when starting Antelope:
+
+-Djava.util.prefs.PreferencesFactory=ise.library.UserPreferences
+
+This will install Antelope's custom preferences handler as the default system preferences handler.
+
+o Added popup in "Edit" mode to property and loadproperties tasks to allow opening of a file designated by the "file" or "srcfile" attributes, respectively, in the editor.
+
+o Added auto-reload if property files changed. Property files are those files loaded either by the <property> task with a "file" attribute or by the <loadproperties> task. If the property files have changed since the build file was loaded, the build file will be reloaded, which in turn causes the property files to be reloaded. Note that this reload does not depend on the auto-reload option being checked, it happens regardless.
+
+3.0.6:
+24 Mar 2004:
+o More updates to the dependency tree code and the entity includes.
+o Changed the preferences handling (see the entry dated 22 Jan 2004 below) so that the custom preferences factory is only activated on non-Windows platforms with jvm's earlier than version 1.5. This means that your settings may disappear -- they are not gone, just not readable. If you need to continue to use the custom preferences, start Antelope with this setting on the command line:
+-Djava.util.prefs.PreferencesFactory=ise.library.UserPreferencesFactory
+Hopefully this won't change again.
+
+3.0.5:
+22 Mar 2004:
+o Updates to the dependency tree code.
+o Fixed a bug with included xml (using xml entity includes). The targets of included xml would show up as buttons in "Run" mode, but not in the tree in "Edit" mode. The targets are now in the Edit tree, and the dependency tree works with these targets also.
+o Added some nice icons to the edit tree to make it easier to pick out imported targets and projects.
+
+3.0.4:
+21 Mar 2004:
+o Fixed a bunch of compiler warnings about deprecated methods. Several deprecated methods were not fixed as they would break Ant 1.5 compatibility.
+o Adjusted the "Please wait loading Ant" code as it would occasionally hang in jEdit. It still hangs occassionally, it appears to be due to a classloader issue with other plugins loading an xml parser ahead of Ant's parser. Jane might be the culprit.
+o Right click on a target in "Edit" mode will show a popup of the dependency tree for that target. Clicking a target in the dependency tree moves the cursor to that target.
+
+3.0.3:
+15 Mar 2004:
+o showing 'private' targets in italics in all modes modes. Targets are considered 'private' if:
+   1. the target name starts with -
+   2. the target does not have a description
+   3. there is a . anywhere in the target name
+
+3.0.2:
+23 Feb 2004
+o changed default for showing targets to "Show all targets".
+o fixed bug in setting for auto-reload of build file. Now auto-reload is the default, which it should have been all along but wasn't.
+
+21 Feb 2004
+o added popup to properties dialog so that right clicking (option clicking) on any of the tables shows the cell value in a scrollable text area. This makes it easier to read and copy long values.
+
+
+3.0.1:
+15 Feb 2004
+o Inadvertently dropped the Main-Class attribute from the manifest, so the -jar option didn't work.
+
+
+26 Jan 2004:
+o Put Antelope back on jEdit's "Plugins" menu. It had inadvertently been removed in the last release.
+
+o Now it is much easier to set up Ant with Antelope and jEdit. This isn't an issue with Antelope as an application as Ant is used to start the application. As a plugin, Antelope looks for Ant like this:
+1. check if jEdit loaded ant.jar. This would happen if ant.jar is in the $user.home/.jedit/jars directory.
+2. look for ant.jar in the classpath. If found, assume any other jars needed for Ant are already in the classpath.
+3. check Antelope's preferences for ANT_HOME
+4. check for a System property named ANT_HOME
+5. check for an environment variable named ANT_HOME
+6. ask the user, then store their choice in Antelope's preferences
+The preferred method is to set an environment variable for ANT_HOME, this is also recommended by the Ant manual when installing Ant.
+
+22 Jan 2004:
+o Replaced the default Java Preferences with a custom preferences eliminates the annoying error messages produced on several versions of Linux due to several bugs ( at least bugs 4868444 and 4751177, there may be others) in Sun's implementation of preferences on that platform. You might want to take notice of a couptle of things: First, the new custom preferences are used on all platforms, not just Linux. Second, previously stored preferences are not converted to the new system. If you absolutely must use the old preferences, start Antelope with this setting on the command line:
+
+-Djava.util.prefs.PreferencesFactory=java.util.prefs.FileSystemPreferences
+
+o Set default for auto reload of build file to 'on', that is, do automatically reload the build file. Of course, this is a saved setting, so you can set Antelope to not load your build file. Note that for the new Ant 1.6 <import> task, this setting applies to all imported build files as well.
+
+o Fixed several thread issues with the auto reload with regards to how it interacts with the performance listener and the button panel.
+
+o Adjusted the performance listener to work correctly when running in multiple target mode. Previously, only statistics for the last target were displayed, now it accumulates statistics for all targets.
+
+o Added Antelope version number to the Properties/Description tab. This will make it easier for users of the jEdit plugin to verify which version of Antelope they are using.
+
+o Updates for Ant 1.6. Antelope now works well with all Ant versions 1.5 and later. No regression testing has been done with Ant versions older than 1.5. For Ant 1.6, the new <include> task is support as are top level tasks (that is, tasks that are not in a target).
+
+o Fixed the progress bar, bug 877996. This was broke in version 2.75, which was the first release to support Ant 1.6. Changes in the Ant API made the progress not work quite right. Now it works correctly with Ant 1.5.x and Ant 1.6. Also, the progress bar now shows the name of the targe that is running instead of the percentage. This seems more useful, especially as the progress bar itself gives a good visual indication of the progress.
+
+o Made a number of small fixes and code refactorings that result in cleaner code and somewhat faster execution. (Note: the sometimes slow start up of Antelope is actually due to Ant, initially loading a project can take as long as 10 seconds on an older machine.)
+
+23 Oct 2003:
+o Fixed all open bugs:
+740496	correct taskdef
+786439	Trouble with the xml logger of Ant and the break task
+818781	dtd relative folder
+820814	antelope shows tasks with empty descriptions.
+827162	NullPointer Exception
+827914	ant.version property not set on Windows
+o Added option to automatically reload build file prior to running a target.
+
+27 Sep 2003:
+o Updated tasks to work with Ant 1.6.
+o Update plugin code to work with jEdit 4.2.
+o Removed dependency on CommonControls.jar for plugin.
+o Refactored build files.
+
+15 May 2003:
+o Added run.bat and run.sh scripts to make starting stand-alone app easier.
+o Fixed bug #734867, "Limit Ant Task doesn't fail correctly".
+o Added <bool> support to Assert task.
+o Added code to Stopwatch task so that the elapsed or total time is stored in a property of the same name as the stopwatch.
+o Added IsGreaterThan and IsLessThan conditions to If task. Assert task now can use these same conditions. See testcases/limittest.xml for an example.
+o Went to the new Matrix movie!
+o Antelope can now parse files that use external entities. Nice!
+
+12 Mar 2003, release version 2.42:
+o Added ability to run multiple targets. This is so handy, I don't know why I didn't implement it sooner.
+o Updated build.xml, installPlugin.xml, and run.xml to work much better. Now all distribution files will "run right out of the box", and use the Antelope tasks, too!
+
+10 Mar 2003
+o Added find and replace to stand-alone.
+o Modified Try task to be able to store exception message and/or stack trace in a property.
+
+9 Mar 2003
+o A few files were inadvertently left out of the 2.38 build and the start up run.xml file has been cleaned up a bit. The main build file has also been cleaned up, so external dependencies are not required to do a basic build.
+o Removed the "right click for options" tooltip as right clicking does nothing.
+
+6 Mar 2003, released version 2.38:
+I'm behind on this, so the details aren't as good as they should be.
+o Fixed a bug in the editor where switching between build files would cause the old build file to be appended to the new one.
+o Fixed warning messages about invalid build/xml files.
+o You can now browse any xml file (well, many xml files) via the "Edit" tree. There is no support for xml files with dtds, which typically build files do not have.
+o updated "Edit" mode to show a tree of the build file so navigating the file is easier.
+o added "back" and "next" buttons in "Edit" mode. These work like the back and next buttons in a web browser.
+o Added some new tasks. The "call" task is particularly useful.
+o Source distribution now includes the unit tests for the extra Ant tasks.
+o Updated run.xml so that tools.jar is automatically included in the claspath if it can be found.
+o Added some public API for running as a jEdit plugin so that other plugins can easily interact with Antelope for running targets.
+
+21 Dec 2002
+o the editor is really nice now. The syntax highlighting is configurable, as is the font and many editor options. Documentation is lagging a bit on this, but hopefully the configuration is obvious enough.
+o added undo, redo, cut, copy, and paste to the editor.
+o updated the Math task to use any of the methods in java.lang.Math.
+o removed the ssh and scp tasks to their own distribution package.
+o changed the 'Options' popup to be a regular dialog with an 'Apply' button.
+o refactored the property and settings persistence, this works much better now with all properties being saved and restored correctly.
+o added a StopWatch task for timing of build events.
+o added "startswith" and "endswith" boolean conditions to the "If" task.
+
+6 Dec 2002
+o replaced Antelope editor with an older, MIT licensed version of the jEdit text editor. This makes syntax highlighting configurable and fast.
+o replaced "Format" menu with "Options" menu to support configuration of syntax highlighting and editor options.
+
+24 Nov 2002
+o This is the last 1.xx version. There are a few known bugs that are being pushed to version 2.x for resolution. Version 2 will provide a better editor, a GUI to create build files, and other items related to creating and editing build files.
+o Added input handler so the Ant 'input' task can be used from within Antelope.
+o Added progress bar to show percent complete for running target. This is useful for long running targets. The percent is calculated from the total number of tasks that a target will run and makes no assumptions about how long a particular task will take. It could be that there are only two tasks, but the first one takes 2 seconds and the second takes 10 minutes, the progress will show at 50% until the second one is done.
+o Added ability to gather performance statistics for running target. This should be useful for optimization of build files.
+o Build file syntax highlighting is very slow in app mode, added menu item under Format menu to turn the syntax colorization on or off. Default is off, which makes for much faster performance. Colorization is a bit flaky when changed from on to off or vice versa.
+
+8 Nov 2002
+o Added If, Try, and Variable task.
+o Now works in multiple views in jEdit.
+o rewrote docs in docbook format.
+o improved AntLogger.
+o rearranged packages for tasks to be in a separate package.
+o tasks available in separate jar file
+o added option for display of targets starting with a dash
+
+
+12 Oct 2002
+o Added Assert task.
+o Fixed several bugs in AntLogger.
+o Improved tracing ability.
+o Optimized Antelope editor to make colorizing faster, but this is still really slow on all but the smallest build files.
+o Added Ant coding standards.
+o Updated documentation.
+
+
+23 Sep 2002
+o Adjusted AntProject.java to be able to work correctly when using Antelope as a plugin. The jEdit classloader was preventing certain property files in ant.jar from being accessible to AntProject.java.
+
+o Moved the config and docs directories inside the src directory. The build file copies them to the proper config and docs directories for distribution. This lets the build file adjust the build number automatically within the config and doc files, which keeps everything at the same displayed build number, and keeps all the source files in the src directory.
+
+22 Sep 2002
+o added "User" tab to properties. This tab allows the user to add properties. These properties are treated as if they were passed to Ant on the command line. These properties are persistent for the build file, so each time the build file is opened, the user properties will be restored.
+
+o added "New" menu item to stand-alone app. A very basic build file is created, the user needs to fill in the details.
+
+14 Sep 2002
+o added 'recent files' menus to both stand-alone and plugin. This will track the last 10 opened build files.
+o updated tracing to trace 'ant' tasks.
+o removed references to the classes to link to the ProjectViewer plugin. The
+source for these classes is still included, but they are not compiled by the default 'compile' target in the supplied build file.
+
+8 Sep 2002
+o Fixed the storage of the settings so they actually work correctly. Option settings are stored per build file, plus font settings for the stand-alone and the last build file open are stored and used on application startup.
+o Changed the "Edit" button to be a "mode" like the trace action. Now when the Edit button is clicked, the panel background turns green to indicate 'edit mode', the build file is loaded for editing (either in the "Edit" tab in the stand-alone app or in a jEdit buffer as a plugin), and clicking on a target button will scroll the build file to the target definition.
+o Fixed the Trace button to select the "Output" tab when clicked in stand-alone.
+
+6 Sep 2002
+O Fixed the abstraction mentioned below so that AntelopePanel and AntelopeOptions really don't depend on compiling AntelopePluginPanel.
+
+5 Sep 2002
+o Major rearrangement of package layout.
+o Abstracted the interaction between AntelopePluginPanel and AntelopePanel so that AntelopePanel no longer depends on compiling AntelopePluginPanel (which depends on ProjectViewer), so the stand-alone application can be compiled without any dependency on jEdit or jEdit plugins.
+o Added KappaLayout.jar to the distribution zip. This was supposed to be there all along, but has been missing until now.
+o Adjusted the build file to include a few new targets for compiling the stand-alone, the plugin, and building the distribution zip file.
+
+3 Sep 2002
+o Updated tracing to include the actual values of properties and references.
+o Added font dialog to stand-alone.
+o Made 'Properties' dialog non-modal.
+o Fixed a bug where if the build file contained an error, all the buttons would disappear. Now at least the non-target buttons will stay visible and a dialog with the build file error will explain the problem.
+o Updated the build file to make the zip target better -- the readme, antelope.jar and kappalayout.jar are at the top level, the directory structure for the development files are in directories.
+
+2 Sep 2002
+Made a number of modifications to the stand-alone application:
+o Added ability to save output to a file.
+o Made output area editable.
+o Added ability to edit the build file.
+o Added ability to save modifications to the build file.
+o Added color coding to the build file editor.
+o Added help and about menu items.
+o Added help viewer.
+o Added icons to the menu items.
+
+1 Sep 2002
+o Added 'Trace' button to show exactly what targets and tasks will be executed when a particular target runs. This is useful for tracking down the execution flow in convoluted build files.
+
+29 Aug 2002
+o included a file inadvertently left out of the last distribution. This file lets Antelope run without ProjectViewer when run as a jEdit plugin.
+
+o Did some optimization in AntelopePanel. It can take as long as 8 - 10 seconds to change build files, it turns out this is in Ant's Project class, so there's not much I can do about it (at least, not without joining the Ant project...)
+
+18 Aug 2002
+o Added code to integrate Antelope with ProjectViewer plugin in jEdit. This integration requires the bleeding edge ProjectViewer from CVS. Right click on your build file in ProjectViewer and set it as your build file, and Antelope will be notified and adjust itself accordingly. Antelope will run without ProjectViewer, but won't necessarily compile without it.
+
+17 Aug 2002
+o Fixed a problem with option settings not being restored. They were being saved, but the controls were not being set with the stored values on start up. Settings are stored per build file, so each time a build file is opened, the settings for the particular file are set.
+
+o Major modifications to AntLogger. This is now very useful outside of Antelope and has several settings that can be adjusted either via Ant command line options or build file properties. See the documentation for details.
+
+o Added an "Edit" button when running as a jEdit plugin. This will open the current build file in jEdit for editing.
+
+
+14 Aug 2002
+o Fixed a problem with capturing output from javac when running as a plugin. jEdit diddles with the System print streams, which meant I had to also to be able to catch the output. This caused significant changes to AntLogger, which now only writes to java.util.logging.Logger, there is no more print stream output. Output to a console window is via a java.util.logging.ConsoleHandler.
+
+o Added color coding of output when running as a plugin.
+
+o Fixed a potention null pointer exception when trying to view the properties. (Why does Java hava a null pointer exception, but not pointers?)
+
+o Removed the option panel from jEdit's global plugin properties. There was a problem with trying to maintain two different panels (one on the global menu, one for the options button), so I opted for using the Options button only. This makes the code easier to maintain for stand-alone use.
+
+o Cleaned up some dead methods and old comments.
+
+o Converted all files to contain the same license. Antelope is licensed under an Apache license.
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/antelope/install_tasks.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/antelope/install_tasks.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/antelope/install_tasks.txt	(revision 21851)
@@ -0,0 +1,15 @@
+Antelope Tasks Installation:
+
+Make sure Ant is installed correctly. Locate the directory where Ant is 
+installed. Locate a directory named "lib" in that directory.
+
+Unzip the distribution file. It will create a directory named 
+AntelopeTasks_3.4.2.
+
+Change to the AntelopeTasks_3.4.2 directory. In this directory will be a 
+jar file named AntelopeTasks_3.4.2.jar.
+
+Copy the jar file to Ant's "lib" directory. 
+
+
+
Index: /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/antelope/license.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/antelope/license.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/ant-tasks/antelope/license.txt	(revision 21851)
@@ -0,0 +1,52 @@
+license.txt
+
+This license pertains to all files in the Antelope distribution except the images, 
+which are from Sun's Java Look and Feel Design Guidelines and are licensed according 
+to those guidelines.
+
+
+Based on the Apache Software License, Version 1.1
+
+Copyright (c) 2002 Dale Anson.  All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in
+   the documentation and/or other materials provided with the
+   distribution.
+
+3. The end-user documentation included with the redistribution, if
+   any, must include the following acknowlegement:
+      "This product includes software developed by Dale Anson,
+       danson@users.sourceforge.net."
+   Alternately, this acknowlegement may appear in the software itself,
+   if and wherever such third-party acknowlegements normally appear.
+
+4. The name "Antelope" must not be used to endorse or promote products derived
+   from this software without prior written permission. For written
+   permission, please contact danson@users.sourceforge.net.
+
+5. Products derived from this software may not be called "Antelope"
+   nor may "Antelope" appear in their names without prior written
+   permission of Dale Anson.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED.  IN NO EVENT SHALL DALE ANSON OR ANY PROJECT
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+
Index: /main/branches/stable_gs3/release-kits/shared/core/language-strings/LanguagePack.properties
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/language-strings/LanguagePack.properties	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/language-strings/LanguagePack.properties	(revision 21851)
@@ -0,0 +1,195 @@
+### Language page ###
+page.language-selector.displayText=Language
+language-selector-explanation.displayText=Please choose your preferred language
+# (Note: This installer has not been fully translated into all these languages yet)
+
+
+### Intro Page ###
+page.intro.displayText=Greenstone @version@ installer
+welcome.displayText=Greenstone@version.major@ is software for building and sharing digital libraries.\n\nThis installer includes the Greenstone system, plus tools for hosting digital libraries (Apache2.2 for Linux/MacOS, Greenstone Library Server for Windows), converting images (ImageMagick), and dealing with pdf and postscript documents (GhostScript - Windows and MacOS only).
+welcome-greenstone3.displayText=Greenstone@version.major@ is software for building and sharing digital libraries.
+
+## License page ###
+page.license.displayText=Software License
+
+
+### Destination page ###
+page.destination.displayText=Installation Folder
+installDir.displayText=Select an installation folder
+
+
+### InstallShield install detected page ###
+page.dontBudge.displayText=Previous Install Detected
+is-install-detected.displayText=An installation of Greenstone2 older than version 2.81, or an installation of Greenstone3 older than version 3.04, was detected in the installation folder. Installation cannot proceed using the selected installation folder.\n\nPlease quit this installer, uninstall the existing Greenstone installation, and then re-run this installer (recommended). Alternatively, you may go back to the previous page of this installer and select a different installation folder.
+
+
+### Components Page ###
+# (Note: in the html here, we must use '<br>' for breaklines.
+# '<br/>' and other variations are not recognised.)
+page.selector.displayText=Components
+choose-components.displayText=Please choose the components you wish to install
+
+Looking_For_Previous_Installation.displayText=Search for Previous Installations
+Looking_For_Previous_Installation.explanatoryText=If this is an over-install, load some properties of the existing installation to aid the installation process.
+
+Installing_Core_System.displayText=Core System
+Installing_Core_System.explanatoryText=<html>This is the core Greenstone@version.major@ system. It is a required component.</html>
+
+Installing_Source_Code_Core.displayText=Source Code Core
+Installing_Source_Code_Core.explanatoryText=<html>This is the core Greenstone@version.major@ system for source releases. <br>\nIt includes supporting files to accompany the source code. </html>
+
+Installing_Source_Code.displayText=Source Code
+Installing_Source_Code.explanatoryText=<html>Install the source code if you wish to compile Greenstone@version.major@ <br>\nyourself, make modifications to your copy of Greenstone@version.major@, or if<br>\nyou just want to see how it works.</html>
+
+Installing_ImageMagick.displayText=ImageMagick (@bundled.version.imagemagick@)
+Installing_ImageMagick.explanatoryText=Greenstone uses ImageMagick to process images.\n\nThe bundled version of ImageMagick includes support for the JPEG2000 image\nformat. If you have ImageMagick on your computer already, or if you don't wish\nto include images in Greenstone collections, then you may choose not to \ninstall ImageMagick.
+
+Installing_Ghostscript.displayText=GhostScript (@bundled.version.ghostscript@)
+Installing_Ghostscript.explanatoryText=Greenstone uses GhostScript to process PDF and PostScript files.\n\n If you have Ghostscript on your computer already, or if you don't wish to\ninclude PDF of PostScript files in Greenstone collections, then you may choose\nnot to install Ghostscript.
+
+Installing_Start_Menu_Shortcuts.displayText=Start Menu Shortcuts
+Installing_Start_Menu_Shortcuts.explanatoryText=Create shortcuts to Greenstone@version.major@ on your Start Menu
+
+Installing_Tomcat.displayText=Apache Tomcat (@bundled.version.tomcat@)
+Installing_Tomcat.explanatoryText=<html> Greenstone3 requires the Apache Tomcat web server to serve your digital library over <br> the web. If you have an existing installation of Tomcat, you can use that installation <br> (some configuration is required), so you can safely opt not to install this component. </html>
+
+Installing_Ant.displayText=Apache Ant (@bundled.version.ant@)
+Installing_Ant.explanatoryText=<html> Greenstone3 requires Apache Ant to start and stop the Tomcat web server, to recompile <br> the source code, and to perform some maintainence tasks. If you already have Ant installed, <br> you can safely opt not to install this component. </html>
+
+Installing_Documented_Examples.displayText=Documented Example Collections
+Installing_Documented_Examples.explanatoryText=A set of example collections, whose 'about' pages describe how they were created.\n\nEven if you don't install the Documented Examples now, you can get them from\nhttp://www.greenstone.org/ or from the greenstone CD-ROM.
+
+
+### Admin password page
+
+page.admin-pages.displayText=Administration Pages
+admin-expl.displayText=The administration pages of the Greenstone interface allow you to manage the users database, which required if you wish to set up remote greenstone. They also provide an easy way to view log files and to edit the file 'main.cfg'.
+admin-expl-2.displayText=Do you wish to the enable the administration pages of Greenstone? (You will be asked for a password on the next page.)
+admin-expl-3.displayText=NOTE: If you enable the administration pages, they may be accessible over the internet. Please choose a secure password to protect them.
+enable.admin.pages.displayText=Enable Admin Pages
+
+page.admin-password.displayText=Admin Password
+admin-password-expl.displayText=A user with the username 'admin' will be created for you with the password you provide. Please enter the admin password. The password must be between 3 and 20 characters long.
+admin.password.displayText=Admin Password
+
+
+
+
+### Tomcat config page
+page.tomcat-config.displayText=Apache Tomcat Configuration
+tomcat-config-explanation1.displayText=Greenstone3 uses Apache Tomcat to share your digital libraries.
+tomcat-config-explanation2.displayText=You can either configure Tomcat here, or by editing the build.properties file in the Greenstone3 home folder (${installDir}).
+tomcat.server.displayText=Tomcat Server
+tomcat-server.explanatoryText=Please enter the name of the server machine where the library will be hosted. If you are not sure, accept the default (localhost).
+tomcat.port.explanatoryText=Please select the ports which tomcat should use. It is usually safe to accept the defaults. If you are already running other services on the default ports, please select some free ports.
+tomcat.port.displayText=Tomcat Port
+tomcat.shutdown.port.displayText=Tomcat Shutdown Port
+
+### Progress page
+page.progress.displayText=Installation progress
+
+### Uninstaller Strings
+
+uninstaller.greenstone.uninstaller=Greenstone Uninstaller
+uninstaller.cancel=Cancel
+uninstaller.uninstall=Uninstall
+uninstaller.finish=Finish
+uninstaller.error=Error
+uninstaller.confirmation=Confirmation
+uninstaller.continue=Continue
+uninstaller.complete=Complete
+uninstaller.skip=Skip
+uninstaller.skip.all=Skip All
+uninstaller.retry=Retry
+uninstaller.readonly=Read Only
+
+uninstaller.will.uninstall.from=Uninstall Greenstone from:
+uninstaller.uninstall.options=Uninstall Options:
+uninstaller.keep.collections=Keep Collections
+uninstaller.are.you.sure=Are you sure you wish to Uninstall Greenstone
+uninstaller.are.you.sure.collections=You have chosen to delete your collections.\nPlease backup any collections you wish to keep before continuing
+uninstaller.failed.to.figure.cd=Failed to figure out the current directory
+uninstaller.cancelled=Uninstall Cancelled
+uninstaller.finished=Uninstall Finished
+uninstaller.deleting=Deleting {file} from disk
+
+uninstaller.info.skipping=INFO: Skipping {file}
+uninstaller.info.no.startmenu=INFO: No StartMenu path found. Deleting a StartMenu group will not be part of this uninstall
+uninstaller.warning.readonly=WARNING: {file} appears to be read-only
+uninstaller.warning.couldnt.delete=WARNING: {file} could not be deleted. Skipped.
+uninstaller.warning.nonexistent=WARNING: {file} does not exist
+uninstaller.error.nonexistent=ERROR: {file} does not exist
+uninstaller.error.couldnt.find.install.props=ERROR: Could not find the 'installation.properties' or 'etc/installation.properties' file.\nEither this is not a valid Greenstone installation, or the installation has been corrupted.\nUninstallation cannot proceed
+uninstaller.warning.couldnt.create.flagfile=WARNING: Couldn't create the flag file. You will have to delete the jre and loose uninstaller files manually
+
+
+### Ant-Installer Core strings
+
+dirNotExistCreate=The folder does not exist, create it?
+dirNotExist=The folder does not exist
+fileNotExist=The file does not exist
+dirNotCreated=The folder could not be created
+canNotCreateFile=Can not create file
+appRootInvalid=This folder does not appear to be the root of the application
+selectFile=Select File
+selectFolder=Select Folder
+browseDotDotDot=Browse...
+notValidSelection=Not a valid selection
+showDetails=Show Details
+
+#Default loading
+promptLoadDefaults=Installation configuration found. Load the existing configuration?
+promptMissingDefaultPassword=A password was not found it may have been omitted for security reasons, it will be set to the default.
+
+click=Click
+toContinue=to continue
+failed=Failed
+exit=Exit
+complete=Complete
+finished=Finished
+extracting=Extracting...
+installFinished=Install Finished
+install-cancelled=Install Cancelled
+running=
+
+backButton=Back
+cancelButton=Cancel
+nextButton=Next
+finishButtonText=Install
+
+output=Output
+errors=Errors
+notCorrectFormat=The field is not of the correct format
+notCorrectPasswordFormat=The password is not of the correct format
+passwordsDoNotMatch=The passwords do not match
+installationFailed=Install failed
+propertiesVersionMismatch=Some options are missing from the previous version and must be manually entered, continue?
+
+Finished=Finished
+Failed=Failed, view the error messages
+ant.failure=Ant run failed - examine the error logs for details
+
+license.next.text=Accept
+license.cancel.text=Reject
+
+#text install strings
+_required_=required
+_default_=default
+true=true
+#The value of 'affirmativeChars' comes from the first letters of "True" and "Yes"
+affirmativeChars=T,Y
+#The value of 'negativeChars' comes from the first letters of "False" and "No"
+negativeChars=F,N
+licenseAccept=Do you accept the license? Y or N   [default\:Y]
+clickViewLicense=Press enter to view the license agreement
+clickViewText=Press enter to continue
+enterNumber=Enter a number
+fileDoesNotExist=The File does not exist
+#The value of backChar is the first letter "Back"
+backChar=B
+#The value of nextChar is the first letter "Next"
+nextChar=N
+#In the next two properties, 'N' should be replaced the value of the 'nextChar' property
+license_next=Enter 'N' for the next page, enter anything else to scroll to the the end
+large_select_next=Enter 'N' for the next page, enter anything else to scroll to the the end
+availableOptions=View available options
Index: /main/branches/stable_gs3/release-kits/shared/core/language-strings/LanguagePack_ar.properties
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/language-strings/LanguagePack_ar.properties	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/language-strings/LanguagePack_ar.properties	(revision 21851)
@@ -0,0 +1,403 @@
+### Language page ###
+page.language-selector.displayText=ÙØºØ©   
+language-selector-explanation.displayText=Ù
+Ù ÙØ¶ÙÙ Ø§Ø®ØªØ± Ø§ÙÙØºØ© Ø§ÙÙ
+ÙØ¶ÙØ© ÙØ¯ÙÙ  
+
+
+
+### Intro Page ###
+page.intro.displayText=Ø¬Ø±ÙÙØ³ØªÙÙ @ÙØ³Ø®Ø©@ Ù
+Ø«ØšØª  
+welcome-message.displayText=Greenstone@version.major @ ÙÙ ØšØ±Ù
+Ø¬ÙØ§Øª ÙØšÙØ§Ø¡ ÙØªÙØ§Ø³Ù
+ Ø§ÙÙ
+ÙØªØšØ§Øª Ø±ÙÙ
+ÙØ©. .\n\n ÙÙØµÙ ØšØ¥Ø²Ø§ÙØ© Ø¢Ù ØªØ«ØšÙØª Ø³Ø§ØšÙ ÙÙ  Greenstone@version.major @ ÙØšÙ ØªØŽØºÙÙ ÙØ°Ø§ Ø§ÙÙ
+Ø«ØšØª.  
+
+## License page ###
+page.license.displayText=Ø±Ø®ØµØ© Ø§ÙØšØ±Ù
+Ø¬ÙØ§Øª  
+
+
+### Destination page ###
+page.destination.displayText=Ù
+Ø¬ÙØ¯ Ø§ÙØªØ«ØšÙØª  
+installDir.displayText=Ø§Ø®ØªØ± Ù
+Ø¬ÙØ¯ Ø§ÙØªØ«ØšÙØª  
+
+
+### InstallShield install detected page ###
+page.dontBudge.displayText=ÙÙØ¬Ø¯ ØªØ«ØšÙØª Ø³Ø§ØšÙ  
+is-install-detected.displayText=ØªÙ
+ Ø§ÙÙØŽÙ Ø¹Ù ØªØ«ØšÙØª Ø¬Ø±ÙÙØ³ØªÙÙ2 Ø£ÙØ¯Ù
+ Ù
+Ù Ø§ÙÙØ³Ø®Ø© 2.81 Ø Ø£Ù ØªØ«ØšÙØª ÙØ¬Ø±ÙÙØ³ØªÙÙ3 Ø£ÙØ¯Ù
+ Ù
+Ù Ø§ÙÙØ³Ø®Ø© 3.04 Ø ÙÙ Ù
+Ø¬ÙØ¯ Ø§ÙØªØ«ØšÙØª . ÙØ§ ÙÙ
+ÙÙ Ø§ÙÙ
+Ø¶Ù ÙØ¯Ù
+Ø§ ÙÙ Ø§ÙØªØ«ØšÙØª ØšØ§Ø³ØªØ®Ø¯Ø§Ù
+ ÙØ°Ø§ Ø§ÙÙ
+Ø¬ÙØ¯. \n\n Ø§ÙØ±Ø¬Ø§Ø¡ ØªØ±Ù ÙØ°Ø§ Ø§ÙÙ
+Ø«ØšØª Ø Ø¥ÙØºØ§Ø¡ ØªØ«ØšÙØª Ø¬Ø±ÙÙØ³ØªÙÙ Ø§ÙÙ
+ÙØ¬ÙØ¯ Ø Ø«Ù
+ Ø¥Ø¹Ø§Ø¯Ø© ØªØŽØºÙÙ ÙØ°Ø§ Ø§ÙÙ
+Ø«ØšØª (Ù
+Ø³ØªØ­Ø³Ù). ÙØšØ¯ÙØ§ Ù
+Ù Ø°ÙÙ Ø ÙÙ
+ÙÙÙ Ø§ÙØ¹ÙØ¯Ø© Ø¥ÙÙ Ø§ÙØµÙØ­Ø© Ø§ÙØ³Ø§ØšÙØ© Ù
+Ù ÙØ°Ø§ Ø§ÙÙ
+Ø«ØšØª ÙØ§Ø®ØªÙØ§Ø± Ù
+Ø¬ÙØ¯ ØªØ«ØšÙØª Ù
+Ø®ØªÙÙ   
+
+
+### Components Page ###
+# (Note: in the html here, we must use '<br>' for breaklines.
+# '<br/>' and other variations are not recognised.)
+page.selector.displayText=Ù
+ÙÙÙØ§Øª  
+choose-components.displayText=Ø§ÙØ±Ø¬Ø§Ø¡ Ø§Ø®ØªÙØ§Ø± Ø§ÙØ¹ÙØ§ØµØ± Ø§ÙØªÙ ØªØ±ØºØš ÙÙ ØªØ«ØšÙØªÙØ§   
+
+Looking_For_Previous_Installation.displayText=ØšØ­Ø« Ø¹Ù Ø¢Ù ØªØ«ØšÙØª Ø³Ø§ØšÙ.  
+Looking_For_Previous_Installation.explanatoryText=Ø§Ø°Ø§ ÙØ§Ù ÙØ°Ø§ ÙÙ ØªØ«ØšÙØª Ø²Ø§ØŠØ¯ ØÙÙ
+ ØšØªØ­Ù
+ÙÙ ØšØ¹Ø¶ Ø®ØµØ§ØŠØµ Ø§ÙØªØ«ØšÙØª Ø§ÙÙ
+ÙØ¬ÙØ¯ ÙØ¯Ø¹Ù
+ Ø¥Ø¬Ø±Ø§Ø¡ Ø§ÙØªØ«ØšÙØª.  
+
+Installing_Core_System.displayText=Ø§ÙÙØžØ§Ù
+ Ø§ÙØ£Ø³Ø§Ø³Ù  
+Installing_Core_System.explanatoryText=ÙØ°Ø§ ÙÙ Greenstone@version.major@ system Ø§ÙØ£Ø³Ø§Ø³Ù. Ù ÙÙ Ù
+ÙÙÙ Ù
+Ø·ÙÙØš.  
+
+Installing_Source_Code_Core.displayText=ØŽÙØ±Ø© Ø§ÙÙ
+ØµØ¯Ø±  Ø§ÙØ£Ø³Ø§Ø³ÙØ©  
+Installing_Source_Code_Core.explanatoryText=ÙØ°Ø§ ÙÙ Ø§ÙÙØžØ§Ù
+ Ø§ÙØ£Ø³Ø§Ø³Ù ÙØ¥ØµØ¯Ø§Ø±Ø§Øª ØŽÙØ±Ø© <br>Greenstone@version.major @ . \n ØªØŽÙ
+Ù Ù
+ÙÙØ§Øª Ø§ÙØ¯Ø¹Ù
+ Ø§ÙÙ
+Ø±Ø§ÙÙØ© ÙØŽÙØ±Ø© Ø§ÙÙ
+ØµØ¯Ø±.  
+
+Installing_Source_Code.displayText=ØŽÙØ±Ø© Ø§ÙÙ
+ØµØ¯Ø±  
+Installing_Source_Code.explanatoryText=ÙÙ
+ ØšØªØ«ØšÙØª ØŽÙØ±Ø© Ø§ÙÙ
+ØµØ¯Ø± Ø¥Ø°Ø§ ÙÙØª ØªØ±ÙØ¯ Ø§ÙÙÙØ§Ù
+ ØšØªØ¬Ù
+ÙØ¹<br> Greenstone@version.major@ \n ØšÙÙØ³ÙØ ÙÙ
+ ØšØ¥Ø¯Ø®Ø§Ù Ø§ÙØªØ¹Ø¯ÙÙØ§Øª Ø¹ÙÙ ÙØ³Ø®ØªÙ Ù
+Ù Greenstone@version.major @ Ø Ø£Ù Ø¥Ø°Ø§ <br>\n ÙÙØª ÙÙØ· ØªØ±ÙØ¯ Ø£Ù ØªØ±Ù ÙÙÙ ÙØ¹Ù
+Ù.  
+
+Installing_ImageMagick.displayText=Ø¥ÙÙ
+Ø§Ø¬ Ù
+Ø§Ø¬ÙÙ Ù
+Ø¹JPEG2000 (@bundled.version.imagemagick@)  
+Installing_ImageMagick.explanatoryText=ÙØ³ØªØ®Ø¯Ù
+ Ø¬Ø±ÙÙØ³ØªÙÙ Ø¥ÙÙ
+Ø§Ø¬ Ù
+Ø§Ø¬ÙÙ ÙÙ
+Ø¹Ø§ÙØ¬Ø© Ø§ÙØµÙØ±<br>. \n ØªØŽÙ
+Ù ÙØ³Ø®Ø© Ø¥ÙÙ
+Ø§Ø¬ Ù
+Ø§Ø¬ÙÙ Ø§ÙÙ
+Ø¬Ù
+Ø¹Ø© Ø§ÙØ¯Ø¹Ù
+ ÙØ£ØŽÙØ§Ù<br> ØµÙØ± JPEG2000 . Ø¥Ø°Ø§ ÙØ§Ù ÙØ¯ÙÙ ØšØ§ÙÙØ¹Ù Ø¥ÙÙ
+Ø§Ø¬ Ù
+Ø§Ø¬ÙÙ Ø¹ÙÙ Ø¬ÙØ§Ø² Ø§ÙÙÙ
+ØšÙÙØªØ± Ø§ÙØ®Ø§Øµ ØšÙ Ø Ø£Ù Ø¥Ø°Ø§ ÙÙØª<br> ÙØ§ ØªØ±ØºØš ÙÙ ØªØ¶Ù
+ÙÙ Ø§ÙØµÙØ± ÙÙ Ù
+Ø¬Ù
+ÙØ¹Ø§Øª Ø¬Ø±ÙÙØ³ØªÙÙ ØÙÙØ§ ÙÙ
+ÙÙÙ Ø§Ù <br>ÙØ§ ØªØ«ØšØª Ø¥ÙÙ
+Ø§Ø¬ Ù
+Ø§Ø¬ÙÙ  
+
+Installing_Ghostscript.displayText=(@bundled.version.ghostscript@ÙÙØ³ØªØ³ÙØ±ÙØšØª@)  
+Installing_Ghostscript.explanatoryText=ÙØ³ØªØ®Ø¯Ù
+ Ø¬Ø±ÙÙØ³ØªÙÙ ÙÙØ³ØªØ³ÙØ±ÙØšØª ÙÙ
+Ø¹Ø§ÙØ¬Ø© Ù
+ÙÙØ§Øª  PDF Ù PostScript .<br> Ø¥Ø°Ø§ ÙØ¬Ø¯ ÙÙØ³ØªØ³ÙØ±ÙØšØª Ù
+Ø«ØšØªØ§ ÙÙ Ø¬ÙØ§Ø²Ù Ù
+Ù ÙØšÙ Ø Ø£Ù ÙØ§ ØªØ±ØºØš ÙÙ ØªØ¶Ù
+ÙÙ Ù
+ÙÙØ§Øª PDF Ù PostScript ÙÙ Ù
+Ø¬Ù
+ÙØ¹Ø§Øª Ø¬Ø±ÙÙØ³ØªÙÙ Ø ÙÙØ§ ÙÙ
+ÙÙÙ Ø§Ù<br> ÙØ§ ØªØ«ØšØª ÙÙØ³ØªØ³ÙØ±ÙØšØª.  
+
+Installing_Start_Menu_Shortcuts.displayText=Ø§Ø®ØªØµØ§Ø±Ø§Øª ÙØ§ØŠÙ
+Ø© Ø§ØšØ¯Ø£   
+Installing_Start_Menu_Shortcuts.explanatoryText=Ø¥ÙØŽØ§Ø¡ Ø§Ø®ØªØµØ§Ø±Ø§Øª ÙGreenstone@version.major @ ÙÙ ÙØ§ØŠÙ
+Ø© Ø§ØšØ¯Ø£   
+
+Installing_Tomcat.displayText=(bundled.version.tomcat @ Ø§ØšØ§ØªØŽÙ ØªÙÙ
+ÙØ§Øª@)   
+Installing_Tomcat.explanatoryText=ÙØªØ·ÙØš Ø¬Ø±ÙÙØ³ØªÙÙ3 Ù
+Ø²ÙØ¯ ÙØš Ø§ØšØ§ØªØŽÙ ØªÙÙ
+ÙØ§Øª ÙØ®Ø¯Ù
+Ø© Ø§ÙÙ
+ÙØªØšØ© Ø§ÙØ±ÙÙ
+ÙØ© Ø§ÙØ®Ø§ØµØ© ØšÙ ÙÙ<br> Ø§ÙÙØš. Ø¥Ø°Ø§ ÙØ§Ù ÙØ¯ÙÙ ØªØ«ØšÙØª ØªÙÙ
+ÙØ§Øª Ù
+ÙØ¬ÙØ¯Ø ÙÙ
+ÙÙÙ Ø§Ø³ØªØ®Ø¯Ø§Ù
+ Ø°ÙÙ Ø§ÙØªØ«ØšÙØª <br>(ÙØªØ·ÙØš ØšØ¹Ø¶ Ø§ÙØ¥Ø¹Ø¯Ø§Ø¯) Ø Ø­ØªÙ ÙØ§ ØªØ­ØªØ§Ø¬ ÙÙØ°Ø§ Ø§ÙØªØ«ØšÙØª.  
+
+Installing_Ant.displayText=(bundled.version.ant @ Ø§ØšØ§ØªØŽÙ Ø¢ÙØª@)  
+Installing_Ant.explanatoryText=ÙØªØ·ÙØš Ø¬Ø±ÙÙØ³ØªÙÙ3 Ø§ØšØ§ØªØŽÙ Ø¢ÙØª ÙØªØŽØºÙÙ Ù Ø¥ÙÙØ§Ù Ù
+Ø²ÙØ¯ ÙØš ØªÙÙ
+ÙØ§Øª Ø Ù ÙØ¥Ø¹Ø§Ø¯Ø© ØªØ¬Ù
+ÙØ¹ <br>ØŽÙØ±Ø© Ø§ÙÙ
+ØµØ¯Ø± Ø Ù Ø§ÙÙÙØ§Ù
+ ØšØšØ¹Ø¶ Ø£Ø¹Ù
+Ø§Ù Ø§ÙØµÙØ§ÙØ©.ÙÙ
+ÙÙÙ ØªØ¬Ø§ÙØ² ÙØ°Ø§ Ø§ÙØ£Ù
+Ø± Ø¥Ø°Ø§ ÙÙ
+Øª ØšØªØ«ØšÙØª Ø¢ÙØª Ù
+Ù ÙØšÙ.  
+
+### Admin password page
+page.admin-password.displayText=ÙØ±Ø¬Ù ØªØ­Ø¯ÙØ¯ ÙÙÙ
+Ø© Ø³Ø± Ø§ÙÙ
+ØŽØ±Ù  
+admin.password.displayText=ÙÙÙ
+Ø© Ø³Ø± Ø§ÙÙ
+ØŽØ±Ù  
+admin-password-expl.displayText=Ù
+Ù Ø£Ø¬Ù Ø§ÙÙØµÙÙ Ø¥ÙÙ Ø£Ø¬Ø²Ø§Ø¡ Ù
+Ø¹ÙÙØ© Ù
+Ù ÙØ§Ø¬ÙØ© Ø¬Ø±ÙÙØ³ØªÙÙ ØªØ­ØªØ§Ø¬ Ø¥ÙÙ ÙÙÙ
+Ø© Ø³Ø±. Ø³ÙÙ ÙØªÙ
+ Ø¥ÙØŽØ§Ø¡ Ù
+Ø³ØªØ®Ø¯Ù
+  ØšØ¥Ø³Ù
+ Ø§ÙÙ
+Ø³ØªØ®Ø¯Ù
+  'Ø§ÙÙ
+ØŽØ±Ù'  Ù
+Ø¹ ÙÙÙ
+Ø© Ø§ÙØ³Ø± Ø§ÙØªÙ ØªÙØ¯Ù
+ÙØ§. Ø·ÙÙ ÙÙÙ
+Ø© Ø§ÙÙ
+Ø±ÙØ± ÙØ¬Øš Ø£Ù ÙÙÙÙ Ù
+Ø§ ØšÙÙ 3 Ù 20 Ø­Ø±ÙØ§ .   
+
+### Tomcat config page
+page.tomcat-config.displayText=Ø¥Ø¹Ø¯Ø§Ø¯ Ø§ØšØ§ØªØŽÙ ØªÙÙ
+ÙØ§Øª  
+tomcat-config-explanation1.displayText=ÙØ³ØªØ®Ø¯Ù
+ Ø¬Ø±ÙÙØ³ØªÙÙ3   Ø§ØšØ§ØªØŽÙ ØªÙÙ
+ÙØ§Øª  ÙØªÙØ§Ø³Ù
+  Ø§ÙÙ
+ÙØªØšØ§Øª Ø§ÙØ±ÙÙ
+ÙØ© Ø§ÙØ®Ø§ØµØ© ØšÙ.  
+tomcat-config-explanation2.displayText=ÙÙ
+ÙÙÙ ÙÙØ§ Ø¥Ù
+Ø§ Ø¥Ø¹Ø¯Ø§Ø¯ ØªÙÙ
+ÙØ§Øª Ø Ø£Ù Ù
+Ù Ø®ÙØ§Ù ØªØ­Ø¯ÙØ« Ù
+ÙÙ build.properties Ø§ÙÙ
+ÙØ¬ÙØ¯ ÙÙ Ù
+Ø¬ÙØ¯ Ø¬Ø±ÙÙØ³ØªÙÙ3 Ø§ÙØ£Ø³Ø§Ø³Ù ($ (installDir)).  
+tomcat.server.displayText=Ù
+Ø²ÙØ¯ ØªÙÙ
+ÙØ§Øª  
+tomcat-server.explanatoryText=Ø§ÙØ±Ø¬Ø§Ø¡ Ø¥Ø¯Ø®Ø§Ù Ø§Ø³Ù
+ Ù
+Ø²ÙØ¯ Ø§ÙØ¬ÙØ§Ø² Ø­ÙØ« ØªØ³ØªØ¶Ø§Ù Ø§ÙÙ
+ÙØªØšØ©. Ø¥Ø°Ø§ ÙÙ
+ ØªÙÙ Ù
+ØªØ£ÙØ¯Ø§ Ø ÙÙ
+ÙÙÙ ÙØšÙÙ Ø§ÙÙÙÙ
+Ø© Ø§ÙØ¥ÙØªØ±Ø§Ø¶ÙØ©  (localhost).  
+tomcat.port.explanatoryText=Ø§ÙØ±Ø¬Ø§Ø¡ Ø§Ø®ØªÙØ§Ø± Ø§ÙÙ
+ÙØ§ÙØ° Ø§ÙØªÙ ÙØ¬Øš Ø£Ù ÙØ³ØªØ®Ø¯Ù
+ÙØ§ ØªÙÙ
+ÙØ§Øª Ø Ù Ø¹Ø§Ø¯Ø© Ù
+Ø§ ÙÙÙÙ Ù
+ÙØšÙÙØ§ Ø¥Ø³ØªØ®Ø¯Ø§Ù
+ Ø§ÙÙÙÙ
+ Ø§ÙØ¥ÙØªØ±Ø§Ø¶ÙØ©. Ø¥Ø°Ø§ ÙÙØª ØšØ§ÙÙØ¹Ù ØªÙÙÙ
+ ØšØªØŽØºÙÙ Ø§ÙÙ
+ÙØ§ÙØ° Ø§ÙØ¥ÙØªØ±Ø§Ø¶ÙØ© ÙØ®Ø¯Ù
+Ø§Øª Ø£Ø®Ø±Ù Ø Ø§ÙØ±Ø¬Ø§Ø¡ Ø§Ø®ØªÙØ§Ø± ØšØ¹Ø¶ Ø§ÙÙ
+ÙØ§ÙØ° Ø§ÙØ­Ø±Ø©  
+tomcat.port.displayText=Ù
+ÙÙØ° ØªÙÙ
+ÙØ§Øª  
+tomcat.shutdown.port.displayText=Ù
+ÙÙØ° Ø¥ØºÙØ§Ù ØªÙÙ
+ÙØ§Øª  
+
+### Progress page
+page.progress.displayText=ØªØ·ÙØ± Ø§ÙØªØ«ØšÙØª  
+
+### Uninstaller Strings
+
+uninstaller.greenstone.uninstaller=Ø¥ÙØºØ§Ø¡ ØªØ«ØšÙØª Ø¬Ø±ÙÙØ³ØªÙÙ  
+uninstaller.cancel=Ø¥ÙØºØ§Ø¡  
+uninstaller.uninstall=Ø¥ÙØºØ§Ø¡ Ø§ÙØªØ«ØšÙØª  
+uninstaller.finish=Ø¥ÙØªÙØ§Ø¡  
+uninstaller.error=Ø®Ø·Ø£  
+uninstaller.confirmation=ØªØ£ÙÙØ¯  
+uninstaller.continue=Ø¥Ø³ØªÙ
+Ø±Ø§Ø±  
+uninstaller.complete=Ø¥ÙØªÙ
+Ø§Ù  
+uninstaller.skip=ØªØ¬Ø§ÙØ²  
+uninstaller.skip.all=ØªØ¬Ø§ÙØ² Ø§ÙÙÙ  
+uninstaller.retry=Ø¥Ø¹Ø§Ø¯Ø©  
+uninstaller.readonly=ÙÙÙØ±Ø§Ø¡Ø© ÙÙØ·  
+
+uninstaller.will.uninstall.from=Ø¥ÙØºØ§Ø¡ ØªØ«ØšÙØª Ø¬Ø±ÙÙØ³ØªÙÙ Ù
+Ù :   
+uninstaller.uninstall.options=Ø®ÙØ§Ø±Ø§Øª Ø¥ÙØºØ§Ø¡ Ø§ÙØªØ«ØšÙØª:   
+uninstaller.keep.collections=Ø§Ø­ØªÙØž ØšØ§ÙÙ
+Ø¬Ù
+ÙØ¹Ø§Øª  
+uninstaller.are.you.sure=ÙÙ Ø£ÙØª Ù
+ØªØ£ÙØ¯ Ù
+Ù Ø£ÙÙ ØªØ±ØºØš ÙÙ Ø¥ÙØºØ§Ø¡ ØªØ«ØšÙØª Ø¬Ø±ÙÙØ³ØªÙÙ  
+uninstaller.are.you.sure.collections=ÙÙØ¯ Ø§Ø®ØªØ±Øª Ø­Ø°Ù Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø§Øª Ø§ÙØ®Ø§ØµØ© ØšÙ. \n Ø§ÙØ±Ø¬Ø§Ø¡ Ø§ÙÙÙØ§Ù
+ ØšØ§ÙØ­ÙØž Ø§ÙØ¥Ø­ØªÙØ§Ø·Ù ÙØ£Ù Ù
+Ø¬Ù
+ÙØ¹Ø§Øª ØªÙØ¯ Ø§ÙØ¥Ø­ØªÙØ§Øž ØšÙØ§ ÙØšÙ Ù
+ÙØ§ØµÙØ© Ø§ÙØ¥Ø¬Ø±Ø§Ø¡.   
+uninstaller.failed.to.figure.cd=ÙØŽÙ ÙÙ Ù
+Ø¹Ø±ÙØ© Ø§ÙØ¯ÙÙÙ Ø§ÙØ­Ø§ÙÙ  
+uninstaller.cancelled=Ø¥ÙØºØ§Ø¡ Ø§ÙØªØ«ØšÙØª  
+uninstaller.finished=Ø¥ÙØªÙØ§Ø¡ Ø¥ÙØºØ§Ø¡ Ø§ÙØªØ«ØšÙØª   
+uninstaller.deleting=Ø­Ø°Ù    (Ù
+ÙÙ) Ù
+Ù Ø§ÙÙØ±Øµ  
+
+uninstaller.info.skipping=Ù
+Ø¹ÙÙÙ
+Ø§Øª : ØªØ¬Ø§ÙØ² ( Ø§ÙÙ
+ÙÙ)  
+uninstaller.info.no.startmenu=Ù
+Ø¹ÙÙÙ
+Ø§Øª : ÙØ§ ÙÙØ¬Ø¯ Ù
+Ø³Ø§Ø± ÙØ§ØŠÙ
+Ø© Ø¥ØšØ¯Ø£. Ø­Ø°Ù Ù
+Ø¬Ù
+ÙØ¹Ø© ÙØ§ØŠÙ
+Ø© Ø¥ØšØ¯Ø£ ÙÙ ÙÙÙÙ Ø¬Ø²Ø¡Ø§ Ù
+Ù  Ø¥ÙØºØ§Ø¡ Ø§ÙØªØ«ØšÙØª.   
+uninstaller.warning.readonly=ØªØ­Ø°ÙØ± : ÙØšØ¯Ù Ø£Ù (Ù
+ÙÙ)  ÙÙÙØ±Ø§Ø¡Ø© ÙÙØ·   
+uninstaller.warning.couldnt.delete=ØªØ­Ø°ÙØ± : (Ù
+ÙÙ)  ÙØ§ ÙÙ
+ÙÙ Ø­Ø°ÙÙ. ØªØ¬Ø§ÙØ².   
+uninstaller.warning.nonexistent=ØªØ­Ø°ÙØ± : (Ø§ÙÙ
+ÙÙ)  ØºÙØ± Ù
+ÙØ¬ÙØ¯   
+uninstaller.error.nonexistent=Ø®Ø·Ø£ : (Ø§ÙÙ
+ÙÙ)  ØºÙØ± Ù
+ÙØ¬ÙØ¯  
+uninstaller.error.couldnt.find.install.props=Ø®Ø·Ø£ : ØªØ¹Ø°Ø± Ø§ÙØ¹Ø«ÙØ± Ø¹ÙÙ Ù
+ÙÙ ' installation.properties ' Ø£Ù 'etc/installation.properties'. \n Ø¥Ù
+Ø§ Ø£Ù ÙÙÙÙ ÙØ°Ø§ ÙÙØ³ ØªØ«ØšÙØªØ§ ØµØ­ÙØ­Ø§ ÙØ¬Ø±ÙÙØ³ØªÙÙ Ø Ø£Ù Ø£Ù Ø¹Ù
+ÙÙØ© Ø§ÙØªØ«ØšÙØª ÙØ¯ ÙØ³Ø¯Øª.\n ÙØ§ ÙÙ
+ÙÙ Ø§ÙÙ
+Ø¶Ù ÙØ¯Ù
+Ø§ ÙÙ Ø¥ÙØºØ§Ø¡ Ø§ÙØªØ«ØšÙØª.  
+uninstaller.warning.couldnt.create.flagfile=ØªØ­Ø°ÙØ± : ØªØ¹Ø°Ø± Ø¥ÙØŽØ§Ø¡ Ù
+ÙÙ Ø§ÙØ¹ÙÙ
+. Ù ÙØ¬Øš Ø¹ÙÙÙ Ø£Ù ØªÙÙÙ
+ ØšØ­Ø°Ù  jre Ù Ø¥Ø³ØªØ®Ø±Ø§Ø¬ Ù
+ÙÙØ§Øª Ø¥ÙØºØ§Ø¡ Ø§ÙØªØ«ØšÙØª ÙØ¯ÙÙØ§.   
+
+
+### Ant-Installer Core strings
+
+dirNotExistCreate=Ù
+Ø¬ÙØ¯ ØºÙØ± Ù
+ÙØ¬ÙØ¯ Ø ÙÙ ØªØ±ØºØš ÙÙ Ø¥ÙØŽØ§Ø¡ ÙØ°Ø§ Ø§ÙÙ
+Ø¬ÙØ¯ Ø  
+dirNotExist=Ø§ÙÙ
+Ø¬ÙØ¯ ØºÙØ± Ù
+ÙØ¬ÙØ¯  
+fileNotExist=Ø§ÙÙ
+ÙÙ ØºÙØ± Ù
+ÙØ¬ÙØ¯  
+dirNotCreated=ÙØ§ ÙÙ
+ÙÙ Ø¥ÙØŽØ§Ø¡ Ø§ÙÙ
+Ø¬ÙØ¯  
+canNotCreateFile=ÙØ§ ÙÙ
+ÙÙ Ø¥ÙØŽØ§Ø¡ Ù
+ÙÙ  
+appRootInvalid=ÙØ§ ÙØšØ¯Ù Ø£Ù ÙØ°Ø§ Ø§ÙÙ
+Ø¬ÙØ¯  ÙÙ Ø§ÙÙ
+Ø¬ÙØ¯ Ø§ÙØ£Ø³Ø§Ø³Ù ÙÙØªØ·ØšÙÙ  
+selectFile=Ø§Ø®ØªØ± Ø§ÙÙ
+ÙÙ  
+selectFolder=Ø§Ø®ØªØ± Ù
+Ø¬ÙØ¯  
+browseDotDotDot=ØªØµÙØ­...  
+notValidSelection=Ø§ÙØ§Ø®ØªÙØ§Ø± ØºÙØ± ØµØ­ÙØ­   
+showDetails=Ø¹Ø±Ø¶ ØªÙØ§ØµÙÙ  
+
+#Default loading
+promptLoadDefaults=ÙÙØ¬Ø¯ Ø¥Ø¹Ø¯Ø§Ø¯ ØªØ«ØšÙØª . ØªØ­Ù
+ÙÙ Ø¥Ø¹Ø¯Ø§Ø¯ Ø§ÙØªØ«ØšÙØª Ø§ÙÙ
+ÙØ¬ÙØ¯ Ø  
+promptMissingDefaultPassword=ÙÙ
+ ÙØªÙ
+ Ø§ÙØ¹Ø«ÙØ± Ø¹ÙÙ ÙÙÙ
+Ø© Ø§ÙØ³Ø±  Ù Ø±ØšÙ
+Ø§ ÙØ¯ ØªÙ
+ Ø­Ø°ÙÙØ§ ÙØ£Ø³ØšØ§Øš Ø£Ù
+ÙÙØ© Ø Ø³ÙØªÙ
+ ØªØ­Ø¯ÙØ¯ Ø§ÙØ§ÙØªØ±Ø§Ø¶ÙØ©  
+
+click=Ø§ÙÙØ±  
+toContinue=Ø¥Ø³ØªÙ
+Ø±Ø§Ø±  
+failed=ÙØŽÙ  
+exit=Ø®Ø±ÙØ¬  
+complete=Ø¥ÙØªÙ
+Ø§Ù  
+finished=Ø§ÙØªÙØ§Ø¡  
+extracting=Ø¥Ø³ØªØ®Ø±Ø§Ø¬...  
+installFinished=Ø§ÙØªÙØ§Ø¡ Ø§ÙØªØ«ØšÙØª  
+install-cancelled=ØªÙ
+ Ø¥ÙØºØ§Ø¡ Ø§ÙØªØ«ØšÙØª  
+
+backButton=Ø¹ÙØ¯Ø©  
+cancelButton=Ø¥ÙØºØ§Ø¡   
+nextButton=Ø§ÙØªØ§ÙÙ  
+finishButtonText=ØªØ«ØšÙØª  
+
+output=Ø§ÙÙ
+Ø®Ø±Ø¬Ø§Øª  
+errors=Ø£Ø®Ø·Ø§Ø¡   
+notCorrectFormat=ÙØ°Ø§ Ø§ÙØ­ÙÙ ÙÙØ³ ØšØ§ÙØŽÙÙ Ø§ÙØµØ­ÙØ­  
+notCorrectPasswordFormat=ÙÙÙ
+Ø© Ø§ÙÙ
+Ø±ÙØ± ÙÙØ³Øª ØšØ§ÙØŽÙÙ Ø§ÙØµØ­ÙØ­  
+passwordsDoNotMatch=ÙÙÙ
+Ø© Ø³Ø± Ø®Ø·Ø£  
+installationFailed=ÙØŽÙ Ø§ÙØªØ«ØšÙØª  
+propertiesVersionMismatch=ØšØ¹Ø¶ Ø§ÙØ®ÙØ§Ø±Ø§Øª ØºÙØ± Ù
+ÙØ¬ÙØ¯Ø© Ù
+Ù Ø§ÙÙØ³Ø®Ø© Ø§ÙØ³Ø§ØšÙØ© Ø ÙÙØ¬Øš Ø£Ù ØªØ¯Ø®Ù ÙØ¯ÙÙØ§ Ø Ø¥Ø³ØªÙ
+Ø±Ø§Ø± Ø  
+
+Finished=Ø§ÙØªÙØ§Ø¡  
+Failed=ÙØŽÙ Ø Ø¹Ø±Ø¶ Ø±Ø³Ø§ØŠÙ Ø§ÙØ®Ø·Ø£  
+ant.failure=ÙØŽÙ ØªØŽØºÙÙ Ø¢ÙØª - Ø¥ÙØ­Øµ Ø³Ø¬ÙØ§Øª Ø§ÙØ®Ø·Ø£ ÙÙØªÙØ§ØµÙÙ  
+
+license.next.text=Ø£ÙØšÙ   
+license.cancel.text=Ø±ÙØ¶   
Index: /main/branches/stable_gs3/release-kits/shared/core/language-strings/LanguagePack_de.properties
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/language-strings/LanguagePack_de.properties	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/language-strings/LanguagePack_de.properties	(revision 21851)
@@ -0,0 +1,181 @@
+### Language page ###
+page.language-selector.displayText=Sprache
+language-selector-explanation.displayText=Bitte wÃ€hlen Sie die Installationssprache aus.
+#(Hinweis: Momentan unterstÃŒtzt die Installation noch nicht alle Sprachen.)
+
+
+### Intro Page ###
+page.intro.displayText=Greenstone @version@ Installation
+welcome.displayText=Greenstone@version.major@ ist ein Progamm fÃŒr die Erstellung und Weitergabe von digitalen Bibliotheken.\n\nDieses Installationsprogramm enthÃ€lt das Greenstone-System, sowie Werkzeuge fÃŒr das Anbieten digitaler Bibliotheken ÃŒber das Internet (Apache2.2 fÃŒr Linux / MacOS, Greenstone Library Server fÃŒr Windows), fÃŒr die Konvertierung von Bildern (ImageMagick), und fÃŒr das Anzeigen und Bearbeiten von PDF-und Postscript-Dokumenten (Ghostscript - nur fÃŒr Windows und MacOS).
+
+## License page ###
+page.license.displayText=Software Lizenz
+
+
+### Destination page ###
+page.destination.displayText=Installationsordner
+installDir.displayText=WÃ€hlen Sie einen Installationsordner
+
+
+### InstallShield install detected page ###
+page.dontBudge.displayText=Alte Installation gefunden
+is-install-detected.displayText=Eine Installation von Greenstone2 Ã€lter als Version 2.81, oder eine Installation von Greenstone3 Ã€lter als Version 3.04, wurde in Ihrem Installationsornder gefunden. Die Installation kann nicht im ausgewÃ€hlten Installationsordner fortgesetzt werden.\n\nBitte beenden sie die Installation, deinstallieren Sie die existierende Greenstone Installation, und setzen dann diese Installation fort (empfohlen). Alternativ kÃ¶nnen Sie zur vorigen Seite dieser Installation zurÃŒckkehren und einen anderen Installationsordner auswÃ€hlen.
+
+
+### Components Page ###
+# (Note: in the html here, we must use '<br>' for breaklines.
+# '<br/>' and other variations are not recognised.)
+page.selector.displayText=Komponenten
+choose-components.displayText=Bitte wÃ€hlen Sie die Komponenten, die Sie installieren mÃ¶chten
+
+Looking_For_Previous_Installation.displayText=Suche nach alten Installationen
+Looking_For_Previous_Installation.explanatoryText=Falls dies eine Nachinstallation ist, lade einige Eigenschaften der existierenden Installation, um den Installationsprozess zu leiten.
+
+Installing_Core_System.displayText=Kernsystem
+Installing_Core_System.explanatoryText=<html> Dies ist das Kernsystem von Greenstone@version.major@. Es ist eine benÃ¶tigte Komponente. </html>
+
+Installing_Source_Code_Core.displayText=Quellcode des Kernsystems
+Installing_Source_Code_Core.explanatoryText=<html> Dies ist das Kernsystem von Greenstone@version.major@ fÃŒr Quellcode Versionen. <br>\nEs beinhaltet unterstÃŒtzende Dateien, die den Quellcode begleiten. </html>
+
+Installing_Source_Code.displayText=Quellcode
+Installing_Source_Code.explanatoryText=<html> Installieren Sie den Quellcode wenn Sie Greenstone@version.major@ selbst kompilieren mÃ¶chten,<br>\nIhre Kopie von Greenstone@version.major@ modifizieren wollen, oder wenn<br>\nSie wissen mÃ¶chten, wie alles funktioniert. </html>
+
+Installing_ImageMagick.displayText=ImageMagick mit JPEG2000 (@bundled.version.imagemagick@)
+Installing_ImageMagick.explanatoryText=<html> Greenstone benutzt ImageMagick um Bilder zu bearbeiten.<br>\nDie Version von ImageMagick beinhaltet support fÃŒr das Format JPEG2000. <br>Falls Sie bereits ImageMagick auf Ihrem Computer installiert haben, oder falls Sie keine Bilder <br>in Ihrer Greenstone Sammlung haben wollen brauchen Sie ImageMagick nicht zu installieren. </html>
+
+Installing_Ghostscript.displayText=GhostScript (@bundled.version.ghostscript@)
+Installing_Ghostscript.explanatoryText=<html> Greenstone benutzt GhostScript um PDF und PostScript Dateien zu bearbeiten.<br> Falls Sie bereits Ghostscript auf Ihrem Computer installiert haben, oder falls Sie keine<br> PDF oder PostScript Dateien in Ihrer Greenstone Sammlung haben wollen brauchen Sie Ghostscript nicht zu installieren. </html>
+
+Installing_Start_Menu_Shortcuts.displayText=Startmenu-Shortcuts
+Installing_Start_Menu_Shortcuts.explanatoryText=Erzeugen von Shortcuts zu Greenstone@version.major@ in Ihrem Startmenu
+
+Installing_Tomcat.displayText=Apache Tomcat (@bundled.version.tomcat@)
+Installing_Tomcat.explanatoryText=<html> Greenstone3 benÃ¶tigt den Apache Tomcat Webserver um Ihre digitale Bibliothek ÃŒber das Internet anzubieten.<br> Falls Sie eine existierende Installation von Tomcat haben, kÃ¶nnen Sie diese <br> (mit einigen Ãnderungen der Konfiguration) benutzen, d.h. Sie kÃ¶nnen von der Installation dieser Komponente Abstand nehmen. </html>
+
+Installing_Ant.displayText=Apache Ant (@bundled.version.ant@)
+Installing_Ant.explanatoryText=<html> Greenstone3 benÃ¶tigt Apache Ant um den Tomcat Webserver zu starten und stoppen, um den Quellcode <br> zu rekompilieren, und fÃŒr einige Wartungsaufgaben. Falls Sie bereits Ant installiert haben, <br> kÃ¶nnen Sie von der Installation dieser Komponente Abstand nehmen. </html>
+
+### Admin password page
+
+page.admin-pages.displayText=Administration Pages
+admin-expl.displayText=Ueber die Verwaltungsseiten der Greenstone Webschnittstelle kann die Benutzer-Datenbank modifizert werden. Dadurch kann der Zugriff auf bestimmte Inhalte beschrÃ€nkt werden, als auch das nicht-lokale Bearbeiten der digitalen Bibliothek erlaubt werden. DarÃŒber hinaus bieten die Verwaltungsseiten auch eine einfache MÃ¶glichkeit, Log-Dateien zu inspizieren, und die Konfigurationsdatei "main.cfg" zu bearbeiten.
+admin-expl-2.displayText=MÃ¶chten Sie die Greenstone-Verwaltungsseiten aktivieren? (Auf der nÃ€chsten Seite werden Sie nach einem Passwort gefragt werden.)
+admin-expl-3.displayText=HINWEIS: Wenn Sie die Verwaltungsseiten aktivieren, kann auf diese, abhÃ€ngig von ihren Einstellungen, unter UmstÃ€nden ÃŒber das Internet zugegriffen werden. Bitte wÃ€hlen Sie daher als Schutz ein sicheres Passwort aus.
+enable.admin.pages.displayText=Verwaltungsseiten aktivieren
+
+page.admin-password.displayText=Bitte setzen Sie das Admin Passwort
+admin-password-expl.displayText=Um Zugang zu bestimmten Teilen der Greenstone BenutzeroberflÃ€che zu haben, benÃ¶tigen Sie ein Passwort. Ein Benutzer mit der Benutzerkennung 'admin' mit dem von Ihnen gegebenen Passwort wird fÃŒr Sie erzeugt. Das Passwort muss zwischen drei und acht Buchstaben lang sein.
+admin.password.displayText=Admin Passwort
+
+### Tomcat config page
+page.tomcat-config.displayText=Apache Tomcat Konfiguration
+tomcat-config-explanation1.displayText=Greenstone3 benutzt Apache Tomcat fÃŒr den Austausch von diditalen Bibliotheken.
+tomcat-config-explanation2.displayText=Sie kÃ¶nnen Tomcat entweder hier konfigurieren, oder durch editieren der build.properties Datei im Greenstone3 Heinmverzeichnis (${installDir}).
+tomcat.server.displayText=Tomcat Server
+tomcat-server.explanatoryText=Bitte geben Sie den Namen des Server, der die Bibliothek hostet, ein. Wenn Sie sich nicht sicher sind, akzeptieren Sie den Default (localhost).
+tomcat.port.explanatoryText=Bitte wÃ€hlen Sie die Ports, die Tomcat benutzen soll. Es ist normalerweise empfohlen die Defaults zu akzeptieren. Falls Sie bereits andere Services auf den default Ports laufen haben, wÃ€hlen Sie bitte einige freie Ports.
+tomcat.port.displayText=Tomcat Port
+tomcat.shutdown.port.displayText=Tomcat Shutdown Port
+
+### Progress page
+page.progress.displayText=Fortschritt der Installation
+
+### Uninstaller Strings
+
+uninstaller.greenstone.uninstaller=Deinstallation von Greenstone
+uninstaller.cancel=Abbrechen
+uninstaller.uninstall=Deinstallieren
+uninstaller.finish=Fertig stellen
+uninstaller.error=Fehler
+uninstaller.confirmation=BestÃ€tigung
+uninstaller.continue=Fortsetzen
+uninstaller.complete=Abschliessen
+uninstaller.skip=Ãberspringen
+uninstaller.skip.all=Alles Ãberspringen
+uninstaller.retry=Wiederholen
+uninstaller.readonly=SchreibgeschÃŒtzt
+
+uninstaller.will.uninstall.from=Dies wird Greenstone deinstallieren von
+uninstaller.uninstall.options=Deinstallationsoptionen:
+uninstaller.keep.collections=Sammlungen behalten
+uninstaller.are.you.sure=MÃ¶chten Sie Greenstone wirklich deinstallieren
+uninstaller.are.you.sure.collections=Sie haben  gewÃ€hlt Ihre Sammlungen zu deinstallieren.\nBitte erstellen Sie Sicherungskopien aller Sammlungen, die Sie behalten wollen, bevor sie die Deinstallation fortsetzen
+uninstaller.failed.to.figure.cd=Das aktuelle Verzeichnis konnte nicht ermittelt werden
+uninstaller.cancelled=Deinstallation abgebrochen
+uninstaller.finished=Deinstallation abgeschlossen
+uninstaller.deleting=LÃ¶sche {file} von der Festplatte
+
+uninstaller.info.skipping=INFO: Ãberspringe {file}
+uninstaller.info.no.startmenu=INFO: Kein Startmenupfad gefunden. Die Deinstallation beinhaltet nicht eine Startmenugruppe zu lÃ¶schen
+uninstaller.warning.readonly=WARNUNG: {file} ist schreibgeschÃŒtzt
+uninstaller.warning.couldnt.delete=WARNUNG: {file} konnte nicht gelÃ¶scht werden
+uninstaller.warning.nonexistent=WARNUNG: {file} existiert nicht
+uninstaller.error.nonexistent=FEHLER: {file} existiert nicht
+uninstaller.error.couldnt.find.install.props=FEHLER: Die Datei 'installation.properties' oder 'etc/installation.properties' konnte nicht gefunden werden.\nEntweder ist dies keine gÃŒltige Greenstone Installation, oder die Installation ist beschÃ€digt.\nDeinstallation kann nicht fortgesetzt werden
+uninstaller.warning.couldnt.create.flagfile=FEHLER: Konnte die Markierungsdatei nicht erzeugen. Sie mÃŒssen die restlichen Dateien und Verzeichnisse  manuell lÃ¶schen.
+
+
+### Ant-Installer Core strings
+
+dirNotExistCreate=Das Verzeichnis existiert nicht, soll es erzeugt werden?
+dirNotExist=Das Verzeichnis existiert nicht
+fileNotExist=Die Datei existiert nicht
+dirNotCreated=Das Verzeichnis konnte nicht erzeugt werden
+canNotCreateFile=Kann die Datei nicht erzeugen
+appRootInvalid=Dies Verzeichnis scheint nicht das Wurzelverzeichnis  der Anwendung zu sein
+selectFile=WÃ€hlen Sie eine Datei
+selectFolder=WÃ€hlen Sie ein Verzeichnis
+browseDotDotDot=Browse...
+notValidSelection=Keine gÃŒltige Auswahl
+showDetails=Zeige Details
+
+#Default loading
+promptLoadDefaults=Installationskonfiguration gefunden. Soll die existierende Konfiguration geladen werden?
+promptMissingDefaultPassword=Ein Passwort ist nicht gefunden worden, mÃ¶glicherweise wurde es aus SicherheitsgrÃŒnden ausgelassen, es wird auf den Default gesetzt.
+
+click=Klicken Sie
+toContinue=um fortzusetzen
+failed=Unterbrochen
+exit=Exit
+complete=Fertig stellen
+finished=Beendet
+extracting=Entpacke...
+installFinished=Installation beendet
+install-cancelled=Installation abgebrochen
+running=
+
+backButton=ZurÃŒck
+cancelButton=Abbrechen
+nextButton=Weiter
+finishButtonText=installieren
+
+output=Ausgabe
+errors=Fehler
+notCorrectFormat=Das Feld ist nicht im richtigen Format
+notCorrectPasswordFormat=Das Passwort ist nicht im richtigen Format
+passwordsDoNotMatch=Die PasswÃ¶rter sind nicht identisch
+installationFailed=Installation war nicht erfolgreich
+propertiesVersionMismatch=Einige Optionen fehlen von der vorigen Version und mÃŒssen manuell eingegeben werden, fortsetzen?
+
+Finished=Beendet
+Failed=Installation unterbrochen, mÃ¶chten Sie Fehlermeldungen sehen
+ant.failure=Ant konnte nicht sum Laufen gebracht werden - mÃ¶chten Sie Fehlerprotokolle fÃŒr Details ansehen
+
+license.next.text=Akzeptieren
+license.cancel.text=Ablehnen
+
+#text install strings
+_required_=erforderlich
+_default_=Voreinstellung
+true=wahr
+affirmativeChars=W,J
+licenseAccept=Akzeptieren Sie diese Lizenz? J oder N  [Vorgabe\:J]
+clickViewLicense=DrÃŒcken Sie die Eingabetaste, um die Lizenzvereinbarung anzusehen
+clickViewText=Press enter to continue
+enterNumber=Geben Sie eine Zahl ein
+fileDoesNotExist=Die Datei existiert nicht
+license_next=Geben Sie 'N' fÃŒr die nÃ€chste Seite ein, oder eine andere
+Taste, um zum Ende zu springen
+large_select_next=Geben Sie 'N' fÃŒr die nÃ€chste Seite ein, oder eine andere Taste, um zum Ende zu springen
+nextChar=N
+availableOptions=VerfÃŒgbare Optionen ansehen
Index: /main/branches/stable_gs3/release-kits/shared/core/language-strings/LanguagePack_es.properties
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/language-strings/LanguagePack_es.properties	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/language-strings/LanguagePack_es.properties	(revision 21851)
@@ -0,0 +1,178 @@
+﻿### Language page ###
+page.language-selector.displayText=Idioma
+language-selector-explanation.displayText=Por favor, elija su idioma preferido:
+#(Nota: Este instalador no ha sido completamente traducido a todos los idiomas aún.)
+
+
+### Intro Page ###
+page.intro.displayText=Instalador Greenstone @version@
+welcome.displayText=Greenstone@version.major@ es un software para crear y distribuir bibliotecas digitales.\n\nEste instalador incluye el sistema Greenstone, además de herramientas para publicar bibliotecas digitales (Apache2.2 para Linux/MacOS, Greenstone Library Server para Windows), convertir imágenes (ImageMagick), y manipular documentos pdf y postscript (GhostScript - Windows y MacOS solamente).
+
+## License page ###
+page.license.displayText=Licencia de Software
+
+
+### Destination page ###
+page.destination.displayText=Carpeta de Instalación
+installDir.displayText=Seleccione una carpeta para la instalación
+
+
+### InstallShield install detected page ###
+page.dontBudge.displayText=Versión anterior detectada
+is-install-detected.displayText=Fue detectada una instalación Greenstone2 anterior a la version 2.81, o una instalación de Greenstone3 anterior a la version 3.04 en la carpeta de instalación. No puede procederse con la instalación en la carpeta seleccionada.\n\nPor favor, salga del Instalador, desinstale la versión anterior y vuelva a ejecutar este programa (recomendado). Alternativamente, puede ir hacia atrás y seleccionar una carpeta de destino diferente.
+
+
+### Components Page ###
+# (Note: in the html here, we must use '<br>' for breaklines.
+# '<br/>' and other variations are not recognised.)
+page.selector.displayText=Componentes
+choose-components.displayText=Por favor, elija los componentes que desea instalar
+Looking_For_Previous_Installation.displayText=Buscando instalaciones previas
+Looking_For_Previous_Installation.explanatoryText=Si esta es una reinstalación, cargue algunas propiedades de la instalación existente para ayudar al proceso de instalación.
+
+Installing_Core_System.displayText=Sistema principal
+Installing_Core_System.explanatoryText=<html>Este es el módulo principal de Greenstone@version.major@. Es un componente requerido. </html>
+
+Installing_Source_Code_Core.displayText=Módulo de Código fuente
+Installing_Source_Code_Core.explanatoryText=<html> Este es el sistema central de Greenstone@version.major@ para las versiones fuente. <br>\nIncluye archivos de soporte para acompañar al código fuente. </html>
+
+Installing_Source_Code.displayText=Código fuente
+Installing_Source_Code.explanatoryText=<html> Instale el código fuente para el caso en que se quiera compilar Greenstone@version.major@, <br>\nhacer modificaciones a la copia de Greenstone@version.major@, o si solo quiere ver como funciona. </html>
+
+Installing_ImageMagick.displayText=ImageMagick con JPEG2000 (@bundled.version.imagemagick@)
+Installing_ImageMagick.explanatoryText=<html> Greenstone usa ImageMagick para procesar imágenes.<br>\nEsta versión empaquetada de ImageMagick incluye soporte para el formato JPEG2000.<br>Si ya tiene instalado ImageMagick en su computadora, o si no desea <br>incluir imágenes en las colecciones de Greenstone, entonces puede optar por no <br>instalar ImageMagick. </html>
+
+Installing_Ghostscript.displayText=GhostScript (@bundled.version.ghostscript@)
+Installing_Ghostscript.explanatoryText=<html> Greenstone utiliza GhostScript para procesar archivos PDF y PostScript.<br> Si ya tiene instalado Ghostscript, o si no va a incorporar archivos <br>PDF o PostScript a las colecciones de  Greenstone, entonces puede optar por no instalarlo. </html>
+
+Installing_Start_Menu_Shortcuts.displayText=Accesos directos del Menú Inicio
+Installing_Start_Menu_Shortcuts.explanatoryText=Crear accesos a Greenstone@version.major@ en el menú Inicio
+
+Installing_Tomcat.displayText=Apache Tomcat (@bundled.version.tomcat@)
+Installing_Tomcat.explanatoryText=<html> Greenstone3 requiere Apache Tomcat para servir a las colecciones digitales <br> en la web. Si ya tiene instalado Tomcat puede usar dicha instalación (con algunos cambios requeridos), <br> por lo cual puede optar por no instalar este componente. </html>
+
+Installing_Ant.displayText=Apache Ant (@bundled.version.ant@)
+Installing_Ant.explanatoryText=<html> Greenstone3 requiere Apache Ant para iniciar y detener al servidor web Tomcat, para recompilar el código fuente <br> \ y para ejecutar algunas tareas de mantenimiento. Si ya tiene Ant instalado, <br> entonces puede optar por no seleccionar este componente. </html>
+
+### Admin password page
+page.admin-pages.displayText=Páginas de Administración
+admin-expl.displayText=Las páginas de Administración de la interfaz web de Greenstone le permiten administrar la base de usuarios, la cual es necesaria si desea proveer acceso restringido al contenido y/o acceso remoto para la construcción de la colección. Las páginas también dan un acceso sencillo a los archivos de log y permiten editar el archivo 'main.cfg'.
+admin-expl-2.displayText=Desea habilitar las páginas de administración de Greenstone? (Se le solicitará una clave en la siguiente página.) 
+admin-expl-3.displayText=NOTA: Si habilita las páginas de administración, estarán accesibles desde Internet. Por favor, elija una clave segura para protegerlas.
+enable.admin.pages.displayText=Habilitar Páginas de Administración
+
+page.admin-password.displayText=Por favor, configure la clave de Admin
+admin.password.displayText=Clave de Admin
+admin-password-expl.displayText=Para poder acceder a determinadas partes de la interfaz de Greenstone es necesaria una clave. Se creará un usuario con el nombre 'admin' con la clave que haya elegido. La clave debe tener entre 3 y 20 caracteres de longitud.
+
+### Tomcat config page
+page.tomcat-config.displayText=Configuración de Apache Tomcat
+tomcat-config-explanation1.displayText=Greenstone3 usa Apache Tomcat para compartir las bibliotecas digitales.
+tomcat-config-explanation2.displayText=Puede configurar Tomcat aquí o editando el archivo build.properties en la carpeta de inicio de Greenstone3 (${installDir}).
+tomcat.server.displayText=Servidor Tomcat
+tomcat-server.explanatoryText=Por favor, ingrese el nombre del servidor donde estará la biblioteca. Si no está seguro, acepte el valor por defecto (localhost).
+tomcat.port.explanatoryText=Seleccione los puertos que debe usar Tomcat. Por lo general, lo más seguro es aceptar los valores por defecto. Si ya estuviera ejecutando otros servicios en los puertos por defecto, entonces seleccione otros que estén libres. 
+tomcat.port.displayText=Puerto de Tomcat
+tomcat.shutdown.port.displayText=Puerto para shutdown de Tomcat
+
+### Progress page
+page.progress.displayText=Progreso de la instalación
+
+### Uninstaller Strings
+
+uninstaller.greenstone.uninstaller:Desinstalador de Greenstone
+uninstaller.cancel:Cancelar
+uninstaller.uninstall:Desinstalar
+uninstaller.finish:Finalizar
+uninstaller.error:Error
+uninstaller.confirmation:Confirmación
+uninstaller.continue:Continuar
+uninstaller.complete:Completar
+uninstaller.skip:Saltear
+uninstaller.skip.all:Saltear todo
+uninstaller.retry:Reintentar
+uninstaller.readonly:Sólo lectura
+
+uninstaller.will.uninstall.from:Esto desinstalará Greenstone de
+uninstaller.uninstall.options:Opciones de desinstalación:
+uninstaller.keep.collections:Mantener las colecciones
+uninstaller.are.you.sure:Está seguro de que quiere desinstalar Greenstone?
+uninstaller.are.you.sure.collections:Ha seleccionado borrar todas las colecciones.\nPor favor, haga una copia de respaldo de cualquier colección que desee mantener antes de continuar
+uninstaller.failed.to.figure.cd:Fallo al determinar la carpeta actual
+uninstaller.cancelled:Desinstalación cancelada
+uninstaller.finished:Desinstalación finalizada
+uninstaller.deleting:Borrando {file} del disco
+
+uninstaller.info.skipping:INFO: Salteando {file}
+uninstaller.info.no.startmenu:INFO: No se ha encontrado la ruta al Menú Inicio. Borrar el grupo de programas del Menú Inicio no será posible desde esta desinstalación
+uninstaller.warning.readonly:AVISO: {file} parece ser de solo lectura
+uninstaller.warning.couldnt.delete:AVISO: {file} no se puede borrar
+uninstaller.warning.nonexistent:AVISO: {file} no existe
+uninstaller.error.nonexistent:ERROR: {file} no existe
+uninstaller.error.couldnt.find.install.props:ERROR: No se puede encontrar el archivo 'installation.properties' o 'etc/installation.properties'.\nEsta no es una instalación válida de Greenstone o la instalación se ha dañado.\nLa desinstalación no puede continuar
+uninstaller.warning.couldnt.create.flagfile:AVISO: No se puede crear el archivo de marca. Tendrá que borrar manualmente el JRE y los archivos de desinstalación
+
+
+### Ant-Installer Core strings
+
+dirNotExistCreate=La carpeta no existe, quiere crearla?
+dirNotExist=La carpeta no existe
+fileNotExist=El archivo no existe
+dirNotCreated=No se puede crear la carpeta
+canNotCreateFile=No se puede crear el archivo
+appRootInvalid=Esta carpeta no parece ser la raíz de la aplicación
+selectFile=Seleccione el archivo
+selectFolder=Seleccione la carpeta
+browseDotDotDot=Examinar...
+notValidSelection=No es una selección válida
+showDetails=Ver detalles
+
+#Default loading
+promptLoadDefaults=Se encontró la configuración de una instalación. Quiere cargar la configuración existente?
+promptMissingDefaultPassword=No se ha encontrado una clave, pudo haber sido omitida por razones de seguridad. Se cargará el valor por defecto.
+
+click=Click
+toContinue=para continuar
+failed=Falló
+exit=Salir
+complete=Completada
+finished=Finalizada
+extracting=Extrayendo...
+installFinished=Instalación finalizada
+install-cancelled=Instalación cancelada
+running=
+
+backButton=Atrás
+cancelButton=Cancelar
+nextButton=Siguiente
+finishButtonText=Instalar
+
+output=Salida
+errors=Errores
+notCorrectFormat=El campo no es del tipo correcto
+notCorrectPasswordFormat=La clave no es del tipo correcto
+passwordsDoNotMatch=Las claves no coinciden
+installationFailed=Falló la instalación
+propertiesVersionMismatch=Algunas opciones no existen en la versión anterior y deben ingresarse manualmente, continuar?
+
+Finished=Finalizada
+Failed=Falló, ver los mensajes de error
+ant.failure=Falló la ejecución de Ant - examine los archivos de log de errores para más detalles
+
+license.next.text=Aceptar
+license.cancel.text=Rechazar
+
+#text install strings
+_required_=Requerido
+_default_=Por defecto
+true=Verdad
+affirmativeChars=S,V
+licenseAccept=Aceptar la licencia? S o N   [Por defecto\:Y]
+clickViewLicense=Pulsar intro para ver licencia.
+clickViewText=Pulsar intro para continuar.
+enterNumber=Introduzca un nmero.
+fileDoesNotExist=El fichero no existe.
+license_next=Pulse 'S' para ver la siguiente página, pulse cualquier otra tecla para ir al final.
+large_select_next=Pulse 'S' para ver la siguiente pàgina, pulse cualquier otra tecla para ir al final.
+nextChar=S
+availableOptions=Ver opciones disponibles.
Index: /main/branches/stable_gs3/release-kits/shared/core/language-strings/LanguagePack_es_EU.properties
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/language-strings/LanguagePack_es_EU.properties	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/language-strings/LanguagePack_es_EU.properties	(revision 21851)
@@ -0,0 +1,62 @@
+dirNotExistCreate = Direktorioa ez da existitzen, sortu nahi al duzu?
+dirNotExist = Direktorioa ez da existitzen.
+fileNotExist = Fitxategia ez da existitzen.
+dirNotCreated = Ezin izan da direktorioa sortu.
+canNotCreateFile = Fitxategia ezin da sortu.
+appRootInvalid = Ez dirutdi direktorio hay aplikazioaren erroa denik.
+selectFile = Fitxategia aukeratu.
+selectFolder = karpeta aukeratu.
+notValidSelection = Ez da aukera onargarria.
+# browseDotDotDot = 
+showDetails = Erakutsi xehetasunak.
+
+#Default loading
+promptLoadDefaults = Instalazio konfigurazio bat aurkituta. Kargatu instalazioa?
+promptMissingDefaultPassword = A password was not found it may have been omitted for security reasons, it will be set to the default.
+
+click = Sakatu
+toContinue = Jarraitzeko
+failed = Hutsegitea
+exit = Atera
+complete = Bukatu
+finished = Bukatuta
+extracting = Ateratzen...
+installFinished = Instalazioa bukatuta.
+# install-cancelled = 
+running = Exekutatzen:
+
+backButton = Atzera
+cancelButton = Ezeztatu
+nextButton = Hurrengoa
+# finishButtonText = 
+
+output = Irteera
+errors = Akatsak
+notCorrectFormat = Fitxategia ez da formatu egokikoa.
+notCorrectPasswordFormat = Fitxategia ez da formatu egokikoa.
+passwordsDoNotMatch = Pasa hitzak berdinak izan behar dira 
+installationFailed = Instalaciòn fallado
+propertiesVersionMismatch = Faltan datos del versión anterior, continuar y entrar los manualmente?
+
+Finished = Bukatuta
+Failed = Huts egin da, erakutsi akats mezuak
+ant.failure = Ant run failed - examine the error logs for details
+
+license.next.text = Aceptar
+license.cancel.text = Cancellar
+
+
+#text install strings
+_required_=Beharrezkoa
+_default_=Lehenetsia
+true=Egia
+affirmativeChars=E,B
+licenseAccept=Baimena onartzen duzu? E,B edo N   [Lehenetsia\:Y]
+clickViewLicense=Sakatu hemen baimena ikusteko.
+clickViewText=Pulsar intro para continuar.
+enterNumber=Sartu zenbaki bat.
+fileDoesNotExist=Fitztegia ez da existitzen.
+license_next=Sakatu 'N' hurrengo horrialdea ikusteko, sakatu beste edozer gauza bukaerara joateko.
+large_select_next=Sakatu 'N' hurrengo horrialdea ikusteko, sakatu beste edozer gauza bukaerara joateko.
+nextChar=N
+availableOptions=ikusi aukerak
Index: /main/branches/stable_gs3/release-kits/shared/core/language-strings/LanguagePack_fr.properties
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/language-strings/LanguagePack_fr.properties	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/language-strings/LanguagePack_fr.properties	(revision 21851)
@@ -0,0 +1,195 @@
+### Language page ###
+page.language-selector.displayText=Langue
+language-selector-explanation.displayText=Veuillez sÃ©lectionner la langue de lâinstallation.
+# (Note: This installer has not been fully translated into all these languages yet)
+
+
+### Intro Page ###
+page.intro.displayText=Greenstone @version@ installer
+welcome-message.displayText=Greenstone@version.major@ est un programme qui permet la crÃ©ation et la diffusion de bibliothÃšques numÃ©riques.\n\nCet assistant d'installation contient Greenstone, avec des outils pour hÃ©berger vos bibliothÃšques numÃ©riques (Apache2.2 pour Linux/MacOS, "Greenstone Library Server" pour Windows), des outils de conversion d'images (ImageMagick), ainsi que des logiciels tiers nÃ©cessaires afin de gÃ©rer les documents pdf et postscript (GhostScript - pour Windows et MacOS seulement).
+welcome-greenstone3.displayText=Greenstone@version.major@ est un programme qui permet la crÃ©ation et la diffusion de bibliothÃšques numÃ©riques.
+
+## License page ###
+page.license.displayText=Licence
+
+
+### Destination page ###
+page.destination.displayText=RÃ©pertoire d'installation
+installDir.displayText=Veuillez sÃ©lectionner un rÃ©pertoire d'installation
+
+
+### InstallShield install detected page ###
+page.dontBudge.displayText=Ancienne version dÃ©tectÃ©e
+is-install-detected.displayText=Une installation de Greenstone2 plus ancienne que la version 2.81, ou une installation de Greenstone3 plus ancienne que la version 3.04, a Ã©tÃ© dÃ©tectÃ©e dans le rÃ©pertoire sÃ©lectionnÃ©. L'installation ne peut pas se poursuivre dans ce rÃ©pertoire.\n\nIl est vivement recommandÃ© de quitter cet installeur, dÃ©sinstaller l'ancienne version de Greenstone, puis recommencer cette installation. Autrement, vous pouvez retourner sur la page prÃ©cÃ©dente et sÃ©lectionner un rÃ©pertoire d'installation diffÃ©rent.
+
+
+### Components Page ###
+# (Note: in the html here, we must use '<br>' for breaklines.
+# '<br/>' and other variations are not recognised.)
+page.selector.displayText=Composants
+choose-components.displayText=Veuillez choisir les composants que vous souhaitez installer
+
+Looking_For_Previous_Installation.displayText=Recherche l'existence dâune installation prÃ©cÃ©dente
+Looking_For_Previous_Installation.explanatoryText=S'il s'agit d'une rÃ©installation, charge quelques propriÃ©tÃ©s de l'installation existante afin d'aider au processus de rÃ©installation.
+
+Installing_Core_System.displayText=Composant de base
+Installing_Core_System.explanatoryText=<html>Ceci est le systÃšme central de Greenstone@version.major@. Il s'agit dâun composant obligatoire. </html>
+
+Installing_Source_Code_Core.displayText=Code Source du Noyau
+Installing_Source_Code_Core.explanatoryText=<html>Ceci est le code source du noyau de Greenstone@version.major@. Ce composant inclue tous les fichiers accompagnant le code source gÃ©nÃ©ral.</html>
+
+Installing_Source_Code.displayText=Code Source GÃ©nÃ©ral
+Installing_Source_Code.explanatoryText=<html>Installez le code source gÃ©nÃ©ral si vous souhaitez compiler Greenstone@version.major@ par vous mÃªme, si vous souhaitez y apporter des modifications, <br>ou si vous souhaitez simplement savoir comment tout fonctionne.</html>
+
+Installing_ImageMagick.displayText=ImageMagick avec JPEG2000 (@bundled.version.imagemagick@)
+Installing_ImageMagick.explanatoryText=<html>Greenstone utilise ImageMagick pour gÃ©rer les fichiers image.<br>La version d'ImageMagick inclue dans cet installeur ajoute le support du format d'image JPEG2000.<br>Si vous avez ImageMagick dÃ©jÃ  installÃ© sur votre ordinateur,<br>ou si vous ne souhaitez pas inclure d'image dans vos collections Greenstone,<br>alors vous pouvez choisir de ne pas installer ImageMagick.</html>
+
+Installing_Ghostscript.displayText=GhostScript (@bundled.version.ghostscript@)
+Installing_Ghostscript.explanatoryText=<html>Greenstone utilise GhostScript pour gÃ©rer les fichiers PDF et PostScript.<br>Si vous avez Ghostscript dÃ©jÃ  installÃ© sur votre ordinateur, ou si vous ne souhaitez pas inclure ce type de fichiers dans vos collections Greenstone,<br>alors vous pouvez choisir de ne pas installer Ghostscript. </html>
+
+Installing_Start_Menu_Shortcuts.displayText=Raccourcis du Menu DÃ©marrer
+Installing_Start_Menu_Shortcuts.explanatoryText=CrÃ©e des raccourcis pour Greenstone@version.major@ dans votre menu DÃ©marrer
+
+Installing_Tomcat.displayText=Apache Tomcat (@bundled.version.tomcat@)
+Installing_Tomcat.explanatoryText=<html> Greenstone3 nÃ©cessite le serveur web Apache Tomcat afin d'hÃ©berger vos bibliothÃšques numÃ©riques<br>sur Internet. Si vous avez une installation existante de Tomcat, vous pouvez l'utiliser<br>(avec quelques changements de configuration). Dans ce cas vous pouvez choisir de ne pas installer ce composant.</html>
+
+Installing_Ant.displayText=Apache Ant (@bundled.version.ant@)
+Installing_Ant.explanatoryText=<html> Greenstone3 nÃ©cessite Apache Ant pour dÃ©marrer ou arrÃªter le serveur web Tomcat, pour recompiler <br>le code source, et pour rÃ©aliser quelques tÃ¢ches de maintenance. Si Ant est dÃ©jÃ  installÃ©, <br>vous pouvez alors choisir de ne pas installer ce composant.</html>
+
+Installing_Documented_Examples.displayText=Collections de DÃ©monstration ExpliquÃ©es
+Installing_Documented_Examples.explanatoryText=Une sÃ©rie de collections de dÃ©monstration, dont les pages 'Ã  propos' dÃ©crivent comment elles ont Ã©tÃ© crÃ©Ã©s.\n\nMÃªme si vous ne souhaitez pas installer les Collections de DÃ©monstration ExpliquÃ©es tout de suite, vous pourrez les tÃ©lÃ©charger depuis\nhttp://www.greenstone.org/ ou les obtenir Ã  partir d'un CD-ROM Greenstone.
+
+
+### Admin password page
+
+page.admin-pages.displayText=Interface d'Administration
+admin-expl.displayText=L'interface d'administration de Greenstone vous permet de gÃ©rer une base de donnÃ©e d'utilisateurs,\nce qui est requis si vous souhaitez mettre en place une connexion Ã  distance vers Greenstone. Elle permet Ã©galement la lecture des fichiers de registre (log) ainsi que d'Ã©diter facilement le fichier de configuration principal 'main.cfg'.
+admin-expl-2.displayText=Voulez-vous activer l'interface d'administration de Greenstone? (La crÃ©ation d'un mot de passe vous sera demandÃ©e lors de l'Ã©tape suivante.)
+admin-expl-3.displayText=ATTENTION: Si vous activez l'interface d'administration, il se pourrait qu'elle devienne accessible depuis l'Internet. Il est donc trÃšs important de choisir un mot de passe sÃ©curisÃ©.
+enable.admin.pages.displayText=Activer l'interface d'Administration
+
+page.admin-password.displayText=Veuillez crÃ©er un mot de passe Administrateur
+admin-password-expl.displayText=Afin d'accÃ©der Ã  certaines parties de l'interface de Greenstone vous avez besoin d'un mot de passe. Un utilisateur avec le nom 'admin' sera crÃ©Ã© avec le mot de passe que vous aurez choisi. Ce mot de passe doit contenir entre 3 et 20 caractÃšres.
+admin.password.displayText=Mot de passe Admin
+
+
+
+
+### Tomcat config page
+page.tomcat-config.displayText=Configuration d'Apache Tomcat
+tomcat-config-explanation1.displayText=Greenstone3 nÃ©cessite le serveur web Apache Tomcat afin d'hÃ©berger vos bibliothÃšques numÃ©riques.
+tomcat-config-explanation2.displayText=Vous pouvez soit configurer Tomcat ici, soit Ã©diter le fichier build.properties qui se situe dans le rÃ©pertoire d'installation de Greenstone3 (${installDir}).
+tomcat.server.displayText=Nom du Serveur Tomcat
+tomcat-server.explanatoryText=Veuillez entrer le nom du serveur sur lequel la bibliothÃšque sera hÃ©bergÃ©e. Si vous ne le connaissez pas, alors laissez le nom par dÃ©faut (localhost).
+tomcat.port.explanatoryText=Veuillez choisir les ports que Tomcat devra utiliser. Il est gÃ©nÃ©ralement recommandÃ© de laisser les valeurs par dÃ©faut. Si vous avez dÃ©jÃ  des services qui utilisent ces ports, veuillez alors en choisir des libres.
+tomcat.port.displayText=Port d'Ã©coute
+tomcat.shutdown.port.displayText=Port de fermeture
+
+### Progress page
+page.progress.displayText=Progression de l'installation
+
+### Uninstaller Strings
+
+uninstaller.greenstone.uninstaller=DÃ©sinstallation de Greenstone
+uninstaller.cancel=Annuler
+uninstaller.uninstall=DÃ©sinstaller
+uninstaller.finish=Finir
+uninstaller.error=Erreur
+uninstaller.confirmation=Confirmation
+uninstaller.continue=Continuer
+uninstaller.complete=Complet
+uninstaller.skip=Ignorer
+uninstaller.skip.all=Toujours Ignorer
+uninstaller.retry=RÃ©essayer
+uninstaller.readonly=Lecture seule
+
+uninstaller.will.uninstall.from=Ceci va dÃ©sinstaller l'installation de Greenstone suivante
+uninstaller.uninstall.options=Options de DÃ©sinstallation:
+uninstaller.keep.collections=Garder les Collections
+uninstaller.are.you.sure=Etes vous certain(e) de vouloir dÃ©sinstaller Greenstone ?
+uninstaller.are.you.sure.collections=Vous avez choisi de dÃ©sinstaller vos collections.\nveuillez sauvegarder vos collections si vous souhaitez les conserver avant de continuer.
+uninstaller.failed.to.figure.cd=Le rÃ©pertoire courant n'a pas Ã©tÃ© dÃ©tectÃ©
+uninstaller.cancelled=DÃ©sinstallation annulÃ©e
+uninstaller.finished=DÃ©sinstallation terminÃ©e
+uninstaller.deleting=Supprime {file}
+
+uninstaller.info.skipping=INFO: Ignore {file}
+uninstaller.info.no.startmenu=INFO: Aucun chemin vers le menu dÃ©marrÃ© nâa Ã©tÃ© dÃ©tectÃ©. Par consÃ©quent, les entrÃ©es du menu dÃ©marrer ne seront pas dÃ©sinstallÃ©es
+uninstaller.warning.readonly=ATTENTION: Le fichier {file} est en lecture seule
+uninstaller.warning.couldnt.delete=ATTENTION: le fichier {file} nâa pas Ã©tÃ© supprimÃ©
+uninstaller.warning.nonexistent=ATTENTION: le fichier {file} n'existe pas
+uninstaller.error.nonexistent=ERREUR: le fichier {file} n'existe pas
+uninstaller.error.couldnt.find.install.props=ERREUR: Impossible de trouver le fichier 'installation.properties' ou 'etc/installation.properties'.\nSoit il ne s'agit pas d'une installation de Greenstone valide, soit l'installation a Ã©tÃ© corrompue.\nLa dÃ©sinstallation ne peut pas se poursuivre.
+uninstaller.warning.couldnt.create.flagfile=ATTENTION: Impossible de crÃ©er le fichier marqueur. Vous devrez supprimer les derniers fichiers dans le rÃ©pertoire d'installation manuellement.
+
+
+### Ant-Installer Core strings
+
+dirNotExistCreate=Ce rÃ©pertoire n'existe pas, souhaitez-vous le crÃ©er maintenant ?
+dirNotExist=Ce rÃ©pertoire n'existe pas
+fileNotExist=Ce fichier n'existe pas
+dirNotCreated=Ce rÃ©pertoire ne peut pas Ãªtre crÃ©Ã© Ã  cet emplacement
+canNotCreateFile=Impossible de crÃ©er le fichier
+appRootInvalid=Ce rÃ©pertoire n'est pas la racine de cette application
+selectFile=SÃ©lectionner ce fichier
+selectFolder=SÃ©lectionner ce rÃ©pertoire
+browseDotDotDot=Parcourir...
+notValidSelection=Ceci n'est pas une sÃ©lection valide
+showDetails=Montrer plus de dÃ©tails
+
+#Default loading
+promptLoadDefaults=Configuration d'installation trouvÃ©e. Charger cette prÃ©sente configuration?
+promptMissingDefaultPassword=Un mot de passe n'a pas Ã©tÃ© trouvÃ©, il a peut Ãªtre Ã©tÃ© omis pour des raisons de sÃ©curitÃ©. Il sera remis Ã  sa valeur par dÃ©faut.
+
+click=Cliquer
+toContinue=pour continuer
+failed=Interrompue
+exit=Quitter
+complete=Complet
+finished=TerminÃ©
+extracting=DÃ©compression...
+installFinished=Installation TerminÃ©e
+install-cancelled=Installation AnnulÃ©e
+running=
+
+backButton=PrÃ©cÃ©dent
+cancelButton=Annuler
+nextButton=Suivant
+finishButtonText=Installer
+
+output=DÃ©tail de l'installation
+errors=Erreur(s)
+notCorrectFormat=Ce champ n'est pas complÃ©tÃ© dans un format valide
+notCorrectPasswordFormat=Ce mot de passe n'est pas valide
+passwordsDoNotMatch=Les mots de passe ne correspondent pas
+installationFailed=Installation Interrompue
+propertiesVersionMismatch=Quelques options sont manquantes depuis la version prÃ©cÃ©dente et doivent Ãªtre entrÃ©es manuellement, continuer ?
+
+Finished=TerminÃ©
+Failed=Installation Interrompue, veuillez voir les messages d'erreur.
+ant.failure=Le lancement de Ant a pose problÃšme â veuillez examiner le fichier de registre (log) pour plus de dÃ©tails.
+
+license.next.text=Accepter
+license.cancel.text=Refuser
+
+#text install strings
+_required_=obligatoire  
+_default_=dÃ©faut  
+true=vrai  
+#The value of 'affirmativeChars' comes from the first letters of "True" and "Yes"
+affirmativeChars=V,O  
+#The value of 'negativeChars' comes from the first letters of "False" and "No"
+negativeChars=F,N
+licenseAccept=Acceptez-vous la licence ? O ou N [dÃ©faut\: O]  
+clickViewLicense=Appuyer sur la touche EntrÃ©e pour afficher la licence  
+clickViewText=Appuyer sur  la touche EntrÃ©e pour continuer  
+enterNumber=Entrez un chiffre  
+fileDoesNotExist=Le Ficher n'existe pas  
+#The value of backChar is the first letter "Back"
+backChar=P
+#The value of nextChar is the first letter "Next"
+nextChar=S  
+#In the next two properties, 'N' should be replaced the value of the 'nextChar' property
+license_next=Tapez 'S' pour la page suivante, entrez tout autre caractÃšre pour aller Ã  la fin  
+large_select_next=Tapez 'S' pour la page suivante, entrez tout autre caractÃšre pour aller Ã  la fin  
+availableOptions=Afficher les options disponibles  
Index: /main/branches/stable_gs3/release-kits/shared/core/language-strings/LanguagePack_ru.properties
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/language-strings/LanguagePack_ru.properties	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/language-strings/LanguagePack_ru.properties	(revision 21851)
@@ -0,0 +1,218 @@
+### Language page ###
+page.language-selector.displayText=Ð¯Ð·ÑÐº
+language-selector-explanation.displayText=ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, Ð²ÑÐ±ÐµÑÐžÑÐµ ÐœÑÐ¶ÐœÑÐ¹ ÑÐ·ÑÐº
+# (Note: This installer has not been fully translated into all these languages yet)
+
+
+### Intro Page ###
+page.intro.displayText=ÐÑÐŸÐ³ÑÐ°ÐŒÐŒÐ° ÑÑÑÐ°ÐœÐŸÐ²ÐºÐž Greenstone @version@
+welcome-message.displayText=Greenstone@version.major@ - ÑÑÐŸ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ° ÐŽÐ»Ñ ÑÐŸÐ·ÐŽÐ°ÐœÐžÑ Ðž ÐŸÐ±ÐŒÐµÐœÐ° ÑÐ»ÐµÐºÑÑÐŸÐœÐœÑÐŒÐž Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐ°ÐŒÐž.\n\nÐ ÐµÐºÐŸÐŒÐµÐœÐŽÑÐµÐŒ ÑÐŽÐ°Ð»ÐžÑÑ Ð»ÑÐ±ÑÐµ Ð¿ÑÐµÐŽÑÐŽÑÑÐžÐµ ÑÑÑÐ°ÐœÐŸÐ²ÐºÐž Greenstone@version.major@ Ð¿ÐµÑÐµÐŽ Ð·Ð°Ð¿ÑÑÐºÐŸÐŒ ÑÑÐŸÐ¹ ÑÑÑÐ°ÐœÐŸÐ²ÐŸÑÐœÐŸÐ¹ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÑ.
+
+## License page ###
+page.license.displayText=ÐÐžÑÐµÐœÐ·ÐžÑ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÑ
+
+
+### Destination page ###
+page.destination.displayText=ÐÐ°Ð¿ÐºÐ° ÑÑÑÐ°ÐœÐŸÐ²ÐºÐž
+installDir.displayText=ÐÑÐ±ÐµÑÐžÑÐµ Ð¿Ð°Ð¿ÐºÑ ÑÑÑÐ°ÐœÐŸÐ²ÐºÐž
+
+
+### InstallShield install detected page ###
+page.dontBudge.displayText=ÐÐ±ÐœÐ°ÑÑÐ¶ÐµÐœÐ° Ð¿ÑÐµÐŽÑÐŽÑÑÐ°Ñ ÑÑÑÐ°ÐœÐŸÐ²ÐºÐ°
+is-install-detected.displayText=ÐÑ ÐŸÐ±ÐœÐ°ÑÑÐ¶ÐžÐ»Ðž, ÑÑÐŸ Ð² Ð²ÑÐ±ÑÐ°ÐœÐœÐŸÐ¹ Ð¿Ð°Ð¿ÐºÐµ ÑÐ¶Ðµ ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœ Greenstone2 Ð²ÐµÑÑÐžÐž ÐœÐžÐ¶Ðµ ÑÐµÐŒ 2.81, ÐžÐ»Ðž Greenstone3 Ð²ÐµÑÑÐžÐž ÐœÐžÐ¶Ðµ ÑÐµÐŒ 3.04. ÐÐŸÑÑÐŸÐŒÑ ÑÑÐ° ÑÑÑÐ°ÐœÐŸÐ²ÐºÐ° Ð² ÑÐŸÐ¹ Ð¶Ðµ Ð¿Ð°Ð¿ÐºÐµ ÐŸÑÑÑÐµÑÑÐ²ÐžÑÑ ÐœÐµÐ»ÑÐ·Ñ. \n\nÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, Ð²ÑÐ¹ÐŽÐµÑÐµ ÐžÐ· ÑÑÐŸÐ¹ ÑÑÑÐ°ÐœÐŸÐ²ÐŸÑÐœÐŸÐ¹ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÑ, Ð·Ð°ÑÐµÐŒ ÑÐŽÐ°Ð»ÐžÑÐµ Ð²ÑÐµ ÑÑÑÐµÑÑÐ²ÑÑÑÐžÐµ Ð²ÐµÑÑÐžÐž Greenstone Ðž Ð¿ÐµÑÐµÐ·Ð°Ð¿ÑÑÑÐžÑÐµ ÑÑÑ ÑÑÑÐ°ÐœÐŸÐ²ÐºÑ  (ÑÐµÐºÐŸÐŒÐµÐœÐŽÑÐµÑÑÑ). ÐÐ»Ðž, Ð²ÐµÑÐœÑÑÐµÑÑ ÐœÐ° Ð¿ÑÐµÐŽÑÐŽÑÑÑÑ ÑÑÑÐ°ÐœÐžÑÑ Ðž Ð²ÑÐ±ÐµÑÐžÑÐµ ÐŽÑÑÐ³ÑÑ Ð¿Ð°Ð¿ÐºÑ ÐŽÐ»Ñ ÑÑÐŸÐ¹ ÑÑÑÐ°ÐœÐŸÐ²ÐºÐž.
+
+
+### Components Page ###
+# (Note: in the html here, we must use '<br>' for breaklines.
+# '<br/>' and other variations are not recognised.)
+page.selector.displayText=ÐÐŸÐŒÐ¿ÐŸÐœÐµÐœÑÑ
+choose-components.displayText=ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, Ð²ÑÐ±ÐµÑÐžÑÐµ ÐºÐ°ÐºÐžÐµ ÐºÐŸÐŒÐ¿ÐŸÐœÐµÐœÑÑ Ð²Ñ Ñ
+ÐŸÑÐµÐ»Ðž Ð±Ñ ÑÑÑÐ°ÐœÐŸÐ²ÐžÑÑ
+
+Looking_For_Previous_Installation.displayText=ÐÐŸÐžÑÐº Ð¿ÑÐµÐŽÑÐŽÑÑÐžÐ¹ ÑÑÑÐ°ÐœÐŸÐ²ÐŸÐº
+Looking_For_Previous_Installation.explanatoryText=ÐÑÐ»Ðž ÑÑÐŸ Ð¿ÐµÑÐµÑÑÑÐ°ÐœÐŸÐ²ÐºÐ°, Ð·Ð°Ð³ÑÑÐ·ÐžÑÐµ ÑÐ²ÐŸÐ¹ÑÑÐ²Ð° Ð¿ÑÐµÐŽÑÐŽÑÑÐžÐ¹ ÑÑÑÐ°ÐœÐŸÐ²ÐŸÐº, ÑÑÐŸÐ±Ñ Ð¿ÐŸÐŒÐŸÑÑ Ð² ÑÑÐŸÐ¹ ÑÑÑÐ°ÐœÐŸÐ²ÐºÐµ.
+
+Installing_Core_System.displayText=ÐÑÐœÐŸÐ²ÐœÐ°Ñ ÑÐžÑÑÐµÐŒÐ°
+Installing_Core_System.explanatoryText=<html> Ð­ÑÐŸ ÑÐŽÑÐŸ ÑÐžÑÑÐµÐŒÑ Greenstone@version.major@. Ð­ÑÐŸ ÐœÐµÐŸÐ±Ñ
+ÐŸÐŽÐžÐŒÑÐ¹ ÐºÐŸÐŒÐ¿ÐŸÐœÐµÐœÑ. </html>
+
+Installing_Source_Code_Core.displayText=ÐÑÐœÐŸÐ²ÐœÐŸÐ¹ ÐžÑÑ
+ÐŸÐŽÐœÑÐ¹ ÐºÐŸÐŽ
+Installing_Source_Code_Core.explanatoryText=<html> Ð­ÑÐŸ ÐŸÑÐœÐŸÐ²ÐœÐŸÐ¹ ÐºÐŸÐŽ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÑ Greenstone@version.major@. <br>\nÐ¡ÑÐŽÐ° ÑÐ°ÐºÐ¶Ðµ Ð²ÐºÐ»ÑÑÐµÐœÑ ÑÐŸÐ¿ÑÐŸÐ²ÐŸÐ¶ÐŽÐ°ÑÑÐžÐµ ÑÐ°Ð¹Ð»Ñ. </html>
+
+Installing_Source_Code.displayText=ÐÑÑ
+ÐŸÐŽÐœÑÐ¹ ÐºÐŸÐŽ
+Installing_Source_Code.explanatoryText=<html> Ð£ÑÑÐ°ÐœÐŸÐ²ÐžÑÐµ ÐžÑÑ
+ÐŸÐŽÐœÑÐ¹ ÐºÐŸÐŽ ÐµÑÐ»Ðž ÐÑ Ñ
+ÐŸÑÐžÑÐµ ÑÐ°ÐŒÐž ÑÐºÐŸÐŒÐ¿ÐžÐ»ÐžÑÐŸÐ²Ð°ÑÑ Greenstone@version.major@, <br>\nÐžÐ»Ðž Ð²ÐœÐµÑÑÐž ÐžÐ·ÐŒÐµÐœÐµÐœÐžÑ Ð² Ð²Ð°ÑÑ ÐºÐŸÐ¿ÐžÑ Greenstone@version.major@, ÐžÐ»Ðž ÐµÑÐ»Ðž<br>\nÐ²Ñ Ð¿ÑÐŸÑÑÐŸ Ñ
+ÐŸÑÐžÑÐµ Ð¿ÐŸÑÐŒÐŸÑÑÐµÑÑ, ÐºÐ°Ðº ÑÑÑÑÐŸÐµÐœÐ° ÑÑÐ° Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ°. </html>
+
+Installing_ImageMagick.displayText=ImageMagick Ñ JPEG2000 (@bundled.version.imagemagick@)
+Installing_ImageMagick.explanatoryText=<html> Greenstone ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑ ImageMagick ÐŽÐ»Ñ ÐŸÐ±ÑÐ°Ð±ÐŸÑÐºÐž ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐ¹.<br>\nÐÐºÐ»ÑÑÐµÐœÐœÐ°Ñ Ð²ÐµÑÑÐžÑ ImageMagick Ð¿ÐŸÐŽÐŽÐµÑÐ¶ÐžÐ²Ð°ÐµÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ ÑÐŸÑÐŒÐ°ÑÐ° JPEG2000 <br>ÐÑÐ»Ðž ÐœÐ° ÐÐ°ÑÐµÐŒ ÐºÐŸÐŒÐ¿ÑÑÑÐµÑÐµ ÑÐ¶Ðµ ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœ ImageMagick, ÐžÐ»Ðž ÐµÑÐ»Ðž ÐÑ ÐœÐµ Ñ
+ÐŸÑÐžÑÐµ <br>Ð²ÐºÐ»ÑÑÐ°ÑÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ Ð² ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž Greenstone, ÑÐŸ Ð²Ñ ÐŒÐŸÐ¶ÐµÑÐµ ÐœÐµ <br> ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐžÐ²Ð°ÑÑ ImageMagick. </html>
+
+Installing_Ghostscript.displayText=GhostScript (@bundled.version.ghostscript@)
+Installing_Ghostscript.explanatoryText=<html> Greenstone ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑ GhostScript ÐŽÐ»Ñ ÐŸÐ±ÑÐ°Ð±ÐŸÑÐºÐž ÑÐ°Ð¹Ð»ÐŸÐ² PDF Ðž PostScript.<br> ÐÑÐ»Ðž ÐœÐ° Ð²Ð°ÑÐµÐŒ ÐºÐŸÐŒÐ¿ÑÑÑÐµÑÐµ ÑÐ¶Ðµ ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœ Ghostscript, ÐžÐ»Ðž ÐµÑÐ»Ðž ÐÑ ÐœÐµ Ñ
+ÐŸÑÐžÑÐµ <br>Ð²ÐºÐ»ÑÑÐ°ÑÑ PDF ÐžÐ»Ðž PostScript ÑÐ°Ð¹Ð»Ñ Ð² ÐºÐŸÐ»ÐµÐºÑÐžÐž Greenstone, ÑÐŸ Ð²Ñ ÐŒÐŸÐ¶ÐµÑÐµ ÐœÐµ <br>ÑÑÑÐ°ÐœÐ°Ð²Ð»ÐžÐ²Ð°ÑÑ Ghostscript. </html>
+
+Installing_Start_Menu_Shortcuts.displayText=ÐÐµÐœÑ "ÐÑÑÐº"
+Installing_Start_Menu_Shortcuts.explanatoryText=Ð¡ÐŸÐ·ÐŽÐ°ÑÑ ÑÑÐ»ÑÐºÐž Greenstone@version.major@ Ð² ÐŒÐµÐœÑ "ÐÑÑÐº"
+
+Installing_Tomcat.displayText=Apache Tomcat (@bundled.version.tomcat@)
+Installing_Tomcat.explanatoryText=<html> Greenstone3 ÑÑÐµÐ±ÑÐµÑ Ð²ÐµÐ±-ÑÐµÑÐ²ÐµÑ Apache Tomcat ÐŽÐ»Ñ ÐŸÐ±ÑÐ»ÑÐ¶ÐžÐ²Ð°ÐœÐžÑ Ð²Ð°ÑÐµÐ¹ ÑÐ»ÐµÐºÑÑÐŸÐœÐœÐŸÐ¹ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐž Ð² <br> ÐÐœÑÐµÑÐœÐµÑÐµ. ÐÑÐ»Ðž Ñ Ð²Ð°Ñ ÑÐ¶Ðµ ÐµÑÑÑ ÑÑÑÐ°ÐœÐŸÐ²ÐºÐ° Tomcat, Ð²Ñ ÐŒÐŸÐ¶ÐµÑÐµ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ ÐµÐµ <br>  (Ð¿ÐŸÑÑÐµÐ±ÑÐµÑÑÑ ÐœÐµÐºÐŸÑÐŸÑÑÐµ ÐºÐŸÐœÑÐžÐ³ÑÑÐ°ÑÐžÐž), ÑÐŸÐ³ÐŽÐ° Ð²Ñ ÐŒÐŸÐ¶ÐµÑÐµ Ð±ÐµÐ·Ð±ÐŸÐ»ÐµÐ·ÐœÐµÐœÐœÐŸ ÐŸÑÐºÐ°Ð·Ð°ÑÑÑÑ ÐŸÑ ÑÑÑÐ°ÐœÐŸÐ²ÐºÐž ÑÑÐŸÐ³ÐŸ ÐºÐŸÐŒÐ¿ÐŸÐœÐµÐœÑÐ°. </html>
+
+Installing_Ant.displayText=Apache Ant (@bundled.version.ant@)
+Installing_Ant.explanatoryText=<html> Greenstone3 ÑÑÐµÐ±ÑÐµÑ Apache Ant ÐŽÐ»Ñ Ð·Ð°Ð¿ÑÑÐºÐ° Ðž ÐŸÑÑÐ°ÐœÐŸÐ²ÐºÐž Ð²ÐµÐ±-ÑÐµÑÐ²ÐµÑÐ° Tomcat, Ð¿ÐµÑÐµÐºÐŸÐŒÐ¿ÐžÐ»ÐžÑÐŸÐ²Ð°ÐœÐžÑ <br> ÐžÑÑ
+ÐŸÐŽÐœÐŸÐ³ÐŸ ÐºÐŸÐŽÐ°, Ð° ÑÐ°ÐºÐ¶Ðµ ÐŽÐ»Ñ ÐœÐµÐºÐŸÑÐŸÑÑÑ
+ Ð·Ð°ÐŽÐ°Ñ ÑÐµÑ
+ÐœÐžÑÐµÑÐºÐŸÐ³ÐŸ ÐŸÐ±ÑÐ»ÑÐ¶ÐžÐ²Ð°ÐœÐžÑ. ÐÑÐ»Ðž Ñ Ð²Ð°Ñ ÑÐ¶Ðµ ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœ Ant, <br> ÐÑ ÑÐŒÐµÐ»ÐŸ ÐŒÐŸÐ¶ÐµÑÐµ ÐŸÑÐºÐ°Ð·Ð°ÑÑÑÑ ÐŸÑ ÑÑÑÐ°ÐœÐŸÐ²ÐºÐž ÑÑÐŸÐ³ÐŸ ÐºÐŸÐŒÐ¿ÐŸÐœÐµÐœÑÐ°.  </HTML>
+
+### Admin password page
+
+
+page.admin-pages.displayText=Ð¡ÑÑÐ°ÐœÐžÑÑ ÐÐŽÐŒÐžÐœÐžÑÑÑÐžÑÐŸÐ²Ð°ÐœÐžÑ  
+admin-expl.displayText=ÐÐŽÐŒÐžÐœÐžÑÑÑÐ°ÑÐžÐ²ÐœÑÐµ ÑÑÑÐ°ÐœÐžÑÑ ÐžÐœÑÐµÑÑÐµÐ¹ÑÐ° ÐÑÐžÐœÑÑÐŸÑÐœ Ð¿ÐŸÐ·Ð²ÐŸÐ»ÑÑÑ ÐÐ°ÐŒ ÑÐ¿ÑÐ°Ð²Ð»ÑÑÑ Ð¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÐµÐ»ÑÑÐºÐžÐŒÐž Ð±Ð°Ð·Ð°ÐŒÐž ÐŽÐ°ÐœÐœÑÑ
+, ÑÑÐŸ ÐœÐµÐŸÐ±Ñ
+ÐŸÐŽÐžÐŒÐŸ ÐŽÐ»Ñ ÑÐŽÐ°Ð»ÐµÐœÐœÐŸÐ³ÐŸ Ð°ÐŽÐŒÐžÐœÐžÑÑÑÐžÑÐŸÐ²Ð°ÐœÐžÑ ÐÑÐžÐœÑÑÐŸÑÐœ. ÐÐœÐž ÑÐ°ÐºÐ¶Ðµ Ð¿ÑÐµÐŽÐŸÑÑÐ°Ð²Ð»ÑÑÑ Ð»ÐµÐ³ÐºÐžÐ¹ Ð¿ÑÑÑ Ð¿ÑÐŸÑÐŒÐŸÑÑÐ° log ÑÐ°Ð¹Ð»ÐŸÐ² Ðž ÑÐµÐŽÐ°ÐºÑÐžÑÐŸÐ²Ð°ÐœÐžÑ ÑÐ°Ð¹Ð»Ð° 'main.cfg'.  
+admin-expl-2.displayText=Ð¥ÐŸÑÐµÐ»ÐŸÑÑ Ð±Ñ ÐÐ°ÐŒ Ð²ÐºÐ»ÑÑÐžÑÑ Ð°ÐŽÐŒÐžÐœÐžÑÑÑÐ°ÑÐžÐ²ÐœÑÐµ ÑÑÑÐ°ÐœÐžÑÑ ÐÑÐžÐœÑÑÐŸÑÐœ? (ÐÐ° ÑÐ»ÐµÐŽÑÑÑÐµÐ¹ ÑÑÑÐ°ÐœÐžÑÐµ Ð±ÑÐŽÐµÑ Ð·Ð°Ð¿ÑÐ°ÑÐžÐ²Ð°ÑÑÑÑ Ð¿Ð°ÑÐŸÐ»Ñ.)  
+admin-expl-3.displayText=ÐÐ ÐÐÐÐ§ÐÐÐÐ: ÐÑÐ»Ðž Ð²Ñ Ð²ÐºÐ»ÑÑÐžÑÐµ Ð°ÐŽÐŒÐžÐœÐžÑÑÑÐ°ÑÐžÐ²ÐœÑÐµ ÑÑÑÐ°ÐœÐžÑÑ, ÐŸÐœÐž ÐŒÐŸÐ³ÑÑ Ð±ÑÑÑ ÐŽÐŸÑÑÑÐ¿ÐœÑÐŒÐž ÐžÐ· ÐÐœÑÐµÑÐœÐµÑ. ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ° Ð²ÑÐ±ÐµÑÐžÑÐµ Ð±ÐµÐ·ÐŸÐ¿Ð°ÑÐœÑÐ¹ Ð¿Ð°ÑÐŸÐ»Ñ ÐŽÐ»Ñ Ð·Ð°ÑÐžÑÑ ÐÐ°ÑÐžÑ
+ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐ¹.  
+enable.admin.pages.displayText=ÐÐºÐ»ÑÑÐžÑÑ ÑÑÑÐ°ÐœÐžÑÑ ÐÐŽÐŒÐžÐœÐžÑÑÑÐžÑÐŸÐ²Ð°ÐœÐžÑ  
+
+page.admin-password.displayText=ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, ÑÑÑÐ°ÐœÐŸÐ²ÐžÑÐµ Ð¿Ð°ÑÐŸÐ»Ñ Ð°ÐŽÐŒÐžÐœÐžÑÑÑÐ°ÑÐŸÑÐ°
+admin-password-expl.displayText=ÐÐ»Ñ ÑÐŸÐ³ÐŸ ÑÑÐŸÐ±Ñ Ð¿ÐŸÐ»ÑÑÐžÑÑ ÐŽÐŸÑÑÑÐ¿ Ðº ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐœÑÐŒ ÑÐ°ÑÑÑÐŒ ÐžÐœÑÐµÑÑÐµÐ¹ÑÐ° Greenstone ÐÐ°ÐŒ Ð¿ÐŸÐœÐ°ÐŽÐŸÐ±ÐžÑÑÑ Ð¿Ð°ÑÐŸÐ»Ñ. ÐÐ»Ñ Ð²Ð°Ð· Ð±ÑÐŽÐµÑ ÑÐŸÐ·ÐŽÐ°Ðœ Ð¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÐµÐ»Ñ Ñ ÐžÐŒÐµÐœÐµÐŒ "Admin". ÐÐ»Ñ ÑÑÐŸÐ³ÐŸ Ð¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÐµÐ»Ñ ÐÐ°ÐŒ ÐœÑÐ¶ÐœÐŸ ÑÐºÐ°Ð·Ð°ÑÑ Ð¿Ð°ÑÐŸÐ»Ñ. Ð­ÑÐŸÑ Ð¿Ð°ÑÐŸÐ»Ñ ÐŽÐŸÐ»Ð¶ÐµÐœ Ð±ÑÑÑ ÐŸÑ 3 ÐŽÐŸ 20 ÑÐžÐŒÐ²ÐŸÐ»ÐŸÐ².
+admin.password.displayText=ÐÐ°ÑÐŸÐ»Ñ Ð°ÐŽÐŒÐžÐœÐžÑÑÑÐ°ÑÐŸÑÐ°
+
+
+
+
+### Tomcat config page
+page.tomcat-config.displayText=ÐÐŸÐœÑÐžÐ³ÑÑÐ°ÑÐžÑ Apache Tomcat
+tomcat-config-explanation1.displayText=Greenstone3 ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑ Apache Tomcat ÐŽÐ»Ñ Ð¿ÑÐ±Ð»ÐžÐºÐ°ÑÐžÐž ÑÐžÑÑÐŸÐ²ÑÑ
+ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐº.
+tomcat-config-explanation2.displayText=ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ ÐœÐ°ÑÑÑÐŸÐžÑÑ Tomcat Ð·ÐŽÐµÑÑ, ÐžÐ»Ðž Ð¿ÑÑÐµÐŒ ÑÐµÐŽÐ°ÐºÑÐžÑÐŸÐ²Ð°ÐœÐžÑ ÑÐ°Ð¹Ð»Ð° Ð² build.properties Ð² Ð¿Ð°Ð¿ÐºÐµ Greenstone3 (${installDir}).
+tomcat.server.displayText=Ð¡ÐµÑÐ²ÐµÑ Tomcat
+tomcat-server.explanatoryText=ÐÐ²ÐµÐŽÐžÑÐµ ÐžÐŒÑ ÑÐµÑÐ²ÐµÑÐ°, ÐŒÐ°ÑÐžÐœÑ, Ð³ÐŽÐµ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐ° Ð±ÑÐŽÐµÑ ÐœÐ°Ñ
+ÐŸÐŽÐžÑÑÑ. ÐÑÐ»Ðž Ð²Ñ ÐœÐµ ÑÐ²ÐµÑÐµÐœÑ, Ð¿ÑÐžÐŒÐžÑÐµ Ð¿ÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ (localhost).
+tomcat.port.explanatoryText=ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, Ð²ÑÐ±ÐµÑÐžÑÐµ Ð¿ÐŸÑÑ, ÐºÐŸÑÐŸÑÑÐ¹ ÑÐ»ÐµÐŽÑÐµÑ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ Tomcat. Ð­ÑÐŸ, ÐºÐ°Ðº Ð¿ÑÐ°Ð²ÐžÐ»ÐŸ, Ð±ÐµÐ·ÐŸÐ¿Ð°ÑÐœÐŸ Ð¿ÑÐžÐœÑÑÑ Ð¿ÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ. ÐÑÐ»Ðž Ñ ÐÐ°Ñ ÑÐ¶Ðµ Ð·Ð°Ð¿ÑÑÐµÐœÐ° ÐŽÑÑÐ³Ð°Ñ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ° ÐœÐ° Ð¿ÐŸÑÑÑ Ð¿ÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ, Ð¿ÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, Ð²ÑÐ±ÐµÑÐžÑÐµ ÑÐ²ÐŸÐ±ÐŸÐŽÐœÑÐµ Ð¿ÐŸÑÑÑ.
+tomcat.port.displayText=ÐÐŸÑÑ Tomcat
+tomcat.shutdown.port.displayText=ÐÐŸÑÑ Ð·Ð°ÐºÑÑÑÐžÑ Tomcat
+
+### Progress page
+page.progress.displayText=ÐÑÐŸÐ³ÑÐµÑÑ ÑÑÑÐ°ÐœÐŸÐ²ÐºÐž
+
+### Uninstaller Strings
+
+uninstaller.greenstone.uninstaller=ÐÐµÐžÐœÑÑÐ°Ð»Ð»ÑÑÐžÑ Greenstone
+uninstaller.cancel=ÐÑÐŒÐµÐœÐžÑÑ
+uninstaller.uninstall=Ð£ÐŽÐ°Ð»ÐžÑÑ
+uninstaller.finish=ÐÐ°ÐºÐŸÐœÑÐžÑÑ
+uninstaller.error=ÐÑÐžÐ±ÐºÐ°
+uninstaller.confirmation=ÐÐŸÐŽÑÐ²ÐµÑÐ¶ÐŽÐµÐœÐžÐµ
+uninstaller.continue=ÐÑÐŸÐŽÐŸÐ»Ð¶ÐžÑÑ
+uninstaller.complete=ÐÐ°Ð²ÐµÑÑÐžÑÑ
+uninstaller.skip=ÐÑÐŸÐ¿ÑÑÑÐžÑÑ
+uninstaller.skip.all=ÐÑÐŸÐ¿ÑÑÑÐžÑÑ Ð²ÑÐµ
+uninstaller.retry=ÐÐŸÐ²ÑÐŸÑÐžÑÑ
+uninstaller.readonly=Ð¢ÐŸÐ»ÑÐºÐŸ ÑÑÐµÐœÐžÐµ
+
+uninstaller.will.uninstall.from=Ð­ÑÐŸ ÑÐŽÐ°Ð»ÐžÑ ÑÑÑÐ°ÐœÐŸÐ²ÐºÑ Greenstone:
+uninstaller.uninstall.options=ÐÐ¿ÑÐžÐž ÐŽÐ»Ñ ÑÐŽÐ°Ð»ÐµÐœÐžÑ
+uninstaller.keep.collections=Ð¡ÐŸÑ
+ÑÐ°ÐœÐžÑÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž
+uninstaller.are.you.sure=ÐÑ ÐŽÐµÐ¹ÑÑÐ²ÐžÑÐµÐ»ÑÐœÐŸ Ñ
+ÐŸÑÐžÑÐµ ÑÐŽÐ°Ð»ÐžÑÑ Greenstone
+uninstaller.are.you.sure.collections=ÐÑ Ð²ÑÐ±ÑÐ°Ð»Ðž ÑÐŽÐ°Ð»ÐµÐœÐžÐµ Ð²Ð°ÑÐžÑ
+ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐ¹. \n ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ° ÑÐºÐŸÐ¿ÐžÑÑÐ¹ÑÐµ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž, ÐºÐŸÑÐŸÑÑÐµ ÐÑ Ñ
+ÐŸÑÐµÐ»Ðž Ð±Ñ ÑÐŸÑ
+ÑÐ°ÐœÐžÑÑ, Ð² ÐœÐ°ÐŽÐµÐ¶ÐœÐŸÐµ ÐŒÐµÑÑÐŸ Ð¿ÐµÑÐµÐŽ Ð¿ÑÐŸÐŽÐŸÐ»Ð¶ÐµÐœÐžÐµÐŒ
+uninstaller.failed.to.figure.cd=ÐÐµ ÑÐŽÐ°Ð»ÐŸÑÑ Ð²ÑÑÑÐœÐžÑÑ ÑÐµÐºÑÑÐžÐ¹ ÐºÐ°ÑÐ°Ð»ÐŸÐ³
+uninstaller.cancelled=Ð£ÐŽÐ°Ð»ÐµÐœÐžÐµ ÐŸÑÐŒÐµÐœÐµÐœÐŸ
+uninstaller.finished=Ð£ÐŽÐ°Ð»ÐµÐœÐžÐµ Ð·Ð°ÐºÐŸÐœÑÐµÐœÐŸ
+uninstaller.deleting=Ð€Ð°Ð¹Ð» {file} ÑÐŽÐ°Ð»ÑÐµÑÑÑ Ñ Ð¶ÐµÑÑÐºÐŸÐ³ÐŸ ÐŽÐžÑÐºÐ°
+
+uninstaller.info.skipping=ÐÐÐ€Ð: ÐÑÐŸÐ¿ÑÑÐºÐ°ÐµÐŒ ÑÐ°Ð¹Ð» {file}
+uninstaller.info.no.startmenu=ÐÐÐ€Ð: ÐÐµ ÐœÐ°ÑÐ»Ð°ÑÑ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑ ÐŒÐµÐœÑ "ÐÑÑÐº". ÐÐŸÑÑÐŸÐŒÑ Ð³ÑÑÐ¿Ð¿Ð° Greenstone Ð² ÐŒÐµÐœÑ "ÐÑÑÐº" ÐœÐµ ÑÐŽÐ°Ð»ÐžÑÑÑ.
+uninstaller.warning.readonly=ÐÐÐÐÐÐÐÐ: {file} ÑÐŸÐ»ÑÐºÐŸ ÐŽÐ»Ñ ÑÑÐµÐœÐžÑ
+uninstaller.warning.couldnt.delete=ÐÐÐÐÐÐÐÐ: ÐÐµ ÑÐŽÐ°Ð»ÐŸÑÑ ÑÐŽÐ°Ð»ÐžÑÑ {file}. ÐÑÐŸÐ¿ÑÑÐºÐ°ÐµÑÑÑ.
+uninstaller.warning.nonexistent=ÐÐÐÐÐÐÐÐ: {file} ÐœÐµ ÑÑÑÐµÑÑÐ²ÑÐµÑ
+uninstaller.error.nonexistent=ÐÐšÐÐÐÐ: {file} ÑÐ°Ð¹Ð» ÐœÐµ ÑÑÑÐµÑÑÐ²ÑÐµÑ
+uninstaller.error.couldnt.find.install.props=ÐÐšÐÐÐÐ: ÐÐµ ÑÐŽÐ°Ð»ÐŸÑÑ ÐœÐ°Ð¹ÑÐž 'installation.properties' ÐžÐ»Ðž 'etc/installation.properties'. \nÐÐ»Ðž ÑÑÐ° ÐŽÐžÑÐµÐºÑÐŸÑÐžÑ ÐœÐµ ÑÐŸÐŽÐµÑÐ¶ÐžÑ ÑÑÑÐ°ÐœÐŸÐ²ÐºÑ Greenstone ÐžÐ»Ðž ÑÑÑÐ°ÐœÐŸÐ²ÐºÐ° Ð¿ÐŸÐ²ÑÐµÐ¶ÐŽÐµÐœÐ°. \nÐÐµÐžÐœÑÑÐ°Ð»Ð»ÑÑÐžÑ ÐœÐµ Ð²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐ°
+uninstaller.warning.couldnt.create.flagfile=ÐÐÐÐÐÐÐÐ: ÐÐµ ÑÐŽÐ°Ð»ÐŸÑÑ ÑÐŸÐ·ÐŽÐ°ÑÑ ÑÐ°Ð¹Ð» ÑÐ»Ð°Ð³. ÐÐ°ÐŒ Ð¿ÑÐžÐŽÐµÑÑÑ ÑÐŽÐ°Ð»ÐžÑÑ JRE Ðž ÐŸÑÑÐ°Ð»ÑÐœÑÐµ ÑÐ°Ð¹Ð»Ñ ÐŽÐµÐžÐœÑÑÐ°Ð»Ð»ÑÑÐŸÑÐ° Ð²ÑÑÑÐœÑÑ
+
+
+### Ant-Installer Core strings
+
+dirNotExistCreate=ÐÐ°Ð¿ÐºÐ° ÐœÐµ ÑÑÑÐµÑÑÐ²ÑÐµÑ, ÑÐŸÐ·ÐŽÐ°ÑÑ ÐµÐ³ÐŸ?
+dirNotExist=ÐÐ°Ð¿ÐºÐ° ÐœÐµ ÑÑÑÐµÑÑÐ²ÑÐµÑ
+fileNotExist=Ð€Ð°Ð¹Ð» ÐœÐµ ÑÑÑÐµÑÑÐ²ÑÐµÑ
+dirNotCreated=ÐÐµ ÑÐŽÐ°ÐµÑÑÑ ÑÐŸÐ·ÐŽÐ°ÑÑ ÑÐ°Ð¹Ð» Ð¿Ð°Ð¿ÐºÑ
+canNotCreateFile=ÐÐµ ÑÐŽÐ°ÐµÑÑÑ ÑÐŸÐ·ÐŽÐ°ÑÑ ÑÐ°Ð¹Ð»
+appRootInvalid=Ð­ÑÐ° Ð¿Ð°Ð¿ÐºÐ° ÐœÐµ ÐŸÑÐœÐ°Ð²ÐœÐ°Ñ Ð¿Ð°Ð¿ÐºÐ° Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÑ
+selectFile=ÐÑÐ±ÐŸÑ ÑÐ°Ð¹Ð»Ð°
+selectFolder=ÐÑÐ±ÐŸÑ Ð¿Ð°Ð¿ÐºÐž
+browseDotDotDot=ÐÐ±Ð·ÐŸÑ...
+notValidSelection=ÐÑÐ±ÐŸÑ ÐœÐµÐŽÐµÐ¹ÑÑÐ²ÐžÑÐµÐ»ÐµÐœ
+showDetails=ÐÐŸÐºÐ°Ð·Ð°ÑÑ Ð¿ÐŸÐŽÑÐŸÐ±ÐœÐŸÑÑÐž
+
+#Default loading
+promptLoadDefaults=ÐÐŸÐœÑÐžÐ³ÑÑÐ°ÑÐžÐž ÑÑÑÐ°ÐœÐŸÐ²ÐºÐž ÐœÐ°Ð¹ÐŽÐµÐœÑ. ÐÐ°Ð³ÑÑÐ·ÐžÑÑ ÑÑÑÐµÑÑÐ²ÑÑÑÐžÐž ÐºÐŸÐœÑÐžÐ³ÑÑÐ°ÑÐžÐž?
+promptMissingDefaultPassword=ÐÐ°ÑÐŸÐ»Ñ ÐœÐµ ÐœÐ°Ð¹ÐŽÐµÐœ. ÐÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸ, ÐŸÐœ Ð±ÑÐ» ÐŸÐ¿ÑÑÐµÐœ Ð¿ÐŸ ÑÐŸÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑÐŒ Ð±ÐµÐ·ÐŸÐ¿Ð°ÑÐœÐŸÑÑÐž, Ð±ÑÐŽÐµÑ ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœ Ð¿ÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ.
+
+click=ÐÐ°Ð¶Ð°ÑÑ
+toContinue=ÐŽÐ¿Ñ Ð¿ÑÐŸÐŽÐŸÐ»Ð¶ÐµÐœÐžÑ
+failed=ÐÑÐžÐ±ÐºÐ°
+exit=ÐÑÑ
+ÐŸÐŽ
+complete=ÐÐ°Ð²ÐµÑÑÐµÐœÐŸ
+finished=ÐÐ°ÐºÐŸÐœÑÐžÑÑ
+extracting=ÐÐ·Ð²Ð»ÐµÑÐµÐœÐžÐµ...
+installFinished=Ð£ÑÑÐ°ÐœÐŸÐ²ÐºÐ° Ð·Ð°ÐºÐŸÐœÑÐµÐœÐ°
+install-cancelled=Ð£ÑÑÐ°ÐœÐŸÐ²ÐºÐ° ÐŸÑÐŒÐµÐœÐµÐœÐ°
+running=
+
+backButton=ÐÐ°Ð·Ð°ÐŽ
+cancelButton=ÐÑÐŒÐµÐœÐžÑÑ
+nextButton=ÐÐ°Ð»ÐµÐµ
+finishButtonText=Ð£ÑÑÐ°ÐœÐŸÐ²ÐžÑÑ
+
+output=ÐÑÐ²ÐŸÐŽ
+errors=ÐÑÐžÐ±ÐºÐž
+notCorrectFormat=ÐÐµ Ð¿ÑÐ°Ð²ÐžÐ»ÑÐœÑÐ¹ ÑÐŸÑÐŒÐ°Ñ Ð¿ÐŸÐ»Ñ
+notCorrectPasswordFormat=ÐÐµ Ð¿ÑÐ°Ð²ÐžÐ»ÑÐœÑÐ¹ ÑÐŸÑÐŒÐ°Ñ Ð¿Ð°ÑÐŸÐ»Ñ
+passwordsDoNotMatch=ÐÐ°ÑÐŸÐ»Ðž ÐœÐµ ÑÐŸÐ²Ð¿Ð°ÐŽÐ°ÑÑ
+installationFailed=Ð£ÑÑÐ°ÐœÐŸÐ²ÐºÐ° ÐœÐµ ÑÐŽÐ°Ð»Ð°ÑÑ
+propertiesVersionMismatch=ÐÐµÐºÐŸÑÐŸÑÑÐµ ÐŸÐ¿ÑÐžÐž Ð¿ÑÐŸÐ¿Ð°Ð»Ðž ÐžÐ· Ð¿ÑÐµÐŽÑÐŽÑÑÐµÐ¹ Ð²ÐµÑÑÐžÐž Ðž ÐŽÐŸÐ»Ð¶ÐœÑ Ð±ÑÑÑ Ð²ÐœÐµÑÐµÐœÑ Ð²ÑÑÑÐœÑÑ, Ð¿ÑÐŸÐŽÐŸÐ»Ð¶ÐžÑÑ?
+
+Finished=ÐÐŸÑÐŸÐ²ÐŸ
+Failed=ÐÐµ ÑÐŽÐ°Ð»ÐŸÑÑ, Ð¿ÑÐŸÑÐŒÐŸÑÑÐµÑÑ ÑÐŸÐŸÐ±ÑÐµÐœÐžÑ ÐŸÐ± ÐŸÑÐžÐ±ÐºÐ°Ñ
+
+ant.failure=ÐÐ°Ð¿ÑÑÐº Ant ÐœÐµ ÑÐŽÐ°Ð»ÑÑ - Ð¿ÑÐŸÑÐŒÐŸÑÑÐµÑÑ ÑÐŸÐŸÐ±ÑÐµÐœÐžÑ ÐŸÐ± ÐŸÑÐžÐ±ÐºÐ°Ñ
+
+
+license.next.text=ÐÑÐžÐœÑÑÑ
+license.cancel.text=ÐÑÐºÐ»ÐŸÐœÐžÑÑ
+
+#text install strings
+_required_=ÑÑÐµÐ±ÑÐµÑÑÑ  
+_default_=Ð¿ÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ  
+true=ÐžÑÑÐžÐœÐ°  
+#The value of 'affirmativeChars' comes from the first letters of "True" and "Yes"
+affirmativeChars=Ð,Ð  
+#The value of 'negativeChars' comes from the first letters of "False" and "No"
+negativeChars=ÐÐŸÐ¶Ñ, Ð  
+licenseAccept=ÐÑÐžÐœÐžÐŒÐ°ÐµÑÐµ Ð»Ðž ÐÑ Ð»ÐžÑÐµÐœÐ·ÐžÐŸÐœÐœÐŸÐµ ÑÐŸÐ³Ð»Ð°ÑÐµÐœÐžÐµ? Ð ÐžÐ»Ðž Ð [default\:Ð]  
+clickViewLicense=ÐÐ°Ð¶ÐŒÐžÑÐµ ÐÐ²ÐŸÐŽ ÐŽÐ»Ñ Ð¿ÑÐŸÑÐŒÐŸÑÑÐ° Ð»ÐžÑÐµÐœÐ·ÐžÐŸÐœÐœÐŸÐ³ÐŸ ÑÐŸÐ³Ð»Ð°ÑÐµÐœÐžÑ  
+clickViewText=ÐÐ°Ð¶ÐŒÐžÑÐµ ÐÐ²ÐŸÐŽ ÐŽÐ»Ñ Ð¿ÑÐŸÐŽÐŸÐ»Ð¶ÐµÐœÐžÑ  
+enterNumber=ÐÐ²ÐµÐŽÐžÑÐµ ÐœÐŸÐŒÐµÑ  
+fileDoesNotExist=Ð€Ð°Ð¹Ð» ÐœÐµ ÑÑÑÐµÑÑÐ²ÑÐµÑ  
+#The value of backChar is the first letter "Back"
+backChar=Ð  
+#The value of nextChar is the first letter "Next"
+nextChar=Ð  
+#In the next two properties, 'N' should be replaced the value of the 'nextChar' property
+license_next=Ð²Ð²ÐµÐŽÐžÑÐµ 'Ð' ÐŽÐ»Ñ Ð¿ÐµÑÐµÑ
+ÐŸÐŽÐ° ÐœÐ° ÑÐ»ÐµÐŽÑÑÑÑÑ ÑÑÑÐ°ÐœÐžÑÑ, ÐžÐ»Ðž Ð»ÑÐ±ÑÑ ÐºÐ»Ð°Ð²ÐžÑÑ ÐŽÐ»Ñ Ð¿ÑÐŸÐºÑÑÑÐºÐž ÐŽÐŸ ÐºÐŸÐœÑÐ°  
+large_select_next=Ð²Ð²ÐµÐŽÐžÑÐµ 'Ð' ÐŽÐ»Ñ Ð¿ÐµÑÐµÑ
+ÐŸÐŽÐ° ÐœÐ° ÑÐ»ÐµÐŽÑÑÑÑÑ ÑÑÑÐ°ÐœÐžÑÑ, ÐžÐ»Ðž Ð»ÑÐ±ÑÑ ÐºÐ»Ð°Ð²ÐžÑÑ ÐŽÐ»Ñ Ð¿ÑÐŸÐºÑÑÑÐºÐž ÐŽÐŸ ÐºÐŸÐœÑÐ°  
+availableOptions=Ð¿ÐŸÑÐŒÐŸÑÑÐµÑÑ ÐŽÐŸÑÑÑÐ¿ÐœÑÐµ Ð²Ð°ÑÐžÐ°ÐœÑÑ  
Index: /main/branches/stable_gs3/release-kits/shared/core/language-strings/LanguagePack_zh.properties
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/language-strings/LanguagePack_zh.properties	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/language-strings/LanguagePack_zh.properties	(revision 21851)
@@ -0,0 +1,254 @@
+### Language page ###
+page.language-selector.displayText=è¯­èš
+language-selector-explanation.displayText=è¯·éæ©è¯­èš
+# (Note: This installer has not been fully translated into all these languages yet)
+
+
+### Intro Page ###
+page.intro.displayText=Greenstone @version@ å®è£
+åš
+welcome.displayText=Greenstone@version.major@ æ¯çšäºæå»ºååäº«æ°å­åŸä¹ŠéŠçèœ¯ä»¶ã\n\næ¬å®è£
+å¥ä»¶å
+æ¬Greenstoneç³»ç»ïŒæ°å­åŸä¹ŠéŠæç®¡å·¥å
+·ïŒå¯çšäºLinux/MaxOSçApache2.2ïŒåçšäºWindowsçGreenstoneåŸä¹ŠéŠæå¡åšïŒèœ¬æ¢åŸåïŒImageMagick)ïŒåå€çpdfåpostscriptæä»¶ïŒGhostScript ïŒ ä»
+éäºWindowsåMacOSïŒã
+
+## License page ###
+page.license.displayText=èœ¯ä»¶è®žå¯
+
+
+### Destination page ###
+page.destination.displayText=å®è£
+ç®åœ
+installDir.displayText=éæ©å®è£
+ç®åœ
+
+
+### InstallShield install detected page ###
+page.dontBudge.displayText=æ£æµå°æ©æå®è£
+çæ¬
+is-install-detected.displayText=åšå®è£
+ç®åœäž­æ£æµå°äžäžªçæ¬äœäº2.81çGreenstone2ïŒæäžäžªçæ¬äœäº3.04çGreenstone3å®è£
+ãåšæéå®çç®åœäž­æ æ³è¿è¡å®è£
+ã\n\nè¯·éåºæ¬å®è£
+åšïŒåžèœœå·²å­åšçGreenstoneå®è£
+ïŒç¶åéæ°è¿è¡æ¬å®è£
+åšïŒæšèïŒãæè
+ïŒéåå°å®è£
+çäžäžæ­¥å¹¶éæ©å
+¶å®çå®è£
+ç®åœã
+
+
+### Components Page ###
+# (Note: in the html here, we must use '<br>' for breaklines.
+# '<br/>' and other variations are not recognised.)
+page.selector.displayText=å®è£
+éšä»¶
+choose-components.displayText=è¯·éæ©æèŠå®è£
+çéšä»¶
+
+Looking_For_Previous_Installation.displayText=æ¥æŸæ©æå®è£
+
+Looking_For_Previous_Installation.explanatoryText=åŠæåç°æ©æå®è£
+ïŒèœœå
+¥å·²å®è£
+çæ¬çå±æ§ã
+
+Installing_Core_System.displayText=æ žå¿ç³»ç»
+Installing_Core_System.explanatoryText=\
+
+Installing_Source_Code_Core.displayText=æ žå¿æºä»£ç 
+Installing_Source_Code_Core.explanatoryText=\
+
+Installing_Source_Code.displayText=æºä»£ç 
+Installing_Source_Code.explanatoryText=\
+
+Installing_ImageMagick.displayText=æ¯æJPEG2000çImageMagick (@bundled.version.imagemagick@)
+Installing_ImageMagick.explanatoryText=\
+
+Installing_Ghostscript.displayText=GhostScript (@bundled.version.ghostscript@)
+Installing_Ghostscript.explanatoryText=\
+
+Installing_Start_Menu_Shortcuts.displayText=åŒå§èåå¿«æ·é®
+Installing_Start_Menu_Shortcuts.explanatoryText=åå»ºGreenstone@version.major@åŒå§èåå¿«æ·é®
+
+Installing_Tomcat.displayText=Apache Tomcat (@bundled.version.tomcat@)
+Installing_Tomcat.explanatoryText=\
+
+Installing_Ant.displayText=Apache Ant (@bundled.version.ant@)
+Installing_Ant.explanatoryText=\
+
+### Admin password page
+
+page.admin-pages.displayText=ç®¡çé¡µé¢
+admin-expl.displayText=åŠææ³å¯¹åŸä¹ŠéŠçå
+å®¹è®Ÿå®è·åæéæäžºåŸä¹ŠéŠè®Ÿç«è¿çšä¿®æ¹æéïŒé£ä¹äœ å¿
+é¡»äœ¿çšGreenstone çœç»æ¥å£çç®¡çé¡µé¢æ¥ç®¡ççšæ·æ°æ®åºãäœ è¿å¯æ¹äŸ¿çäœ¿çšè¯¥ç®¡çé¡µé¢æµè§æ¥å¿ææ¡£åä¿®è¯¥main.cfgæä»¶ã
+admin-expl-2.displayText=èŠæ¿æŽ»Greenstone çœç»æ¥å£ç®¡çé¡µé¢åïŒïŒåŠæåç­æ¯ïŒè¯·åšæ¥äžçæ­¥éª€äž­è®Ÿå®å¯ç ãïŒ
+admin-expl-3.displayText=æ³šïŒçœç»æ¥å£ç®¡çé¡µé¢å¯éè¿äºèçœè¿å
+¥ãè¯·éæ©å®å
+šå¯é çå¯ç å¯¹ç®¡çé¡µé¢è¿è¡ä¿æ€ã
+enable.admin.pages.displayText=æ¿æŽ»ç®¡çé¡µé¢
+
+page.admin-password.displayText=è¯·è®Ÿå®ç®¡çåå¯ç 
+admin-password-expl.displayText=è®¿é®Greenstoneçé¢çäžäºç¹å®éšåéèŠèŸå
+¥å¯ç ãäœ¿çšææäŸçå¯ç ïŒäžäžªçšæ·åäžº'admin'ççšæ·äŒè¢«èªåšåå»ºãå¯ç é¿åºŠå¿
+é¡»æ¯3è³8äœã
+admin.password.displayText=ç®¡çåå¯ç 
+
+
+
+
+### Tomcat config page
+page.tomcat-config.displayText=Apache Tomcaté
+çœ®
+tomcat-config-explanation1.displayText=Greenstone3äœ¿çšApache Tomcatå
+±äº«äœ çæ°å­åŸä¹ŠéŠã
+tomcat-config-explanation2.displayText=Tomcatå¯åšè¿éé
+çœ®ïŒä¹å¯éè¿ä¿®æ¹äž»ç®åœäž­çæä»¶build.properties(${installDir})ã
+tomcat.server.displayText=TomcatäŒºæåš
+tomcat-server.explanatoryText=è¯·èŸå
+¥äŒºæäœ çæ°å­åŸä¹ŠéŠçäž»æºçåå­ãåŠæäžç¥éïŒæ¥åé»è®€åŒ(localhost)ã
+tomcat.port.explanatoryText=è¯·èŸå
+¥Tomcatäœ¿çšçç«¯å£ãå®å
+šçåæ³æ¯æ¥åé»è®€åŒãåŠæé»è®€ç«¯å£å·²ç»è¿è¡äºå
+¶å®çæå¡ïŒè¯·éæ©å
+¶å®ç«¯å£ã
+tomcat.port.displayText=Tomcatç«¯å£
+tomcat.shutdown.port.displayText=Tomcatç»æ­¢ç«¯å£
+
+### Progress page
+page.progress.displayText=å®è£
+è¿çš
+
+### Uninstaller Strings
+
+uninstaller.greenstone.uninstaller=Greenstoneåžèœœåš
+uninstaller.cancel=åæ¶
+uninstaller.uninstall=åžèœœ
+uninstaller.finish=å®æ
+uninstaller.error=éè¯¯
+uninstaller.confirmation=ç¡®è®€
+uninstaller.continue=ç»§ç»­
+uninstaller.complete=å®æŽ
+uninstaller.skip=è·³è¿
+uninstaller.skip.all=è·³è¿ææ
+uninstaller.retry=åè¯
+uninstaller.readonly=åªè¯»
+
+uninstaller.will.uninstall.from=å°åžèœœGreenstoneå®è£
+
+uninstaller.uninstall.options=åžèœœéé¡¹=
+uninstaller.keep.collections=ä¿çæ¶é
+uninstaller.are.you.sure=äœ ç¡®è®€èŠåžèœœGreenstoneåïŒ
+uninstaller.are.you.sure.collections=äœ å·²éæ©å é€æ¶éã\nç»§ç»­äžäžæ­¥åè¯·å€ä»œèŠä¿ççæ¶é
+uninstaller.failed.to.figure.cd=æ æ³èŸšè®€åœåç®åœ
+uninstaller.cancelled=åžèœœåæ¶
+uninstaller.finished=åžèœœå®æ
+uninstaller.deleting=ä»ç®åœäž­å é€æä»¶{file}
+
+uninstaller.info.skipping=ä¿¡æ¯=è·³è¿æä»¶{file}
+uninstaller.info.no.startmenu=ä¿¡æ¯= æŸäžå°StartMenuè·¯åŸãåžèœœè¿çšäžäŒå é€StartMenuç»
+uninstaller.warning.readonly=è­Šå= æä»¶{file}åªè¯»
+uninstaller.warning.couldnt.delete=è­Šå= æ æ³å é€å é€æä»¶{file}ãè·³è¿
+uninstaller.warning.nonexistent=è­Šå: {file}äžå­åš
+uninstaller.error.nonexistent=éè¯¯: {file}äžå­åš
+uninstaller.error.couldnt.find.install.props=éè¯¯:æŸäžå°æä»¶'installation.properties'æ'etc/installation.properties'ã\nèŠä¹è¿äžæ¯ææçGreenstoneå®è£
+ïŒæå®è£
+å·²è¢«ç Žåãåžèœœæ æ³ç»§ç»­ã
+uninstaller.warning.couldnt.create.flagfile=è­Šå:æ æ³åå»ºæ è¯æä»¶ãå¿
+é¡»æåšå é€jreååžèœœæä»¶
+
+
+### Ant-Installer Core strings
+
+dirNotExistCreate=ç®åœäžå­åšïŒèŠåå»ºåïŒ
+dirNotExist=ç®åœäžå­åš
+fileNotExist=æä»¶äžå­åš
+dirNotCreated=æ æ³åå»ºç®åœ
+canNotCreateFile=æ æ³åå»ºæä»¶
+appRootInvalid=ç®åœäŒŒä¹äžæ¯åºçšçšåºçæ ¹ç®åœ
+selectFile=éæ©æä»¶
+selectFolder=éæ©ç®åœ
+browseDotDotDot=æµè§...
+notValidSelection=æ æéæ©
+showDetails=æŸç€ºç»è
+
+#Default loading
+promptLoadDefaults=åç°å®è£
+é
+çœ®ãèœœå
+¥å·²æé
+çœ®ïŒ
+promptMissingDefaultPassword=æªæŸå°å¯ç ãä¹è®žæ¯åºäºå®å
+šåå è¢«ç¥å»ãè®Ÿäžºé»è®€åŒã
+
+click=ç¹å»
+toContinue=ç»§ç»­
+failed=å€±èŽ¥
+exit=éåº
+complete=å®æŽ
+finished=å®æ
+extracting=æåäž­...
+installFinished=å®è£
+å®æ
+install-cancelled=å®è£
+åæ¶
+running=è¿è¡äž­
+
+backButton=è¿å
+cancelButton=åæ¶
+nextButton=äžäžæ­¥
+finishButtonText=å®è£
+
+
+output=èŸåº
+errors=éè¯¯
+notCorrectFormat=åæš¡åŒéè¯¯
+notCorrectPasswordFormat=å¯ç æš¡åŒéè¯¯
+passwordsDoNotMatch=å¯ç éè¯¯
+installationFailed=å®è£
+å€±èŽ¥
+propertiesVersionMismatch=æ©æå®è£
+çæ¬çäžäºéé¡¹çŒºå€±ïŒå¿
+é¡»æåšèŸå
+¥ïŒç»§ç»­ïŒ
+
+Finished=å®æ
+Failed=å€±èŽ¥ïŒæŸç€ºéè¯¯ä¿¡æ¯
+ant.failure=Antè¿è¡å€±èŽ¥ïŒè¯Šç»ä¿¡æ¯è¯·æ¥çéè¯¯æ¥å¿
+
+license.next.text=æ¥å
+license.cancel.text=æç»
+
+#text install strings
+_required_=å¿
+èŠç  
+_default_=çŒºç  
+true=ç  
+#The value of 'affirmativeChars' comes from the first letters of "True" and "Yes"
+
+#The value of 'negativeChars' comes from the first letters of "False" and "No"
+
+licenseAccept=æ¥åè®žå¯åå®åïŒYæè
+N[çŒºçäžºâNâ]  
+clickViewLicense=æåèœŠæ¥çè®žå¯åå  
+clickViewText=æåèœŠç»§ç»­  
+enterNumber=èŸå
+¥äžäžªæ°å­  
+fileDoesNotExist=äžå­åšæ­€æä»¶  
+#The value of backChar is the first letter "Back"
+
+#The value of nextChar is the first letter "Next"
+nextChar=N  
+#In the next two properties, 'N' should be replaced the value of the 'nextChar' property
+license_next=èŸå
+¥âNâä»¥è¿å
+¥äžäžäžªé¡µé¢ïŒèŸå
+¥ä»»æåŒå°æ»åšå°ææ«å°Ÿ
+large_select_next=èŸå
+¥âNâä»¥è¿å
+¥äžäžäžªé¡µé¢ïŒèŸå
+¥ä»»æåŒå°æ»åšå°ææ«å°Ÿ  
+availableOptions=æ¥çå¯çšçéé¡¹
Index: /main/branches/stable_gs3/release-kits/shared/core/lib/dates.properties
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/lib/dates.properties	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/lib/dates.properties	(revision 21851)
@@ -0,0 +1,165 @@
+#names of months in different languages
+
+default.Dates.Jan:January
+default.Dates.Feb:February
+default.Dates.Mar:March
+default.Dates.Apr:April
+default.Dates.May:May
+default.Dates.Jun:June
+default.Dates.Jul:July
+default.Dates.Aug:August
+default.Dates.Sep:September
+default.Dates.Oct:October
+default.Dates.Nov:November
+default.Dates.Dec:December
+
+ar.Dates.Jan:ÙÙØ§ÙØ±
+ar.Dates.Feb:ÙØšØ±Ø§ÙØ±
+ar.Dates.Mar:Ù
+Ø§Ø±Ø³
+ar.Dates.Apr:Ø§ØšØ±ÙÙ
+ar.Dates.May:Ù
+Ø§ÙÙ
+ar.Dates.Jun:ÙÙÙÙÙ
+ar.Dates.Jul:ÙÙÙÙÙ
+ar.Dates.Aug:Ø£ØºØ³Ø·Ø³
+ar.Dates.Sep:Ø³ØšØªÙ
+ØšØ±
+ar.Dates.Oct:Ø§ÙØªÙØšØ±
+ar.Dates.Nov:ÙÙÙÙ
+ØšØ±
+ar.Dates.Dec:Ø¯ÙØ³Ù
+ØšØ±
+
+ca.Dates.Jan:Gener
+ca.Dates.Feb:Febrer
+ca.Dates.Mar:MarÃ§
+ca.Dates.Apr:Abril
+ca.Dates.May:Maig
+ca.Dates.Jun:Juny
+ca.Dates.Jul:Juliol
+ca.Dates.Aug:Agost
+ca.Dates.Sep:Setembre
+ca.Dates.Oct:Octubre
+ca.Dates.Nov:Novembre
+ca.Dates.Dec:Desembre
+
+el.Dates.Jan:ÎÎ±ÎœÎ¿Ï
+Î¬ÏÎ¹Î¿Ï
+el.Dates.Feb:ÎŠÎµÎ²ÏÎ¿Ï
+Î¬ÏÎ¹Î¿Ï
+el.Dates.Mar:ÎÎ¬ÏÏÎ¹Î¿Ï
+el.Dates.Apr:ÎÏÏÎ¯Î»Î¹Î¿Ï
+el.Dates.May:ÎÎ¬ÏÎ¿Ï
+el.Dates.Jun:ÎÎ¿ÏÎœÎ¹Î¿Ï
+el.Dates.Jul:ÎÎ¿ÏÎ»Î¹Î¿Ï
+el.Dates.Aug:ÎÏÎ³Î¿Ï
+ÏÏÎ¿Ï
+el.Dates.Sep:Î£ÎµÏÏÎ­ÎŒÎ²ÏÎ·Ï
+el.Dates.Oct:Î¿ÎºÏÏÎ²ÏÎ·Ï
+el.Dates.Nov:ÎÎ¿Î­ÎŒÎ²ÏÎ·Ï
+el.Dates.Dec:ÎÎµÎºÎ­ÎŒÎ²ÏÎ·Ï
+
+es.Dates.Jan:Enero
+es.Dates.Feb:Febrero
+es.Dates.Mar:Marzo
+es.Dates.Apr:Abril
+es.Dates.May:Mayo
+es.Dates.Jun:Junio
+es.Dates.Jul:Julio
+es.Dates.Aug:Agosto
+es.Dates.Sep:Septiembre
+es.Dates.Oct:Octubre
+es.Dates.Nov:Noviembre
+es.Dates.Dec:Diciembre
+
+fr.Dates.Jan:Janvier
+fr.Dates.Feb:FÃ©vrier
+fr.Dates.Mar:Mars
+fr.Dates.Apr:Avril
+fr.Dates.May:Mai
+fr.Dates.Jun:Juin
+fr.Dates.Jul:Juillet
+fr.Dates.Aug:AoÃ»t
+fr.Dates.Sep:Septembre
+fr.Dates.Oct:Octobre
+fr.Dates.Nov:Novembre
+fr.Dates.Dec:DÃ©cembre
+
+lv.Dates.Jan:JanvÄris
+lv.Dates.Feb:FerbruÄris
+lv.Dates.Mar:Marts
+lv.Dates.Apr:AprÄ«lis
+lv.Dates.May:Maijs
+lv.Dates.Jun:JÅ«nijs
+lv.Dates.Jul:JÅ«lijs
+lv.Dates.Aug:Augusts
+lv.Dates.Sep:Septembris
+lv.Dates.Oct:Oktobris
+lv.Dates.Nov:Novembris
+lv.Dates.Dec:Decembris
+
+mr.Dates.Jan:à€à€Ÿà€šà¥à€µà€Ÿà€°à¥
+mr.Dates.Feb:à€«à¥à€¬à¥à€°à¥à€µà€Ÿà€°à¥
+mr.Dates.Mar:à€®à€Ÿà€°à¥à€
+mr.Dates.Apr:à€à€ªà¥à€°à€¿à€²
+mr.Dates.May:à€®à¥
+mr.Dates.Jun:à€à¥à€š
+mr.Dates.Jul:à€à¥à€²à¥
+mr.Dates.Aug:à€à€à€žà¥à€
+mr.Dates.Sep:à€žà€ªà¥à€à¥à€à€¬à€°
+mr.Dates.Oct:à€à€à¥à€à¥à€¬à€°
+mr.Dates.Nov:à€šà¥à€µà¥à€¹à¥à€à€¬à€°
+mr.Dates.Dec:à€¡à€¿à€žà¥à€à€¬à€°
+
+ro.Dates.Jan:Ianuarie
+ro.Dates.Feb:Februarie
+ro.Dates.Mar:Martie
+ro.Dates.Apr:Aprilie
+ro.Dates.May:Mai
+ro.Dates.Jun:Iunie
+ro.Dates.Jul:Iulie
+ro.Dates.Aug:August
+ro.Dates.Sep:Septembrie
+ro.Dates.Oct:Octombrie
+ro.Dates.Nov:Noiembrie
+ro.Dates.Dec:Decembrie
+
+ru.Dates.Jan:Ð¯ÐœÐ²Ð°ÑÑ
+ru.Dates.Feb:Ð€ÐµÐ²ÑÐ°Ð»Ñ
+ru.Dates.Mar:ÐÐ°ÑÑ
+ru.Dates.Apr:ÐÐ¿ÑÐµÐ»Ñ
+ru.Dates.May:ÐÐ°Ð¹
+ru.Dates.Jun:ÐÑÐœÑ
+ru.Dates.Jul:ÐÑÐ»Ñ
+ru.Dates.Aug:ÐÐ²Ð³ÑÑÑ
+ru.Dates.Sep:Ð¡ÐµÐœÑÑÐ±ÑÑ
+ru.Dates.Oct:ÐÐºÑÑÐ±ÑÑ
+ru.Dates.Nov:ÐÐŸÑÐ±ÑÑ
+ru.Dates.Dec:ÐÐµÐºÐ°Ð±ÑÑ
+
+vi.Dates.Jan:ThÃ¡ng GiÃªng
+vi.Dates.Feb:ThÃ¡ng Hai
+vi.Dates.Mar:ThÃ¡ng Ba
+vi.Dates.Apr:ThÃ¡ng TÆ°
+vi.Dates.May:ThÃ¡ng NÄm
+vi.Dates.Jun:ThÃ¡ng SÃ¡u
+vi.Dates.Jul:ThÃ¡ng Báº£y
+vi.Dates.Aug:ThÃ¡ng TÃ¡m
+vi.Dates.Sep:ThÃ¡ng ChÃ­n
+vi.Dates.Oct:ThÃ¡ng MÆ°á»i
+vi.Dates.Nov:ThÃ¡ng MÆ°á»i má»t
+vi.Dates.Dec:ThÃ¡ng MÆ°á»i hai
+
+zh.Dates.Jan:1æ
+zh.Dates.Feb:2æ
+zh.Dates.Mar:3æ
+zh.Dates.Apr:4æ
+zh.Dates.May:5æ
+zh.Dates.Jun:6æ
+zh.Dates.Jul:7æ
+zh.Dates.Aug:8æ
+zh.Dates.Sep:9æ
+zh.Dates.Oct:10æ
+zh.Dates.Nov:11æ
+zh.Dates.Dec:12æ
Index: /main/branches/stable_gs3/release-kits/shared/core/uninstaller/Uninstall.bat
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/uninstaller/Uninstall.bat	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/uninstaller/Uninstall.bat	(revision 21851)
@@ -0,0 +1,32 @@
+@echo off
+CD /D "%~dp0"
+if exist .\bin\windows\search4j.exe .\bin\windows\search4j.exe -p .\packages\jre -l .\uninst.jar
+
+if exist .\gs2build\bin\windows\search4j.exe .\gs2build\bin\windows\search4j.exe -p .\packages\jre -l .\uninst.jar
+
+
+if exist uninst.flag (
+
+	rd /s /q .\packages\jre
+	rmdir packages
+	
+	if exist .\bin\windows\search4j.exe (
+		del .\bin\windows\search4j.exe
+		rmdir bin\windows
+	)
+	if exist .\gs2build\bin\windows\search4j.exe (
+		del .\gs2build\bin\windows\search4j.exe
+		rd /s /q gs2build
+	)
+		
+	del uninst.jar
+	del uninst.flag
+	del Uninstall.*
+	
+	if NOT EXIST *.* (
+		set GSDEL=%CD%
+		cd ..
+		rmdir %GSDEL%
+	)
+	
+)
Index: /main/branches/stable_gs3/release-kits/shared/core/uninstaller/Uninstall.sh
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/uninstaller/Uninstall.sh	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/uninstaller/Uninstall.sh	(revision 21851)
@@ -0,0 +1,40 @@
+if [ -f "setup.bash" ]; then
+	#This is Greenstone 2
+	. ./setup.bash > /dev/null
+	SEARCH4J_EXECUTABLE=$GSDLHOME/bin/$GSDLOS/search4j
+
+elif [ -f "gs2build/setup.bash" ]; then
+	#This is Greenstone 3
+	. ./gs2build/setup.bash > /dev/null
+	SEARCH4J_EXECUTABLE=./bin/search4j
+
+else
+	echo "Couldn't find setup.bash. This copy of Greenstone appears to be corrupt."
+	echo "To manually uninstall, please delete the entire Greenstone home folder."
+	exit
+fi
+
+if [ $GSDLOS = linux ]; then
+	"$SEARCH4J_EXECUTABLE" -p ./packages/jre -l ./uninst.jar
+elif [ $GSDLOS = darwin ]; then
+	"$SEARCH4J_EXECUTABLE" -p /System/Library/Frameworks/JavaVM.framework/Home -l ./uninst.jar
+fi
+
+if [ -e "uninst.flag" ]; then
+
+	rm -rf packages/jre &> /dev/null
+	rmdir packages &> /dev/null
+	
+	rm -rf bin &> /dev/null
+		
+	rm uninst.jar &> /dev/null
+	rm uninst.flag &> /dev/null
+	rm Uninstall.* &> /dev/null
+	
+	CONTENTS=`ls`
+	if [ -z "$CONTENTS" ]; then
+		GSDEL=`pwd`
+		cd ..
+		rmdir $GSDEL &> /dev/null
+	fi
+fi
Index: /main/branches/stable_gs3/release-kits/shared/core/uninstaller/Uninstaller.java
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/uninstaller/Uninstaller.java	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/uninstaller/Uninstaller.java	(revision 21851)
@@ -0,0 +1,593 @@
+import java.util.ResourceBundle;
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JButton;
+import javax.swing.BoxLayout;
+import javax.swing.JTextArea;
+import javax.swing.JScrollPane;
+import javax.swing.border.EmptyBorder;
+import javax.swing.JOptionPane;
+import javax.swing.Box;
+import javax.swing.JDialog;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+
+import java.io.File;
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.FileNotFoundException;
+import java.io.FileWriter;
+import java.io.IOException;
+
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
+import java.util.ArrayList;
+
+import javax.swing.SwingUtilities;
+
+import java.util.Enumeration;
+import java.awt.Font;
+import javax.swing.plaf.FontUIResource;
+import javax.swing.UIManager;
+
+
+
+public class Uninstaller {
+
+	public static int SCREEN_WIDTH = 600;
+	public static int SCREEN_HEIGHT = 450;
+
+	public static final ResourceBundle bundle = ResourceBundle.getBundle("resources.LanguagePack");
+
+	public static final File gs2InstallProps = new File("etc/installation.properties");
+	public static final File gs3InstallProps = new File("installation.properties");
+
+	boolean keepCollections = true;
+	//boolean keepModifiedFiles = false;
+	boolean ignoreReadOnlys = false;
+
+	JFrame frame;
+	JCheckBox keepCollectionsCheckbox;
+	//JCheckBox keepModifiedFilesCheckbox;
+
+	//panels
+	JPanel progressPanel;
+	JPanel introPanel;
+
+	//toolbars	
+	JPanel initialToolbar;
+	JPanel finishToolbar;
+
+
+	JScrollPane logPane;
+	FollowingJTextArea log;
+	JButton uninstallButton;
+	JButton finishButton;
+
+	boolean confirmationGiven = false;
+	Thread mainThread = null;
+	
+	public static void main( String[] args ) {
+		(new Uninstaller()).go();
+	}
+
+	public void go() {
+
+		//set font
+		String new_default_font_str = null;
+		if ( System.getProperty("os.name").equals("Linux") ) {
+			new_default_font_str = "Bitstream Cyberbit";
+		} else if ( System.getProperty("os.name").startsWith("Windows") ) {
+			new_default_font_str = "Arial Unicode MS";
+		}
+
+		if ( new_default_font_str != null ) {
+
+			FontUIResource default_font = new FontUIResource(new_default_font_str, Font.PLAIN, 12);
+			Enumeration keys = UIManager.getDefaults().keys();
+			while (keys.hasMoreElements()) {
+				Object key = keys.nextElement();
+				Object value = UIManager.get(key);
+				if (value instanceof FontUIResource) {
+					UIManager.put(key, default_font);
+				}
+			}
+
+		}
+
+
+		mainThread = Thread.currentThread();
+
+		frame =  new JFrame();
+		frame.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );
+		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
+		frame.setLocation(screenSize.width/2 - frame.getWidth()/2, screenSize.height/2 - frame.getHeight()/2);
+
+		//The panel to introduce and ask for options
+		introPanel = new JPanel(new BorderLayout());
+		JPanel innerPanel = new JPanel();
+		innerPanel.setLayout( new BoxLayout(innerPanel,BoxLayout.Y_AXIS) );
+		innerPanel.setBorder( new EmptyBorder(10, 10, 5, 10) );
+		introPanel.add( BorderLayout.WEST, innerPanel );
+
+		//The panel to be displayed while the uninstall is happening
+		progressPanel = new JPanel(new BorderLayout());
+		log = new FollowingJTextArea();
+		log.setEditable(false);
+		logPane = new JScrollPane(log);
+		logPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
+		logPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
+		progressPanel.add( BorderLayout.NORTH, new JLabel("Progress") );
+		progressPanel.add( BorderLayout.CENTER, logPane );
+
+		//initial toolbar
+		initialToolbar = new JPanel();
+		uninstallButton = new JButton(bundle.getString("uninstaller.uninstall"));
+		uninstallButton.addActionListener( new StartUninstallListener() );
+		JButton cancelButton = new JButton(bundle.getString("uninstaller.cancel"));
+		cancelButton.addActionListener( new CancelListener() );
+		initialToolbar.add(uninstallButton);
+		initialToolbar.add(cancelButton);
+
+		//finish toolbar
+		finishToolbar = new JPanel();
+		finishButton = new JButton(bundle.getString("uninstaller.finish"));
+		finishButton.addActionListener( new FinishListener() );
+		finishButton.setEnabled( false );
+		finishToolbar.add( finishButton );
+
+
+		String pwd = (new File(".")).getAbsolutePath();
+		if ( pwd.endsWith("/.") ) {
+			pwd = pwd.substring( 0, pwd.length()-2 );
+		}
+
+		JLabel l;		
+
+		l = new JLabel(bundle.getString("uninstaller.will.uninstall.from"));
+		innerPanel.add( l );
+		innerPanel.add( Box.createRigidArea(new Dimension(5,5)) );
+
+		l = new JLabel("  " + pwd);
+		l.setFont( new Font( "Monospaced", Font.BOLD, 14 ) );
+		innerPanel.add( l );
+		innerPanel.add( Box.createRigidArea(new Dimension(5,20)) );
+
+		l = new JLabel(bundle.getString("uninstaller.uninstall.options"));
+		innerPanel.add( l );
+
+		keepCollectionsCheckbox = new JCheckBox(bundle.getString("uninstaller.keep.collections"));
+		keepCollectionsCheckbox.setSelected(true);
+		innerPanel.add( keepCollectionsCheckbox );
+
+		//keepModifiedFilesCheckbox = new JCheckBox("Keep Modified Files");
+		//innerPanel.add( keepModifiedFilesCheckbox );
+
+		frame.setTitle( bundle.getString("uninstaller.greenstone.uninstaller") );
+		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+		//the initial screen
+		frame.getContentPane().add( BorderLayout.CENTER, introPanel );
+		frame.getContentPane().add( BorderLayout.SOUTH, initialToolbar );
+
+		frame.setVisible(true);
+		
+		boolean ready = precheck();
+		if ( !ready ) {
+			System.exit(0);
+		}
+
+		//block and wait for signal to do the uninstall
+		do {
+			try {
+				Thread.sleep( Long.MAX_VALUE );
+			} catch ( InterruptedException ie ) {
+			}
+		} while ( !confirmationGiven );
+
+		doUninstall();
+		finishButton.setEnabled( true );
+
+	}
+
+	class CancelListener implements ActionListener {
+		public void actionPerformed( ActionEvent e ) {
+			System.exit(0);
+		}
+	}
+
+	class FinishListener implements ActionListener {
+		public void actionPerformed( ActionEvent e ) {
+			System.exit(0);
+		}
+	}
+
+	class StartUninstallListener implements ActionListener {
+		public void actionPerformed( ActionEvent e ) {
+
+			//The dialog to ask "are you sure"
+			Object[] options = { bundle.getString("uninstaller.uninstall"), bundle.getString("uninstaller.cancel") };
+			int n = JOptionPane.showOptionDialog(
+				frame,
+				bundle.getString("uninstaller.are.you.sure"),
+				bundle.getString("uninstaller.confirmation"),
+			    JOptionPane.YES_NO_CANCEL_OPTION,
+			    JOptionPane.QUESTION_MESSAGE,
+			    null,
+			    options,
+			    options[0]
+			);
+			if ( n == 1 ) {
+				return;
+			}
+
+			keepCollections = keepCollectionsCheckbox.isSelected();
+			//keepModifiedFiles = keepModifiedFilesCheckbox.isSelected();
+
+			//confirm delete of collections
+			if ( !keepCollections ) {
+				options[0] = bundle.getString("uninstaller.continue");
+				options[1] = bundle.getString("uninstaller.cancel");
+				n = JOptionPane.showOptionDialog(
+					frame,
+					bundle.getString("uninstaller.are.you.sure.collections"),
+					bundle.getString("uninstaller.confirmation"),
+				    JOptionPane.YES_NO_CANCEL_OPTION,
+				    JOptionPane.WARNING_MESSAGE,
+				    null,
+				    options,
+				    options[0]
+				);
+				if ( n == 1 ) {
+					return;
+				}
+			}
+
+			
+			introPanel.setVisible( false );
+			frame.getContentPane().remove(introPanel);
+			frame.getContentPane().add( BorderLayout.CENTER, progressPanel );
+
+			initialToolbar.setVisible( false );
+			frame.getContentPane().remove( initialToolbar );
+			frame.getContentPane().add( BorderLayout.SOUTH, finishToolbar);
+
+			confirmationGiven = true;
+			mainThread.interrupt();
+		}
+	}
+
+	/**
+	 * Do some checks
+	 */
+	public boolean precheck() {
+
+		if ( !gs2InstallProps.exists() && !gs3InstallProps.exists() ) {
+			log( bundle.getString("uninstaller.error.couldnt.find.install.props") + "\n" );
+			JOptionPane.showMessageDialog(frame, bundle.getString("uninstaller.error.couldnt.find.install.props"), bundle.getString("uninstaller.error"), 0);
+			return false;
+		}
+		return true;
+				
+	}
+
+	public void log( String s ) {
+		SwingUtilities.invokeLater( new LogAppender( s ) );
+		//log.append( s );
+		
+	}
+
+	/**
+	 * Does the uninstall
+	 */
+	public void doUninstall() {
+
+		File startMenuPath = null;
+
+		//delete the start menu group if present
+
+		if ( gs2InstallProps.exists() ) {
+			String smp = null;
+			try {
+				smp = getPropertyValue( "installed.startmenu.path", gs2InstallProps );
+			} catch ( Exception e ) {
+				System.err.println( e.getMessage() );
+			}
+			if ( smp != null ) {
+				startMenuPath = new File( smp );
+			}
+		} else if ( gs3InstallProps.exists() ) {
+			String smp = null;
+			try {
+				smp = getPropertyValue( "installed.startmenu.path", gs3InstallProps );
+			} catch ( Exception e ) {
+				System.err.println( e.getMessage() );
+			}
+			if ( smp != null ) {
+				startMenuPath = new File( smp );
+			}
+		}
+
+		if ( startMenuPath == null ) {
+
+			log( bundle.getString("uninstaller.info.no.startmenu") + "\n" );
+
+		} else {
+			log( "StartMenu Path: " + startMenuPath.getAbsolutePath() + "\n" );
+
+			try {
+				recursiveDelete( startMenuPath, null );
+			} catch ( CancelledException ce ) {
+				log( bundle.getString("uninstaller.cancelled") + "\n" );
+				changeToFinishToolbar();
+				JOptionPane.showMessageDialog(frame, bundle.getString("uninstaller.cancelled"), bundle.getString("uninstaller.complete"), 1);
+				return;
+			}
+		}
+
+		//delete the files
+		try {
+			ArrayList exceptions = new ArrayList();
+
+			//never delete the things we are currently running
+			exceptions.add( new File("bin/search4j.exe") );
+			exceptions.add( new File("bin/search4j") );
+
+			exceptions.add( new File("bin/windows/search4j.exe") );
+			exceptions.add( new File("bin/linux/search4j") );
+			exceptions.add( new File("bin/darwin/search4j") );
+
+			exceptions.add( new File("packages/jre") );
+			exceptions.add( new File("uninst.jar") );
+			exceptions.add( new File("Uninstall.bat") );
+			exceptions.add( new File("Uninstall.sh") );
+
+			if ( keepCollections ) {
+				exceptions.add( new File("web/sites/localsite/collect") );
+				exceptions.add( new File("collect") );
+			}
+
+
+			File cd = null;
+			try {
+				cd = new File( new File(".").getCanonicalPath() );
+			} catch ( Exception e ) {
+				JOptionPane.showMessageDialog(frame, bundle.getString("uninstaller.failed.to.figure.cd"), bundle.getString("uninstaller.error") , 0);
+				System.exit(0);
+			}
+			
+			File[] ex = new File[exceptions.size()];
+			for ( int i=0; i<exceptions.size(); i++ ) {
+				ex[i] = (File)exceptions.get(i);
+			}
+			
+			recursiveDelete( cd , ex );
+		} catch ( CancelledException ce ) {
+			log( bundle.getString("uninstaller.cancelled") + "\n" );
+			JOptionPane.showMessageDialog(frame, bundle.getString("uninstaller.cancelled"), bundle.getString("uninstaller.complete"), 1);
+			changeToFinishToolbar();
+			return;
+		}
+
+		//create the flag file to indicate the uninstaller wants jre and uninst.jar to be deleted
+		try {
+			(new File("uninst.flag")).createNewFile();
+		} catch (Exception e) {
+			log( bundle.getString("uninstaller.couldnt-create-flagfile") + "\n" );
+		}
+
+		changeToFinishToolbar();
+		log( bundle.getString("uninstaller.finished") );
+		JOptionPane.showMessageDialog(frame, bundle.getString("uninstaller.finished"), bundle.getString("uninstaller.complete"), 1);
+	}
+
+	class LogAppender implements Runnable {
+		String s;
+
+		public LogAppender( String s ) {
+			this.s = s;
+		}
+
+		public void run() {
+			log.append( s );
+		}
+
+	}
+
+	public String getPropertyValue( String propertyName, File file ) throws Exception {
+
+		String regex = "^" + propertyName.replaceAll("\\.","\\\\.") + "[:=]\\s*(.*)$";
+		Pattern wantedLine = Pattern.compile( regex );
+		BufferedReader in = null;
+		try {
+			in = new BufferedReader(new FileReader( file ));
+		} catch ( Exception e ) {
+			throw new Exception( "Error - couldn't open the properties file " + file );
+		}
+
+		String line, value = null;
+
+		try {
+			boolean found = false;
+			while ( (line = in.readLine()) != null && !found ) {
+
+				Matcher matcher = wantedLine.matcher( line );
+				if ( matcher.matches() ) {
+					//found the property
+					//System.err.println( "found the property" );
+					value = matcher.group(1);
+					value = value.replaceAll( "#.*", "" ).trim();
+					return value;
+				}
+
+			}
+
+			//close the input stream
+			//System.err.println( "close the input stream" );
+			in.close();
+
+		} catch ( Exception e ) {
+			throw new Exception( "Error - couldn't read from the properties file" );
+		}
+		return null;
+
+	}
+
+	public void recursiveDelete( File f, File[] exceptions ) throws CancelledException {
+
+		//log.append( "Processing: " + f.getAbsolutePath() + "\n" );
+
+		// if this is an exception, return
+		if ( exceptions != null ) {
+			for ( int i=0; i<exceptions.length; i++ ) {
+				//System.out.println( "Comparing '" + f.getAbsolutePath() + "' with '" + exceptions[i].getAbsolutePath() + "'" );
+				try {
+					if ( f.equals( exceptions[i] ) || f.getCanonicalPath().equals(exceptions[i].getCanonicalPath()) ) {
+						log( Strings.replaceAll( bundle.getString("uninstaller.info.skipping"), "{file}", f.getAbsolutePath() ) + "\n" );
+						return;
+					}
+				} catch ( Exception e ) {
+					System.err.println("ERROR: Failed to resolve a path");
+					return;
+				}
+			}
+		}
+
+		//if it is a directory, recurse
+		if (f.isDirectory()) {
+			File[] files = f.listFiles();
+			if ( files != null && files.length > 0) {
+				for ( int i=0; i<files.length; i++ ) {
+					try {
+						recursiveDelete( files[i], exceptions );
+					} catch ( CancelledException ce ) {
+						throw new CancelledException();
+					}
+				}
+			}
+		}
+
+		//if this is now an empty directory, or a file, delete it
+		boolean doDelete = true;
+		if ( f.isDirectory() ) {
+			File[] files = f.listFiles();
+			doDelete = ( files == null || files.length == 0 );
+		}
+		
+		if ( doDelete ) {
+
+			log( Strings.replaceAll( bundle.getString("uninstaller.deleting"), "{file}", f.getAbsolutePath() ) + "\n" );
+
+			if ( !f.delete() ) {
+				log( "*********\n" + Strings.replaceAll( bundle.getString("uninstaller.warning.couldnt.delete"), "{file}", f.getAbsolutePath() ) + "\n*********\n" );
+				return;
+			}
+		}
+
+	}
+
+	class CancelledException extends Exception {}
+
+	public void changeToFinishToolbar() {
+		initialToolbar.setVisible(false);
+		frame.getContentPane().remove(initialToolbar);
+		frame.getContentPane().add( BorderLayout.SOUTH, finishToolbar );
+		finishToolbar.setVisible(true);
+	}
+
+}
+
+class Strings {
+	static String replaceAll( String s, String nugget, String replacement ) {
+		StringBuffer string = new StringBuffer(s);
+		StringBuffer r = new StringBuffer();
+
+		int io = 0;
+		while ( (io=string.toString().indexOf(nugget)) != -1 ) {
+			r.append( string.toString().substring( 0, io ) );
+			r.append( replacement );
+			string.delete( 0, io + nugget.length() );
+		}
+		r.append( string.toString() );
+		return r.toString();
+	}
+}
+
+class FollowingJTextArea extends JTextArea {
+
+    private boolean follow = true;
+
+    public FollowingJTextArea() {
+        jInit();
+    }
+
+
+    private void jInit(){
+        final JPopupMenu popUp = getPopupMenu();
+        this.add(popUp);
+        this.addMouseListener(new MouseAdapter(){
+            public void mouseClicked(MouseEvent e) {
+                if (e.getButton() == e.BUTTON3) {
+                    popUp.show(FollowingJTextArea.this,e.getX(),e.getY());
+                }
+            }
+        });
+    }
+
+    public boolean isFollow() {
+        return follow;
+    }
+    public void setFollow(boolean follow) {
+        this.follow = follow;
+    }
+
+    private void scrollToEnd(){
+        setCaretPosition(getDocument().getLength());
+    }
+    private void toggleFollow(){
+        setFollow(!isFollow());
+    }
+
+    /**
+     * Appends the given text to the end of the document.
+     *
+     * @param str the text to insert
+     * @todo Implement this javax.swing.JTextArea method
+     */
+    public void append(String str) {
+        super.append(str);
+        if(follow)scrollToEnd();
+    }
+    private JPopupMenu getPopupMenu() {
+        JPopupMenu contextMenu = new JPopupMenu("Options");
+
+        JMenuItem toggleFollowMenu = new JMenuItem("Toggle Follow");
+        toggleFollowMenu.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                toggleFollow();
+            }
+        });
+        contextMenu.add(toggleFollowMenu);
+
+        JMenuItem jumpToEndMenu = new JMenuItem("Jump To End");
+        jumpToEndMenu.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                setCaretPosition(getDocument().getLength());
+            }
+        });
+        contextMenu.add(toggleFollowMenu);
+
+        JMenuItem clearTextMenu = new JMenuItem("Clear Text");
+        clearTextMenu.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                setText("");
+            }
+        });
+        contextMenu.add(clearTextMenu);
+        return contextMenu;
+    }
+}
Index: /main/branches/stable_gs3/release-kits/shared/core/uninstaller/compile.bat
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/uninstaller/compile.bat	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/uninstaller/compile.bat	(revision 21851)
@@ -0,0 +1,15 @@
+rm -rf resources
+mkdir resources
+cp ../language-strings/*.properties resources
+
+javac Uninstaller.java
+jar -cmf manifest.mf gsdl-template/uninst.jar *.class resources
+
+
+cp Uninstall.bat gsdl-template
+cp Uninstall.sh gsdl-template
+rm *.class
+
+rm -rf gsdl startmenu
+cp -r gsdl-template gsdl
+cp -r startmenu-template startmenu
Index: /main/branches/stable_gs3/release-kits/shared/core/uninstaller/compile.sh
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/uninstaller/compile.sh	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/uninstaller/compile.sh	(revision 21851)
@@ -0,0 +1,23 @@
+rk_home=$1
+if [ "$rk_home" = "" ]; then
+	echo "usage: ./compile.sh <rk_home>"
+	exit
+fi
+
+#setup language string bundle
+rm -rf resources
+mkdir resources
+cp $rk_home/core/language-strings/*.properties resources
+
+#java compile
+javac Uninstaller.java
+jar -cmf manifest.mf gsdl-template/uninst.jar *.class resources
+
+#setup a fake greenstone installation
+cp Uninstall.bat gsdl-template
+cp Uninstall.sh gsdl-template
+rm *.class
+
+rm -rf gsdl startmenu
+cp -r gsdl-template gsdl
+cp -r startmenu-template startmenu
Index: /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/build.properties
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/build.properties	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/build.properties	(revision 21851)
@@ -0,0 +1,1 @@
+lines
Index: /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/build.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/build.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/build.xml	(revision 21851)
@@ -0,0 +1,1 @@
+lines
Index: /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/collect/demo/demo.cfg
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/collect/demo/demo.cfg	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/collect/demo/demo.cfg	(revision 21851)
@@ -0,0 +1,1 @@
+demo
Index: /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/etc/main.cfg
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/etc/main.cfg	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/etc/main.cfg	(revision 21851)
@@ -0,0 +1,1 @@
+test
Index: /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/installation.properties
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/installation.properties	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/installation.properties	(revision 21851)
@@ -0,0 +1,1 @@
+startmenu.path:/some/path
Index: /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/non-exist
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/non-exist	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/non-exist	(revision 21851)
@@ -0,0 +1,1 @@
+link xyz
Index: /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/setup.bash
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/setup.bash	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/setup.bash	(revision 21851)
@@ -0,0 +1,240 @@
+# if this file is executed, /bin/sh is used, as we don't start with #!
+# this should work under ash, bash, zsh, ksh, sh style shells.
+gsdllang=en
+# encoding inputs and outputs
+gsdltoenc=""
+gsdlfromenc=""
+
+# see if the shell has any language environment variables set
+# see locale(7) manpage for this ordering.
+if test ! -z "$LC_ALL" ; then
+  gsdllang="$LC_ALL"
+elif test ! -z "$LANG"; then
+  gsdllang="$LANG"
+fi
+
+
+# note... all our output strings have the charset hard-coded, but
+# people may be using a different encoding in their terminal. LANG
+# strings look like "en_NZ.UTF-8".
+
+# Determine the requested output encoding
+case $gsdllang in
+  *.*)
+    gsdltoenc=`echo $gsdllang | sed 's/.*\.//'`
+    ;;
+esac
+
+# Our french and spanish strings are currently in iso-8859-1 encoding.
+case $gsdllang in
+  fr*|FR*)
+    gsdllang=fr
+    gsdlfromenc="iso-8859-1"
+  ;;
+  es*|ES*)
+    gsdllang=es
+    gsdlfromenc="iso-8859-1"
+  ;;
+  ru*|RU*)
+    gsdllang=ru
+    gsdlfromenc="koi8r"
+  ;;
+  *) # default
+    gsdllang=en
+    gsdlfromenc="iso-8859-1"
+  ;;
+esac  
+
+# "iconv" is the program for converting text between encodings.
+gsdliconv=`which iconv 2>/dev/null`
+if test $? -ne 0 || test ! -x "$gsdliconv" || test -z "$gsdlfromenc" || test -z "$gsdltoenc"; then
+# we can't convert encodings from some reason
+  gsdliconv="cat"
+else
+# add the encodings
+  gsdliconv="$gsdliconv -f $gsdlfromenc -t $gsdltoenc"
+fi
+
+# make sure we are sourced, and not run
+
+if test "$0" != "`echo $0 | sed s/setup\.bash//`" ; then
+# if $0 contains "setup.bash" we've been run... $0 is shellname if sourced.
+# One exception is zsh has an option to set it temporarily to the script name
+  if test -z "$ZSH_NAME" ; then
+  # we aren't using zsh
+  gsdl_not_sourced=true
+  fi
+fi
+
+if test -n "$gsdl_not_sourced" ; then
+  case "$gsdllang" in
+ "es")
+eval $gsdliconv <<EOF
+      Error: Asegï¿œrese de compilar este guiï¿œn, no de ejecutarlo. P. ej.:
+         $ source setup.bash
+      o
+         $ . ./setup.bash
+      no
+         $ ./setup.bash
+EOF
+  ;;
+  "fr")
+eval $gsdliconv <<EOF
+      Erreur: Assurez-vous de "sourcer" le script, plutï¿œt que de l'exï¿œcuter. Ex:
+         $ source setup.bash
+      ou
+         $ . ./setup.bash
+      pas
+         $ ./setup.bash
+EOF
+  ;;
+  "ru")
+eval $gsdliconv <<EOF
+      ï¿œï¿œï¿œï¿œï¿œï¿œ: ï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œ ï¿œ ï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œ ï¿œï¿œï¿œï¿œï¿œ ï¿œï¿œï¿œï¿œï¿œï¿œï¿œ. ï¿œï¿œ ï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œ ï¿œï¿œï¿œ.
+      ï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œ:
+         $ source setup.bash
+      ï¿œï¿œï¿œ
+         $ . ./setup.bash
+      ï¿œï¿œï¿œ
+         $ ./setup.bash
+EOF
+  ;;
+  *)
+eval $gsdliconv <<EOF
+	Error: Make sure you source this script, not execute it. Eg:
+		$ source setup.bash
+	or
+		$ . ./setup.bash
+	not
+		$ ./setup.bash
+EOF
+  ;;
+  esac
+elif test -n "$GSDLHOME" ; then
+  case "$gsdllang" in
+  "es")
+    echo 'ï¿œSu ambiente ya estï¿œ listo para Greenstone!' | eval $gsdliconv
+  ;;
+  "fr")
+    echo 'Votre environnement est dï¿œjï¿œ prï¿œparï¿œ pour Greenstone!' | eval $gsdliconv
+ ;;
+  "ru")
+    echo 'ï¿œï¿œï¿œï¿œ ï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œ ï¿œï¿œï¿œ ï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œ ï¿œï¿œï¿œ Greenstone!' | eval $gsdliconv
+  ;;
+  *)
+    echo 'Your environment is already set up for Greenstone!'
+  ;;
+  esac
+elif test ! -f setup.bash ; then
+  case "$gsdllang" in
+    "es")
+eval $gsdliconv <<EOF
+Usted debe compilar el guiï¿œn desde el interior del directorio de inicio
+de Greenstone.
+EOF
+  ;;
+  "fr")
+echo 'Vous devez trouver la source du script dans le rï¿œpertoire de base de Greenstone' | eval $gsdliconv
+  ;;
+  "ru")
+eval $gsdliconv <<EOF
+ï¿œï¿œï¿œ ï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œ ï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œ ï¿œï¿œï¿œï¿œï¿œï¿œï¿œ ï¿œï¿œ ï¿œï¿œï¿œï¿œï¿œï¿œï¿œ ï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œ Greenstone
+EOF
+  ;;
+  *)
+    echo 'You must source the script from within the Greenstone home directory'
+  ;;
+  esac
+else
+  GSDLHOME=`pwd`
+  export GSDLHOME
+  GSDLOS=`uname -s | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+  # check for running bash under cygwin
+  if test "`echo $GSDLOS | sed 's/cygwin//'`" != "$GSDLOS" ;
+  then
+    GSDLOS=windows
+  fi
+  export GSDLOS
+
+  PATH=$PATH:$GSDLHOME/bin/script:$GSDLHOME/bin/$GSDLOS
+  export PATH
+
+  
+  
+  # Override Imagemagick and Ghostscript paths to the bundled applications shipped with greenstone if they exists otherwise use default environment variables.
+
+if test -d $GSDLHOME/bin/$GSDLOS/imagemagick ; then
+	PATH="$GSDLHOME/bin/$GSDLOS/imagemagick/bin:$PATH"
+	export PATH
+  
+	MAGICK_HOME="$GSDLHOME/bin/$GSDLOS/imagemagick"
+	export MAGICK_HOME
+  
+		if test "$GSDLOS" = "linux" ; then
+			LD_LIBRARY_PATH="$GSDLHOME/bin/$GSDLOS/imagemagick/lib:$LD_LIBRARY_PATH"
+			export LD_LIBRARY_PATH
+		
+		elif test "$GSDLOS" = "darwin" ; then
+			DYLD_LIBRARY_PATH="$GSDLHOME/bin/$GSDLOS/imagemagick/lib:$DYLD_LIBRARY_PATH"
+			export DYLD_LIBRARY_PATH
+		fi
+fi
+
+
+  # Note: Ghostscript is only bundled with Greenstone on Mac and Windows, not on Linux. The code below should be used only for the Darwin platform
+  # for Windows please see setup.bat
+if test -d $GSDLHOME/bin/$GSDLOS/ghostscript ; then
+	PATH="$GSDLHOME/bin/$GSDLOS/ghostscript/bin":"$PATH"
+	export PATH
+  
+	GS_LIB="$GSDLHOME/bin/$GSDLOS/ghostscript/share/ghostscript/8.63/lib"
+	export GS_LIB
+
+	GS_FONTPATH="$GSDLHOME/bin/$GSDLOS/ghostscript/share/ghostscript/8.63/Resource/Font"
+	export GS_FONTPATH
+fi
+  
+  
+  
+  MANPATH=$MANPATH:$GSDLHOME/packages/mg/man
+  export MANPATH
+  case "$gsdllang" in
+    "es")
+      echo 'Su ambiente ha sido configurado para correr los programas Greenstone.' | eval $gsdliconv
+    ;;
+    "fr")
+      echo 'Votre environnement a ï¿œtï¿œ configuï¿œre avec succï¿œs pour exï¿œcuter Greenstone' | eval $gsdliconv
+    ;;
+    "ru")
+eval $gsdliconv <<EOF
+ï¿œï¿œï¿œï¿œ ï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œ ï¿œï¿œï¿œï¿œ ï¿œï¿œï¿œï¿œï¿œï¿œï¿œ ï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œ, ï¿œï¿œï¿œï¿œï¿œ ï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œï¿œ Greenstone
+EOF
+    ;;
+    *)
+      echo 'Your environment has successfully been set up to run Greenstone'
+    ;;
+  esac
+fi
+unset gsdl_not_sourced
+unset gsdliconv
+unset gsdlfromenc
+unset gsdltoenc
+
+if test -e ext ; then
+  for gsdl_ext in ext/* ; do
+    cd $gsdl_ext > /dev/null
+    if test -e setup.bash ; then 
+      . ./setup.bash 
+    fi 
+    cd ../..  
+  done
+fi
+
+if test -e local ; then
+  PATH=$GSDLHOME/local/bin:$PATH
+  export PATH
+  LD_LIBRARY_PATH=$GSDLHOME/local/lib:$LD_LIBRARY_PATH
+  export LD_LIBRARY_PATH
+fi
+
+
Index: /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/test2-link.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/test2-link.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/test2-link.txt	(revision 21851)
@@ -0,0 +1,1 @@
+link test2.txt
Index: /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/test2.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/test2.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/test2.txt	(revision 21851)
@@ -0,0 +1,1 @@
+test
Index: /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/web/sites/localsite/collect/demo/index.db
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/web/sites/localsite/collect/demo/index.db	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/web/sites/localsite/collect/demo/index.db	(revision 21851)
@@ -0,0 +1,1 @@
+test
Index: /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/web/sites/localsite/test.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/web/sites/localsite/test.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/web/sites/localsite/test.txt	(revision 21851)
@@ -0,0 +1,1 @@
+test
Index: /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/web/test.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/web/test.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/uninstaller/gsdl-template/web/test.txt	(revision 21851)
@@ -0,0 +1,1 @@
+test
Index: /main/branches/stable_gs3/release-kits/shared/core/uninstaller/manifest.mf
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/uninstaller/manifest.mf	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/uninstaller/manifest.mf	(revision 21851)
@@ -0,0 +1,1 @@
+Main-Class: Uninstaller
Index: /main/branches/stable_gs3/release-kits/shared/core/uninstaller/startmenu-template/Adobe Photoshop/Photoshop.lnk
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/uninstaller/startmenu-template/Adobe Photoshop/Photoshop.lnk	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/uninstaller/startmenu-template/Adobe Photoshop/Photoshop.lnk	(revision 21851)
@@ -0,0 +1,1 @@
+ps
Index: /main/branches/stable_gs3/release-kits/shared/core/uninstaller/startmenu-template/Greenstone 2.81/GEMS.lnk
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/uninstaller/startmenu-template/Greenstone 2.81/GEMS.lnk	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/uninstaller/startmenu-template/Greenstone 2.81/GEMS.lnk	(revision 21851)
@@ -0,0 +1,1 @@
+test
Index: /main/branches/stable_gs3/release-kits/shared/core/uninstaller/startmenu-template/Greenstone 2.81/GLI.lnk
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/uninstaller/startmenu-template/Greenstone 2.81/GLI.lnk	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/uninstaller/startmenu-template/Greenstone 2.81/GLI.lnk	(revision 21851)
@@ -0,0 +1,1 @@
+GLI
Index: /main/branches/stable_gs3/release-kits/shared/core/uninstaller/startmenu-template/Greenstone 2.81/Server.lnk
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/core/uninstaller/startmenu-template/Greenstone 2.81/Server.lnk	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/core/uninstaller/startmenu-template/Greenstone 2.81/Server.lnk	(revision 21851)
@@ -0,0 +1,1 @@
+Server
Index: /main/branches/stable_gs3/release-kits/shared/greenstone2/ant-scripts/greenstone2-shared.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone2/ant-scripts/greenstone2-shared.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone2/ant-scripts/greenstone2-shared.xml	(revision 21851)
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+		..........................................................
+		August 2008
+		Targets for Greenstone2 release kits
+		Oran Fry
+		..........................................................
+-->
+<project name="greenstone2-targets">
+
+	<property name="version.major" value="2"/>
+
+	<target name="gs2-init">
+		<property name="server.exe.location" value="http://www.greenstone.org/caveat-emptor/server-${version}-candidate-${date}.exe" />
+		<echo message="server.exe.location:                    ${server.exe.location}"/>
+	</target>
+
+	<target name="gs2-properties">
+		<echo>server.exe.location          (optional)  the version string for the release</echo>
+	</target>
+
+</project>
+	
Index: /main/branches/stable_gs3/release-kits/shared/greenstone2/docs/LICENSE.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone2/docs/LICENSE.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone2/docs/LICENSE.txt	(revision 21851)
@@ -0,0 +1,346 @@
+Greenstone2 is licensed under the GNU General Public License v2
+
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                          675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) 19yy  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 19yy name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
Index: /main/branches/stable_gs3/release-kits/shared/greenstone2/docs/READMEar.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone2/docs/READMEar.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone2/docs/READMEar.txt	(revision 21851)
@@ -0,0 +1,142 @@
+﻿العنوان : برنامج قرينستون للمكتبة الرقمية 
+
+الغرض : مجموعة برامج للمكتبة الرقميه و التي تشمل القدرة على 
+         خدمة مجموعات المكتبه الرقميه وبناء مجموعات جديدة 
+
+المؤلف : مشروع مكتبه نيوزيلندا الرقميه 
+
+الرخصة: الرخصة العامة gnu   (النسخه 2) 
+         الاحكام والشروط الكاملة هي في ملف "COPYING" علي هذا القرص المدمج 
+
+التاريخ : حزيران / يونية 2007 
+
+النسخه : 2.74 
+
+التوثيق  : Install.pdf  برنامج قرينستون للمكتبة الرقمية ، دليل  المثبت 
+     User.pdf برنامج قرينستون للمكتبة الرقمية ، دليل المستخدم 
+     Develop.pdf برنامج قرينستون للمكتبة الرقمية ، دليل المطور 
+     Paper.pdf برنامج قرينستون للمكتبة الرقمية ،من الورق الي  المجموعة
+
+مرافق اضافية 
+         واجهة المكتبي        واجهة رسومية لبناء المجموعات باستخدام قرينستون  (يتطلب النسخه 1.4 من جافا 
+                                 وقت التشغيل البيئة ، وشملت هذه على قرص مدمج) 
+
+منصة حاسوب 
+         يونيكس والنوافذ. ثنائيات وشفره المصدر مدرجة. 
+
+          واجهة المستخدم لقرينستون تستخدم متصفحات ويب قادرة على جافا سكريبت ، 
+         الجداول ، واطارات. المتصفحات التي  تلبي هذه المتطلبات تشمل : 
+
+                 Netscape Navigator 4.0
+                Internet Explorer 4.0
+                Mozilla, Safari
+
+         أحدث نسخ من هذه المتصفحات ينبغي ايضا ان تعمل. 
+
+
+يونيكس  Unix  وقد تم تجميع واختبار شفره المصدر  على لينكس  Linux و سولاريس Solaris. 
+         الشفرة الثنائية تتطلب  وجود  انتل x86 الذي يوزع مع لينكس  و يشمل دعم  ELF الثنائي و دعم  مكتبة  GNU C  (glibc 2.0   او اكبر). التوزيعات التي تلبي هذه المتطلبات تشمل : 
+
+                 رد هات 5.1      Redhat 5.1 
+                 سوسا لينكس 6.1    SuSE Linux 6.1
+                 ديبيان 2.1       Debian 2.1
+                 سلاكوير 4.0      Slackware 4.0
+
+         أحدث نسخ من هذه التوزيعات وينبغي ايضا ان تعمل. 
+
+تم تجميع شفره المصدر في بيئة النوافذ وقد تم تجميع مع Microsoft Visual C++ 4.2 و 6.0 
+         تم إختبار الشفرة الثنائية  على ويندوز 3.1 ، 95/98 ، NT ، 2000 ، أكس بي 
+         التقييد : 
+                 وتتطلب عملية البناء بيرل  PERL، و لذلك لا يمكن بناء  المجموعات 
+                  في ظل ويندوز 3.1 
+
+التثبيت  : install.pdf يصف الاجراء لاكمال التثبيت علي كل من نظام يونيكس Unix
+         ويندوز Windows، ويتضمن معلومات عن إعداد برامج قرينستون  وإعداد مزود Apache ، pws و IIS 
+         بصورة ملائمة. 
+
+         تتوفر نصوص تثبيت مفسرة لكل من  من يونيكس  Unix و  ويندوز Windows، التي توجهك  خطوة تلو الاخرى من خلال إجراءات التثبيت  وتوفير الخيارات المناسبه في كل مرحلة. 
+
+                تثبيت ويندوز 3.1 ، 95/98 ، NT ، 2000 ، أكس بي  : تنفيذ setup.exe
+                تثبيت  يونيكس  Unix: تنفيذ setuplinux.bin 
+
+        تتوفر نصوص نقض التثبيت و تنظيف عملية التثبيت الفاشلة . 
+
+الدعم : يرجى الابلاغ عن اي مشاكل تثبيت وتشغيل برنامج قرينستون للمكتبة الرقمية باستخدام  استماره تقرير الأخطاء المنصوص عليه في   support.htm في  الدليل  في هذا القرص
+         
+
+القائمة البريديه :يمكنط الإنضمام لقائمة قريمستون البريدية  و المتوفرة في  Http://greenstone.org/english/docs.html. معا هذه الصفحة و صفحة الأسئلة الأكثر شيوعا. في  نقطة الموقع هذا توجيه الي الكثير من المعلومات المفيدة. 
+
+محتويات هذا القرص :
+
+         Readme.txt         هذه الوثيقة 
+         COPYING                   يعطي الشروط التي بموجبها يمكن نسخ هذا البرنامج. 
+         Support.htm     استماره للابلاغ عن مشاكل تثبيت و  تشغيل  برنامج قرينستون للمكتبة الرقمية. 
+         setup.exe            ملف ويندوز لينكس الذاتي تركيب البرنامج (ويشمل  الخيار لتثبيت ثنائيات او المصدر) 
+         Setuplinux.bin ملف لينكس  linuxالذاتي تركيب البرنامج (ويشمل   الخيار لتثبيت ثنائيات او المصدر) 
+
+
+docs               التوثيق ، يشمل  ما يلي : 
+        Install.pdf    دليل المثبت و يصف إجراءات التثبيت لكل من  لينكس  linuxو ويندوز لينكس على حد سواء ، ويشمل  معلومات تعليمية  حول قرينستون  و 
+                                                                  مزود الويب Apache
+        User.pdf             دليل المستخدم  و يقدم وصفا شاملا حول  كيفية استخدام  برنامج قرينستون  في الوصول وبناء مجموعات. 
+        Develop.pdf   دليل المطور  و يصف هذا الدليل كيف يعمل  قرينستون . وهو يستهدف  اولئك الذين يرغبون في  تعديل المجموعات و التطوير                                                                                           والمحافظة على البرنامج. 
+        Paper.pdf          من الورق  الي المجموعة وهذا الدليل يعطي معلومات عملية   عن الإعداد الرقمي للنصوص الكاملة للوثائق. 
+
+ Unix    يونكس        إصدارة  يونكس النسخه ، و تشمل ثنائيات  لينكس  Linux 
+
+                     أدلة و ملفات المستوي الأعلي هي : 
+        Install.sh     نص محارة تثبيت يونيكس Unix  (اذا كنت  على لينكس Linux، يشمل الخيار هنا تثبيت الثنائيات أو خلاف ذلك تثبيت المصدر ) 
+ bin          ملفات  لينكس الثنائية
+
+Windows       ملفات ويندوز Windows الثنائية 
+
+                     أدلة و ملفات المستوي الأعلي هي  : 
+
+ bin                        ملفات ويندوز Windows الثنائية 
+
+Gsdl          هيكل دليل برنامج قرينستون للمكتبة الرقمية .و هذا يتطابق مع هيكل دليل  المكتبة الرقمية التي سوف تثبت. 
+      bin                               شفرات التنفيذ 
+      cgi-bin                  نصوص CGI 
+      collect                  مجموعات قرينستون  (وتشمل مجموعة Demo ، و الكشافات و مصادر الوثائق قبل بنائها.) 
+      etc                               ملفات الإعداد ، المدونات .. الخ ، 
+      Gli                               أداة واجهة مكتبي قرينستون 
+      images                     الصور التي تستخدمها الواجهة 
+      macros                    عرض ماكرو 
+      Perllib                 وحدات Perl المستخدمة عند البناء 
+      mappings              يونيكود جداول الترجمة 
+
+                     اجراءات التثبيت تثبت ملفات في بعض  من  هذه الأدلة على النحو التالي : 
+
+                         المستوي الأعلي    الملفات الدفعية أو نص المحارة 
+        bin              شفرات التنفيذ  
+        cgi-bin  نصوص CGI                                      
+        collect    مجموعة Demo     و المجموعات الاضافية كما هو محدد  
+        src, lib, packages           شفرة المصدر إذا تم تحديدها في زمن التثبيت. 
+                          
+                                         
+                                        
+  collect         مجموعات الاخضر (قبل البناء) - نلاحظ انه على الرغم من  اجراء  التثبيت  يثبت  الكشافات التي لم تبني، إلا ان مصادر الوثائق الأصلية  هي 
+                                     متاحة على القرص مدمج. يمكن ان تكون مصادر الوثائق الأصلية  مفيدة لأولئك الذين يحاولون انشاء مجموعات جديدة و التي تنسخ  شكل  هذه المجموعات. 
+
+        demo                         مجموعة قرينستون التوضيحية 
+        dls-e                    المجموعة الفرعية لمكتبة التنمية  
+        Wrdpdf                 العرض التوضيحي  MSWord و PDF  
+        gsarch                  مجموعة أرشيفات قرينستون  
+        Cltbib                  مجموعة بيبليوجرافية 
+        Cltext                  ملحق بيبليوجرافي
+        MARC-e                   مثال مارك  
+        oai                            المجموعة التوضيحية لمبادرة الأرشيف المفتوح  oai  
+        image-e                مجموعة صورة بسيطة  
+        pagedimg-e      مجموعة صور الصفحات  
+        authen-e            مجموعة التعريف و نسق العرض 
+        garish                  مجموعة garish التوضيحية
+        style-e               مجموعة CSS التوضيحية
+        isis-e                  مجموعة CDS/ISIS
+
+ Src           ملفات  مصدر البرنامج 
+
+       Windows                  معلومات الإعداد  للنوافذ Windows 
+       Unix                           معلومات الإعداد للنظام يونيكس  Unix
+       lib                             الشفره المصدريه ++C 
+       packages            الشفره المصدريه ++C للحزم المستخدمة في قرينستون .
+       Src                            الشفره المصدريه ++C
Index: /main/branches/stable_gs3/release-kits/shared/greenstone2/docs/READMEen.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone2/docs/READMEen.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone2/docs/READMEen.txt	(revision 21851)
@@ -0,0 +1,214 @@
+Title	Greenstone digital library software
+
+Purpose
+		A suite of digital library software which includes the ability to
+		serve digital library collections and build new collections
+
+Author	New Zealand Digital Library Project
+
+License
+		GNU General Public Licence (Version 2)
+		Full terms and conditions are in the file "LICENSE.txt"
+
+Date	December 2008
+
+Version svn-trunk
+
+Contents: Programs
+
+	Greenstone library server
+		A cgi program to serve digital library collections
+
+	Greenstone oaiserver
+		A cgi program to serve collections using the OAI-PMH protocol.
+
+	Greenstone Librarian Interface (GLI)
+		A graphical tool for collection building
+
+	Greenstone Editor for Metadata Sets (GEMS)
+		A graphical tool for creating and editing metadata sets used by GLI
+
+Contents: Directory Structure
+
+	bin			Executable code
+	cgi-bin		CGI scripts
+	collect		Collections
+	etc			Configuration files, log files, user databases etc
+	gli			Librarian Interface
+	images		Images and CSS files used by the interface
+	macros		Display macros
+	mappings	Unicode translation tables
+	perllib		Perl modules used for collection building
+
+	If source code is present (from a source release or by adding the 
+	source component):
+
+	common-src	Source code and packages used when building collections and at
+				runtime
+	build-src	Source code and packages only used when building collections
+	runtime-src	Source code and packages only used at runtime
+
+Contents: Additional Packages (available only in full binary releases)
+
+	Java Runtime 1.6 (installer release only)
+	ImageMagick
+	Ghostscript (Windows, Mac only)
+	Perl (Windows only)
+
+Documentation and Support
+	Greenstone Website:
+		http://www.greenstone.org
+		Greenstone's main website.
+	Greenstone Wiki: 
+		http://wiki.greenstone.org
+		Contains documentation, and links to manuals, tutorials etc.
+	Greenstone Mailing List:
+		(to subscribe)		
+		https://list.scms.waikato.ac.nz/mailman/listinfo/greenstone-users
+		(to post)
+		greenstone-users@list.scms.waikato.ac.nz
+	New Zealand Digital Library: 
+		http://www.nzdl.org
+		A demonstration site containing lots of collections
+
+
+Platform
+	Greenstone runs on Unix, Windows 2000/XP/2003/Vista/2008 and 
+	Mac OS 10.5.2 (Leopard).
+
+	The Greenstone Librarian Interface requires version 1.4 or later 
+	of the Java Runtime Environment. Java 1.6 is included in binary 
+	releases of Greenstone.
+
+	The Greenstone user interface uses a Web browser capable of Javascript,
+	Tables, and Frames. Browsers that meet these requirements include:
+
+		Netscape Navigator 4.0
+		Internet Explorer 4.0
+		Mozilla
+		Safari
+
+	More recent versions of these browsers should also work (recommended).
+		
+Unix
+	Source code has been compiled and tested on the following 
+	distributions:
+
+		Ubuntu 8.04 & 8.10
+		Mandriva 2008 Spring
+		OpenSUSE 11
+		Fedora 6 & 9
+		CentOS 5.2
+
+
+Windows
+	Source code can be compiled with Microsoft Visual C++ 6.0, 7 
+	(VS 2003.Net), 8 (VS 2005 Pro or VC++ Express 2005 with Microsoft 
+	Platform SDK 2003 R2).
+
+	Binary code has been tested on 32 bit versions of:
+		Windows 2000
+		Windows XP
+		Windows Server 2003
+		Windows Vista
+		Windows Server 2008
+
+	Greenstone software (version 2.81 and later) no longer runs on 
+		Windows 3.1
+		Windows 95
+		Windows 98
+		Windows Me
+		Windows NT
+
+Mac
+	Source code has been compiled with Xcode 3.1 on Intel Mac OS 10.5.2.
+	Binary has been tested on Intel Mac OS 10.5.2 (Leopard).
+
+	However the source code can be compiled with other versions of Mac OS 
+	and Xcode, in that case please download Imagemagick and Ghostscript to 
+	recompile them from source.
+
+
+
+The Greenstone Server Interface (GSI)
+
+	This is the application with a graphical user interface that allows you to
+	stop and start greenstone's Local Library Server (LLS) and change a few
+	settings like the server's port number. On Linux and Mac it uses the apache
+	web server that comes with Greenstone and on Windows it uses a separate
+	server program.
+
+	The Greenstone 2.82x binary release comes with the Local Library Server
+	ready for use.
+
+	If you're on Windows, then you can click on the Greenstone Server shortcut
+	in your Start Menu to run it.
+
+	If on Linux, you run it by executing the following from your Greenstone
+	installation directory:
+
+		./gs2-server.sh
+
+	This starts up the Greenstone Server Interface (GSI). Certain server
+	settings can be changed through its File > Settings menu.
+
+	For instructions on how to compile up the Local Library Server on Unix
+	systems and for further details on how to start the server through the
+	command line (without using the graphical interface of the GSI application),
+	see below.
+
+
+Local Library Server (LLS) on LINUX AND MAC
+	We've not tested the Local Library Server on Unix systems other than Linux
+	and Mac, but you can try the following out.
+
+	SUMMARY
+	1. If you're compiling and running it, run the following in sequence from your Greenstone installation directory:
+		./configure --enable-apache-httpd
+		make
+		make install
+
+	2.a Then you can launch the GSI graphical user application with:
+		./gs2-server.sh
+
+	2.b OR
+		If working on the command-line, you first need to configure the server
+		after compilation with:
+			./gsicontrol.sh configure-web
+		Then run it with:
+			./gsicontrol.sh web-start
+		To stop it, use:
+			./gsicontrol.sh web-stop
+
+		(If your Unix system can handle Makefiles, you can issue simila
+		commands to "make" as to gsicontrol.sh:
+			make configure-web
+			make web-start
+			make web-stop)
+
+		For a list of all commands that the gsi-control script takes (which is
+		what the Makefile ends up calling anyway), type
+			./gsicontrol.sh
+		This script can be used to change your Greenstone Admin password and
+		change the port number of your server. The same commands can also be
+		issued by running "make <command>", if your Unix machine can handle
+		Makefiles.
+		Some of this functionality to control the Local Library Server is also
+		available through the graphical GSI application, from its
+		File > Settings menu. 
+
+
+	If you've started the Local Libary Server, you can view the collections and
+	the documents it serves up by going to your digital library home. This is at
+	a URL that is of the form:
+		http://localhost:<portnumber>/greenstone/cgi-bin/library.cgi
+	by default it will try to use port 80 if this is available and accessible.
+	If you're using the GSI application and port 80 is in use, it will assign a
+	new one. Alternatively, you can change the port number
+		- through the File > Settings menu of the GSI application.
+		- or change it in the llssite.cfg file located in the Greenstone
+		  installation directory and then run
+			./gsicontrol.sh configure-apache
+
+	The GSI application will launch the library home page for you in your
+	browser if you click the button marked "Enter Library" or "Restart Library".
Index: /main/branches/stable_gs3/release-kits/shared/greenstone2/docs/READMEes.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone2/docs/READMEes.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone2/docs/READMEes.txt	(revision 21851)
@@ -0,0 +1,228 @@
+TÃ­tulo     Programa de Biblioteca Digital Greenstone
+
+Objeto     Una serie de programas de biblioteca digital que comprende
+           la capacidad de alimentar colecciones de bibliotecas digitales
+           y crear nuevas colecciones
+
+Autor      Proyecto de Biblioteca Digital de Nueva Zelandia
+
+Licencia   Licencia PÃºblica General GNU (VersiÃ³n 2)
+           Las condiciones completas figuran en el archivo "COPYING"
+           de este CD-ROM
+
+Fecha      Noviembre 2007
+
+VersiÃ³n    2.75
+
+DocumentaciÃ³n
+           Install.pdf    GuÃ­a de InstalaciÃ³n de la Biblioteca Digital
+                          Greenstone
+           User.pdf       GuÃ­a del Usuario de la Biblioteca Digital Greenstone
+           Develop.pdf    GuÃ­a del Programador de la Biblioteca Digital 
+                          Greenstone
+           Paper.pdf      Del Papel a la ColecciÃ³n
+
+Programas utilitarios suplementarios
+           Interfaz de la Biblioteca Digital  Una herramienta grÃ¡fica para 
+                                              crear y construir colecciones 
+                                              por medio de Greenstone
+                                              (requiere la versiÃ³n 1.4 del 
+                                              Ambiente de EjecuciÃ³n Java 
+                                              incluido en este CD-ROM)
+
+Plataformas
+           Unix y Windows. Comprende los binarios y el cÃ³digo fuente.
+
+           La interfaz de usuario de Greenstone utiliza un navegador Web con
+           capacidad para Javascript, tablas y marcos. Entre los navegadores
+           que cumplen esos requisitos cabe mencionar:
+
+                      Netscape Navigator 4.0
+                      Internet Explorer 4.0
+                      Mozilla, Safari
+
+           Las versiones mÃ¡s recientes  de  estos  navegadores  deben
+           funcionar tambiÃ©n.
+
+Unix       El cÃ³digo fuente se ha compilado y probado en Linux
+           y Solaris.
+           El cÃ³digo binario requiere una distribuciÃ³n Linux basada en un
+           procesador Intel x86 que incluye un apoyo binario ELF y admite la
+           biblioteca GNU C (glibc 2.0 o superior). Las distribuciones que
+           cumplen esos requisitos son:
+
+                      RedHat 5.1
+                      SuSe Linux 6.1
+                      Debian 2.1
+                      Slackware 4.0
+
+           Las versiones mÃ¡s recientes de estas distribuciones deben funcionar
+           tambiÃ©n.
+
+Windows    El cÃ³digo fuente de Windows se ha compilado con Microsoft Visual
+           C++ 4.2 y 6.0.
+           El cÃ³digo binario se ha probado con Windows 3.1, 95/98, NT, 2000
+           y XP.
+           RestricciÃ³n:
+                      El proceso de creaciÃ³n requiere PERL, por lo que las
+                      colecciones no pueden crearse con Windows 3.1.
+
+InstalaciÃ³n
+           En Install.pdf se expone el  procedimiento  completo de instalaciÃ³n
+           para Unix y Windows, y se incluye una guÃ­a informativa sobre la
+           configuraciÃ³n de Greenstone y la configuraciÃ³n adecuada de los
+           servidores Web Apache, PWS e IIS.
+
+           Se proporcionan instrucciones claras de instalaciÃ³n para Unix y
+           Windows que indican paso por paso el procedimiento de instalaciÃ³n y
+           ofrecen opciones apropiadas en cada etapa.
+
+            InstalaciÃ³n de Windows 9x/NT/2000/XP:
+                      ejecÃºtese setup.exe
+            InstalaciÃ³n de Unix:
+                      ejecÃºtese setupLinux.bin
+
+           Se proporcionan tambiÃ©n guiones de desinstalaciÃ³n que permiten
+           comenzar de nuevo en caso de que falle la instalaciÃ³n.
+
+Servicio de apoyo tÃ©cnico
+           SÃ­rvase seÃ±alar cualquier problema de instalaciÃ³n o de
+           funcionamiento del programa de Biblioteca Digital Greenstone
+           utilizando el formulario de comunicaciÃ³n de errores Support.htm que
+           se encuentra en el directorio de nivel superior de este CD-ROM.
+
+           Existe una lista de correo Greenstone en la que usted puede 
+           participar en http://greenstone.org/english/docs.html. Tanto esta 
+           pÃ¡gina como la lista de preguntas mÃ¡s frecuentes de este sitio 
+           contienen una gran cantidad de informaciÃ³n que le puede ser 
+           de utilidad.
+
+Contenido de este CD-ROM
+
+           README.TXT   El presente documento
+
+           COPYING      Expone las condiciones en que se puede copiar este
+                        programa 
+
+           Support.htm  Formulario para comunicar los problemas de instalaciÃ³n
+                        o de funcionamiento de Greenstone
+
+           setup.exe    El software de autoinstalaciÃ³n de Windows (comprende
+                        una opciÃ³n para instalar binarios o el cÃ³digo fuente)
+
+           setupLinux.bin    El software de autoinstalaciÃ³n de Linux (comprende
+                        una opciÃ³n para instalar binarios o el cÃ³digo fuente)
+
+           docs         DocumentaciÃ³n, a saber:
+
+                          Install.pdf   GuÃ­a de InstalaciÃ³n
+                                        Describe el procedimiento de instalaciÃ³n
+                                        de Unix y Windows y comprende una guÃ­a 
+                                        informativa sobre la configuraciÃ³n de 
+                                        Greenstone y el servidor Web Apache.
+
+                          User.pdf      GuÃ­a del Usuario
+                                        Da una explicaciÃ³n exhaustiva sobre cÃ³mo
+                                        utilizar el programa Greenstone de
+                                        creaciÃ³n de colecciones y acceso a
+                                        ellas.
+
+                          Develop.pdf   GuÃ­a del Programador
+                                        En este manual se explica cÃ³mo funciona
+                                        Greenstone. EstÃ¡ destinado a quienes
+                                        desean personalizar las colecciones y
+                                        desarrollar y mantener el programa.
+
+                          Paper.pdf     Del Papel a la ColecciÃ³n
+                                        En este manual se proporciona
+                                        informaciÃ³n prÃ¡ctica sobre la creaciÃ³n
+                                        de colecciones digitalizadas a partir de
+                                        documentos en texto completo.
+
+           Unix         Esta versiÃ³n Unix comprende binarios Linux
+
+                        Los archivos  y directorios de nivel superior son los
+                        siguientes:
+
+                          Install.sh    El guiÃ³n de shell de instalaciÃ³n (si
+                                        funciona con Linux comprende una opciÃ³n
+                                        para instalar binarios; de otro modo
+                                        instala el cÃ³digo fuente)
+                          bin           Binarios de Linux
+
+           Windows      Binarios de Windows
+
+                        Los archivos y directorios de nivel superior son 
+                        los siguientes:
+
+                          bin           Binarios de Windows
+
+           gsdl         La estructura de los directorios del programa de
+                        Biblioteca Digital Greenstone. Refleja la estructura de
+                        los directorios del Programa de Biblioteca Digital
+                        Greenstone que se instalarÃ¡n.
+
+                          bin           CÃ³digo ejecutable
+                          cgi-bin       Guiones CGI
+                          collect       Colecciones
+                          Greenstone    (comprende la colecciÃ³n de demostraciÃ³n,
+                                        los Ã­ndices creados previamente y los
+                                        documentos fuente)
+                          etc           Archivos de configuraciÃ³n, registros,
+                                        etc.
+                          gli           herramienta de la Interfaz de la
+                                        Biblioteca Digital Greenstone
+                          images        ImÃ¡genes utilizadas por la interfaz
+                          macros        Macros de visualizaciÃ³n
+                          perllib       MÃ³dulos Perl utilizados para la creaciÃ³n
+                          mappings      Tablas de traducciÃ³n Unicode
+
+                        El procedimiento de instalaciÃ³n instala archivos en 
+                        algunos de los directorios siguientes:
+
+                          nivel superior Archivo de proceso por lotes o guiÃ³n
+                                         de shell
+                          bin            CÃ³digo ejecutable
+                          cgi-bin        Guiones CGI
+                          collect        La colecciÃ³n de demostraciÃ³n de
+                                         Greenstone. Las colecciones 
+                                         suplementarias indicadadas en
+                                         el momento de la instalaciÃ³n
+                          src, lib, packages
+                                         CÃ³digo fuente en caso que se lo
+                                         especifique en el momento de la
+                                         instalaciÃ³n
+
+           collect      Colecciones Greenstone (creadas previamente) - nÃ³tese
+                        que aunque el procedimiento de instalaciÃ³n sÃ³lo instala
+                        los Ã­ndices creados previamente, los documentos fuente
+                        originales de cada colecciÃ³n estÃ¡n disponibles en el 
+                        CD-ROM. Los documentos fuente pueden ser Ãºtiles para
+                        quienes traten de crear nuevas colecciones que copien el
+                        fomato de aquellas colecciones.
+
+                          demo          ColecciÃ³n de muestra Greenstone
+                          dls-e         Subconjunto de la Biblioteca para
+                                        el Desarrollo
+                          wrdpdf-e      DemostraciÃ³n en MSWord y PDF
+                          gsarch-e      ColecciÃ³n de Archivos Greenstone
+                          cltbib-e      ColecciÃ³n bibliogrÃ¡fica
+                          cltext-e      Suplemento bibliogrÃ¡fico
+                          MARC-e        ColecciÃ³n de muestra MARC
+                          oai-e         ColecciÃ³n de muestra OAI
+                          image-e       ColecciÃ³n de imÃ¡genes sencillas
+			  pagedimg-e
+                          authen-e      DemostraciÃ³n de formateo y autenticaciÃ³n
+                          garish        VersiÃ³n Garish de la colecciÃ³n de muestra
+			  style-e
+                          isis-e        ColecciÃ³n de muestra CDS/ISIS
+
+           src            Archivos fuente del programa
+
+                          Windows       InformaciÃ³n de configuraciÃ³n para
+                                        Windows
+                          Unix          InformaciÃ³n de configuraciÃ³n para Unix
+                          lib           CÃ³digo de biblioteca C++
+                          packages      CÃ³digo fuente C++ para paquetes
+                                        utilizados por Greenstone
+                          src           CÃ³digo fuente C++
Index: /main/branches/stable_gs3/release-kits/shared/greenstone2/docs/READMEfr.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone2/docs/READMEfr.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone2/docs/READMEfr.txt	(revision 21851)
@@ -0,0 +1,232 @@
+Titre   Logiciel de bibliothÃšque numÃ©rique Greenstone
+
+But     Une suite de logiciels de bibliothÃšque numÃ©rique qui comprend
+        la possibilitÃ© de servir et de construire des collections de
+        bibliothÃšques numÃ©riques
+
+Auteur  Projet de bibliothÃšque numÃ©rique de Nouvelle-ZÃ©lande (New
+        Zealand Digital Library Project)
+
+Licence Licence publique gÃ©nÃ©rale de GNU (GNU General Public License)
+        (Version 2)
+        Les clauses et conditions complÃštes se trouvent dans le fichier
+        "COPYING" de ce cÃ©dÃ©rom
+
+Date    Novembre 2007
+
+Version 2.75
+
+Documentation
+        Install.pdf
+            Guide d'installation de la bibliothÃšque numÃ©rique Greenstone
+        User.pdf
+            Guide de l'utilisateur de la bibliothÃšque numÃ©rique Greenstone
+        Develop.pdf
+            Guide du dÃ©veloppeur de la bibliothÃšque numÃ©rique Greenstone
+        Paper.pdf
+            BibliothÃšque numÃ©rique Greenstone: du papier Ã  la collection
+
+Outils complÃ©mentaires
+        Librarian Interface     Un outil graphique pour la construction de
+                                collection utilisant Greenstone (nÃ©cessite
+                                une version 1.4 de Java Runtime
+                                Environement, intÃ©grÃ©e dans ce CD-ROM)
+
+Plates-formes
+        Unix et Windows.  Les binaires et le code source sont fournis.
+
+        L'interface utilisateur de Greenstone utilise un navigateur web
+        gÃ©rant le Javascript, les tableaux, et les cadres. Exemples de
+        navigateurs convenables:
+
+                Netscape Navigator 4.0
+                Internet Explorer 4.0
+                Mozilla, Safari
+
+        Des versions plus rÃ©centes de ces navigateurs devraient
+        Ã©galement convenir.
+
+
+Unix    Le code source a Ã©tÃ© compilÃ© et testÃ© sous Linux et sous
+        Solaris. Le code binaire est prÃ©vu pour une distribution Linux sur
+        processeur x86 qui comprend un support pour les binaires au
+        format ELF et qui dispose de la bibliothÃšque C de GNU (glibc 2.0
+        ou une version ultÃ©rieure). Exemples de distributions
+        convenables:
+
+                RedHat 5.1
+                SuSE Linux 6.1
+                Debian 2.1
+                Slackware 4.0
+
+        Des versions plus rÃ©centes de ces distributions devraient
+        Ã©galement convenir.
+
+Windows Le code source a Ã©tÃ© compilÃ© avec Microsoft Visual C++ 4.2 et 6.0
+        Le code binaire a Ã©tÃ© testÃ© sur Windows 3.1, 95/98, NT, 2000, XP
+        Restriction:
+                Le processus de construction utilise Perl; les
+                collections ne peuvent donc pas Ãªtre construites sous
+                Windows 3.1 
+
+Installation
+        Install.pdf dÃ©crit la procÃ©dure d'installation complÃšte Ã  la
+        fois pour Unix et pour Windows, et comprend des didacticiels pour 
+        configurer Greenstone, et les serveurs web Apache, PWS et IIS
+        de maniÃšre appropriÃ©e.
+
+        Des scripts d'installation auto-documentÃ©s sont fournis Ã  la
+        fois pour Unix et pour Windows, qui vous emmÃšnent pas Ã  pas Ã 
+        travers la procÃ©dure d'installation et proposent les options
+        appropriÃ©es Ã  chaque Ã©tape.
+
+                Installation sous Windows 9x/NT/2000/XP:
+                    exÃ©cuter setup.exe
+                Installation sous Unix:
+                    exÃ©cuter setupLinux.bin
+
+        Des scripts de dÃ©sinstallation sont fournis qui nettoient tout
+        si le processus d'installation venait Ã  Ã©chouer.
+
+Support Veuillez nous faire part de tout problÃšme d'installation ou
+        d'exÃ©cution du logiciel de bibliothÃšque numÃ©rique Greenstone en
+        utilisant le formulaire de rapport de bogues fourni dans le fichier 
+        Support.htm dans le rÃ©pertoire de premier niveau de ce cÃ©dÃ©rom.
+
+        Il y a une liste de diffusion Greenstone que vous pouvez joindre Ã 
+        http://greenstone.org/english/docs.html. Cette page ainsi que la
+        liste faq pointent vers des informations utiles.
+
+Contenu de ce cÃ©dÃ©rom
+
+        README.TXT  Le prÃ©sent document
+
+        COPYING     Donne les conditions selon lesquelles ce logiciel
+                    peut Ãªtre copiÃ©
+
+        Support.htm Formulaire pour faire part de problÃšmes
+                    d'installation ou d'exÃ©cution de Greenstone
+
+        setup.exe   Programme d'auto-installation pour Windows
+                    (comprend une option pour installer les binaires ou
+                    le code source)
+
+        setupLinux.bin   Programme d'auto-installation pour Linux
+                    (comprend une option pour installer les binaires ou
+                    le code source)
+
+        docs        Documentation, comprenant:
+
+                        Install.pdf     Guide d'installation
+                                        DÃ©crit la procÃ©dure d'installation
+                                        pour Unix et pour Windows, et
+                                        comprend des didacticiels sur la
+                                        configuration de Greenstone et du
+                                        serveur web Apache.
+                                        
+                        User.pdf        Guide de l'utilisateur
+                                        Fournit une description complÃšte
+                                        de la maniÃšre d'utiliser le logiciel
+                                        Greenstone pour accÃ©der Ã  et
+                                        construire des collections.
+
+                        Develop.pdf     Guide du dÃ©veloppeur 
+                                        Ce manuel dÃ©crit le fonctionnement
+                                        de Greenstone. Il vise ceux qui
+                                        souhaitent personnaliser des
+                                        collections et dÃ©velopper et
+                                        maintenir le logiciel. 
+
+                        Paper.pdf       Du papier Ã  la collection
+                                        Ce manuel donne des informations
+                                        pratiques sur la crÃ©ation de
+                                        collections numÃ©risÃ©es Ã  partir
+                                        de documents textuels.
+
+        Unix        Version Unix, comprenant des binaires pour Linux
+
+                    Les fichiers et rÃ©pertoires de premier niveau sont:
+
+                        Install.sh      Script d'installation shell pour
+                                        Unix (exÃ©cutÃ© sous Linux, comprend
+                                        des options pour installer des
+                                        binaires; dans le cas contraire,
+                                        installe le code source). 
+                        bin             Binaires Linux
+
+        Windows     Binaires Windows
+
+                    Les fichiers et rÃ©pertoires de premier niveau sont:
+
+                        bin             Binaires Windows
+
+        gsdl        Structure de rÃ©pertoires du logiciel de bibliothÃšque
+                    numÃ©rique Greenstone. Miroir de la structure qui
+                    sera installÃ©e.
+
+                        bin             Code exÃ©cutable
+                        cgi-bin         Scripts CGI
+                        collect         Collections Greenstone
+                                        (comprend la collection Â«DemoÂ»,
+                                        les index prÃ©-construits et
+                                        les documents source)
+                        etc             Fichiers de configuration,
+                                        journaux, etc.
+                        gli             Outil de Greenstone Librarian
+                                        Interface
+                        images          Images utilisÃ©es par l'interface
+                        macros          Macros d'affichage
+                        perllib         Modules Perl utilisÃ©s lors de la
+                                        construction
+                        mappings        Tables Unicode
+
+                    La procÃ©dure d'installation installe des fichiers
+                    dans certains de ces rÃ©pertoires comme suit:
+
+                        premier niveau  Fichier de traitement par lots ou
+                                        script shell
+                        bin             Code exÃ©cutable 
+                        cgi-bin         Scripts CGI
+                        collect         La collection Â«DemoÂ» de Greenstone
+                                        Collections supplÃ©mentaires telles que
+                                        spÃ©cifiÃ© au moment de l'installation 
+                        src, lib, packages
+                                        Code source si tel a Ã©tÃ©
+                                        spÃ©cifiÃ© au moment de l'installation
+
+        collect     Collections Greenstone (prÃ©-construites) - remarquez que
+                    bien que la procÃ©dure d'installation n'installe que
+                    les index prÃ©-construits, les documents source de chaque
+                    collection sont disponibles sur le cÃ©dÃ©rom. Les documents
+                    source peuvent Ãªtre utiles Ã  ceux qui essaient de crÃ©er
+                    de nouvelles collections qui reprennent le format de ces
+                    collections.
+
+                        demo            DÃ©mo Greenstone
+                        dls-e           Sous-ensemble de la collection
+                                        BibliothÃ©que de DÃ©veloppement
+                        wrdpdf-e        DÃ©monstration MSWord et PDF
+                        gsarch-e        Collection des Archives de Greenstone
+                        cltbib-e        Collection bibliographie
+                        cltext-e        SupplÃ©ment bibliographie
+                        MARC-e          Exemple MARC
+                        oai-e           DÃ©mo OAI
+                        image-e         Collection d'images simple
+			pagedimg-e
+                        authen-e        DÃ©monstration de formatage et
+                                        d'authentification
+                        garish          Version Garish de la collection de
+                                        dÃ©monstration
+			style-e		
+			isis-e          Exemple CDS/ISIS
+
+        src         Fichiers source du programme
+
+                        Windows         Informations de configuration
+                                        pour Windows
+                        Unix            Informations de configuration
+                                        pour Unix
+                        lib             Code de bibliothÃšque C++
+                        packages        Code source C++ pour les
+                                        paquetages utilisÃ©s par Greenstone
+                        src             Code source C++
Index: /main/branches/stable_gs3/release-kits/shared/greenstone2/docs/READMEru.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone2/docs/READMEru.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone2/docs/READMEru.txt	(revision 21851)
@@ -0,0 +1,241 @@
+ÐÐ°Ð·Ð²Ð°ÐœÐžÐµ ÐÑÐŸÐ³ÑÐ°ÐŒÐŒÐœÐŸÐµ ÐŸÐ±ÐµÑÐ¿ÐµÑÐµÐœÐžÐµ ÑÐžÑÑÐŸÐ²ÐŸÐ¹ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐž Greenstone.
+
+ÐŠÐµÐ»Ñ     ÐÐŸÐŒÐ¿Ð»ÐµÐºÑ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐœÐŸÐ³ÐŸ ÐŸÐ±ÐµÑÐ¿ÐµÑÐµÐœÐžÑ ÑÐžÑÑÐŸÐ²ÐŸÐ¹ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐž, ÐºÐŸÑÐŸÑÑÐ¹
+         Ð²ÐºÐ»ÑÑÐ°ÐµÑ Ð²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸÑÑÑ ÐŸÐ±ÑÐ»ÑÐ¶ÐžÐ²Ð°ÐœÐžÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐ¹ ÑÐžÑÑÐŸÐ²ÑÑ
+ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐº Ðž 
+         Ð¿ÐŸÑÑÑÐŸÐµÐœÐžÑ ÐœÐŸÐ²ÑÑ
+ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐ¹
+
+ÐÐ²ÑÐŸÑ    ÐÐŸÐ²ÐŸÐ·ÐµÐ»Ð°ÐœÐŽÑÐºÐžÐ¹ ÐÑÐŸÐµÐºÑ ÐŠÐžÑÑÐŸÐ²ÐŸÐ¹ ÐÐžÐ±Ð»ÐžÐŸÑÐµÐºÐž
+
+ÐÐžÑÐµÐœÐ·ÐžÑ ÐÑÐœÐŸÐ²ÐœÐ°Ñ ÐŸÐ±ÑÐµÑÑÐ²ÐµÐœÐœÐ°Ñ Ð»ÐžÑÐµÐœÐ·ÐžÑ GNU (Ð²ÐµÑÑÐžÑ 2).
+         ÐÐŸÐ»ÐœÑÐµ ÑÐµÑÐŒÐžÐœÑ Ðž ÑÑÐ»ÐŸÐ²ÐžÑ ÐœÐ°Ñ
+ÐŸÐŽÑÑÑÑ Ð² ÑÐ°Ð¹Ð»Ðµ COPYING ÐœÐ° ÑÑÐŸÐŒ CD-ROM
+
+ÐÐ°ÑÐ°     ÐÐºÑÑÐ±ÑÑ 2005
+
+ÐÐµÑÑÐžÑ   2.62
+
+ÐÐŸÐºÑÐŒÐµÐœÑÐ°ÑÐžÑ
+         Install.pdf   Ð ÑÐºÐŸÐ²ÐŸÐŽÑÑÐ²ÐŸ Ð¿ÐŸ ÐžÐœÑÑÐ°Ð»Ð»ÑÑÐžÐž ÑÐžÑÑÐŸÐ²ÐŸÐ¹ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐž Greenstone
+         User.pdf      Ð ÑÐºÐŸÐ²ÐŸÐŽÑÑÐ²ÐŸ Ð¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÐµÐ»Ñ ÑÐžÑÑÐŸÐ²ÐŸÐ¹ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐž Greenstone
+         Develop.pdf   Ð ÑÐºÐŸÐ²ÐŸÐŽÑÑÐ²ÐŸ ÑÐ°Ð·ÑÐ°Ð±ÐŸÑÑÐžÐºÐ° ÑÐžÑÑÐŸÐ²ÐŸÐ¹ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐž Greenstone
+         Paper.pdf     ÐÑ Ð±ÑÐŒÐ°Ð³Ðž Ðº ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž 
+
+ÐÐŸÐ¿ÐŸÐ»ÐœÐžÑÐµÐ»ÑÐœÑÐµ
+         ÑÑÐžÐ»ÐžÑÑ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÑÐœÐŸÐ³ÐŸ ÐžÐœÑÐµÑÑÐµÐ¹ÑÐ°
+         ÐÑÐ°ÑÐžÑÐµÑÐºÐžÐ¹ ÐžÐœÑÑÑÑÐŒÐµÐœÑ ÐŽÐ»Ñ ÑÐŸÐ·ÐŽÐ°ÐœÐžÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž Ñ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐžÐµÐŒ
+         Greenstone (ÑÑÐµÐ±ÑÐµÐŒÐ°Ñ Ð²ÐµÑÑÐžÑ 1.4 JRE, Ð²ÐºÐ»ÑÑÐµÐœÐœÐ°Ñ Ð² ÑÑÐŸÑ CD-ROM
+
+ÐÐ»Ð°ÑÑÐŸÑÐŒÐ°
+         Unix Ðž Windows. ÐÐžÐœÐ°ÑÐœÑÐµ ÐºÐŸÐŽÑ Ðž ÐžÑÑ
+ÐŸÐŽÐœÐ°Ñ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ° Ð²ÐºÐ»ÑÑÐµÐœÑ
+
+         ÐÐœÑÐµÑÑÐµÐ¹Ñ Ð¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÐµÐ»Ñ Greenstone ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑ Web-Ð±ÑÐ°ÑÐ·ÐµÑ,
+         Ð²ÐŸÑÐ¿ÑÐžÐœÐžÐŒÐ°ÑÑÐžÐ¹ ÑÐ°Ð±Ð»ÐžÑÑ Ðž ÑÑÐµÐ¹ÐŒÑ Javascript.
+         ÐÑÐ°ÑÐ·ÐµÑÑ, ÐºÐŸÑÐŸÑÑÐµ ÑÐŸÐŸÑÐ²ÐµÑÑÑÐ²ÑÑÑ ÑÑÐžÐŒ ÑÑÐµÐ±ÐŸÐ²Ð°ÐœÐžÑÐŒ:
+
+                  Netscape Navigator 4.0
+                  Internet Explorer 4.0
+                  Mozilla, Safari
+
+         ÐÐŸÐ»ÐµÐµ Ð¿ÐŸÐ·ÐŽÐœÐžÐµ Ð²ÐµÑÑÐžÐž ÑÑÐžÑ
+ Ð±ÑÐ°ÑÐ·ÐµÑÐŸÐ² ÑÐ°ÐºÐ¶Ðµ ÐŽÐŸÐ»Ð¶ÐœÑ ÑÐ°Ð±ÐŸÑÐ°ÑÑ.
+
+         CD-ROM ÑÐŸÐŽÐµÑÐ¶ÐžÑ Windows- Ð²ÐµÑÑÐžÑ Netscape 4.05 Ð² ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž
+         Windows\bin\windows\netscape.
+
+Unix     ÐÑÑ
+ÐŸÐŽÐœÐ°Ñ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ° ÐºÐŸÐŒÐ¿ÐžÐ»ÐžÑÐŸÐ²Ð°Ð»Ð° Ðž Ð±ÑÐ»Ð° Ð¿ÑÐŸÐ²ÐµÑÐµÐœÐ° ÐœÐ° Linux Ðž
+         Solaris. ÐÐžÐœÐ°ÑÐœÑÐ¹ ÐºÐŸÐŽ ÑÑÐµÐ±ÑÐµÑ Intel Ñ
+86, ÐºÐŸÑÐŸÑÑÐ¹ Ð²ÐºÐ»ÑÑÐ°ÐµÑ
+         Ð±ÐžÐœÐ°ÑÐœÑÑ Ð¿ÐŸÐŽÐŽÐµÑÐ¶ÐºÑ ELF Ðž Ð¿ÐŸÐŽÐŽÐµÑÐ¶ÐžÐ²Ð°ÐµÑ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÑ GNU Ð¡ (glibc 2.0
+         ÐžÐ»Ðž Ð²ÑÑÐµ). ÐÐžÑÑÑÐžÐ±ÑÑÐžÐ²Ñ, ÐºÐŸÑÐŸÑÑÐµ ÐŸÑÐ²ÐµÑÐ°ÑÑ ÑÑÐžÐŒ ÑÑÐµÐ±ÐŸÐ²Ð°ÐœÐžÑÐŒ,
+         Ð²ÐºÐ»ÑÑÐ°ÑÑ:
+
+                  RedHat 5.1
+                  SuSE Linux 6.1
+                  Debian 2.1
+                  Slackware 4.0
+
+         ÐÐŸÐ»ÐµÐµ Ð¿ÐŸÐ·ÐŽÐœÐžÐµ Ð²ÐµÑÑÐžÐž ÑÑÐžÑ
+ ÐŽÐžÑÑÑÐžÐ±ÑÑÐžÐ²ÐŸÐ² ÑÐ°ÐºÐ¶Ðµ ÐŽÐŸÐ»Ð¶ÐœÑ ÑÐ°Ð±ÐŸÑÐ°ÑÑ.
+
+Windows  ÐÑÑ
+ÐŸÐŽÐœÐ°Ñ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ° Ð¿ÐŸÐŽ Windows ÐºÐŸÐŒÐ¿ÐžÐ»ÐžÑÐŸÐ²Ð°Ð»Ð°ÑÑ Ñ Microsoft Visual
+         C++ 4.2 Ðž 6.0; Ð±ÐžÐœÐ°ÑÐœÑÐ¹ ÐºÐŸÐŽ Ð±ÑÐ» Ð¿ÑÐŸÐ²ÐµÑÐµÐœ ÐœÐ° Windows 3.1, 95/98,
+         NT, 2000, XP
+
+         ÐÐ³ÑÐ°ÐœÐžÑÐµÐœÐžÐµ: 
+             ÐÑÐŸÑÐµÑÑ ÑÐŸÐ·ÐŽÐ°ÐœÐžÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž ÑÑÐµÐ±ÑÐµÑ ÐœÐ°Ð»ÐžÑÐžÑ PERL, Ðž Ð¿ÐŸÑÑÐŸÐŒÑ
+             ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž ÐœÐµ ÐŒÐŸ-Ð³ÑÑ ÑÐŸÐ·ÐŽÐ°Ð²Ð°ÑÑÑÑ  Ð¿ÐŸÐŽ Windows 3.1
+
+ÐÐœÑÑÐ°Ð»Ð»ÑÑÐžÑ  
+         Install.pdf ÐŸÐ¿ÐžÑÑÐ²Ð°ÐµÑ Ð¿ÐŸÐ»ÐœÑÑ Ð¿ÑÐŸÑÐµÐŽÑÑÑ ÐžÐœÑÑÐ°Ð»Ð»ÑÑÐžÐž ÐºÐ°Ðº ÐŽÐ»Ñ Unix,
+         ÑÐ°Ðº Ðž ÐŽÐ»Ñ Windows Ðž Ð²ÐºÐ»ÑÑÐ°ÐµÑ ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÐŸÐœÐœÑÑ ÐŸÐ±ÑÑÐ°ÑÑÑÑ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÑ
+         ÐºÐŸÐœÑÐžÐ³ÑÑÐžÑÐŸÐ²Ð°ÐœÐžÑ Greenstone, Ð° ÑÐ°ÐºÐ¶Ðµ ÑÐµÑÐ²ÐµÑÐŸÐ² Apache, PWS Ðž IIS Web
+         Servers, ÑÐŸÐŸÑÐ²ÐµÑÑÑÐ²ÐµÐœÐœÐŸ.
+
+         Ð¡Ð°ÐŒÐŸÑÑÑÐ°ÐœÐ°Ð²Ð»ÐžÐ²Ð°ÑÑÐžÐµÑÑ ÐžÐœÑÑÐ°Ð»Ð»ÑÑÐžÐŸÐœÐœÑÐµ ÑÐºÑÐžÐ¿ÑÑ ÐžÐŒÐµÑÑÑÑ Ðž ÐŽÐ»Ñ Windows,
+         Ðž ÐŽÐ»Ñ Unix, ÐºÐŸÑÐŸÑÑÐµ Ð¿ÑÐŸÐ²ÐŸÐŽÑÑ ÐÐ°Ñ ÑÐ°Ð³ Ð·Ð° ÑÐ°Ð³ÐŸÐŒ ÑÐµÑÐµÐ· ÐžÐœÑÑÐ°Ð»Ð»ÑÑÐžÐŸÐœÐœÑÐµ
+         Ð¿ÑÐŸÑÐµÐŽÑÑÑ Ðž ÐŸÐ±ÐµÑÐ¿ÐµÑÐžÐ²Ð°ÑÑ ÑÐŸÐŸÑÐ²ÐµÑÑÑÐ²ÑÑÑÐžÐµ Ð²Ð°ÑÐžÐ°ÐœÑÑ ÐœÐ° ÐºÐ°Ð¶ÐŽÐŸÐ¹ ÑÑÐ°ÐŽÐžÐž.
+
+             ÐÐ»Ñ ÑÑÑÐ°ÐœÐŸÐ²ÐºÐž Windows 9Ñ
+/NT/2000/XP Ð²ÑÐ¿ÐŸÐ»ÐœÐžÑÐµ Setup.exe
+             ÐÐ»Ñ ÑÑÑÐ°ÐœÐŸÐ²ÐºÐž  Unix Ð²ÑÐ¿ÐŸÐ»ÐœÐžÑÐµ Unix/Install.sh
+
+         ÐÐŒÐµÑÑÑÑ ÐŽÐµÐžÐœÑÑÐ°Ð»Ð»ÑÑÐžÐŸÐœÐœÑÐµ ÑÐºÑÐžÐ¿ÑÑ, ÐºÐŸÑÐŸÑÑÐµ ÐŽÐŸÐ»Ð¶ÐœÑ Ð¿ÑÐŸÐžÐ·Ð²ÐŸÐŽÐžÑÑ
+         ÑÐŽÐ°Ð»ÐµÐœÐžÐµ, ÐµÑÐ»Ðž ÐžÐœÑÑÐ°Ð»Ð»ÑÑÐžÑ ÐœÐµÑÐŽÐ°ÑÐœÐ°.
+
+ÐÐŸÐŽÐŽÐµÑÐ¶ÐºÐ°
+         ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, ÑÐŸÐŸÐ±ÑÐžÑÐµ ÐŸ Ð»ÑÐ±ÑÑ
+ Ð¿ÑÐŸÐ±Ð»ÐµÐŒÐ°Ñ
+ Ð² ÐžÐœÑÑÐ°Ð»Ð»ÑÑÐžÐž ÐžÐ»Ðž ÐŽÐ°Ð»ÑÐœÐµÐ¹ÑÐµÐ¹
+         ÑÐ°Ð±ÐŸÑÐµ Ñ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐœÑÐŒ ÐŸÐ±ÐµÑÐ¿ÐµÑÐµÐœÐžÐµÐŒ ÑÐžÑÑÐŸÐ²ÐŸÐ¹ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐž Geenstone, 
+         ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÑ ÑÐŸÐŸÐ±ÑÐµÐœÐžÑ ÐŸÐ± ÐŸÑÐžÐ±ÐºÐ°Ñ
+, ÑÐŸÐŽÐµÑÐ¶Ð°ÑÐžÑ
+ÑÑ Ð² Support.htm ÐœÐ° Ð²ÐµÑÑ
+ÐœÐµÐŒ 
+         ÑÑÐŸÐ²ÐœÐµ Ð² ÑÑÐŸÐŒ CD-ROM.
+
+         ÐÐŒÐµÐµÑÑÑ ÑÐ¿ÐžÑÐŸÐº Ð°ÐŽÑÐµÑÐ°ÑÐŸÐ² Greenstone, Ðº ÐºÐŸÑÐŸÑÐŸÐŒÑ ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ 
+         Ð¿ÑÐžÑÐŸÐµÐŽÐžÐœÐžÑÑÑÑ, ÐœÐ° http: //greenstone.org/English/docs.html. Ð ÑÑÐ° 
+         ÑÑÑÐ°ÐœÐžÑÐ°, Ðž ÑÐ¿ÐžÑÐŸÐº ÐœÐ°ÐžÐ±ÐŸÐ»ÐµÐµ ÑÐ°ÑÑÐŸ Ð·Ð°ÐŽÐ°Ð²Ð°ÐµÐŒÑÑ
+ Ð²ÐŸÐ¿ÑÐŸÑÐŸÐ² ÐœÐ° ÑÑÐŸÐŒ ÑÐ°Ð¹ÑÐµ 
+         Ð²ÑÐ²ÐŸÐŽÑÑ ÐœÐ° Ð±ÐŸÐ»ÑÑÐŸÐµ ÐºÐŸÐ»ÐžÑÐµÑÑÐ²ÐŸ Ð¿ÐŸÐ»ÐµÐ·ÐœÐŸÐ¹ ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÐž.
+
+Ð¡ÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÐµ ÐŽÐ°ÐœÐœÐŸÐ³ÐŸ CD-ROM
+
+         README.TXT   ÐÐŸÐºÑÐŒÐµÐœÑ, ÐºÐŸÑÐŸÑÑÐ¹ ÐÑ ÑÐžÑÐ°ÐµÑÐµ
+
+         COPYING      ÐÐÐÐÐ ÐÐÐÐÐÐ ÐÐ¿ÐžÑÑÐ²Ð°ÐµÑ ÑÑÐ»ÐŸÐ²ÐžÑ, Ð¿ÑÐž ÐºÐŸÑÐŸÑÑÑ
+ ÑÑÐŸ
+                      Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐœÐŸÐµ ÐŸÐ±ÐµÑÐ¿ÐµÑÐµÐœÐžÐµ ÐŒÐŸÐ¶ÐµÑ Ð±ÑÑÑ ÑÐºÐŸÐ¿ÐžÑÐŸÐ²Ð°ÐœÐŸ        
+
+         Support.htm  Ð€ÐŸÑÐŒÐ° ÑÐŸÐŸÐ±ÑÐµÐœÐžÑ ÐŸ Ð¿ÑÐŸÐ±Ð»ÐµÐŒÐ°Ñ
+  Ð¿ÑÐž ÐžÐœÑÑÐ°Ð»Ð»ÑÑÐžÐž ÐžÐ»Ðž
+                      Ð¿ÑÐŸÐŽÐŸÐ»Ð¶ÐµÐœÐžÐž ÑÐ°Ð±ÐŸÑÑ Ñ  Grenstone
+
+         Setup.exe    Ð¡Ð°ÐŒÐŸÐžÐœÑÑÐ°Ð»Ð»ÐžÑÑÐµÐŒÐ°Ñ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ° Ð¿ÐŸÐŽ Windows, ÐºÐŸÑÐŸÑÐ°Ñ 
+                      Ð²ÐºÐ»ÑÑÐ°ÐµÑ Ð²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸÑÑÑ Ð²ÑÐ±ÐŸÑÐ° ÐŽÐ»Ñ ÑÑÑÐ°ÐœÐŸÐ²ÐºÐž Ð±ÐžÐœÐ°ÑÐœÑÑ
+
+                      ÐºÐŸÐŽÐŸÐ² ÐžÐ»Ðž ÐžÑÑ
+ÐŸÐŽÐœÐŸÐ¹ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÑ
+
+         docs         ÐÐŸÐºÑÐŒÐµÐœÑÐ°ÑÐžÑ, ÐºÐŸÑÐŸÑÐ°Ñ Ð²ÐºÐ»ÑÑÐ°ÐµÑ ÑÐ»ÐµÐŽÑÑÑÐµÐµ:
+
+                  Install.pdf   Ð ÑÐºÐŸÐ²ÐŸÐŽÑÑÐ²ÐŸ Ð¿ÐŸ ÐžÐœÑÑÐ°Ð»Ð»ÑÑÐžÐž.
+                                ÐÐ¿ÐžÑÑÐ²Ð°ÐµÑ Ð¿ÑÐŸÑÐµÑÑ  ÐžÐœÑÑÐ°Ð»Ð»ÑÑÐžÐž ÐŽÐ»Ñ Unix Ðž
+                                Windows Ðž Ð²ÐºÐ»ÑÑÐ°ÐµÑ ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÐŸÐœÐœÑÑ ÐŸÐ±ÑÑÐ°ÑÑÑÑ
+                                Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÑ Ð¿ÐŸ ÐºÐŸÐœÑÐžÐ³ÑÑÐžÑÐŸÐ²Ð°ÐœÐžÑ Greenstone, Web
+                                Server Ðž Apache
+
+                  User.pdf      Ð ÑÐºÐŸÐ²ÐŸÐŽÑÑÐ²ÐŸ Ð¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÐµÐ»Ñ. 
+                                ÐÐ°ÑÑ Ð²ÑÐµÑÑÐŸÑÐŸÐœÐœÐµÐµ ÐŸÐ¿ÐžÑÐ°ÐœÐžÐµ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐžÑ
+                                Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐœÐŸÐ³ÐŸ ÐŸÐ±ÐµÑÐ¿ÐµÑÐµÐœÐžÑ Greenstone ÐŽÐ»Ñ
+                                Ð¿ÐŸÐŽÐŽÐµÑÐ¶ÐºÐž Ðž Ð¿ÐŸÑÑÑÐŸÐµÐœÐžÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐ¹
+
+                  Develop.pdf   Ð ÑÐºÐŸÐ²ÐŸÐŽÑÑÐ²ÐŸ Ð Ð°Ð·ÑÐ°Ð±ÐŸÑÑÐžÐºÐ°.
+                                Ð­ÑÐŸ ÑÑÐºÐŸÐ²ÐŸÐŽÑÑÐ²ÐŸ ÐŸÐ¿ÐžÑÑÐ²Ð°ÐµÑ, ÐºÐ°Ðº ÑÐ°Ð±ÐŸÑÐ°ÐµÑ
+                                Greenstone. ÐÐœÐŸ Ð¿ÑÐµÐŽÐœÐ°Ð·ÐœÐ°ÑÐµÐœÐŸ ÐŽÐ»Ñ ÑÐµÑ
+, ÐºÑÐŸ
+                                Ð¶ÐµÐ»Ð°ÐµÑ ÐœÐ°ÑÑÑÐ°ÐžÐ²Ð°ÑÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž, Ð° ÑÐ°ÐºÐ¶Ðµ ÑÐ°Ð·Ð²ÐžÐ²Ð°ÑÑ
+                                Ðž Ð¿ÐŸÐŽÐŽÐµÑÐ¶ÐžÐ²Ð°ÑÑ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐœÐŸÐµ ÐŸÐ±ÐµÑÐ¿ÐµÑÐµÐœÐžÐµ.
+
+                  Paper.pdf     ÐÑ Ð±ÑÐŒÐ°Ð³Ðž Ðº ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž.
+                                Ð­ÑÐŸ ÑÑÐºÐŸÐ²ÐŸÐŽÑÑÐ²ÐŸ ÑÐŸÐŽÐµÑÐ¶ÐžÑ Ð¿ÑÐ°ÐºÑÐžÑÐµÑÐºÑÑ
+                                ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÑ Ð¿ÐŸ ÑÐŸÐ·ÐŽÐ°ÐœÐžÑ ÑÐžÑÑÐŸÐ²ÑÑ
+ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐ¹
+                                Ð¿ÐŸÐ»ÐœÐŸÑÐµÐºÑÑÐŸÐ²ÑÑ
+  ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ².
+
+         Unix         ÐÐµÑÑÐžÑ Unix, Ð²ÐºÐ»ÑÑÐ°ÑÑÐ°Ñ Ð±ÐžÐœÐ°ÑÐœÑÐµ ÐºÐŸÐŽÑ Linux, ÑÐ»ÐµÐŽÑÑÑÐžÐµ
+                      ÑÐ°Ð¹Ð»Ñ Ð²ÐµÑÑ
+ÐœÐµÐ³ÐŸ ÑÑÐŸÐ²ÐœÑ Ðž ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž:            
+
+                  Install.sh    ÑÐºÑÐžÐ¿ÑÑ ÑÑÑÐ°ÐœÐŸÐ²ÐºÐž Ðž ÐŸÐ±ÐŸÐ»ÐŸÑÐºÐž Unix (ÐµÑÐ»Ðž
+                                ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ Linux, ÑÐŸ Ð²ÐºÐ»ÑÑÐ°ÐµÑ ÑÑÑÐ°ÐœÐŸÐ²ÐºÐž
+                                Ð±ÐžÐœÐ°ÑÐœÑÑ
+ ÐºÐŸÐŽÐŸÐ²; Ð² Ð¿ÑÐŸÑÐžÐ²ÐœÐŸÐŒ ÑÐ»ÑÑÐ°Ðµ
+                                ÑÑÑÐ°ÐœÐ°Ð²Ð»ÐžÐ²Ð°ÐµÑÑÑ ÐžÑÑ
+ÐŸÐŽÐœÐ°Ñ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ°)
+                  bin           Ð±ÐžÐœÐ°ÑÐœÑÐµ ÐºÐŸÐŽÑ ÐŽÐ»Ñ Linux.
+
+         Windows      Ð±ÐžÐœÐ°ÑÐœÑÐµ ÐºÐŸÐŽÑ ÐŽÐ»Ñ Windows
+
+                  bin           Ð±ÐžÐœÐ°ÑÐœÑÐµ ÐºÐŸÐŽÑ ÐŽÐ»Ñ Windows
+
+         gsdl         Ð¡ÑÑÑÐºÑÑÑÐ° ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐœÐŸÐ³ÐŸ ÐŸÐ±ÐµÑÐ¿ÐµÑÐµÐœÐžÑ ÑÐžÑÑÐŸÐ²ÐŸÐ¹
+                      Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐž Greenstone. ÐÐžÐ¶Ðµ ÑÐºÐ°Ð·Ð°ÐœÑ Ð·ÐµÑÐºÐ°Ð»Ð° ÑÑÑÑÐºÑÑÑÑ
+                      ÐŽÐžÑÐµÐºÑÐŸÑÐžÐ¹ ÑÐžÑÑÐŸÐ²ÐŸÐ¹ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐž Greenstone, ÐºÐŸÑÐŸÑÑÐµ ÐŽÐŸÐ»Ð¶ÐœÑ
+                      Ð±ÑÑÑ ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœÑ
+
+                  bin           ÐžÑÐ¿ÐŸÐ»ÐœÑÐµÐŒÑÐ¹ ÐºÐŸÐŽ
+                  cgi-bin       CGI-ÑÐºÑÐžÐ¿ÑÑ
+                  collect       ÐÐŸÐ»Ð»ÐµÐºÑÐžÐž Greenstone (Ð²ÐºÐ»ÑÑÐ°ÐµÑ ÐŽÐµÐŒÐŸÐœÑÑÑÐ°ÑÐžÐŸÐœÐœÑÑ
+                                ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ, Ð¿ÑÐµÐŽÐ¿ÐŸÑÑÑÐŸÐµÑÐœÑÐµ ÐžÐœÐŽÐµÐºÑÑ Ðž ÐžÑÑ
+ÐŸÐŽÐœÑÐµ
+                                ÐŽÐŸÐºÑÐŒÐµÐœÑÑ)
+                  etc           ÐºÐŸÐœÑÐžÐ³ÑÑÐ°ÑÐžÐŸÐœÐœÑÐµ ÑÐ°Ð¹Ð»Ñ, Ð¶ÑÑÐœÐ°Ð»Ñ ÑÐµÐ³ÐžÑÑÑÐ°ÑÐžÐž
+                                Ðž Ñ.ÐŽ.
+                  gli           ÐžÐœÑÑÑÑÐŒÐµÐœÑ ÐžÐœÑÐµÑÑÐµÐ¹ÑÐ° Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐž Greenstone
+                  images        ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÑÐµ ÐžÐœÑÐµÑÑÐµÐ¹ÑÐŸÐŒ;
+                  macros        ÐŒÐ°ÐºÑÐŸÑ Ð¿ÐŸÐºÐ°Ð·Ð°;
+                  perllib       ÐŒÐŸÐŽÑÐ»Ðž Perl, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÑÐµ Ð¿ÑÐž ÑÐŸÐ·ÐŽÐ°ÐœÐžÐž
+                                ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐ¹;  
+                  mappings      ÑÐ°Ð±Ð»ÐžÑÑ ÑÑÐ°ÐœÑÐ»ÑÑÐžÐž Unicode.
+
+                      ÐÐœÑÑÐ°Ð»Ð»ÑÑÐžÐŸÐœÐœÐ°Ñ Ð¿ÑÐŸÑÐµÐŽÑÑÐ° ÑÑÑÐ°ÐœÐ°Ð²Ð»ÐžÐ²Ð°ÐµÑ ÑÐ°Ð¹Ð»Ñ Ð² ÐœÐµÐºÐŸÑÐŸÑÑÐµ
+                      ÐžÐ· ÑÑÐžÑ
+ ÐŽÐžÑÐµÐºÑÐŸÑÐžÐ¹ ÑÐ»ÐµÐŽÑÑÑÐžÐŒ ÐŸÐ±ÑÐ°Ð·ÐŸÐŒ:
+
+                  top level     ÐºÐŸÐŒÐ°ÐœÐŽÐœÑÐ¹ ÑÐ°Ð¹Ð» ÐžÐ»Ðž ÑÐºÑÐžÐ¿Ñ ÐŸÐ±ÐŸÐ»ÐŸÑÐºÐž;
+                  bin           ÐžÑÐ¿ÐŸÐ»ÐœÑÐµÐŒÑÐ¹ ÐºÐŸÐŽ;   
+                  cgi-bin       ÑÐºÑÐžÐ¿ÑÑ Ð¡GL;
+                  collect       ÐŽÐµÐŒÐŸÐœÑÑÑÐ°ÑÐžÐŸÐœÐœÐ°Ñ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ Greenstone.
+                                ÐÐŸÐ¿ÐŸÐ»ÐœÐžÑÐµÐ»ÑÐœÑÐµ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž, ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐœÑÐµ Ð²ÐŸ
+                                Ð²ÑÐµÐŒÑ ÐžÐœÑÑÐ°Ð»Ð»ÑÑÐžÐž;
+                  src, lib, packages
+                                ÐžÑÑ
+ÐŸÐŽÐœÑÐ¹ ÐºÐŸÐŽ, ÐµÑÐ»Ðž ÐŸÐœ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœ Ð²ÐŸ Ð²ÑÐµÐŒÑ
+                                ÐžÐœÑÑÐ°Ð»Ð»ÑÑÐžÐž.
+
+        collect       ÐÐŸÐ»Ð»ÐµÐºÑÐžÐž Greenstone, Ð¿ÑÐµÐŽÐ²Ð°ÑÐžÑÐµÐ»ÑÐœÐŸ ÑÐŸÐ·ÐŽÐ°ÐœÐœÑÐµ. ÐÐ±ÑÐ°ÑÐžÑÐµ
+                      Ð²ÐœÐžÐŒÐ°ÐœÐžÐµ, ÑÑÐŸ Ñ
+ÐŸÑÑ Ð¿ÑÐŸÑÐµÐŽÑÑÐ° ÐžÐœÑÑÐ°Ð»Ð»ÑÑÐžÐž ÑÐŸÐ»ÑÐºÐŸ
+                      ÑÑÑÐ°ÐœÐ°Ð²Ð»ÐžÐ²Ð°ÐµÑ ÐžÐœÐŽÐµÐºÑÑ Ð¿ÑÐµÐŽÐ¿ÐŸÑÑÑÐŸÐµÐœÐžÑ, ÐŸÑÐžÐ³ÐžÐœÐ°Ð»ÑÐœÑÐµ
+                      ÐžÑÑ
+ÐŸÐŽÐœÑÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ ÐŽÐ»Ñ ÐºÐ°Ð¶ÐŽÐŸÐ¹ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž ÐŽÐŸÑÑÑÐ¿ÐœÑ ÐœÐ°
+                      CD-ROM. ÐÑÑ
+ÐŸÐŽÐœÑÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ ÐŒÐŸÐ³ÑÑ Ð±ÑÑÑ Ð¿ÐŸÐ»ÐµÐ·ÐœÑ ÐŽÐ»Ñ ÑÐµÑ
+,
+                      ÐºÑÐŸ Ð¿ÑÑÐ°ÐµÑÑÑ ÑÐŸÐ·ÐŽÐ°Ð²Ð°ÑÑ ÐœÐŸÐ²ÑÐµ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž, ÐºÐŸÑÐŸÑÑÐµ ÐºÐŸÐ¿ÐžÑÑÑÑ 
+                      ÑÐŸÑÐŒÐ°Ñ ÑÑÐžÑ
+ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐ¹.
+
+                   demo         ÐŽÐµÐŒÐŸÐœÑÑÑÐ°ÑÐžÐŸÐœÐœÑÐ¹ Ð¿ÑÐžÐŒÐµÑ Greenstone
+                   dls-e        Ð¡ÑÐ±ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ ÐÐžÐ±Ð»ÐžÐŸÑÐµÐºÐž ÑÐ°Ð·Ð²ÐžÑÐžÑ
+                   wrdpdf-e     ÐÐµÐŒÐŸÐœÑÑÑÐ°ÑÐžÑ MSWord Ðž PDF
+                   gsarch-e     ÐÐŸÐ»Ð»ÐµÐºÑÐžÑ Ð°ÑÑ
+ÐžÐ²ÐŸÐ² Greenstone
+                   cltbib-e     ÐÐžÐ±Ð»ÐžÐŸÐ³ÑÐ°ÑÐžÑÐµÑÐºÐ°Ñ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ
+                   cltext-e     ÐÑÐžÐ»ÐŸÐ¶ÐµÐœÐžÐµ Ð±ÐžÐ±Ð»ÐžÐŸÐ³ÑÐ°ÑÐžÐž
+                   MARC-e       ÐÑÐžÐŒÐµÑ MARC
+                   oai-e        ÐÐµÐŒÐŸÐœÑÑÑÐ°ÑÐž-ÐŸÐœÐœÐ°Ñ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ OAI
+                   image-e      ÐÑÐŸÑÑÐ°Ñ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐ¹
+                   authen-e     ÐÐµÐŒÐŸÐœÑÑÑÐ°ÑÐžÑ ÑÐŸÑÐŒÐ°ÑÐžÑÐŸÐ²Ð°-ÐœÐžÑ Ðž Ð°ÑÑÐµÐœÑÐžÑÐžÐºÐ°ÑÐžÐž
+                   garish       Ð ÐµÐ·ÐºÐ°Ñ Ð²ÐµÑÑÐžÑ ÐŽÐµÐŒÐŸÐœÑÑÑÐ°ÑÐžÐŸÐœ-ÐœÐŸÐ¹ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž
+                   isis-e       ÐÑÐžÐŒÐµÑ CDS/ISIS
+
+        src           ÑÐ°Ð¹Ð»Ñ ÐžÑÑ
+ÐŸÐŽÐœÐŸÐ³ÐŸ ÑÐµÐºÑÑÐ° Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÑ
+
+                   Windows      ÐºÐŸÐœÑÐžÐ³ÑÑÐ°ÑÐžÐŸÐœÐœÐ°Ñ ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÑ ÐŽÐ»Ñ Windows
+                   Unix         ÐºÐŸÐœÑÐžÐ³ÑÑÐ°ÑÐžÐŸÐœÐœÐ°Ñ ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÑ ÐŽÐ»Ñ Unix  
+                   lib          Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐ° ÐºÐŸÐŽÐŸÐ² C++
+                   packages     ÐžÑÑ
+ÐŸÐŽÐœÑÐ¹ ÐºÐŸÐŽ C++ ÐŽÐ»Ñ Ð¿Ð°ÐºÐµÑÐŸÐ², ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÑÑ
+ 
+                                Greenstone
+                   src          ÐžÑÑ
+ÐŸÐŽÐœÑÐ¹ ÐºÐŸÐŽ C++ (ÑÐµÐºÑÑ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÑ).
Index: /main/branches/stable_gs3/release-kits/shared/greenstone2/docs/SUPPORT.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone2/docs/SUPPORT.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone2/docs/SUPPORT.txt	(revision 21851)
@@ -0,0 +1,17 @@
+GREENSTONE SUPPORT
+
+A complete list of Greenstone support options is available at:
+http://www.greenstone.org/support
+
+Documentation Manuals are available on CD-ROM releases of Greenstone in the
+"Documentation" folder.
+
+To submit bug reports, follow these steps:
+
+	1.	Register as a developer to gain access to Greenstone's bug tracking
+		system at http://www.greenstone.org/developers-register
+	2.	Go to http://trac.greenstone.org/ in your web browser and click "login"
+		near the top of the screen. Login with your username and password.
+	3.	Click on "New Ticket" near the top of the screen and fill in the Create
+		New Ticket form.
+
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser.pm
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser.pm	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser.pm	(revision 21851)
@@ -0,0 +1,840 @@
+# XML::Parser
+#
+# Copyright (c) 1998-2000 Larry Wall and Clark Cooper
+# All rights reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package XML::Parser;
+
+use Carp;
+
+BEGIN {
+  require XML::Parser::Expat;
+  $VERSION = '2.34';
+  die "Parser.pm and Expat.pm versions don't match"
+    unless $VERSION eq $XML::Parser::Expat::VERSION;
+}
+
+use strict;
+
+use vars qw($VERSION $LWP_load_failed);
+
+$LWP_load_failed = 0;
+
+sub new {
+  my ($class, %args) = @_;
+  my $style = $args{Style};
+  
+  my $nonexopt = $args{Non_Expat_Options} ||= {};
+  
+  $nonexopt->{Style}             = 1;
+  $nonexopt->{Non_Expat_Options} = 1;
+  $nonexopt->{Handlers}          = 1;
+  $nonexopt->{_HNDL_TYPES}       = 1;
+  $nonexopt->{NoLWP}             = 1;
+  
+  $args{_HNDL_TYPES} = {%XML::Parser::Expat::Handler_Setters};
+  $args{_HNDL_TYPES}->{Init} = 1;
+  $args{_HNDL_TYPES}->{Final} = 1;
+  
+  $args{Handlers} ||= {};
+  my $handlers = $args{Handlers};
+  
+  if (defined($style)) {
+    my $stylepkg = $style;
+    
+    if ($stylepkg !~ /::/) {
+      $stylepkg = "\u$style";
+      
+      eval {
+          my $fullpkg = 'XML::Parser::Style::' . $stylepkg;
+          my $stylefile = $fullpkg;
+          $stylefile =~ s/::/\//g;
+          require "$stylefile.pm";
+          $stylepkg = $fullpkg;
+      };
+      if ($@) {
+          # fallback to old behaviour
+          $stylepkg = 'XML::Parser::' . $stylepkg;
+      }
+    }
+    
+    my $htype;
+    foreach $htype (keys %{$args{_HNDL_TYPES}}) {
+      # Handlers explicity given override
+      # handlers from the Style package
+      unless (defined($handlers->{$htype})) {
+        
+        # A handler in the style package must either have
+        # exactly the right case as the type name or a
+        # completely lower case version of it.
+        
+        my $hname = "${stylepkg}::$htype";
+        if (defined(&$hname)) {
+          $handlers->{$htype} = \&$hname;
+          next;
+        }
+        
+        $hname = "${stylepkg}::\L$htype";
+        if (defined(&$hname)) {
+          $handlers->{$htype} = \&$hname;
+          next;
+        }
+      }
+    }
+  }
+  
+  unless (defined($handlers->{ExternEnt})
+          or defined ($handlers->{ExternEntFin})) {
+    
+    if ($args{NoLWP} or $LWP_load_failed) {
+      $handlers->{ExternEnt} = \&file_ext_ent_handler;
+      $handlers->{ExternEntFin} = \&file_ext_ent_cleanup;
+    }
+    else {
+      # The following just bootstraps the real LWP external entity
+      # handler
+
+      $handlers->{ExternEnt} = \&initial_ext_ent_handler;
+
+      # No cleanup function available until LWPExternEnt.pl loaded
+    }
+  }
+
+  $args{Pkg} ||= caller;
+  bless \%args, $class;
+}                                # End of new
+
+sub setHandlers {
+  my ($self, @handler_pairs) = @_;
+  
+  croak("Uneven number of arguments to setHandlers method")
+    if (int(@handler_pairs) & 1);
+  
+  my @ret;
+  while (@handler_pairs) {
+    my $type = shift @handler_pairs;
+    my $handler = shift @handler_pairs;
+    unless (defined($self->{_HNDL_TYPES}->{$type})) {
+      my @types = sort keys %{$self->{_HNDL_TYPES}};
+      
+      croak("Unknown Parser handler type: $type\n Valid types: @types");
+    }
+    push(@ret, $type, $self->{Handlers}->{$type});
+    $self->{Handlers}->{$type} = $handler;
+  }
+
+  return @ret;
+}
+
+sub parse_start {
+  my $self = shift;
+  my @expat_options = ();
+
+  my ($key, $val);
+  while (($key, $val) = each %{$self}) {
+    push (@expat_options, $key, $val)
+      unless exists $self->{Non_Expat_Options}->{$key};
+  }
+
+  my %handlers = %{$self->{Handlers}};
+  my $init = delete $handlers{Init};
+  my $final = delete $handlers{Final};
+
+  my $expatnb = new XML::Parser::ExpatNB(@expat_options, @_);
+  $expatnb->setHandlers(%handlers);
+
+  &$init($expatnb)
+    if defined($init);
+
+  $expatnb->{_State_} = 1;
+
+  $expatnb->{FinalHandler} = $final
+    if defined($final);
+
+  return $expatnb;
+}
+
+sub parse {
+  my $self = shift;
+  my $arg  = shift;
+  my @expat_options = ();
+  my ($key, $val);
+  while (($key, $val) = each %{$self}) {
+    push(@expat_options, $key, $val)
+      unless exists $self->{Non_Expat_Options}->{$key};
+  }
+  
+  my $expat = new XML::Parser::Expat(@expat_options, @_);
+  my %handlers = %{$self->{Handlers}};
+  my $init = delete $handlers{Init};
+  my $final = delete $handlers{Final};
+  
+  $expat->setHandlers(%handlers);
+  
+  if ($self->{Base}) {
+    $expat->base($self->{Base});
+  }
+
+  &$init($expat)
+    if defined($init);
+  
+  my @result = ();
+  my $result;
+  eval {
+    $result = $expat->parse($arg);
+  };
+  my $err = $@;
+  if ($err) {
+    $expat->release;
+    die $err;
+  }
+  
+  if ($result and defined($final)) {
+    if (wantarray) {
+      @result = &$final($expat);
+    }
+    else {
+      $result = &$final($expat);
+    }
+  }
+  
+  $expat->release;
+
+  return unless defined wantarray;
+  return wantarray ? @result : $result;
+}
+
+sub parsestring {
+  my $self = shift;
+  $self->parse(@_);
+}
+
+sub parsefile {
+  my $self = shift;
+  my $file = shift;
+  local(*FILE);
+  open(FILE, $file) or  croak "Couldn't open $file:\n$!";
+  binmode(FILE);
+  my @ret;
+  my $ret;
+
+  $self->{Base} = $file;
+
+  if (wantarray) {
+    eval {
+      @ret = $self->parse(*FILE, @_);
+    };
+  }
+  else {
+    eval {
+      $ret = $self->parse(*FILE, @_);
+    };
+  }
+  my $err = $@;
+  close(FILE);
+  die $err if $err;
+  
+  return unless defined wantarray;
+  return wantarray ? @ret : $ret;
+}
+
+sub initial_ext_ent_handler {
+  # This just bootstraps in the real lwp_ext_ent_handler which
+  # also loads the URI and LWP modules.
+
+  unless ($LWP_load_failed) {
+    local($^W) = 0;
+
+    my $stat =
+      eval {
+        require('XML/Parser/LWPExternEnt.pl');
+      };
+      
+    if ($stat) {
+      $_[0]->setHandlers(ExternEnt    => \&lwp_ext_ent_handler,
+                         ExternEntFin => \&lwp_ext_ent_cleanup);
+                       
+      goto &lwp_ext_ent_handler;
+    }
+
+    # Failed to load lwp handler, act as if NoLWP
+
+    $LWP_load_failed = 1;
+
+    my $cmsg = "Couldn't load LWP based external entity handler\n";
+    $cmsg .= "Switching to file-based external entity handler\n";
+    $cmsg .= " (To avoid this message, use NoLWP option to XML::Parser)\n";
+    warn($cmsg);
+  }
+
+  $_[0]->setHandlers(ExternEnt    => \&file_ext_ent_handler,
+                     ExternEntFin => \&file_ext_ent_cleanup);
+  goto &file_ext_ent_handler;
+
+}
+
+sub file_ext_ent_handler {
+  my ($xp, $base, $path) = @_;
+
+  # Prepend base only for relative paths
+
+  if (defined($base)
+      and not ($path =~ m!^(?:[\\/]|\w+:)!))
+    {
+      my $newpath = $base;
+      $newpath =~ s![^\\/:]*$!$path!;
+      $path = $newpath;
+    }
+
+  if ($path =~ /^\s*[|>+]/
+      or $path =~ /\|\s*$/) {
+    $xp->{ErrorMessage}
+        .= "System ID ($path) contains Perl IO control characters";
+    return undef;
+  }
+
+  require IO::File;
+  my $fh = new IO::File($path);
+  unless (defined $fh) {
+    $xp->{ErrorMessage}
+      .= "Failed to open $path:\n$!";
+    return undef;
+  }
+
+  $xp->{_BaseStack} ||= [];
+  $xp->{_FhStack} ||= [];
+
+  push(@{$xp->{_BaseStack}}, $base);
+  push(@{$xp->{_FhStack}}, $fh);
+
+  $xp->base($path);
+  
+  return $fh;
+}
+
+sub file_ext_ent_cleanup {
+  my ($xp) = @_;
+
+  my $fh = pop(@{$xp->{_FhStack}});
+  $fh->close;
+
+  my $base = pop(@{$xp->{_BaseStack}});
+  $xp->base($base);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+XML::Parser - A perl module for parsing XML documents
+
+=head1 SYNOPSIS
+
+  use XML::Parser;
+  
+  $p1 = new XML::Parser(Style => 'Debug');
+  $p1->parsefile('REC-xml-19980210.xml');
+  $p1->parse('<foo id="me">Hello World</foo>');
+
+  # Alternative
+  $p2 = new XML::Parser(Handlers => {Start => \&handle_start,
+                                     End   => \&handle_end,
+                                     Char  => \&handle_char});
+  $p2->parse($socket);
+
+  # Another alternative
+  $p3 = new XML::Parser(ErrorContext => 2);
+
+  $p3->setHandlers(Char    => \&text,
+                   Default => \&other);
+
+  open(FOO, 'xmlgenerator |');
+  $p3->parse(*FOO, ProtocolEncoding => 'ISO-8859-1');
+  close(FOO);
+
+  $p3->parsefile('junk.xml', ErrorContext => 3);
+
+=begin man
+.ds PI PI
+
+=end man
+
+=head1 DESCRIPTION
+
+This module provides ways to parse XML documents. It is built on top of
+L<XML::Parser::Expat>, which is a lower level interface to James Clark's
+expat library. Each call to one of the parsing methods creates a new
+instance of XML::Parser::Expat which is then used to parse the document.
+Expat options may be provided when the XML::Parser object is created.
+These options are then passed on to the Expat object on each parse call.
+They can also be given as extra arguments to the parse methods, in which
+case they override options given at XML::Parser creation time.
+
+The behavior of the parser is controlled either by C<L</Style>> and/or
+C<L</Handlers>> options, or by L</setHandlers> method. These all provide
+mechanisms for XML::Parser to set the handlers needed by XML::Parser::Expat.
+If neither C<Style> nor C<Handlers> are specified, then parsing just
+checks the document for being well-formed.
+
+When underlying handlers get called, they receive as their first parameter
+the I<Expat> object, not the Parser object.
+
+=head1 METHODS
+
+=over 4
+
+=item new
+
+This is a class method, the constructor for XML::Parser. Options are passed
+as keyword value pairs. Recognized options are:
+
+=over 4
+
+=item * Style
+
+This option provides an easy way to create a given style of parser. The
+built in styles are: L<"Debug">, L<"Subs">, L<"Tree">, L<"Objects">,
+and L<"Stream">. These are all defined in separate packages under
+C<XML::Parser::Style::*>, and you can find further documentation for
+each style both below, and in those packages.
+
+Custom styles can be provided by giving a full package name containing
+at least one '::'. This package should then have subs defined for each
+handler it wishes to have installed. See L<"STYLES"> below
+for a discussion of each built in style.
+
+=item * Handlers
+
+When provided, this option should be an anonymous hash containing as
+keys the type of handler and as values a sub reference to handle that
+type of event. All the handlers get passed as their 1st parameter the
+instance of expat that is parsing the document. Further details on
+handlers can be found in L<"HANDLERS">. Any handler set here
+overrides the corresponding handler set with the Style option.
+
+=item * Pkg
+
+Some styles will refer to subs defined in this package. If not provided,
+it defaults to the package which called the constructor.
+
+=item * ErrorContext
+
+This is an Expat option. When this option is defined, errors are reported
+in context. The value should be the number of lines to show on either side
+of the line in which the error occurred.
+
+=item * ProtocolEncoding
+
+This is an Expat option. This sets the protocol encoding name. It defaults
+to none. The built-in encodings are: C<UTF-8>, C<ISO-8859-1>, C<UTF-16>, and
+C<US-ASCII>. Other encodings may be used if they have encoding maps in one
+of the directories in the @Encoding_Path list. Check L<"ENCODINGS"> for
+more information on encoding maps. Setting the protocol encoding overrides
+any encoding in the XML declaration.
+
+=item * Namespaces
+
+This is an Expat option. If this is set to a true value, then namespace
+processing is done during the parse. See L<XML::Parser::Expat/"Namespaces">
+for further discussion of namespace processing.
+
+=item * NoExpand
+
+This is an Expat option. Normally, the parser will try to expand references
+to entities defined in the internal subset. If this option is set to a true
+value, and a default handler is also set, then the default handler will be
+called when an entity reference is seen in text. This has no effect if a
+default handler has not been registered, and it has no effect on the expansion
+of entity references inside attribute values.
+
+=item * Stream_Delimiter
+
+This is an Expat option. It takes a string value. When this string is found
+alone on a line while parsing from a stream, then the parse is ended as if it
+saw an end of file. The intended use is with a stream of xml documents in a
+MIME multipart format. The string should not contain a trailing newline.
+
+=item * ParseParamEnt
+
+This is an Expat option. Unless standalone is set to "yes" in the XML
+declaration, setting this to a true value allows the external DTD to be read,
+and parameter entities to be parsed and expanded.
+
+=item * NoLWP
+
+This option has no effect if the ExternEnt or ExternEntFin handlers are
+directly set. Otherwise, if true, it forces the use of a file based external
+entity handler.
+
+=item * Non-Expat-Options
+
+If provided, this should be an anonymous hash whose keys are options that
+shouldn't be passed to Expat. This should only be of concern to those
+subclassing XML::Parser.
+
+=back
+
+=item  setHandlers(TYPE, HANDLER [, TYPE, HANDLER [...]])
+
+This method registers handlers for various parser events. It overrides any
+previous handlers registered through the Style or Handler options or through
+earlier calls to setHandlers. By providing a false or undefined value as
+the handler, the existing handler can be unset.
+
+This method returns a list of type, handler pairs corresponding to the
+input. The handlers returned are the ones that were in effect prior to
+the call.
+
+See a description of the handler types in L<"HANDLERS">.
+
+=item parse(SOURCE [, OPT => OPT_VALUE [...]])
+
+The SOURCE parameter should either be a string containing the whole XML
+document, or it should be an open IO::Handle. Constructor options to
+XML::Parser::Expat given as keyword-value pairs may follow the SOURCE
+parameter. These override, for this call, any options or attributes passed
+through from the XML::Parser instance.
+
+A die call is thrown if a parse error occurs. Otherwise it will return 1
+or whatever is returned from the B<Final> handler, if one is installed.
+In other words, what parse may return depends on the style.
+
+=item parsestring
+
+This is just an alias for parse for backwards compatibility.
+
+=item parsefile(FILE [, OPT => OPT_VALUE [...]])
+
+Open FILE for reading, then call parse with the open handle. The file
+is closed no matter how parse returns. Returns what parse returns.
+
+=item parse_start([ OPT => OPT_VALUE [...]])
+
+Create and return a new instance of XML::Parser::ExpatNB. Constructor
+options may be provided. If an init handler has been provided, it is
+called before returning the ExpatNB object. Documents are parsed by
+making incremental calls to the parse_more method of this object, which
+takes a string. A single call to the parse_done method of this object,
+which takes no arguments, indicates that the document is finished.
+
+If there is a final handler installed, it is executed by the parse_done
+method before returning and the parse_done method returns whatever is
+returned by the final handler.
+
+=back
+
+=head1 HANDLERS
+
+Expat is an event based parser. As the parser recognizes parts of the
+document (say the start or end tag for an XML element), then any handlers
+registered for that type of an event are called with suitable parameters.
+All handlers receive an instance of XML::Parser::Expat as their first
+argument. See L<XML::Parser::Expat/"METHODS"> for a discussion of the
+methods that can be called on this object.
+
+=head2 Init                (Expat)
+
+This is called just before the parsing of the document starts.
+
+=head2 Final                (Expat)
+
+This is called just after parsing has finished, but only if no errors
+occurred during the parse. Parse returns what this returns.
+
+=head2 Start                (Expat, Element [, Attr, Val [,...]])
+
+This event is generated when an XML start tag is recognized. Element is the
+name of the XML element type that is opened with the start tag. The Attr &
+Val pairs are generated for each attribute in the start tag.
+
+=head2 End                (Expat, Element)
+
+This event is generated when an XML end tag is recognized. Note that
+an XML empty tag (<foo/>) generates both a start and an end event.
+
+=head2 Char                (Expat, String)
+
+This event is generated when non-markup is recognized. The non-markup
+sequence of characters is in String. A single non-markup sequence of
+characters may generate multiple calls to this handler. Whatever the
+encoding of the string in the original document, this is given to the
+handler in UTF-8.
+
+=head2 Proc                (Expat, Target, Data)
+
+This event is generated when a processing instruction is recognized.
+
+=head2 Comment                (Expat, Data)
+
+This event is generated when a comment is recognized.
+
+=head2 CdataStart        (Expat)
+
+This is called at the start of a CDATA section.
+
+=head2 CdataEnd                (Expat)
+
+This is called at the end of a CDATA section.
+
+=head2 Default                (Expat, String)
+
+This is called for any characters that don't have a registered handler.
+This includes both characters that are part of markup for which no
+events are generated (markup declarations) and characters that
+could generate events, but for which no handler has been registered.
+
+Whatever the encoding in the original document, the string is returned to
+the handler in UTF-8.
+
+=head2 Unparsed                (Expat, Entity, Base, Sysid, Pubid, Notation)
+
+This is called for a declaration of an unparsed entity. Entity is the name
+of the entity. Base is the base to be used for resolving a relative URI.
+Sysid is the system id. Pubid is the public id. Notation is the notation
+name. Base and Pubid may be undefined.
+
+=head2 Notation                (Expat, Notation, Base, Sysid, Pubid)
+
+This is called for a declaration of notation. Notation is the notation name.
+Base is the base to be used for resolving a relative URI. Sysid is the system
+id. Pubid is the public id. Base, Sysid, and Pubid may all be undefined.
+
+=head2 ExternEnt        (Expat, Base, Sysid, Pubid)
+
+This is called when an external entity is referenced. Base is the base to be
+used for resolving a relative URI. Sysid is the system id. Pubid is the public
+id. Base, and Pubid may be undefined.
+
+This handler should either return a string, which represents the contents of
+the external entity, or return an open filehandle that can be read to obtain
+the contents of the external entity, or return undef, which indicates the
+external entity couldn't be found and will generate a parse error.
+
+If an open filehandle is returned, it must be returned as either a glob
+(*FOO) or as a reference to a glob (e.g. an instance of IO::Handle).
+
+A default handler is installed for this event. The default handler is
+XML::Parser::lwp_ext_ent_handler unless the NoLWP option was provided with
+a true value, otherwise XML::Parser::file_ext_ent_handler is the default
+handler for external entities. Even without the NoLWP option, if the
+URI or LWP modules are missing, the file based handler ends up being used
+after giving a warning on the first external entity reference.
+
+The LWP external entity handler will use proxies defined in the environment
+(http_proxy, ftp_proxy, etc.).
+
+Please note that the LWP external entity handler reads the entire
+entity into a string and returns it, where as the file handler opens a
+filehandle.
+
+Also note that the file external entity handler will likely choke on
+absolute URIs or file names that don't fit the conventions of the local
+operating system.
+
+The expat base method can be used to set a basename for
+relative pathnames. If no basename is given, or if the basename is itself
+a relative name, then it is relative to the current working directory.
+
+=head2 ExternEntFin        (Expat)
+
+This is called after parsing an external entity. It's not called unless
+an ExternEnt handler is also set. There is a default handler installed
+that pairs with the default ExternEnt handler.
+
+If you're going to install your own ExternEnt handler, then you should
+set (or unset) this handler too.
+
+=head2 Entity                (Expat, Name, Val, Sysid, Pubid, Ndata, IsParam)
+
+This is called when an entity is declared. For internal entities, the Val
+parameter will contain the value and the remaining three parameters will be
+undefined. For external entities, the Val parameter will be undefined, the
+Sysid parameter will have the system id, the Pubid parameter will have the
+public id if it was provided (it will be undefined otherwise), the Ndata
+parameter will contain the notation for unparsed entities. If this is a
+parameter entity declaration, then the IsParam parameter is true.
+
+Note that this handler and the Unparsed handler above overlap. If both are
+set, then this handler will not be called for unparsed entities.
+
+=head2 Element                (Expat, Name, Model)
+
+The element handler is called when an element declaration is found. Name
+is the element name, and Model is the content model as an XML::Parser::Content
+object. See L<XML::Parser::Expat/"XML::Parser::ContentModel Methods">
+for methods available for this class.
+
+=head2 Attlist                (Expat, Elname, Attname, Type, Default, Fixed)
+
+This handler is called for each attribute in an ATTLIST declaration.
+So an ATTLIST declaration that has multiple attributes will generate multiple
+calls to this handler. The Elname parameter is the name of the element with
+which the attribute is being associated. The Attname parameter is the name
+of the attribute. Type is the attribute type, given as a string. Default is
+the default value, which will either be "#REQUIRED", "#IMPLIED" or a quoted
+string (i.e. the returned string will begin and end with a quote character).
+If Fixed is true, then this is a fixed attribute.
+
+=head2 Doctype                (Expat, Name, Sysid, Pubid, Internal)
+
+This handler is called for DOCTYPE declarations. Name is the document type
+name. Sysid is the system id of the document type, if it was provided,
+otherwise it's undefined. Pubid is the public id of the document type,
+which will be undefined if no public id was given. Internal is the internal
+subset, given as a string. If there was no internal subset, it will be
+undefined. Internal will contain all whitespace, comments, processing
+instructions, and declarations seen in the internal subset. The declarations
+will be there whether or not they have been processed by another handler
+(except for unparsed entities processed by the Unparsed handler). However,
+comments and processing instructions will not appear if they've been processed
+by their respective handlers.
+
+=head2 * DoctypeFin                (Parser)
+
+This handler is called after parsing of the DOCTYPE declaration has finished,
+including any internal or external DTD declarations.
+
+=head2 XMLDecl                (Expat, Version, Encoding, Standalone)
+
+This handler is called for xml declarations. Version is a string containg
+the version. Encoding is either undefined or contains an encoding string.
+Standalone will be either true, false, or undefined if the standalone attribute
+is yes, no, or not made respectively.
+
+=head1 STYLES
+
+=head2 Debug
+
+This just prints out the document in outline form. Nothing special is
+returned by parse.
+
+=head2 Subs
+
+Each time an element starts, a sub by that name in the package specified
+by the Pkg option is called with the same parameters that the Start
+handler gets called with.
+
+Each time an element ends, a sub with that name appended with an underscore
+("_"), is called with the same parameters that the End handler gets called
+with.
+
+Nothing special is returned by parse.
+
+=head2 Tree
+
+Parse will return a parse tree for the document. Each node in the tree
+takes the form of a tag, content pair. Text nodes are represented with
+a pseudo-tag of "0" and the string that is their content. For elements,
+the content is an array reference. The first item in the array is a
+(possibly empty) hash reference containing attributes. The remainder of
+the array is a sequence of tag-content pairs representing the content
+of the element.
+
+So for example the result of parsing:
+
+  <foo><head id="a">Hello <em>there</em></head><bar>Howdy<ref/></bar>do</foo>
+
+would be:
+
+             Tag   Content
+  ==================================================================
+  [foo, [{}, head, [{id => "a"}, 0, "Hello ",  em, [{}, 0, "there"]],
+              bar, [         {}, 0, "Howdy",  ref, [{}]],
+                0, "do"
+        ]
+  ]
+
+The root document "foo", has 3 children: a "head" element, a "bar"
+element and the text "do". After the empty attribute hash, these are
+represented in it's contents by 3 tag-content pairs.
+
+=head2 Objects
+
+This is similar to the Tree style, except that a hash object is created for
+each element. The corresponding object will be in the class whose name
+is created by appending "::" and the element name to the package set with
+the Pkg option. Non-markup text will be in the ::Characters class. The
+contents of the corresponding object will be in an anonymous array that
+is the value of the Kids property for that object.
+
+=head2 Stream
+
+This style also uses the Pkg package. If none of the subs that this
+style looks for is there, then the effect of parsing with this style is
+to print a canonical copy of the document without comments or declarations.
+All the subs receive as their 1st parameter the Expat instance for the
+document they're parsing.
+
+It looks for the following routines:
+
+=over 4
+
+=item * StartDocument
+
+Called at the start of the parse .
+
+=item * StartTag
+
+Called for every start tag with a second parameter of the element type. The $_
+variable will contain a copy of the tag and the %_ variable will contain
+attribute values supplied for that element.
+
+=item * EndTag
+
+Called for every end tag with a second parameter of the element type. The $_
+variable will contain a copy of the end tag.
+
+=item * Text
+
+Called just before start or end tags with accumulated non-markup text in
+the $_ variable.
+
+=item * PI
+
+Called for processing instructions. The $_ variable will contain a copy of
+the PI and the target and data are sent as 2nd and 3rd parameters
+respectively.
+
+=item * EndDocument
+
+Called at conclusion of the parse.
+
+=back
+
+=head1 ENCODINGS
+
+XML documents may be encoded in character sets other than Unicode as
+long as they may be mapped into the Unicode character set. Expat has
+further restrictions on encodings. Read the xmlparse.h header file in
+the expat distribution to see details on these restrictions.
+
+Expat has built-in encodings for: C<UTF-8>, C<ISO-8859-1>, C<UTF-16>, and
+C<US-ASCII>. Encodings are set either through the XML declaration
+encoding attribute or through the ProtocolEncoding option to XML::Parser
+or XML::Parser::Expat.
+
+For encodings other than the built-ins, expat calls the function
+load_encoding in the Expat package with the encoding name. This function
+looks for a file in the path list @XML::Parser::Expat::Encoding_Path, that
+matches the lower-cased name with a '.enc' extension. The first one it
+finds, it loads.
+
+If you wish to build your own encoding maps, check out the XML::Encoding
+module from CPAN.
+
+=head1 AUTHORS
+
+Larry Wall <F<larry@wall.org>> wrote version 1.0.
+
+Clark Cooper <F<coopercc@netheaven.com>> picked up support, changed the API
+for this version (2.x), provided documentation,
+and added some standard package features.
+
+Matt Sergeant <F<matt@sergeant.org>> is now maintaining XML::Parser
+
+=cut
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/Encodings/Japanese_Encodings.msg
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/Encodings/Japanese_Encodings.msg	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/Encodings/Japanese_Encodings.msg	(revision 21851)
@@ -0,0 +1,117 @@
+Mapping files for Japanese encodings
+
+1998 12/25
+
+Fuji Xerox Information Systems
+MURATA Makoto
+
+1.  Overview
+
+This version of XML::Parser and XML::Encoding does not come with map files for
+the charset "Shift_JIS" and the charset "euc-jp".  Unfortunately, each of these 
+charsets has more than one mapping.  None of these mappings are
+considered as authoritative.
+
+Therefore, we have come to believe that it is dangerous to provide map files
+for these charsets.  Rather, we introduce several private charsets and map
+files for these private charsets.  If IANA, Unicode Consoritum, and JIS
+eventually reach a consensus, we will be able to provide map files for
+"Shift_JIS" and "euc-jp".
+
+2. Different mappings from existing charsets to Unicode
+
+1) Different mappings in JIS X0221 and Unicode
+
+The mapping between JIS X0208:1990 and Unicode 1.1 and the mapping
+between JIS X0212:1990 and Unicode 1.1 are published from Unicode
+consortium.  They are available at 
+ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS/JIS0208.TXT and 
+ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS/JIS0212.TXT, 
+respectively.)  These mapping files have a note as below:
+
+#   The kanji mappings are a normative part of ISO/IEC 10646.  The
+#       non-kanji mappings are provisional, pending definition of
+#       official mappings by Japanese standards bodies.
+
+Unfortunately, the non-kanji mappings in the Japanese standard for ISO 10646/1,
+namely JIS X 0221:1995, is different from the Unicode Consortium mapping since
+0x213D of JIS X 0208 is mapped to U+2014 (em dash) rather than U+2015
+(horizontal bar).  Furthermore, JIS X 0221 clearly says that the mapping is
+informational and non-normative.  As a result, some companies (e.g., Microsoft and
+Apple) have introduced slightly different mappings.  Therefore, neither the
+Unicode consortium mapping nor the JIS X 0221 mapping are considered as
+authoritative.
+
+2) Shift-JIS
+
+This charset is especially problematic, since its definition has been unclear
+since its inception.
+
+The current registration of the charset "Shift_JIS" is as below:
+
+>Name: Shift_JIS  (preferred MIME name)
+>MIBenum: 17
+>Source: A Microsoft code that extends csHalfWidthKatakana to include 
+>       kanji by adding a second byte when the value of the first 
+>       byte is in the ranges 81-9F or E0-EF.
+>Alias: MS_Kanji 
+>Alias: csShiftJIS
+
+First, this does not reference to the mapping "Shift-JIS to Unicode" 
+published by the Unicode consortium (available at
+ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS/SHIFTJIS.TXT).
+
+Second, "kanji" in this registration can be interepreted in different ways.
+Does this "kanji" reference to JIS X0208:1978, JIS X0208:1983, or JIS
+X0208:1990(== JIS X0208:1997)?  These three standards are *incompatible* with
+each other.  Moreover, we can even argue that "kanji" refers to JIS X0212 or
+ideographic characters in other countries.
+
+Third, each company has extended Shift JIS. For example, Microsoft introduced
+OEM extensions (NEC extensionsand IBM extensions).
+
+Forth, Shift JIS uses JIS X0201, which is almost upper-compatible with US-ASCII
+but is not quite.  5C and 7E of JIS X 0201 are different from backslash and 
+tilde, respectively.  However, many programming languages (e.g., Java) 
+ignore this difference and assumes that 5C and 7E of Shift JIS are backslash 
+and tilde.
+
+
+3.  Proposed charsets and mappings
+
+As a tentative solution, we introduce two private charsets for EUC-JP and four
+priviate charsets for Shift JIS.
+
+1) EUC-JP
+
+We have two charsets, namely "x-eucjp-unicode" and "x-eucjp-jisx0221".  Their 
+difference is only one code point.  The mapping for the former is based 
+on the Unicode Consortium mapping, while the latter is based on the JIS X0221 
+mapping.
+
+2) Shift JIS
+
+We have four charsets, namely x-sjis-unicode, x-sjis-jisx0221, 
+x-sjis-jdk117, and x-sjis-cp932.
+
+The mapping for the charset x-sjis-unicode is the one published by the Unicode
+consortium.  The mapping for x-sjis-jisx0221 is almost equivalent to
+x-sjis-unicode, but 0x213D of JIS X 0208 is mapped to U+2014 (em dash) rather
+than U+2015.  The charset x-sjis-jdk117 is again almost equivalent to
+x-sjis-unicode, but 0x5C and 0x7E of JIS X0201 are mapped to backslash and
+tilde.
+
+The charset x-sjis-cp932 is used by Microsoft Windows, and its mapping is
+published from the Unicode Consortium (available at:
+ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.txt).  The
+coded character set for this charset includes NEC-extensions and
+IBM-extensions.  0x5C and 0x7E of JIS X0201 are mapped to backslash and tilde;
+0x213D is mapped to U+2015; and 0x2140, 0x2141, 0x2142, and 0x215E of JIS X
+0208 are mapped to compatibility characters.
+
+Makoto
+ 
+Fuji Xerox Information Systems
+ 
+Tel: +81-44-812-7230   Fax: +81-44-812-7231
+E-mail: murata@apsdc.ksp.fujixerox.co.jp
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/Encodings/README
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/Encodings/README	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/Encodings/README	(revision 21851)
@@ -0,0 +1,51 @@
+This directory contains binary encoding maps for some selected encodings.
+If they are placed in a directoy listed in @XML::Parser::Expat::Encoding_Path,
+then they are automaticly loaded by the XML::Parser::Expat::load_encoding
+function as needed. Otherwise you may load what you need directly by
+explicity calling this function.
+
+These maps were generated by a perl script that comes with the module
+XML::Encoding, compile_encoding, from XML formatted encoding maps that
+are distributed with that module. These XML encoding maps were generated
+in turn with a different script, domap, from mapping information contained
+on the Unicode version 2.0 CD-ROM. This CD-ROM comes with the Unicode
+Standard reference manual and can be ordered from the Unicode Consortium
+at http://www.unicode.org. The identical information is available on the
+internet at ftp://ftp.unicode.org/Public/MAPPINGS.
+
+See the encoding.h header in the Expat sub-directory for a description of
+the structure of these files.
+
+Clark Cooper
+December 12, 1998
+
+================================================================
+
+Contributed maps
+
+This distribution contains four contributed encodings from MURATA Makoto
+<murata@apsdc.ksp.fujixerox.co.jp> that are variations on the encoding
+commonly called Shift_JIS:
+
+x-sjis-cp932.enc
+x-sjis-jdk117.enc
+x-sjis-jisx0221.enc
+x-sjis-unicode.enc	(This is the same encoding as the shift_jis.enc that
+			 was distributed with this module in version 2.17)
+
+Please read his message (Japanese_Encodings.msg) about why these are here
+and why I've removed the shift_jis.enc encoding.
+
+We also have two contributed encodings that are variations of the EUC-JP
+encoding from Yoshida Masato <yoshidam@inse.co.jp>:
+
+x-euc-jp-jisx0221.enc
+x-euc-jp-unicode.enc
+
+The comments that MURATA Makoto made in his message apply to these
+encodings too.
+
+KangChan Lee <dolphin@comeng.chungnam.ac.kr> supplied the euc-kr encoding.
+
+Clark Cooper
+December 26, 1998
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/Expat.pm
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/Expat.pm	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/Expat.pm	(revision 21851)
@@ -0,0 +1,1230 @@
+package XML::Parser::Expat;
+
+require 5.004;
+
+use strict;
+use vars qw($VERSION @ISA %Handler_Setters %Encoding_Table @Encoding_Path
+            $have_File_Spec);
+use Carp;
+
+require DynaLoader;
+
+@ISA = qw(DynaLoader);
+$VERSION = "2.34" ;
+
+$have_File_Spec = $INC{'File/Spec.pm'} || do 'File/Spec.pm';
+
+%Encoding_Table = ();
+if ($have_File_Spec) {
+  @Encoding_Path = (grep(-d $_,
+                         map(File::Spec->catdir($_, qw(XML Parser Encodings)),
+                             @INC)),
+                    File::Spec->curdir);
+}
+else {
+  @Encoding_Path = (grep(-d $_, map($_ . '/XML/Parser/Encodings', @INC)), '.');
+}
+  
+
+bootstrap XML::Parser::Expat $VERSION;
+
+%Handler_Setters = (
+                    Start => \&SetStartElementHandler,
+                    End   => \&SetEndElementHandler,
+                    Char  => \&SetCharacterDataHandler,
+                    Proc  => \&SetProcessingInstructionHandler,
+                    Comment => \&SetCommentHandler,
+                    CdataStart => \&SetStartCdataHandler,
+                    CdataEnd   => \&SetEndCdataHandler,
+                    Default => \&SetDefaultHandler,
+                    Unparsed => \&SetUnparsedEntityDeclHandler,
+                    Notation => \&SetNotationDeclHandler,
+                    ExternEnt => \&SetExternalEntityRefHandler,
+                    ExternEntFin => \&SetExtEntFinishHandler,
+                    Entity => \&SetEntityDeclHandler,
+                    Element => \&SetElementDeclHandler,
+                    Attlist => \&SetAttListDeclHandler,
+                    Doctype => \&SetDoctypeHandler,
+                    DoctypeFin => \&SetEndDoctypeHandler,
+                    XMLDecl => \&SetXMLDeclHandler
+                    );
+
+sub new {
+  my ($class, %args) = @_;
+  my $self = bless \%args, $_[0];
+  $args{_State_} = 0;
+  $args{Context} = [];
+  $args{Namespaces} ||= 0;
+  $args{ErrorMessage} ||= '';
+  if ($args{Namespaces}) {
+    $args{Namespace_Table} = {};
+    $args{Namespace_List} = [undef];
+    $args{Prefix_Table} = {};
+    $args{New_Prefixes} = [];
+  }
+  $args{_Setters} = \%Handler_Setters;
+  $args{Parser} = ParserCreate($self, $args{ProtocolEncoding},
+                               $args{Namespaces});
+  $self;
+}
+
+sub load_encoding {
+  my ($file) = @_;
+
+  $file =~ s!([^/]+)$!\L$1\E!;
+  $file .= '.enc' unless $file =~ /\.enc$/;
+  unless ($file =~ m!^/!) {
+    foreach (@Encoding_Path) {
+      my $tmp = ($have_File_Spec
+                 ? File::Spec->catfile($_, $file)
+                 : "$_/$file");
+      if (-e $tmp) {
+        $file = $tmp;
+        last;
+      }
+    }
+  }
+
+  local(*ENC);
+  open(ENC, $file) or croak("Couldn't open encmap $file:\n$!\n");
+  binmode(ENC);
+  my $data;
+  my $br = sysread(ENC, $data, -s $file);
+  croak("Trouble reading $file:\n$!\n")
+    unless defined($br);
+  close(ENC);
+
+  my $name = LoadEncoding($data, $br);
+  croak("$file isn't an encmap file")
+    unless defined($name);
+
+  $name;
+}  # End load_encoding
+
+sub setHandlers {
+  my ($self, @handler_pairs) = @_;
+
+  croak("Uneven number of arguments to setHandlers method")
+    if (int(@handler_pairs) & 1);
+
+  my @ret;
+
+  while (@handler_pairs) {
+    my $type = shift @handler_pairs;
+    my $handler = shift @handler_pairs;
+    croak "Handler for $type not a Code ref"
+      unless (! defined($handler) or ! $handler or ref($handler) eq 'CODE');
+
+    my $hndl = $self->{_Setters}->{$type};
+
+    unless (defined($hndl)) {
+      my @types = sort keys %{$self->{_Setters}};
+      croak("Unknown Expat handler type: $type\n Valid types: @types");
+    }
+
+    my $old = &$hndl($self->{Parser}, $handler);
+    push (@ret, $type, $old);
+  }
+
+  return @ret;
+}
+
+sub xpcroak
+ {
+  my ($self, $message) = @_;
+
+  my $eclines = $self->{ErrorContext};
+  my $line = GetCurrentLineNumber($_[0]->{Parser});
+  $message .= " at line $line";
+  $message .= ":\n" . $self->position_in_context($eclines)
+    if defined($eclines);
+  croak $message;
+}
+
+sub xpcarp {
+  my ($self, $message) = @_;
+
+  my $eclines = $self->{ErrorContext};
+  my $line = GetCurrentLineNumber($_[0]->{Parser});
+  $message .= " at line $line";
+  $message .= ":\n" . $self->position_in_context($eclines)
+    if defined($eclines);
+  carp $message;
+}
+
+sub default_current {
+  my $self = shift;
+  if ($self->{_State_} == 1) {
+    return DefaultCurrent($self->{Parser});
+  }
+}
+
+sub recognized_string {
+  my $self = shift;
+  if ($self->{_State_} == 1) {
+    return RecognizedString($self->{Parser});
+  }
+}
+
+sub original_string {
+  my $self = shift;
+  if ($self->{_State_} == 1) {
+    return OriginalString($self->{Parser});
+  }
+}
+
+sub current_line {
+  my $self = shift;
+  if ($self->{_State_} == 1) {
+    return GetCurrentLineNumber($self->{Parser});
+  }
+}
+
+sub current_column {
+  my $self = shift;
+  if ($self->{_State_} == 1) {
+    return GetCurrentColumnNumber($self->{Parser});
+  }
+}
+
+sub current_byte {
+  my $self = shift;
+  if ($self->{_State_} == 1) {
+    return GetCurrentByteIndex($self->{Parser});
+  }
+}
+
+sub base {
+  my ($self, $newbase) = @_;
+  my $p = $self->{Parser};
+  my $oldbase = GetBase($p);
+  SetBase($p, $newbase) if @_ > 1;
+  return $oldbase;
+}
+
+sub context {
+  my $ctx = $_[0]->{Context};
+  @$ctx;
+}
+
+sub current_element {
+  my ($self) = @_;
+  @{$self->{Context}} ? $self->{Context}->[-1] : undef;
+}
+
+sub in_element {
+  my ($self, $element) = @_;
+  @{$self->{Context}} ? $self->eq_name($self->{Context}->[-1], $element)
+    : undef;
+}
+
+sub within_element {
+  my ($self, $element) = @_;
+  my $cnt = 0;
+  foreach (@{$self->{Context}}) {
+    $cnt++ if $self->eq_name($_, $element);
+  }
+  return $cnt;
+}
+
+sub depth {
+  my ($self) = @_;
+  int(@{$self->{Context}});
+}
+
+sub element_index {
+  my ($self) = @_;
+
+  if ($self->{_State_} == 1) {
+    return ElementIndex($self->{Parser});
+  }
+}
+
+################
+# Namespace methods
+
+sub namespace {
+  my ($self, $name) = @_;
+  local($^W) = 0;
+  $self->{Namespace_List}->[int($name)];
+}
+
+sub eq_name {
+  my ($self, $nm1, $nm2) = @_;
+  local($^W) = 0;
+
+  int($nm1) == int($nm2) and $nm1 eq $nm2;
+}
+
+sub generate_ns_name {
+  my ($self, $name, $namespace) = @_;
+
+  $namespace ?
+    GenerateNSName($name, $namespace, $self->{Namespace_Table},
+                   $self->{Namespace_List})
+      : $name;
+}
+
+sub new_ns_prefixes {
+  my ($self) = @_;
+  if ($self->{Namespaces}) {
+    return @{$self->{New_Prefixes}};
+  }
+  return ();
+}
+
+sub expand_ns_prefix {
+  my ($self, $prefix) = @_;
+
+  if ($self->{Namespaces}) {
+    my $stack = $self->{Prefix_Table}->{$prefix};
+    return (defined($stack) and @$stack) ? $stack->[-1] : undef;
+  }
+
+  return undef;
+}
+
+sub current_ns_prefixes {
+  my ($self) = @_;
+
+  if ($self->{Namespaces}) {
+    my %set = %{$self->{Prefix_Table}};
+
+    if (exists $set{'#default'} and not defined($set{'#default'}->[-1])) {
+      delete $set{'#default'};
+    }
+
+    return keys %set;
+  }
+
+  return ();
+}
+
+
+################################################################
+# Namespace declaration handlers
+#
+
+sub NamespaceStart {
+  my ($self, $prefix, $uri) = @_;
+
+  $prefix = '#default' unless defined $prefix;
+  my $stack = $self->{Prefix_Table}->{$prefix}; 
+
+  if (defined $stack) {
+    push(@$stack, $uri);
+  }
+  else {
+    $self->{Prefix_Table}->{$prefix} = [$uri];
+  }
+
+  # The New_Prefixes list gets emptied at end of startElement function
+  # in Expat.xs
+
+  push(@{$self->{New_Prefixes}}, $prefix);
+}
+
+sub NamespaceEnd {
+  my ($self, $prefix) = @_;
+
+  $prefix = '#default' unless defined $prefix;
+
+  my $stack = $self->{Prefix_Table}->{$prefix};
+  if (@$stack > 1) {
+    pop(@$stack);
+  }
+  else {
+    delete $self->{Prefix_Table}->{$prefix};
+  }
+}
+
+################
+
+sub specified_attr {
+  my $self = shift;
+  
+  if ($self->{_State_} == 1) {
+    return GetSpecifiedAttributeCount($self->{Parser});
+  }
+}
+
+sub finish {
+  my ($self) = @_;
+  if ($self->{_State_} == 1) {
+    my $parser = $self->{Parser};
+    UnsetAllHandlers($parser);
+  }
+}
+
+sub position_in_context {
+  my ($self, $lines) = @_;
+  if ($self->{_State_} == 1) {
+    my $parser = $self->{Parser};
+    my ($string, $linepos) = PositionContext($parser, $lines);
+
+    return '' unless defined($string);
+
+    my $col = GetCurrentColumnNumber($parser);
+    my $ptr = ('=' x ($col - 1)) . '^' . "\n";
+    my $ret;
+    my $dosplit = $linepos < length($string);
+  
+    $string .= "\n" unless $string =~ /\n$/;
+  
+    if ($dosplit) {
+      $ret = substr($string, 0, $linepos) . $ptr
+        . substr($string, $linepos);
+    } else {
+      $ret = $string . $ptr;
+    }
+  
+    return $ret;
+  }
+}
+
+sub xml_escape {
+  my $self = shift;
+  my $text = shift;
+
+  study $text;
+  $text =~ s/\&/\&amp;/g;
+  $text =~ s/</\&lt;/g;
+  foreach (@_) {
+    croak "xml_escape: '$_' isn't a single character" if length($_) > 1;
+
+    if ($_ eq '>') {
+      $text =~ s/>/\&gt;/g;
+    }
+    elsif ($_ eq '"') {
+      $text =~ s/\"/\&quot;/;
+    }
+    elsif ($_ eq "'") {
+      $text =~ s/\'/\&apos;/;
+    }
+    else {
+      my $rep = '&#' . sprintf('x%X', ord($_)) . ';';
+      if (/\W/) {
+        my $ptrn = "\\$_";
+        $text =~ s/$ptrn/$rep/g;
+      }
+      else {
+        $text =~ s/$_/$rep/g;
+      }
+    }
+  }
+  $text;
+}
+
+sub skip_until {
+  my $self = shift;
+  if ($self->{_State_} <= 1) {
+    SkipUntil($self->{Parser}, $_[0]);
+  }
+}
+
+sub release {
+  my $self = shift;
+  ParserRelease($self->{Parser});
+}
+
+sub DESTROY {
+  my $self = shift;
+  ParserFree($self->{Parser});
+}
+
+sub parse {
+  my $self = shift;
+  my $arg = shift;
+  croak "Parse already in progress (Expat)" if $self->{_State_};
+  $self->{_State_} = 1;
+  my $parser = $self->{Parser};
+  my $ioref;
+  my $result = 0;
+  
+  if (defined $arg) {
+    if (ref($arg) and UNIVERSAL::isa($arg, 'IO::Handle')) {
+      $ioref = $arg;
+    } elsif (tied($arg)) {
+      my $class = ref($arg);
+      no strict 'refs';
+      $ioref = $arg if defined &{"${class}::TIEHANDLE"};
+    }
+    else {
+      require IO::Handle;
+      eval {
+        no strict 'refs';
+        $ioref = *{$arg}{IO} if defined *{$arg};
+      };
+      undef $@;
+    }
+  }
+  
+  if (defined($ioref)) {
+    my $delim = $self->{Stream_Delimiter};
+    my $prev_rs;
+    
+    $prev_rs = ref($ioref)->input_record_separator("\n$delim\n")
+      if defined($delim);
+    
+    $result = ParseStream($parser, $ioref, $delim);
+    
+    ref($ioref)->input_record_separator($prev_rs)
+      if defined($delim);
+  } else {
+    $result = ParseString($parser, $arg);
+  }
+  
+  $self->{_State_} = 2;
+  $result or croak $self->{ErrorMessage};
+}
+
+sub parsestring {
+  my $self = shift;
+  $self->parse(@_);
+}
+
+sub parsefile {
+  my $self = shift;
+  croak "Parser has already been used" if $self->{_State_};
+  local(*FILE);
+  open(FILE, $_[0]) or  croak "Couldn't open $_[0]:\n$!";
+  binmode(FILE);
+  my $ret = $self->parse(*FILE);
+  close(FILE);
+  $ret;
+}
+
+################################################################
+package XML::Parser::ContentModel;
+use overload '""' => \&asString, 'eq' => \&thiseq;
+
+sub EMPTY  () {1}
+sub ANY    () {2}
+sub MIXED  () {3}
+sub NAME   () {4}
+sub CHOICE () {5}
+sub SEQ    () {6}
+
+
+sub isempty {
+  return $_[0]->{Type} == EMPTY;
+}
+
+sub isany {
+  return $_[0]->{Type} == ANY;
+}
+
+sub ismixed {
+  return $_[0]->{Type} == MIXED;
+}
+
+sub isname {
+  return $_[0]->{Type} == NAME;
+}
+
+sub name {
+  return $_[0]->{Tag};
+}
+
+sub ischoice {
+  return $_[0]->{Type} == CHOICE;
+}
+
+sub isseq {
+  return $_[0]->{Type} == SEQ;
+}
+
+sub quant {
+  return $_[0]->{Quant};
+}
+
+sub children {
+  my $children = $_[0]->{Children};
+  if (defined $children) {
+    return @$children;
+  }
+  return undef;
+}
+
+sub asString {
+  my ($self) = @_;
+  my $ret;
+
+  if ($self->{Type} == NAME) {
+    $ret = $self->{Tag};
+  }
+  elsif ($self->{Type} == EMPTY) {
+    return "EMPTY";
+  }
+  elsif ($self->{Type} == ANY) {
+    return "ANY";
+  }
+  elsif ($self->{Type} == MIXED) {
+    $ret = '(#PCDATA';
+    foreach (@{$self->{Children}}) {
+      $ret .= '|' . $_;
+    }
+    $ret .= ')';
+  }
+  else {
+    my $sep = $self->{Type} == CHOICE ? '|' : ',';
+    $ret = '(' . join($sep, map { $_->asString } @{$self->{Children}}) . ')';
+  }
+
+  $ret .= $self->{Quant} if $self->{Quant};
+  return $ret;
+}
+
+sub thiseq {
+  my $self = shift;
+
+  return $self->asString eq $_[0];
+}
+
+################################################################
+package XML::Parser::ExpatNB;
+
+use vars qw(@ISA);
+use Carp;
+
+@ISA = qw(XML::Parser::Expat);
+
+sub parse {
+  my $self = shift;
+  my $class = ref($self);
+  croak "parse method not supported in $class";
+}
+
+sub parsestring {
+  my $self = shift;
+  my $class = ref($self);
+  croak "parsestring method not supported in $class";
+}
+
+sub parsefile {
+  my $self = shift;
+  my $class = ref($self);
+  croak "parsefile method not supported in $class";
+}
+
+sub parse_more {
+  my ($self, $data) = @_;
+
+  $self->{_State_} = 1;
+  my $ret = XML::Parser::Expat::ParsePartial($self->{Parser}, $data);
+
+  croak $self->{ErrorMessage} unless $ret;
+}
+
+sub parse_done {
+  my $self = shift;
+
+  my $ret = XML::Parser::Expat::ParseDone($self->{Parser});
+  unless ($ret) {
+    my $msg = $self->{ErrorMessage};
+    $self->release;
+    croak $msg;
+  }
+
+  $self->{_State_} = 2;
+
+  my $result = $ret;
+  my @result = ();
+  my $final = $self->{FinalHandler};
+  if (defined $final) {
+    if (wantarray) {
+      @result = &$final($self);
+    }
+    else {
+      $result = &$final($self);
+    }
+  }
+
+  $self->release;
+
+  return unless defined wantarray;
+  return wantarray ? @result : $result;
+}
+
+################################################################
+
+package XML::Parser::Encinfo;
+
+sub DESTROY {
+  my $self = shift;
+  XML::Parser::Expat::FreeEncoding($self);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+XML::Parser::Expat - Lowlevel access to James Clark's expat XML parser
+
+=head1 SYNOPSIS
+
+ use XML::Parser::Expat;
+
+ $parser = new XML::Parser::Expat;
+ $parser->setHandlers('Start' => \&sh,
+                      'End'   => \&eh,
+                      'Char'  => \&ch);
+ open(FOO, 'info.xml') or die "Couldn't open";
+ $parser->parse(*FOO);
+ close(FOO);
+ # $parser->parse('<foo id="me"> here <em>we</em> go </foo>');
+
+ sub sh
+ {
+   my ($p, $el, %atts) = @_;
+   $p->setHandlers('Char' => \&spec)
+     if ($el eq 'special');
+   ...
+ }
+
+ sub eh
+ {
+   my ($p, $el) = @_;
+   $p->setHandlers('Char' => \&ch)  # Special elements won't contain
+     if ($el eq 'special');         # other special elements
+   ...
+ } 
+
+=head1 DESCRIPTION
+
+This module provides an interface to James Clark's XML parser, expat. As in
+expat, a single instance of the parser can only parse one document. Calls
+to parsestring after the first for a given instance will die.
+
+Expat (and XML::Parser::Expat) are event based. As the parser recognizes
+parts of the document (say the start or end of an XML element), then any
+handlers registered for that type of an event are called with suitable
+parameters.
+
+=head1 METHODS
+
+=over 4
+
+=item new
+
+This is a class method, the constructor for XML::Parser::Expat. Options are
+passed as keyword value pairs. The recognized options are:
+
+=over 4
+
+=item * ProtocolEncoding
+
+The protocol encoding name. The default is none. The expat built-in
+encodings are: C<UTF-8>, C<ISO-8859-1>, C<UTF-16>, and C<US-ASCII>.
+Other encodings may be used if they have encoding maps in one of the
+directories in the @Encoding_Path list. Setting the protocol encoding
+overrides any encoding in the XML declaration.
+
+=item * Namespaces
+
+When this option is given with a true value, then the parser does namespace
+processing. By default, namespace processing is turned off. When it is
+turned on, the parser consumes I<xmlns> attributes and strips off prefixes
+from element and attributes names where those prefixes have a defined
+namespace. A name's namespace can be found using the L<"namespace"> method
+and two names can be checked for absolute equality with the L<"eq_name">
+method.
+
+=item * NoExpand
+
+Normally, the parser will try to expand references to entities defined in
+the internal subset. If this option is set to a true value, and a default
+handler is also set, then the default handler will be called when an
+entity reference is seen in text. This has no effect if a default handler
+has not been registered, and it has no effect on the expansion of entity
+references inside attribute values.
+
+=item * Stream_Delimiter
+
+This option takes a string value. When this string is found alone on a line
+while parsing from a stream, then the parse is ended as if it saw an end of
+file. The intended use is with a stream of xml documents in a MIME multipart
+format. The string should not contain a trailing newline.
+
+=item * ErrorContext
+
+When this option is defined, errors are reported in context. The value
+of ErrorContext should be the number of lines to show on either side of
+the line in which the error occurred.
+
+=item * ParseParamEnt
+
+Unless standalone is set to "yes" in the XML declaration, setting this to
+a true value allows the external DTD to be read, and parameter entities
+to be parsed and expanded.
+
+=item * Base
+
+The base to use for relative pathnames or URLs. This can also be done by
+using the base method.
+
+=back
+
+=item setHandlers(TYPE, HANDLER [, TYPE, HANDLER [...]])
+
+This method registers handlers for the various events. If no handlers are
+registered, then a call to parsestring or parsefile will only determine if
+the corresponding XML document is well formed (by returning without error.)
+This may be called from within a handler, after the parse has started.
+
+Setting a handler to something that evaluates to false unsets that
+handler.
+
+This method returns a list of type, handler pairs corresponding to the
+input. The handlers returned are the ones that were in effect before the
+call to setHandlers.
+
+The recognized events and the parameters passed to the corresponding
+handlers are:
+
+=over 4
+
+=item * Start             (Parser, Element [, Attr, Val [,...]])
+
+This event is generated when an XML start tag is recognized. Parser is
+an XML::Parser::Expat instance. Element is the name of the XML element that
+is opened with the start tag. The Attr & Val pairs are generated for each
+attribute in the start tag.
+
+=item * End               (Parser, Element)
+
+This event is generated when an XML end tag is recognized. Note that
+an XML empty tag (<foo/>) generates both a start and an end event.
+
+There is always a lower level start and end handler installed that wrap
+the corresponding callbacks. This is to handle the context mechanism.
+A consequence of this is that the default handler (see below) will not
+see a start tag or end tag unless the default_current method is called.
+
+=item * Char              (Parser, String)
+
+This event is generated when non-markup is recognized. The non-markup
+sequence of characters is in String. A single non-markup sequence of
+characters may generate multiple calls to this handler. Whatever the
+encoding of the string in the original document, this is given to the
+handler in UTF-8.
+
+=item * Proc              (Parser, Target, Data)
+
+This event is generated when a processing instruction is recognized.
+
+=item * Comment           (Parser, String)
+
+This event is generated when a comment is recognized.
+
+=item * CdataStart        (Parser)
+
+This is called at the start of a CDATA section.
+
+=item * CdataEnd          (Parser)
+
+This is called at the end of a CDATA section.
+
+=item * Default           (Parser, String)
+
+This is called for any characters that don't have a registered handler.
+This includes both characters that are part of markup for which no
+events are generated (markup declarations) and characters that
+could generate events, but for which no handler has been registered.
+
+Whatever the encoding in the original document, the string is returned to
+the handler in UTF-8.
+
+=item * Unparsed          (Parser, Entity, Base, Sysid, Pubid, Notation)
+
+This is called for a declaration of an unparsed entity. Entity is the name
+of the entity. Base is the base to be used for resolving a relative URI.
+Sysid is the system id. Pubid is the public id. Notation is the notation
+name. Base and Pubid may be undefined.
+
+=item * Notation          (Parser, Notation, Base, Sysid, Pubid)
+
+This is called for a declaration of notation. Notation is the notation name.
+Base is the base to be used for resolving a relative URI. Sysid is the system
+id. Pubid is the public id. Base, Sysid, and Pubid may all be undefined.
+
+=item * ExternEnt         (Parser, Base, Sysid, Pubid)
+
+This is called when an external entity is referenced. Base is the base to be
+used for resolving a relative URI. Sysid is the system id. Pubid is the public
+id. Base, and Pubid may be undefined.
+
+This handler should either return a string, which represents the contents of
+the external entity, or return an open filehandle that can be read to obtain
+the contents of the external entity, or return undef, which indicates the
+external entity couldn't be found and will generate a parse error.
+
+If an open filehandle is returned, it must be returned as either a glob
+(*FOO) or as a reference to a glob (e.g. an instance of IO::Handle).
+
+=item * ExternEntFin      (Parser)
+
+This is called after an external entity has been parsed. It allows
+applications to perform cleanup on actions performed in the above
+ExternEnt handler.
+
+=item * Entity            (Parser, Name, Val, Sysid, Pubid, Ndata, IsParam)
+
+This is called when an entity is declared. For internal entities, the Val
+parameter will contain the value and the remaining three parameters will
+be undefined. For external entities, the Val parameter
+will be undefined, the Sysid parameter will have the system id, the Pubid
+parameter will have the public id if it was provided (it will be undefined
+otherwise), the Ndata parameter will contain the notation for unparsed
+entities. If this is a parameter entity declaration, then the IsParam
+parameter is true.
+
+Note that this handler and the Unparsed handler above overlap. If both are
+set, then this handler will not be called for unparsed entities.
+
+=item * Element           (Parser, Name, Model)
+
+The element handler is called when an element declaration is found. Name is
+the element name, and Model is the content model as an
+XML::Parser::ContentModel object. See L<"XML::Parser::ContentModel Methods">
+for methods available for this class.
+
+=item * Attlist           (Parser, Elname, Attname, Type, Default, Fixed)
+
+This handler is called for each attribute in an ATTLIST declaration.
+So an ATTLIST declaration that has multiple attributes
+will generate multiple calls to this handler. The Elname parameter is the
+name of the element with which the attribute is being associated. The Attname
+parameter is the name of the attribute. Type is the attribute type, given as
+a string. Default is the default value, which will either be "#REQUIRED",
+"#IMPLIED" or a quoted string (i.e. the returned string will begin and end
+with a quote character). If Fixed is true, then this is a fixed attribute.
+
+=item * Doctype           (Parser, Name, Sysid, Pubid, Internal)
+
+This handler is called for DOCTYPE declarations. Name is the document type
+name. Sysid is the system id of the document type, if it was provided,
+otherwise it's undefined. Pubid is the public id of the document type,
+which will be undefined if no public id was given. Internal will be
+true or false, indicating whether or not the doctype declaration contains
+an internal subset.
+
+=item * DoctypeFin        (Parser)
+
+This handler is called after parsing of the DOCTYPE declaration has finished,
+including any internal or external DTD declarations.
+
+=item * XMLDecl           (Parser, Version, Encoding, Standalone)
+
+This handler is called for XML declarations. Version is a string containg
+the version. Encoding is either undefined or contains an encoding string.
+Standalone is either undefined, or true or false. Undefined indicates
+that no standalone parameter was given in the XML declaration. True or
+false indicates "yes" or "no" respectively.
+
+=back
+
+=item namespace(name)
+
+Return the URI of the namespace that the name belongs to. If the name doesn't
+belong to any namespace, an undef is returned. This is only valid on names
+received through the Start or End handlers from a single document, or through
+a call to the generate_ns_name method. In other words, don't use names
+generated from one instance of XML::Parser::Expat with other instances.
+
+=item eq_name(name1, name2)
+
+Return true if name1 and name2 are identical (i.e. same name and from
+the same namespace.) This is only meaningful if both names were obtained
+through the Start or End handlers from a single document, or through
+a call to the generate_ns_name method.
+
+=item generate_ns_name(name, namespace)
+
+Return a name, associated with a given namespace, good for using with the
+above 2 methods. The namespace argument should be the namespace URI, not
+a prefix.
+
+=item new_ns_prefixes
+
+When called from a start tag handler, returns namespace prefixes declared
+with this start tag. If called elsewere (or if there were no namespace
+prefixes declared), it returns an empty list. Setting of the default
+namespace is indicated with '#default' as a prefix.
+
+=item expand_ns_prefix(prefix)
+
+Return the uri to which the given prefix is currently bound. Returns
+undef if the prefix isn't currently bound. Use '#default' to find the
+current binding of the default namespace (if any).
+
+=item current_ns_prefixes
+
+Return a list of currently bound namespace prefixes. The order of the
+the prefixes in the list has no meaning. If the default namespace is
+currently bound, '#default' appears in the list.
+
+=item recognized_string
+
+Returns the string from the document that was recognized in order to call
+the current handler. For instance, when called from a start handler, it
+will give us the the start-tag string. The string is encoded in UTF-8.
+This method doesn't return a meaningful string inside declaration handlers.
+
+=item original_string
+
+Returns the verbatim string from the document that was recognized in
+order to call the current handler. The string is in the original document
+encoding. This method doesn't return a meaningful string inside declaration
+handlers.
+
+=item default_current
+
+When called from a handler, causes the sequence of characters that generated
+the corresponding event to be sent to the default handler (if one is
+registered). Use of this method is deprecated in favor the recognized_string
+method, which you can use without installing a default handler. This
+method doesn't deliver a meaningful string to the default handler when
+called from inside declaration handlers.
+
+=item xpcroak(message)
+
+Concatenate onto the given message the current line number within the
+XML document plus the message implied by ErrorContext. Then croak with
+the formed message.
+
+=item xpcarp(message)
+
+Concatenate onto the given message the current line number within the
+XML document plus the message implied by ErrorContext. Then carp with
+the formed message.
+
+=item current_line
+
+Returns the line number of the current position of the parse.
+
+=item current_column
+
+Returns the column number of the current position of the parse.
+
+=item current_byte
+
+Returns the current position of the parse.
+
+=item base([NEWBASE]);
+
+Returns the current value of the base for resolving relative URIs. If
+NEWBASE is supplied, changes the base to that value.
+
+=item context
+
+Returns a list of element names that represent open elements, with the
+last one being the innermost. Inside start and end tag handlers, this
+will be the tag of the parent element.
+
+=item current_element
+
+Returns the name of the innermost currently opened element. Inside
+start or end handlers, returns the parent of the element associated
+with those tags.
+
+=item in_element(NAME)
+
+Returns true if NAME is equal to the name of the innermost currently opened
+element. If namespace processing is being used and you want to check
+against a name that may be in a namespace, then use the generate_ns_name
+method to create the NAME argument.
+
+=item within_element(NAME)
+
+Returns the number of times the given name appears in the context list.
+If namespace processing is being used and you want to check
+against a name that may be in a namespace, then use the generate_ns_name
+method to create the NAME argument.
+
+=item depth
+
+Returns the size of the context list.
+
+=item element_index
+
+Returns an integer that is the depth-first visit order of the current
+element. This will be zero outside of the root element. For example,
+this will return 1 when called from the start handler for the root element
+start tag.
+
+=item skip_until(INDEX)
+
+INDEX is an integer that represents an element index. When this method
+is called, all handlers are suspended until the start tag for an element
+that has an index number equal to INDEX is seen. If a start handler has
+been set, then this is the first tag that the start handler will see
+after skip_until has been called.
+
+
+=item position_in_context(LINES)
+
+Returns a string that shows the current parse position. LINES should be
+an integer >= 0 that represents the number of lines on either side of the
+current parse line to place into the returned string.
+
+=item xml_escape(TEXT [, CHAR [, CHAR ...]])
+
+Returns TEXT with markup characters turned into character entities. Any
+additional characters provided as arguments are also turned into character
+references where found in TEXT.
+
+=item parse (SOURCE)
+
+The SOURCE parameter should either be a string containing the whole XML
+document, or it should be an open IO::Handle. Only a single document
+may be parsed for a given instance of XML::Parser::Expat, so this will croak
+if it's been called previously for this instance.
+
+=item parsestring(XML_DOC_STRING)
+
+Parses the given string as an XML document. Only a single document may be
+parsed for a given instance of XML::Parser::Expat, so this will die if either
+parsestring or parsefile has been called for this instance previously.
+
+This method is deprecated in favor of the parse method.
+
+=item parsefile(FILENAME)
+
+Parses the XML document in the given file. Will die if parsestring or
+parsefile has been called previously for this instance.
+
+=item is_defaulted(ATTNAME)
+
+NO LONGER WORKS. To find out if an attribute is defaulted please use
+the specified_attr method.
+
+=item specified_attr
+
+When the start handler receives lists of attributes and values, the
+non-defaulted (i.e. explicitly specified) attributes occur in the list
+first. This method returns the number of specified items in the list.
+So if this number is equal to the length of the list, there were no
+defaulted values. Otherwise the number points to the index of the
+first defaulted attribute name.
+
+=item finish
+
+Unsets all handlers (including internal ones that set context), but expat
+continues parsing to the end of the document or until it finds an error.
+It should finish up a lot faster than with the handlers set.
+
+=item release
+
+There are data structures used by XML::Parser::Expat that have circular
+references. This means that these structures will never be garbage
+collected unless these references are explicitly broken. Calling this
+method breaks those references (and makes the instance unusable.)
+
+Normally, higher level calls handle this for you, but if you are using
+XML::Parser::Expat directly, then it's your responsibility to call it.
+
+=back
+
+=head2 XML::Parser::ContentModel Methods
+
+The element declaration handlers are passed objects of this class as the
+content model of the element declaration. They also represent content
+particles, components of a content model.
+
+When referred to as a string, these objects are automagicly converted to a
+string representation of the model (or content particle).
+
+=over 4
+
+=item isempty
+
+This method returns true if the object is "EMPTY", false otherwise.
+
+=item isany
+
+This method returns true if the object is "ANY", false otherwise.
+
+=item ismixed
+
+This method returns true if the object is "(#PCDATA)" or "(#PCDATA|...)*",
+false otherwise.
+
+=item isname
+
+This method returns if the object is an element name.
+
+=item ischoice
+
+This method returns true if the object is a choice of content particles.
+
+
+=item isseq
+
+This method returns true if the object is a sequence of content particles.
+
+=item quant
+
+This method returns undef or a string representing the quantifier
+('?', '*', '+') associated with the model or particle.
+
+=item children
+
+This method returns undef or (for mixed, choice, and sequence types)
+an array of component content particles. There will always be at least
+one component for choices and sequences, but for a mixed content model
+of pure PCDATA, "(#PCDATA)", then an undef is returned.
+
+=back
+
+=head2 XML::Parser::ExpatNB Methods
+
+The class XML::Parser::ExpatNB is a subclass of XML::Parser::Expat used
+for non-blocking access to the expat library. It does not support the parse,
+parsestring, or parsefile methods, but it does have these additional methods:
+
+=over 4
+
+=item parse_more(DATA)
+
+Feed expat more text to munch on.
+
+=item parse_done
+
+Tell expat that it's gotten the whole document.
+
+=back
+
+=head1 FUNCTIONS
+
+=over 4
+
+=item XML::Parser::Expat::load_encoding(ENCODING)
+
+Load an external encoding. ENCODING is either the name of an encoding or
+the name of a file. The basename is converted to lowercase and a '.enc'
+extension is appended unless there's one already there. Then, unless
+it's an absolute pathname (i.e. begins with '/'), the first file by that
+name discovered in the @Encoding_Path path list is used.
+
+The encoding in the file is loaded and kept in the %Encoding_Table
+table. Earlier encodings of the same name are replaced.
+
+This function is automaticly called by expat when it encounters an encoding
+it doesn't know about. Expat shouldn't call this twice for the same
+encoding name. The only reason users should use this function is to
+explicitly load an encoding not contained in the @Encoding_Path list.
+
+=back
+
+=head1 AUTHORS
+
+Larry Wall <F<larry@wall.org>> wrote version 1.0.
+
+Clark Cooper <F<coopercc@netheaven.com>> picked up support, changed the API
+for this version (2.x), provided documentation, and added some standard
+package features.
+
+=cut
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/LWPExternEnt.pl
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/LWPExternEnt.pl	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/LWPExternEnt.pl	(revision 21851)
@@ -0,0 +1,71 @@
+# LWPExternEnt.pl
+#
+# Copyright (c) 2000 Clark Cooper
+# All rights reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package XML::Parser;
+
+use URI;
+use URI::file;
+use LWP;
+
+##
+## Note that this external entity handler reads the entire entity into
+## memory, so it will choke on huge ones. It would be really nice if
+## LWP::UserAgent optionally returned us an IO::Handle.
+##
+
+sub lwp_ext_ent_handler {
+  my ($xp, $base, $sys) = @_;  # We don't use public id
+
+  my $uri;
+
+  if (defined $base) {
+    # Base may have been set by parsefile, which is agnostic about
+    # whether its a file or URI.
+    my $base_uri = new URI($base);
+    unless (defined $base_uri->scheme) {
+      $base_uri = URI->new_abs($base_uri, URI::file->cwd);
+    }
+
+    $uri = URI->new_abs($sys, $base_uri);
+  }
+  else {
+    $uri = new URI($sys);
+    unless (defined $uri->scheme) {
+      $uri = URI->new_abs($uri, URI::file->cwd);
+    }
+  }
+  
+  my $ua = $xp->{_lwpagent};
+  unless (defined $ua) {
+    $ua = $xp->{_lwpagent} = new LWP::UserAgent();
+    $ua->env_proxy();
+  }
+
+  my $req = new HTTP::Request('GET', $uri);
+
+  my $res = $ua->request($req);
+  if ($res->is_error) {
+    $xp->{ErrorMessage} .= "\n" . $res->status_line . " $uri";
+    return undef;
+  }
+  
+  $xp->{_BaseStack} ||= [];
+  push(@{$xp->{_BaseStack}}, $base);
+
+  $xp->base($uri);
+  
+  return $res->content;
+}  # End lwp_ext_ent_handler
+
+sub lwp_ext_ent_cleanup {
+  my ($xp) = @_;
+
+  $xp->base(pop(@{$xp->{_BaseStack}}));
+}  # End lwp_ext_ent_cleanup
+
+1;
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/Style/Debug.pm
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/Style/Debug.pm	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/Style/Debug.pm	(revision 21851)
@@ -0,0 +1,52 @@
+# $Id: Debug.pm,v 1.1 2003/07/27 16:07:49 matt Exp $
+
+package XML::Parser::Style::Debug;
+use strict;
+
+sub Start {
+  my $expat = shift;
+  my $tag = shift;
+  print STDERR "@{$expat->{Context}} \\\\ (@_)\n";
+}
+
+sub End {
+  my $expat = shift;
+  my $tag = shift;
+  print STDERR "@{$expat->{Context}} //\n";
+}
+
+sub Char {
+  my $expat = shift;
+  my $text = shift;
+  $text =~ s/([\x80-\xff])/sprintf "#x%X;", ord $1/eg;
+  $text =~ s/([\t\n])/sprintf "#%d;", ord $1/eg;
+  print STDERR "@{$expat->{Context}} || $text\n";
+}
+
+sub Proc {
+  my $expat = shift;
+  my $target = shift;
+  my $text = shift;
+  my @foo = @{$expat->{Context}};
+  print STDERR "@foo $target($text)\n";
+}
+
+1;
+__END__
+
+=head1 NAME
+
+XML::Parser::Style::Debug - Debug style for XML::Parser
+
+=head1 SYNOPSIS
+
+  use XML::Parser;
+  my $p = XML::Parser->new(Style => 'Debug');
+  $p->parsefile('foo.xml');
+
+=head1 DESCRIPTION
+
+This just prints out the document in outline form to STDERR. Nothing special is
+returned by parse.
+
+=cut
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/Style/Objects.pm
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/Style/Objects.pm	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/Style/Objects.pm	(revision 21851)
@@ -0,0 +1,78 @@
+# $Id: Objects.pm,v 1.1 2003/08/18 20:20:51 matt Exp $
+
+package XML::Parser::Style::Objects;
+use strict;
+
+sub Init {
+  my $expat = shift;
+  $expat->{Lists} = [];
+  $expat->{Curlist} = $expat->{Tree} = [];
+}
+
+sub Start {
+  my $expat = shift;
+  my $tag = shift;
+  my $newlist = [ ];
+  my $class = "${$expat}{Pkg}::$tag";
+  my $newobj = bless { @_, Kids => $newlist }, $class;
+  push @{ $expat->{Lists} }, $expat->{Curlist};
+  push @{ $expat->{Curlist} }, $newobj;
+  $expat->{Curlist} = $newlist;
+}
+
+sub End {
+  my $expat = shift;
+  my $tag = shift;
+  $expat->{Curlist} = pop @{ $expat->{Lists} };
+}
+
+sub Char {
+  my $expat = shift;
+  my $text = shift;
+  my $class = "${$expat}{Pkg}::Characters";
+  my $clist = $expat->{Curlist};
+  my $pos = $#$clist;
+  
+  if ($pos >= 0 and ref($clist->[$pos]) eq $class) {
+    $clist->[$pos]->{Text} .= $text;
+  } else {
+    push @$clist, bless { Text => $text }, $class;
+  }
+}
+
+sub Final {
+  my $expat = shift;
+  delete $expat->{Curlist};
+  delete $expat->{Lists};
+  $expat->{Tree};
+}
+
+1;
+__END__
+
+=head1 NAME
+
+XML::Parser::Style::Objects
+
+=head1 SYNOPSIS
+
+  use XML::Parser;
+  my $p = XML::Parser->new(Style => 'Objects', Pkg => 'MyNode');
+  my $tree = $p->parsefile('foo.xml');
+
+=head1 DESCRIPTION
+
+This module implements XML::Parser's Objects style parser.
+
+This is similar to the Tree style, except that a hash object is created for
+each element. The corresponding object will be in the class whose name
+is created by appending "::" and the element name to the package set with
+the Pkg option. Non-markup text will be in the ::Characters class. The
+contents of the corresponding object will be in an anonymous array that
+is the value of the Kids property for that object.
+
+=head1 SEE ALSO
+
+L<XML::Parser::Style::Tree>
+
+=cut
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/Style/Stream.pm
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/Style/Stream.pm	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/Style/Stream.pm	(revision 21851)
@@ -0,0 +1,184 @@
+# $Id: Stream.pm,v 1.1 2003/07/27 16:07:49 matt Exp $
+
+package XML::Parser::Style::Stream;
+use strict;
+
+# This style invented by Tim Bray <tbray@textuality.com>
+
+sub Init {
+  no strict 'refs';
+  my $expat = shift;
+  $expat->{Text} = '';
+  my $sub = $expat->{Pkg} ."::StartDocument";
+  &$sub($expat)
+    if defined(&$sub);
+}
+
+sub Start {
+  no strict 'refs';
+  my $expat = shift;
+  my $type = shift;
+  
+  doText($expat);
+  $_ = "<$type";
+  
+  %_ = @_;
+  while (@_) {
+    $_ .= ' ' . shift() . '="' . shift() . '"';
+  }
+  $_ .= '>';
+  
+  my $sub = $expat->{Pkg} . "::StartTag";
+  if (defined(&$sub)) {
+    &$sub($expat, $type);
+  } else {
+    print;
+  }
+}
+
+sub End {
+  no strict 'refs';
+  my $expat = shift;
+  my $type = shift;
+  
+  # Set right context for Text handler
+  push(@{$expat->{Context}}, $type);
+  doText($expat);
+  pop(@{$expat->{Context}});
+  
+  $_ = "</$type>";
+  
+  my $sub = $expat->{Pkg} . "::EndTag";
+  if (defined(&$sub)) {
+    &$sub($expat, $type);
+  } else {
+    print;
+  }
+}
+
+sub Char {
+  my $expat = shift;
+  $expat->{Text} .= shift;
+}
+
+sub Proc {
+  no strict 'refs';
+  my $expat = shift;
+  my $target = shift;
+  my $text = shift;
+  
+  doText($expat);
+
+  $_ = "<?$target $text?>";
+  
+  my $sub = $expat->{Pkg} . "::PI";
+  if (defined(&$sub)) {
+    &$sub($expat, $target, $text);
+  } else {
+    print;
+  }
+}
+
+sub Final {
+  no strict 'refs';
+  my $expat = shift;
+  my $sub = $expat->{Pkg} . "::EndDocument";
+  &$sub($expat)
+    if defined(&$sub);
+}
+
+sub doText {
+  no strict 'refs';
+  my $expat = shift;
+  $_ = $expat->{Text};
+  
+  if (length($_)) {
+    my $sub = $expat->{Pkg} . "::Text";
+    if (defined(&$sub)) {
+      &$sub($expat);
+    } else {
+      print;
+    }
+    
+    $expat->{Text} = '';
+  }
+}
+
+1;
+__END__
+
+=head1 NAME
+
+XML::Parser::Style::Stream - Stream style for XML::Parser
+
+=head1 SYNOPSIS
+
+  use XML::Parser;
+  my $p = XML::Parser->new(Style => 'Stream', Pkg => 'MySubs');
+  $p->parsefile('foo.xml');
+  
+  {
+    package MySubs;
+    
+    sub StartTag {
+      my ($e, $name) = @_;
+      # do something with start tags
+    }
+    
+    sub EndTag {
+      my ($e, $name) = @_;
+      # do something with end tags
+    }
+    
+    sub Characters {
+      my ($e, $data) = @_;
+      # do something with text nodes
+    }
+  }
+
+=head1 DESCRIPTION
+
+This style uses the Pkg option to find subs in a given package to call for each event.
+If none of the subs that this
+style looks for is there, then the effect of parsing with this style is
+to print a canonical copy of the document without comments or declarations.
+All the subs receive as their 1st parameter the Expat instance for the
+document they're parsing.
+
+It looks for the following routines:
+
+=over 4
+
+=item * StartDocument
+
+Called at the start of the parse .
+
+=item * StartTag
+
+Called for every start tag with a second parameter of the element type. The $_
+variable will contain a copy of the tag and the %_ variable will contain
+attribute values supplied for that element.
+
+=item * EndTag
+
+Called for every end tag with a second parameter of the element type. The $_
+variable will contain a copy of the end tag.
+
+=item * Text
+
+Called just before start or end tags with accumulated non-markup text in
+the $_ variable.
+
+=item * PI
+
+Called for processing instructions. The $_ variable will contain a copy of
+the PI and the target and data are sent as 2nd and 3rd parameters
+respectively.
+
+=item * EndDocument
+
+Called at conclusion of the parse.
+
+=back
+
+=cut
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/Style/Subs.pm
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/Style/Subs.pm	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/Style/Subs.pm	(revision 21851)
@@ -0,0 +1,58 @@
+# $Id: Subs.pm,v 1.1 2003/07/27 16:07:49 matt Exp $
+
+package XML::Parser::Style::Subs;
+
+sub Start {
+  no strict 'refs';
+  my $expat = shift;
+  my $tag = shift;
+  my $sub = $expat->{Pkg} . "::$tag";
+  eval { &$sub($expat, $tag, @_) };
+}
+
+sub End {
+  no strict 'refs';
+  my $expat = shift;
+  my $tag = shift;
+  my $sub = $expat->{Pkg} . "::${tag}_";
+  eval { &$sub($expat, $tag) };
+}
+
+1;
+__END__
+
+=head1 NAME
+
+XML::Parser::Style::Subs
+
+=head1 SYNOPSIS
+
+  use XML::Parser;
+  my $p = XML::Parser->new(Style => 'Subs', Pkg => 'MySubs');
+  $p->parsefile('foo.xml');
+  
+  {
+    package MySubs;
+    
+    sub foo {
+      # start of foo tag
+    }
+    
+    sub foo_ {
+      # end of foo tag
+    }
+  }
+
+=head1 DESCRIPTION
+
+Each time an element starts, a sub by that name in the package specified
+by the Pkg option is called with the same parameters that the Start
+handler gets called with.
+
+Each time an element ends, a sub with that name appended with an underscore
+("_"), is called with the same parameters that the End handler gets called
+with.
+
+Nothing special is returned by parse.
+
+=cut
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/Style/Tree.pm
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/Style/Tree.pm	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/XML/Parser/Style/Tree.pm	(revision 21851)
@@ -0,0 +1,90 @@
+# $Id: Tree.pm,v 1.2 2003/07/31 07:54:51 matt Exp $
+
+package XML::Parser::Style::Tree;
+$XML::Parser::Built_In_Styles{Tree} = 1;
+
+sub Init {
+  my $expat = shift;
+  $expat->{Lists} = [];
+  $expat->{Curlist} = $expat->{Tree} = [];
+}
+
+sub Start {
+  my $expat = shift;
+  my $tag = shift;
+  my $newlist = [ { @_ } ];
+  push @{ $expat->{Lists} }, $expat->{Curlist};
+  push @{ $expat->{Curlist} }, $tag => $newlist;
+  $expat->{Curlist} = $newlist;
+}
+
+sub End {
+  my $expat = shift;
+  my $tag = shift;
+  $expat->{Curlist} = pop @{ $expat->{Lists} };
+}
+
+sub Char {
+  my $expat = shift;
+  my $text = shift;
+  my $clist = $expat->{Curlist};
+  my $pos = $#$clist;
+  
+  if ($pos > 0 and $clist->[$pos - 1] eq '0') {
+    $clist->[$pos] .= $text;
+  } else {
+    push @$clist, 0 => $text;
+  }
+}
+
+sub Final {
+  my $expat = shift;
+  delete $expat->{Curlist};
+  delete $expat->{Lists};
+  $expat->{Tree};
+}
+
+1;
+__END__
+
+=head1 NAME
+
+XML::Parser::Style::Tree
+
+=head1 SYNOPSIS
+
+  use XML::Parser;
+  my $p = XML::Parser->new(Style => 'Tree');
+  my $tree = $p->parsefile('foo.xml');
+
+=head1 DESCRIPTION
+
+This module implements XML::Parser's Tree style parser.
+
+When parsing a document, C<parse()> will return a parse tree for the
+document. Each node in the tree
+takes the form of a tag, content pair. Text nodes are represented with
+a pseudo-tag of "0" and the string that is their content. For elements,
+the content is an array reference. The first item in the array is a
+(possibly empty) hash reference containing attributes. The remainder of
+the array is a sequence of tag-content pairs representing the content
+of the element.
+
+So for example the result of parsing:
+
+  <foo><head id="a">Hello <em>there</em></head><bar>Howdy<ref/></bar>do</foo>
+
+would be:
+             Tag   Content
+  ==================================================================
+  [foo, [{}, head, [{id => "a"}, 0, "Hello ",  em, [{}, 0, "there"]],
+              bar, [         {}, 0, "Howdy",  ref, [{}]],
+                0, "do"
+        ]
+  ]
+
+The root document "foo", has 3 children: a "head" element, a "bar"
+element and the text "do". After the empty attribute hash, these are
+represented in it's contents by 3 tag-content pairs.
+
+=cut
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/auto/XML/Parser/.packlist
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/auto/XML/Parser/.packlist	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.6/auto/XML/Parser/.packlist	(revision 21851)
@@ -0,0 +1,36 @@
+/research/kjdon/home/gsdl/xmlparser/XML/Parser.pm
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/Japanese_Encodings.msg
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/README
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/big5.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/euc-kr.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/iso-8859-2.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/iso-8859-3.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/iso-8859-4.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/iso-8859-5.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/iso-8859-7.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/iso-8859-8.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/iso-8859-9.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/windows-1250.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/windows-1252.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/x-euc-jp-jisx0221.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/x-euc-jp-unicode.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/x-sjis-cp932.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/x-sjis-jdk117.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/x-sjis-jisx0221.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/x-sjis-unicode.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Expat.pm
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/LWPExternEnt.pl
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Style/Debug.pm
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Style/Objects.pm
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Style/Stream.pm
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Style/Subs.pm
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Style/Tree.pm
+/research/kjdon/home/gsdl/xmlparser/XML/man/man3/XML::Parser.3
+/research/kjdon/home/gsdl/xmlparser/XML/man/man3/XML::Parser::Expat.3
+/research/kjdon/home/gsdl/xmlparser/XML/man/man3/XML::Parser::Style::Debug.3
+/research/kjdon/home/gsdl/xmlparser/XML/man/man3/XML::Parser::Style::Objects.3
+/research/kjdon/home/gsdl/xmlparser/XML/man/man3/XML::Parser::Style::Stream.3
+/research/kjdon/home/gsdl/xmlparser/XML/man/man3/XML::Parser::Style::Subs.3
+/research/kjdon/home/gsdl/xmlparser/XML/man/man3/XML::Parser::Style::Tree.3
+/research/kjdon/home/gsdl/xmlparser/auto/XML/Parser/Expat/Expat.bs
+/research/kjdon/home/gsdl/xmlparser/auto/XML/Parser/Expat/Expat.so
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser.pm
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser.pm	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser.pm	(revision 21851)
@@ -0,0 +1,840 @@
+# XML::Parser
+#
+# Copyright (c) 1998-2000 Larry Wall and Clark Cooper
+# All rights reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package XML::Parser;
+
+use Carp;
+
+BEGIN {
+  require XML::Parser::Expat;
+  $VERSION = '2.34';
+  die "Parser.pm and Expat.pm versions don't match"
+    unless $VERSION eq $XML::Parser::Expat::VERSION;
+}
+
+use strict;
+
+use vars qw($VERSION $LWP_load_failed);
+
+$LWP_load_failed = 0;
+
+sub new {
+  my ($class, %args) = @_;
+  my $style = $args{Style};
+  
+  my $nonexopt = $args{Non_Expat_Options} ||= {};
+  
+  $nonexopt->{Style}             = 1;
+  $nonexopt->{Non_Expat_Options} = 1;
+  $nonexopt->{Handlers}          = 1;
+  $nonexopt->{_HNDL_TYPES}       = 1;
+  $nonexopt->{NoLWP}             = 1;
+  
+  $args{_HNDL_TYPES} = {%XML::Parser::Expat::Handler_Setters};
+  $args{_HNDL_TYPES}->{Init} = 1;
+  $args{_HNDL_TYPES}->{Final} = 1;
+  
+  $args{Handlers} ||= {};
+  my $handlers = $args{Handlers};
+  
+  if (defined($style)) {
+    my $stylepkg = $style;
+    
+    if ($stylepkg !~ /::/) {
+      $stylepkg = "\u$style";
+      
+      eval {
+          my $fullpkg = 'XML::Parser::Style::' . $stylepkg;
+          my $stylefile = $fullpkg;
+          $stylefile =~ s/::/\//g;
+          require "$stylefile.pm";
+          $stylepkg = $fullpkg;
+      };
+      if ($@) {
+          # fallback to old behaviour
+          $stylepkg = 'XML::Parser::' . $stylepkg;
+      }
+    }
+    
+    my $htype;
+    foreach $htype (keys %{$args{_HNDL_TYPES}}) {
+      # Handlers explicity given override
+      # handlers from the Style package
+      unless (defined($handlers->{$htype})) {
+        
+        # A handler in the style package must either have
+        # exactly the right case as the type name or a
+        # completely lower case version of it.
+        
+        my $hname = "${stylepkg}::$htype";
+        if (defined(&$hname)) {
+          $handlers->{$htype} = \&$hname;
+          next;
+        }
+        
+        $hname = "${stylepkg}::\L$htype";
+        if (defined(&$hname)) {
+          $handlers->{$htype} = \&$hname;
+          next;
+        }
+      }
+    }
+  }
+  
+  unless (defined($handlers->{ExternEnt})
+          or defined ($handlers->{ExternEntFin})) {
+    
+    if ($args{NoLWP} or $LWP_load_failed) {
+      $handlers->{ExternEnt} = \&file_ext_ent_handler;
+      $handlers->{ExternEntFin} = \&file_ext_ent_cleanup;
+    }
+    else {
+      # The following just bootstraps the real LWP external entity
+      # handler
+
+      $handlers->{ExternEnt} = \&initial_ext_ent_handler;
+
+      # No cleanup function available until LWPExternEnt.pl loaded
+    }
+  }
+
+  $args{Pkg} ||= caller;
+  bless \%args, $class;
+}                                # End of new
+
+sub setHandlers {
+  my ($self, @handler_pairs) = @_;
+  
+  croak("Uneven number of arguments to setHandlers method")
+    if (int(@handler_pairs) & 1);
+  
+  my @ret;
+  while (@handler_pairs) {
+    my $type = shift @handler_pairs;
+    my $handler = shift @handler_pairs;
+    unless (defined($self->{_HNDL_TYPES}->{$type})) {
+      my @types = sort keys %{$self->{_HNDL_TYPES}};
+      
+      croak("Unknown Parser handler type: $type\n Valid types: @types");
+    }
+    push(@ret, $type, $self->{Handlers}->{$type});
+    $self->{Handlers}->{$type} = $handler;
+  }
+
+  return @ret;
+}
+
+sub parse_start {
+  my $self = shift;
+  my @expat_options = ();
+
+  my ($key, $val);
+  while (($key, $val) = each %{$self}) {
+    push (@expat_options, $key, $val)
+      unless exists $self->{Non_Expat_Options}->{$key};
+  }
+
+  my %handlers = %{$self->{Handlers}};
+  my $init = delete $handlers{Init};
+  my $final = delete $handlers{Final};
+
+  my $expatnb = new XML::Parser::ExpatNB(@expat_options, @_);
+  $expatnb->setHandlers(%handlers);
+
+  &$init($expatnb)
+    if defined($init);
+
+  $expatnb->{_State_} = 1;
+
+  $expatnb->{FinalHandler} = $final
+    if defined($final);
+
+  return $expatnb;
+}
+
+sub parse {
+  my $self = shift;
+  my $arg  = shift;
+  my @expat_options = ();
+  my ($key, $val);
+  while (($key, $val) = each %{$self}) {
+    push(@expat_options, $key, $val)
+      unless exists $self->{Non_Expat_Options}->{$key};
+  }
+  
+  my $expat = new XML::Parser::Expat(@expat_options, @_);
+  my %handlers = %{$self->{Handlers}};
+  my $init = delete $handlers{Init};
+  my $final = delete $handlers{Final};
+  
+  $expat->setHandlers(%handlers);
+  
+  if ($self->{Base}) {
+    $expat->base($self->{Base});
+  }
+
+  &$init($expat)
+    if defined($init);
+  
+  my @result = ();
+  my $result;
+  eval {
+    $result = $expat->parse($arg);
+  };
+  my $err = $@;
+  if ($err) {
+    $expat->release;
+    die $err;
+  }
+  
+  if ($result and defined($final)) {
+    if (wantarray) {
+      @result = &$final($expat);
+    }
+    else {
+      $result = &$final($expat);
+    }
+  }
+  
+  $expat->release;
+
+  return unless defined wantarray;
+  return wantarray ? @result : $result;
+}
+
+sub parsestring {
+  my $self = shift;
+  $self->parse(@_);
+}
+
+sub parsefile {
+  my $self = shift;
+  my $file = shift;
+  local(*FILE);
+  open(FILE, $file) or  croak "Couldn't open $file:\n$!";
+  binmode(FILE);
+  my @ret;
+  my $ret;
+
+  $self->{Base} = $file;
+
+  if (wantarray) {
+    eval {
+      @ret = $self->parse(*FILE, @_);
+    };
+  }
+  else {
+    eval {
+      $ret = $self->parse(*FILE, @_);
+    };
+  }
+  my $err = $@;
+  close(FILE);
+  die $err if $err;
+  
+  return unless defined wantarray;
+  return wantarray ? @ret : $ret;
+}
+
+sub initial_ext_ent_handler {
+  # This just bootstraps in the real lwp_ext_ent_handler which
+  # also loads the URI and LWP modules.
+
+  unless ($LWP_load_failed) {
+    local($^W) = 0;
+
+    my $stat =
+      eval {
+        require('XML/Parser/LWPExternEnt.pl');
+      };
+      
+    if ($stat) {
+      $_[0]->setHandlers(ExternEnt    => \&lwp_ext_ent_handler,
+                         ExternEntFin => \&lwp_ext_ent_cleanup);
+                       
+      goto &lwp_ext_ent_handler;
+    }
+
+    # Failed to load lwp handler, act as if NoLWP
+
+    $LWP_load_failed = 1;
+
+    my $cmsg = "Couldn't load LWP based external entity handler\n";
+    $cmsg .= "Switching to file-based external entity handler\n";
+    $cmsg .= " (To avoid this message, use NoLWP option to XML::Parser)\n";
+    warn($cmsg);
+  }
+
+  $_[0]->setHandlers(ExternEnt    => \&file_ext_ent_handler,
+                     ExternEntFin => \&file_ext_ent_cleanup);
+  goto &file_ext_ent_handler;
+
+}
+
+sub file_ext_ent_handler {
+  my ($xp, $base, $path) = @_;
+
+  # Prepend base only for relative paths
+
+  if (defined($base)
+      and not ($path =~ m!^(?:[\\/]|\w+:)!))
+    {
+      my $newpath = $base;
+      $newpath =~ s![^\\/:]*$!$path!;
+      $path = $newpath;
+    }
+
+  if ($path =~ /^\s*[|>+]/
+      or $path =~ /\|\s*$/) {
+    $xp->{ErrorMessage}
+        .= "System ID ($path) contains Perl IO control characters";
+    return undef;
+  }
+
+  require IO::File;
+  my $fh = new IO::File($path);
+  unless (defined $fh) {
+    $xp->{ErrorMessage}
+      .= "Failed to open $path:\n$!";
+    return undef;
+  }
+
+  $xp->{_BaseStack} ||= [];
+  $xp->{_FhStack} ||= [];
+
+  push(@{$xp->{_BaseStack}}, $base);
+  push(@{$xp->{_FhStack}}, $fh);
+
+  $xp->base($path);
+  
+  return $fh;
+}
+
+sub file_ext_ent_cleanup {
+  my ($xp) = @_;
+
+  my $fh = pop(@{$xp->{_FhStack}});
+  $fh->close;
+
+  my $base = pop(@{$xp->{_BaseStack}});
+  $xp->base($base);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+XML::Parser - A perl module for parsing XML documents
+
+=head1 SYNOPSIS
+
+  use XML::Parser;
+  
+  $p1 = new XML::Parser(Style => 'Debug');
+  $p1->parsefile('REC-xml-19980210.xml');
+  $p1->parse('<foo id="me">Hello World</foo>');
+
+  # Alternative
+  $p2 = new XML::Parser(Handlers => {Start => \&handle_start,
+                                     End   => \&handle_end,
+                                     Char  => \&handle_char});
+  $p2->parse($socket);
+
+  # Another alternative
+  $p3 = new XML::Parser(ErrorContext => 2);
+
+  $p3->setHandlers(Char    => \&text,
+                   Default => \&other);
+
+  open(FOO, 'xmlgenerator |');
+  $p3->parse(*FOO, ProtocolEncoding => 'ISO-8859-1');
+  close(FOO);
+
+  $p3->parsefile('junk.xml', ErrorContext => 3);
+
+=begin man
+.ds PI PI
+
+=end man
+
+=head1 DESCRIPTION
+
+This module provides ways to parse XML documents. It is built on top of
+L<XML::Parser::Expat>, which is a lower level interface to James Clark's
+expat library. Each call to one of the parsing methods creates a new
+instance of XML::Parser::Expat which is then used to parse the document.
+Expat options may be provided when the XML::Parser object is created.
+These options are then passed on to the Expat object on each parse call.
+They can also be given as extra arguments to the parse methods, in which
+case they override options given at XML::Parser creation time.
+
+The behavior of the parser is controlled either by C<L</Style>> and/or
+C<L</Handlers>> options, or by L</setHandlers> method. These all provide
+mechanisms for XML::Parser to set the handlers needed by XML::Parser::Expat.
+If neither C<Style> nor C<Handlers> are specified, then parsing just
+checks the document for being well-formed.
+
+When underlying handlers get called, they receive as their first parameter
+the I<Expat> object, not the Parser object.
+
+=head1 METHODS
+
+=over 4
+
+=item new
+
+This is a class method, the constructor for XML::Parser. Options are passed
+as keyword value pairs. Recognized options are:
+
+=over 4
+
+=item * Style
+
+This option provides an easy way to create a given style of parser. The
+built in styles are: L<"Debug">, L<"Subs">, L<"Tree">, L<"Objects">,
+and L<"Stream">. These are all defined in separate packages under
+C<XML::Parser::Style::*>, and you can find further documentation for
+each style both below, and in those packages.
+
+Custom styles can be provided by giving a full package name containing
+at least one '::'. This package should then have subs defined for each
+handler it wishes to have installed. See L<"STYLES"> below
+for a discussion of each built in style.
+
+=item * Handlers
+
+When provided, this option should be an anonymous hash containing as
+keys the type of handler and as values a sub reference to handle that
+type of event. All the handlers get passed as their 1st parameter the
+instance of expat that is parsing the document. Further details on
+handlers can be found in L<"HANDLERS">. Any handler set here
+overrides the corresponding handler set with the Style option.
+
+=item * Pkg
+
+Some styles will refer to subs defined in this package. If not provided,
+it defaults to the package which called the constructor.
+
+=item * ErrorContext
+
+This is an Expat option. When this option is defined, errors are reported
+in context. The value should be the number of lines to show on either side
+of the line in which the error occurred.
+
+=item * ProtocolEncoding
+
+This is an Expat option. This sets the protocol encoding name. It defaults
+to none. The built-in encodings are: C<UTF-8>, C<ISO-8859-1>, C<UTF-16>, and
+C<US-ASCII>. Other encodings may be used if they have encoding maps in one
+of the directories in the @Encoding_Path list. Check L<"ENCODINGS"> for
+more information on encoding maps. Setting the protocol encoding overrides
+any encoding in the XML declaration.
+
+=item * Namespaces
+
+This is an Expat option. If this is set to a true value, then namespace
+processing is done during the parse. See L<XML::Parser::Expat/"Namespaces">
+for further discussion of namespace processing.
+
+=item * NoExpand
+
+This is an Expat option. Normally, the parser will try to expand references
+to entities defined in the internal subset. If this option is set to a true
+value, and a default handler is also set, then the default handler will be
+called when an entity reference is seen in text. This has no effect if a
+default handler has not been registered, and it has no effect on the expansion
+of entity references inside attribute values.
+
+=item * Stream_Delimiter
+
+This is an Expat option. It takes a string value. When this string is found
+alone on a line while parsing from a stream, then the parse is ended as if it
+saw an end of file. The intended use is with a stream of xml documents in a
+MIME multipart format. The string should not contain a trailing newline.
+
+=item * ParseParamEnt
+
+This is an Expat option. Unless standalone is set to "yes" in the XML
+declaration, setting this to a true value allows the external DTD to be read,
+and parameter entities to be parsed and expanded.
+
+=item * NoLWP
+
+This option has no effect if the ExternEnt or ExternEntFin handlers are
+directly set. Otherwise, if true, it forces the use of a file based external
+entity handler.
+
+=item * Non-Expat-Options
+
+If provided, this should be an anonymous hash whose keys are options that
+shouldn't be passed to Expat. This should only be of concern to those
+subclassing XML::Parser.
+
+=back
+
+=item  setHandlers(TYPE, HANDLER [, TYPE, HANDLER [...]])
+
+This method registers handlers for various parser events. It overrides any
+previous handlers registered through the Style or Handler options or through
+earlier calls to setHandlers. By providing a false or undefined value as
+the handler, the existing handler can be unset.
+
+This method returns a list of type, handler pairs corresponding to the
+input. The handlers returned are the ones that were in effect prior to
+the call.
+
+See a description of the handler types in L<"HANDLERS">.
+
+=item parse(SOURCE [, OPT => OPT_VALUE [...]])
+
+The SOURCE parameter should either be a string containing the whole XML
+document, or it should be an open IO::Handle. Constructor options to
+XML::Parser::Expat given as keyword-value pairs may follow the SOURCE
+parameter. These override, for this call, any options or attributes passed
+through from the XML::Parser instance.
+
+A die call is thrown if a parse error occurs. Otherwise it will return 1
+or whatever is returned from the B<Final> handler, if one is installed.
+In other words, what parse may return depends on the style.
+
+=item parsestring
+
+This is just an alias for parse for backwards compatibility.
+
+=item parsefile(FILE [, OPT => OPT_VALUE [...]])
+
+Open FILE for reading, then call parse with the open handle. The file
+is closed no matter how parse returns. Returns what parse returns.
+
+=item parse_start([ OPT => OPT_VALUE [...]])
+
+Create and return a new instance of XML::Parser::ExpatNB. Constructor
+options may be provided. If an init handler has been provided, it is
+called before returning the ExpatNB object. Documents are parsed by
+making incremental calls to the parse_more method of this object, which
+takes a string. A single call to the parse_done method of this object,
+which takes no arguments, indicates that the document is finished.
+
+If there is a final handler installed, it is executed by the parse_done
+method before returning and the parse_done method returns whatever is
+returned by the final handler.
+
+=back
+
+=head1 HANDLERS
+
+Expat is an event based parser. As the parser recognizes parts of the
+document (say the start or end tag for an XML element), then any handlers
+registered for that type of an event are called with suitable parameters.
+All handlers receive an instance of XML::Parser::Expat as their first
+argument. See L<XML::Parser::Expat/"METHODS"> for a discussion of the
+methods that can be called on this object.
+
+=head2 Init                (Expat)
+
+This is called just before the parsing of the document starts.
+
+=head2 Final                (Expat)
+
+This is called just after parsing has finished, but only if no errors
+occurred during the parse. Parse returns what this returns.
+
+=head2 Start                (Expat, Element [, Attr, Val [,...]])
+
+This event is generated when an XML start tag is recognized. Element is the
+name of the XML element type that is opened with the start tag. The Attr &
+Val pairs are generated for each attribute in the start tag.
+
+=head2 End                (Expat, Element)
+
+This event is generated when an XML end tag is recognized. Note that
+an XML empty tag (<foo/>) generates both a start and an end event.
+
+=head2 Char                (Expat, String)
+
+This event is generated when non-markup is recognized. The non-markup
+sequence of characters is in String. A single non-markup sequence of
+characters may generate multiple calls to this handler. Whatever the
+encoding of the string in the original document, this is given to the
+handler in UTF-8.
+
+=head2 Proc                (Expat, Target, Data)
+
+This event is generated when a processing instruction is recognized.
+
+=head2 Comment                (Expat, Data)
+
+This event is generated when a comment is recognized.
+
+=head2 CdataStart        (Expat)
+
+This is called at the start of a CDATA section.
+
+=head2 CdataEnd                (Expat)
+
+This is called at the end of a CDATA section.
+
+=head2 Default                (Expat, String)
+
+This is called for any characters that don't have a registered handler.
+This includes both characters that are part of markup for which no
+events are generated (markup declarations) and characters that
+could generate events, but for which no handler has been registered.
+
+Whatever the encoding in the original document, the string is returned to
+the handler in UTF-8.
+
+=head2 Unparsed                (Expat, Entity, Base, Sysid, Pubid, Notation)
+
+This is called for a declaration of an unparsed entity. Entity is the name
+of the entity. Base is the base to be used for resolving a relative URI.
+Sysid is the system id. Pubid is the public id. Notation is the notation
+name. Base and Pubid may be undefined.
+
+=head2 Notation                (Expat, Notation, Base, Sysid, Pubid)
+
+This is called for a declaration of notation. Notation is the notation name.
+Base is the base to be used for resolving a relative URI. Sysid is the system
+id. Pubid is the public id. Base, Sysid, and Pubid may all be undefined.
+
+=head2 ExternEnt        (Expat, Base, Sysid, Pubid)
+
+This is called when an external entity is referenced. Base is the base to be
+used for resolving a relative URI. Sysid is the system id. Pubid is the public
+id. Base, and Pubid may be undefined.
+
+This handler should either return a string, which represents the contents of
+the external entity, or return an open filehandle that can be read to obtain
+the contents of the external entity, or return undef, which indicates the
+external entity couldn't be found and will generate a parse error.
+
+If an open filehandle is returned, it must be returned as either a glob
+(*FOO) or as a reference to a glob (e.g. an instance of IO::Handle).
+
+A default handler is installed for this event. The default handler is
+XML::Parser::lwp_ext_ent_handler unless the NoLWP option was provided with
+a true value, otherwise XML::Parser::file_ext_ent_handler is the default
+handler for external entities. Even without the NoLWP option, if the
+URI or LWP modules are missing, the file based handler ends up being used
+after giving a warning on the first external entity reference.
+
+The LWP external entity handler will use proxies defined in the environment
+(http_proxy, ftp_proxy, etc.).
+
+Please note that the LWP external entity handler reads the entire
+entity into a string and returns it, where as the file handler opens a
+filehandle.
+
+Also note that the file external entity handler will likely choke on
+absolute URIs or file names that don't fit the conventions of the local
+operating system.
+
+The expat base method can be used to set a basename for
+relative pathnames. If no basename is given, or if the basename is itself
+a relative name, then it is relative to the current working directory.
+
+=head2 ExternEntFin        (Expat)
+
+This is called after parsing an external entity. It's not called unless
+an ExternEnt handler is also set. There is a default handler installed
+that pairs with the default ExternEnt handler.
+
+If you're going to install your own ExternEnt handler, then you should
+set (or unset) this handler too.
+
+=head2 Entity                (Expat, Name, Val, Sysid, Pubid, Ndata, IsParam)
+
+This is called when an entity is declared. For internal entities, the Val
+parameter will contain the value and the remaining three parameters will be
+undefined. For external entities, the Val parameter will be undefined, the
+Sysid parameter will have the system id, the Pubid parameter will have the
+public id if it was provided (it will be undefined otherwise), the Ndata
+parameter will contain the notation for unparsed entities. If this is a
+parameter entity declaration, then the IsParam parameter is true.
+
+Note that this handler and the Unparsed handler above overlap. If both are
+set, then this handler will not be called for unparsed entities.
+
+=head2 Element                (Expat, Name, Model)
+
+The element handler is called when an element declaration is found. Name
+is the element name, and Model is the content model as an XML::Parser::Content
+object. See L<XML::Parser::Expat/"XML::Parser::ContentModel Methods">
+for methods available for this class.
+
+=head2 Attlist                (Expat, Elname, Attname, Type, Default, Fixed)
+
+This handler is called for each attribute in an ATTLIST declaration.
+So an ATTLIST declaration that has multiple attributes will generate multiple
+calls to this handler. The Elname parameter is the name of the element with
+which the attribute is being associated. The Attname parameter is the name
+of the attribute. Type is the attribute type, given as a string. Default is
+the default value, which will either be "#REQUIRED", "#IMPLIED" or a quoted
+string (i.e. the returned string will begin and end with a quote character).
+If Fixed is true, then this is a fixed attribute.
+
+=head2 Doctype                (Expat, Name, Sysid, Pubid, Internal)
+
+This handler is called for DOCTYPE declarations. Name is the document type
+name. Sysid is the system id of the document type, if it was provided,
+otherwise it's undefined. Pubid is the public id of the document type,
+which will be undefined if no public id was given. Internal is the internal
+subset, given as a string. If there was no internal subset, it will be
+undefined. Internal will contain all whitespace, comments, processing
+instructions, and declarations seen in the internal subset. The declarations
+will be there whether or not they have been processed by another handler
+(except for unparsed entities processed by the Unparsed handler). However,
+comments and processing instructions will not appear if they've been processed
+by their respective handlers.
+
+=head2 * DoctypeFin                (Parser)
+
+This handler is called after parsing of the DOCTYPE declaration has finished,
+including any internal or external DTD declarations.
+
+=head2 XMLDecl                (Expat, Version, Encoding, Standalone)
+
+This handler is called for xml declarations. Version is a string containg
+the version. Encoding is either undefined or contains an encoding string.
+Standalone will be either true, false, or undefined if the standalone attribute
+is yes, no, or not made respectively.
+
+=head1 STYLES
+
+=head2 Debug
+
+This just prints out the document in outline form. Nothing special is
+returned by parse.
+
+=head2 Subs
+
+Each time an element starts, a sub by that name in the package specified
+by the Pkg option is called with the same parameters that the Start
+handler gets called with.
+
+Each time an element ends, a sub with that name appended with an underscore
+("_"), is called with the same parameters that the End handler gets called
+with.
+
+Nothing special is returned by parse.
+
+=head2 Tree
+
+Parse will return a parse tree for the document. Each node in the tree
+takes the form of a tag, content pair. Text nodes are represented with
+a pseudo-tag of "0" and the string that is their content. For elements,
+the content is an array reference. The first item in the array is a
+(possibly empty) hash reference containing attributes. The remainder of
+the array is a sequence of tag-content pairs representing the content
+of the element.
+
+So for example the result of parsing:
+
+  <foo><head id="a">Hello <em>there</em></head><bar>Howdy<ref/></bar>do</foo>
+
+would be:
+
+             Tag   Content
+  ==================================================================
+  [foo, [{}, head, [{id => "a"}, 0, "Hello ",  em, [{}, 0, "there"]],
+              bar, [         {}, 0, "Howdy",  ref, [{}]],
+                0, "do"
+        ]
+  ]
+
+The root document "foo", has 3 children: a "head" element, a "bar"
+element and the text "do". After the empty attribute hash, these are
+represented in it's contents by 3 tag-content pairs.
+
+=head2 Objects
+
+This is similar to the Tree style, except that a hash object is created for
+each element. The corresponding object will be in the class whose name
+is created by appending "::" and the element name to the package set with
+the Pkg option. Non-markup text will be in the ::Characters class. The
+contents of the corresponding object will be in an anonymous array that
+is the value of the Kids property for that object.
+
+=head2 Stream
+
+This style also uses the Pkg package. If none of the subs that this
+style looks for is there, then the effect of parsing with this style is
+to print a canonical copy of the document without comments or declarations.
+All the subs receive as their 1st parameter the Expat instance for the
+document they're parsing.
+
+It looks for the following routines:
+
+=over 4
+
+=item * StartDocument
+
+Called at the start of the parse .
+
+=item * StartTag
+
+Called for every start tag with a second parameter of the element type. The $_
+variable will contain a copy of the tag and the %_ variable will contain
+attribute values supplied for that element.
+
+=item * EndTag
+
+Called for every end tag with a second parameter of the element type. The $_
+variable will contain a copy of the end tag.
+
+=item * Text
+
+Called just before start or end tags with accumulated non-markup text in
+the $_ variable.
+
+=item * PI
+
+Called for processing instructions. The $_ variable will contain a copy of
+the PI and the target and data are sent as 2nd and 3rd parameters
+respectively.
+
+=item * EndDocument
+
+Called at conclusion of the parse.
+
+=back
+
+=head1 ENCODINGS
+
+XML documents may be encoded in character sets other than Unicode as
+long as they may be mapped into the Unicode character set. Expat has
+further restrictions on encodings. Read the xmlparse.h header file in
+the expat distribution to see details on these restrictions.
+
+Expat has built-in encodings for: C<UTF-8>, C<ISO-8859-1>, C<UTF-16>, and
+C<US-ASCII>. Encodings are set either through the XML declaration
+encoding attribute or through the ProtocolEncoding option to XML::Parser
+or XML::Parser::Expat.
+
+For encodings other than the built-ins, expat calls the function
+load_encoding in the Expat package with the encoding name. This function
+looks for a file in the path list @XML::Parser::Expat::Encoding_Path, that
+matches the lower-cased name with a '.enc' extension. The first one it
+finds, it loads.
+
+If you wish to build your own encoding maps, check out the XML::Encoding
+module from CPAN.
+
+=head1 AUTHORS
+
+Larry Wall <F<larry@wall.org>> wrote version 1.0.
+
+Clark Cooper <F<coopercc@netheaven.com>> picked up support, changed the API
+for this version (2.x), provided documentation,
+and added some standard package features.
+
+Matt Sergeant <F<matt@sergeant.org>> is now maintaining XML::Parser
+
+=cut
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/Encodings/Japanese_Encodings.msg
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/Encodings/Japanese_Encodings.msg	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/Encodings/Japanese_Encodings.msg	(revision 21851)
@@ -0,0 +1,117 @@
+Mapping files for Japanese encodings
+
+1998 12/25
+
+Fuji Xerox Information Systems
+MURATA Makoto
+
+1.  Overview
+
+This version of XML::Parser and XML::Encoding does not come with map files for
+the charset "Shift_JIS" and the charset "euc-jp".  Unfortunately, each of these 
+charsets has more than one mapping.  None of these mappings are
+considered as authoritative.
+
+Therefore, we have come to believe that it is dangerous to provide map files
+for these charsets.  Rather, we introduce several private charsets and map
+files for these private charsets.  If IANA, Unicode Consoritum, and JIS
+eventually reach a consensus, we will be able to provide map files for
+"Shift_JIS" and "euc-jp".
+
+2. Different mappings from existing charsets to Unicode
+
+1) Different mappings in JIS X0221 and Unicode
+
+The mapping between JIS X0208:1990 and Unicode 1.1 and the mapping
+between JIS X0212:1990 and Unicode 1.1 are published from Unicode
+consortium.  They are available at 
+ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS/JIS0208.TXT and 
+ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS/JIS0212.TXT, 
+respectively.)  These mapping files have a note as below:
+
+#   The kanji mappings are a normative part of ISO/IEC 10646.  The
+#       non-kanji mappings are provisional, pending definition of
+#       official mappings by Japanese standards bodies.
+
+Unfortunately, the non-kanji mappings in the Japanese standard for ISO 10646/1,
+namely JIS X 0221:1995, is different from the Unicode Consortium mapping since
+0x213D of JIS X 0208 is mapped to U+2014 (em dash) rather than U+2015
+(horizontal bar).  Furthermore, JIS X 0221 clearly says that the mapping is
+informational and non-normative.  As a result, some companies (e.g., Microsoft and
+Apple) have introduced slightly different mappings.  Therefore, neither the
+Unicode consortium mapping nor the JIS X 0221 mapping are considered as
+authoritative.
+
+2) Shift-JIS
+
+This charset is especially problematic, since its definition has been unclear
+since its inception.
+
+The current registration of the charset "Shift_JIS" is as below:
+
+>Name: Shift_JIS  (preferred MIME name)
+>MIBenum: 17
+>Source: A Microsoft code that extends csHalfWidthKatakana to include 
+>       kanji by adding a second byte when the value of the first 
+>       byte is in the ranges 81-9F or E0-EF.
+>Alias: MS_Kanji 
+>Alias: csShiftJIS
+
+First, this does not reference to the mapping "Shift-JIS to Unicode" 
+published by the Unicode consortium (available at
+ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS/SHIFTJIS.TXT).
+
+Second, "kanji" in this registration can be interepreted in different ways.
+Does this "kanji" reference to JIS X0208:1978, JIS X0208:1983, or JIS
+X0208:1990(== JIS X0208:1997)?  These three standards are *incompatible* with
+each other.  Moreover, we can even argue that "kanji" refers to JIS X0212 or
+ideographic characters in other countries.
+
+Third, each company has extended Shift JIS. For example, Microsoft introduced
+OEM extensions (NEC extensionsand IBM extensions).
+
+Forth, Shift JIS uses JIS X0201, which is almost upper-compatible with US-ASCII
+but is not quite.  5C and 7E of JIS X 0201 are different from backslash and 
+tilde, respectively.  However, many programming languages (e.g., Java) 
+ignore this difference and assumes that 5C and 7E of Shift JIS are backslash 
+and tilde.
+
+
+3.  Proposed charsets and mappings
+
+As a tentative solution, we introduce two private charsets for EUC-JP and four
+priviate charsets for Shift JIS.
+
+1) EUC-JP
+
+We have two charsets, namely "x-eucjp-unicode" and "x-eucjp-jisx0221".  Their 
+difference is only one code point.  The mapping for the former is based 
+on the Unicode Consortium mapping, while the latter is based on the JIS X0221 
+mapping.
+
+2) Shift JIS
+
+We have four charsets, namely x-sjis-unicode, x-sjis-jisx0221, 
+x-sjis-jdk117, and x-sjis-cp932.
+
+The mapping for the charset x-sjis-unicode is the one published by the Unicode
+consortium.  The mapping for x-sjis-jisx0221 is almost equivalent to
+x-sjis-unicode, but 0x213D of JIS X 0208 is mapped to U+2014 (em dash) rather
+than U+2015.  The charset x-sjis-jdk117 is again almost equivalent to
+x-sjis-unicode, but 0x5C and 0x7E of JIS X0201 are mapped to backslash and
+tilde.
+
+The charset x-sjis-cp932 is used by Microsoft Windows, and its mapping is
+published from the Unicode Consortium (available at:
+ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.txt).  The
+coded character set for this charset includes NEC-extensions and
+IBM-extensions.  0x5C and 0x7E of JIS X0201 are mapped to backslash and tilde;
+0x213D is mapped to U+2015; and 0x2140, 0x2141, 0x2142, and 0x215E of JIS X
+0208 are mapped to compatibility characters.
+
+Makoto
+ 
+Fuji Xerox Information Systems
+ 
+Tel: +81-44-812-7230   Fax: +81-44-812-7231
+E-mail: murata@apsdc.ksp.fujixerox.co.jp
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/Encodings/README
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/Encodings/README	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/Encodings/README	(revision 21851)
@@ -0,0 +1,51 @@
+This directory contains binary encoding maps for some selected encodings.
+If they are placed in a directoy listed in @XML::Parser::Expat::Encoding_Path,
+then they are automaticly loaded by the XML::Parser::Expat::load_encoding
+function as needed. Otherwise you may load what you need directly by
+explicity calling this function.
+
+These maps were generated by a perl script that comes with the module
+XML::Encoding, compile_encoding, from XML formatted encoding maps that
+are distributed with that module. These XML encoding maps were generated
+in turn with a different script, domap, from mapping information contained
+on the Unicode version 2.0 CD-ROM. This CD-ROM comes with the Unicode
+Standard reference manual and can be ordered from the Unicode Consortium
+at http://www.unicode.org. The identical information is available on the
+internet at ftp://ftp.unicode.org/Public/MAPPINGS.
+
+See the encoding.h header in the Expat sub-directory for a description of
+the structure of these files.
+
+Clark Cooper
+December 12, 1998
+
+================================================================
+
+Contributed maps
+
+This distribution contains four contributed encodings from MURATA Makoto
+<murata@apsdc.ksp.fujixerox.co.jp> that are variations on the encoding
+commonly called Shift_JIS:
+
+x-sjis-cp932.enc
+x-sjis-jdk117.enc
+x-sjis-jisx0221.enc
+x-sjis-unicode.enc	(This is the same encoding as the shift_jis.enc that
+			 was distributed with this module in version 2.17)
+
+Please read his message (Japanese_Encodings.msg) about why these are here
+and why I've removed the shift_jis.enc encoding.
+
+We also have two contributed encodings that are variations of the EUC-JP
+encoding from Yoshida Masato <yoshidam@inse.co.jp>:
+
+x-euc-jp-jisx0221.enc
+x-euc-jp-unicode.enc
+
+The comments that MURATA Makoto made in his message apply to these
+encodings too.
+
+KangChan Lee <dolphin@comeng.chungnam.ac.kr> supplied the euc-kr encoding.
+
+Clark Cooper
+December 26, 1998
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/Expat.pm
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/Expat.pm	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/Expat.pm	(revision 21851)
@@ -0,0 +1,1230 @@
+package XML::Parser::Expat;
+
+require 5.004;
+
+use strict;
+use vars qw($VERSION @ISA %Handler_Setters %Encoding_Table @Encoding_Path
+            $have_File_Spec);
+use Carp;
+
+require DynaLoader;
+
+@ISA = qw(DynaLoader);
+$VERSION = "2.34" ;
+
+$have_File_Spec = $INC{'File/Spec.pm'} || do 'File/Spec.pm';
+
+%Encoding_Table = ();
+if ($have_File_Spec) {
+  @Encoding_Path = (grep(-d $_,
+                         map(File::Spec->catdir($_, qw(XML Parser Encodings)),
+                             @INC)),
+                    File::Spec->curdir);
+}
+else {
+  @Encoding_Path = (grep(-d $_, map($_ . '/XML/Parser/Encodings', @INC)), '.');
+}
+  
+
+bootstrap XML::Parser::Expat $VERSION;
+
+%Handler_Setters = (
+                    Start => \&SetStartElementHandler,
+                    End   => \&SetEndElementHandler,
+                    Char  => \&SetCharacterDataHandler,
+                    Proc  => \&SetProcessingInstructionHandler,
+                    Comment => \&SetCommentHandler,
+                    CdataStart => \&SetStartCdataHandler,
+                    CdataEnd   => \&SetEndCdataHandler,
+                    Default => \&SetDefaultHandler,
+                    Unparsed => \&SetUnparsedEntityDeclHandler,
+                    Notation => \&SetNotationDeclHandler,
+                    ExternEnt => \&SetExternalEntityRefHandler,
+                    ExternEntFin => \&SetExtEntFinishHandler,
+                    Entity => \&SetEntityDeclHandler,
+                    Element => \&SetElementDeclHandler,
+                    Attlist => \&SetAttListDeclHandler,
+                    Doctype => \&SetDoctypeHandler,
+                    DoctypeFin => \&SetEndDoctypeHandler,
+                    XMLDecl => \&SetXMLDeclHandler
+                    );
+
+sub new {
+  my ($class, %args) = @_;
+  my $self = bless \%args, $_[0];
+  $args{_State_} = 0;
+  $args{Context} = [];
+  $args{Namespaces} ||= 0;
+  $args{ErrorMessage} ||= '';
+  if ($args{Namespaces}) {
+    $args{Namespace_Table} = {};
+    $args{Namespace_List} = [undef];
+    $args{Prefix_Table} = {};
+    $args{New_Prefixes} = [];
+  }
+  $args{_Setters} = \%Handler_Setters;
+  $args{Parser} = ParserCreate($self, $args{ProtocolEncoding},
+                               $args{Namespaces});
+  $self;
+}
+
+sub load_encoding {
+  my ($file) = @_;
+
+  $file =~ s!([^/]+)$!\L$1\E!;
+  $file .= '.enc' unless $file =~ /\.enc$/;
+  unless ($file =~ m!^/!) {
+    foreach (@Encoding_Path) {
+      my $tmp = ($have_File_Spec
+                 ? File::Spec->catfile($_, $file)
+                 : "$_/$file");
+      if (-e $tmp) {
+        $file = $tmp;
+        last;
+      }
+    }
+  }
+
+  local(*ENC);
+  open(ENC, $file) or croak("Couldn't open encmap $file:\n$!\n");
+  binmode(ENC);
+  my $data;
+  my $br = sysread(ENC, $data, -s $file);
+  croak("Trouble reading $file:\n$!\n")
+    unless defined($br);
+  close(ENC);
+
+  my $name = LoadEncoding($data, $br);
+  croak("$file isn't an encmap file")
+    unless defined($name);
+
+  $name;
+}  # End load_encoding
+
+sub setHandlers {
+  my ($self, @handler_pairs) = @_;
+
+  croak("Uneven number of arguments to setHandlers method")
+    if (int(@handler_pairs) & 1);
+
+  my @ret;
+
+  while (@handler_pairs) {
+    my $type = shift @handler_pairs;
+    my $handler = shift @handler_pairs;
+    croak "Handler for $type not a Code ref"
+      unless (! defined($handler) or ! $handler or ref($handler) eq 'CODE');
+
+    my $hndl = $self->{_Setters}->{$type};
+
+    unless (defined($hndl)) {
+      my @types = sort keys %{$self->{_Setters}};
+      croak("Unknown Expat handler type: $type\n Valid types: @types");
+    }
+
+    my $old = &$hndl($self->{Parser}, $handler);
+    push (@ret, $type, $old);
+  }
+
+  return @ret;
+}
+
+sub xpcroak
+ {
+  my ($self, $message) = @_;
+
+  my $eclines = $self->{ErrorContext};
+  my $line = GetCurrentLineNumber($_[0]->{Parser});
+  $message .= " at line $line";
+  $message .= ":\n" . $self->position_in_context($eclines)
+    if defined($eclines);
+  croak $message;
+}
+
+sub xpcarp {
+  my ($self, $message) = @_;
+
+  my $eclines = $self->{ErrorContext};
+  my $line = GetCurrentLineNumber($_[0]->{Parser});
+  $message .= " at line $line";
+  $message .= ":\n" . $self->position_in_context($eclines)
+    if defined($eclines);
+  carp $message;
+}
+
+sub default_current {
+  my $self = shift;
+  if ($self->{_State_} == 1) {
+    return DefaultCurrent($self->{Parser});
+  }
+}
+
+sub recognized_string {
+  my $self = shift;
+  if ($self->{_State_} == 1) {
+    return RecognizedString($self->{Parser});
+  }
+}
+
+sub original_string {
+  my $self = shift;
+  if ($self->{_State_} == 1) {
+    return OriginalString($self->{Parser});
+  }
+}
+
+sub current_line {
+  my $self = shift;
+  if ($self->{_State_} == 1) {
+    return GetCurrentLineNumber($self->{Parser});
+  }
+}
+
+sub current_column {
+  my $self = shift;
+  if ($self->{_State_} == 1) {
+    return GetCurrentColumnNumber($self->{Parser});
+  }
+}
+
+sub current_byte {
+  my $self = shift;
+  if ($self->{_State_} == 1) {
+    return GetCurrentByteIndex($self->{Parser});
+  }
+}
+
+sub base {
+  my ($self, $newbase) = @_;
+  my $p = $self->{Parser};
+  my $oldbase = GetBase($p);
+  SetBase($p, $newbase) if @_ > 1;
+  return $oldbase;
+}
+
+sub context {
+  my $ctx = $_[0]->{Context};
+  @$ctx;
+}
+
+sub current_element {
+  my ($self) = @_;
+  @{$self->{Context}} ? $self->{Context}->[-1] : undef;
+}
+
+sub in_element {
+  my ($self, $element) = @_;
+  @{$self->{Context}} ? $self->eq_name($self->{Context}->[-1], $element)
+    : undef;
+}
+
+sub within_element {
+  my ($self, $element) = @_;
+  my $cnt = 0;
+  foreach (@{$self->{Context}}) {
+    $cnt++ if $self->eq_name($_, $element);
+  }
+  return $cnt;
+}
+
+sub depth {
+  my ($self) = @_;
+  int(@{$self->{Context}});
+}
+
+sub element_index {
+  my ($self) = @_;
+
+  if ($self->{_State_} == 1) {
+    return ElementIndex($self->{Parser});
+  }
+}
+
+################
+# Namespace methods
+
+sub namespace {
+  my ($self, $name) = @_;
+  local($^W) = 0;
+  $self->{Namespace_List}->[int($name)];
+}
+
+sub eq_name {
+  my ($self, $nm1, $nm2) = @_;
+  local($^W) = 0;
+
+  int($nm1) == int($nm2) and $nm1 eq $nm2;
+}
+
+sub generate_ns_name {
+  my ($self, $name, $namespace) = @_;
+
+  $namespace ?
+    GenerateNSName($name, $namespace, $self->{Namespace_Table},
+                   $self->{Namespace_List})
+      : $name;
+}
+
+sub new_ns_prefixes {
+  my ($self) = @_;
+  if ($self->{Namespaces}) {
+    return @{$self->{New_Prefixes}};
+  }
+  return ();
+}
+
+sub expand_ns_prefix {
+  my ($self, $prefix) = @_;
+
+  if ($self->{Namespaces}) {
+    my $stack = $self->{Prefix_Table}->{$prefix};
+    return (defined($stack) and @$stack) ? $stack->[-1] : undef;
+  }
+
+  return undef;
+}
+
+sub current_ns_prefixes {
+  my ($self) = @_;
+
+  if ($self->{Namespaces}) {
+    my %set = %{$self->{Prefix_Table}};
+
+    if (exists $set{'#default'} and not defined($set{'#default'}->[-1])) {
+      delete $set{'#default'};
+    }
+
+    return keys %set;
+  }
+
+  return ();
+}
+
+
+################################################################
+# Namespace declaration handlers
+#
+
+sub NamespaceStart {
+  my ($self, $prefix, $uri) = @_;
+
+  $prefix = '#default' unless defined $prefix;
+  my $stack = $self->{Prefix_Table}->{$prefix}; 
+
+  if (defined $stack) {
+    push(@$stack, $uri);
+  }
+  else {
+    $self->{Prefix_Table}->{$prefix} = [$uri];
+  }
+
+  # The New_Prefixes list gets emptied at end of startElement function
+  # in Expat.xs
+
+  push(@{$self->{New_Prefixes}}, $prefix);
+}
+
+sub NamespaceEnd {
+  my ($self, $prefix) = @_;
+
+  $prefix = '#default' unless defined $prefix;
+
+  my $stack = $self->{Prefix_Table}->{$prefix};
+  if (@$stack > 1) {
+    pop(@$stack);
+  }
+  else {
+    delete $self->{Prefix_Table}->{$prefix};
+  }
+}
+
+################
+
+sub specified_attr {
+  my $self = shift;
+  
+  if ($self->{_State_} == 1) {
+    return GetSpecifiedAttributeCount($self->{Parser});
+  }
+}
+
+sub finish {
+  my ($self) = @_;
+  if ($self->{_State_} == 1) {
+    my $parser = $self->{Parser};
+    UnsetAllHandlers($parser);
+  }
+}
+
+sub position_in_context {
+  my ($self, $lines) = @_;
+  if ($self->{_State_} == 1) {
+    my $parser = $self->{Parser};
+    my ($string, $linepos) = PositionContext($parser, $lines);
+
+    return '' unless defined($string);
+
+    my $col = GetCurrentColumnNumber($parser);
+    my $ptr = ('=' x ($col - 1)) . '^' . "\n";
+    my $ret;
+    my $dosplit = $linepos < length($string);
+  
+    $string .= "\n" unless $string =~ /\n$/;
+  
+    if ($dosplit) {
+      $ret = substr($string, 0, $linepos) . $ptr
+        . substr($string, $linepos);
+    } else {
+      $ret = $string . $ptr;
+    }
+  
+    return $ret;
+  }
+}
+
+sub xml_escape {
+  my $self = shift;
+  my $text = shift;
+
+  study $text;
+  $text =~ s/\&/\&amp;/g;
+  $text =~ s/</\&lt;/g;
+  foreach (@_) {
+    croak "xml_escape: '$_' isn't a single character" if length($_) > 1;
+
+    if ($_ eq '>') {
+      $text =~ s/>/\&gt;/g;
+    }
+    elsif ($_ eq '"') {
+      $text =~ s/\"/\&quot;/;
+    }
+    elsif ($_ eq "'") {
+      $text =~ s/\'/\&apos;/;
+    }
+    else {
+      my $rep = '&#' . sprintf('x%X', ord($_)) . ';';
+      if (/\W/) {
+        my $ptrn = "\\$_";
+        $text =~ s/$ptrn/$rep/g;
+      }
+      else {
+        $text =~ s/$_/$rep/g;
+      }
+    }
+  }
+  $text;
+}
+
+sub skip_until {
+  my $self = shift;
+  if ($self->{_State_} <= 1) {
+    SkipUntil($self->{Parser}, $_[0]);
+  }
+}
+
+sub release {
+  my $self = shift;
+  ParserRelease($self->{Parser});
+}
+
+sub DESTROY {
+  my $self = shift;
+  ParserFree($self->{Parser});
+}
+
+sub parse {
+  my $self = shift;
+  my $arg = shift;
+  croak "Parse already in progress (Expat)" if $self->{_State_};
+  $self->{_State_} = 1;
+  my $parser = $self->{Parser};
+  my $ioref;
+  my $result = 0;
+  
+  if (defined $arg) {
+    if (ref($arg) and UNIVERSAL::isa($arg, 'IO::Handle')) {
+      $ioref = $arg;
+    } elsif (tied($arg)) {
+      my $class = ref($arg);
+      no strict 'refs';
+      $ioref = $arg if defined &{"${class}::TIEHANDLE"};
+    }
+    else {
+      require IO::Handle;
+      eval {
+        no strict 'refs';
+        $ioref = *{$arg}{IO} if defined *{$arg};
+      };
+      undef $@;
+    }
+  }
+  
+  if (defined($ioref)) {
+    my $delim = $self->{Stream_Delimiter};
+    my $prev_rs;
+    
+    $prev_rs = ref($ioref)->input_record_separator("\n$delim\n")
+      if defined($delim);
+    
+    $result = ParseStream($parser, $ioref, $delim);
+    
+    ref($ioref)->input_record_separator($prev_rs)
+      if defined($delim);
+  } else {
+    $result = ParseString($parser, $arg);
+  }
+  
+  $self->{_State_} = 2;
+  $result or croak $self->{ErrorMessage};
+}
+
+sub parsestring {
+  my $self = shift;
+  $self->parse(@_);
+}
+
+sub parsefile {
+  my $self = shift;
+  croak "Parser has already been used" if $self->{_State_};
+  local(*FILE);
+  open(FILE, $_[0]) or  croak "Couldn't open $_[0]:\n$!";
+  binmode(FILE);
+  my $ret = $self->parse(*FILE);
+  close(FILE);
+  $ret;
+}
+
+################################################################
+package XML::Parser::ContentModel;
+use overload '""' => \&asString, 'eq' => \&thiseq;
+
+sub EMPTY  () {1}
+sub ANY    () {2}
+sub MIXED  () {3}
+sub NAME   () {4}
+sub CHOICE () {5}
+sub SEQ    () {6}
+
+
+sub isempty {
+  return $_[0]->{Type} == EMPTY;
+}
+
+sub isany {
+  return $_[0]->{Type} == ANY;
+}
+
+sub ismixed {
+  return $_[0]->{Type} == MIXED;
+}
+
+sub isname {
+  return $_[0]->{Type} == NAME;
+}
+
+sub name {
+  return $_[0]->{Tag};
+}
+
+sub ischoice {
+  return $_[0]->{Type} == CHOICE;
+}
+
+sub isseq {
+  return $_[0]->{Type} == SEQ;
+}
+
+sub quant {
+  return $_[0]->{Quant};
+}
+
+sub children {
+  my $children = $_[0]->{Children};
+  if (defined $children) {
+    return @$children;
+  }
+  return undef;
+}
+
+sub asString {
+  my ($self) = @_;
+  my $ret;
+
+  if ($self->{Type} == NAME) {
+    $ret = $self->{Tag};
+  }
+  elsif ($self->{Type} == EMPTY) {
+    return "EMPTY";
+  }
+  elsif ($self->{Type} == ANY) {
+    return "ANY";
+  }
+  elsif ($self->{Type} == MIXED) {
+    $ret = '(#PCDATA';
+    foreach (@{$self->{Children}}) {
+      $ret .= '|' . $_;
+    }
+    $ret .= ')';
+  }
+  else {
+    my $sep = $self->{Type} == CHOICE ? '|' : ',';
+    $ret = '(' . join($sep, map { $_->asString } @{$self->{Children}}) . ')';
+  }
+
+  $ret .= $self->{Quant} if $self->{Quant};
+  return $ret;
+}
+
+sub thiseq {
+  my $self = shift;
+
+  return $self->asString eq $_[0];
+}
+
+################################################################
+package XML::Parser::ExpatNB;
+
+use vars qw(@ISA);
+use Carp;
+
+@ISA = qw(XML::Parser::Expat);
+
+sub parse {
+  my $self = shift;
+  my $class = ref($self);
+  croak "parse method not supported in $class";
+}
+
+sub parsestring {
+  my $self = shift;
+  my $class = ref($self);
+  croak "parsestring method not supported in $class";
+}
+
+sub parsefile {
+  my $self = shift;
+  my $class = ref($self);
+  croak "parsefile method not supported in $class";
+}
+
+sub parse_more {
+  my ($self, $data) = @_;
+
+  $self->{_State_} = 1;
+  my $ret = XML::Parser::Expat::ParsePartial($self->{Parser}, $data);
+
+  croak $self->{ErrorMessage} unless $ret;
+}
+
+sub parse_done {
+  my $self = shift;
+
+  my $ret = XML::Parser::Expat::ParseDone($self->{Parser});
+  unless ($ret) {
+    my $msg = $self->{ErrorMessage};
+    $self->release;
+    croak $msg;
+  }
+
+  $self->{_State_} = 2;
+
+  my $result = $ret;
+  my @result = ();
+  my $final = $self->{FinalHandler};
+  if (defined $final) {
+    if (wantarray) {
+      @result = &$final($self);
+    }
+    else {
+      $result = &$final($self);
+    }
+  }
+
+  $self->release;
+
+  return unless defined wantarray;
+  return wantarray ? @result : $result;
+}
+
+################################################################
+
+package XML::Parser::Encinfo;
+
+sub DESTROY {
+  my $self = shift;
+  XML::Parser::Expat::FreeEncoding($self);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+XML::Parser::Expat - Lowlevel access to James Clark's expat XML parser
+
+=head1 SYNOPSIS
+
+ use XML::Parser::Expat;
+
+ $parser = new XML::Parser::Expat;
+ $parser->setHandlers('Start' => \&sh,
+                      'End'   => \&eh,
+                      'Char'  => \&ch);
+ open(FOO, 'info.xml') or die "Couldn't open";
+ $parser->parse(*FOO);
+ close(FOO);
+ # $parser->parse('<foo id="me"> here <em>we</em> go </foo>');
+
+ sub sh
+ {
+   my ($p, $el, %atts) = @_;
+   $p->setHandlers('Char' => \&spec)
+     if ($el eq 'special');
+   ...
+ }
+
+ sub eh
+ {
+   my ($p, $el) = @_;
+   $p->setHandlers('Char' => \&ch)  # Special elements won't contain
+     if ($el eq 'special');         # other special elements
+   ...
+ } 
+
+=head1 DESCRIPTION
+
+This module provides an interface to James Clark's XML parser, expat. As in
+expat, a single instance of the parser can only parse one document. Calls
+to parsestring after the first for a given instance will die.
+
+Expat (and XML::Parser::Expat) are event based. As the parser recognizes
+parts of the document (say the start or end of an XML element), then any
+handlers registered for that type of an event are called with suitable
+parameters.
+
+=head1 METHODS
+
+=over 4
+
+=item new
+
+This is a class method, the constructor for XML::Parser::Expat. Options are
+passed as keyword value pairs. The recognized options are:
+
+=over 4
+
+=item * ProtocolEncoding
+
+The protocol encoding name. The default is none. The expat built-in
+encodings are: C<UTF-8>, C<ISO-8859-1>, C<UTF-16>, and C<US-ASCII>.
+Other encodings may be used if they have encoding maps in one of the
+directories in the @Encoding_Path list. Setting the protocol encoding
+overrides any encoding in the XML declaration.
+
+=item * Namespaces
+
+When this option is given with a true value, then the parser does namespace
+processing. By default, namespace processing is turned off. When it is
+turned on, the parser consumes I<xmlns> attributes and strips off prefixes
+from element and attributes names where those prefixes have a defined
+namespace. A name's namespace can be found using the L<"namespace"> method
+and two names can be checked for absolute equality with the L<"eq_name">
+method.
+
+=item * NoExpand
+
+Normally, the parser will try to expand references to entities defined in
+the internal subset. If this option is set to a true value, and a default
+handler is also set, then the default handler will be called when an
+entity reference is seen in text. This has no effect if a default handler
+has not been registered, and it has no effect on the expansion of entity
+references inside attribute values.
+
+=item * Stream_Delimiter
+
+This option takes a string value. When this string is found alone on a line
+while parsing from a stream, then the parse is ended as if it saw an end of
+file. The intended use is with a stream of xml documents in a MIME multipart
+format. The string should not contain a trailing newline.
+
+=item * ErrorContext
+
+When this option is defined, errors are reported in context. The value
+of ErrorContext should be the number of lines to show on either side of
+the line in which the error occurred.
+
+=item * ParseParamEnt
+
+Unless standalone is set to "yes" in the XML declaration, setting this to
+a true value allows the external DTD to be read, and parameter entities
+to be parsed and expanded.
+
+=item * Base
+
+The base to use for relative pathnames or URLs. This can also be done by
+using the base method.
+
+=back
+
+=item setHandlers(TYPE, HANDLER [, TYPE, HANDLER [...]])
+
+This method registers handlers for the various events. If no handlers are
+registered, then a call to parsestring or parsefile will only determine if
+the corresponding XML document is well formed (by returning without error.)
+This may be called from within a handler, after the parse has started.
+
+Setting a handler to something that evaluates to false unsets that
+handler.
+
+This method returns a list of type, handler pairs corresponding to the
+input. The handlers returned are the ones that were in effect before the
+call to setHandlers.
+
+The recognized events and the parameters passed to the corresponding
+handlers are:
+
+=over 4
+
+=item * Start             (Parser, Element [, Attr, Val [,...]])
+
+This event is generated when an XML start tag is recognized. Parser is
+an XML::Parser::Expat instance. Element is the name of the XML element that
+is opened with the start tag. The Attr & Val pairs are generated for each
+attribute in the start tag.
+
+=item * End               (Parser, Element)
+
+This event is generated when an XML end tag is recognized. Note that
+an XML empty tag (<foo/>) generates both a start and an end event.
+
+There is always a lower level start and end handler installed that wrap
+the corresponding callbacks. This is to handle the context mechanism.
+A consequence of this is that the default handler (see below) will not
+see a start tag or end tag unless the default_current method is called.
+
+=item * Char              (Parser, String)
+
+This event is generated when non-markup is recognized. The non-markup
+sequence of characters is in String. A single non-markup sequence of
+characters may generate multiple calls to this handler. Whatever the
+encoding of the string in the original document, this is given to the
+handler in UTF-8.
+
+=item * Proc              (Parser, Target, Data)
+
+This event is generated when a processing instruction is recognized.
+
+=item * Comment           (Parser, String)
+
+This event is generated when a comment is recognized.
+
+=item * CdataStart        (Parser)
+
+This is called at the start of a CDATA section.
+
+=item * CdataEnd          (Parser)
+
+This is called at the end of a CDATA section.
+
+=item * Default           (Parser, String)
+
+This is called for any characters that don't have a registered handler.
+This includes both characters that are part of markup for which no
+events are generated (markup declarations) and characters that
+could generate events, but for which no handler has been registered.
+
+Whatever the encoding in the original document, the string is returned to
+the handler in UTF-8.
+
+=item * Unparsed          (Parser, Entity, Base, Sysid, Pubid, Notation)
+
+This is called for a declaration of an unparsed entity. Entity is the name
+of the entity. Base is the base to be used for resolving a relative URI.
+Sysid is the system id. Pubid is the public id. Notation is the notation
+name. Base and Pubid may be undefined.
+
+=item * Notation          (Parser, Notation, Base, Sysid, Pubid)
+
+This is called for a declaration of notation. Notation is the notation name.
+Base is the base to be used for resolving a relative URI. Sysid is the system
+id. Pubid is the public id. Base, Sysid, and Pubid may all be undefined.
+
+=item * ExternEnt         (Parser, Base, Sysid, Pubid)
+
+This is called when an external entity is referenced. Base is the base to be
+used for resolving a relative URI. Sysid is the system id. Pubid is the public
+id. Base, and Pubid may be undefined.
+
+This handler should either return a string, which represents the contents of
+the external entity, or return an open filehandle that can be read to obtain
+the contents of the external entity, or return undef, which indicates the
+external entity couldn't be found and will generate a parse error.
+
+If an open filehandle is returned, it must be returned as either a glob
+(*FOO) or as a reference to a glob (e.g. an instance of IO::Handle).
+
+=item * ExternEntFin      (Parser)
+
+This is called after an external entity has been parsed. It allows
+applications to perform cleanup on actions performed in the above
+ExternEnt handler.
+
+=item * Entity            (Parser, Name, Val, Sysid, Pubid, Ndata, IsParam)
+
+This is called when an entity is declared. For internal entities, the Val
+parameter will contain the value and the remaining three parameters will
+be undefined. For external entities, the Val parameter
+will be undefined, the Sysid parameter will have the system id, the Pubid
+parameter will have the public id if it was provided (it will be undefined
+otherwise), the Ndata parameter will contain the notation for unparsed
+entities. If this is a parameter entity declaration, then the IsParam
+parameter is true.
+
+Note that this handler and the Unparsed handler above overlap. If both are
+set, then this handler will not be called for unparsed entities.
+
+=item * Element           (Parser, Name, Model)
+
+The element handler is called when an element declaration is found. Name is
+the element name, and Model is the content model as an
+XML::Parser::ContentModel object. See L<"XML::Parser::ContentModel Methods">
+for methods available for this class.
+
+=item * Attlist           (Parser, Elname, Attname, Type, Default, Fixed)
+
+This handler is called for each attribute in an ATTLIST declaration.
+So an ATTLIST declaration that has multiple attributes
+will generate multiple calls to this handler. The Elname parameter is the
+name of the element with which the attribute is being associated. The Attname
+parameter is the name of the attribute. Type is the attribute type, given as
+a string. Default is the default value, which will either be "#REQUIRED",
+"#IMPLIED" or a quoted string (i.e. the returned string will begin and end
+with a quote character). If Fixed is true, then this is a fixed attribute.
+
+=item * Doctype           (Parser, Name, Sysid, Pubid, Internal)
+
+This handler is called for DOCTYPE declarations. Name is the document type
+name. Sysid is the system id of the document type, if it was provided,
+otherwise it's undefined. Pubid is the public id of the document type,
+which will be undefined if no public id was given. Internal will be
+true or false, indicating whether or not the doctype declaration contains
+an internal subset.
+
+=item * DoctypeFin        (Parser)
+
+This handler is called after parsing of the DOCTYPE declaration has finished,
+including any internal or external DTD declarations.
+
+=item * XMLDecl           (Parser, Version, Encoding, Standalone)
+
+This handler is called for XML declarations. Version is a string containg
+the version. Encoding is either undefined or contains an encoding string.
+Standalone is either undefined, or true or false. Undefined indicates
+that no standalone parameter was given in the XML declaration. True or
+false indicates "yes" or "no" respectively.
+
+=back
+
+=item namespace(name)
+
+Return the URI of the namespace that the name belongs to. If the name doesn't
+belong to any namespace, an undef is returned. This is only valid on names
+received through the Start or End handlers from a single document, or through
+a call to the generate_ns_name method. In other words, don't use names
+generated from one instance of XML::Parser::Expat with other instances.
+
+=item eq_name(name1, name2)
+
+Return true if name1 and name2 are identical (i.e. same name and from
+the same namespace.) This is only meaningful if both names were obtained
+through the Start or End handlers from a single document, or through
+a call to the generate_ns_name method.
+
+=item generate_ns_name(name, namespace)
+
+Return a name, associated with a given namespace, good for using with the
+above 2 methods. The namespace argument should be the namespace URI, not
+a prefix.
+
+=item new_ns_prefixes
+
+When called from a start tag handler, returns namespace prefixes declared
+with this start tag. If called elsewere (or if there were no namespace
+prefixes declared), it returns an empty list. Setting of the default
+namespace is indicated with '#default' as a prefix.
+
+=item expand_ns_prefix(prefix)
+
+Return the uri to which the given prefix is currently bound. Returns
+undef if the prefix isn't currently bound. Use '#default' to find the
+current binding of the default namespace (if any).
+
+=item current_ns_prefixes
+
+Return a list of currently bound namespace prefixes. The order of the
+the prefixes in the list has no meaning. If the default namespace is
+currently bound, '#default' appears in the list.
+
+=item recognized_string
+
+Returns the string from the document that was recognized in order to call
+the current handler. For instance, when called from a start handler, it
+will give us the the start-tag string. The string is encoded in UTF-8.
+This method doesn't return a meaningful string inside declaration handlers.
+
+=item original_string
+
+Returns the verbatim string from the document that was recognized in
+order to call the current handler. The string is in the original document
+encoding. This method doesn't return a meaningful string inside declaration
+handlers.
+
+=item default_current
+
+When called from a handler, causes the sequence of characters that generated
+the corresponding event to be sent to the default handler (if one is
+registered). Use of this method is deprecated in favor the recognized_string
+method, which you can use without installing a default handler. This
+method doesn't deliver a meaningful string to the default handler when
+called from inside declaration handlers.
+
+=item xpcroak(message)
+
+Concatenate onto the given message the current line number within the
+XML document plus the message implied by ErrorContext. Then croak with
+the formed message.
+
+=item xpcarp(message)
+
+Concatenate onto the given message the current line number within the
+XML document plus the message implied by ErrorContext. Then carp with
+the formed message.
+
+=item current_line
+
+Returns the line number of the current position of the parse.
+
+=item current_column
+
+Returns the column number of the current position of the parse.
+
+=item current_byte
+
+Returns the current position of the parse.
+
+=item base([NEWBASE]);
+
+Returns the current value of the base for resolving relative URIs. If
+NEWBASE is supplied, changes the base to that value.
+
+=item context
+
+Returns a list of element names that represent open elements, with the
+last one being the innermost. Inside start and end tag handlers, this
+will be the tag of the parent element.
+
+=item current_element
+
+Returns the name of the innermost currently opened element. Inside
+start or end handlers, returns the parent of the element associated
+with those tags.
+
+=item in_element(NAME)
+
+Returns true if NAME is equal to the name of the innermost currently opened
+element. If namespace processing is being used and you want to check
+against a name that may be in a namespace, then use the generate_ns_name
+method to create the NAME argument.
+
+=item within_element(NAME)
+
+Returns the number of times the given name appears in the context list.
+If namespace processing is being used and you want to check
+against a name that may be in a namespace, then use the generate_ns_name
+method to create the NAME argument.
+
+=item depth
+
+Returns the size of the context list.
+
+=item element_index
+
+Returns an integer that is the depth-first visit order of the current
+element. This will be zero outside of the root element. For example,
+this will return 1 when called from the start handler for the root element
+start tag.
+
+=item skip_until(INDEX)
+
+INDEX is an integer that represents an element index. When this method
+is called, all handlers are suspended until the start tag for an element
+that has an index number equal to INDEX is seen. If a start handler has
+been set, then this is the first tag that the start handler will see
+after skip_until has been called.
+
+
+=item position_in_context(LINES)
+
+Returns a string that shows the current parse position. LINES should be
+an integer >= 0 that represents the number of lines on either side of the
+current parse line to place into the returned string.
+
+=item xml_escape(TEXT [, CHAR [, CHAR ...]])
+
+Returns TEXT with markup characters turned into character entities. Any
+additional characters provided as arguments are also turned into character
+references where found in TEXT.
+
+=item parse (SOURCE)
+
+The SOURCE parameter should either be a string containing the whole XML
+document, or it should be an open IO::Handle. Only a single document
+may be parsed for a given instance of XML::Parser::Expat, so this will croak
+if it's been called previously for this instance.
+
+=item parsestring(XML_DOC_STRING)
+
+Parses the given string as an XML document. Only a single document may be
+parsed for a given instance of XML::Parser::Expat, so this will die if either
+parsestring or parsefile has been called for this instance previously.
+
+This method is deprecated in favor of the parse method.
+
+=item parsefile(FILENAME)
+
+Parses the XML document in the given file. Will die if parsestring or
+parsefile has been called previously for this instance.
+
+=item is_defaulted(ATTNAME)
+
+NO LONGER WORKS. To find out if an attribute is defaulted please use
+the specified_attr method.
+
+=item specified_attr
+
+When the start handler receives lists of attributes and values, the
+non-defaulted (i.e. explicitly specified) attributes occur in the list
+first. This method returns the number of specified items in the list.
+So if this number is equal to the length of the list, there were no
+defaulted values. Otherwise the number points to the index of the
+first defaulted attribute name.
+
+=item finish
+
+Unsets all handlers (including internal ones that set context), but expat
+continues parsing to the end of the document or until it finds an error.
+It should finish up a lot faster than with the handlers set.
+
+=item release
+
+There are data structures used by XML::Parser::Expat that have circular
+references. This means that these structures will never be garbage
+collected unless these references are explicitly broken. Calling this
+method breaks those references (and makes the instance unusable.)
+
+Normally, higher level calls handle this for you, but if you are using
+XML::Parser::Expat directly, then it's your responsibility to call it.
+
+=back
+
+=head2 XML::Parser::ContentModel Methods
+
+The element declaration handlers are passed objects of this class as the
+content model of the element declaration. They also represent content
+particles, components of a content model.
+
+When referred to as a string, these objects are automagicly converted to a
+string representation of the model (or content particle).
+
+=over 4
+
+=item isempty
+
+This method returns true if the object is "EMPTY", false otherwise.
+
+=item isany
+
+This method returns true if the object is "ANY", false otherwise.
+
+=item ismixed
+
+This method returns true if the object is "(#PCDATA)" or "(#PCDATA|...)*",
+false otherwise.
+
+=item isname
+
+This method returns if the object is an element name.
+
+=item ischoice
+
+This method returns true if the object is a choice of content particles.
+
+
+=item isseq
+
+This method returns true if the object is a sequence of content particles.
+
+=item quant
+
+This method returns undef or a string representing the quantifier
+('?', '*', '+') associated with the model or particle.
+
+=item children
+
+This method returns undef or (for mixed, choice, and sequence types)
+an array of component content particles. There will always be at least
+one component for choices and sequences, but for a mixed content model
+of pure PCDATA, "(#PCDATA)", then an undef is returned.
+
+=back
+
+=head2 XML::Parser::ExpatNB Methods
+
+The class XML::Parser::ExpatNB is a subclass of XML::Parser::Expat used
+for non-blocking access to the expat library. It does not support the parse,
+parsestring, or parsefile methods, but it does have these additional methods:
+
+=over 4
+
+=item parse_more(DATA)
+
+Feed expat more text to munch on.
+
+=item parse_done
+
+Tell expat that it's gotten the whole document.
+
+=back
+
+=head1 FUNCTIONS
+
+=over 4
+
+=item XML::Parser::Expat::load_encoding(ENCODING)
+
+Load an external encoding. ENCODING is either the name of an encoding or
+the name of a file. The basename is converted to lowercase and a '.enc'
+extension is appended unless there's one already there. Then, unless
+it's an absolute pathname (i.e. begins with '/'), the first file by that
+name discovered in the @Encoding_Path path list is used.
+
+The encoding in the file is loaded and kept in the %Encoding_Table
+table. Earlier encodings of the same name are replaced.
+
+This function is automaticly called by expat when it encounters an encoding
+it doesn't know about. Expat shouldn't call this twice for the same
+encoding name. The only reason users should use this function is to
+explicitly load an encoding not contained in the @Encoding_Path list.
+
+=back
+
+=head1 AUTHORS
+
+Larry Wall <F<larry@wall.org>> wrote version 1.0.
+
+Clark Cooper <F<coopercc@netheaven.com>> picked up support, changed the API
+for this version (2.x), provided documentation, and added some standard
+package features.
+
+=cut
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/LWPExternEnt.pl
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/LWPExternEnt.pl	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/LWPExternEnt.pl	(revision 21851)
@@ -0,0 +1,71 @@
+# LWPExternEnt.pl
+#
+# Copyright (c) 2000 Clark Cooper
+# All rights reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package XML::Parser;
+
+use URI;
+use URI::file;
+use LWP;
+
+##
+## Note that this external entity handler reads the entire entity into
+## memory, so it will choke on huge ones. It would be really nice if
+## LWP::UserAgent optionally returned us an IO::Handle.
+##
+
+sub lwp_ext_ent_handler {
+  my ($xp, $base, $sys) = @_;  # We don't use public id
+
+  my $uri;
+
+  if (defined $base) {
+    # Base may have been set by parsefile, which is agnostic about
+    # whether its a file or URI.
+    my $base_uri = new URI($base);
+    unless (defined $base_uri->scheme) {
+      $base_uri = URI->new_abs($base_uri, URI::file->cwd);
+    }
+
+    $uri = URI->new_abs($sys, $base_uri);
+  }
+  else {
+    $uri = new URI($sys);
+    unless (defined $uri->scheme) {
+      $uri = URI->new_abs($uri, URI::file->cwd);
+    }
+  }
+  
+  my $ua = $xp->{_lwpagent};
+  unless (defined $ua) {
+    $ua = $xp->{_lwpagent} = new LWP::UserAgent();
+    $ua->env_proxy();
+  }
+
+  my $req = new HTTP::Request('GET', $uri);
+
+  my $res = $ua->request($req);
+  if ($res->is_error) {
+    $xp->{ErrorMessage} .= "\n" . $res->status_line . " $uri";
+    return undef;
+  }
+  
+  $xp->{_BaseStack} ||= [];
+  push(@{$xp->{_BaseStack}}, $base);
+
+  $xp->base($uri);
+  
+  return $res->content;
+}  # End lwp_ext_ent_handler
+
+sub lwp_ext_ent_cleanup {
+  my ($xp) = @_;
+
+  $xp->base(pop(@{$xp->{_BaseStack}}));
+}  # End lwp_ext_ent_cleanup
+
+1;
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/Style/Debug.pm
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/Style/Debug.pm	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/Style/Debug.pm	(revision 21851)
@@ -0,0 +1,52 @@
+# $Id: Debug.pm,v 1.1 2003/07/27 16:07:49 matt Exp $
+
+package XML::Parser::Style::Debug;
+use strict;
+
+sub Start {
+  my $expat = shift;
+  my $tag = shift;
+  print STDERR "@{$expat->{Context}} \\\\ (@_)\n";
+}
+
+sub End {
+  my $expat = shift;
+  my $tag = shift;
+  print STDERR "@{$expat->{Context}} //\n";
+}
+
+sub Char {
+  my $expat = shift;
+  my $text = shift;
+  $text =~ s/([\x80-\xff])/sprintf "#x%X;", ord $1/eg;
+  $text =~ s/([\t\n])/sprintf "#%d;", ord $1/eg;
+  print STDERR "@{$expat->{Context}} || $text\n";
+}
+
+sub Proc {
+  my $expat = shift;
+  my $target = shift;
+  my $text = shift;
+  my @foo = @{$expat->{Context}};
+  print STDERR "@foo $target($text)\n";
+}
+
+1;
+__END__
+
+=head1 NAME
+
+XML::Parser::Style::Debug - Debug style for XML::Parser
+
+=head1 SYNOPSIS
+
+  use XML::Parser;
+  my $p = XML::Parser->new(Style => 'Debug');
+  $p->parsefile('foo.xml');
+
+=head1 DESCRIPTION
+
+This just prints out the document in outline form to STDERR. Nothing special is
+returned by parse.
+
+=cut
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/Style/Objects.pm
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/Style/Objects.pm	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/Style/Objects.pm	(revision 21851)
@@ -0,0 +1,78 @@
+# $Id: Objects.pm,v 1.1 2003/08/18 20:20:51 matt Exp $
+
+package XML::Parser::Style::Objects;
+use strict;
+
+sub Init {
+  my $expat = shift;
+  $expat->{Lists} = [];
+  $expat->{Curlist} = $expat->{Tree} = [];
+}
+
+sub Start {
+  my $expat = shift;
+  my $tag = shift;
+  my $newlist = [ ];
+  my $class = "${$expat}{Pkg}::$tag";
+  my $newobj = bless { @_, Kids => $newlist }, $class;
+  push @{ $expat->{Lists} }, $expat->{Curlist};
+  push @{ $expat->{Curlist} }, $newobj;
+  $expat->{Curlist} = $newlist;
+}
+
+sub End {
+  my $expat = shift;
+  my $tag = shift;
+  $expat->{Curlist} = pop @{ $expat->{Lists} };
+}
+
+sub Char {
+  my $expat = shift;
+  my $text = shift;
+  my $class = "${$expat}{Pkg}::Characters";
+  my $clist = $expat->{Curlist};
+  my $pos = $#$clist;
+  
+  if ($pos >= 0 and ref($clist->[$pos]) eq $class) {
+    $clist->[$pos]->{Text} .= $text;
+  } else {
+    push @$clist, bless { Text => $text }, $class;
+  }
+}
+
+sub Final {
+  my $expat = shift;
+  delete $expat->{Curlist};
+  delete $expat->{Lists};
+  $expat->{Tree};
+}
+
+1;
+__END__
+
+=head1 NAME
+
+XML::Parser::Style::Objects
+
+=head1 SYNOPSIS
+
+  use XML::Parser;
+  my $p = XML::Parser->new(Style => 'Objects', Pkg => 'MyNode');
+  my $tree = $p->parsefile('foo.xml');
+
+=head1 DESCRIPTION
+
+This module implements XML::Parser's Objects style parser.
+
+This is similar to the Tree style, except that a hash object is created for
+each element. The corresponding object will be in the class whose name
+is created by appending "::" and the element name to the package set with
+the Pkg option. Non-markup text will be in the ::Characters class. The
+contents of the corresponding object will be in an anonymous array that
+is the value of the Kids property for that object.
+
+=head1 SEE ALSO
+
+L<XML::Parser::Style::Tree>
+
+=cut
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/Style/Stream.pm
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/Style/Stream.pm	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/Style/Stream.pm	(revision 21851)
@@ -0,0 +1,184 @@
+# $Id: Stream.pm,v 1.1 2003/07/27 16:07:49 matt Exp $
+
+package XML::Parser::Style::Stream;
+use strict;
+
+# This style invented by Tim Bray <tbray@textuality.com>
+
+sub Init {
+  no strict 'refs';
+  my $expat = shift;
+  $expat->{Text} = '';
+  my $sub = $expat->{Pkg} ."::StartDocument";
+  &$sub($expat)
+    if defined(&$sub);
+}
+
+sub Start {
+  no strict 'refs';
+  my $expat = shift;
+  my $type = shift;
+  
+  doText($expat);
+  $_ = "<$type";
+  
+  %_ = @_;
+  while (@_) {
+    $_ .= ' ' . shift() . '="' . shift() . '"';
+  }
+  $_ .= '>';
+  
+  my $sub = $expat->{Pkg} . "::StartTag";
+  if (defined(&$sub)) {
+    &$sub($expat, $type);
+  } else {
+    print;
+  }
+}
+
+sub End {
+  no strict 'refs';
+  my $expat = shift;
+  my $type = shift;
+  
+  # Set right context for Text handler
+  push(@{$expat->{Context}}, $type);
+  doText($expat);
+  pop(@{$expat->{Context}});
+  
+  $_ = "</$type>";
+  
+  my $sub = $expat->{Pkg} . "::EndTag";
+  if (defined(&$sub)) {
+    &$sub($expat, $type);
+  } else {
+    print;
+  }
+}
+
+sub Char {
+  my $expat = shift;
+  $expat->{Text} .= shift;
+}
+
+sub Proc {
+  no strict 'refs';
+  my $expat = shift;
+  my $target = shift;
+  my $text = shift;
+  
+  doText($expat);
+
+  $_ = "<?$target $text?>";
+  
+  my $sub = $expat->{Pkg} . "::PI";
+  if (defined(&$sub)) {
+    &$sub($expat, $target, $text);
+  } else {
+    print;
+  }
+}
+
+sub Final {
+  no strict 'refs';
+  my $expat = shift;
+  my $sub = $expat->{Pkg} . "::EndDocument";
+  &$sub($expat)
+    if defined(&$sub);
+}
+
+sub doText {
+  no strict 'refs';
+  my $expat = shift;
+  $_ = $expat->{Text};
+  
+  if (length($_)) {
+    my $sub = $expat->{Pkg} . "::Text";
+    if (defined(&$sub)) {
+      &$sub($expat);
+    } else {
+      print;
+    }
+    
+    $expat->{Text} = '';
+  }
+}
+
+1;
+__END__
+
+=head1 NAME
+
+XML::Parser::Style::Stream - Stream style for XML::Parser
+
+=head1 SYNOPSIS
+
+  use XML::Parser;
+  my $p = XML::Parser->new(Style => 'Stream', Pkg => 'MySubs');
+  $p->parsefile('foo.xml');
+  
+  {
+    package MySubs;
+    
+    sub StartTag {
+      my ($e, $name) = @_;
+      # do something with start tags
+    }
+    
+    sub EndTag {
+      my ($e, $name) = @_;
+      # do something with end tags
+    }
+    
+    sub Characters {
+      my ($e, $data) = @_;
+      # do something with text nodes
+    }
+  }
+
+=head1 DESCRIPTION
+
+This style uses the Pkg option to find subs in a given package to call for each event.
+If none of the subs that this
+style looks for is there, then the effect of parsing with this style is
+to print a canonical copy of the document without comments or declarations.
+All the subs receive as their 1st parameter the Expat instance for the
+document they're parsing.
+
+It looks for the following routines:
+
+=over 4
+
+=item * StartDocument
+
+Called at the start of the parse .
+
+=item * StartTag
+
+Called for every start tag with a second parameter of the element type. The $_
+variable will contain a copy of the tag and the %_ variable will contain
+attribute values supplied for that element.
+
+=item * EndTag
+
+Called for every end tag with a second parameter of the element type. The $_
+variable will contain a copy of the end tag.
+
+=item * Text
+
+Called just before start or end tags with accumulated non-markup text in
+the $_ variable.
+
+=item * PI
+
+Called for processing instructions. The $_ variable will contain a copy of
+the PI and the target and data are sent as 2nd and 3rd parameters
+respectively.
+
+=item * EndDocument
+
+Called at conclusion of the parse.
+
+=back
+
+=cut
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/Style/Subs.pm
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/Style/Subs.pm	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/Style/Subs.pm	(revision 21851)
@@ -0,0 +1,58 @@
+# $Id: Subs.pm,v 1.1 2003/07/27 16:07:49 matt Exp $
+
+package XML::Parser::Style::Subs;
+
+sub Start {
+  no strict 'refs';
+  my $expat = shift;
+  my $tag = shift;
+  my $sub = $expat->{Pkg} . "::$tag";
+  eval { &$sub($expat, $tag, @_) };
+}
+
+sub End {
+  no strict 'refs';
+  my $expat = shift;
+  my $tag = shift;
+  my $sub = $expat->{Pkg} . "::${tag}_";
+  eval { &$sub($expat, $tag) };
+}
+
+1;
+__END__
+
+=head1 NAME
+
+XML::Parser::Style::Subs
+
+=head1 SYNOPSIS
+
+  use XML::Parser;
+  my $p = XML::Parser->new(Style => 'Subs', Pkg => 'MySubs');
+  $p->parsefile('foo.xml');
+  
+  {
+    package MySubs;
+    
+    sub foo {
+      # start of foo tag
+    }
+    
+    sub foo_ {
+      # end of foo tag
+    }
+  }
+
+=head1 DESCRIPTION
+
+Each time an element starts, a sub by that name in the package specified
+by the Pkg option is called with the same parameters that the Start
+handler gets called with.
+
+Each time an element ends, a sub with that name appended with an underscore
+("_"), is called with the same parameters that the End handler gets called
+with.
+
+Nothing special is returned by parse.
+
+=cut
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/Style/Tree.pm
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/Style/Tree.pm	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/XML/Parser/Style/Tree.pm	(revision 21851)
@@ -0,0 +1,90 @@
+# $Id: Tree.pm,v 1.2 2003/07/31 07:54:51 matt Exp $
+
+package XML::Parser::Style::Tree;
+$XML::Parser::Built_In_Styles{Tree} = 1;
+
+sub Init {
+  my $expat = shift;
+  $expat->{Lists} = [];
+  $expat->{Curlist} = $expat->{Tree} = [];
+}
+
+sub Start {
+  my $expat = shift;
+  my $tag = shift;
+  my $newlist = [ { @_ } ];
+  push @{ $expat->{Lists} }, $expat->{Curlist};
+  push @{ $expat->{Curlist} }, $tag => $newlist;
+  $expat->{Curlist} = $newlist;
+}
+
+sub End {
+  my $expat = shift;
+  my $tag = shift;
+  $expat->{Curlist} = pop @{ $expat->{Lists} };
+}
+
+sub Char {
+  my $expat = shift;
+  my $text = shift;
+  my $clist = $expat->{Curlist};
+  my $pos = $#$clist;
+  
+  if ($pos > 0 and $clist->[$pos - 1] eq '0') {
+    $clist->[$pos] .= $text;
+  } else {
+    push @$clist, 0 => $text;
+  }
+}
+
+sub Final {
+  my $expat = shift;
+  delete $expat->{Curlist};
+  delete $expat->{Lists};
+  $expat->{Tree};
+}
+
+1;
+__END__
+
+=head1 NAME
+
+XML::Parser::Style::Tree
+
+=head1 SYNOPSIS
+
+  use XML::Parser;
+  my $p = XML::Parser->new(Style => 'Tree');
+  my $tree = $p->parsefile('foo.xml');
+
+=head1 DESCRIPTION
+
+This module implements XML::Parser's Tree style parser.
+
+When parsing a document, C<parse()> will return a parse tree for the
+document. Each node in the tree
+takes the form of a tag, content pair. Text nodes are represented with
+a pseudo-tag of "0" and the string that is their content. For elements,
+the content is an array reference. The first item in the array is a
+(possibly empty) hash reference containing attributes. The remainder of
+the array is a sequence of tag-content pairs representing the content
+of the element.
+
+So for example the result of parsing:
+
+  <foo><head id="a">Hello <em>there</em></head><bar>Howdy<ref/></bar>do</foo>
+
+would be:
+             Tag   Content
+  ==================================================================
+  [foo, [{}, head, [{id => "a"}, 0, "Hello ",  em, [{}, 0, "there"]],
+              bar, [         {}, 0, "Howdy",  ref, [{}]],
+                0, "do"
+        ]
+  ]
+
+The root document "foo", has 3 children: a "head" element, a "bar"
+element and the text "do". After the empty attribute hash, these are
+represented in it's contents by 3 tag-content pairs.
+
+=cut
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/auto/XML/Parser/.packlist
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/auto/XML/Parser/.packlist	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/XML-Parser/perl-5.8/auto/XML/Parser/.packlist	(revision 21851)
@@ -0,0 +1,36 @@
+/research/kjdon/home/gsdl/xmlparser/XML/Parser.pm
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/Japanese_Encodings.msg
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/README
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/big5.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/euc-kr.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/iso-8859-2.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/iso-8859-3.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/iso-8859-4.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/iso-8859-5.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/iso-8859-7.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/iso-8859-8.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/iso-8859-9.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/windows-1250.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/windows-1252.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/x-euc-jp-jisx0221.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/x-euc-jp-unicode.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/x-sjis-cp932.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/x-sjis-jdk117.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/x-sjis-jisx0221.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Encodings/x-sjis-unicode.enc
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Expat.pm
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/LWPExternEnt.pl
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Style/Debug.pm
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Style/Objects.pm
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Style/Stream.pm
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Style/Subs.pm
+/research/kjdon/home/gsdl/xmlparser/XML/Parser/Style/Tree.pm
+/research/kjdon/home/gsdl/xmlparser/XML/share/man/man3/XML::Parser.3pm
+/research/kjdon/home/gsdl/xmlparser/XML/share/man/man3/XML::Parser::Expat.3pm
+/research/kjdon/home/gsdl/xmlparser/XML/share/man/man3/XML::Parser::Style::Debug.3pm
+/research/kjdon/home/gsdl/xmlparser/XML/share/man/man3/XML::Parser::Style::Objects.3pm
+/research/kjdon/home/gsdl/xmlparser/XML/share/man/man3/XML::Parser::Style::Stream.3pm
+/research/kjdon/home/gsdl/xmlparser/XML/share/man/man3/XML::Parser::Style::Subs.3pm
+/research/kjdon/home/gsdl/xmlparser/XML/share/man/man3/XML::Parser::Style::Tree.3pm
+/research/kjdon/home/gsdl/xmlparser/auto/XML/Parser/Expat/Expat.bs
+/research/kjdon/home/gsdl/xmlparser/auto/XML/Parser/Expat/Expat.so
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/ant-scripts/greenstone3-shared.xml
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/ant-scripts/greenstone3-shared.xml	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/ant-scripts/greenstone3-shared.xml	(revision 21851)
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+		..........................................................
+		August 2008
+		Targets for Greenstone3 release kits
+		Oran Fry
+		..........................................................
+-->
+
+<project name="greenstone3-targets">
+
+	<property name="version.major" value="3"/>
+	<target name="gs3-init">
+
+		<!-- show the property set to be forwarded to greenstone3 -->
+		<echo>Properties to be forwarded to greenstone3 build</echo>
+		<echoproperties><propertyset refid="forward.properties"/></echoproperties>
+
+	</target>
+
+	<target name="gs3-properties">
+		<echo>forward.* (eg, forward.proxy.host)    (optional)  any property to forward to greenstone3 during build</echo>
+	</target>
+
+	<target name="greenstone3-set-version-numbers">
+		<rsr
+			file="${greenstone3basedir}/resources/java/global.properties.in"
+			pattern="@gsdl3version@"
+			replacement="${version}" />
+		<rsr
+			file="${greenstone3basedir}/resources/java/server.properties"
+			pattern="^(Server3Control\.Version=).*$"
+			replacement="$1${version}" />
+
+	</target>
+
+	<!--
+		unused. might need to find a way to get the system ant into the release, as ant no longer comes with the release kits
+	-->
+	<target name="insert-ant">
+
+		<!-- remove any existing ant -->
+		<delete dir="compiled/packages/ant"/>
+
+		<!-- windows copy -->
+		<if><bool><equals arg1="${rk.os}" arg2="windows"/></bool>
+			<copy todir="compiled/packages">
+				<fileset dir="${rk.home}/core" includes="ant/**/*"/>
+			</copy>
+
+		<!-- linux, mac copy-->
+		<else><if><bool><or><equals arg1="${rk.os}" arg2="linux"/><equals arg1="${rk.os}" arg2="mac"/></or></bool>
+			<exec executable="cp">
+				<arg value="-r"/>
+				<arg value="${rk.home}/core/ant"/>
+				<arg value="compiled/packages"/>
+			</exec>
+
+		<!-- otherwise fail -->
+		<else>
+			<fail>this target does not support the current os</fail>
+
+		</else></if></else></if>
+
+	</target>
+
+	<target name="persist-forwarded-properties">
+		<echoproperties prefix="forward." destfile="${greenstone3basedir}/forward.properties"/>
+		<replaceregexp file="${greenstone3basedir}/forward.properties" match="forward\.(.*)" replace="\1" byline="true"/>
+		<copy file="${greenstone3basedir}/build.properties.in" tofile="${greenstone3basedir}/build.properties"/>
+		<concat destfile="${greenstone3basedir}/build.properties" append="true" fixlastline="yes">
+			<fileset file="${greenstone3basedir}/forward.properties"/>
+		</concat>
+	</target>
+	
+	<!-- create the property set to be forwarded to greenstone3 -->
+	<propertyset id="forward.properties">
+		<propertyref prefix="forward."/>
+		<mapper type="glob" from="forward.*" to="*"/>
+		<propertyref name="app.version"/>
+		<propertyref name="branch.path"/>
+		<propertyref name="branch.revision"/>
+	</propertyset>
+
+</project>
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/xsl/convert-build-xml-source.xsl
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/xsl/convert-build-xml-source.xsl	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/xsl/convert-build-xml-source.xsl	(revision 21851)
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<xsl:stylesheet version="1.0"
+  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+ <!-- we basically want to copy everything except for a few targets that no longer apply -->
+  <xsl:output method="xml"/>
+
+  <!-- for some reason, the default copy-of doesn't copy empty attributes, so have this to get the empty arg1 in equals-->
+  <xsl:template match="project|condition|and|isset|equals|not|or">
+    <xsl:copy>
+      <xsl:copy-of select="@*"/>
+      <xsl:apply-templates/>
+    </xsl:copy>
+  </xsl:template>
+      
+  <!-- delete the unnecessary targets -->
+  <xsl:template match="target[starts-with(@name, 'prepare')]"></xsl:template>
+  <xsl:template match="target[starts-with(@name, 'cvsupdate')]"></xsl:template>
+  <xsl:template match="target[starts-with(@name, 'update')]"></xsl:template>
+  <xsl:template match="target[starts-with(@name, 'checkout')]"></xsl:template>
+  <xsl:template match="target[starts-with(@name, 'rename-gs2build')]"></xsl:template>
+  <xsl:template match="target[@name='test']"></xsl:template>
+  <xsl:template match="target[@name='get-macos-extra']"><target name="get-macos-extra"></target></xsl:template>
+  <xsl:template match="target[@name='get-windows-binaries']"></xsl:template>
+  
+  <xsl:template match="property[@name='install-command']">
+    <property name="install-command" value="ant [options] install"/>
+  </xsl:template>
+
+  <xsl:variable name="install-for-dist" select="document('dist-build.xml')/project/target[@name='install-for-source-dist']"/>
+  
+  <!-- copy in our new install target -->
+  <xsl:template match="target[@name='install']">
+    <target name="install">
+      <xsl:copy-of select="$install-for-dist/@depends|$install-for-dist/@description|$install-for-dist/@if|$install-for-dist/@unless|$install-for-dist/node()"/>
+    </target>
+  </xsl:template>
+
+  <xsl:template match="*">
+    <xsl:copy-of select="."/>
+  </xsl:template>
+
+  <xsl:template match="comment()">
+    <xsl:copy-of select="."/>
+    <xsl:text>
+</xsl:text>
+  </xsl:template>
+    
+</xsl:stylesheet>
Index: /main/branches/stable_gs3/release-kits/shared/greenstone3/xsl/convert-build-xml.xsl
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/greenstone3/xsl/convert-build-xml.xsl	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/greenstone3/xsl/convert-build-xml.xsl	(revision 21851)
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<xsl:stylesheet version="1.0"
+  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+ <!-- we basically want to copy everything except for a few targets that no longer apply -->
+  <xsl:output method="xml"/>
+
+  <!-- for some reason, the default copy-of doesn't copy empty attributes, so have this to get the empty arg1 in equals-->
+  <xsl:template match="project|condition|and|isset|equals|not|or">
+    <xsl:copy>
+      <xsl:copy-of select="@*"/>
+      <xsl:apply-templates/>
+    </xsl:copy>
+  </xsl:template>
+  
+  <!-- delete the old install target-->
+  <xsl:template match="target[@name='install']"></xsl:template>
+
+  <!-- delete the unnecessary targets -->
+  <xsl:template match="target[starts-with(@name, 'prepare')]"></xsl:template>
+  <xsl:template match="target[starts-with(@name, 'cvsupdate')]"></xsl:template>
+  <xsl:template match="target[starts-with(@name, 'update')]"></xsl:template>
+  <xsl:template match="target[starts-with(@name, 'checkout')]"></xsl:template>
+  <xsl:template match="target[starts-with(@name, 'rename-gs2build')]"></xsl:template>
+  <xsl:template match="target[@name='test']"></xsl:template>
+  <xsl:template match="target[@name='get-macos-extra']"><target name="get-macos-extra"></target></xsl:template>
+  <xsl:template match="target[@name='get-windows-binaries']"></xsl:template>
+
+  <xsl:variable name="usage-for-dist" select="document('../../ant-scripts/operations-on-gs3home.xml')/project/target[@name='usage-for-binary-dist']"/>
+  
+  <!-- copy in our new usage target -->
+  <xsl:template match="target[@name='usage']">
+    <target name="usage">
+      <xsl:copy-of select="$usage-for-dist/@description|$usage-for-dist/node()"/>
+    </target>
+  </xsl:template>
+  
+  <xsl:template match="*">
+    <xsl:copy-of select="."/>
+  </xsl:template>
+
+  <xsl:template match="comment()">
+    <xsl:copy-of select="."/>
+    <xsl:text>
+</xsl:text>
+  </xsl:template>
+    
+</xsl:stylesheet>
Index: /main/branches/stable_gs3/release-kits/shared/linux/wrapper.cpp
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/linux/wrapper.cpp	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/linux/wrapper.cpp	(revision 21851)
@@ -0,0 +1,281 @@
+#include <iostream>
+#include <fstream>
+#include <iomanip>
+#include <string.h>
+#include <cstdlib>
+#include <sstream>
+using namespace std;
+
+#ifndef CDROM
+#include "wrapper.h"
+#include "libsearch4j.h"
+bool extract_bundled_file( const char[], int, char*, bool );
+#else
+bool prep_java( string wd );
+#endif
+
+void usage( char* progname, int exitvalue = -1 ) {
+	cerr
+		<< "Usage: " << progname << " [OPTIONS]" << endl
+		<< "OPTIONS: " << endl
+		<< " -h, -help			Display this usage message" << endl
+		<< " -text				Do a non-graphical command line installation" << endl;
+	#ifdef CDROM
+	cerr << " -wd PATH			Look for the CD-ROM at PATH" << endl;
+	#endif
+
+	exit( exitvalue );
+}
+
+int main(int argc, char** argv) {
+
+	char wdc[1024];
+	getcwd(wdc, sizeof(wdc));
+	string wd = "";
+	wd.append( wdc );
+	
+	string scratch = (getenv("TMPDIR") == NULL) ? "/tmp" : getenv("TMPDIR");
+	string tempdir = scratch + "/greenstone-installer.tmp"; //temporary directory where we will store extracted files
+	bool succeeded = false;
+	bool text_mode = false;
+
+	//parse arguments
+	string a;
+	for ( int i=1; i<argc; i++ ) {
+		a = argv[i];
+		if ( a.compare("-wd") == 0 ) {
+			wd = "";
+			wd.append( argv[++i] );
+		} else if ( a.compare("-h") == 0 || a.compare("-help") == 0 || a.compare("--help") == 0) {
+			usage( argv[0], 0 );
+		} else if ( a.compare("-text") == 0 || a.compare("text") == 0 ) {
+			text_mode = true;
+		} else {
+			cerr << "Unrecognised option '" << a << "'" << endl;
+			usage(argv[0]);
+		}
+	}
+
+	#ifdef CDROM
+	//ensure working directory is correct
+	FILE* pFile;
+	pFile = fopen( (wd+"/Software/core/all/uninst.jar").c_str(), "r");
+	if ( pFile == NULL ) {
+		cerr << "Could not find cdrom at '" << wd << "'." << endl;
+		cerr << "Please enter the path the CDROM [/media/cdrom]: ";
+		getline(cin, wd);
+		if ( wd.compare("") == 0 ) {
+			wd = "/media/cdrom";
+		}
+	} else {
+		fclose(pFile);
+	}
+
+	pFile = fopen( (wd+"/Software/core/all/uninst.jar").c_str(), "r");
+	if ( pFile == NULL ) {
+		cerr << "Could not find cdrom at '"<< wd << "'." << endl;
+		cerr << "Please run the installer again" << endl;
+		exit(-1);
+	} else {
+		fclose(pFile);
+	}
+	#endif
+
+	//create the temp folder
+	cout << "Creating temp directory..." << endl;
+	succeeded = ( 0 == system( ("mkdir " + tempdir).c_str() ) );
+	if ( !succeeded ) {
+		cerr << "Failed to create the temp directory '" << tempdir << "'. " <<
+		 "Check that it does not already exist. Also check that you have write " <<
+		 "permissions to '" << scratch << "', or set the environment variable TMPDIR to " <<
+		 "a directory where you do have write permissions." << endl <<
+		"Exiting" << endl;
+		return 1;
+	}
+	
+	#ifndef CDROM
+
+	string jarfile = tempdir + "/greenstone.jar"; //where we will store the jar file
+	string javafile = tempdir + "/@java.installer@"; //where we will store the java tar file
+
+
+	//extract files
+	cout << "Extracting installer jar..." << endl;
+	succeeded = extract_bundled_file( greenstonejar, sizeof(greenstonejar), (char*)jarfile.c_str(), false);
+
+	#ifdef java_is_bundled
+	cout << "Preparing Greenstone installer..." << endl;
+	succeeded = extract_bundled_file( java, sizeof(java), (char*)javafile.c_str(), true ) && succeeded;
+	#endif
+		
+	if ( !succeeded ) {
+		cerr << "Failed to extract one or more resources" << endl;
+		cerr << "This installer may not have sufficient file permissions to write it to disk" << endl;
+		cerr << "Or, the files may be corrupt or missing from this executable" << endl;
+		cerr << "Exiting" << endl;
+		return 1;
+	}
+
+	#endif
+
+	//change to the temp directory
+	chdir( tempdir.c_str() );
+
+
+	#ifndef CDROM
+	#ifdef java_is_bundled
+	succeeded = (system( "/bin/sh -c ./@java.installer@ > /dev/null" ) == 0);
+	succeeded = succeeded && ( system( "tar -xf jre.tar" ) == 0 );
+	if ( !succeeded ) {
+		cout << "Failed to extract the bundled java archive to the temp directory" << endl;
+		cout << "You need the tar program on your PATH" << endl;
+		cout << "Exiting" << endl;
+		return 1;
+	}
+	#endif
+
+	//check if an appropriate java is found
+	Jvm minimum; minimum.setVersionFromString( "@java.min.version@" );
+	string phint = "./@java.extracted@";
+	string hint = "";
+	Jvm foundJvm;
+	bool jvmFound = find( foundJvm, true, minimum, false, false, phint, hint, false );
+
+	//if the jvm was not found, report not found
+	if ( !jvmFound ) {
+
+		//did not find a good java
+		cout << "Greenstone requires java @java.min.version@ or greater." << endl;
+		
+		//tell them if java is absent or just too old
+		Jvm tmpJvm;
+		if ( find( tmpJvm, false, minimum, false, false, phint, hint, false ) ) {
+			cout << "You have java, but it is too old." << endl;
+		} else {
+			cout << "Could not find java on your system." << endl;
+		}
+		
+		cout << "Install java (@java.min.version@ or greater) and set JAVA_HOME or JRE_HOME, and try again" << endl;
+		#ifndef java_is_bundled
+		cout << "Or, download a greentsone3 installer with bundled java and use that instead of this one" << endl;
+		#endif
+
+	//if we have found it, launch the installer
+	} else {
+
+		cout << "Launching Installer ..." << endl;
+		int launch_exit_code = 0;
+		launch_exit_code = system( (foundJvm.getExecutable() + " -Xmx85M -jar greenstone.jar" + (text_mode?" text":"") ).c_str() );
+
+		//report how it went
+		if ( launch_exit_code == 0 ) {
+			cout << "Setup complete" << endl;
+		} else {
+			cout << "The installer exited with an error" << endl;
+			cout << "Greenstone may not be correctly installed" << endl;
+		}
+
+	}
+	#else
+		bool java_ready = prep_java( wd );
+		if ( java_ready ) {
+			string cmd = "./jre/bin/java -Dorig.dir=\"" + wd + "\" -jar " + wd + "/Java/Jars/linux.jar" + (text_mode?" text":"");
+			system( cmd.c_str() );
+		}
+	#endif
+
+	//change to the scratch dir for the following operation
+	chdir(scratch.c_str());
+
+	//delete the temp files
+	cout << "Deleting the temp directory" << endl;
+	system( ("rm -rf " + tempdir).c_str() );
+
+	return 0;
+
+}
+#ifndef CDROM
+bool extract_bundled_file( const char data[], int size, char* filename, bool make_executable) {
+
+	if ( size == 0 ) return false;
+
+	//delete the file if it exists
+	remove( filename );
+
+	//open the file
+	fstream binary_file( filename, ios::out|ios::binary );
+	if ( !binary_file.good() ) {
+		binary_file.close();
+		return false;
+	}
+
+	//write the file
+	binary_file.write( data, size );
+	if ( !binary_file.good() ) {
+		binary_file.close();
+		return false;
+	}
+
+	//close the file
+	binary_file.close();
+	if ( !binary_file.good() ) {
+		binary_file.close();
+		return false;
+	}
+
+	if ( make_executable ) {
+		string command = "chmod a+x " + string(filename);
+		system( command.c_str() );
+	}
+
+	return true;
+
+}
+#else
+
+bool prep_java( string wd ) {
+
+
+  string jTestCmd = "./jre/bin/java -version >/dev/null 2>&1";
+
+  //try to extract straight off cd
+  string j1cmd = wd + "/Java/Linux/jre_bin && tar -xf jre.tar && " + jTestCmd;
+  int j1status = system(j1cmd.c_str());
+  system("/bin/rm -f jre.tar");
+  
+  if (WEXITSTATUS(j1status)!=0) {
+    cerr << "Unable to extract java straight off CD-ROM." << endl;
+    cerr << "This is probably because your CD-ROM was mounted with 'noexec'." << endl;
+    cerr << "It can be changed by a system administrator" << endl << endl;
+    cerr << "Copying Java to local disk so it can be run" << endl;
+    
+    string cdtar_home = wd + "/Java/Linux/";
+    string tcmd = "(cd \"" + cdtar_home + "\" ; tar cf - jre_bin )";
+    tcmd += "| tar xvf - ";
+    //tcmd += "| awk 'BEGIN{C=0}{C++; printf(\".\"); if (C%70==0) printf(\"\\n\");}END{printf(\"\\n\")}'";
+
+    int tstatus = system(tcmd.c_str());
+    
+    if (WEXITSTATUS(tstatus)!=0) {
+      cerr << "Failed to copy Java to disk" << endl;
+      cerr << "Please make sure you have write permissions in the directory where you run the installer" << endl;
+    }
+    else {
+
+      string j2cmd = "./jre_bin && tar -xf jre.tar && " + jTestCmd;
+      int j2status = system(j2cmd.c_str());
+      system("/bin/rm -f jre.tar jre_bin");
+
+      if (WEXITSTATUS(j2status)!=0) {
+        cerr << "Unable to run copied Java" << endl;
+        return false;
+      }
+    }
+  }
+
+  // to get to here, full_java must be set (and working)
+
+  return true;
+}
+
+#endif
Index: /main/branches/stable_gs3/release-kits/shared/mac/Wrapper.app/Contents/Info.plist
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/mac/Wrapper.app/Contents/Info.plist	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/mac/Wrapper.app/Contents/Info.plist	(revision 21851)
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
+<plist version="0.9">
+<dict>
+
+	<key>CFBundleName</key>
+	<string>Greenstone@version@</string>
+
+	<key>CFBundleVersion</key>
+	<string>@version@</string>
+
+	<key>CFBundleAllowMixedLocalizations</key>
+	<string>true</string>
+
+	<key>CFBundleExecutable</key>
+	<string>JavaApplicationStub</string>
+
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+
+	<key>CFBundleGetInfoString</key>
+	<string>@version@</string>
+
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+
+	<key>CFBundleIconFile</key>
+	<string>icon.icns</string>
+
+	<key>Java</key>
+	<dict>
+
+		<key>MainClass</key>
+		<string>org.tp23.antinstaller.selfextract.NonExtractor</string>
+
+		<key>JVMVersion</key>
+		<string>1.4+</string>
+
+		<key>ClassPath</key>
+		<string>$JAVAROOT/@jar@</string>
+
+		<key>WorkingDirectory</key>
+		<string>/tmp</string>
+
+	        <key>VMOptions</key>
+        	<string>-Xmx85M</string>
+
+		<key>Properties</key> 
+		<dict>
+			<key>apple.laf.useScreenMenuBar</key>
+			<string>true</string>
+			<key>orig.dir</key>
+			<string>$APP_PACKAGE/..</string>
+		</dict>
+
+	</dict>
+
+</dict>
+</plist>
Index: /main/branches/stable_gs3/release-kits/shared/mac/Wrapper.app/Contents/PkgInfo
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/mac/Wrapper.app/Contents/PkgInfo	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/mac/Wrapper.app/Contents/PkgInfo	(revision 21851)
@@ -0,0 +1,1 @@
+APPLnull
Index: /main/branches/stable_gs3/release-kits/shared/resources/artwork/Icon-README.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/resources/artwork/Icon-README.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/resources/artwork/Icon-README.txt	(revision 21851)
@@ -0,0 +1,17 @@
+To create the MacOS icon, do
+* In GIMP, export the icon to tiff (png might be as good or better), fullsize (currently 128x128 [Aug 08])
+* You should also export a 16x16 icon to the same format, tweaked for readability at that small size
+* Go to a mac machine
+* run 'Icon Composer' and create the icon from the exported tiff
+	* drag fullsize tiff from finder to the appropriate panel in Icon Composer (currently the 128x128 panel)
+	* it should ask about copying the image to different sizes, opt for 'Copy to all smaller sizes'
+	* drag the 16x16 image to the 16x16 panel
+	* exit Icon Composer
+	* you will be asked where to save, save to shared/greenstone(2|3)/icon/icon.icns
+
+
+To create the Windows icon, do
+* In GIMP, export icons of these sizes: 128x128, 64x64, 48x48, 32x32, 16x16
+* 16x16 icon should have the edges cropped for readability at this small size
+* Open each as a layer in a new GIMP image (File->Open as Layer), and delete other layers (like 'Background')
+* Save as an ico file
Index: /main/branches/stable_gs3/release-kits/shared/windows/7za/copying.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/windows/7za/copying.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/windows/7za/copying.txt	(revision 21851)
@@ -0,0 +1,513 @@
+      GNU LESSER GENERAL PUBLIC LICENSE
+           Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+          Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+
+      GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+          NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+         END OF TERMS AND CONDITIONS
+
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
Index: /main/branches/stable_gs3/release-kits/shared/windows/7za/license.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/windows/7za/license.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/windows/7za/license.txt	(revision 21851)
@@ -0,0 +1,62 @@
+      7-Zip Command line version
+      ~~~~~~~~~~~~~~~~~~~~~~~~~~
+      License for use and distribution
+      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+      7-Zip Copyright (C) 1999-2007 Igor Pavlov.
+
+      7za.exe is distributed under the GNU LGPL + AES code license
+
+      The GNU LGPL + AES code license means that you must follow both GNU LGPL rules 
+      and AES code license rules.
+
+
+      Notes: 
+        You can use 7-Zip on any computer, including a computer in a commercial 
+        organization. You don't need to register or pay for 7-Zip.
+
+
+      GNU LGPL information
+      --------------------
+
+        This library is free software; you can redistribute it and/or
+        modify it under the terms of the GNU Lesser General Public
+        License as published by the Free Software Foundation; either
+        version 2.1 of the License, or (at your option) any later version.
+
+        This library is distributed in the hope that it will be useful,
+        but WITHOUT ANY WARRANTY; without even the implied warranty of
+        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+        Lesser General Public License for more details.
+
+        You should have received a copy of the GNU Lesser General Public
+        License along with this library; if not, write to the Free Software
+        Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+      AES code license
+      ----------------
+    
+        Copyright (c) 2001, Dr Brian Gladman
+
+        LICENSE TERMS
+
+        The free distribution and use of this software in both source and binary 
+        form is allowed (with or without changes) provided that:
+
+          1. distributions of this source code include the above copyright 
+             notice, this list of conditions and the following disclaimer;
+
+          2. distributions in binary form include the above copyright
+             notice, this list of conditions and the following disclaimer
+             in the documentation and/or other associated materials;
+
+          3. the copyright holder's name is not used to endorse products 
+             built using this software without specific written permission. 
+
+        DISCLAIMER
+
+        This software is provided 'as is' with no explicit or implied warranties
+        in respect of its properties, including, but not limited to, correctness 
+        and fitness for purpose.
+
Index: /main/branches/stable_gs3/release-kits/shared/windows/7za/readme.txt
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/windows/7za/readme.txt	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/windows/7za/readme.txt	(revision 21851)
@@ -0,0 +1,42 @@
+7-Zip Command line version 4.60
+-------------------------------
+
+7-Zip is a file archiver with high compression ratio.
+7za.exe is a standalone command line version of 7-Zip.
+
+7-Zip Copyright (C) 1999-2008 Igor Pavlov.
+
+Features of 7za.exe: 
+  - High compression ratio in new 7z format
+  - Supported formats:
+      - Packing / unpacking: 7z, ZIP, GZIP, BZIP2 and TAR 
+      - Unpacking only: Z
+  - Highest compression ratio for ZIP and GZIP formats.
+  - Fast compression and decompression
+  - Strong AES-256 encryption in 7z and ZIP formats.
+
+7za.exe is a free software distributed under the GNU LGPL + BSD LICENSE for AES part.
+Read license.txt for more information.
+
+Source code of 7za.exe and 7-Zip can be found at
+http://www.7-zip.org/
+
+7za.exe can work in Windows 95/98/ME/NT/2000/XP/2003/Vista.
+
+There is also port of 7za.exe for POSIX systems like Unix (Linux, Solaris, OpenBSD, 
+FreeBSD, Cygwin, AIX, ...), MacOS X and BeOS:
+
+http://p7zip.sourceforge.net/
+
+
+  This distributive packet contains the following files:
+
+  7za.exe       - 7-Zip standalone command line version.
+  readme.txt    - This file.
+  copying.txt   - GNU LGPL license.
+  license.txt   - License information.
+  7-zip.chm     - User's Manual in HTML Help format.
+
+
+---
+End of document
Index: /main/branches/stable_gs3/release-kits/shared/windows/Greenstone Wiki.url
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/windows/Greenstone Wiki.url	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/windows/Greenstone Wiki.url	(revision 21851)
@@ -0,0 +1,5 @@
+[InternetShortcut]
+URL=http://wiki.greenstone.org/
+IDList=
+[{000214A0-0000-0000-C000-000000000046}]
+Prop3=19,2
Index: /main/branches/stable_gs3/release-kits/shared/windows/installer-classes/com/orangevolt/tools/ant/JNLP-1.5.dtd
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/windows/installer-classes/com/orangevolt/tools/ant/JNLP-1.5.dtd	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/windows/installer-classes/com/orangevolt/tools/ant/JNLP-1.5.dtd	(revision 21851)
@@ -0,0 +1,472 @@
+<!--
+<!DOCTYPE jnlp PUBLIC "-//Sun Microsystems, Inc//DTD JNLP Discriptor 1.5//EN" "http://java.sun.com/dtd/JNLP-1.5.dtd">
+-->
+<!ELEMENT jnlp (information+, security?, resources*, 
+ (application-desc | applet-desc | component-desc |
+ installer-desc))>
+<!--
+The spec attribute of the jnlp element specifies what
+versions of the JNLP specification a particular JNLP file
+works with. The default value is "1.0+".
+-->
+<!ATTLIST jnlp spec CDATA #IMPLIED>
+<!--
+The version attribute of the jnlp element specifies the
+version of the application being launched, as well as the
+version of the JNLP file itself.
+-->
+<!ATTLIST jnlp version CDATA #IMPLIED>
+<!--
+The codebase attribute of the jnlp element specifies the
+codebase for the application. This is also used as the base
+URL for all relative URLs in href attributes.
+-->
+<!ATTLIST jnlp codebase CDATA #IMPLIED>
+<!--
+The href attribute of the jnlp element contains the location
+of the JNLP file as a URL.
+-->
+<!ATTLIST jnlp href CDATA #IMPLIED>
+<!--
+The information element contains various descriptive
+information about the application being launched.
+-->
+<!ELEMENT information (title?, vendor?, homepage?,
+description*, icon*,offline-allowed?, shortcut?,
+association?, related-content*)>
+<!--
+The os attribute of the information element specifies for
+which operating system this element should be considered.
+-->
+<!ATTLIST information os CDATA #IMPLIED>
+<!--
+The arch attribute of the information element specifies for
+what architecure this element should be considered.
+-->
+<!ATTLIST information arch CDATA #IMPLIED>
+<!--
+The platform attribute of the information element specifies
+for what platform this element should be considered.
+-->
+<!ATTLIST information platform CDATA #IMPLIED>
+<!--
+The locale attribute of the information element specifies the
+locale for which this information element should be used.
+-->
+<!ATTLIST information locale CDATA #IMPLIED>
+<!--
+The title element contains the name of the application.
+-->
+<!ELEMENT title (#PCDATA)>
+<!--
+The vendor element contains the name of the vendor.
+-->
+<!ELEMENT vendor (#PCDATA)>
+<!--
+The homepage element contains a href to the homepage for the
+application.
+-->
+<!ELEMENT homepage EMPTY>
+<!--
+The href attribute of the homepage element specifies the URL
+for the homepage.
+-->
+<!ATTLIST homepage href CDATA #REQUIRED>
+<!--
+The description element contains a description of the
+application.
+-->
+<!ELEMENT description (#PCDATA)>
+<!--
+The kind attribute for the description element indicates the
+use of a description element. The values are: i) one-line,
+for a one-line description, ii) short, for a one paragraph
+description, and iii) tooltip, for a tool-tip description.
+Longer descriptions should be put on a separate web page and
+referred to using the homepage element.
+-->
+<!ATTLIST description kind (one-line | short | tooltip)
+#IMPLIED>
+<!--
+The icon element describes an image for an application.
+-->
+<!ELEMENT icon EMPTY>
+<!--
+The href attribute of an icon contains a URL to a location on
+the web containing an image file for an icon.
+-->
+<!ATTLIST icon href CDATA #REQUIRED>
+<!--
+The version attribute of an icon contains a string describing
+the version of the image that is requested.
+-->
+<!ATTLIST icon version CDATA #IMPLIED>
+<!--
+The width attribute of the icon element describes the width
+of the icon in pixels.
+-->
+<!ATTLIST icon width CDATA #IMPLIED>
+<!--
+The height attribute of the icon element describes the height
+of the icon in pixels.
+-->
+<!ATTLIST icon height CDATA #IMPLIED>
+<!--
+The kind attribute of the icon element describes the use of
+the icon.
+-->
+<!ATTLIST icon kind CDATA #IMPLIED>
+<!--
+The depth attribute of the icon element describes the color
+depth of the image in bits-per-pixel. Common values will be
+8, 16, or 24.
+-->
+<!ATTLIST icon depth CDATA #IMPLIED>
+<!--
+The size attribute of an icon element indicates the size of
+an icon file in bytes.
+-->
+<!ATTLIST icon size CDATA #IMPLIED>
+<!--
+The offline-allowed element indicates if the application can
+be launched offline. Default value (i.e., if the element is
+not specified) is online.
+-->
+<!ELEMENT offline-allowed EMPTY>
+<!--
+The security element describes the security requirements of
+the application.
+-->
+<!ELEMENT security (all-permissions?,
+j2ee-application-client-permissions?)>
+<!--
+The all-permissions element indicates that the application
+needs full access the the local system and network.
+-->
+<!ELEMENT all-permissions EMPTY>
+<!--
+The j2ee-application-client-permissions element indicates
+that the application needs the set of permissions defined for
+a J2EE application client.
+-->
+<!ELEMENT j2ee-application-client-permissions EMPTY>
+<!--
+The resources element contains an ordered set of resources
+that constitutes an application.
+-->
+<!ELEMENT resources (j2se | jar | nativelib | extension |
+property | package)*>
+<!--
+The os attribute of the resources element specifies for which
+operating system this element should be considered.
+-->
+<!ATTLIST resources os CDATA #IMPLIED>
+<!--
+The arch attribute of the resources element specifies for
+what platform this element should be considered.
+-->
+<!ATTLIST resources arch CDATA #IMPLIED>
+<!--
+The locale attribute of the resources element specifies for
+which locales this element should be considered.
+-->
+<!ATTLIST resources locale CDATA #IMPLIED>
+<!--
+The j2se element describes a supported JRE version and an
+optional resources element to be used by the particular JRE.
+-->
+<!ELEMENT j2se (resources*)>
+<!--
+The version attribute of the j2se element describes the
+versions of the JRE that this application is supported on.
+-->
+<!ATTLIST j2se version CDATA #REQUIRED>
+<!--
+The href attribute of the j2se element specifies the location
+where the JRE should be downloaded from.
+-->
+<!ATTLIST j2se href CDATA #IMPLIED>
+<!--
+The initial-heap-size attribute of the j2se element specifies
+the initial size of the object heap.
+-->
+<!ATTLIST j2se initial-heap-size CDATA #IMPLIED>
+<!--
+The max-heap-size attribute of the j2se element specifies the
+preferred maximum size of the object heap.
+-->
+<!ATTLIST j2se max-heap-size CDATA #IMPLIED>
+<!--
+The java-vm-args attribute of the j2se element specifies a
+preferred set of virtual machine arguments to use when
+launching java.
+-->
+<!ATTLIST j2se java-vm-args CDATA #IMPLIED>
+<!--
+The jar element describes a jar file resource.
+-->
+<!ELEMENT jar EMPTY>
+<!--
+The href attribute of the jar element contains the location
+of a jar file as a URL.
+-->
+<!ATTLIST jar href CDATA #REQUIRED>
+<!--
+The version attribute of a jar element describes the version
+of a particular JAR file that is requested.
+-->
+<!ATTLIST jar version CDATA #IMPLIED>
+<!--
+The main attribute of a jar element indicates whether this
+element contains the main class.
+-->
+<!ATTLIST jar main (true|false) "false">
+<!--
+The download attribute of a jar element indicates if this
+element must be downloaded before an application is launched
+(eager), or not (lazy).
+-->
+<!ATTLIST jar download (eager | lazy) "eager">
+<!--
+The size attribute of a jar element indicates the size of a
+JAR file in bytes.
+-->
+<!ATTLIST jar size CDATA #IMPLIED>
+<!--
+The part attribute of a jar element describes the name of the
+group it belongs too.
+-->
+<!ATTLIST jar part CDATA #IMPLIED>
+<!--
+The nativelib element describes a resource containing native
+files.
+-->
+<!ELEMENT nativelib EMPTY>
+<!--
+The href attribute of a nativelib element contains the
+location of a nativelib file as a URL.
+-->
+<!ATTLIST nativelib href CDATA #REQUIRED>
+<!--
+The version attribute of a nativelib element describes the
+version of a particular nativelib file that is requested.
+-->
+<!ATTLIST nativelib version CDATA #IMPLIED>
+<!--
+The download attribute of a nativelib element indicates if
+this element must be downloaded before an application is
+launched (eager), or not (lazy).
+-->
+<!ATTLIST nativelib download (eager | lazy) "eager">
+<!--
+The size attribute of a nativelib element indicates the size
+of a nativelib file in bytes.
+-->
+<!ATTLIST nativelib size CDATA #IMPLIED>
+<!--
+The part attribute of a nativelib element describes the name
+of the part it belongs to.
+-->
+<!ATTLIST nativelib part CDATA #IMPLIED>
+<!--
+The extension element describes an extension that is required
+in order to run the application.
+-->
+<!ELEMENT extension (ext-download*)>
+<!--
+The version attribute of an extension element specifies the
+version of the extension requested.
+-->
+<!ATTLIST extension version CDATA #IMPLIED>
+<!--
+The name attribute of an extension element specifies the name
+of the extension.
+-->
+<!ATTLIST extension name CDATA #IMPLIED>
+<!--
+The href attribute of an extension element specifies the
+location of the extension.
+-->
+<!ATTLIST extension href CDATA #REQUIRED>
+<!--
+The ext-download element defines how parts of the extension
+are downloaded.
+-->
+<!ELEMENT ext-download EMPTY>
+<!--
+The ext-part attribute of an ext-download element describes
+the name of a part in the extension.
+-->
+<!ATTLIST ext-download ext-part CDATA #REQUIRED>
+<!--
+The download attribute of an ext-download element describes
+if the resource may be lazily downloaded.
+-->
+<!ATTLIST ext-download download (lazy|eager) "eager">
+<!--
+The part attribute of an ext-download element describes the
+name of the part it belongs to in the current JNLP file.
+-->
+<!ATTLIST ext-download part CDATA #IMPLIED>
+<!--
+The property element describes a name/value pair that is
+available to the launched application as a system property.
+-->
+<!ELEMENT property EMPTY>
+<!--
+The name attribute of the property element describes the name
+of a system property.
+-->
+<!ATTLIST property name CDATA #REQUIRED>
+<!--
+The value element describes the value of a system property.
+-->
+<!ATTLIST property value CDATA #REQUIRED>
+<!--
+The package element defines a relationship between a Java
+package or class name and a part.
+-->
+<!ELEMENT package EMPTY>
+<!--
+The name attribute of the package element describes the name
+of a package or class.
+-->
+<!ATTLIST package name CDATA #REQUIRED>
+<!--
+The part attribute of the package element describes the part
+that contains the specified package or class.
+-->
+<!ATTLIST package part CDATA #REQUIRED>
+<!--
+The recursive attribute of the package element indicates if
+all sub-packages of this particular package is also included.
+-->
+<!ATTLIST package recursive (true|false) "false">
+<!--
+The application-desc element describes how to launch a
+Java-based application. It contains information about the
+main class and arguments.
+-->
+<!ELEMENT application-desc (argument*)>
+<!--
+The main-class attribute of the application-desc element
+describes the main class of an application.
+-->
+<!ATTLIST application-desc main-class CDATA #IMPLIED>
+<!--
+The argument elements describe the ordered set of arguments
+to an application. These arguments will be passed into the
+main method of the application's main class.
+-->
+<!ELEMENT argument (#PCDATA)>
+<!--
+The applet-desc element describes how to launch a Java
+Technology-based Applet. It contains information about, e.g.,
+the main class, size, and parameters.
+-->
+<!ELEMENT applet-desc (param*)>
+<!--
+The documentbase attribute of the applet-desc element
+describes the documentbase for the applet as a URL.
+-->
+<!ATTLIST applet-desc documentbase CDATA #IMPLIED>
+<!--
+The main-class attribute of the applet-desc element describes
+the name of the main Applet class.
+-->
+<!ATTLIST applet-desc main-class CDATA #REQUIRED>
+<!--
+The name attribute of the applet-desc element describes the
+name of the Applet.
+-->
+<!ATTLIST applet-desc name CDATA #REQUIRED>
+<!--
+The width attribute of the applet-desc element describes the
+width of the Applet in pixels.
+-->
+<!ATTLIST applet-desc width CDATA #REQUIRED>
+<!--
+The height attribute of the applet-desc element describes the
+height of the Applet in pixels.
+-->
+<!ATTLIST applet-desc height CDATA #REQUIRED>
+<!--
+The param element describes a parameter to an Applet.
+-->
+<!ELEMENT param EMPTY>
+<!--
+The name attribute of the param element describes the name of
+a parameter.
+-->
+<!ATTLIST param name CDATA #REQUIRED>
+<!--
+The value attribute of the param element describes the value
+of a parameter.
+-->
+<!ATTLIST param value CDATA #REQUIRED>
+<!--
+The component-desc element specifies a component extension.
+-->
+<!ELEMENT component-desc EMPTY>
+<!--
+The installer-desc element specifies an installer extension.
+-->
+<!ELEMENT installer-desc EMPTY>
+<!--
+The main-class attribute of the installer-desc element
+describes the main class for the installer/uninstaller.
+-->
+<!ATTLIST installer-desc main-class CDATA #IMPLIED>
+<!--
+The shortcut element describes an application's preferences
+for desktop integration.
+-->
+<!ELEMENT shortcut (desktop?, menu?)>
+<!--
+The online attribute of the shortcut element describes an
+application's preferences launching shortcuts online or
+offline
+-->
+<!ATTLIST shortcut online (true | false) "true">
+<!--
+The desktop element indicates that a shortcut on the desktop
+is desired.
+-->
+<!ELEMENT desktop EMPTY>
+<!--
+The menu element indicates that a shortcut in a menu is
+desired.
+-->
+<!ELEMENT menu EMPTY>
+<!--
+The submenu attribute of the menu element indicates where in
+the menu a shortcut is desired.
+-->
+<!ATTLIST menu submenu CDATA #IMPLIED>
+<!--
+The association element describes an application's
+preferences for desktop associations.
+-->
+<!ELEMENT association EMPTY>
+<!--
+The extensions attribute of the association element indicates
+a list of extensions to associate.
+-->
+<!ATTLIST association extensions CDATA #REQUIRED>
+<!--
+The mime-type attribute of the association element indicates
+a mime-types to associate.
+-->
+<!ATTLIST association mime-type CDATA #REQUIRED>
+<!--
+The related-content element described additional content that
+may be integrated with the application.
+-->
+<!ELEMENT related-content (title?, description*, icon*)>
+<!--
+The href attribute of the related-content element contains a
+URL to a location on the web containing additional related
+content for the application.
+-->
+<!ATTLIST related-content href CDATA #REQUIRED>
+ 
Index: /main/branches/stable_gs3/release-kits/shared/windows/installer-classes/com/orangevolt/tools/ant/JNLP-6.0.dtd
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/windows/installer-classes/com/orangevolt/tools/ant/JNLP-6.0.dtd	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/windows/installer-classes/com/orangevolt/tools/ant/JNLP-6.0.dtd	(revision 21851)
@@ -0,0 +1,690 @@
+<!--
+<!DOCTYPE jnlp PUBLIC "-//Sun Microsystems, Inc//DTD JNLP Discriptor 6.0//EN" "http://java.sun.com/dtd/JNLP-6.0.dtd">
+-->
+<!-- 
+The root element for the JNLP file.  
+-->
+
+<!ELEMENT jnlp (information+, security?, update?, resources*, 
+ (application-desc | applet-desc | component-desc | installer-desc))>
+
+<!--
+The spec attribute of the jnlp element specifies what versions of the JNLP 
+specification a particular JNLP file works with. The default value is "1.0+".
+-->
+
+<!ATTLIST jnlp spec CDATA #IMPLIED>
+
+<!--
+The version attribute of the jnlp element specifies the version of the 
+application being launched, as well as the version of the JNLP file itself.
+-->
+
+<!ATTLIST jnlp version CDATA #IMPLIED>
+
+<!--
+The codebase attribute of the jnlp element specifies the codebase for the 
+application. This is also used as the base URL for all relative URLs in 
+href attributes.
+-->
+
+<!ATTLIST jnlp codebase CDATA #IMPLIED>
+
+<!--
+The href attribute of the jnlp element contains the location of the JNLP 
+file as a URL.
+-->
+
+<!ATTLIST jnlp href CDATA #IMPLIED>
+
+<!--
+The information element contains various descriptive information about the 
+application being launched.
+-->
+
+<!ELEMENT information (title, vendor, homepage?, description*, icon*,
+ offline-allowed?, shortcut?, association?, related-content*)>
+
+<!--
+The os attribute of the information element specifies for which operating 
+system this element should be considered.
+-->
+
+<!ATTLIST information os CDATA #IMPLIED>
+
+<!--
+The arch attribute of the information element specifies for what architecure 
+this element should be considered.
+-->
+
+<!ATTLIST information arch CDATA #IMPLIED>
+
+<!--
+The platform attribute of the information element specifies for what 
+platform this element should be considered.
+-->
+
+<!ATTLIST information platform CDATA #IMPLIED>
+
+<!--
+The locale attribute of the information element specifies the locale for 
+which this information element should be used.
+-->
+
+<!ATTLIST information locale CDATA #IMPLIED>
+
+<!--
+The title element contains the name of the application.
+-->
+
+<!ELEMENT title (#PCDATA)>
+
+<!--
+The vendor element contains the name of the vendor.
+-->
+
+<!ELEMENT vendor (#PCDATA)>
+
+<!--
+The homepage element contains a href to the homepage for the application.
+-->
+
+<!ELEMENT homepage EMPTY>
+
+<!--
+The href attribute of the homepage element specifies the URL for the homepage.
+-->
+
+<!ATTLIST homepage href CDATA #REQUIRED>
+
+<!--
+The description element contains a description of the application.
+-->
+
+<!ELEMENT description (#PCDATA)>
+
+<!--
+The kind attribute for the description element indicates the use of a 
+description element. The values are: i) one-line, for a one-line 
+description, ii) short, for a one paragraph description, and iii) tooltip, 
+for a tool-tip description. Longer descriptions should be put on a separate 
+web page and referred to using the homepage element.
+-->
+
+<!ATTLIST description kind (one-line | short | tooltip) #IMPLIED>
+
+<!--
+The icon element describes an image for an application.
+-->
+
+<!ELEMENT icon EMPTY>
+
+<!--
+The href attribute of an icon contains a URL to a location on the web 
+containing an image file for an icon.
+-->
+
+<!ATTLIST icon href CDATA #REQUIRED>
+
+<!--
+The version attribute of an icon contains a string describing the version of 
+the image that is requested.
+-->
+
+<!ATTLIST icon version CDATA #IMPLIED>
+
+<!--
+The width attribute of the icon element describes the width of the icon 
+in pixels.
+-->
+
+<!ATTLIST icon width CDATA #IMPLIED>
+
+<!--
+The height attribute of the icon element describes the height of the icon 
+in pixels.
+-->
+
+<!ATTLIST icon height CDATA #IMPLIED>
+
+<!--
+The kind attribute of the icon element describes the use of the icon.
+-->
+
+<!ATTLIST icon kind CDATA #IMPLIED>
+
+<!--
+The depth attribute of the icon element describes the color depth of the image 
+in bits-per-pixel. Common values will be 8, 16, or 24.
+-->
+
+<!ATTLIST icon depth CDATA #IMPLIED>
+
+<!--
+The size attribute of an icon element indicates the size of an icon file 
+in bytes.
+-->
+
+<!ATTLIST icon size CDATA #IMPLIED>
+
+<!--
+The offline-allowed element indicates if the application can be launched 
+offline. Default value (i.e., if the element is not specified) is online.
+-->
+
+<!ELEMENT offline-allowed EMPTY>
+
+<!--
+The security element describes the security requirements of the application.
+-->
+
+<!ELEMENT security (all-permissions?, j2ee-application-client-permissions?)>
+
+<!--
+The all-permissions element indicates that the application needs full access 
+the the local system and network.
+-->
+
+<!ELEMENT all-permissions EMPTY>
+
+<!--
+The j2ee-application-client-permissions element indicates that the application 
+needs the set of permissions defined for a J2EE application client.
+-->
+
+<!ELEMENT j2ee-application-client-permissions EMPTY>
+
+<!--
+The update element contains the applications preference for application update.
+-->
+
+<!ELEMENT update EMPTY>
+
+<!--
+The check attribute of the update element indicates the applications 
+preference for when to check for updates.
+-->
+
+<!ATTLIST update check (always | timeout | background) "timeout">
+
+<!--
+The policy attribute of the update element indicates the applications 
+preference for what to do when updates are available.
+-->
+
+<!ATTLIST update policy (always | prompt-update | prompt-run) "always">
+
+<!--
+The resources element contains an ordered set of resources that 
+constitutes an application.
+-->
+
+<!ELEMENT resources (java | j2se | jar | nativelib | extension | 
+ property | package)*>
+
+<!--
+The os attribute of the resources element specifies for which operating 
+system this element should be considered.
+-->
+
+<!ATTLIST resources os CDATA #IMPLIED>
+
+<!--
+The arch attribute of the resources element specifies for what platform this 
+element should be considered.
+-->
+
+<!ATTLIST resources arch CDATA #IMPLIED>
+
+<!--
+The locale attribute of the resources element specifies for which locales 
+this element should be considered.
+-->
+
+<!ATTLIST resources locale CDATA #IMPLIED>
+
+<!--
+The java element describes a supported JRE version and an optional resources 
+element to be used by the particular JRE.
+-->
+
+<!ELEMENT java (resources*)>
+
+<!--
+The version attribute of the java element describes the versions of the JRE 
+that this application is supported on.
+-->
+
+<!ATTLIST java version CDATA #REQUIRED>
+
+<!--
+The href attribute of the java element specifies the location where the JRE 
+should be downloaded from.
+-->
+
+<!ATTLIST java href CDATA #IMPLIED>
+
+<!--
+The initial-heap-size attribute of the java element specifies the initial 
+size of the object heap.
+-->
+
+<!ATTLIST java initial-heap-size CDATA #IMPLIED>
+
+<!--
+The max-heap-size attribute of the java element specifies the preferred 
+maximum size of the object heap.
+-->
+
+<!ATTLIST java max-heap-size CDATA #IMPLIED>
+
+<!--
+The java-vm-args attribute of the java element specifies a preferred set of 
+virtual machine arguments to use when launching java.
+-->
+
+<!ATTLIST java java-vm-args CDATA #IMPLIED>
+
+<!--
+The j2se element describes a supported JRE version and an optional resources 
+element to be used by the particular JRE.
+-->
+
+<!ELEMENT j2se (resources*)>
+
+<!--
+The version attribute of the j2se element describes the versions of the JRE 
+that this application is supported on.
+-->
+
+<!ATTLIST j2se version CDATA #REQUIRED>
+
+<!--
+The href attribute of the j2se element specifies the location where the JRE 
+should be downloaded from.
+-->
+
+<!ATTLIST j2se href CDATA #IMPLIED>
+
+<!--
+The initial-heap-size attribute of the j2se element specifies the initial 
+size of the object heap.
+-->
+
+<!ATTLIST j2se initial-heap-size CDATA #IMPLIED>
+
+<!--
+The max-heap-size attribute of the j2se element specifies the preferred 
+maximum size of the object heap.
+-->
+
+<!ATTLIST j2se max-heap-size CDATA #IMPLIED>
+
+<!--
+The java-vm-args attribute of the j2se element specifies a preferred set of 
+virtual machine arguments to use when launching java.
+-->
+
+<!ATTLIST j2se java-vm-args CDATA #IMPLIED>
+
+<!--
+The jar element describes a jar file resource.
+-->
+
+<!ELEMENT jar EMPTY>
+
+<!--
+The href attribute of the jar element contains the location of a jar file 
+as a URL.
+-->
+
+<!ATTLIST jar href CDATA #REQUIRED>
+
+<!--
+The version attribute of a jar element describes the version of a particular 
+JAR file that is requested.
+-->
+
+<!ATTLIST jar version CDATA #IMPLIED>
+
+<!--
+The main attribute of a jar element indicates whether this element contains 
+the main class.
+-->
+
+<!ATTLIST jar main (true|false) "false">
+
+<!--
+The download attribute of a jar element indicates if this element must be 
+downloaded before an application is launched (eager), or not (lazy).
+-->
+
+<!ATTLIST jar download (eager | lazy) "eager">
+
+<!--
+The size attribute of a jar element indicates the size of a JAR file in bytes.
+-->
+
+<!ATTLIST jar size CDATA #IMPLIED>
+
+<!--
+The part attribute of a jar element describes the name of the group it 
+belongs too.
+-->
+
+<!ATTLIST jar part CDATA #IMPLIED>
+
+<!--
+The nativelib element describes a resource containing native files.
+-->
+
+<!ELEMENT nativelib EMPTY>
+
+<!--
+The href attribute of a nativelib element contains the location of a 
+nativelib file as a URL.
+-->
+
+<!ATTLIST nativelib href CDATA #REQUIRED>
+
+<!--
+The version attribute of a nativelib element describes the version of a 
+particular nativelib file that is requested.
+-->
+
+<!ATTLIST nativelib version CDATA #IMPLIED>
+
+<!--
+The download attribute of a nativelib element indicates if this element 
+must be downloaded before an application is launched (eager), or not (lazy).
+-->
+
+<!ATTLIST nativelib download (eager | lazy) "eager">
+
+<!--
+The size attribute of a nativelib element indicates the size of a nativelib 
+file in bytes.
+-->
+
+<!ATTLIST nativelib size CDATA #IMPLIED>
+
+<!--
+The part attribute of a nativelib element describes the name of the part it 
+belongs to.
+-->
+
+<!ATTLIST nativelib part CDATA #IMPLIED>
+
+<!--
+The extension element describes an extension that is required in order to 
+run the application.
+-->
+
+<!ELEMENT extension (ext-download*)>
+
+<!--
+The version attribute of an extension element specifies the version of the 
+extension requested.
+-->
+
+<!ATTLIST extension version CDATA #IMPLIED>
+
+<!--
+The name attribute of an extension element specifies the name of the extension.
+-->
+
+<!ATTLIST extension name CDATA #IMPLIED>
+
+<!--
+The href attribute of an extension element specifies the location of the 
+extension.
+-->
+
+<!ATTLIST extension href CDATA #REQUIRED>
+
+<!--
+The ext-download element defines how parts of the extension are downloaded.
+-->
+
+<!ELEMENT ext-download EMPTY>
+
+<!--
+The ext-part attribute of an ext-download element describes the name of a 
+part in the extension.
+-->
+
+<!ATTLIST ext-download ext-part CDATA #REQUIRED>
+
+<!--
+The download attribute of an ext-download element describes if the resource 
+may be lazily downloaded.
+-->
+
+<!ATTLIST ext-download download (lazy|eager) "eager">
+
+<!--
+The part attribute of an ext-download element describes the name of the 
+part it belongs to in the current JNLP file.
+-->
+
+<!ATTLIST ext-download part CDATA #IMPLIED>
+
+<!--
+The property element describes a name/value pair that is available to the 
+launched application as a system property.
+-->
+
+<!ELEMENT property EMPTY>
+
+<!--
+The name attribute of the property element describes the name of a system 
+property.
+-->
+
+<!ATTLIST property name CDATA #REQUIRED>
+
+<!--
+The value element describes the value of a system property.
+-->
+
+<!ATTLIST property value CDATA #REQUIRED>
+
+<!--
+The package element defines a relationship between a Java package or 
+class name and a part.
+-->
+
+<!ELEMENT package EMPTY>
+
+<!--
+The name attribute of the package element describes the name of a package 
+or class.
+-->
+
+<!ATTLIST package name CDATA #REQUIRED>
+
+<!--
+The part attribute of the package element describes the part that contains 
+the specified package or class.
+-->
+
+<!ATTLIST package part CDATA #REQUIRED>
+
+<!--
+The recursive attribute of the package element indicates if all sub-packages 
+of this particular package is also included.
+-->
+
+<!ATTLIST package recursive (true|false) "false">
+
+<!--
+The application-desc element describes how to launch a Java-based application. 
+It contains information about the main class and arguments.
+-->
+
+<!ELEMENT application-desc (argument*)>
+
+<!--
+The main-class attribute of the application-desc element describes the 
+main class of an application.
+-->
+
+<!ATTLIST application-desc main-class CDATA #IMPLIED>
+
+<!--
+The argument elements describe the ordered set of arguments to an application. 
+These arguments will be passed into the main method of the application's 
+main class.
+-->
+
+<!ELEMENT argument (#PCDATA)>
+
+<!--
+The applet-desc element describes how to launch a Java Technology-based Applet. It contains information about, e.g., the main class, size, and parameters.
+-->
+
+<!ELEMENT applet-desc (param*)>
+
+<!--
+The documentbase attribute of the applet-desc element describes the 
+documentbase for the applet as a URL.
+-->
+
+<!ATTLIST applet-desc documentbase CDATA #IMPLIED>
+
+<!--
+The main-class attribute of the applet-desc element describes the name of the 
+main Applet class.
+
+-->
+
+<!ATTLIST applet-desc main-class CDATA #REQUIRED>
+
+<!--
+The name attribute of the applet-desc element describes the name of the Applet.
+-->
+
+<!ATTLIST applet-desc name CDATA #REQUIRED>
+
+<!--
+The width attribute of the applet-desc element describes the width of the 
+Applet in pixels.
+-->
+
+<!ATTLIST applet-desc width CDATA #REQUIRED>
+
+<!--
+The height attribute of the applet-desc element describes the height of the 
+Applet in pixels.
+-->
+
+<!ATTLIST applet-desc height CDATA #REQUIRED>
+
+<!--
+The param element describes a parameter to an Applet.
+-->
+
+<!ELEMENT param EMPTY>
+
+<!--
+The name attribute of the param element describes the name of a parameter.
+-->
+
+<!ATTLIST param name CDATA #REQUIRED>
+
+<!--
+The value attribute of the param element describes the value of a parameter.
+
+-->
+
+<!ATTLIST param value CDATA #REQUIRED>
+
+<!--
+The component-desc element specifies a component extension.
+-->
+
+<!ELEMENT component-desc EMPTY>
+
+<!--
+The installer-desc element specifies an installer extension.
+-->
+
+<!ELEMENT installer-desc EMPTY>
+
+<!--
+The main-class attribute of the installer-desc element describes the 
+main class for the installer/uninstaller.
+-->
+
+<!ATTLIST installer-desc main-class CDATA #IMPLIED>
+
+<!--
+The shortcut element describes an application's preferences for desktop 
+integration.
+-->
+
+<!ELEMENT shortcut (desktop?, menu?)>
+
+<!--
+The online attribute of the shortcut element describes an application's 
+preferences launching shortcuts online or offline
+-->
+
+<!ATTLIST shortcut online (true | false) "true">
+
+<!--
+The desktop element indicates that a shortcut on the desktop is desired.
+-->
+
+<!ELEMENT desktop EMPTY>
+
+<!--
+The menu element indicates that a shortcut in a menu is desired.
+-->
+
+<!ELEMENT menu EMPTY>
+
+<!--
+The submenu attribute of the menu element indicates where in the menu a 
+shortcut is desired.
+-->
+
+<!ATTLIST menu submenu CDATA #IMPLIED>
+
+<!--
+The association element describes an application's preferences for desktop 
+associations.
+-->
+
+<!ELEMENT association (description?, icon?)>
+
+<!--
+The extensions attribute of the association element indicates a list of 
+extensions to associate.
+-->
+
+<!ATTLIST association extensions CDATA #REQUIRED>
+
+<!--
+The mime-type attribute of the association element indicates a mime-types 
+to associate.
+-->
+
+<!ATTLIST association mime-type CDATA #REQUIRED>
+
+<!--
+The related-content element described additional content that may be 
+integrated with the application.
+-->
+
+<!ELEMENT related-content (title?, description?, icon?)>
+
+<!--
+The href attribute of the related-content element contains a URL to a 
+location on the web containing additional related content for the application.
+-->
+
+<!ATTLIST related-content href CDATA #REQUIRED>
+
+ 
+
Index: /main/branches/stable_gs3/release-kits/shared/windows/installer-classes/com/orangevolt/tools/ant/jstub.sh
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/windows/installer-classes/com/orangevolt/tools/ant/jstub.sh	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/windows/installer-classes/com/orangevolt/tools/ant/jstub.sh	(revision 21851)
@@ -0,0 +1,53 @@
+#!/bin/sh
+# 
+# Copyright 2005 Orangevolt (www.orangevolt.com)
+
+abs_file()
+{
+ FIRST_CHAR=`echo $1 | cut -c1`
+ if [ "${FIRST_CHAR}" = "/" ]
+ then
+  absolutepath=$1
+ else
+  PWD=`pwd`
+  absolutepath="${PWD}/$1"
+ fi
+}
+
+get_abs_file()
+{
+  abs_file $1
+  if [ -L "$absolutepath" ]; then
+           absolutepath=`ls -l $absolutepath | cut -d\> -f2`
+           abs_file $absolutepath
+#           echo "File is a link: $absolutepath"
+           get_abs_file $absolutepath
+#  else
+#           echo "File is not a link: $absolutepath"
+  fi
+}
+
+get_abs_file $0
+
+# now absolutepath is valid
+#echo $absolutepath
+
+path=${absolutepath%/*}
+# now path is valid
+#echo $path
+
+absolutename=${absolutepath##*/}
+# now absolutepath is valid
+#echo $absolutename
+
+name=${absolutename%%.*}
+# now name is valid
+#echo $name
+
+command="__EXECUTABLE_STRING__"
+echo "executing \"$command\" $@" 
+
+$command $@
+
+exit
+#### archive starts here ####
Index: /main/branches/stable_gs3/release-kits/shared/windows/installer-classes/com/orangevolt/tools/ant/stub.sh
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/windows/installer-classes/com/orangevolt/tools/ant/stub.sh	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/windows/installer-classes/com/orangevolt/tools/ant/stub.sh	(revision 21851)
@@ -0,0 +1,63 @@
+#!/bin/sh
+# 
+# Copyright 2005 Orangevolt (www.orangevolt.com)
+
+abs_file()
+{
+ FIRST_CHAR=`echo $1 | cut -c1`
+ if [ "${FIRST_CHAR}" = "/" ]
+ then
+  absolutepath=$1
+ else
+  PWD=`pwd`
+  absolutepath="${PWD}/$1"
+ fi
+}
+
+get_abs_file()
+{
+  abs_file $1
+  if [ -L "$absolutepath" ]; then
+           absolutepath=`ls -l $absolutepath | cut -d\> -f2`
+           abs_file $absolutepath
+#           echo "File is a link: $absolutepath"
+           get_abs_file $absolutepath
+#  else
+#           echo "File is not a link: $absolutepath"
+  fi
+}
+
+get_abs_file $0
+
+# now absolutepath is valid
+#echo $absolutepath
+
+path=${absolutepath%/*}
+# now path is valid
+#echo $path
+
+absolutename=${absolutepath##*/}
+# now absolutepath is valid
+#echo $absolutename
+
+name=${absolutename%%.*}
+# now name is valid
+#echo $name
+
+exe="__EXECUTABLE__NAME__"
+path="__EXECUTABLE__PATH__"
+
+if [ ! -d "/tmp/$absolutename" ] 
+then
+ mkdir /tmp/$absolutename
+fi
+unzip -o -qq $0 -d /tmp/$absolutename  >/dev/null 2>&1
+
+echo "cd /tmp/$absolutename$path"
+cd /tmp/$absolutename$path
+#chmod 755 $exe
+#echo "$exe $@"
+$exe $@
+
+exit 0
+##### zipped content starts here ####
Index: /main/branches/stable_gs3/release-kits/shared/windows/installer-classes/com/orangevolt/tools/ant/taskdefs.properties
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/windows/installer-classes/com/orangevolt/tools/ant/taskdefs.properties	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/windows/installer-classes/com/orangevolt/tools/ant/taskdefs.properties	(revision 21851)
@@ -0,0 +1,19 @@
+sfx=com.orangevolt.tools.ant.SFXTask
+jstub=com.orangevolt.tools.ant.JStubTask
+jnlp=com.orangevolt.tools.ant.JNLPTask
+preferences=com.orangevolt.tools.ant.PreferencesTask
+win32.registry=com.orangevolt.tools.ant.Win32RegistryTask
+win32.shortcut=com.orangevolt.tools.ant.Win32ShortcutTask
+win32.properties=com.orangevolt.tools.ant.Win32PropertiesTask
+win32.replaceicon=com.orangevolt.tools.ant.Win32ReplaceIconTask
+properties=com.orangevolt.tools.ant.PropertiesTask
+find=com.orangevolt.tools.ant.FindTask
+compare=com.orangevolt.tools.ant.CompareTask
+execute=com.orangevolt.tools.ant.ExecuteTask
+call=com.orangevolt.tools.ant.CallTask
+switch=com.orangevolt.tools.ant.SwitchTask
+unix.properties=com.orangevolt.tools.ant.UnixPropertiesTask
+unix.link=com.orangevolt.tools.ant.UnixLinkTask
+unix.kde.shortcut=com.orangevolt.tools.ant.KDEShortcutTask
+unix.kde.shortcutdirectory=com.orangevolt.tools.ant.KDEShortcutDirectoryTask
+os.properties=com.orangevolt.tools.ant.OsPropertiesTask
Index: /main/branches/stable_gs3/release-kits/shared/windows/installer-classes/com/roxes/win32/ov4n.properties
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/windows/installer-classes/com/roxes/win32/ov4n.properties	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/windows/installer-classes/com/roxes/win32/ov4n.properties	(revision 21851)
@@ -0,0 +1,2 @@
+#Sat Oct 06 16:45:54 CEST 2007
+orangevolt.native.libversion=1.1.1
Index: /main/branches/stable_gs3/release-kits/shared/windows/wirk.cpp
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/windows/wirk.cpp	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/windows/wirk.cpp	(revision 21851)
@@ -0,0 +1,129 @@
+#include <windows.h>
+
+#include <fstream>
+#include <iostream>
+#include <string>
+#include <sstream>
+
+#ifndef XXX
+#define XXX 2
+#endif
+
+using namespace std;
+
+void replace_all ( std::string & str, std::string const & pattern, std::string const & replacement ) {
+
+	std::string::size_type start = str.find( pattern, 0 );
+
+	while ( start != str.npos ) {
+		str.replace( start, pattern.size(), replacement );
+		start = str.find( pattern, start+replacement.size() );
+	}
+
+}
+
+void show_help() {
+
+	cout << "Wirk" << XXX << " - Windows Release Kit for Greenstone" << XXX << endl;
+	cout << "Helps you to create releases from the Repository" << endl << endl;
+
+	cout << "usage: wirk" << XXX << " [args]" << endl;
+	cout << "	-sim" << endl;
+	cout << "		simulation only, don't actually do anything" << endl << endl;
+
+	cout << "	-help" << endl;
+	cout << "		show this help screen" << endl << endl;
+
+	cout << "	-from <target>" << endl;
+	cout << "		start execution from the target with the given target address" << endl << endl;
+
+	cout << "	-to <target>" << endl;
+	cout << "		stop execution just before the target with the given target address" << endl << endl;
+
+	cout << "	-descend <target>" << endl;
+	cout << "		execute only the target with the given address, including subtargets" << endl << endl;
+
+}
+
+
+int main(int argc, char** argv ) {
+	
+	//some checks
+	bool ok = true;
+	if ( getenv( "JAVA_HOME" ) == NULL ) {
+		cerr << "Please set JAVA_HOME before running wirk" << XXX << endl;
+		ok = false;
+	}
+
+	stringstream out;
+	out << "WIRK" << XXX << "_HOME";
+	string wirk_home_var;
+	wirk_home_var = out.str();
+
+	if ( getenv( wirk_home_var.c_str() ) == NULL ) {
+		cerr << "Please set " << wirk_home_var << " before running wirk" << XXX << endl;
+		ok = false;
+	}
+	if ( !ok ) {
+		return -1;
+	}
+
+	//load environment variables
+	string JAVA_HOME = getenv( "JAVA_HOME" );
+	string WIRK_HOME = getenv( wirk_home_var.c_str() );
+	putenv( ("ANT_HOME=" + WIRK_HOME + "\\core\\ant").c_str() );
+	
+	//get the pwd
+	string pwd;
+	system( "CD > cd.dat" );
+	ifstream file( "cd.dat" ) ;
+	getline(file, pwd);
+	file.close();
+	system( "del cd.dat" );
+		
+	//create the command
+	stringstream command;
+	command << "cmd.exe /c " << WIRK_HOME << "\\core\\ant\\bin\\ant.bat -f \"" << WIRK_HOME << "\\ant-scripts\\build.xml\" -addressing \"-Dwirk" << XXX << ".home=" << WIRK_HOME << "\"";
+
+	//pass on the arguments
+	string a;
+	bool simMode = false;
+	for ( int i=1; i < argc; i++ ) {
+		a = argv[i];
+		
+		if ( a.compare("-help") == 0 || a.compare("--help") == 0 ) {
+			show_help();
+			return 0;
+		} else if ( a.compare("-sim") == 0) {
+			command << " " << a;
+			simMode = true;
+		} else {
+			command << " " << a;
+		}
+
+	}
+
+	//set the basedir in the command
+	command << " \"-Dbasedir=" << pwd << "\"";
+
+	//pipe it all to tee
+	command << " | " << WIRK_HOME << "\\windows\\utils\\tee.exe " << pwd << "\\wirk" << XXX << ".out";
+	
+	cout
+		<< "O-----------------------------------------O" << endl
+		<< "|                                         |" << endl
+		<< "|   WiRK" << XXX << "                                 |" << endl
+		<< "|   Windows Release Kit for Greenstone" << XXX << "   |" << endl
+		<< "|                                         |" << endl
+		<< "O-----------------------------------------O" << endl
+		;
+	
+	string final_command = command.str();
+	cout << "pwd: " << pwd << endl;
+	cout << "command: " << final_command << endl;
+
+	system( final_command.c_str() );
+	
+	return 0;
+
+}
Index: /main/branches/stable_gs3/release-kits/shared/windows/wrapper/compile.bat
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/windows/wrapper/compile.bat	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/windows/wrapper/compile.bat	(revision 21851)
@@ -0,0 +1,10 @@
+mkdir build
+
+rc wrapper.rc
+move wrapper.RES build\wrapper.res
+
+cl /c -GX wrapper.cpp /out:wrapper.obj
+move wrapper.obj build
+
+link /OUT:build\wrapper.exe build\wrapper.obj build\wrapper.res
+
Index: /main/branches/stable_gs3/release-kits/shared/windows/wrapper/wrapper.cpp
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/windows/wrapper/wrapper.cpp	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/windows/wrapper/wrapper.cpp	(revision 21851)
@@ -0,0 +1,451 @@
+#include <windows.h>
+
+#include <fstream>
+#include <iostream>
+#include <conio.h>
+#include <string>
+#include <time.h>
+#include <shellapi.h>
+#include <direct.h>
+
+using namespace std;
+
+#ifndef CDROM
+#include "libsearch4j.h"
+#endif
+
+//globals
+HBITMAP g_splash = NULL; //the main splash bitmap
+HFONT g_hfFont = NULL; //the main splash bitmap
+char step[10] = "TMP"; //the current step
+char progress[4] = "0"; //progress in the current step
+HWND splashWnd;
+HINSTANCE mainInstance;
+int mainCmdShow;
+bool window_loaded = false;
+
+void set_splash_step( char* new_step ) {
+	strcpy( step, new_step );
+	InvalidateRect(splashWnd, NULL, FALSE);
+	UpdateWindow(splashWnd);
+}
+
+void set_splash_progress( int percent_progress ) {
+	percent_progress = ( percent_progress / 10 ) * 10;
+	char p[4] = {0};
+	strcpy( progress, itoa( percent_progress, p, 10 ) );
+	InvalidateRect(splashWnd, NULL, FALSE);
+	//RedrawWindow(splashWnd, NULL, NULL, RDW_INVALIDATE | RDW_ERASE | RDW_ERASENOW | RDW_UPDATENOW | RDW_INTERNALPAINT);
+	UpdateWindow(splashWnd);
+}
+
+void spoof_progress( int interval ) {
+	int tenPercentWait = interval / 11;
+	for ( int i=0; i <= 100; i+=10 ) {
+		set_splash_progress( i );
+		Sleep( tenPercentWait );
+	}
+}
+
+//extracts a resource in chunks
+int extractResource( const char * basename, const char * type, char * file ) {
+
+	HMODULE hModule = GetModuleHandle(NULL);
+	set_splash_progress( 0 );
+
+	int no_chunks;
+	bool chunk_available = true;
+	for ( no_chunks = 0; chunk_available; no_chunks++ ) {
+
+		//construct the chunk name
+		char chunkname[127] = {0};
+		strcpy( chunkname, basename );
+		strcat( chunkname, "_" );
+		char chunknum[5] = {0};
+		itoa( no_chunks+1, chunknum, 10 );
+		strcat( chunkname, chunknum );
+		
+		if ( FindResource(hModule, chunkname, type) == NULL ) {
+			chunk_available = false;
+			break;
+		}
+	}
+	
+	if ( no_chunks == 0 ) {
+		return 1;
+	}
+	
+	for ( int i=0; i<no_chunks; i++ ) {
+	
+		//construct the chunk name
+		char chunkname[127] = {0};
+		strcpy( chunkname, basename );
+		strcat( chunkname, "_" );
+		char chunknum[5] = {0};
+		itoa( i+1, chunknum, 10 );
+		strcat( chunkname, chunknum );
+		
+		//find it
+		HRSRC hRsrc = FindResource(hModule, chunkname, type);
+		if (hRsrc == NULL ) return 1; //couldn't find the chunk
+		
+		//load it
+		HGLOBAL hGlobal = LoadResource(hModule, hRsrc);
+		if (hGlobal == NULL) return 1; //couldn't lock
+		
+		//lock it
+		BYTE* pBytes = (BYTE*) LockResource(hGlobal);
+		if (pBytes == NULL) return 1; //couldn't lock
+		
+		//put it on disk
+		DWORD dwLength = SizeofResource(hModule, hRsrc);
+		ofstream fStream(file, ios::binary | ios::out | ios::app );
+		fStream.write((char*) pBytes, dwLength);
+		fStream.close();
+		
+		//unload
+		UnlockResource(hGlobal);
+		FreeResource(hGlobal);
+		
+		//update the progress
+		set_splash_progress( i * 100 / no_chunks );
+		
+	}
+
+	return 0;
+
+}
+
+//the splash window procedure
+LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
+	switch(msg) {
+
+		case WM_CREATE: {
+			//load in the reusable resources
+			g_splash = LoadBitmap(GetModuleHandle(NULL),"SPLASH");
+			g_hfFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
+			if(g_splash == NULL) {
+				MessageBox(hwnd, "Could not load splash bitmap!", "Error", MB_OK | MB_ICONEXCLAMATION);
+			}
+			
+			//center the window automatically
+			RECT rect;
+			GetWindowRect(hwnd, &rect);
+			int x = (GetSystemMetrics(SM_CXSCREEN) - (rect.right - rect.left)) / 2;
+			int y = (GetSystemMetrics(SM_CYSCREEN) - (rect.bottom - rect.top)) / 2;
+			SetWindowPos(hwnd, HWND_TOP, x, y, 0, 0, SWP_NOSIZE);
+		}
+		
+		case WM_PAINT: {
+			// Don't use MessageBox from inside WM_PAINT
+		
+			//load in the correct resources
+			HBITMAP g_progress = NULL;
+			HBITMAP g_step = NULL;
+			char progress_res[20] = "PROGRESS_";
+			strcat( progress_res, progress );
+			char step_res[20] = "STEP_";
+			strcat( step_res, step );
+			g_progress = LoadBitmap(GetModuleHandle(NULL), progress_res );
+			g_step = LoadBitmap(GetModuleHandle(NULL), step_res );
+			if( g_progress == NULL || g_step == NULL ) {
+				//MessageBox(hwnd, "Could not load an image!", "Error", MB_OK | MB_ICONEXCLAMATION);
+			}
+		
+			BITMAP bm; //holds info about the width and height
+			PAINTSTRUCT ps;
+			
+			HDC hdc = BeginPaint(hwnd, &ps);
+			HDC hdcMem = CreateCompatibleDC(hdc);
+			
+			//paint the main splash screen
+			GetObject(g_splash, sizeof(bm), &bm);
+			HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, g_splash);
+			BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
+						
+			//paint in the progress
+			GetObject(g_progress, sizeof(bm), &bm);
+			SelectObject(hdcMem, g_progress);
+			BitBlt(hdc, 0, 270, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
+			
+			//paint in the step with transparency
+			GetObject(g_step, sizeof(bm), &bm);
+			SelectObject(hdcMem, g_step);
+			BitBlt(hdc, 0, 276, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCPAINT);
+			
+			//print the step with text
+			RECT rcClient;
+			GetClientRect(hwnd, &rcClient);
+			//DrawText(hdc, "This is the step", -1, &rcClient, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
+			
+			//restore the hdc
+			SelectObject(hdcMem, hbmOld);
+			
+			//release resources
+			DeleteDC(hdcMem);
+			EndPaint(hwnd, &ps);
+			DeleteObject(g_progress);
+			DeleteObject(g_step);
+			
+		}
+		break;
+		
+		/*
+		case WM_LBUTTONDOWN: {
+			DeleteObject(g_splash);
+			PostQuitMessage(0);
+		}
+		break;
+		*/
+		
+		case WM_CLOSE:
+			DestroyWindow(hwnd);
+			break;
+		
+		case WM_DESTROY:
+			DeleteObject(g_splash);
+			PostQuitMessage(0);
+			break;
+		
+		default:
+			return DefWindowProc(hwnd, msg, wParam, lParam);
+	}
+
+	return 0;
+
+}
+
+//function to process the window
+DWORD WINAPI ProcessWindow( LPVOID lpParam ) {
+	
+	const char g_szClassName[] = "splash";
+	WNDCLASSEX wc;
+	MSG Msg;
+
+	//Step 1: Registering the Window Class
+	wc.cbSize = sizeof(WNDCLASSEX);
+	wc.style = 0;
+	wc.lpfnWndProc = WndProc;
+	wc.cbClsExtra = 0;
+	wc.cbWndExtra = 0;
+	wc.hInstance = mainInstance;
+	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
+	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
+	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
+	wc.lpszMenuName = NULL;
+	wc.lpszClassName = g_szClassName;
+	wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
+	if(!RegisterClassEx(&wc)) {
+		MessageBox(NULL, "Window Registration Failed!", "Error!",
+		MB_ICONEXCLAMATION | MB_OK);
+		return 0;
+	}
+
+	// Step 2: Creating the Window
+	splashWnd = CreateWindowEx( WS_EX_TOOLWINDOW, g_szClassName, "", WS_POPUP | SS_BITMAP, 0, 0, 420, 300, NULL, NULL, mainInstance, NULL);
+	if( splashWnd == NULL ) {
+		MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
+		return 0;
+	}
+	ShowWindow(splashWnd, mainCmdShow);
+	UpdateWindow(splashWnd);
+
+	window_loaded = true;
+	
+	// Step 3: The Message Loop
+	while(GetMessage(&Msg, NULL, 0, 0) > 0) {
+		TranslateMessage(&Msg);
+		DispatchMessage(&Msg);
+	}
+	return 0;
+} 
+
+int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
+	
+	const int SPOOF_TIME = 1000;
+	string command;
+	srand( time(0) );
+	mainInstance = hInstance;
+	mainCmdShow = nCmdShow;
+	
+	//start the window
+	HANDLE hThread;
+	DWORD dwThreadId, dwThrdParam = 1;
+	hThread = CreateThread( 
+       NULL,                        // no security attributes 
+       0,                           // use default stack size  
+       ProcessWindow,               // thread function 
+       &dwThrdParam,	            // argument to thread function 
+       0,                           // use default creation flags 
+       &dwThreadId);                // returns the thread identifier 
+	if ( hThread == NULL ) {
+		return -1;
+		//ErrorExit( "CreateThread failed." );
+	}
+	CloseHandle( hThread );
+	
+	while ( !window_loaded ) {
+		Sleep( 100 );
+	}
+	
+	//create the temp folder and change to it
+	set_splash_step( "TMP" );
+	spoof_progress( SPOOF_TIME );
+	
+	//get the original working directory
+	char* owdChar = _getcwd(NULL, 1024);
+	string owd = "";
+	owd.append( owdChar );
+	delete owdChar;
+	
+	//strip trailing slash
+	if ( owd.substr(owd.length()-1,1).compare( "\\" ) == 0 ) {
+		owd = owd.substr(0, owd.length()-1);
+	}
+		
+	//using the users TMP directory for temp files rather than the current directory so
+	//installation from cdrom works
+	char* tmp = getenv( "TMP" );
+	char id[6]; for( int i=0; i<5; i++ ) id[i] = (char)((rand()%26) + 97); id[5] = '\0'; //id for this instance
+	string tempdir = ""; tempdir.append( tmp ); tempdir.append( "\\Greenstone-" ); tempdir.append( id );
+	const char* tmpdir = tempdir.c_str();
+	if ( _mkdir( tmpdir ) != 0 ) {
+		string title = "Failed to create the temp folder.";
+		string message = "Failed to create the temp folder.\nPlease set the environment variable TMP to a folder you have permission to write to.";
+		//ShowWindow(splashWnd, SW_HIDE); //hide splash screen
+		MessageBox(splashWnd, message.c_str(), title.c_str(), MB_OK);
+		return -1;
+	}
+	//SetFileAttributes(tmpdir, FILE_ATTRIBUTE_HIDDEN);
+	SetCurrentDirectory(tmpdir);
+	delete tmp; //  deallocate memory
+	
+	#ifdef CDROM
+
+	//ask if they want to install, then do it if so
+	int choice = MessageBox(splashWnd, "Install Greenstone?", "Greenstone", MB_OKCANCEL | MB_ICONQUESTION );
+	if ( choice == IDOK ) {
+
+		//prepare to launch the jar
+		set_splash_step( "LAUNCHING" );
+		spoof_progress( SPOOF_TIME );
+	
+		string cmd = "\"";
+		cmd.append( owd );
+		cmd.append( "\\Java\\Windows\\jre\\bin\\java.exe\" \"-Dorig.dir=" );
+		cmd.append( owd );
+		cmd.append( "\" -jar \"" );
+		cmd.append( owd );
+		cmd.append( "\\Java\\Jars\\windows.jar\"" );
+		char cmdLpstr[1024];
+		strcpy( cmdLpstr, cmd.c_str() );
+		
+		
+		STARTUPINFO si;
+		PROCESS_INFORMATION pi;
+		memset(&pi, 0, sizeof(pi));
+		memset(&si, 0, sizeof(si));
+		si.cb = sizeof(si);
+		DWORD dwExitCode = -1;
+
+		//hide splash screen
+		ShowWindow(splashWnd, SW_HIDE);
+
+		//launch the jar
+		bool result;
+		result = CreateProcess(NULL, cmdLpstr, NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
+
+		WaitForSingleObject(pi.hProcess, INFINITE);
+		GetExitCodeProcess(pi.hProcess, &dwExitCode);
+		CloseHandle(pi.hThread);
+		CloseHandle(pi.hProcess);
+
+	}	
+	#else
+
+	//rip out java archive if it is bundled
+	set_splash_step( "XJAVA" );
+	int javaIsBundled = (extractResource( "JAVA", "EXE", "@java.installer@" ) == 0);
+	if ( javaIsBundled ) {
+		process( "@java.installer@", false );
+	}
+
+	//find java
+	set_splash_step( "SEARCHING" );
+	spoof_progress( SPOOF_TIME );
+	bool use_minimum = true;
+	Jvm minimum;
+	minimum.setVersionFromString( "@java.min.version@" );
+	string phint = "@java.extracted@";
+	string hint = "";
+	bool verbose = true;
+	Jvm foundJvm;
+	bool jvmFound = find( foundJvm, use_minimum, minimum, false, false, phint, hint, verbose );
+	
+	//if the jvm was not found, try to fix it and find it
+	if ( !jvmFound ) {
+
+		//did not find a good java
+		string message = "This version of Greenstone requires java @java.min.version@ or greater, but ";
+		
+		//tell them if java is absent or just too old
+		if ( find( foundJvm, false, minimum, false, false, "", "", false ) ) {
+			message.append( "your java is too old.");
+		} else {
+			message.append( "java could not be found on your computer." );
+		}
+		message.append( "\n" );
+		
+		string title = "Installation Failed: Couldn't find java";
+		//ShowWindow(splashWnd, SW_HIDE); //hide splash screen
+		MessageBox(splashWnd, message.c_str(), title.c_str(), MB_OK);
+
+	//if java was found, carry on
+	} else {
+
+		//extract the jar
+		string jarLocation = "greenstone.jar";
+		
+		set_splash_step( "XJAR" );
+		extractResource( "JAR", "JAR", (char*) jarLocation.c_str() );
+
+		//launch the jar
+		set_splash_step( "LAUNCHING" );
+		spoof_progress( SPOOF_TIME );
+		string cmd = "\"";
+		cmd.append( foundJvm.getWinExecutable() );
+		cmd.append( "\" \"-Dorig.dir=" );
+		cmd.append( owd );
+		cmd.append( "\" -jar greenstone.jar" );
+		
+		
+		//hide splash screen
+		ShowWindow(splashWnd, SW_HIDE);
+		
+		//run the jar
+		int launch_exit_code = process( cmd, true );
+		
+		//report how it went
+		if ( launch_exit_code != 0 ) {
+			string title = "Installation Error";
+			string message = "The installation exited with an error. Java may not be installed properly, or the installation may have been interrupted partway through. Please try again.";
+			//ShowWindow(splashWnd, SW_HIDE); //hide splash screen
+			MessageBox(NULL, message.c_str(), title.c_str(), MB_OK);
+		}
+	}
+	#endif
+	
+	//clean up the temp directory
+	_unlink( "ant.install.log" );
+	#ifndef CDROM
+	_unlink( "greenstone.jar" );
+	_unlink( "@java.installer@" );
+	process( "cmd.exe /c rd /s /q @java.extracted@", false );
+	#endif
+
+	SetCurrentDirectory( ".." );
+	_rmdir( tempdir.c_str() );
+	
+	return 0;
+	
+}
Index: /main/branches/stable_gs3/release-kits/shared/windows/wrapper/wrapper.rc
===================================================================
--- /main/branches/stable_gs3/release-kits/shared/windows/wrapper/wrapper.rc	(revision 21851)
+++ /main/branches/stable_gs3/release-kits/shared/windows/wrapper/wrapper.rc	(revision 21851)
@@ -0,0 +1,20 @@
+SPLASH BITMAP "splash.bmp"
+PROGRESS_0 BITMAP "progress-0.bmp"
+PROGRESS_10 BITMAP "progress-10.bmp"
+PROGRESS_20 BITMAP "progress-20.bmp"
+PROGRESS_30 BITMAP "progress-30.bmp"
+PROGRESS_40 BITMAP "progress-40.bmp"
+PROGRESS_50 BITMAP "progress-50.bmp"
+PROGRESS_60 BITMAP "progress-60.bmp"
+PROGRESS_70 BITMAP "progress-70.bmp"
+PROGRESS_80 BITMAP "progress-80.bmp"
+PROGRESS_90 BITMAP "progress-90.bmp"
+PROGRESS_100 BITMAP "progress-100.bmp"
+STEP_TMP BITMAP "step-tmp.bmp"
+STEP_SEARCHING BITMAP "step-searching.bmp"
+STEP_XJAVA BITMAP "step-xjava.bmp"
+STEP_XJAR BITMAP "step-xjar.bmp"
+STEP_LAUNCHING BITMAP "step-launching.bmp"
+MAINICON ICON "icon.ico"
+
+//resources are automatically appended here
