Index: /release-kits/shared/core/ant-installer/.directory
===================================================================
--- /release-kits/shared/core/ant-installer/.directory	(revision 18997)
+++ /release-kits/shared/core/ant-installer/.directory	(revision 18997)
@@ -0,0 +1,2 @@
+[Desktop Entry]
+Icon=/research/oranfry/programs/ant-installer/antinstaller-icon.png
Index: /release-kits/shared/core/ant-installer/CHANGELOG.txt
===================================================================
--- /release-kits/shared/core/ant-installer/CHANGELOG.txt	(revision 18997)
+++ /release-kits/shared/core/ant-installer/CHANGELOG.txt	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/build/build.xml
===================================================================
--- /release-kits/shared/core/ant-installer/build/build.xml	(revision 18997)
+++ /release-kits/shared/core/ant-installer/build/build.xml	(revision 18997)
@@ -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"  basedir="..">
+
+    <!-- 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: /release-kits/shared/core/ant-installer/demo/DEMO-README.txt
===================================================================
--- /release-kits/shared/core/ant-installer/demo/DEMO-README.txt	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/DEMO-README.txt	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/README.txt
===================================================================
--- /release-kits/shared/core/ant-installer/demo/README.txt	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/README.txt	(revision 18997)
@@ -0,0 +1,1 @@
+This is an example readme file 
Index: /release-kits/shared/core/ant-installer/demo/ant.install.log
===================================================================
--- /release-kits/shared/core/ant-installer/demo/ant.install.log	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/ant.install.log	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/bin/run.cmd
===================================================================
--- /release-kits/shared/core/ant-installer/demo/bin/run.cmd	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/bin/run.cmd	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/bin/run.sh
===================================================================
--- /release-kits/shared/core/ant-installer/demo/bin/run.sh	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/bin/run.sh	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/build-demo.xml
===================================================================
--- /release-kits/shared/core/ant-installer/demo/build-demo.xml	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/build-demo.xml	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/checkConfig.sh
===================================================================
--- /release-kits/shared/core/ant-installer/demo/checkConfig.sh	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/checkConfig.sh	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/config/demo.properties
===================================================================
--- /release-kits/shared/core/ant-installer/demo/config/demo.properties	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/config/demo.properties	(revision 18997)
@@ -0,0 +1,7 @@
+#
+# Installtion properties
+# 
+TextProperty=@TextProperty@
+BooleanProperty=@BooleanProperty@
+Colour=@Colour@
+SelectedFile=@SelectedFile@
Index: /release-kits/shared/core/ant-installer/demo/config/example-config.xml
===================================================================
--- /release-kits/shared/core/ant-installer/demo/config/example-config.xml	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/config/example-config.xml	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/doc/allclasses-frame.html
===================================================================
--- /release-kits/shared/core/ant-installer/demo/doc/allclasses-frame.html	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/doc/allclasses-frame.html	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/doc/allclasses-noframe.html
===================================================================
--- /release-kits/shared/core/ant-installer/demo/doc/allclasses-noframe.html	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/doc/allclasses-noframe.html	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/doc/constant-values.html
===================================================================
--- /release-kits/shared/core/ant-installer/demo/doc/constant-values.html	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/doc/constant-values.html	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/doc/deprecated-list.html
===================================================================
--- /release-kits/shared/core/ant-installer/demo/doc/deprecated-list.html	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/doc/deprecated-list.html	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/doc/help-doc.html
===================================================================
--- /release-kits/shared/core/ant-installer/demo/doc/help-doc.html	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/doc/help-doc.html	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/doc/index-all.html
===================================================================
--- /release-kits/shared/core/ant-installer/demo/doc/index-all.html	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/doc/index-all.html	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/doc/index.html
===================================================================
--- /release-kits/shared/core/ant-installer/demo/doc/index.html	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/doc/index.html	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/doc/org/tp23/demo/Demonstration.html
===================================================================
--- /release-kits/shared/core/ant-installer/demo/doc/org/tp23/demo/Demonstration.html	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/doc/org/tp23/demo/Demonstration.html	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/doc/org/tp23/demo/package-frame.html
===================================================================
--- /release-kits/shared/core/ant-installer/demo/doc/org/tp23/demo/package-frame.html	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/doc/org/tp23/demo/package-frame.html	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/doc/org/tp23/demo/package-summary.html
===================================================================
--- /release-kits/shared/core/ant-installer/demo/doc/org/tp23/demo/package-summary.html	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/doc/org/tp23/demo/package-summary.html	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/doc/org/tp23/demo/package-tree.html
===================================================================
--- /release-kits/shared/core/ant-installer/demo/doc/org/tp23/demo/package-tree.html	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/doc/org/tp23/demo/package-tree.html	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/doc/overview-tree.html
===================================================================
--- /release-kits/shared/core/ant-installer/demo/doc/overview-tree.html	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/doc/overview-tree.html	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/doc/package-list
===================================================================
--- /release-kits/shared/core/ant-installer/demo/doc/package-list	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/doc/package-list	(revision 18997)
@@ -0,0 +1,1 @@
+org.tp23.demo
Index: /release-kits/shared/core/ant-installer/demo/doc/packages.html
===================================================================
--- /release-kits/shared/core/ant-installer/demo/doc/packages.html	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/doc/packages.html	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/doc/stylesheet.css
===================================================================
--- /release-kits/shared/core/ant-installer/demo/doc/stylesheet.css	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/doc/stylesheet.css	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/install.cmd
===================================================================
--- /release-kits/shared/core/ant-installer/demo/install.cmd	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/install.cmd	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/install.sh
===================================================================
--- /release-kits/shared/core/ant-installer/demo/install.sh	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/install.sh	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/installclasspath/resources/GPL.txt
===================================================================
--- /release-kits/shared/core/ant-installer/demo/installclasspath/resources/GPL.txt	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/installclasspath/resources/GPL.txt	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/installer/antinstall-config.xml
===================================================================
--- /release-kits/shared/core/ant-installer/demo/installer/antinstall-config.xml	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/installer/antinstall-config.xml	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/installer/build.xml
===================================================================
--- /release-kits/shared/core/ant-installer/demo/installer/build.xml	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/installer/build.xml	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/demo/src/org/tp23/demo/Demonstration.java
===================================================================
--- /release-kits/shared/core/ant-installer/demo/src/org/tp23/demo/Demonstration.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/demo/src/org/tp23/demo/Demonstration.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/images/README.txt
===================================================================
--- /release-kits/shared/core/ant-installer/images/README.txt	(revision 18997)
+++ /release-kits/shared/core/ant-installer/images/README.txt	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/images/extract-images/crystal-images.txt
===================================================================
--- /release-kits/shared/core/ant-installer/images/extract-images/crystal-images.txt	(revision 18997)
+++ /release-kits/shared/core/ant-installer/images/extract-images/crystal-images.txt	(revision 18997)
@@ -0,0 +1,4 @@
+Crystal Icons from KDE install
+
+http://www.everaldo.com/crystal.html
+License : LGPL
Index: /release-kits/shared/core/ant-installer/images/extract-images/default-images.txt
===================================================================
--- /release-kits/shared/core/ant-installer/images/extract-images/default-images.txt	(revision 18997)
+++ /release-kits/shared/core/ant-installer/images/extract-images/default-images.txt	(revision 18997)
@@ -0,0 +1,5 @@
+Default Icons: Paul Hinds
+
+http://java.riereta.net
+
+License: Apache 2.0
Index: /release-kits/shared/core/ant-installer/images/navicons/amaranth/resources/icons/LICENSE
===================================================================
--- /release-kits/shared/core/ant-installer/images/navicons/amaranth/resources/icons/LICENSE	(revision 18997)
+++ /release-kits/shared/core/ant-installer/images/navicons/amaranth/resources/icons/LICENSE	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/images/navicons/bluecurve/resources/icons/LICENSE
===================================================================
--- /release-kits/shared/core/ant-installer/images/navicons/bluecurve/resources/icons/LICENSE	(revision 18997)
+++ /release-kits/shared/core/ant-installer/images/navicons/bluecurve/resources/icons/LICENSE	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/images/navicons/crystalsvg/resources/icons/LICENSE
===================================================================
--- /release-kits/shared/core/ant-installer/images/navicons/crystalsvg/resources/icons/LICENSE	(revision 18997)
+++ /release-kits/shared/core/ant-installer/images/navicons/crystalsvg/resources/icons/LICENSE	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/images/navicons/eclipse/resources/icons/LICENSE
===================================================================
--- /release-kits/shared/core/ant-installer/images/navicons/eclipse/resources/icons/LICENSE	(revision 18997)
+++ /release-kits/shared/core/ant-installer/images/navicons/eclipse/resources/icons/LICENSE	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/images/navicons/krystaline/resources/icons/LICENSE
===================================================================
--- /release-kits/shared/core/ant-installer/images/navicons/krystaline/resources/icons/LICENSE	(revision 18997)
+++ /release-kits/shared/core/ant-installer/images/navicons/krystaline/resources/icons/LICENSE	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/images/resources/LICENSE-ant-install.txt
===================================================================
--- /release-kits/shared/core/ant-installer/images/resources/LICENSE-ant-install.txt	(revision 18997)
+++ /release-kits/shared/core/ant-installer/images/resources/LICENSE-ant-install.txt	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/images/titlebars/default-images.txt
===================================================================
--- /release-kits/shared/core/ant-installer/images/titlebars/default-images.txt	(revision 18997)
+++ /release-kits/shared/core/ant-installer/images/titlebars/default-images.txt	(revision 18997)
@@ -0,0 +1,5 @@
+Default Icons: Paul Hinds
+
+http://java.riereta.net
+
+License: Apache 2.0
Index: /release-kits/shared/core/ant-installer/images/tool-credits.txt
===================================================================
--- /release-kits/shared/core/ant-installer/images/tool-credits.txt	(revision 18997)
+++ /release-kits/shared/core/ant-installer/images/tool-credits.txt	(revision 18997)
@@ -0,0 +1,17 @@
+
+   <ant-installer> 
+      _-------_ 
+      \ ()0o< / 
+       \ /|\ /
+        \   /
+         \ /
+          Â·
+Default icons created with
+
+     - inkscape - 
+http://www.inkscape.org
+
+   - and the gimp -
+  http://www.gimp.org
+
+
Index: /release-kits/shared/core/ant-installer/kde-icons/antinstaller-demo.desktop
===================================================================
--- /release-kits/shared/core/ant-installer/kde-icons/antinstaller-demo.desktop	(revision 18997)
+++ /release-kits/shared/core/ant-installer/kde-icons/antinstaller-demo.desktop	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/kde-icons/antinstaller-docs.desktop
===================================================================
--- /release-kits/shared/core/ant-installer/kde-icons/antinstaller-docs.desktop	(revision 18997)
+++ /release-kits/shared/core/ant-installer/kde-icons/antinstaller-docs.desktop	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/kde-icons/antinstaller-wizard.desktop
===================================================================
--- /release-kits/shared/core/ant-installer/kde-icons/antinstaller-wizard.desktop	(revision 18997)
+++ /release-kits/shared/core/ant-installer/kde-icons/antinstaller-wizard.desktop	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/lib/LICENSE-ant-install.txt
===================================================================
--- /release-kits/shared/core/ant-installer/lib/LICENSE-ant-install.txt	(revision 18997)
+++ /release-kits/shared/core/ant-installer/lib/LICENSE-ant-install.txt	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/lib/LICENSE-ant.txt
===================================================================
--- /release-kits/shared/core/ant-installer/lib/LICENSE-ant.txt	(revision 18997)
+++ /release-kits/shared/core/ant-installer/lib/LICENSE-ant.txt	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/lib/LICENSE-dom.txt
===================================================================
--- /release-kits/shared/core/ant-installer/lib/LICENSE-dom.txt	(revision 18997)
+++ /release-kits/shared/core/ant-installer/lib/LICENSE-dom.txt	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/lib/LICENSE-jgoodies.txt
===================================================================
--- /release-kits/shared/core/ant-installer/lib/LICENSE-jgoodies.txt	(revision 18997)
+++ /release-kits/shared/core/ant-installer/lib/LICENSE-jgoodies.txt	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/lib/LICENSE-sax.txt
===================================================================
--- /release-kits/shared/core/ant-installer/lib/LICENSE-sax.txt	(revision 18997)
+++ /release-kits/shared/core/ant-installer/lib/LICENSE-sax.txt	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/lib/LICENSE-sysout.txt
===================================================================
--- /release-kits/shared/core/ant-installer/lib/LICENSE-sysout.txt	(revision 18997)
+++ /release-kits/shared/core/ant-installer/lib/LICENSE-sysout.txt	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/lib/LICENSE-xerces.txt
===================================================================
--- /release-kits/shared/core/ant-installer/lib/LICENSE-xerces.txt	(revision 18997)
+++ /release-kits/shared/core/ant-installer/lib/LICENSE-xerces.txt	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/lib/test.bat
===================================================================
--- /release-kits/shared/core/ant-installer/lib/test.bat	(revision 18997)
+++ /release-kits/shared/core/ant-installer/lib/test.bat	(revision 18997)
@@ -0,0 +1,3 @@
+@java -cp c:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-launcher.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-antlr.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-apache-bcel.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-apache-bsf.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-apache-log4j.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-apache-oro.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-apache-regexp.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-apache-resolver.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-commons-logging.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-commons-net.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-icontract.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-jai.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-javamail.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-jdepend.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-jmf.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-jsch.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-junit.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-launcher.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-netrexx.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-nodeps.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-starteam.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-stylebook.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-swing.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-trax.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-vaj.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-weblogic.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-xalan1.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant-xslp.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\ant.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\xercesImpl.jar;C:\research\oranfry\release-kits\wirk3\bin\apache-ant-1.6.5\lib\xml-apis.jar;C:\j2sdk1.4.2_08\lib\tools.jar;ant-installer-ext.jar;ant-installer.jar;jgoodies-edited-1_2_2.jar;xercesImpl.jar;xml-apis.jar org.tp23.antinstaller.runtime.ConfigurationLoader c:\research\oranfry\snapshots\3s2008.05.07\installer antinstall-config.xml
+
+::c:\research\oranfry\snapshots\3s2008.05.07\installer\cp;
Index: /release-kits/shared/core/ant-installer/src/README.txt
===================================================================
--- /release-kits/shared/core/ant-installer/src/README.txt	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/README.txt	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/DefaultPropertiesFileRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/DefaultPropertiesFileRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/DefaultPropertiesFileRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/ExplicitPropertiesFileRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/ExplicitPropertiesFileRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/ExplicitPropertiesFileRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/InstallException.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/InstallException.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/InstallException.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/Installer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/Installer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/Installer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/InstallerContext.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/InstallerContext.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/InstallerContext.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/PropertiesFileRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/PropertiesFileRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/PropertiesFileRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/ResourceBundleHelper.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/ResourceBundleHelper.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/ResourceBundleHelper.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/ValidationException.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/ValidationException.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/ValidationException.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.2.dtd
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.2.dtd	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.2.dtd	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.3.dtd
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.3.dtd	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.3.dtd	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.4.dtd
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.4.dtd	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.4.dtd	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.5.dtd
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.5.dtd	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.5.dtd	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.6.dtd
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.6.dtd	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.6.dtd	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.7.dtd
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.7.dtd	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.7.dtd	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.8.dtd
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.8.dtd	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antinstall-config-0.8.dtd	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/FeedbackListener.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/FeedbackListener.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/FeedbackListener.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/Jdk14RegexpMatcher.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/Jdk14RegexpMatcher.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/Jdk14RegexpMatcher.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/Jdk14RegexpRegexp.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/Jdk14RegexpRegexp.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/Jdk14RegexpRegexp.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/Launcher.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/Launcher.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/Launcher.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/Main.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/Main.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/Main.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/ProjectHelper3.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/ProjectHelper3.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/ProjectHelper3.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/RegexpMatcherFactory.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/RegexpMatcherFactory.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/RegexpMatcherFactory.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/RuntimeLauncher.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/RuntimeLauncher.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/RuntimeLauncher.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/package.html
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/package.html	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/package.html	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/taskdefs/GetResourceTask.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/taskdefs/GetResourceTask.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/taskdefs/GetResourceTask.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/taskdefs/LogTask.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/taskdefs/LogTask.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/taskdefs/LogTask.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/taskdefs/MessageTask.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/taskdefs/MessageTask.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/taskdefs/MessageTask.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/taskdefs/PropertyTask.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/taskdefs/PropertyTask.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/antmod/taskdefs/PropertyTask.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/AppRootInput.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/AppRootInput.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/AppRootInput.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/CheckboxInput.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/CheckboxInput.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/CheckboxInput.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/CommentOutput.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/CommentOutput.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/CommentOutput.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ConditionalField.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ConditionalField.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ConditionalField.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ConfirmPasswordTextInput.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ConfirmPasswordTextInput.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ConfirmPasswordTextInput.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/DateInput.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/DateInput.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/DateInput.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/DirectoryInput.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/DirectoryInput.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/DirectoryInput.java	(revision 18997)
@@ -0,0 +1,189 @@
+/* 
+ * 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 </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 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 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(getDefaultValue() == null){
+			System.out.println("Directory:defaultValue must be set");
+			return false;
+		}
+        if(getDefaultValue().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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ExtValidatedTextInput.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ExtValidatedTextInput.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ExtValidatedTextInput.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/FileInput.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/FileInput.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/FileInput.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/HiddenPropertyInput.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/HiddenPropertyInput.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/HiddenPropertyInput.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/InputException.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/InputException.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/InputException.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/InputField.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/InputField.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/InputField.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/LargeSelectInput.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/LargeSelectInput.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/LargeSelectInput.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/OSSpecific.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/OSSpecific.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/OSSpecific.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/OutputField.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/OutputField.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/OutputField.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/PasswordTextInput.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/PasswordTextInput.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/PasswordTextInput.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ResultContainer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ResultContainer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ResultContainer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/SecretPropertyField.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/SecretPropertyField.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/SecretPropertyField.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/SelectInput.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/SelectInput.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/SelectInput.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/Target.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/Target.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/Target.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/TargetInput.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/TargetInput.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/TargetInput.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/TargetSelectInput.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/TargetSelectInput.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/TargetSelectInput.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/UnvalidatedTextInput.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/UnvalidatedTextInput.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/UnvalidatedTextInput.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ValidatedTextInput.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ValidatedTextInput.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/ValidatedTextInput.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/Validator.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/Validator.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/Validator.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/package.html
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/package.html	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/input/package.html	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/LicensePage.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/LicensePage.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/LicensePage.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/Page.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/Page.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/Page.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/ProgressPage.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/ProgressPage.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/ProgressPage.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/SimpleInputPage.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/SimpleInputPage.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/SimpleInputPage.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/SplashPage.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/SplashPage.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/SplashPage.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/TextPage.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/TextPage.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/TextPage.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/package.html
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/package.html	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/page/package.html	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/AntOutputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/AntOutputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/AntOutputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/MessageRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/MessageRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/MessageRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/PageRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/PageRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/PageRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/RendererFactory.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/RendererFactory.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/RendererFactory.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/Res.properties
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/Res.properties	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/Res.properties	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/Res_de.properties
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/Res_de.properties	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/Res_de.properties	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/Res_es.properties
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/Res_es.properties	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/Res_es.properties	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/Res_es_EU.properties
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/Res_es_EU.properties	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/Res_es_EU.properties	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/package.html
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/package.html	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/package.html	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIButton.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIButton.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIButton.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AICheckBox.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AICheckBox.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AICheckBox.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AILabel.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AILabel.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AILabel.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIPasswordField.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIPasswordField.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIPasswordField.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIRadioButton.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIRadioButton.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIRadioButton.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIShortLabel.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIShortLabel.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIShortLabel.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIShortTextField.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIShortTextField.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AIShortTextField.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AITextfield.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AITextfield.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AITextfield.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AppRootInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AppRootInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/AppRootInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/CheckboxInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/CheckboxInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/CheckboxInputRenderer.java	(revision 18997)
@@ -0,0 +1,90 @@
+/* 
+ * 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 javax.swing.JLabel;
+import javax.swing.JPanel;
+
+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) {
+		content.add(fieldLabel, cf.getCell(row, 0));
+		content.add(checkBox, cf.getCell(row, 1));
+		if(overflow){
+			checkBox.setOverflow(SizeConstants.OVERFLOW_FIELD_SIZE);
+		}
+		return ++row;
+	}
+
+	/**
+	 * renderError
+	 */
+	public void renderError() {
+	}
+}
Index: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ClasspathHTMLEditorKit.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ClasspathHTMLEditorKit.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ClasspathHTMLEditorKit.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/CommentOutputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/CommentOutputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/CommentOutputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ConditionalFieldRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ConditionalFieldRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ConditionalFieldRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ConfirmPasswordTextInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ConfirmPasswordTextInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ConfirmPasswordTextInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/DateInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/DateInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/DateInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/DirectoryInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/DirectoryInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/DirectoryInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ExtValidatedTextInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ExtValidatedTextInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ExtValidatedTextInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/FileInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/FileInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/FileInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/HiddenPropertyInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/HiddenPropertyInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/HiddenPropertyInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/LargeSelectInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/LargeSelectInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/LargeSelectInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/LicensePageRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/LicensePageRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/LicensePageRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/PageCompletionListener.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/PageCompletionListener.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/PageCompletionListener.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/PasswordTextInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/PasswordTextInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/PasswordTextInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ProgressPageRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ProgressPageRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ProgressPageRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ProgressPanel.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ProgressPanel.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ProgressPanel.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SelectInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SelectInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SelectInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SimpleInputPageRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SimpleInputPageRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SimpleInputPageRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SizeConstants.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SizeConstants.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SizeConstants.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SplashPageRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SplashPageRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SplashPageRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingInstallerContext.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingInstallerContext.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingInstallerContext.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingMessageRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingMessageRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingMessageRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingOutputFieldRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingOutputFieldRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingOutputFieldRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingPageRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingPageRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingPageRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/TargetInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/TargetInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/TargetInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/TargetSelectInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/TargetSelectInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/TargetSelectInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/TextPageRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/TextPageRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/TextPageRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/UnvalidatedTextInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/UnvalidatedTextInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/UnvalidatedTextInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ValidatedTextInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ValidatedTextInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/ValidatedTextInputRenderer.java	(revision 18997)
@@ -0,0 +1,109 @@
+/* 
+ * 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 javax.swing.JTextField;
+
+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) {
+        content.add(fieldLabel, cf.getCell(row, 0));
+        content.add(jTextField, cf.getCell(row, 1));
+        if (overflow) {
+            ((AITextfield) 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 e.g. "
+                + inputField.getDefaultValue());
+        this.jTextField.requestFocus();
+        this.jTextField.setForeground(Color.red);
+    }
+
+}
Index: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/package.html
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/package.html	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/package.html	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/plaf/LookAndFeelFactory.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/plaf/LookAndFeelFactory.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/plaf/LookAndFeelFactory.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/plaf/ModMetalLookAndFeel.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/plaf/ModMetalLookAndFeel.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/plaf/ModMetalLookAndFeel.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/plaf/ModMetalTheme.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/plaf/ModMetalTheme.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/swing/plaf/ModMetalTheme.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/AbstractTextPageRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/AbstractTextPageRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/AbstractTextPageRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/AppRootInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/AppRootInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/AppRootInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/CheckboxInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/CheckboxInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/CheckboxInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/CommentOutputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/CommentOutputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/CommentOutputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ConditionalFieldRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ConditionalFieldRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ConditionalFieldRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ConfirmPasswordTextInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ConfirmPasswordTextInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ConfirmPasswordTextInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/DateInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/DateInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/DateInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/DirectoryInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/DirectoryInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/DirectoryInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ExtValidatedTextInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ExtValidatedTextInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ExtValidatedTextInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/FileInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/FileInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/FileInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/HiddenPropertyInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/HiddenPropertyInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/HiddenPropertyInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/LargeSelectInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/LargeSelectInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/LargeSelectInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/LicensePageRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/LicensePageRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/LicensePageRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Pager.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Pager.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Pager.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/PasswordTextInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/PasswordTextInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/PasswordTextInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ProgressPageRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ProgressPageRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ProgressPageRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Res.properties
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Res.properties	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Res.properties	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Res_de.properties
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Res_de.properties	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Res_de.properties	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Res_es.properties
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Res_es.properties	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Res_es.properties	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Res_es_EU.properties
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Res_es_EU.properties	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/Res_es_EU.properties	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/SelectInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/SelectInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/SelectInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/SimpleInputPageRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/SimpleInputPageRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/SimpleInputPageRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/SplashPageRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/SplashPageRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/SplashPageRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TargetInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TargetInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TargetInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TargetSelectInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TargetSelectInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TargetSelectInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TextMessageRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TextMessageRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TextMessageRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TextOutputFieldRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TextOutputFieldRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TextOutputFieldRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TextPageRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TextPageRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/TextPageRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/UnvalidatedTextInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/UnvalidatedTextInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/UnvalidatedTextInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ValidatedTextInputRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ValidatedTextInputRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/ValidatedTextInputRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/package.html
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/package.html	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/renderer/text/package.html	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/AntRunner.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/AntRunner.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/AntRunner.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/AutoSwingRunner.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/AutoSwingRunner.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/AutoSwingRunner.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/AutoTextRunner.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/AutoTextRunner.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/AutoTextRunner.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/ConfigurationException.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/ConfigurationException.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/ConfigurationException.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/ConfigurationLoader.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/ConfigurationLoader.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/ConfigurationLoader.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/ExecInstall.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/ExecInstall.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/ExecInstall.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/IfPropertyHelper.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/IfPropertyHelper.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/IfPropertyHelper.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/Logger.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/Logger.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/Logger.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/Runner.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/Runner.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/Runner.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/SimpleLogger.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/SimpleLogger.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/SimpleLogger.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/SwingRunner.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/SwingRunner.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/SwingRunner.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/TextRunner.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/TextRunner.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/TextRunner.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/VersionHelper.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/VersionHelper.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/VersionHelper.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/AntLauncherFilter.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/AntLauncherFilter.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/AntLauncherFilter.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/AntProjectFilter.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/AntProjectFilter.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/AntProjectFilter.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/CreateLoggerFilter.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/CreateLoggerFilter.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/CreateLoggerFilter.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/CreateUIFilter.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/CreateUIFilter.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/CreateUIFilter.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/ExecuteFilter.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/ExecuteFilter.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/ExecuteFilter.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/ExecuteRunnerFilter.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/ExecuteRunnerFilter.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/ExecuteRunnerFilter.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/FilterChain.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/FilterChain.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/FilterChain.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/FilterFactory.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/FilterFactory.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/FilterFactory.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/FinalizerFilter.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/FinalizerFilter.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/FinalizerFilter.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/InputStreamLoadConfigFilter.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/InputStreamLoadConfigFilter.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/InputStreamLoadConfigFilter.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/LoadConfigFilter.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/LoadConfigFilter.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/LoadConfigFilter.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/PropertyLoaderFilter.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/PropertyLoaderFilter.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/PropertyLoaderFilter.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/PropertyPrinterFilter.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/PropertyPrinterFilter.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/PropertyPrinterFilter.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/nonextractor.fconfig
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/nonextractor.fconfig	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/nonextractor.fconfig	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/script.fconfig
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/script.fconfig	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/script.fconfig	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/selfextractor.fconfig
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/selfextractor.fconfig	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/exe/selfextractor.fconfig	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/CompoundExpression.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/CompoundExpression.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/CompoundExpression.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/EndsWithTest.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/EndsWithTest.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/EndsWithTest.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/EqualsTest.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/EqualsTest.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/EqualsTest.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/Expression.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/Expression.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/Expression.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/ExpressionBuilder.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/ExpressionBuilder.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/ExpressionBuilder.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/GreaterThanOrEqualsTest.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/GreaterThanOrEqualsTest.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/GreaterThanOrEqualsTest.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LessThanOrEqualsTest.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LessThanOrEqualsTest.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LessThanOrEqualsTest.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LiteralValue.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LiteralValue.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LiteralValue.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LogicalAndTest.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LogicalAndTest.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LogicalAndTest.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LogicalOrTest.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LogicalOrTest.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LogicalOrTest.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LogicalTest.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LogicalTest.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/LogicalTest.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/NotEqualsTest.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/NotEqualsTest.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/NotEqualsTest.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/SimpleExpression.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/SimpleExpression.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/SimpleExpression.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/SingleExpressionTest.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/SingleExpressionTest.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/SingleExpressionTest.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/StartsWithTest.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/StartsWithTest.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/StartsWithTest.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/StringLengthComparator.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/StringLengthComparator.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/StringLengthComparator.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/TestOperator.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/TestOperator.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/TestOperator.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/Value.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/Value.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/Value.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/ValuesTest.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/ValuesTest.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/ValuesTest.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/VariableValue.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/VariableValue.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/runtime/logic/VariableValue.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/NonExtractor.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/NonExtractor.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/NonExtractor.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/ProgressIndicator.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/ProgressIndicator.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/ProgressIndicator.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/ResourceExtractor.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/ResourceExtractor.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/ResourceExtractor.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/SelfExtractor.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/SelfExtractor.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/SelfExtractor.java	(revision 18997)
@@ -0,0 +1,468 @@
+/* 
+ * 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();
+		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: /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/package.html
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/package.html	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/antinstaller/selfextract/package.html	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/gui/GBCF.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/gui/GBCF.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/gui/GBCF.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/DefaultingDirectoryChooser.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/DefaultingDirectoryChooser.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/DefaultingDirectoryChooser.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/FollowingJTextArea.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/FollowingJTextArea.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/FollowingJTextArea.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/JTextAreaPrintStream.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/JTextAreaPrintStream.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/JTextAreaPrintStream.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/SelectFileAction.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/SelectFileAction.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/SelectFileAction.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/SystemOutJTextArea.java
===================================================================
--- /release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/SystemOutJTextArea.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/org/tp23/gui/widget/SystemOutJTextArea.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/resources/LICENSE-ant-install.txt
===================================================================
--- /release-kits/shared/core/ant-installer/src/resources/LICENSE-ant-install.txt	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/resources/LICENSE-ant-install.txt	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src/resources/icons/LICENSE
===================================================================
--- /release-kits/shared/core/ant-installer/src/resources/icons/LICENSE	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src/resources/icons/LICENSE	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/runtime/exe/ReleaseNotesFilter.java
===================================================================
--- /release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/runtime/exe/ReleaseNotesFilter.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/runtime/exe/ReleaseNotesFilter.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/runtime/exe/ReleaseNotesFrame.java
===================================================================
--- /release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/runtime/exe/ReleaseNotesFrame.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/runtime/exe/ReleaseNotesFrame.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/taskdefs/Installer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/taskdefs/Installer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/taskdefs/Installer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/taskdefs/KdeIconTask.java
===================================================================
--- /release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/taskdefs/KdeIconTask.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/taskdefs/KdeIconTask.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/taskdefs/ValidateConfig.java
===================================================================
--- /release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/taskdefs/ValidateConfig.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/taskdefs/ValidateConfig.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/util/CreateLanguagePack.java
===================================================================
--- /release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/util/CreateLanguagePack.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/util/CreateLanguagePack.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/util/LangPackFileRenderer.java
===================================================================
--- /release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/util/LangPackFileRenderer.java	(revision 18997)
+++ /release-kits/shared/core/ant-installer/src_ext/org/tp23/antinstaller/util/LangPackFileRenderer.java	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/templates/defaultproject/README.txt
===================================================================
--- /release-kits/shared/core/ant-installer/templates/defaultproject/README.txt	(revision 18997)
+++ /release-kits/shared/core/ant-installer/templates/defaultproject/README.txt	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/templates/defaultproject/ant.install.log
===================================================================
--- /release-kits/shared/core/ant-installer/templates/defaultproject/ant.install.log	(revision 18997)
+++ /release-kits/shared/core/ant-installer/templates/defaultproject/ant.install.log	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/templates/defaultproject/ant.install.properties
===================================================================
--- /release-kits/shared/core/ant-installer/templates/defaultproject/ant.install.properties	(revision 18997)
+++ /release-kits/shared/core/ant-installer/templates/defaultproject/ant.install.properties	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/templates/defaultproject/antinstall-config-template.xml
===================================================================
--- /release-kits/shared/core/ant-installer/templates/defaultproject/antinstall-config-template.xml	(revision 18997)
+++ /release-kits/shared/core/ant-installer/templates/defaultproject/antinstall-config-template.xml	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/templates/defaultproject/antinstall-config.xml
===================================================================
--- /release-kits/shared/core/ant-installer/templates/defaultproject/antinstall-config.xml	(revision 18997)
+++ /release-kits/shared/core/ant-installer/templates/defaultproject/antinstall-config.xml	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/templates/defaultproject/build-self-extractor-template.sh
===================================================================
--- /release-kits/shared/core/ant-installer/templates/defaultproject/build-self-extractor-template.sh	(revision 18997)
+++ /release-kits/shared/core/ant-installer/templates/defaultproject/build-self-extractor-template.sh	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/templates/defaultproject/build-template.xml
===================================================================
--- /release-kits/shared/core/ant-installer/templates/defaultproject/build-template.xml	(revision 18997)
+++ /release-kits/shared/core/ant-installer/templates/defaultproject/build-template.xml	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/templates/defaultproject/build.xml
===================================================================
--- /release-kits/shared/core/ant-installer/templates/defaultproject/build.xml	(revision 18997)
+++ /release-kits/shared/core/ant-installer/templates/defaultproject/build.xml	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/templates/defaultproject/create-installer-template.xml
===================================================================
--- /release-kits/shared/core/ant-installer/templates/defaultproject/create-installer-template.xml	(revision 18997)
+++ /release-kits/shared/core/ant-installer/templates/defaultproject/create-installer-template.xml	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/templates/defaultproject/runtemplate.cmd
===================================================================
--- /release-kits/shared/core/ant-installer/templates/defaultproject/runtemplate.cmd	(revision 18997)
+++ /release-kits/shared/core/ant-installer/templates/defaultproject/runtemplate.cmd	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/templates/defaultproject/runtemplate.sh
===================================================================
--- /release-kits/shared/core/ant-installer/templates/defaultproject/runtemplate.sh	(revision 18997)
+++ /release-kits/shared/core/ant-installer/templates/defaultproject/runtemplate.sh	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/windows-icons/installIcons-docs.cmd
===================================================================
--- /release-kits/shared/core/ant-installer/windows-icons/installIcons-docs.cmd	(revision 18997)
+++ /release-kits/shared/core/ant-installer/windows-icons/installIcons-docs.cmd	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/windows-icons/installIcons-docs.inf
===================================================================
--- /release-kits/shared/core/ant-installer/windows-icons/installIcons-docs.inf	(revision 18997)
+++ /release-kits/shared/core/ant-installer/windows-icons/installIcons-docs.inf	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/wizard.cmd
===================================================================
--- /release-kits/shared/core/ant-installer/wizard.cmd	(revision 18997)
+++ /release-kits/shared/core/ant-installer/wizard.cmd	(revision 18997)
@@ -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: /release-kits/shared/core/ant-installer/wizard.sh
===================================================================
--- /release-kits/shared/core/ant-installer/wizard.sh	(revision 18997)
+++ /release-kits/shared/core/ant-installer/wizard.sh	(revision 18997)
@@ -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: /release-kits/shared/core/ant-scripts/init.xml
===================================================================
--- /release-kits/shared/core/ant-scripts/init.xml	(revision 18997)
+++ /release-kits/shared/core/ant-scripts/init.xml	(revision 18997)
@@ -0,0 +1,398 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<project name="rk-init">
+
+	<!-- load in static properties from build.properties -->
+	<property file="${rk.name}-build.properties" />
+
+	<!-- 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"/>
+
+	<!-- current date and time -->
+	<tstamp>
+		<format property="current.month" pattern="MMM"/>
+		<format property="current.year" pattern="yyyy"/>
+	</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 -->
+	<!-- 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="linux-java.extracted" value="jre"/> <!-- set this to the name of the top level directory 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="windows-java.extracted" value="jre"/> <!-- set this to the name of the top level directory 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="5.5.25"/>
+	<property name="bundled.version.ant" value="1.6.5"/>
+	
+	<!-- CLASSPATH -->
+	<path id="project.classpath">
+
+		<!-- our classes -->
+		<fileset dir="${rk.home}">
+			<include name="ant-scripts/tasks/antelope/AntelopeTasks_3.4.2.jar"/>
+			<include name="ant-scripts/tasks/orangevolt/roxes-win32forjava-1.1.1.jar"/>
+			<include name="ant-scripts/tasks/orangevolt/orangevolt-ant-tasks-1.3.8.jar"/>
+			<include name="ant-scripts/tasks/svnant/lib/ganymed.jar"/>
+			<include name="ant-scripts/tasks/svnant/lib/svnClientAdapter.jar"/>
+			<include name="ant-scripts/tasks/svnant/lib/svnant.jar"/>
+			<include name="ant-scripts/tasks/svnant/lib/svnjavahl.jar"/>
+			<include name="ant-scripts/tasks/svnant/lib/svnkit.jar"/>
+			<include name="ant-scripts/tasks/greenstone/anttasks.jar"/>
+			<include name="ant-scripts/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="packages/ant-installer/lib/ant-installer-ext.jar"/>
+			<include name="packages/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="svn" classname="org.tigris.subversion.svnant.SvnTask" 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}/lib/dates.properties" propertyName="ar.Dates.${current.month}" outputProperty="month.ar"/>
+	<get-property-value propertiesFile="${rk.home}/lib/dates.properties" propertyName="ca.Dates.${current.month}" outputProperty="month.ca"/>
+	<get-property-value propertiesFile="${rk.home}/lib/dates.properties" propertyName="el.Dates.${current.month}" outputProperty="month.el"/>
+	<get-property-value propertiesFile="${rk.home}/lib/dates.properties" propertyName="es.Dates.${current.month}" outputProperty="month.es"/>
+	<get-property-value propertiesFile="${rk.home}/lib/dates.properties" propertyName="fr.Dates.${current.month}" outputProperty="month.fr"/>
+	<get-property-value propertiesFile="${rk.home}/lib/dates.properties" propertyName="lv.Dates.${current.month}" outputProperty="month.lv"/>
+	<get-property-value propertiesFile="${rk.home}/lib/dates.properties" propertyName="mr.Dates.${current.month}" outputProperty="month.mr"/>
+	<get-property-value propertiesFile="${rk.home}/lib/dates.properties" propertyName="ro.Dates.${current.month}" outputProperty="month.ro"/>
+	<get-property-value propertiesFile="${rk.home}/lib/dates.properties" propertyName="ru.Dates.${current.month}" outputProperty="month.ru"/>
+	<get-property-value propertiesFile="${rk.home}/lib/dates.properties" propertyName="vi.Dates.${current.month}" outputProperty="month.vi"/>
+	<get-property-value propertiesFile="${rk.home}/lib/dates.properties" propertyName="zh.Dates.${current.month}" outputProperty="month.zh"/>
+	<get-property-value propertiesFile="${rk.home}/lib/dates.properties" propertyName="default.Dates.${current.month}" outputProperty="month.default"/>
+	<!--
+	<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>
+	-->
+
+	<!-- CHECKS PRE-CONDITIONS  -->
+	<target name="init">
+
+		<!-- 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}"/>
+
+		<!-- execute target code or just show the tree -->
+		<if>
+			<bool>
+				<not><isset property="execute"/></not>
+			</bool>
+			<property name="execute" value="true"/>
+			<else>
+				<if>
+					<bool>
+						<and>
+							<not><equals arg1="${execute}" arg2="true"/></not>
+							<not><equals arg1="${execute}" arg2="false"/></not>
+						</and>
+					</bool>
+					<echo level="error">You have not specified a valid value for execute.</echo>
+					<echo level="error">Valid values are 'true' and 'false'.</echo>
+					<fail>You have not specified a valid value for execute.</fail>
+				</if>
+			</else>
+		</if>
+
+		<!-- show important properties -->
+		<echo level="info">Version (version): ${version}</echo>
+		<echo level="info">Branch Path (branch.path): ${branch.path}</echo>
+		<echo level="info">Current Month (current.month): ${current.month}</echo>
+		<echo level="info">Current Year (current.year): ${current.year}</echo>
+
+	</target>
+
+	<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 name="compile-binary-installer">
+
+		<copy file="${basedir}/installer/antinstall-config.xml" tofile="${basedir}/installer/antinstall-config-binary.xml"/>
+		<dcff file="${basedir}/installer/antinstall-config-binary.xml" startTag=".*&lt;!-- start source release --&gt;.*" endTag=".*&lt;!-- end source release --&gt;.*" />
+		<installer file="${basedir}/installer/Greenstone-${version}-${os.suffix}.jar"
+			compress="true"
+			extractType="NonExtractor"
+			installConfig="${basedir}/installer/antinstall-config-binary.xml"
+			buildFile="${basedir}/installer/build.xml"
+			antInstallLib="${rk.home}/packages/ant-installer/lib"
+			antLib="${rk.home}/packages/ant/lib"
+			validateConfig="true"
+			icons="bluecurve">
+
+			<zipfileset dir="${basedir}/installer/classes" includes="**/*" />
+			<zipfileset dir="${basedir}/components" includes="*.lzma" excludes="source-release.lzma" />
+
+		</installer>
+		
+	</target>
+
+	<target name="compile-minimal-installer">
+	
+		<copy file="${basedir}/installer/antinstall-config.xml" tofile="${basedir}/installer/antinstall-config-minimal.xml"/>
+		<dcff file="${basedir}/installer/antinstall-config-minimal.xml" startTag=".*&lt;!-- start source release --&gt;.*" endTag=".*&lt;!-- end source release --&gt;.*" />
+		<dcff file="${basedir}/installer/antinstall-config-minimal.xml" startTag=".*&lt;!-- start bundled components --&gt;.*" endTag=".*&lt;!-- end bundled components --&gt;.*" />
+		<installer file="${basedir}/installer/Greenstone-${version}-${os.suffix}-minimal.jar"
+			compress="true"
+			extractType="NonExtractor"
+			installConfig="${basedir}/installer/antinstall-config-minimal.xml"
+			buildFile="${basedir}/installer/build.xml"
+			antInstallLib="${rk.home}/packages/ant-installer/lib"
+			antLib="${rk.home}/packages/ant/lib"
+			validateConfig="true"
+			icons="bluecurve">
+			
+			<zipfileset dir="${basedir}/installer/classes" includes="**/*" />
+			<zipfileset dir="${basedir}/components" includes="core.lzma" />
+		</installer>
+		
+	</target>
+
+	<target name="compile-source-installer">
+
+		<copy file="${basedir}/installer/antinstall-config.xml" tofile="${basedir}/installer/antinstall-config-source.xml"/>
+		<dcff file="${basedir}/installer/antinstall-config-source.xml" startTag=".*&lt;!-- start binary release --&gt;.*" endTag=".*&lt;!-- end binary release --&gt;.*" />
+		<installer file="${basedir}/installer/Greenstone-${version}-${os.suffix}-source.jar"
+			compress="true"
+			extractType="NonExtractor"
+			installConfig="${basedir}/installer/antinstall-config-source.xml"
+			buildFile="${basedir}/installer/build.xml"
+			antInstallLib="${rk.home}/packages/ant-installer/lib"
+			antLib="${rk.home}/packages/ant/lib"
+			validateConfig="true"
+			icons="bluecurve">
+			
+			<zipfileset dir="${basedir}/installer/classes" includes="**/*" />
+			<zipfileset dir="${basedir}/components" includes="source-release.lzma" />
+		</installer>
+
+	</target>
+
+	<!-- fork the web distribution to preserve a source release -->
+	<target name="copy-web-to-source">
+		<copy todir="distributions/source"><fileset dir="distributions/web"/></copy>
+	</target>
+
+	<target name="copy-main-installer-files">
+
+		<mkdir dir="${basedir}/installer/classes"/>
+
+		<!-- the installer descriptors -->
+		<copy todir="${basedir}/installer" file="${rk.home}/installer/antinstall-config.xml" overwrite="true" />
+		<copy todir="${basedir}/installer" file="${rk.home}/installer/build.xml" overwrite="true" />
+
+		<!-- the language bundle -->
+		<native2ascii
+			implementation="sun"
+			encoding="UTF-8"
+			src="${rk.home}/language-strings"
+			dest="${basedir}/installer/classes/resources"/>
+
+		<!-- os- and major version-specific files -->
+		<copy todir="${basedir}/installer/classes" overwrite="true">
+			<fileset dir="${rk.home}/linux/installer-classes" erroronmissingdir="false"/>
+			<fileset dir="${rk.home}/windows/installer-classes"  erroronmissingdir="false"/>
+			<fileset dir="${rk.home}/greenstone3/installer-classes" erroronmissingdir="false"/>
+			<fileset dir="${rk.home}/greenstone2/installer-classes" erroronmissingdir="false"/>
+		</copy>
+
+	</target>
+
+	<target name="make-installer-files-concrete">
+
+		<!-- calculate the size of components -->
+		<echo>Calculating the size of some components</echo>
+
+		<!-- core -->
+		<length property="component.bytesize.core-without-jre" mode="all"><fileset file="${basedir}/components/core.comp"/></length>
+		<if><bool><equals arg1="${java.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="${java.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"/>
+
+		<!-- sourcecode core -->
+		<length property="component.bytesize.sourcecode-core" mode="all"><fileset file="${basedir}/components/sourcecode-core.comp"/></length>
+		<math result="component.megabytesize.sourcecode-core" operand1="${component.bytesize.sourcecode-core}" operation="/" operand2="1048576" datatype="int"/>
+		<property name="component.size.sourcecode-core" value="${component.megabytesize.sourcecode-core} MB"/>
+
+		<!-- sourcecode -->
+		<length property="component.bytesize.sourcecode" mode="all"><fileset file="${basedir}/components/sourcecode.comp"/></length>
+		<math result="component.megabytesize.sourcecode" operand1="${component.bytesize.sourcecode}" operation="/" operand2="1048576" datatype="int"/>
+		<property name="component.size.sourcecode" value="${component.megabytesize.sourcecode} MB"/>
+
+		<!-- 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"/>
+
+		<!-- 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"/>
+
+		<!-- 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"/>
+
+		<!-- ant -->
+		<length property="component.bytesize.ant" mode="all"><fileset file="${basedir}/components/ant.comp"/></length>
+		<math result="component.megabytesize.ant" operand1="${component.bytesize.ant}" operation="/" operand2="1048576" datatype="int"/>
+		<property name="component.size.ant" value="${component.megabytesize.ant} MB"/>
+		
+		<!-- 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.sourcecode-core@" replacement="${component.size.sourcecode-core}"/>
+			<job pattern="@component.size.sourcecode@" replacement="${component.size.sourcecode}"/>
+			<job pattern="@component.size.tomcat@" replacement="${component.size.tomcat}"/>
+			<job pattern="@component.size.ant@" replacement="${component.size.ant}"/>
+			<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="@windows-java.extracted@" replacement="${windows-java.extracted}"/>
+			<job pattern="@linux-java.extracted@" replacement="${linux-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.ant@" replacement="${bundled.version.ant}"/>
+			<job pattern="@bundled.version.windows-java@" replacement="${bundled.version.windows-java}"/>
+			<job pattern="@bundled.version.linux-java@" replacement="${bundled.version.linux-java}"/>
+		</rsr>
+
+	</target>
+
+	<!-- shared target to compile the uninstaller -->
+	<target name="compile-uninstaller">
+		<echo>Compiling Uninstaller</echo>
+
+		<!-- create working build directory -->
+		<mkdir dir="${basedir}/compiled/uninstaller/build/resources" />
+
+		<!-- copile to build -->
+		<javac
+			srcdir="${rk.home}/uninstaller"
+			destdir="${basedir}/compiled/uninstaller/build" />
+
+		<!-- copy language bundle into place -->
+		<native2ascii
+			implementation="sun"
+			src="${rk.home}/language-strings"
+			dest="${basedir}/compiled/uninstaller/build/resources"/>
+
+		<!-- jar it all up -->
+		<jar
+			destfile="${basedir}/compiled/uninst.jar"
+			manifest="${rk.home}/uninstaller/manifest.mf"
+			basedir="${basedir}/compiled/uninstaller/build" />
+
+	</target>
+
+	<!-- copy the uninstaller script from the rk to web distribution -->
+	<target name="insert-uninstaller">
+		<copy file="${rk.home}/uninstaller/Uninstall.${script-format}" todir="distributions/web" />
+	</target>
+
+	<!-- create the zipped up binary release from the web distribution -->
+	<target name="compress-zipped-binary-release">
+		<mkdir dir="products"/>
+		<if>
+			<bool><equals arg1="zip" arg2="${format}"/></bool>
+			<zip destfile="products/Greenstone-${version}-${os.suffix}-binary.zip" basedir="distributions" includes="Greenstone-${version}-${os.suffix}-binary/**/*" compress="true"/>
+			<else>
+				<exec dir="distributions" executable="tar">
+					<arg line="-czf ../products/Greenstone-${version}-${os.suffix}-binary.tar.gz Greenstone-${version}-${os.suffix}-binary"/>
+				</exec>
+			</else>
+		</if>
+	</target>
+
+	<!-- unzip windows perl into bin/windows of the given gsdl or gs2build -->
+	<target name="insert-windows-perl">
+		<mkdir dir="${gsdl.basedir}/bin/windows"/>
+		<delete dir="${gsdl.basedir}/bin/windows/perl"/>
+		<unzip src="${rk.home}/windows/perl.zip" dest="${gsdl.basedir}/bin/windows"/>
+	</target>
+	<target name="copy-compiled-to-dist">
+		<delete dir="distributions/web"/>
+		<mkdir dir="distributions"/>
+		<exec executable="cp"><arg line="-r compiled distributions/web"/></exec>
+	</target>
+
+</project>
Index: /release-kits/shared/core/ant-scripts/operations-on-gli.xml
===================================================================
--- /release-kits/shared/core/ant-scripts/operations-on-gli.xml	(revision 18997)
+++ /release-kits/shared/core/ant-scripts/operations-on-gli.xml	(revision 18997)
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<project name="operations-on-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>
+
+</project>
Index: /release-kits/shared/core/ant-tasks/antelope/ChangeLog.txt
===================================================================
--- /release-kits/shared/core/ant-tasks/antelope/ChangeLog.txt	(revision 18997)
+++ /release-kits/shared/core/ant-tasks/antelope/ChangeLog.txt	(revision 18997)
@@ -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: /release-kits/shared/core/ant-tasks/antelope/install_tasks.txt
===================================================================
--- /release-kits/shared/core/ant-tasks/antelope/install_tasks.txt	(revision 18997)
+++ /release-kits/shared/core/ant-tasks/antelope/install_tasks.txt	(revision 18997)
@@ -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: /release-kits/shared/core/ant-tasks/antelope/license.txt
===================================================================
--- /release-kits/shared/core/ant-tasks/antelope/license.txt	(revision 18997)
+++ /release-kits/shared/core/ant-tasks/antelope/license.txt	(revision 18997)
@@ -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: /release-kits/shared/core/ant-tasks/svnant/GANYMED-LICENSE
===================================================================
--- /release-kits/shared/core/ant-tasks/svnant/GANYMED-LICENSE	(revision 18997)
+++ /release-kits/shared/core/ant-tasks/svnant/GANYMED-LICENSE	(revision 18997)
@@ -0,0 +1,57 @@
+Copyright (c) 2005 - 2006 Swiss Federal Institute of Technology (ETH Zurich),
+  Department of Computer Science (http://www.inf.ethz.ch),
+  Christian Plattner. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+a.) Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+b.) 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.
+c.) Neither the name of ETH Zurich 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.
+
+
+The Java implementations of the AES, Blowfish and 3DES ciphers have been
+taken (and slightly modified) from the cryptography package released by
+"The Legion Of The Bouncy Castle".
+
+Their license states the following:
+
+Copyright (c) 2000 - 2004 The Legion Of The Bouncy Castle
+(http://www.bouncycastle.org)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE. 
+
Index: /release-kits/shared/core/ant-tasks/svnant/SVNKit-LICENSE
===================================================================
--- /release-kits/shared/core/ant-tasks/svnant/SVNKit-LICENSE	(revision 18997)
+++ /release-kits/shared/core/ant-tasks/svnant/SVNKit-LICENSE	(revision 18997)
@@ -0,0 +1,47 @@
+The TMate License
+
+This license applies to all portions of TMate SVNKit library, which 
+are not externally-maintained libraries (e.g. Ganymed SSH library).
+
+All the source code and compiled classes in package org.trigris.subversion.javahl
+except SvnClient class are covered by the license in JAVAHL-LICENSE file
+
+Copyright (c) 2004-2006 TMate Software. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, 
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice, 
+      this list of conditions and the following disclaimer.
+      
+    * 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.
+      
+    * Redistributions in any form must be accompanied by information on how to 
+      obtain complete source code for the software that uses SVNKit and any 
+      accompanying software that uses the software that uses SVNKit. The source 
+      code must either be included in the distribution or be available for no 
+      more than the cost of distribution plus a nominal fee, and must be freely 
+      redistributable under reasonable conditions. For an executable file, complete 
+      source code means the source code for all modules it contains. It does not 
+      include source code for modules or files that typically accompany the major 
+      components of the operating system on which the executable file runs.
+      
+    * Redistribution in any form without redistributing source code for software 
+      that uses SVNKit is possible only when such redistribution is explictly permitted 
+      by TMate Software. Please, contact TMate Software at support@svnkit.com to 
+      get such permission.
+
+THIS SOFTWARE IS PROVIDED BY TMATE SOFTWARE ``AS IS'' AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE 
+DISCLAIMED. 
+
+IN NO EVENT SHALL TMATE SOFTWARE 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: /release-kits/shared/core/ant-tasks/svnant/build.properties
===================================================================
--- /release-kits/shared/core/ant-tasks/svnant/build.properties	(revision 18997)
+++ /release-kits/shared/core/ant-tasks/svnant/build.properties	(revision 18997)
@@ -0,0 +1,17 @@
+# -----------------------------------------------------------------------------
+# build.properties
+# This file is referenced by the sample build.xml file.
+# -----------------------------------------------------------------------------
+
+svnant.version=1.2.0-RC1
+
+# -----------------------------------------------------------------------------
+# all jar needed
+# -----------------------------------------------------------------------------
+lib.dir=lib
+
+svnant.latest.url=http://subclipse.tigris.org/svn/subclipse/trunk/svnant/
+svnant.this.url=http://subclipse.tigris.org/svn/subclipse/tags/svnant/${svnant.version}/
+
+svnant.repository.user=guest
+svnant.repository.passwd=""
Index: /release-kits/shared/core/ant-tasks/svnant/build.xml
===================================================================
--- /release-kits/shared/core/ant-tasks/svnant/build.xml	(revision 18997)
+++ /release-kits/shared/core/ant-tasks/svnant/build.xml	(revision 18997)
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<!-- Sample build file used to retrieve svnant's sources -->
+<project name="svn-test" basedir="." default="checkoutThis">
+  
+  <!--  all properties are in build.properties --> 
+  <property file="build.properties" /> 
+
+  <!-- path to the svnant libraries. Usually they will be located in ANT_HOME/lib -->
+  <path id="svnant.classpath">
+    <fileset dir="${lib.dir}">
+      <include name="**/*.jar"/>
+    </fileset>
+  </path>  
+  
+  <!-- load the svn task -->
+  <typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpathref="svnant.classpath" />
+  
+  <target name="clean">
+    <delete dir="src_latest"/>
+    <delete dir="src_${svnant.version}"/>  
+  </target>
+
+  <target name="checkoutLatest">
+    <svn username="${svnant.repository.user}" password="${svnant.repository.passwd}">
+      <checkout url="${svnant.latest.url}" revision="HEAD" destPath="src_latest" />
+    </svn>
+  </target>
+
+  <target name="checkoutThis">
+    <svn username="${svnant.repository.user}" password="${svnant.repository.passwd}">
+      <checkout url="${svnant.this.url}" revision="HEAD" destPath="src_${svnant.version}" />
+    </svn>
+  </target>
+
+</project>
Index: /release-kits/shared/core/ant-tasks/svnant/changelog.txt
===================================================================
--- /release-kits/shared/core/ant-tasks/svnant/changelog.txt	(revision 18997)
+++ /release-kits/shared/core/ant-tasks/svnant/changelog.txt	(revision 18997)
@@ -0,0 +1,23 @@
+* 1.2-rc1
+- Built against svnClientAdapter r3957, Subversion 1.5, SVNKit 1.20 beta4
+
+* 1.1-rc3
+- Built against svnClientAdapter r2847, Subversion 1.4.2 and SVNKit 1.1.0
+- renamed references to JavaSVN (former name of SVNKit)
+- renamed the svn task attribute "javasvn" to "svnkit"
+
+* 1.1-rc2
+- Built against svnClientAdapter r2834 and Subversion 1.4.0,
+  incorporating numerous bug fixes and improvements from both.
+- Added support for javasvn adapter
+- Added the "url" option to <propget> command
+- Added the "lastChangedDateProperty" to <status> command
+- Added the "dateFormatter" attribute to <svn> task
+- Added the "failonerror" attribute to <svn> task and svn selectors
+- Added the <wcVersion> command
+- Added the <log> command
+- Added svn related selectors 
+- Added SvnFileSet type
+- Added the force option to <add> command
+  
+* 1.0.0
Index: /release-kits/shared/core/ant-tasks/svnant/doc/conditions.html
===================================================================
--- /release-kits/shared/core/ant-tasks/svnant/doc/conditions.html	(revision 18997)
+++ /release-kits/shared/core/ant-tasks/svnant/doc/conditions.html	(revision 18997)
@@ -0,0 +1,254 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns:ant="http://www.fiset.ca/ant-docs/v1" xmlns:html="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252"/>
+<title>Svn Conditions</title>
+<META HTTP-EQUIV="Content-Language" CONTENT="en-us"/>
+<style type="text/css">	
+				
+				body {
+					font: 80% Verdana, Arial, Helvetica, sans-serif;
+					margin: 5px; padding: 0;
+				/*	background: rgb(95%,95%,80%);  */
+					color: black;
+				}
+				h1 {
+					font-size: 200%; letter-spacing: 3px;
+					margin-bottom: 1em; 
+					padding: 0.66em 0 0.33em 1em;
+					background: rgb(85%,85%,70%);
+				}
+				h2 {
+					background: rgb(90%,90%,80%);
+				}
+				h3 {
+					background-color: rgb(95%,95%,85%);
+				}
+				.sample {
+					font-family: Courier, "Courier New", monospace;
+					background-color: #f3f1f4;
+				 }
+				div.sample {
+					margin-left: 10px;
+					margin-right: 10px;
+					padding-top: 3px;
+					padding-bottom: 3px;
+					padding-left: 3px;
+					padding-right: 3px;
+					border:1px dashed black;
+					width: 80%;
+				 }
+				 table.params {
+					width: 80%;
+					border: 1px solid gray;
+					margin-bottom:1em;
+				 }
+				 th.params, td.params {
+					padding: 0 0.5em;
+					border-left: 1px solid #DDD;
+					border-bottom: 1px solid #DDD;
+					font: 70%
+				}
+				th.params {
+					
+				}
+				table.toc {
+					width: 80%;
+					border: 1px solid gray;
+					margin-bottom:1em;
+				}
+				td.toc {
+					padding: 0 0.5em;
+					border: none
+					font: 70%
+				}
+				table.type {
+					width: 80%;
+					border: none;
+					margin-bottom:1em;
+				}
+				th.type, td.type {
+					text-align: left;
+					padding: 0 0.5em;
+					border: none
+					font: 70%
+				}
+				th.type {
+					font-weight: bold;
+				}
+				
+			</style>
+</head>
+<body lang="en-US" dir="LTR">
+<h1>Svn Conditions</h1>
+<h2>Table of Content</h2>
+<table class="toc">
+<tbody class="toc">
+<tr class="toc">
+<td class="toc">
+<a href="#svnExists">svnExists</a>
+</td>
+<td class="toc">Ant condition that returns true if an element exists in the repository</td>
+</tr>
+</tbody>
+</table>
+<h2>Introduction</h2>
+<ant:introduction xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		<p>
+			This document describes the conditions offered in svnant. To use those conditions,
+			you must first obtain a copy of svnant.jar, add it to the classpath of your ant project
+			and define the types. Fortunately, there is a resource file, within the distributed JAR file,
+			and all those steps can be accomplished with the following code:
+			<div class="sample">
+<pre class="sample">
+				
+&lt;path id="svnant.classpath"&gt;
+  &lt;pathelement location="${svnant.dir}/lib/svnant.jar" /&gt;
+  &lt;pathelement location="${svnant.dir}/lib/svnClientAdapter.jar" /&gt;
+&lt;/path&gt;  
+
+&lt;typedef resource="svntypes.xml" classpathref="project.classpath"/&gt;
+				
+			</pre>
+</div>
+		</p>
+		<p>
+			If you are upgrading from an earlier version of svnant, and the following line was used
+			in your <i>build.xml</i> file, then replace it with the ones above.
+			<div class="sample">
+<pre class="sample">
+				
+&lt;taskdef resource="svntask.properties" classpathref="svnant.classpath"/&gt;
+				
+			</pre>
+</div>
+		</p>
+		<h3>
+<a name="bindings">Bindings</a>
+</h3>
+		<p>
+			All conditions offer two parameters: <b>javahl</b> and <b>svnkit</b>. Those parameters
+			are booleans, which means their values can be set to either <b>true</b> or <b>false</b>. 
+			If not specified, those parameters are assumed to be set (true). These two parameters are used
+			to select which client is used to access Subversion.
+		</p>
+		<p>
+			There are three clients used by svnant to access Subversion:
+			<ul>
+				<li>JavaHL;</li>
+				<li>SVNKit; and,</li>
+				<li>Command Line Interface.</li>
+			</ul>
+			To better understand the difference between those three clients, please refer to
+			documentation on <b>svnClientAdapter.jar</b>.
+		</p>
+		<p>
+			The property <b>javahl</b> is considered only if the javahl libraries are available. Similarly,
+			the property <b>svnkit</b> is considered only if SVNKit is present. Finally, <b>javahl</b>
+			takes precedence over <b>svnkit</b>.
+		</p>
+		<p>
+			To better illustrate the previous paragraph, use the following steps:
+			<ol>
+				<li>If <b>javahl</b> is <i>true</i> and JavaHL bindings are available, then JavaHL is used.</li>
+				<li>If <b>svnkit</b> is <i>true</i> and SVNKit is present, then SVNKit is used.</li>
+				<li>If the two previous tests failed, for any reason, then the Command Line Interface is used.</li>
+			</ol>
+		</p>
+	</ant:introduction>
+<h1>
+<a name="">svnExists</a>
+</h1>
+<p>Ant condition that returns true if an element exists in the repository</p>
+<table class="type">
+<tbody class="type">
+<tr class="type">
+<th class="type">Implementation:</th>
+<td class="type">org.tigris.subclipse.svnant.conditions.Exists</td>
+</tr>
+</tbody>
+</table>
+<h2>Parameters</h2>
+<table class="params">
+<tr class="params">
+<th class="params">Attribute</th>
+<th class="params">Description</th>
+<th class="params">Required</th>
+</tr>
+<tr class="params">
+<td class="params">target</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				File name or URL to the element to be queried during the condition.
+			</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				Yes
+			</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">javahl</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		If set, instructs the use of JavaHL bindings, if available.
+		Set to <b>false</b> to use command line client interface to subversion. 
+		Defaults to true. See <a href="#bindings">note</a> for more details.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No
+	</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">svnkit</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		If set, instructs the use of SVNKit bindings, if available.
+		Set to <b>false</b> to use command line client interface to subversion. 
+		Defaults to true. See <a href="#bindings">note</a> for more details.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No
+	</ant:required>
+</td>
+</tr>
+</table>
+<h2>Nested Types</h2>No nested types defined for this type.<h2>Description</h2>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				This is a custom condition, as defined in the Ant documentation. A custom
+				condition must be employed in conjunction with a &lt;Condition&gt; task
+				to set a property.
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				This custom condition is used to determine if an element exists in the repository. The condition returns
+				true if the element is known to te repository. It uses a process similar to "svn info"
+				to determine the existence of an element. If "svn info" can return information
+				about a file or a directory, then the svnExists condition should return true for
+				such file or directory.
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				Example: determine if there exist a "build.xml" file for a project
+				<div class="sample">
+<pre class="sample">
+
+&lt;condition 
+	property="fileExists" 
+	value="true"
+	else="false"
+	&gt;
+	&lt;svnExists javahl="${javahl}" svnkit="${svnkit}" target="http://svn.mycompany.com/project/trunk/build.xml"/&gt;
+&lt;/condition&gt;
+&lt;echo&gt;fileExists: ${fileExists}&lt;/echo&gt;
+					
+				</pre>
+</div>
+			</p>
+		</body>
+</html>
Index: /release-kits/shared/core/ant-tasks/svnant/doc/selectors.html
===================================================================
--- /release-kits/shared/core/ant-tasks/svnant/doc/selectors.html	(revision 18997)
+++ /release-kits/shared/core/ant-tasks/svnant/doc/selectors.html	(revision 18997)
@@ -0,0 +1,1124 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns:ant="http://www.fiset.ca/ant-docs/v1" xmlns:html="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252"/>
+<title>Svn Selectors</title>
+<META HTTP-EQUIV="Content-Language" CONTENT="en-us"/>
+<style type="text/css">	
+				
+				body {
+					font: 80% Verdana, Arial, Helvetica, sans-serif;
+					margin: 5px; padding: 0;
+				/*	background: rgb(95%,95%,80%);  */
+					color: black;
+				}
+				h1 {
+					font-size: 200%; letter-spacing: 3px;
+					margin-bottom: 1em; 
+					padding: 0.66em 0 0.33em 1em;
+					background: rgb(85%,85%,70%);
+				}
+				h2 {
+					background: rgb(90%,90%,80%);
+				}
+				h3 {
+					background-color: rgb(95%,95%,85%);
+				}
+				.sample {
+					font-family: Courier, "Courier New", monospace;
+					background-color: #f3f1f4;
+				 }
+				div.sample {
+					margin-left: 10px;
+					margin-right: 10px;
+					padding-top: 3px;
+					padding-bottom: 3px;
+					padding-left: 3px;
+					padding-right: 3px;
+					border:1px dashed black;
+					width: 80%;
+				 }
+				 table.params {
+					width: 80%;
+					border: 1px solid gray;
+					margin-bottom:1em;
+				 }
+				 th.params, td.params {
+					padding: 0 0.5em;
+					border-left: 1px solid #DDD;
+					border-bottom: 1px solid #DDD;
+					font: 70%
+				}
+				th.params {
+					
+				}
+				table.toc {
+					width: 80%;
+					border: 1px solid gray;
+					margin-bottom:1em;
+				}
+				td.toc {
+					padding: 0 0.5em;
+					border: none
+					font: 70%
+				}
+				table.type {
+					width: 80%;
+					border: none;
+					margin-bottom:1em;
+				}
+				th.type, td.type {
+					text-align: left;
+					padding: 0 0.5em;
+					border: none
+					font: 70%
+				}
+				th.type {
+					font-weight: bold;
+				}
+				
+			</style>
+</head>
+<body lang="en-US" dir="LTR">
+<h1>Svn Selectors</h1>
+<h2>Table of Content</h2>
+<table class="toc">
+<tbody class="toc">
+<tr class="toc">
+<td class="toc">
+<a href="#svnAdded">svnAdded</a>
+</td>
+<td class="toc">File selector that performs discrimination based on the 'added' subversion status. </td>
+</tr>
+<tr class="toc">
+<td class="toc">
+<a href="#svnModified">svnModified</a>
+</td>
+<td class="toc">File selector that performs discrimination based on the 'modified' subversion status. </td>
+</tr>
+<tr class="toc">
+<td class="toc">
+<a href="#svnUnversioned">svnUnversioned</a>
+</td>
+<td class="toc">File selector that performs discrimination based on the 'unversioned' subversion status. </td>
+</tr>
+<tr class="toc">
+<td class="toc">
+<a href="#svnConflicted">svnConflicted</a>
+</td>
+<td class="toc">File selector that performs discrimination based on the 'conflicted' subversion status. </td>
+</tr>
+<tr class="toc">
+<td class="toc">
+<a href="#svnIgnored">svnIgnored</a>
+</td>
+<td class="toc">File selector that performs discrimination based on the 'ignored' subversion status. </td>
+</tr>
+<tr class="toc">
+<td class="toc">
+<a href="#svnLocked">svnLocked</a>
+</td>
+<td class="toc">File selector that performs discrimination based on the 'locked' subversion status. </td>
+</tr>
+<tr class="toc">
+<td class="toc">
+<a href="#svnNormal">svnNormal</a>
+</td>
+<td class="toc">File selector that performs discrimination based on the 'normal' subversion status. </td>
+</tr>
+<tr class="toc">
+<td class="toc">
+<a href="#svnReplaced">svnReplaced</a>
+</td>
+<td class="toc">File selector that performs discrimination based on the 'replaced' subversion status. </td>
+</tr>
+<tr class="toc">
+<td class="toc">
+<a href="#svnMissing">svnMissing</a>
+</td>
+<td class="toc">File selector that performs discrimination based on the 'missing' subversion status. </td>
+</tr>
+<tr class="toc">
+<td class="toc">
+<a href="#svnDeleted">svnDeleted</a>
+</td>
+<td class="toc">File selector that performs discrimination based on the 'deleted' subversion status. </td>
+</tr>
+</tbody>
+</table>
+<h2>Introduction</h2>
+<ant:introduction xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		<p>
+			This document describes the file selectors offered in svnAnt. To use those selectors,
+			you must first obtain a copy of svnant.jar, add it to the classpath of your ant project
+			and define the types. Fortunately, there is a resource file, within the distributed JAR file,
+			and all those steps can be accomplished with the following code:
+			<div class="sample">
+<pre class="sample">
+				
+&lt;path id="svnant.classpath"&gt;
+  &lt;pathelement location="${svnant.dir}/lib/svnant.jar" /&gt;
+  &lt;pathelement location="${svnant.dir}/lib/svnClientAdapter.jar" /&gt;
+&lt;/path&gt;  
+
+&lt;typedef resource="svntypes.xml" classpathref="project.classpath"/&gt;
+				
+			</pre>
+</div>
+		</p>
+		<p>
+			If you are upgrading from an earlier version of svnAnt, and the following line was used
+			in your <i>build.xml</i> file, then replace it with the ones above.
+			<div class="sample">
+<pre class="sample">
+				
+&lt;taskdef resource="svntask.properties" classpathref="svnant.classpath"/&gt;
+				
+			</pre>
+</div>
+		</p>
+		<h3>
+<a name="bindings">Bindings</a>
+</h3>
+		<p>
+			All file selectors offer two parameters: <b>javahl</b> and <b>svnkit</b>. Those parameters
+			are booleans, which means their values can be set to either <b>true</b> or <b>false</b>. 
+			If not specified, those parameters are assumed to be set (true). These two parameters are used
+			to select which client is used to access Subversion.
+		</p>
+		<p>
+			There are three clients used by svnAnt to access Subversion:
+			<ul>
+				<li>JavaHL;</li>
+				<li>SVNKit; and,</li>
+				<li>Command Line Interface.</li>
+			</ul>
+			To better understand the difference between those three clients, please refer to
+			documentation on <b>svnClientAdapter.jar</b>.
+		</p>
+		<p>
+			The property <b>javahl</b> is considered only if the javahl libraries are available. Similarly,
+			the property <b>svnkit</b> is considered only if SVNKit is present. Finally, <b>javahl</b>
+			takes precedence over <b>svnkit</b>.
+		</p>
+		<p>
+			To better illustrate the previous paragraph, use the following steps:
+			<ol>
+				<li>If <b>javahl</b> is <i>true</i> and JavaHL bindings are available, then JavaHL is used.</li>
+				<li>If <b>svnkit</b> is <i>true</i> and SVNKit is present, then SVNKit is used.</li>
+				<li>If the two previous tests failed, for any reason, then the Command Line Interface is used.</li>
+			</ol>
+		</p>
+	</ant:introduction>
+<h1>
+<a name="">svnAdded</a>
+</h1>
+<p>File selector that performs discrimination based on the 'added' subversion status. </p>
+<table class="type">
+<tbody class="type">
+<tr class="type">
+<th class="type">Implementation:</th>
+<td class="type">org.tigris.subclipse.svnant.selectors.Added</td>
+</tr>
+</tbody>
+</table>
+<h2>Parameters</h2>
+<table class="params">
+<tr class="params">
+<th class="params">Attribute</th>
+<th class="params">Description</th>
+<th class="params">Required</th>
+</tr>
+<tr class="params">
+<td class="params">javahl</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		If set, instructs the use of JavaHL bindings, if available.
+		Set to <b>false</b> to use command line client interface to subversion. 
+		Defaults to true. See <a href="#bindings">note</a> for more details.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No
+	</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">svnkit</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		If set, instructs the use of SVNKit bindings, if available.
+		Set to <b>false</b> to use command line client interface to subversion. 
+		Defaults to true. See <a href="#bindings">note</a> for more details.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No
+	</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">failonerror</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		Controls whether an error stops the build or is merely reported to the screen.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No (defaults to "true")
+	</ant:required>
+</td>
+</tr>
+</table>
+<h2>Nested Types</h2>No nested types defined for this type.<h2>Description</h2>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				This file selector is used to discriminate files within a <b>fileset</b> based on a Subversion
+				status. In particular, this selector keeps files that are recognized as 'added'.
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				An 'added' file or directory is one that has been added to the repository, but not yet
+				commited. In general, <b>svn status</b> displays those items with the letter <i>A</i>
+				preceeding the name.
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				Example: to copy a number of files with the status 'added' from their location in
+				<b>workingcopy</b> to a new directory called <b>test</b>, the following ant task can
+				be used:
+				<div class="sample">
+<pre class="sample">
+
+&lt;copy todir="test"&gt;
+	&lt;fileset dir="workingcopy"&gt;
+		&lt;svnAdded/&gt;
+	&lt;/fileset&gt;
+&lt;/copy&gt;
+					
+				</pre>
+</div>
+			</p>
+		<h1>
+<a name="">svnModified</a>
+</h1>
+<p>File selector that performs discrimination based on the 'modified' subversion status. </p>
+<table class="type">
+<tbody class="type">
+<tr class="type">
+<th class="type">Implementation:</th>
+<td class="type">org.tigris.subclipse.svnant.selectors.Modified</td>
+</tr>
+</tbody>
+</table>
+<h2>Parameters</h2>
+<table class="params">
+<tr class="params">
+<th class="params">Attribute</th>
+<th class="params">Description</th>
+<th class="params">Required</th>
+</tr>
+<tr class="params">
+<td class="params">javahl</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		If set, instructs the use of JavaHL bindings, if available.
+		Set to <b>false</b> to use command line client interface to subversion. 
+		Defaults to true. See <a href="#bindings">note</a> for more details.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No
+	</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">svnkit</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		If set, instructs the use of SVNKit bindings, if available.
+		Set to <b>false</b> to use command line client interface to subversion. 
+		Defaults to true. See <a href="#bindings">note</a> for more details.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No
+	</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">failonerror</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		Controls whether an error stops the build or is merely reported to the screen.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No (defaults to "true")
+	</ant:required>
+</td>
+</tr>
+</table>
+<h2>Nested Types</h2>No nested types defined for this type.<h2>Description</h2>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				This file selector is used to discriminate files within a <b>fileset</b> based on a Subversion
+				status. In particular, this selector keeps files that are recognized as 'modified'.
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				A 'modified' file or directory is one that has been changed since the last update and where 
+				the changes have not yet been commited to the repository. In general, <b>svn status</b>
+				display those items with the letter <i>M</i> preceeding the name. It is important to note
+				that other items can also be considered modified, such as conflicted ones.
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				Example: to copy a number of files with the status 'modified' from their location in
+				<b>workingcopy</b> to a new directory called <b>test</b>, the following ant task can
+				be used:
+				<div class="sample">
+<pre class="sample">
+
+&lt;copy todir="test"&gt;
+	&lt;fileset dir="workingcopy"&gt;
+		&lt;svnModified/&gt;
+	&lt;/fileset&gt;
+&lt;/copy&gt;
+					
+				</pre>
+</div>
+			</p>
+		<h1>
+<a name="">svnUnversioned</a>
+</h1>
+<p>File selector that performs discrimination based on the 'unversioned' subversion status. </p>
+<table class="type">
+<tbody class="type">
+<tr class="type">
+<th class="type">Implementation:</th>
+<td class="type">org.tigris.subclipse.svnant.selectors.Unversioned</td>
+</tr>
+</tbody>
+</table>
+<h2>Parameters</h2>
+<table class="params">
+<tr class="params">
+<th class="params">Attribute</th>
+<th class="params">Description</th>
+<th class="params">Required</th>
+</tr>
+<tr class="params">
+<td class="params">javahl</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		If set, instructs the use of JavaHL bindings, if available.
+		Set to <b>false</b> to use command line client interface to subversion. 
+		Defaults to true. See <a href="#bindings">note</a> for more details.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No
+	</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">svnkit</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		If set, instructs the use of SVNKit bindings, if available.
+		Set to <b>false</b> to use command line client interface to subversion. 
+		Defaults to true. See <a href="#bindings">note</a> for more details.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No
+	</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">failonerror</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		Controls whether an error stops the build or is merely reported to the screen.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No (defaults to "true")
+	</ant:required>
+</td>
+</tr>
+</table>
+<h2>Nested Types</h2>No nested types defined for this type.<h2>Description</h2>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				This file selector is used to discriminate files within a <b>fileset</b> based on a Subversion
+				status. In particular, this selector keeps files that are recognized as 'unversioned'.
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				An 'unversioned' file or directory is one that is present in a working copy but is not yet
+				known to the repository. In general, <b>svn status</b>
+				display those items with a question mark (<i>?</i>) preceeding the name. Note that 'ignored'
+				items are not considered 'unversioned'.
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				Eexample: to copy a number of files with the status 'unversioned' from their location in
+				<b>workingcopy</b> to a new directory called <b>test</b>, the following ant task can
+				be used:
+				<div class="sample">
+<pre class="sample">
+
+&lt;copy todir="test"&gt;
+	&lt;fileset dir="workingcopy"&gt;
+		&lt;svnUnversioned/&gt;
+	&lt;/fileset&gt;
+&lt;/copy&gt;
+		
+				</pre>
+</div>
+			</p>
+		<h1>
+<a name="">svnConflicted</a>
+</h1>
+<p>File selector that performs discrimination based on the 'conflicted' subversion status. </p>
+<table class="type">
+<tbody class="type">
+<tr class="type">
+<th class="type">Implementation:</th>
+<td class="type">org.tigris.subclipse.svnant.selectors.Conflicted</td>
+</tr>
+</tbody>
+</table>
+<h2>Parameters</h2>
+<table class="params">
+<tr class="params">
+<th class="params">Attribute</th>
+<th class="params">Description</th>
+<th class="params">Required</th>
+</tr>
+<tr class="params">
+<td class="params">javahl</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		If set, instructs the use of JavaHL bindings, if available.
+		Set to <b>false</b> to use command line client interface to subversion. 
+		Defaults to true. See <a href="#bindings">note</a> for more details.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No
+	</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">svnkit</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		If set, instructs the use of SVNKit bindings, if available.
+		Set to <b>false</b> to use command line client interface to subversion. 
+		Defaults to true. See <a href="#bindings">note</a> for more details.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No
+	</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">failonerror</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		Controls whether an error stops the build or is merely reported to the screen.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No (defaults to "true")
+	</ant:required>
+</td>
+</tr>
+</table>
+<h2>Nested Types</h2>No nested types defined for this type.<h2>Description</h2>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				This file selector is used to discriminate files within a <b>fileset</b> based on a Subversion
+				status. In particular, this selector keeps files that are recognized as 'conflicted'.
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				When updating a subversion item (file or directory), it is possible to have two sets of 
+				changes merged into the	working item. This happens when the item was modified locally as 
+				well as remotely during the period since the last update. If the two sets of changes conflict
+				(same lines of a file changes, same directory entries modified), then the item is marked
+				as 'conflicted'. In general, <b>svn status</b> displays 'conflicted' items with the letter
+				<i>C</i> preceeding the name. Note that 'conflicted' items are also considered 'modified'.
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				Example: to copy a number of files with the status 'conflicted' from their location in
+				<b>workingcopy</b> to a new directory called <b>test</b>, the following ant task can
+				be used:
+				<div class="sample">
+<pre class="sample">
+
+&lt;copy todir="test"&gt;
+	&lt;fileset dir="workingcopy"&gt;
+		&lt;svnConflicted/&gt;
+	&lt;/fileset&gt;
+&lt;/copy&gt;
+		
+				</pre>
+</div>
+			</p>
+		<h1>
+<a name="">svnIgnored</a>
+</h1>
+<p>File selector that performs discrimination based on the 'ignored' subversion status. </p>
+<table class="type">
+<tbody class="type">
+<tr class="type">
+<th class="type">Implementation:</th>
+<td class="type">org.tigris.subclipse.svnant.selectors.Ignored</td>
+</tr>
+</tbody>
+</table>
+<h2>Parameters</h2>
+<table class="params">
+<tr class="params">
+<th class="params">Attribute</th>
+<th class="params">Description</th>
+<th class="params">Required</th>
+</tr>
+<tr class="params">
+<td class="params">javahl</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		If set, instructs the use of JavaHL bindings, if available.
+		Set to <b>false</b> to use command line client interface to subversion. 
+		Defaults to true. See <a href="#bindings">note</a> for more details.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No
+	</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">svnkit</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		If set, instructs the use of SVNKit bindings, if available.
+		Set to <b>false</b> to use command line client interface to subversion. 
+		Defaults to true. See <a href="#bindings">note</a> for more details.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No
+	</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">failonerror</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		Controls whether an error stops the build or is merely reported to the screen.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No (defaults to "true")
+	</ant:required>
+</td>
+</tr>
+</table>
+<h2>Nested Types</h2>No nested types defined for this type.<h2>Description</h2>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				This file selector is used to discriminate files within a <b>fileset</b> based on a Subversion
+				status. In particular, this selector keeps files that are recognized as 'ignored'.
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				An 'ignored' file or directory is one which name match the patterns found in the parent
+				directory's <b>svn:ignore</b> property. In general, <b>svn status --no-ignore</b>
+				display those items with the letter <i>I</i> preceeding the name.
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				Example: to copy a number of files with the status 'ignored' from their location in
+				<b>workingcopy</b> to a new directory called <b>test</b>, the following ant task can
+				be used:
+				<div class="sample">
+<pre class="sample">
+
+&lt;copy todir="test"&gt;
+	&lt;fileset dir="workingcopy"&gt;
+		&lt;svnIgnored/&gt;
+	&lt;/fileset&gt;
+&lt;/copy&gt;
+		
+				</pre>
+</div>
+			</p>
+		<h1>
+<a name="">svnLocked</a>
+</h1>
+<p>File selector that performs discrimination based on the 'locked' subversion status. </p>
+<table class="type">
+<tbody class="type">
+<tr class="type">
+<th class="type">Implementation:</th>
+<td class="type">org.tigris.subclipse.svnant.selectors.Locked</td>
+</tr>
+</tbody>
+</table>
+<h2>Parameters</h2>
+<table class="params">
+<tr class="params">
+<th class="params">Attribute</th>
+<th class="params">Description</th>
+<th class="params">Required</th>
+</tr>
+<tr class="params">
+<td class="params">javahl</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		If set, instructs the use of JavaHL bindings, if available.
+		Set to <b>false</b> to use command line client interface to subversion. 
+		Defaults to true. See <a href="#bindings">note</a> for more details.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No
+	</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">svnkit</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		If set, instructs the use of SVNKit bindings, if available.
+		Set to <b>false</b> to use command line client interface to subversion. 
+		Defaults to true. See <a href="#bindings">note</a> for more details.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No
+	</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">failonerror</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		Controls whether an error stops the build or is merely reported to the screen.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No (defaults to "true")
+	</ant:required>
+</td>
+</tr>
+</table>
+<h2>Nested Types</h2>No nested types defined for this type.<h2>Description</h2>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				This file selector is used to discriminate files within a <b>fileset</b> based on a Subversion
+				status. In particular, this selector keeps files that are recognized as 'locked'.
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				A 'locked' file or directory is one where the repository has been informed of the
+				intent of a user to prevent others from modifying the file. For a working copy to
+				be aware of this fact, it must have been 'updated' since the lock status was changed.
+				In general, <b>svn status</b> displays those items with one of the letters <i>K</i>,
+				<i>O</i> or <i>B</i> in the sixth column. The 'lock' status is independent of most other
+				conditions such as 'modified', 'conflicted', etc.
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				Example: to copy a number of files with the status 'locked' from their location in
+				<b>workingcopy</b> to a new directory called <b>test</b>, the following ant task can
+				be used:
+				<div class="sample">
+<pre class="sample">
+
+&lt;copy todir="test"&gt;
+	&lt;fileset dir="workingcopy"&gt;
+		&lt;svnLocked/&gt;
+	&lt;/fileset&gt;
+&lt;/copy&gt;
+		
+				</pre>
+</div>
+			</p>
+		<h1>
+<a name="">svnNormal</a>
+</h1>
+<p>File selector that performs discrimination based on the 'normal' subversion status. </p>
+<table class="type">
+<tbody class="type">
+<tr class="type">
+<th class="type">Implementation:</th>
+<td class="type">org.tigris.subclipse.svnant.selectors.Normal</td>
+</tr>
+</tbody>
+</table>
+<h2>Parameters</h2>
+<table class="params">
+<tr class="params">
+<th class="params">Attribute</th>
+<th class="params">Description</th>
+<th class="params">Required</th>
+</tr>
+<tr class="params">
+<td class="params">javahl</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		If set, instructs the use of JavaHL bindings, if available.
+		Set to <b>false</b> to use command line client interface to subversion. 
+		Defaults to true. See <a href="#bindings">note</a> for more details.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No
+	</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">svnkit</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		If set, instructs the use of SVNKit bindings, if available.
+		Set to <b>false</b> to use command line client interface to subversion. 
+		Defaults to true. See <a href="#bindings">note</a> for more details.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No
+	</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">failonerror</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		Controls whether an error stops the build or is merely reported to the screen.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No (defaults to "true")
+	</ant:required>
+</td>
+</tr>
+</table>
+<h2>Nested Types</h2>No nested types defined for this type.<h2>Description</h2>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				This file selector is used to discriminate files within a <b>fileset</b> based on a Subversion
+				status. In particular, this selector keeps files that are recognized as 'normal'.
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				A 'normal' file or directory is one that has not undergone any changes since the last
+				update. In general, this is the great majority of the files in a working copy. <b>svn status</b>
+				returns no special character for those items (a space in the first column).
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				Example: to copy a number of files with the status 'normal' from their location in
+				<b>workingcopy</b> to a new directory called <b>test</b>, the following ant task can
+				be used:
+				<div class="sample">
+<pre class="sample">
+
+&lt;copy todir="test"&gt;
+	&lt;fileset dir="workingcopy"&gt;
+		&lt;svnNormal/&gt;
+	&lt;/fileset&gt;
+&lt;/copy&gt;
+		
+				</pre>
+</div>
+			</p>
+		<h1>
+<a name="">svnReplaced</a>
+</h1>
+<p>File selector that performs discrimination based on the 'replaced' subversion status. </p>
+<table class="type">
+<tbody class="type">
+<tr class="type">
+<th class="type">Implementation:</th>
+<td class="type">org.tigris.subclipse.svnant.selectors.Replaced</td>
+</tr>
+</tbody>
+</table>
+<h2>Parameters</h2>
+<table class="params">
+<tr class="params">
+<th class="params">Attribute</th>
+<th class="params">Description</th>
+<th class="params">Required</th>
+</tr>
+<tr class="params">
+<td class="params">javahl</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		If set, instructs the use of JavaHL bindings, if available.
+		Set to <b>false</b> to use command line client interface to subversion. 
+		Defaults to true. See <a href="#bindings">note</a> for more details.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No
+	</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">svnkit</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		If set, instructs the use of SVNKit bindings, if available.
+		Set to <b>false</b> to use command line client interface to subversion. 
+		Defaults to true. See <a href="#bindings">note</a> for more details.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No
+	</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">failonerror</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		Controls whether an error stops the build or is merely reported to the screen.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No (defaults to "true")
+	</ant:required>
+</td>
+</tr>
+</table>
+<h2>Nested Types</h2>No nested types defined for this type.<h2>Description</h2>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				This file selector is used to discriminate files within a <b>fileset</b> based on a Subversion
+				status. In particular, this selector keeps files that are recognized as 'replaced'.
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				A 'replaced' file or directory is one that has been deleted, then created anew and finally 
+				added back to the repository. Also, those changes must not have been comitted.
+				In general, <b>svn status</b> displays those items with the letter <i>R</i> preceeding 
+				the name.
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				Example: to copy a number of files with the status 'replaced' from their location in
+				<b>workingcopy</b> to a new directory called <b>test</b>, the following ant task can
+				be used:
+				<div class="sample">
+<pre class="sample">
+
+&lt;copy todir="test"&gt;
+	&lt;fileset dir="workingcopy"&gt;
+		&lt;svnReplaced/&gt;
+	&lt;/fileset&gt;
+&lt;/copy&gt;
+		
+				</pre>
+</div>
+			</p>
+		<h1>
+<a name="">svnMissing</a>
+</h1>
+<p>File selector that performs discrimination based on the 'missing' subversion status. </p>
+<table class="type">
+<tbody class="type">
+<tr class="type">
+<th class="type">Implementation:</th>
+<td class="type">org.tigris.subclipse.svnant.selectors.Missing</td>
+</tr>
+</tbody>
+</table>
+<h2>Parameters</h2>
+<table class="params">
+<tr class="params">
+<th class="params">Attribute</th>
+<th class="params">Description</th>
+<th class="params">Required</th>
+</tr>
+<tr class="params">
+<td class="params">javahl</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		If set, instructs the use of JavaHL bindings, if available.
+		Set to <b>false</b> to use command line client interface to subversion. 
+		Defaults to true. See <a href="#bindings">note</a> for more details.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No
+	</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">svnkit</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		If set, instructs the use of SVNKit bindings, if available.
+		Set to <b>false</b> to use command line client interface to subversion. 
+		Defaults to true. See <a href="#bindings">note</a> for more details.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No
+	</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">failonerror</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		Controls whether an error stops the build or is merely reported to the screen.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No (defaults to "true")
+	</ant:required>
+</td>
+</tr>
+</table>
+<h2>Nested Types</h2>No nested types defined for this type.<h2>Description</h2>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				This file selector is used to discriminate files within a <b>fileset</b> based on a Subversion
+				status. In particular, this selector keeps files that are recognized as 'missing'.
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				A 'missing' file or directory is one that is managed by Subversion and
+				has been deleted without using the remove command. In general, <b>svn status</b> 
+				displays those items with the exclamation point (<i>!</i>) preceeding the name.
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				It is important to note that a regular FileSet (the one supplied by ANT) can not
+				detect a missing item, since it does not exist on the file system. To detect
+				Subversion missing items, use the FileSet provided by svn-ant (svnFileSet).
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				Example: to delete missing files from the repository associated with a <b>workingcopy</b>:
+				<div class="sample">
+<pre class="sample">
+
+&lt;svn&gt;
+	&lt;delete&gt;
+		&lt;svnFileSet dir="workingcopy"&gt;
+			&lt;svnMissing/&gt;
+		&lt;/svnFileSet&gt;
+	&lt;/delete&gt;
+&lt;/svn&gt;
+		
+				</pre>
+</div>
+			</p>
+		<h1>
+<a name="">svnDeleted</a>
+</h1>
+<p>File selector that performs discrimination based on the 'deleted' subversion status. </p>
+<table class="type">
+<tbody class="type">
+<tr class="type">
+<th class="type">Implementation:</th>
+<td class="type">org.tigris.subclipse.svnant.selectors.Deleted</td>
+</tr>
+</tbody>
+</table>
+<h2>Parameters</h2>
+<table class="params">
+<tr class="params">
+<th class="params">Attribute</th>
+<th class="params">Description</th>
+<th class="params">Required</th>
+</tr>
+<tr class="params">
+<td class="params">javahl</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		If set, instructs the use of JavaHL bindings, if available.
+		Set to <b>false</b> to use command line client interface to subversion. 
+		Defaults to true. See <a href="#bindings">note</a> for more details.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No
+	</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">svnkit</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		If set, instructs the use of SVNKit bindings, if available.
+		Set to <b>false</b> to use command line client interface to subversion. 
+		Defaults to true. See <a href="#bindings">note</a> for more details.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No
+	</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">failonerror</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		Controls whether an error stops the build or is merely reported to the screen.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No (defaults to "true")
+	</ant:required>
+</td>
+</tr>
+</table>
+<h2>Nested Types</h2>No nested types defined for this type.<h2>Description</h2>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				This file selector is used to discriminate files within a <b>fileset</b> based on a Subversion
+				status. In particular, this selector keeps files that are recognized as 'deleted'.
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				A 'deleted' file or directory is one that has been erased using Subversion's 'remove'
+				command. In general, <b>svn status</b> displays those items with the letter <i>D</i>
+				preceeding the name.
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				It is important to note that a regular FileSet (the one supplied by ANT) can not
+				detect a deleted item, since it does not exist on the file system. To detect
+				Subversion deleted items, use the FileSet provided by svn-ant (svnFileSet).
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				Example: to revert deleted files from a <b>workingcopy</b>:
+				<div class="sample">
+<pre class="sample">
+
+&lt;svn&gt;
+	&lt;revert&gt;
+		&lt;svnFileSet dir="workingcopy"&gt;
+			&lt;svnDeleted/&gt;
+		&lt;/svnFileSet&gt;
+	&lt;/revert&gt;
+&lt;/svn&gt;
+		
+				</pre>
+</div>
+			</p>
+		</body>
+</html>
Index: /release-kits/shared/core/ant-tasks/svnant/doc/svn.html
===================================================================
--- /release-kits/shared/core/ant-tasks/svnant/doc/svn.html	(revision 18997)
+++ /release-kits/shared/core/ant-tasks/svnant/doc/svn.html	(revision 18997)
@@ -0,0 +1,1462 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+
+<head>
+	<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
+	<TITLE>Svn Task</TITLE>
+	<META HTTP-EQUIV="Content-Language" CONTENT="en-us">
+  <link rel="stylesheet" type="text/css" href="http://tortoisesvn.tigris.org/branding/css/print.css" media="print" />
+<style type="text/css"> /* <![CDATA[ */
+ @import "http://subclipse.tigris.org/branding/css/tigris.css";
+ @import "http://subclipse.tigris.org/branding/css/inst.css";
+ /* ]]> */
+ </style>
+<!--
+<style type="text/css">	
+body {
+	font: 80% Verdana, Arial, Helvetica, sans-serif;
+	margin: 12px; padding: 12px;
+/*	background: rgb(95%,95%,80%);  */
+	color: black;
+}
+h1 {
+	font-size: 200%; text-transform: lowercase; letter-spacing: 3px;
+	margin-bottom: 1em; 
+	padding: 0.66em 0 0.33em 1em;
+	background: rgb(85%,85%,70%);
+}
+h2 {
+	background: rgb(85%,85%,70%);
+}
+h3 {
+	border:1px solid rgb(85%,85%,70%);
+	color: rgb(55%,55%,40%);
+	padding: 0.66em 0 0.33em 1em;
+	background-color: #f3f1f4;
+}
+.sample {
+	font-family: Courier, "Courier New", monospace;
+	background-color: #f3f1f4;
+	margin-left: 10px;
+	margin-right: 10px;
+	padding-top: 3px;
+	padding-bottom: 3px;
+	padding-left: 3px;
+	padding-right: 3px;
+	border:1px dashed black;
+	width: 50%;
+ }
+ table {
+	width: 80%;
+	border: 1px solid gray;
+	margin-bottom:1em;
+ }
+ th, td {
+	padding: 0 0.5em;
+	border-left: 1px solid #DDD;
+	border-bottom: 1px solid #DDD;
+	font: 70%
+}
+th {
+	
+}
+-->
+</style>
+</head>
+
+<body lang="en-US" dir="LTR">
+
+<div class="h1" id="svn" title="svn">
+<H1>&lt;Svn&gt;</H1>
+By <A HREF="mailto:users@subclipse.tigris.org">C&eacute;dric Chabanois et al.</A>
+
+
+<div class="h2" id="Description" title="Description">
+<H2>Description</H2>
+<p>This task provides an interface to <A HREF="http://subversion.tigris.org/">Subversion</A> 
+revision control system that is a compelling replacement for CVS in the open source community.
+<br>
+With the help of the underlying svnClientAdapter, &lt;svn&gt; task uses JavaHL (a 
+native JNI interface to the subversion api) if it
+can find the corresponding library (e.g. svnjavahl.dll on windows).
+Otherwise it uses svn command line interface.</p>
+</div>
+
+<div class="h2" id="Setup" title="Setup">
+<h2>Setup</h2>
+<p>As with most Ant extensions, SvnAnt's task and type names must be
+<a href="http://ant.apache.org/manual/CoreTasks/typedef.html">mapped
+to their implementing classes</a> before being used in an Ant build
+file.  An example of how to use the <em>antlib</em> bundled in
+SvnAnt's JAR file to perform that registration follows:</p>
+
+<div class="sample">
+<span style="font-face: Courier New; font-size: 12">
+<span style="color: #000080">&lt;typedef</span>
+<span style="color: #000080">resource=</span><span style="color: #008000">&quot;org/tigris/subversion/svnant/svnantlib.xml&quot;</span>
+<span style="color: #000080">classpath=</span><span style="color: #008000">&quot;svnant.jar&quot;</span>
+<span style="color: #000080">/&gt;</span>
+</span>
+</div>  <!-- sample -->
+</div>
+
+<div class="h2" id="Parameters" title="Parameters">
+<H2>Parameters</H2>
+<table border="1" width="80%">	<tr>
+		<th>Attribute</th>
+		<th>Description</th>
+		<th>Required</th>
+	</tr>
+	<tr>
+		<td>username</td>
+		<td>username that will be used for all nested svn commands.</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>password</td>
+		<td>password that will be used for all nested svn commands.</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>javahl</td>
+		<td>Set to &ldquo;false&rdquo; to use command line client interface instead of JNI JavaHL binding.</td>
+		<td>No (Defaults to true)</td>
+	</tr>
+	<tr>
+		<td>svnkit</td>
+		<td>Set to &ldquo;false&rdquo; to use command line client interface instead of SVNKit binding.</td>
+		<td>No (Defaults to false)</td>
+	</tr>
+	<tr>
+		<td>dateFormatter</td>
+		<td>formatter definition used to format/parse dates (e.g. when revision is specified as date).</td>
+		<td>No (Defaults to "MM/DD/YYYY HH:MM AM_PM")</td>
+	</tr>
+	<tr>
+		<td>dateTimeZone</td>
+		<td>time zone used to format/parse dates (e.g. when revision is specified as date).</td>
+		<td>No (Defaults to local)</td>
+	</tr>
+	<tr>
+		<td>failonerror</td>
+		<td>Controls whether an error stops the build or is merely reported to the screen.</td>
+		<td>No (Defaults to "true")</td>
+	</tr>
+</table>
+</div>
+
+<div class="h2" id="Commands" title="Commands">
+<H2>Svn commands specified as nested elements</H2>
+<table border="1" width="90%">
+	<tr>
+		<td><a href="#add">add </a></td>
+		<td><a href="#createRepository">createRepository</a></td>
+		<td><a href="#import">import</a></td>
+		<td><a href="#move">move</a></td>
+		<td><a href="#revert">revert</a></td>
+	</tr>
+	<tr>
+		<td><a href="#cat">cat</a></td>
+		<td><a href="#delete">delete</a></td>
+		<td><a href="#info">info</a></td>
+		<td><a href="#mkdir">mkdir</a></td>
+		<td><a href="#status">status</a></td>
+	</tr>
+	<tr>
+		<td><a href="#checkout">checkout</a></td>
+		<td><a href="#diff">diff</a></td>
+		<td><a href="#keywordsset">keywordsset</a></td>
+		<td><a href="#propdel">propdel</a></td>
+		<td><a href="#switch">switch</a></td>
+	</tr>
+	<tr>
+		<td><a href="#commit">commit</a></td>
+		<td><a href="#export">export</a></td>
+		<td><a href="#keywordsadd">keywordsadd</a></td>
+		<td><a href="#propget">propget</a></td>
+		<td><a href="#update">update</a></td>
+	</tr>
+	<tr>
+		<td><a href="#copy">copy</a></td>
+		<td><a href="#ignore">ignore</a></td>
+		<td><a href="#keywordsremove">keywordsremove</a></td>
+		<td><a href="#propset">propset</a></td>
+		<td><a href="#wcVersion">wcVersion</a></td>
+	</tr>
+	</table>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="add" title="add">
+<H3><a name="add">add</a></H3>
+<p>You can add files and directories to svn repository with nested <CODE>&lt;add&gt;</CODE> elements.</p>
+<table border="1" width="80%">	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>file</td>
+		<td>file to add to the repository</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>dir</td>
+		<td>directory to add to the repository</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>recurse</td>
+		<td>Set to &quot;false&quot; to operate on a single directory only
+			(applies only when <CODE>dir</CODE> attribute is set). Default is
+			&quot;true&quot;
+		</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>force</td>
+		<td>Set to &quot;true&quot; to check the contents of a directory that
+			is already under source control for new directories/files
+			(applies only when <CODE>dir</CODE> attribute is set). Default is
+			&quot;false&quot;
+		</td>
+		<td>No</td>
+	</tr>
+</table>
+<p>Parameters specified as nested elements :
+<ul>
+<li>fileset <br>
+	Filesets are used to select sets of files to add to the repository. <br>
+	<B>Note	that directories needed to add selected files will be added to the
+	repository even if they are not selected by the fileset.</B>
+</li>
+</ul>
+</p>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="cat" title="cat">
+<H3><a name="cat">cat</a></H3>
+<p>Get the content of a file on repository.</p>
+<table border="1" width="80%">	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>destFile</td>
+		<td>Name of the destination file</td>
+		<td>No <BR>(default is the name of the file on the url placed in the ant project's basedir)</td>
+	</tr>
+	<tr>
+		<td>url</td>
+		<td>Url of the file in repository</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>revision</td>
+		<td>revision to get.<BR>Possible values are :<BR>- a date with the
+			format as specified in dateFormatter attribute<BR>- a revision number<BR>-
+			HEAD, BASE, COMMITED or PREV<BR>Default is &quot;HEAD&quot;
+		</td>
+		<td>No</td>
+	</tr>
+</table>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="checkout" title="checkout">
+<H3><a name="checkout">checkout</a></H3>
+<p>Check out a working copy from a repository.</p>
+<table border="1" width="80%">	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>url</td>
+		<td>url to checkout from</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>recurse</td>
+		<td>Set to &quot;false&quot; to operate on single directory only.
+			Default is &quot;true&quot;
+		</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>destPath</td>
+		<td>destination directory</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>revision</td>
+		<td>revision to checkout.<BR>Possible values are :<BR>- a date with
+			the format as specified in dateFormatter attribute<BR>- a revision
+			number<BR>- HEAD, BASE, COMMITED or PREV<BR>Default is &quot;HEAD&quot;
+		</td>
+		<td>No</td>
+	</tr>
+</table>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="commit" title="commit">
+<H3><a name="commit">commit</a></H3>
+<p>Send changes from your working copy to the repository.</p>
+<table border="1" width="80%">	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>file</td>
+		<td>file to commit</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>recurse</td>
+		<td>Set to &quot;false&quot; to operate on single directory only.
+			Default is &quot;true&quot;<BR>Apply only when dir attribute is
+			set.
+		</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>dir</td>
+		<td>directory to commit</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>message</td>
+		<td>commit message</td>
+		<td>Yes</td>
+	</tr>
+</table>
+<p>Parameters specified as nested elements :
+<ul>
+	<li>fileset<BR>
+	Filesets are used to select sets of files to commit. 
+	</li>
+</ul>
+</p>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="copy" title="copy">
+<H3><a name="copy">copy</a></H3>
+<p>Duplicate something in working copy or repository, remembering
+history.<BR>
+source and destination can each be either a working copy (WC) path or URL:
+<ul>
+	<li>WC-&gt;WC: copy and schedule for addition (with history)</li>
+	<li>WC-&gt;URL: immediately commit a copy of WC to URL</li>
+	<li>URL-&gt;WC: check out URL into WC, schedule for addition</li>
+	<li>URL-&gt;URL: complete server-side copy;&nbsp; used to branch &amp; tag</li>
+</ul>
+</p>
+<br/>
+
+<table border="1" width="80%">	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>srcPath</td>
+		<td>source path</td>
+		<TD ROWSPAN=2>One of the two</td>
+	</tr>
+	<tr>
+		<td>srcUrl</td>
+		<td>source url</td>
+	</tr>
+	<tr>
+		<td>testPath</td>
+		<td>destination path</td>
+		<TD ROWSPAN=2>One of the two</td>
+	</tr>
+	<tr>
+		<td>destUrl</td>
+		<td>destination url</td>
+	</tr>
+	<tr>
+		<td>message</td>
+		<td>commit message</td>
+		<td>when destUrl is set</td>
+	</tr>
+	<tr>
+		<td>revision</td>
+		<td>revision to copy from (when srcUrl is set)<BR>Possible values
+			are :<BR>- a date with the format as specified in dateFormatter attribute
+			<BR>- a revision number<BR>- HEAD, BASE, COMMITED or
+			PREV<BR>Default is &quot;HEAD&quot;
+		</td>
+		<td>no</td>
+	</tr>
+</table>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="createRepository" title="createRepository">
+<H3><a name="createRepository">createRepository</a></H3>
+<p>Create a new, empty repository at path.</p>
+<table border="1" width="80%">	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>path</td>
+		<td>Path where to create the new repository</td>
+		<td>Yes</td>
+	</tr>
+</table>
+<div class="sample">
+<p>Example: <br>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;svn</FONT>
+<FONT COLOR="#000080">javahl=</FONT><FONT COLOR="#008000">&quot;false&quot;</FONT><FONT COLOR="#000080">&gt;<BR>&lt;createRepository</FONT>
+<FONT COLOR="#000080">path=</FONT><FONT COLOR="#008000">&quot;repository&quot;</FONT><FONT COLOR="#000080">/&gt;<BR>&lt;/svn&gt;</FONT></FONT></FONT>
+</p>
+</div>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="delete" title="delete">
+<H3><a name="delete">delete</a></H3>
+<p>If run on a working copy target, the item is scheduled for
+deletion upon the next commit.&nbsp; Files, and directories that have
+not been committed, are immediately removed from the working copy.&nbsp;
+<BR>The command will not remove targets that are, or contain,
+unversioned or modified items; use the force attribute to override
+this behaviour.
+<BR>If run on an url, the item is deleted from the repository via an immediate commit.
+</p>
+<table border="1" width="80%">	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>file</td>
+		<td>file to delete</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>url</td>
+		<td>url to delete</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>dir</td>
+		<td>directory to delete</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>message</td>
+		<td>commit message</td>
+		<td>when url attribute is set</td>
+	</tr>
+	<tr>
+		<td>force</td>
+		<td>default is &quot;false&quot;</td>
+		<td>No</td>
+	</tr>
+</table>
+<p>Parameters specified as nested elements :
+<ul>
+	<li>fileset<BR>
+	Filesets are used to select sets of files to delete.. 
+	</li>
+</ul>
+</p>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="diff" title="diff">
+<H3><a name="diff">diff</a></H3>
+<p>Display the differences between two paths (oldPath and newPath) or
+two urls (oldUrl and newUrl).
+</p>
+<table border="1" width="80%">	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>oldPath</td>
+		<td>If oldUrl is not set, defaults to the path '.'</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>oldUrl</td>
+		<td>&nbsp;</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>oldTargetRevision</td>
+		<td>defaults to BASE or, if oldUrl is set, to HEAD</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>newPath</td>
+		<td>defaults to oldPath if oldUrl is not set</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>newUrl</td>
+		<td>&nbsp;</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>newTargetRevision</td>
+		<td>defaults to the current working version or, if newUrl is set, to HEAD</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>outFile</td>
+		<td>Default is 'patch'</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>recurse</td>
+		<td>Set to &quot;false&quot; to operate on single directory only.
+			Default is &quot;true&quot;
+		</td>
+		<td>No</td>
+	</tr>
+</table>
+<div class="sample">
+<p>Example : diff between BASE and current working version <br>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;svn</FONT>
+<FONT COLOR="#000080">javahl=</FONT><FONT COLOR="#008000">&quot;${javahl}&quot;</FONT><FONT COLOR="#000080">&gt;</FONT></FONT></FONT>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;diff</FONT>
+<FONT COLOR="#000080">oldPath=</FONT><FONT COLOR="#008000">&quot;workingcopy/diffTest/file.txt&quot;</FONT>
+<FONT COLOR="#000080">outFile=</FONT><FONT COLOR="#008000">&quot;workingcopy/diffTest/patch.txt&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT>
+<FONT COLOR="#000080"><FONT FACE="Courier New"><FONT SIZE=2>&lt;/svn&gt;</FONT></FONT></FONT>
+</p>
+</div>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="export" title="export">
+<H3><a name="export">export</a></H3>
+<p>
+<ol>
+	<li>
+	Exports a clean directory tree from the repository specified by <CODE>srcurl</CODE>, 
+	at revision <CODE>revision</CODE> if it is given, otherwise at HEAD, into <CODE>destPath</CODE>.
+	</li>
+	<li>Exports a clean directory tree from the working copy specified by
+	<CODE>srcPath</CODE> into <CODE>destPath</CODE>.&nbsp; all local changes will be preserved, 
+	but files not under revision control will not be copied.
+	</li>
+</ol>
+</p>
+<br/>
+<table border="1" width="80%">	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>srcUrl</td>
+		<td>source url to export from</td>
+		<td>One of the two</td>
+	</tr>
+	<tr>
+		<td>srcPath</td>
+		<td>source path to export from</td>
+	</tr>
+	<tr>
+		<td>destPath</td>
+		<td>destination path</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>revision</td>
+		<td>revision of the source url to export from. Defaults is
+			&quot;HEAD&quot;<BR>Possible values are :<BR>- a date with the
+			format as specified in dateFormatter attribute<BR>- a revision number<BR>-
+			HEAD, BASE, COMMITED or PREV
+		</td>
+		<td>No (defaults to HEAD)</td>
+	</tr>
+</table>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="ignore" title="ignore">
+<H3><a name="ignore">ignore</a></H3>
+<p>Add a given file or a pattern to the ignored files list (modifies
+svn:ignore property)</p>
+<table border="1" width="80%">	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>file</td>
+		<td>file to ignore</td>
+		<td>One of the two</td>
+	</tr>
+	<tr>
+		<td>dir</td>
+		<td>directory on which we will update svn:ignore property</td>
+	</tr>
+	<tr>
+		<td>pattern</td>
+		<td>pattern to add to svn:ignore on the directory<BR>Only when dir
+			is set
+		</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>recurse</td>
+		<td>Set to &quot;true&quot; to add the pattern recursively to
+			directories. Default is &quot;false&quot;<BR>Only when dir is set
+		</td>
+		<td>No</td>
+	</tr>
+</table>
+<div class="sample">
+<p>Example :<BR>
+<FONT SIZE=2><FONT FACE="Courier New"><FONT COLOR="#000080">&lt;ignore</FONT>
+<FONT COLOR="#000080">dir=</FONT><FONT COLOR="#008000">&quot;workingcopy/ignoreTest/dir1&quot;</FONT>
+<FONT COLOR="#000080">pattern=</FONT><FONT COLOR="#008000">&quot;*.ignore&quot;</FONT>
+<FONT COLOR="#000080">recurse=</FONT><FONT COLOR="#008000">&quot;true&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT>
+</p>
+</div>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="import" title="import">
+<H3><a name="import">import</a></H3>
+<p>Commit an unversioned file or tree into the repository.<BR>
+Recursively commit a copy of <CODE>path</CODE> to <CODE>url</CODE>.<BR>
+If <CODE>newEntry </CODE>is not set, copy top-level contents of <CODE>path</CODE>into<CODE>url</CODE>directly.&nbsp;
+Otherwise, create <CODE>newEntry </CODE>underneath <CODE>url </CODE>and begin copy there.
+</p>
+<table border="1" width="80%">	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>path</td>
+		<td>source path to export from</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>url</td>
+		<td>source url to import to</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>newEntry</td>
+		<td>&nbsp;</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>message</td>
+		<td>commit message</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>recurse</td>
+		<td>Set to &quot;false&quot; to operate on single directory only.
+			Default is &quot;true&quot;
+		</td>
+		<td>False</td>
+	</tr>
+</table>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="info" title="info">
+<h3><a name="info">info</a></h3>
+<p>Gets the information from the repository for a file, directory or url and sets
+the values to ant properties.</p>
+
+<table border="1" width="80%">	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>target</td>
+		<td>Directory or file to gather the information about.</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>propPrefix</td>
+		<td>Prefix to use for the properties.  Default is &quot;svn.info.&quot;.</td>
+		<td>False</td>
+	</tr>
+	<tr>
+		<td>verbose</td>
+		<td>Turns on verbosity for this task.  Default is &quot;false&quot;.</td>
+		<td>False</td>
+	</tr>
+</table>
+
+<p>&nbsp;</p>
+<p>The task sets the following properties (prefix applied accordingly): <br>
+</p>
+
+<table border="1" width="80%">	<tr>
+		<td>Property</td>
+		<td>Description</td>
+	</tr>
+	<tr>
+		<td>path</td>
+		<td>Always</td>
+	</tr>
+	<tr>
+		<td>name</td>
+		<td>For files only</td>
+	</tr>
+	<tr>
+		<td>url</td>
+		<td>Always</td>
+	</tr>
+	<tr>
+		<td>repouuid</td>
+		<td>Always</td>
+	</tr>
+	<tr>
+		<td>rev</td>
+		<td>Always</td>
+	</tr>
+	<tr>
+		<td>nodekind</td>
+		<td>Always</td>
+	</tr>
+	<tr>
+		<td>schedule</td>
+		<td>Always</td>
+	</tr>
+	<tr>
+		<td>author</td>
+		<td>Always</td>
+	</tr>
+	<tr>
+		<td>lastRev</td>
+		<td>Always</td>
+	</tr>
+	<tr>
+		<td>lastDate</td>
+		<td>Always</td>
+	</tr>
+	<tr>
+		<td>lastTextUpdate</td>
+		<td>For files only</td>
+	</tr>
+	<tr>
+		<td>lastPropUpdate</td>
+		<td>For files only</td>
+	</tr>
+	<tr>
+		<td>checksum</td>
+		<td>For files only</td>
+	</tr>
+</table>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="keywordsset" title="keywordsset">
+<H3><a name="keywordsset">keywordsset</a></H3>
+<p>Keywordsset controls which keywords will be substituted on the
+given files. Valid keywords are:
+<ul>
+	<li>URL, HeadURL : The URL for the head version of the object.</li>
+	<li>Author, LastChangedBy : The last person to modify the file.</li>
+	<li>Date, LastChangedDate : The date/time the object was last modified.</li>
+	<li>Rev, LastChangedRevision : The last revision the object	changed.</li>
+	<li>Id : A compressed summary of the previous</li>
+</ul>
+</p>
+<br/>
+<table border="1" width="80%">	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>file</td>
+		<td>File for which keywords will be substituted</td>
+		<td>Either file, dir or filesets</td>
+	</tr>
+	<tr>
+		<td>dir</td>
+		<td>All files in this directory will have their keywords substituted (recursively)</td>
+		<td>Either file, dir or filesets</td>
+	</tr>
+	<tr>
+		<td>keywords</td>
+		<td>The keywords to substitute on the given files</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>HeadURL/URL<BR>Author, LastChangedBy<BR>Date,
+			LastChangedDate<BR>Rev, LastChangedRevision<BR>Id
+		</td>
+		<td>Set to &ldquo;true&ldquo; the keyword to substitute it on the
+			given file.
+		</td>
+		<td>No</td>
+	</tr>
+</table>
+<p>Parameters specified as nested elements :
+<ul>
+	<li>fileset<BR>
+	Filesets are used to select sets of files on which to apply keywords substitution.
+	</li>
+</ul>
+</p>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="keywordsadd" title="keywordsadd">
+<H3><a name="keywordsadd">keywordsadd</a></H3>
+<p>Keywordsadd add some keywords to be substituted on the given
+files. Present keywords are not modified.<BR>
+The attributes are the same than for keywordsset command.</p>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="keywordsremove" title="keywordsremove">
+<H3><a name="keywordsremove">keywordsremove</a></H3>
+<p>Keywordsadd remove some keywords to be substituted on the given
+files. Other present keywords are not modified.<BR>
+The attributes are the same than for keywordsset command.</p>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="mkdir" title="mkdir">
+<H3><a name="mkdir">mkdir</a></H3>
+<p>Create a new directory under revision control.<BR>
+If target is a working copy path the directory is scheduled for addition in the
+working copy.&nbsp; If target is an url the directory is created in
+the repository via an immediate commit.&nbsp; <BR>
+In both cases all the intermediate directories must already exist.
+</p>
+<table border="1" width="80%">	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>path</td>
+		<td>path to create</td>
+		<td>One of the two</td>
+	</tr>
+	<tr>
+		<td>url</td>
+		<td>url to create</td>
+	</tr>
+	<tr>
+		<td>message</td>
+		<td>commit message</td>
+		<td>Yes</td>
+	</tr>
+</table>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="move" title="move">
+<H3><a name="move">move</a></H3>
+<p>Move/rename something in working copy or repository.<BR><BR>&nbsp;
+cource and destination can both be working copy (WC) paths or
+URLs:<BR>&nbsp;&nbsp;&nbsp; WC&nbsp; -&gt; WC:&nbsp;&nbsp; move and
+schedule for addition (with history)<BR>&nbsp;&nbsp;&nbsp; URL -&gt;
+URL:&nbsp; complete server-side rename.
+</p>
+<table border="1" width="80%">	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>srcPath</td>
+		<td>source path</td>
+		<td ROWSPAN=2>One of the two</td>
+	</tr>
+	<tr>
+		<td>srcUrl</td>
+		<td>source url</td>
+	</tr>
+	<tr>
+		<td>destPath</td>
+		<td>destination path</td>
+		<td ROWSPAN=2>One of the two</td>
+	</tr>
+	<tr>
+		<td>destUrl</td>
+		<td>destination url</td>
+	</tr>
+	<tr>
+		<td>message</td>
+		<td>commit message</td>
+		<td>Yes</td>
+	</tr>
+</table>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="propdel" title="propdel">
+<H3><a name="propdel">propdel</a></H3>
+<p>Remove a property from files or dirs.</p>
+<table border="1" width="80%">	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>path</td>
+		<td>path of the file or directory on which to delete the property</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>name</td>
+		<td>name of the property to delete</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>recurse</td>
+		<td>if set, property will be removed recursively</td>
+		<td>No</td>
+	</tr>
+</table>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="propget" title="propget">
+<H3><a name="propget">propget</a></H3>
+<p>Get a property from a file or a directory.</p>
+<table border="1" width="80%">	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>path</td>
+		<td>path of the file or directory on which to get the property</td>
+		<td ROWSPAN=2>One of the two</td>
+	</tr>
+	<tr>
+		<td>url</td>
+		<td>url of the file or directory in repository on which to get the property</td>
+	</tr>
+	<tr>
+		<td>name</td>
+		<td>name of the property to get</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>property</td>
+		<td>the name of the property to set with the value of the svn property</td>
+		<td ROWSPAN=2>One of the two</td>
+	</tr>
+	<tr>
+		<td>file</td>
+		<td>file that will contain the value of the property</td>
+	</tr>
+</table>
+<div class="sample">
+<p>
+Example :<br>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;propget</FONT>
+<FONT COLOR="#000080">path=</FONT><FONT COLOR="#008000">&quot;workingcopy/propTest/file.png&quot;</FONT>
+<FONT COLOR="#000080">name=</FONT><FONT COLOR="#008000">&quot;svn:mime-type&quot;</FONT>
+<FONT COLOR="#000080">property=</FONT><FONT COLOR="#008000">&quot;propTest.mimeType&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT>
+</p>
+</div>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="propset" title="propset">
+<H3><a name="propset">propset</a></H3>
+<p>Set a property on files or dirs.</p>
+<table border="1" width="80%">	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>path</td>
+		<td>path of the file or directory on which to set the property</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>name</td>
+		<td>name of the property to set</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>value</td>
+		<td>the value of the property</td>
+		<td ROWSPAN=2>One of the two</td>
+	</tr>
+	<tr>
+		<td>file</td>
+		<td>the file that will be used as a value</td>
+	</tr>
+	<tr>
+		<td>recurse</td>
+		<td>if set, property will be set recursively</td>
+		<td>No</td>
+	</tr>
+</table>
+<p>
+<I>Note:</I>svn recognizes the following special versioned properties but 
+will store any arbitrary properties set:
+<ul>
+	<li>svn:ignore : A newline separated list of file patterns to ignore. </li>
+	<li>svn:keywords : Keywords to be expanded.&nbsp; Valid keywords are:
+		<ul>
+			<li>URL, HeadURL : The URL for the head version of the object.</li>
+			<li>Author, LastChangedBy : The last person to modify the file.</li>
+			<li>Date, LastChangedDate : The date/time the object was last modified.</li>
+			<li>Rev, LastChangedRevision : The last revision the object changed.</li>
+			<li>Id : A compressed summary of the previous 4 keywords. </li>
+		</ul>
+	</li>
+	<li>svn:executable : If present, make the file executable. This property cannot be set on a directory.&nbsp;
+	A non-recursive attempt will fail, and a recursive attempt will set
+	the property only on the file children of the directory 
+	</li>
+	<li>svn:eol-style : One of 'native', 'LF', 'CR', 'CRLF'. </li>
+	<li>svn:mime-type :  The mimetype of the file.&nbsp; Used to determine whether to merge the file, and
+	how to serve it from Apache. <BR>
+	A mimetype beginning with 'text/' (or an absent mimetype) is treated as text.&nbsp; Anything else is
+	treated as binary. 
+	</li>
+	<li>svn:externals : A newline separated list of module
+	specifiers, each of which consists of a relative directory path,
+	optional revision flags, and an URL.&nbsp; For example<BR>
+ 	foo             http://example.com/repos/zig <br>
+ 	foo/bar -r 1234 http://example.com/repos/zag
+	</li>
+</ul>
+</p>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="revert" title="revert">
+<H3><a name="revert">revert</a></H3>
+<p>Restore pristine working copy file (undo most local edits).</p>
+<table border="1" width="80%">	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>file</td>
+		<td>file to revert</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>dir</td>
+		<td>directory to revert</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>recurse</td>
+		<td>Set to &quot;false&quot; to operate on a single directory only
+			(applies only when <CODE>dir</CODE> attribute is set). Default is
+			&quot;false&quot;</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>revision</td>
+		<td>revision. Defaults is &quot;HEAD&quot;<BR>Possible values are
+			:<BR>- a date with the format as specified in dateFormatter attribute<BR>-
+			a revision number<BR>- HEAD, BASE, COMMITED or PREV</td>
+		<td>No</td>
+	</tr>
+</table>
+<p>Parameters specified as nested elements :
+<ul>
+	<li>fileset<BR>
+	Filesets are used to select sets of files to revert. 
+	</li>
+</ul>
+</p>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="status" title="status">
+<H3><a name="status">status</a></H3>
+<p>Get the status of working copy files and directories.</p>
+<table border="1" width="80%">	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>path</td>
+		<td>path of the file or directory</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>textStatusProperty</td>
+		<td>Name of the property to set to the status of the item</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>propStatusProperty</td>
+		<td>Name of the property to set to the status of the item
+			properties</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>revisionProperty</td>
+		<td>Name of the property to set to the revision of the item (or &ldquo;&rdquo;
+			if unversioned)</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>lastChangedRevisionProperty</td>
+		<td>Name of the property to set to the last changed revision of the
+			item (or &ldquo;&rdquo; if unversioned)</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>lastChangedDateProperty</td>
+		<td>Name of the property to set to the last changed date of the
+			item (or &ldquo;&rdquo; if unversioned). 
+			The date is formatted according to task's "dateFormatter"</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>lastCommitAuthorProperty</td>
+		<td>Name of the property to set to the last commit author (or &ldquo;&rdquo;
+			if unversioned)</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>urlProperty</td>
+		<td>Name of the property to set to the url of the item</td>
+		<td>No</td>
+	</tr>
+</table>
+<p>
+The value of TextStatusProperty can be :
+<ul>
+	<li>non-svn</li>
+	<li>normal : no modifications</li>
+	<li>added</li>
+	<li>missing : item is missing (removed by non-svn command)</li>
+	<li>incomplete</li>
+	<li>deleted</li>
+	<li>replaced</li>
+	<li>modified</li>
+	<li>merged</li>
+	<li>conflicted</li>
+	<li>obstructed</li>
+	<li>ignored</li>
+	<li>external</li>
+	<li>unversioned</li>
+</ul>
+The value of propStatusProperty can be :
+<ul>
+	<li>normal : no	modifications</li>
+	<li>conflicted</li>
+	<li>modified</li>
+</ul>
+</p>
+<p></p>
+<div class="sample">
+<p>
+Example : <br>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;status</FONT>
+<FONT COLOR="#000080">path=</FONT><FONT COLOR="#008000">&quot;workingcopy/statusTest/added.txt&quot;</FONT>
+</FONT></FONT>
+<FONT COLOR="#000080"><FONT FACE="Courier New"><FONT SIZE=2>textStatusProperty=<FONT COLOR="#008000">&quot;testStatus.textStatus&quot;</FONT></FONT></FONT></FONT>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">propStatusProperty=</FONT><FONT COLOR="#008000">&quot;testStatus.propStatus&quot;</FONT></FONT></FONT>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">lastChangedRevisionProperty=</FONT><FONT COLOR="#008000">&quot;testStatus.lastCommitRevision&quot;</FONT></FONT></FONT>
+<FONT COLOR="#000080"><FONT FACE="Courier New"><FONT SIZE=2>revisionProperty=<FONT COLOR="#008000">&quot;testStatus.revision&quot;</FONT></FONT></FONT></FONT>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">lastCommitAuthorProperty=</FONT><FONT COLOR="#008000">&quot;testStatus.lastCommitAuthor&quot;</FONT></FONT></FONT>
+</p>
+</div>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="switch" title="switch">
+<H3><a name="switch">switch</a></H3>
+<p>Update the working copy to mirror a new URL within the repository.
+This behaviour is similar to 'svn update', and is the way to move a
+working copy to a branch or tag within the same repository.</p>
+<table border="1" width="80%">	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>path</td>
+		<td>The working copy to switch to the given url</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>url</td>
+		<td>The url to switch to</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>recurse</td>
+		<td>Set to &quot;false&quot; to operate on a single directory only.
+			Default is &quot;true&quot;</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>revision</td>
+		<td>revision. Defaults is &quot;HEAD&quot;<BR>Possible values are
+			:<BR>- a date with the format as specified in dateFormatter attribute<BR>-
+			a revision number<BR>- HEAD, BASE, COMMITED or PREV</td>
+		<td>No</td>
+	</tr>
+</table>
+<div class="sample" style="width: 602px; height: 43px">
+<p>
+Example:
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;svn&gt;</FONT></FONT></FONT>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;switch</FONT>
+<FONT COLOR="#000080">path=</FONT><FONT COLOR="#008000">&quot;workingcopy/switchTest&quot;</FONT>
+<FONT COLOR="#000080">url=</FONT><FONT COLOR="#008000">&quot;${urlRepos}/switchTestBranch&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT>
+<FONT COLOR="#000080"><FONT FACE="Courier New"><FONT SIZE=2>&lt;/svn&gt;</FONT></FONT></FONT>
+</p>
+</div>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="update" title="update">
+<H3><a name="update">update</a></H3>
+<p>Bring changes from the repository into the working copy.<BR>If no
+revision given, bring working copy up-to-date with HEAD rev.&nbsp;
+Else synchronize working copy to revision.</p>
+<table border="1" width="80%">	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>file</td>
+		<td>file to update</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>dir</td>
+		<td>directory to update</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>recurse</td>
+		<td>Set to &quot;false&quot; to operate on a single directory only
+			(applies only when <CODE>dir</CODE> attribute is set). Default is
+			&quot;true&quot;</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>revision</td>
+		<td>revision. Defaults is &quot;HEAD&quot;<BR>Possible values are
+			:<BR>- a date with the format as specified in dateFormatter attribute<BR>-
+			a revision number<BR>- HEAD, BASE, COMMITED or PREV</td>
+		<td>No</td>
+	</tr>
+</table>
+Parameters specified as nested elements :
+<ul>
+<li>fileset<BR>
+Filesets are used to select sets of files to update. 
+</li>
+</ul>
+</div>
+
+<![CDATA[=========================================================]]>
+
+<div class="h3" id="wcVersion" title="wcVersion">
+<H3><a name="wcVersion">wcVersion</a></H3>
+<p>Retrieves a state of the working copy. Similar to the svn's utility svnversion, just providing more.<BR>
+Crawls the working copy and retrieves the maximum revision number, revision range if workingCopy is mixed etc.
+</p>
+<table border="1" width="80%">	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>path</td>
+		<td>a path to the working copy</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>prefix</td>
+		<td>a string which will be prefixed to output properties set/filled by this command</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>processUnversioned</td>
+		<td>flag whether presence of unversioned resoures should be treated as changes</td>
+		<td>No (defaults to false)</td>
+	</tr>
+</table>
+
+<p>The command fill set the following properties: (with optional prefix applied)</p>
+
+<table border="1" width="80%">	<tr>
+		<td>Property name</td>
+		<td>Description</td>
+	</tr>
+	<tr>
+		<td>repository.url</td>
+		<td>URL of the repository of the working copy root</td>
+	</tr>
+	<tr>
+		<td>repository.path</td>
+		<td>path in the repository</td>
+	</tr>
+	<tr>
+		<td>revision.max</td>
+		<td>the highest revision number in the working copy</td>
+	</tr>
+	<tr>
+		<td>revision.max-with-flags</td>
+		<td>the highest revision number in the working copy plus flags (M - modified, X - mixed)</td>
+	</tr>
+	<tr>
+		<td>revision.range</td>
+		<td>the revision range (in mixed wc), similar to svnversion format. (e.g. 1000:1010MX)</td>
+	</tr>
+	<tr>
+		<td>committed.max</td>
+		<td>the highest 'last committed revision'</td>
+	</tr>
+	<tr>
+		<td>committed.max-with-flags</td>
+		<td>the highest 'last committed revision' plus flags (M, X)</td>
+	</tr>
+	<tr>
+		<td>modified</td>
+		<td>set to "true" if working copy is modified, property not set otherwise</td>
+	</tr>
+	<tr>
+		<td>mixed</td>
+		<td>set to "true" if working copy is mixed, property not set otherwise</td>
+	</tr>
+</table>
+<p>
+An example of the properties that would be set in a sample working copy (with modifications):<br>
+(with prefix="svn.")
+<pre>
+svn.repository.url -> https://server/repos/branches/1.2.x
+svn.repository.path -> /repos/branches/1.2.x
+svn.revision.max -> 676
+svn.revision.max-with-flags -> 676M
+svn.revision.range -> 676M
+svn.committed.max -> 651
+svn.committed.max-with-flags -> 651M
+svn.modified -> true
+</pre>
+Example output in case of mixed and modified working copy:
+(without prefix set)
+<pre>
+repository.url -> https://server/repos/branches/1.2.x
+repository.path -> /repos/branches/1.2.x
+revision.max -> 676
+revision.max-with-flags -> 676MX
+revision.range -> 673:676M
+svn.committed.max -> 651
+svn.committed.max-with-flags -> 651M
+modified -> true
+mixed -> true
+</pre>
+</p>
+</div>
+
+<![CDATA[=========================================================]]>
+
+
+<div class="h2" id="Examples" title="Examples">
+<H2>Examples</H2>
+<p>&nbsp;</p>
+
+<div class="sample" style="width: 588px; height: 48px">
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;svn</FONT>
+<FONT COLOR="#000080">javahl=</FONT><FONT COLOR="#008000">&quot;${javahl}&quot;</FONT><FONT COLOR="#000080">&gt;</FONT></FONT></FONT><br>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;checkout</FONT>
+<FONT COLOR="#000080">url=</FONT><FONT COLOR="#008000">&quot;${urlRepos}&quot;</FONT>
+<FONT COLOR="#000080">destPath=</FONT><FONT COLOR="#008000">&quot;workingcopy&quot;</FONT>
+<FONT COLOR="#000080">/&gt;</FONT></FONT></FONT><br>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;/svn&gt;</FONT></FONT></FONT>
+</div>
+<p>checkouts a working copy from repository</p>
+<p>&nbsp;</p>
+</p>
+
+<p>
+<div class="sample">
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;svn</FONT><FONT COLOR="#000080">&gt;</FONT></FONT></FONT><br>
+<FONT COLOR="#000080">  <FONT FACE="Courier New"><FONT SIZE=2>&lt;delete&gt;</FONT></FONT></FONT><br>
+<FONT COLOR="#000080">    <FONT FACE="Courier New"><FONT SIZE=2>&lt;fileset</FONT>
+<FONT COLOR="#000080">dir=</FONT><FONT COLOR="#008000">&quot;workingcopy/deleteTest&quot;</FONT><FONT COLOR="#000080">&gt;</FONT></FONT></FONT><br>
+<FONT COLOR="#000080">      <FONT FACE="Courier New"><FONT SIZE=2>&lt;include</FONT>
+<FONT COLOR="#000080">name=</FONT><FONT COLOR="#008000">&quot;**/*.del&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT>
+<FONT COLOR="#000080">    <FONT FACE="Courier New"><FONT SIZE=2>&lt;/fileset&gt;</FONT></FONT></FONT><br>
+<FONT COLOR="#000080">  <FONT FACE="Courier New"><FONT SIZE=2>&lt;/delete&gt;</FONT></FONT></FONT><br>
+<FONT COLOR="#000080">  <FONT FACE="Courier New"><FONT SIZE=2>&lt;commit</FONT>
+<FONT COLOR="#000080">message=</FONT><FONT COLOR="#008000">&quot;commit
+deleted files&quot;</FONT> <FONT COLOR="#000080">dir=</FONT><FONT COLOR="#008000">&quot;workingcopy/deleteTest&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT><br>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;/svn&gt;</FONT></FONT></FONT>
+</div>
+<p>deletes some files from repository (and commit changes)</p>
+<p>&nbsp;</p>
+
+<p>
+<div class="sample">
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;svn&gt;</FONT></FONT></FONT><br>
+<FONT COLOR="#000080">  <FONT FACE="Courier New"><FONT SIZE=2>&lt;add</FONT>
+<FONT COLOR="#000080">dir=</FONT><FONT COLOR="#008000">&quot;workingcopy/propTest&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT><br>
+<FONT COLOR="#000080">  <FONT FACE="Courier New"><FONT SIZE=2>&lt;commit</FONT>
+<FONT COLOR="#000080">message=</FONT><FONT COLOR="#008000">&quot;propTest
+added&quot;</FONT> <FONT COLOR="#000080">dir=</FONT><FONT COLOR="#008000">&quot;workingcopy/propTest&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT><br>
+  <FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;propset</FONT>
+<FONT COLOR="#000080">path=</FONT><FONT COLOR="#008000">&quot;workingcopy/propTest/file.png&quot;</FONT>
+<FONT COLOR="#000080">name=</FONT><FONT COLOR="#008000">&quot;svn:mime-type&quot;</FONT>
+<FONT COLOR="#000080">value=</FONT><FONT COLOR="#008000">&quot;image/png&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT><br>
+  <FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;propset</FONT>
+<FONT COLOR="#000080">path=</FONT><FONT COLOR="#008000">&quot;workingcopy/propTest/file.png&quot;</FONT>
+<FONT COLOR="#000080">name=</FONT><FONT COLOR="#008000">&quot;myPicture&quot;</FONT>
+<FONT COLOR="#000080">file=</FONT><FONT COLOR="#008000">&quot;workingcopy/propTest/icon.gif&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT><br>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;/svn&gt;</FONT></FONT></FONT>
+</div>
+<p>add my_repos/propTest to repository and set two properties on file.png <br>
+subversion command line interface is used (javahl="false").
+
+</BODY>
+</HTML>
Index: /release-kits/shared/core/ant-tasks/svnant/doc/svnant-user.html
===================================================================
--- /release-kits/shared/core/ant-tasks/svnant/doc/svnant-user.html	(revision 18997)
+++ /release-kits/shared/core/ant-tasks/svnant/doc/svnant-user.html	(revision 18997)
@@ -0,0 +1,18 @@
+<html>
+	<head>
+		<meta http-equiv="Content-Language" content="en-us">
+		<title>SvnAnt User Manual</title>
+	</head>
+
+	<frameset cols="18%,82%">
+		<frame src="toc.html" name="navFrame">
+		<frame src="svn.html" name="mainFrame">
+	</frameset>
+	<noframes>
+		<h3>No Frames!</h3>
+		<p>
+			Your browser does not display frames. This link will
+			bring you to the table of content: <a href="toc.html">SvnAnt - Table of Content</a>
+		</p>
+	</noframes>
+</html>
Index: /release-kits/shared/core/ant-tasks/svnant/doc/toc.html
===================================================================
--- /release-kits/shared/core/ant-tasks/svnant/doc/toc.html	(revision 18997)
+++ /release-kits/shared/core/ant-tasks/svnant/doc/toc.html	(revision 18997)
@@ -0,0 +1,18 @@
+<html>
+	<head>
+		<meta http-equiv="Content-Language" content="en-us"/>
+		<title>SvnAnt User Manual</title>
+		<base target="mainFrame"/>
+	</head>
+	<body>
+		<h2>SvnAnt</h2>
+		<h3>Table of Content</h3>
+		<a href="svn.html">Tasks</a>
+		<br/>
+		<a href="types.html">Types</a>
+		<br/>
+		<a href="selectors.html">Selectors</a>
+		<br/>
+		<a href="conditions.html">Conditions</a>
+	</body>
+</html>
Index: /release-kits/shared/core/ant-tasks/svnant/doc/types.html
===================================================================
--- /release-kits/shared/core/ant-tasks/svnant/doc/types.html	(revision 18997)
+++ /release-kits/shared/core/ant-tasks/svnant/doc/types.html	(revision 18997)
@@ -0,0 +1,432 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns:ant="http://www.fiset.ca/ant-docs/v1" xmlns:html="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252"/>
+<title>Svn Types</title>
+<META HTTP-EQUIV="Content-Language" CONTENT="en-us"/>
+<style type="text/css">	
+				
+				body {
+					font: 80% Verdana, Arial, Helvetica, sans-serif;
+					margin: 5px; padding: 0;
+				/*	background: rgb(95%,95%,80%);  */
+					color: black;
+				}
+				h1 {
+					font-size: 200%; letter-spacing: 3px;
+					margin-bottom: 1em; 
+					padding: 0.66em 0 0.33em 1em;
+					background: rgb(85%,85%,70%);
+				}
+				h2 {
+					background: rgb(90%,90%,80%);
+				}
+				h3 {
+					background-color: rgb(95%,95%,85%);
+				}
+				.sample {
+					font-family: Courier, "Courier New", monospace;
+					background-color: #f3f1f4;
+				 }
+				div.sample {
+					margin-left: 10px;
+					margin-right: 10px;
+					padding-top: 3px;
+					padding-bottom: 3px;
+					padding-left: 3px;
+					padding-right: 3px;
+					border:1px dashed black;
+					width: 80%;
+				 }
+				 table.params {
+					width: 80%;
+					border: 1px solid gray;
+					margin-bottom:1em;
+				 }
+				 th.params, td.params {
+					padding: 0 0.5em;
+					border-left: 1px solid #DDD;
+					border-bottom: 1px solid #DDD;
+					font: 70%
+				}
+				th.params {
+					
+				}
+				table.toc {
+					width: 80%;
+					border: 1px solid gray;
+					margin-bottom:1em;
+				}
+				td.toc {
+					padding: 0 0.5em;
+					border: none
+					font: 70%
+				}
+				table.type {
+					width: 80%;
+					border: none;
+					margin-bottom:1em;
+				}
+				th.type, td.type {
+					text-align: left;
+					padding: 0 0.5em;
+					border: none
+					font: 70%
+				}
+				th.type {
+					font-weight: bold;
+				}
+				
+			</style>
+</head>
+<body lang="en-US" dir="LTR">
+<h1>Svn Types</h1>
+<h2>Table of Content</h2>
+<table class="toc">
+<tbody class="toc">
+<tr class="toc">
+<td class="toc">
+<a href="#svnFileSet">svnFileSet</a>
+</td>
+<td class="toc">FileSet replacement that operates on list of files obtained from Subversion.</td>
+</tr>
+</tbody>
+</table>
+<h2>Introduction</h2>
+<ant:introduction xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		<p>
+			This document describes the type extensions that svn-ant brings to Ant. To use those types,
+			you must first obtain a copy of svnant.jar, add it to the classpath of your ant project
+			and define the types. Fortunately, there is a resource file, within the distributed JAR file,
+			and all those steps can be accomplished with the following code:
+			<div class="sample">
+<pre class="sample">
+				
+&lt;path id="svnant.classpath"&gt;
+  &lt;pathelement location="${svnant.dir}/lib/svnant.jar" /&gt;
+  &lt;pathelement location="${svnant.dir}/lib/svnClientAdapter.jar" /&gt;
+&lt;/path&gt;  
+
+&lt;typedef resource="svntypes.xml" classpathref="project.classpath"/&gt;
+				
+			</pre>
+</div>
+		</p>
+		<p>
+			If you are upgrading from an earlier version of svnAnt, and the following line was used
+			in your <i>build.xml</i> file, then replace it with the ones above.
+			<div class="sample">
+<pre class="sample">
+				
+&lt;taskdef resource="svntask.properties" classpathref="svnant.classpath"/&gt;
+				
+			</pre>
+</div>
+		</p>
+		<h3>
+<a name="bindings">Bindings</a>
+</h3>
+		<p>
+			All types offer two parameters: <b>javahl</b> and <b>svnkit</b>. Those parameters
+			are booleans, which means their values can be set to either <b>true</b> or <b>false</b>. 
+			If not specified, those parameters are assumed to be set (true). These two parameters are used
+			to select which client is used to access Subversion.
+		</p>
+		<p>
+			There are three clients used by svnAnt to access Subversion:
+			<ul>
+				<li>JavaHL;</li>
+				<li>SVNKit; and,</li>
+				<li>Command Line Interface.</li>
+			</ul>
+			To better understand the difference between those three clients, please refer to
+			documentation on <b>svnClientAdapter.jar</b>.
+		</p>
+		<p>
+			The property <b>javahl</b> is considered only if the javahl libraries are available. Similarly,
+			the property <b>svnkit</b> is considered only if SVNKit is present. Finally, <b>javahl</b>
+			takes precedence over <b>svnkit</b>.
+		</p>
+		<p>
+			To better illustrate the previous paragraph, use the following steps:
+			<ol>
+				<li>If <b>javahl</b> is <i>true</i> and JavaHL bindings are available, then JavaHL is used.</li>
+				<li>If <b>svnkit</b> is <i>true</i> and SVNKit is present, then SVNKit is used.</li>
+				<li>If the two previous tests failed, for any reason, then the Command Line Interface is used.</li>
+			</ol>
+		</p>
+	</ant:introduction>
+<h1>
+<a name="">svnFileSet</a>
+</h1>
+<p>FileSet replacement that operates on list of files obtained from Subversion.</p>
+<table class="type">
+<tbody class="type">
+<tr class="type">
+<th class="type">Implementation:</th>
+<td class="type">org.tigris.subclipse.svnant.SvnFileSet</td>
+</tr>
+</tbody>
+</table>
+<h2>Parameters</h2>
+<table class="params">
+<tr class="params">
+<th class="params">Attribute</th>
+<th class="params">Description</th>
+<th class="params">Required</th>
+</tr>
+<tr class="params">
+<td class="params">dir</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				Specifies the root directory used by the file set. It should specify
+				a directory managed by Subversion.
+			</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				Either dir or file must be specified
+			</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">file</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				If used, specifies a fileset that contains a single file.
+			</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				Either dir or file must be specified
+			</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">includes</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				Comma-seperated or space-separated list of patterns, which describe files that are 
+				included. If this attribute if not specified, then all files are included.
+			</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				No
+			</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">excludes</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				Comma-seperated or space-separated list of patterns, which describe files that are 
+				excluded. If this attribute if not specified, then no files are excluded.
+			</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				No
+			</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">javahl</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		If set, instructs the use of JavaHL bindings, if available.
+		Set to <b>false</b> to use command line client interface to subversion. 
+		Defaults to true. See <a href="#bindings">note</a> for more details.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No
+	</ant:required>
+</td>
+</tr>
+<tr class="params">
+<td class="params">svnkit</td>
+<td class="params">
+<ant:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		If set, instructs the use of SVNKit bindings, if available.
+		Set to <b>false</b> to use command line client interface to subversion. 
+		Defaults to true. See <a href="#bindings">note</a> for more details.
+	</ant:description>
+</td>
+<td class="params">
+<ant:required xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		No
+	</ant:required>
+</td>
+</tr>
+</table>
+<h2>Nested Types</h2>
+<h3>exclude</h3>
+				The type svnFileSet can include the nested type 'exclude', similar to a classic FileSet.
+			<h3>include</h3>
+				The type svnFileSet can include the nested type 'include', similar to a classic FileSet.
+			<h3>patternSet</h3>
+				The type svnFileSet can include the nested type 'patternSet', similar to a classic FileSet.
+			<h3>selector</h3>
+				The type svnFileSet can include the any file selector, such as <b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">contains</b>, <b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">date</b>
+				<b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">size</b>, or any <a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" href="selectors.html">file selector defined by svn-ant</a>
+			<h2>Description</h2>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				This type implements a FileSet. Instances of FileSet are used in tasks that operates on a number of files. The files
+				selected by a FileSet can be tailored by a number of patterns and selectors. More information about file sets is available
+				with the Ant documentation.
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				The motivation with creating a replacement FileSet that is based on Subversion was to have the ability of creating
+				sets of files that include deleted and missing files. In fact, the classic fileset operates only on files that are reported
+				by the file system and can not predict deleted and missing files. Furthermore, there are useful commands that can be performed
+				on deleted and missing files, such as 'revert', 'delete', 'update' and others.
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				At the present time, <b>svnFileSet</b> is experimental. It supports selectors but it does not yet accept any patterns 
+				(include, exclude). Those enhancments are to come later.
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				<b>svnFileSet</b> can be used within any svn-ant task that supports a nested file sets. It can also be used in any task
+				that is based on a file set. If you have a problem using <b>svnFileSet</b> within a task that works well with the classic
+				fileset, then report the problem to the author of the task. However, for the time being, there is a work around your 
+				problem. Instead of using a <b>svnFileSet</b> directly in the targeted task, use it indirectly via a classic fileset and
+				a reference. For example, if ANT complains about a task similar to the following:
+				<div class="sample">
+<pre class="sample">
+
+&lt;target name="example"&gt;
+	&lt;mkdir dir="test"/&gt;
+	&lt;copy todir="test"&gt;
+		&lt;svnFileSet dir="workingcopy"&gt;
+			&lt;svnAdded/&gt;
+		&lt;/svnFileSet&gt;
+	&lt;/copy&gt;
+&lt;/target&gt;
+					
+				</pre>
+</div>
+				
+				you can rewrite it, using a reference, as:
+				
+				<div class="sample">
+<pre class="sample">
+
+&lt;target name="example"&gt;
+	&lt;svnFileSet id="svnFileSetId_1" dir="workingcopy"&gt;
+		&lt;svnAdded/&gt;
+	&lt;/svnFileSet&gt;
+	&lt;mkdir dir="test"/&gt;
+	&lt;copy todir="test"&gt;
+		&lt;fileset refid="svnFileSetId_1"/&gt;
+	&lt;/copy&gt;
+&lt;/target&gt;
+					
+				</pre>
+</div>
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
+				If you are the author of a fileset-based task and that you can not understand 
+				why your task does not accept <b>svnFileSet</b> while it works perfectly well 
+				with the classic fileset, here is a thing you can check. If your task
+				accepts instances of FileSet with a method similar to:
+				<div class="sample">
+<pre class="sample">
+
+public void addFileset(FileSet set) {
+	...
+}
+					
+				</pre>
+</div>
+				then adding the following method should fix the problem:
+				<div class="sample">
+<pre class="sample">
+
+public void add(FileSet set) {
+	addFileSet(set);
+}
+					
+				</pre>
+</div>
+			</p>
+			<h3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Examples</h3>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				The following ant script can be used to remove all missing files from the associated repository:
+				<div class="sample">
+<pre class="sample">
+
+&lt;svn&gt;
+	&lt;delete&gt;
+		&lt;svnFileSet dir="workingcopy"&gt;
+			&lt;svnMissing/&gt;
+		&lt;/svnFileSet&gt;
+	&lt;/delete&gt;
+	&lt;commit 
+		dir="workingcopy" 
+		message="automatically removing missing files"/&gt;
+&lt;/svn&gt;
+					
+				</pre>
+</div>
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				The following ant script can be used to add all new files to the associated repository:
+				<div class="sample">
+<pre class="sample">
+
+&lt;svn&gt;
+	&lt;add&gt;
+		&lt;svnFileSet dir="workingcopy"&gt;
+			&lt;svnUnversioned/&gt;
+		&lt;/svnFileSet&gt;
+	&lt;/add&gt;
+	&lt;commit
+		dir="workingcopy" 
+		message="automatically adding files"/&gt;
+&lt;/svn&gt;
+					
+				</pre>
+</div>
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				The following ant script can be used to restore all deleted files:
+				<div class="sample">
+<pre class="sample">
+
+&lt;svn&gt;
+	&lt;revert&gt;
+		&lt;svnFileSet dir="workingcopy"&gt;
+			&lt;svnDeleted/&gt;
+		&lt;/svnFileSet&gt;
+	&lt;/revert&gt;
+&lt;/svn&gt;
+					
+				</pre>
+</div>
+			</p>
+			<p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				If, in the previous example, you wanted svn-ant to use the command line adapter:
+				<div class="sample">
+<pre class="sample">
+
+&lt;svn javahl="false" svnkit="false"&gt;
+	&lt;revert&gt;
+		&lt;svnFileSet 
+			dir="workingcopy" 
+			javahl="false" 
+			svnkit="false"&gt;
+			&lt;svnDeleted 
+				javahl="false" 
+				svnkit="false"/&gt;
+		&lt;/svnFileSet&gt;
+	&lt;/revert&gt;
+&lt;/svn&gt;
+					
+				</pre>
+</div>
+			</p>
+		</body>
+</html>
Index: /release-kits/shared/core/ant-tasks/svnant/lib/JAVAHL-LICENSE
===================================================================
--- /release-kits/shared/core/ant-tasks/svnant/lib/JAVAHL-LICENSE	(revision 18997)
+++ /release-kits/shared/core/ant-tasks/svnant/lib/JAVAHL-LICENSE	(revision 18997)
@@ -0,0 +1,55 @@
+This license applies to all portions of Subversion which are not
+externally-maintained libraries (e.g. apr/, apr-util/, and neon/).
+Such libraries have their own licenses; we recommend you read them, as
+their terms may differ from the terms below.
+
+This is version 1 of this license.  It is also available online at
+http://subversion.tigris.org/license-1.html.  If newer versions of
+this license are posted there (the same URL, but with the version
+number incremented: .../license-2.html, .../license-3.html, and so
+on), you may use a newer version instead, at your option.
+
+====================================================================
+Copyright (c) 2000-2005 CollabNet.  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 CollabNet (http://www.Collab.Net/)."
+Alternately, this acknowledgment may appear in the software itself, if
+and wherever such third-party acknowledgments normally appear.
+
+4. The hosted project names must not be used to endorse or promote
+products derived from this software without prior written
+permission. For written permission, please contact info@collab.net.
+
+5. Products derived from this software may not use the "Tigris" name
+nor may "Tigris" appear in their names without prior written
+permission of CollabNet.
+
+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 COLLABNET 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 CollabNet.
+
Index: /release-kits/shared/core/ant-tasks/svnant/lib/SVNCLIENTADAPTER-LICENSE
===================================================================
--- /release-kits/shared/core/ant-tasks/svnant/lib/SVNCLIENTADAPTER-LICENSE	(revision 18997)
+++ /release-kits/shared/core/ant-tasks/svnant/lib/SVNCLIENTADAPTER-LICENSE	(revision 18997)
@@ -0,0 +1,185 @@
+SVNClientAdapter Library License
+
+This license applies to all portions of SVNClientAdapter library, which 
+are not externally-maintained libraries (e.g. JavaHL or SVNKit).
+
+Such libraries have their own licenses; we recommend you read them, as
+their terms may differ from the terms below.
+
+=============================================================================
+                                 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
Index: /release-kits/shared/core/ant-tasks/svnant/license.txt
===================================================================
--- /release-kits/shared/core/ant-tasks/svnant/license.txt	(revision 18997)
+++ /release-kits/shared/core/ant-tasks/svnant/license.txt	(revision 18997)
@@ -0,0 +1,64 @@
+SvnAnt license
+
+This license applies to all portions of svnant library, which 
+are not externally-maintained libraries (e.g. svnClientAdapter, JavaHL or SVNKit).
+
+Such libraries have their own licenses; we recommend you read them, as
+their terms may differ from the terms below.
+
+/* ====================================================================
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2000 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 "Apache" 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.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+
Index: /release-kits/shared/core/ant-tasks/svnant/readme.txt
===================================================================
--- /release-kits/shared/core/ant-tasks/svnant/readme.txt	(revision 18997)
+++ /release-kits/shared/core/ant-tasks/svnant/readme.txt	(revision 18997)
@@ -0,0 +1,38 @@
+SvnAnt
+======
+You can find latest version of svnant on http://subclipse.tigris.org
+
+Installation
+============
+Put the svnant.jar and svnClientAdapter.jar files to classpath of your ant build file.
+(Or directly to your ANT_HOME/lib directory.)
+If you plan to use JavaHL instead of commandline, put the svnjavahl.jar to the classpath too.
+(An of course put the appropriate native OS library on your PATH/LD_PATH too)
+
+In the build file, load the <svn> task.
+E.g. like this:
+  <taskdef resource="svntask.properties" classpathref="project.classpath"/>
+(where svnant.jar lies in the "project.classpath")
+
+To provide access to the Subversion API, svnant uses svnClientAdapter on top of 
+either the JavaHL native Subversion Java (JNI) bindings or Subverion's
+command line programs (which must be installed and in your PATH).
+See the subclipse's FAQ <http://subclipse.tigris.org/faq.html#get-javahl">
+for info how to get JavaHL for your operating system.
+
+Documentation
+=============
+Documentation of the <svn> task is in the /doc directory.
+
+Play around
+===========
+To access the sources, just type "ant" in the directory containing the
+build.xml bundled with the distribution.  The default target will
+retrieve the sources corresponding to the version you have.  If you
+want to get the latest sources, type "ant checkoutLatest".
+
+Once you have the sources, svnant unit tests can be invoked using the
+top level build.xml by typing "ant runTests".  These tests provide a
+great set of examples of how to use svnant's Ant tasks and data types.
+
+Please send any usage questions to <mailto:users@subclipse.tigris.org>.
Index: /release-kits/shared/core/ant/bin/ant
===================================================================
--- /release-kits/shared/core/ant/bin/ant	(revision 18997)
+++ /release-kits/shared/core/ant/bin/ant	(revision 18997)
@@ -0,0 +1,299 @@
+#! /bin/sh
+
+#   Copyright 2001-2005 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.
+
+# Extract launch and ant arguments, (see details below).
+ant_exec_args=
+no_config=false
+use_jikes_default=false
+ant_exec_debug=false
+show_help=false
+for arg in "$@" ; do
+  if [ "$arg" = "--noconfig" ] ; then
+    no_config=true
+  elif [ "$arg" = "--usejikes" ] ; then
+    use_jikes_default=true
+  elif [ "$arg" = "--execdebug" ] ; then
+    ant_exec_debug=true
+  elif [ my"$arg" = my"--h"  -o my"$arg" = my"--help"  ] ; then
+    show_help=true
+    ant_exec_args="$ant_exec_args -h"
+  else
+    if [  my"$arg" = my"-h"  -o  my"$arg" = my"-help" ] ; then
+      show_help=true
+    fi
+    ant_exec_args="$ant_exec_args \"$arg\""
+  fi
+done
+
+# Source/default ant configuration
+if $no_config ; then
+  rpm_mode=false
+  usejikes=$use_jikes_default
+else
+  # load system-wide ant configuration
+#  if [ -f "/etc/ant.conf" ] ; then
+#    . /etc/ant.conf
+#  fi
+
+  # load user ant configuration
+  if [ -f "$HOME/.ant/ant.conf" ] ; then
+    . $HOME/.ant/ant.conf
+  fi
+  if [ -f "$HOME/.antrc" ] ; then
+    . "$HOME/.antrc"
+  fi
+
+  # provide default configuration values
+  if [ -z "$rpm_mode" ] ; then
+    rpm_mode=false
+  fi
+  if [ -z "$usejikes" ] ; then
+    usejikes=$use_jikes_default
+  fi
+fi
+
+# Setup Java environment in rpm mode
+if $rpm_mode ; then
+  if [ -f /usr/share/java-utils/java-functions ] ; then
+    . /usr/share/java-utils/java-functions
+    set_jvm
+    set_javacmd
+  fi
+fi
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+case "`uname`" in
+  CYGWIN*) cygwin=true ;;
+  Darwin*) darwin=true
+           if [ -z "$JAVA_HOME" ] ; then
+             JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Home
+           fi
+           ;;
+esac
+
+if [ -z "$ANT_HOME" -o ! -d "$ANT_HOME" ] ; then
+  ## resolve links - $0 may be a link to ant's home
+  PRG="$0"
+  progname=`basename "$0"`
+
+  # need this for relative symlinks
+  while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+    PRG="$link"
+    else
+    PRG=`dirname "$PRG"`"/$link"
+    fi
+  done
+
+  ANT_HOME=`dirname "$PRG"`/..
+
+  # make it fully qualified
+  ANT_HOME=`cd "$ANT_HOME" && pwd`
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+  [ -n "$ANT_HOME" ] &&
+    ANT_HOME=`cygpath --unix "$ANT_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# set ANT_LIB location
+ANT_LIB="${ANT_HOME}/lib"
+
+if [ -z "$JAVACMD" ] ; then
+  if [ -n "$JAVA_HOME"  ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+    fi
+  else
+    JAVACMD=`which java 2> /dev/null `
+    if [ -z "$JAVACMD" ] ; then
+        JAVACMD=java
+    fi
+  fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+  echo "Error: JAVA_HOME is not defined correctly."
+  echo "  We cannot execute $JAVACMD"
+  exit 1
+fi
+
+# Build local classpath using just the launcher in non-rpm mode or
+# use the Jpackage helper in rpm mode with basic and default jars
+# specified in the ant.conf configuration. Because the launcher is
+# used, libraries linked in ANT_HOME will also be include, but this
+# is discouraged as it is not java-version safe. A user should
+# request optional jars and their dependencies via the OPT_JAR_LIST
+# variable
+if $rpm_mode && [ -f /usr/bin/build-classpath ] ; then
+  LOCALCLASSPATH="$(/usr/bin/build-classpath ant ant-launcher jaxp_parser_impl xml-commons-apis)"
+  # If the user requested to try to add some other jars to the classpath
+  if [ -n "$OPT_JAR_LIST" ] ; then
+    _OPTCLASSPATH="$(/usr/bin/build-classpath $OPT_JAR_LIST 2> /dev/null)"
+    if [ -n "$_OPTCLASSPATH" ] ; then 
+      LOCALCLASSPATH="$LOCALCLASSPATH:$_OPTCLASSPATH"
+    fi
+  fi
+
+  # Explicitly add javac path to classpath, assume JAVA_HOME set
+  # properly in rpm mode
+  if [ -f "$JAVA_HOME/lib/tools.jar" ] ; then
+    LOCALCLASSPATH="$LOCALCLASSPATH:$JAVA_HOME/lib/tools.jar"
+  fi
+  if [ -f "$JAVA_HOME/lib/classes.zip" ] ; then
+    LOCALCLASSPATH="$LOCALCLASSPATH:$JAVA_HOME/lib/classes.zip"
+  fi
+
+  # if CLASSPATH_OVERRIDE env var is set, LOCALCLASSPATH will be
+  # user CLASSPATH first and ant-found jars after.
+  # In that case, the user CLASSPATH will override ant-found jars
+  #
+  # if CLASSPATH_OVERRIDE is not set, we'll have the normal behaviour
+  # with ant-found jars first and user CLASSPATH after
+  if [ -n "$CLASSPATH" ] ; then
+    # merge local and specified classpath 
+    if [ -z "$LOCALCLASSPATH" ] ; then 
+      LOCALCLASSPATH="$CLASSPATH"
+    elif [ -n "$CLASSPATH_OVERRIDE" ] ; then
+      LOCALCLASSPATH="$CLASSPATH:$LOCALCLASSPATH"
+    else
+      LOCALCLASSPATH="$LOCALCLASSPATH:$CLASSPATH"
+    fi
+
+    # remove class path from launcher -cp option
+    CLASSPATH=""
+  fi
+else
+  # not using rpm_mode; use launcher to determine classpaths
+  if [ -z "$LOCALCLASSPATH" ] ; then
+      LOCALCLASSPATH=$ANT_LIB/ant-launcher.jar
+  else
+      LOCALCLASSPATH=$ANT_LIB/ant-launcher.jar:$LOCALCLASSPATH
+  fi
+fi
+
+if [ -n "$JAVA_HOME" ] ; then
+  # OSX hack to make Ant work with jikes
+  if $darwin ; then
+    OSXHACK="${JAVA_HOME}/../Classes"
+    if [ -d "${OSXHACK}" ] ; then
+      for i in "${OSXHACK}"/*.jar
+      do
+        JIKESPATH="$JIKESPATH:$i"
+      done
+    fi
+  fi
+fi
+
+# Allow Jikes support (off by default)
+if $usejikes; then
+  ANT_OPTS="$ANT_OPTS -Dbuild.compiler=jikes"
+fi
+
+# For Cygwin, switch paths to appropriate format before running java
+# For PATHs convert to unix format first, then to windows format to ensure
+# both formats are supported. Probably this will fail on directories with ;
+# in the name in the path. Let's assume that paths containing ; are more
+# rare than windows style paths on cygwin.
+if $cygwin; then
+  if [ "$OS" = "Windows_NT" ] && cygpath -m .>/dev/null 2>/dev/null ; then
+    format=mixed
+  else
+    format=windows
+  fi
+  ANT_HOME=`cygpath --$format "$ANT_HOME"`
+  ANT_LIB=`cygpath --$format "$ANT_LIB"`
+  JAVA_HOME=`cygpath --$format "$JAVA_HOME"`
+  LCP_TEMP=`cygpath --path --unix "$LOCALCLASSPATH"`
+  LOCALCLASSPATH=`cygpath --path --$format "$LCP_TEMP"`
+  if [ -n "$CLASSPATH" ] ; then
+    CP_TEMP=`cygpath --path --unix "$CLASSPATH"`
+    CLASSPATH=`cygpath --path --$format "$CP_TEMP"`
+  fi
+  CYGHOME=`cygpath --$format "$HOME"`
+fi
+
+# Show script help if requested
+if $show_help ; then
+  echo $0 '[script options] [options] [target [target2 [target3] ..]]'
+  echo 'Script Options:'
+  echo '  --help, --h            print this message and ant help'
+  echo '  --noconfig             suppress sourcing of /etc/ant.conf,'
+  echo '                         $HOME/.ant/ant.conf, and $HOME/.antrc'
+  echo '                         configuration files'
+  echo '  --usejikes             enable use of jikes by default, unless'
+  echo '                         set explicitly in configuration files'
+  echo '  --execdebug            print ant exec line generated by this'
+  echo '                         launch script'
+  echo '  '
+fi
+# add a second backslash to variables terminated by a backslash under cygwin
+if $cygwin; then
+  case "$ANT_HOME" in
+    *\\ )
+    ANT_HOME="$ANT_HOME\\"
+    ;;
+  esac
+  case "$CYGHOME" in
+    *\\ )
+    CYGHOME="$CYGHOME\\"
+    ;;
+  esac
+  case "$JIKESPATH" in
+    *\\ )
+    JIKESPATH="$JIKESPATH\\"
+    ;;
+  esac
+  case "$LOCALCLASSPATH" in
+    *\\ )
+    LOCALCLASSPATH="$LOCALCLASSPATH\\"
+    ;;
+  esac
+  case "$CLASSPATH" in
+    *\\ )
+    CLASSPATH="$CLASSPATH\\"
+    ;;
+  esac
+fi
+# Execute ant using eval/exec to preserve spaces in paths,
+# java options, and ant args
+ant_sys_opts=
+if [ -n "$CYGHOME" ]; then
+  if [ -n "$JIKESPATH" ]; then
+    ant_sys_opts="-Djikes.class.path=\"$JIKESPATH\" -Dcygwin.user.home=\"$CYGHOME\""
+  else
+    ant_sys_opts="-Dcygwin.user.home=\"$CYGHOME\""
+  fi
+else
+  if [ -n "$JIKESPATH" ]; then
+    ant_sys_opts="-Djikes.class.path=\"$JIKESPATH\""
+  fi
+fi
+ant_exec_command="exec \"$JAVACMD\" $ANT_OPTS -classpath \"$LOCALCLASSPATH\" -Dant.home=\"$ANT_HOME\" -Dant.library.dir=\"$ANT_LIB\" $ant_sys_opts org.apache.tools.ant.launch.Launcher $ANT_ARGS -cp \"$CLASSPATH\" $ant_exec_args"
+if $ant_exec_debug ; then
+    echo $ant_exec_command
+fi
+eval $ant_exec_command
Index: /release-kits/shared/core/ant/bin/ant.bat
===================================================================
--- /release-kits/shared/core/ant/bin/ant.bat	(revision 18997)
+++ /release-kits/shared/core/ant/bin/ant.bat	(revision 18997)
@@ -0,0 +1,126 @@
+@echo off
+
+REM  Copyright 2001,2004-2005 The Apache Software Foundation
+REM
+REM  Licensed under the Apache License, Version 2.0 (the "License");
+REM  you may not use this file except in compliance with the License.
+REM  You may obtain a copy of the License at
+REM
+REM      http://www.apache.org/licenses/LICENSE-2.0
+REM
+REM  Unless required by applicable law or agreed to in writing, software
+REM  distributed under the License is distributed on an "AS IS" BASIS,
+REM  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+REM  See the License for the specific language governing permissions and
+REM  limitations under the License.
+
+if exist "%HOME%\antrc_pre.bat" call "%HOME%\antrc_pre.bat"
+
+if "%OS%"=="Windows_NT" @setlocal
+if "%OS%"=="WINNT" @setlocal
+
+rem %~dp0 is expanded pathname of the current script under NT
+set DEFAULT_ANT_HOME=%~dp0..
+
+if "%ANT_HOME%"=="" set ANT_HOME=%DEFAULT_ANT_HOME%
+set DEFAULT_ANT_HOME=
+
+set _USE_CLASSPATH=yes
+
+rem Slurp the command line arguments. This loop allows for an unlimited number
+rem of arguments (up to the command line limit, anyway).
+set ANT_CMD_LINE_ARGS=%1
+if ""%1""=="""" goto doneStart
+shift
+:setupArgs
+if ""%1""=="""" goto doneStart
+if ""%1""==""-noclasspath"" goto clearclasspath
+set ANT_CMD_LINE_ARGS=%ANT_CMD_LINE_ARGS% %1
+shift
+goto setupArgs
+
+rem here is there is a -noclasspath in the options
+:clearclasspath
+set _USE_CLASSPATH=no
+shift
+goto setupArgs
+
+rem This label provides a place for the argument list loop to break out
+rem and for NT handling to skip to.
+
+:doneStart
+rem find ANT_HOME if it does not exist due to either an invalid value passed
+rem by the user or the %0 problem on Windows 9x
+if exist "%ANT_HOME%\lib\ant.jar" goto checkJava
+
+rem check for ant in Program Files
+if not exist "%ProgramFiles%\ant" goto checkSystemDrive
+set ANT_HOME=%ProgramFiles%\ant
+goto checkJava
+
+:checkSystemDrive
+rem check for ant in root directory of system drive
+if not exist %SystemDrive%\ant\lib\ant.jar goto checkCDrive
+set ANT_HOME=%SystemDrive%\ant
+goto checkJava
+
+:checkCDrive
+rem check for ant in C:\ant for Win9X users
+if not exist C:\ant\lib\ant.jar goto noAntHome
+set ANT_HOME=C:\ant
+goto checkJava
+
+:noAntHome
+echo ANT_HOME is set incorrectly or ant could not be located. Please set ANT_HOME.
+goto end
+
+:checkJava
+set _JAVACMD=%JAVACMD%
+
+if "%JAVA_HOME%" == "" goto noJavaHome
+if not exist "%JAVA_HOME%\bin\java.exe" goto noJavaHome
+if "%_JAVACMD%" == "" set _JAVACMD=%JAVA_HOME%\bin\java.exe
+goto checkJikes
+
+:noJavaHome
+if "%_JAVACMD%" == "" set _JAVACMD=java.exe
+
+:checkJikes
+if not "%JIKESPATH%"=="" goto runAntWithJikes
+
+:runAnt
+if "%_USE_CLASSPATH%"=="no" goto runAntNoClasspath
+if not "%CLASSPATH%"=="" goto runAntWithClasspath
+"%_JAVACMD%" %ANT_OPTS% -classpath "%ANT_HOME%\lib\ant-launcher.jar" "-Dant.home=%ANT_HOME%" org.apache.tools.ant.launch.Launcher %ANT_ARGS% %ANT_CMD_LINE_ARGS%
+goto end
+
+:runAntNoClasspath
+"%_JAVACMD%" %ANT_OPTS% -classpath "%ANT_HOME%\lib\ant-launcher.jar" "-Dant.home=%ANT_HOME%" org.apache.tools.ant.launch.Launcher %ANT_ARGS% %ANT_CMD_LINE_ARGS%
+goto end
+
+:runAntWithClasspath
+"%_JAVACMD%" %ANT_OPTS% -classpath "%ANT_HOME%\lib\ant-launcher.jar" "-Dant.home=%ANT_HOME%" org.apache.tools.ant.launch.Launcher %ANT_ARGS% -cp "%CLASSPATH%" %ANT_CMD_LINE_ARGS%
+goto end
+
+:runAntWithJikes
+if "%_USE_CLASSPATH%"=="no" goto runAntWithJikesNoClasspath
+if not "%CLASSPATH%"=="" goto runAntWithJikesAndClasspath
+
+:runAntWithJikesNoClasspath
+"%_JAVACMD%" %ANT_OPTS% -classpath "%ANT_HOME%\lib\ant-launcher.jar" "-Dant.home=%ANT_HOME%" "-Djikes.class.path=%JIKESPATH%" org.apache.tools.ant.launch.Launcher %ANT_ARGS% %ANT_CMD_LINE_ARGS%
+goto end
+
+:runAntWithJikesAndClasspath
+"%_JAVACMD%" %ANT_OPTS% -classpath "%ANT_HOME%\lib\ant-launcher.jar" "-Dant.home=%ANT_HOME%" "-Djikes.class.path=%JIKESPATH%" org.apache.tools.ant.launch.Launcher %ANT_ARGS%  -cp "%CLASSPATH%" %ANT_CMD_LINE_ARGS%
+goto end
+
+:end
+set _JAVACMD=
+set ANT_CMD_LINE_ARGS=
+
+if "%OS%"=="Windows_NT" @endlocal
+if "%OS%"=="WINNT" @endlocal
+
+:mainEnd
+if exist "%HOME%\antrc_post.bat" call "%HOME%\antrc_post.bat"
+
Index: /release-kits/shared/core/build.xml
===================================================================
--- /release-kits/shared/core/build.xml	(revision 18997)
+++ /release-kits/shared/core/build.xml	(revision 18997)
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<project name="rk-compilation" default="compile">
+
+	<target name="compile">
+		<ant dir="ant-scripts/tasks/greenstone" inheritAll="false">
+			<property name="crypt.jar" value="${basedir}/lib/crypt.jar"/>
+		</ant>
+	</target>
+
+</project>
+
Index: /release-kits/shared/core/language-strings/LanguagePack.properties
===================================================================
--- /release-kits/shared/core/language-strings/LanguagePack.properties	(revision 18997)
+++ /release-kits/shared/core/language-strings/LanguagePack.properties	(revision 18997)
@@ -0,0 +1,208 @@
+### 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-message.displayText = Greenstone@version.major@ is software for building and sharing digital libraries.\n\nIt is recommended that you uninstall any previous installations of Greenstone@version.major@ before running this installer.
+
+## 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>\n
+It 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>\n
+yourself, make modifications to your copy of Greenstone@version.major@, or if<br>\n
+you just want to see how it works. \
+</html>
+
+Installing_ImageMagick.displayText = ImageMagick with JPEG2000 (@bundled.version.imagemagick@)
+Installing_ImageMagick.explanatoryText = \
+<html> \
+Greenstone uses ImageMagick to process images.<br>\n
+The bundled version of ImageMagick includes support for the JPEG2000 image <br>\
+format. If you have ImageMagick on your computer already, or if you don't wish <br>\
+to include images in Greenstone collections, then you may choose not to <br>\
+install ImageMagick. \
+</html>
+
+Installing_Ghostscript.displayText = GhostScript (@bundled.version.ghostscript@)
+Installing_Ghostscript.explanatoryText = \
+<html> \
+Greenstone uses GhostScript to process PDF and PostScript files.<br> \
+If you have Ghostscript on your computer already, or if you don't wish to<br>\
+include PDF of PostScript files in Greenstone collections, then you may choose <br>\
+not to install Ghostscript. \
+</html>
+
+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>
+
+### Admin password page
+page.admin-password.displayText = Please set the Admin Password
+admin.password.displayText = Admin Password
+admin-password-expl.displayText = In order to access certain parts of the Greenstone interface you need a password. A user with the username 'admin' will be created for you with the password you provide. The password must be between 3 and 20 characters long.
+
+### 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 = Tom	cat 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
+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: /release-kits/shared/core/language-strings/LanguagePack_ar.properties
===================================================================
--- /release-kits/shared/core/language-strings/LanguagePack_ar.properties	(revision 18997)
+++ /release-kits/shared/core/language-strings/LanguagePack_ar.properties	(revision 18997)
@@ -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: /release-kits/shared/core/language-strings/LanguagePack_de.properties
===================================================================
--- /release-kits/shared/core/language-strings/LanguagePack_de.properties	(revision 18997)
+++ /release-kits/shared/core/language-strings/LanguagePack_de.properties	(revision 18997)
@@ -0,0 +1,207 @@
+### 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-message.displayText = Greenstone@version.major@ ist eine Software zum Aufbau und Austausch von digitalen Bibliotheken.\n\nWir empfehlen, dass Sie alte Installationen von Greenstone@version.major@ deinstallieren, bevor Sie diese Installation starten.
+
+## 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>\n
+Es 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>\n
+Ihre Kopie von Greenstone@version.major@ modifizieren wollen, oder wenn<br>\n
+Sie 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>\n
+Die 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-password.displayText = Bitte setzen Sie das Admin Passwort
+admin.password.displayText = 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.
+
+### 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: /release-kits/shared/core/language-strings/LanguagePack_es.properties
===================================================================
--- /release-kits/shared/core/language-strings/LanguagePack_es.properties	(revision 18997)
+++ /release-kits/shared/core/language-strings/LanguagePack_es.properties	(revision 18997)
@@ -0,0 +1,204 @@
+﻿### 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-message.displayText = Greenstone@version.major@ es un software para construir y compartir bibliotecas digitales.\n\nSe recomienda desinstalar cualquier versión previa a Greenstone@version.major@ antes de ejecutar este instalador.
+
+## 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>\n
+Incluye 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>\n
+hacer 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>\n
+Esta 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-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: /release-kits/shared/core/language-strings/LanguagePack_es_EU.properties
===================================================================
--- /release-kits/shared/core/language-strings/LanguagePack_es_EU.properties	(revision 18997)
+++ /release-kits/shared/core/language-strings/LanguagePack_es_EU.properties	(revision 18997)
@@ -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: /release-kits/shared/core/language-strings/LanguagePack_fr.properties
===================================================================
--- /release-kits/shared/core/language-strings/LanguagePack_fr.properties	(revision 18997)
+++ /release-kits/shared/core/language-strings/LanguagePack_fr.properties	(revision 18997)
@@ -0,0 +1,188 @@
+### Language page ###
+page.language-selector.displayText = Langue
+language-selector-explanation.displayText = Veuillez sÃ©lectionner la langue de lâinstallation.
+
+
+### 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\nIl est recommandÃ© de dÃ©sinstaller les versions prÃ©cÃ©dentes de Greenstone@version.major@ avant de poursuivre avec cette installation.
+
+## 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 le rÃ©pertoire sÃ©lectionnÃ©.\n\nIl est vivement recommandÃ© de quitter cet installeur, dÃ©sinstaller l'ancienne version de Greenstone, puis redÃ©marrez 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>
+
+### Admin password page
+page.admin-password.displayText = Veuillez crÃ©er un mot de passe Administrateur
+admin.password.displayText = Mot de passe Admin
+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.
+
+### 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 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 dans un format valide 
+notCorrectPasswordFormat = Ce mot de passe n'est pas valide
+passwordsDoNotMatch = Les mots de passe ne correspondent pas
+installationFailed = Install 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 log pour plus de dÃ©tails
+
+license.next.text = Accepter
+license.cancel.text = Refuser
Index: /release-kits/shared/core/language-strings/LanguagePack_ru.properties
===================================================================
--- /release-kits/shared/core/language-strings/LanguagePack_ru.properties	(revision 18997)
+++ /release-kits/shared/core/language-strings/LanguagePack_ru.properties	(revision 18997)
@@ -0,0 +1,217 @@
+### Language page ###
+page.language-selector.displayText = Ð¯Ð·ÑÐº
+language-selector-explanation.displayText = ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, Ð²ÑÐ±ÐµÑÐžÑÐµ ÐœÑÐ¶ÐœÑÐ¹ ÑÐ·ÑÐº
+#(ÐÐ°ÐŒÐµÑÑÑÐµ, ÑÑÐ° Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ° ÑÑÑÐ°ÐœÐŸÐ²ÐºÐž ÐµÑÐµ ÐœÐµ Ð¿ÐŸÐ»ÐœÐŸÑÑÑÑ Ð¿ÐµÑÐµÐ²ÐµÐŽÐµÐœÐ° ÐœÐ° Ð²ÑÐµ ÑÐ·ÑÐºÐž)
+
+
+### 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> 
+
+</html>
+
+### Admin password page
+page.admin-password.displayText = ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, ÑÑÑÐ°ÐœÐŸÐ²ÐžÑÐµ Ð¿Ð°ÑÐŸÐ»Ñ Ð°ÐŽÐŒÐžÐœÐžÑÑÑÐ°ÑÐŸÑÐ°
+admin.password.displayText = ÐÐ°ÑÐŸÐ»Ñ Ð°ÐŽÐŒÐžÐœÐžÑÑÑÐ°ÑÐŸÑÐ°
+admin-password-expl.displayText = ÐÐ»Ñ ÑÐŸÐ³ÐŸ ÑÑÐŸÐ±Ñ Ð¿ÐŸÐ»ÑÑÐžÑÑ ÐŽÐŸÑÑÑÐ¿ Ðº ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐœÑÐŒ ÑÐ°ÑÑÑÐŒ ÐžÐœÑÐµÑÑÐµÐ¹ÑÐ° Greenstone ÐÐ°ÐŒ Ð¿ÐŸÐœÐ°ÐŽÐŸÐ±ÐžÑÑÑ Ð¿Ð°ÑÐŸÐ»Ñ. ÐÐ»Ñ Ð²Ð°Ð· Ð±ÑÐŽÐµÑ ÑÐŸÐ·ÐŽÐ°Ðœ Ð¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÐµÐ»Ñ Ñ ÐžÐŒÐµÐœÐµÐŒ "Admin". 
+ÐÐ»Ñ ÑÑÐŸÐ³ÐŸ Ð¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÐµÐ»Ñ ÐÐ°ÐŒ ÐœÑÐ¶ÐœÐŸ ÑÐºÐ°Ð·Ð°ÑÑ Ð¿Ð°ÑÐŸÐ»Ñ. Ð­ÑÐŸÑ Ð¿Ð°ÑÐŸÐ»Ñ ÐŽÐŸÐ»Ð¶ÐµÐœ Ð±ÑÑÑ ÐŸÑ 3 ÐŽÐŸ 20 ÑÐžÐŒÐ²ÐŸÐ»ÐŸÐ². 
+
+### 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 = ÐÑÐºÐ»ÐŸÐœÐžÑÑ
Index: /release-kits/shared/core/language-strings/LanguagePack_zh.properties
===================================================================
--- /release-kits/shared/core/language-strings/LanguagePack_zh.properties	(revision 18997)
+++ /release-kits/shared/core/language-strings/LanguagePack_zh.properties	(revision 18997)
@@ -0,0 +1,264 @@
+### Language page ###
+page.language-selector.displayText = è¯­èš
+language-selector-explanation.displayText = è¯·éæ©è¯­èš
+#ïŒæ³šïŒæ¬å®è£
+åšå°æªè¢«ç¿»è¯æææè¯­ç§ïŒ
+
+
+### Intro Page ###
+page.intro.displayText = Greenstone @version@ å®è£
+åš
+welcome-message.displayText = Greenstone@version.major@æ¯çšäºæé åå
+±äº«æ°å­åŸä¹ŠéŠçèœ¯ä»¶ã\n\nå»ºè®®åšè¿è¡æ¬å®è£
+åšä»¥ååžèœœææå·²å®è£
+çGreenstoneçæ¬ã
+
+## 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 = \
+<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äœ ä¹å¯ä»
+ä»
+æ¢ç©¶Greenstoneæ¯åŠäœå·¥äœçã\
+</html>
+
+Installing_ImageMagick.displayText = æ¯æJPEG2000çImageMagick (@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>\
+æè
+äœ äžæ³åšäœ çGreenstoneæ¶éäž­å å
+¥PDFåPostScriptæä»¶ïŒ<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-password.displayText = è¯·è®Ÿå®ç®¡çåå¯ç 
+admin.password.displayText = ç®¡çåå¯ç 
+admin-password-expl.displayText = è®¿é®Greenstoneçé¢çäžäºç¹å®éšåéèŠèŸå
+¥å¯ç ãäœ¿çšææäŸçå¯ç ïŒäžäžªçšæ·åäžº'admin'ççšæ·äŒè¢«èªåšåå»ºãå¯ç é¿åºŠå¿
+é¡»æ¯3è³8äœã
+
+### 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 = æç»
Index: /release-kits/shared/core/uninstaller/Uninstall.bat
===================================================================
--- /release-kits/shared/core/uninstaller/Uninstall.bat	(revision 18997)
+++ /release-kits/shared/core/uninstaller/Uninstall.bat	(revision 18997)
@@ -0,0 +1,30 @@
+@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 .\bin\search4j.exe del .\bin\search4j.exe
+	rmdir bin
+		
+	del uninst.jar
+	del uninst.flag
+	del Uninstall.*
+	
+	if NOT EXIST *.* (
+		set GSDEL=%CD%
+		cd ..
+		rmdir %GSDEL%
+	)
+	
+)
Index: /release-kits/shared/core/uninstaller/Uninstall.sh
===================================================================
--- /release-kits/shared/core/uninstaller/Uninstall.sh	(revision 18997)
+++ /release-kits/shared/core/uninstaller/Uninstall.sh	(revision 18997)
@@ -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: /release-kits/shared/core/uninstaller/Uninstaller.java
===================================================================
--- /release-kits/shared/core/uninstaller/Uninstaller.java	(revision 18997)
+++ /release-kits/shared/core/uninstaller/Uninstaller.java	(revision 18997)
@@ -0,0 +1,607 @@
+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" );
+
+		// Make sure the file or directory exists
+		if (!f.exists()) {
+			log( Strings.replaceAll( bundle.getString("uninstaller.warning.nonexistent"), "{file}", f.getAbsolutePath() ) + "\n" );
+			return;
+		}
+
+		// 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;
+				}
+			}
+		}
+
+		//check existance
+		if ( !f.exists() ) {
+			log( Strings.replaceAll( bundle.getString("uninstaller.error.nonexistent"), "{file}", f.getAbsolutePath() ) + "\n" );
+			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 ) {
+
+			Object[] options = null;
+			int n = 0;
+			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: /release-kits/shared/core/uninstaller/compile.bat
===================================================================
--- /release-kits/shared/core/uninstaller/compile.bat	(revision 18997)
+++ /release-kits/shared/core/uninstaller/compile.bat	(revision 18997)
@@ -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: /release-kits/shared/core/uninstaller/compile.sh
===================================================================
--- /release-kits/shared/core/uninstaller/compile.sh	(revision 18997)
+++ /release-kits/shared/core/uninstaller/compile.sh	(revision 18997)
@@ -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/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: /release-kits/shared/core/uninstaller/gsdl-template/build.properties
===================================================================
--- /release-kits/shared/core/uninstaller/gsdl-template/build.properties	(revision 18997)
+++ /release-kits/shared/core/uninstaller/gsdl-template/build.properties	(revision 18997)
@@ -0,0 +1,1 @@
+lines
Index: /release-kits/shared/core/uninstaller/gsdl-template/build.xml
===================================================================
--- /release-kits/shared/core/uninstaller/gsdl-template/build.xml	(revision 18997)
+++ /release-kits/shared/core/uninstaller/gsdl-template/build.xml	(revision 18997)
@@ -0,0 +1,1 @@
+lines
Index: /release-kits/shared/core/uninstaller/gsdl-template/collect/demo/demo.cfg
===================================================================
--- /release-kits/shared/core/uninstaller/gsdl-template/collect/demo/demo.cfg	(revision 18997)
+++ /release-kits/shared/core/uninstaller/gsdl-template/collect/demo/demo.cfg	(revision 18997)
@@ -0,0 +1,1 @@
+demo
Index: /release-kits/shared/core/uninstaller/gsdl-template/etc/main.cfg
===================================================================
--- /release-kits/shared/core/uninstaller/gsdl-template/etc/main.cfg	(revision 18997)
+++ /release-kits/shared/core/uninstaller/gsdl-template/etc/main.cfg	(revision 18997)
@@ -0,0 +1,1 @@
+test
Index: /release-kits/shared/core/uninstaller/gsdl-template/installation.properties
===================================================================
--- /release-kits/shared/core/uninstaller/gsdl-template/installation.properties	(revision 18997)
+++ /release-kits/shared/core/uninstaller/gsdl-template/installation.properties	(revision 18997)
@@ -0,0 +1,1 @@
+startmenu.path:/home/oranfry/release-kits/wirk3/uninstaller/startmenu/Greenstone 2.81
Index: /release-kits/shared/core/uninstaller/gsdl-template/setup.bash
===================================================================
--- /release-kits/shared/core/uninstaller/gsdl-template/setup.bash	(revision 18997)
+++ /release-kits/shared/core/uninstaller/gsdl-template/setup.bash	(revision 18997)
@@ -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: /release-kits/shared/core/uninstaller/gsdl-template/test2.txt
===================================================================
--- /release-kits/shared/core/uninstaller/gsdl-template/test2.txt	(revision 18997)
+++ /release-kits/shared/core/uninstaller/gsdl-template/test2.txt	(revision 18997)
@@ -0,0 +1,1 @@
+test
Index: /release-kits/shared/core/uninstaller/gsdl-template/web/sites/localsite/collect/demo/index.db
===================================================================
--- /release-kits/shared/core/uninstaller/gsdl-template/web/sites/localsite/collect/demo/index.db	(revision 18997)
+++ /release-kits/shared/core/uninstaller/gsdl-template/web/sites/localsite/collect/demo/index.db	(revision 18997)
@@ -0,0 +1,1 @@
+test
Index: /release-kits/shared/core/uninstaller/gsdl-template/web/sites/localsite/test.txt
===================================================================
--- /release-kits/shared/core/uninstaller/gsdl-template/web/sites/localsite/test.txt	(revision 18997)
+++ /release-kits/shared/core/uninstaller/gsdl-template/web/sites/localsite/test.txt	(revision 18997)
@@ -0,0 +1,1 @@
+test
Index: /release-kits/shared/core/uninstaller/gsdl-template/web/test.txt
===================================================================
--- /release-kits/shared/core/uninstaller/gsdl-template/web/test.txt	(revision 18997)
+++ /release-kits/shared/core/uninstaller/gsdl-template/web/test.txt	(revision 18997)
@@ -0,0 +1,1 @@
+test
Index: /release-kits/shared/core/uninstaller/manifest.mf
===================================================================
--- /release-kits/shared/core/uninstaller/manifest.mf	(revision 18997)
+++ /release-kits/shared/core/uninstaller/manifest.mf	(revision 18997)
@@ -0,0 +1,1 @@
+Main-Class: Uninstaller
Index: /release-kits/shared/core/uninstaller/startmenu-template/Adobe Photoshop/Photoshop.lnk
===================================================================
--- /release-kits/shared/core/uninstaller/startmenu-template/Adobe Photoshop/Photoshop.lnk	(revision 18997)
+++ /release-kits/shared/core/uninstaller/startmenu-template/Adobe Photoshop/Photoshop.lnk	(revision 18997)
@@ -0,0 +1,1 @@
+ps
Index: /release-kits/shared/core/uninstaller/startmenu-template/Greenstone 2.81/GEMS.lnk
===================================================================
--- /release-kits/shared/core/uninstaller/startmenu-template/Greenstone 2.81/GEMS.lnk	(revision 18997)
+++ /release-kits/shared/core/uninstaller/startmenu-template/Greenstone 2.81/GEMS.lnk	(revision 18997)
@@ -0,0 +1,1 @@
+test
Index: /release-kits/shared/core/uninstaller/startmenu-template/Greenstone 2.81/GLI.lnk
===================================================================
--- /release-kits/shared/core/uninstaller/startmenu-template/Greenstone 2.81/GLI.lnk	(revision 18997)
+++ /release-kits/shared/core/uninstaller/startmenu-template/Greenstone 2.81/GLI.lnk	(revision 18997)
@@ -0,0 +1,1 @@
+GLI
Index: /release-kits/shared/core/uninstaller/startmenu-template/Greenstone 2.81/Server.lnk
===================================================================
--- /release-kits/shared/core/uninstaller/startmenu-template/Greenstone 2.81/Server.lnk	(revision 18997)
+++ /release-kits/shared/core/uninstaller/startmenu-template/Greenstone 2.81/Server.lnk	(revision 18997)
@@ -0,0 +1,1 @@
+Server
Index: lease-kits/shared/lib/build.xml
===================================================================
--- /release-kits/shared/lib/build.xml	(revision 18996)
+++ 	(revision )
@@ -1,11 +1,0 @@
-<?xml version="1.0"?>
-<project name="rk-compilation" default="compile">
-
-	<target name="compile">
-		<ant dir="ant-scripts/tasks/greenstone" inheritAll="false">
-			<property name="crypt.jar" value="${basedir}/lib/crypt.jar"/>
-		</ant>
-	</target>
-
-</project>
-
Index: lease-kits/shared/resources/Uninstall.txt
===================================================================
--- /release-kits/shared/resources/Uninstall.txt	(revision 18996)
+++ 	(revision )
@@ -1,11 +1,0 @@
-The uninstaller is still under development.
-
-To uninstall Greenstone, follow these instructions:
-
-	* Back up your collections from the "collect" subfolder of the
-	  folder you installed Greenstone to
-	* Back up any other files from you wish to keep from the
-	  folder you installed Greenstone to
-	* Remove the entire folder you installed Greenstone to
-	* Remove the Start Menu shortcuts
-		(right-click on Greenstone in Start Menu, click delete)
Index: /release-kits/shared/resources/artwork/Icon-README.txt
===================================================================
--- /release-kits/shared/resources/artwork/Icon-README.txt	(revision 18997)
+++ /release-kits/shared/resources/artwork/Icon-README.txt	(revision 18997)
@@ -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: /release-kits/shared/windows/7za/copying.txt
===================================================================
--- /release-kits/shared/windows/7za/copying.txt	(revision 18997)
+++ /release-kits/shared/windows/7za/copying.txt	(revision 18997)
@@ -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: /release-kits/shared/windows/7za/license.txt
===================================================================
--- /release-kits/shared/windows/7za/license.txt	(revision 18997)
+++ /release-kits/shared/windows/7za/license.txt	(revision 18997)
@@ -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: /release-kits/shared/windows/7za/readme.txt
===================================================================
--- /release-kits/shared/windows/7za/readme.txt	(revision 18997)
+++ /release-kits/shared/windows/7za/readme.txt	(revision 18997)
@@ -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
