libcommons-launcher-java-1.1/0040755000175000017500000000000010132743154015545 5ustar arnaudarnaudlibcommons-launcher-java-1.1/example/0040755000175000017500000000000010132743154017200 5ustar arnaudarnaudlibcommons-launcher-java-1.1/example/src/0040755000175000017500000000000010100554042017756 5ustar arnaudarnaudlibcommons-launcher-java-1.1/example/src/bin/0040755000175000017500000000000010132743154020537 5ustar arnaudarnaudlibcommons-launcher-java-1.1/example/src/bin/demo.bat0100644000175000017500000000132010100555273022142 0ustar arnaudarnaud@echo off REM Copyright 2002-2004 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. java -cp . LauncherBootstrap -executablename launcher-demo demo libcommons-launcher-java-1.1/example/src/bin/demo.sh0100644000175000017500000000126610100555572022021 0ustar arnaudarnaud#!/bin/sh # Copyright 2002-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. java -cp . LauncherBootstrap -executablename launcher-demo demo libcommons-launcher-java-1.1/example/src/bin/launcher.properties0100644000175000017500000000137710100555167024463 0ustar arnaudarnaud# Copyright 2002-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. ant.class.path=../lib/launcher/ant.jar:../lib/launcher/ant-launcher.jar:../lib/launcher/xercesImpl.jar:../lib/launcher/xml-apis.jar libcommons-launcher-java-1.1/example/src/bin/launcher.xml0100644000175000017500000000253210100555133023052 0ustar arnaudarnaud libcommons-launcher-java-1.1/example/src/etc/0040755000175000017500000000000010132743154020542 5ustar arnaudarnaudlibcommons-launcher-java-1.1/example/src/etc/log4j.xml0100644000175000017500000000317510100555102022273 0ustar arnaudarnaud libcommons-launcher-java-1.1/example/src/java/0040755000175000017500000000000010100554054020702 5ustar arnaudarnaudlibcommons-launcher-java-1.1/example/src/java/org/0040755000175000017500000000000010100554060021466 5ustar arnaudarnaudlibcommons-launcher-java-1.1/example/src/java/org/apache/0040755000175000017500000000000010100554064022713 5ustar arnaudarnaudlibcommons-launcher-java-1.1/example/src/java/org/apache/launcher/0040755000175000017500000000000010100554070024511 5ustar arnaudarnaudlibcommons-launcher-java-1.1/example/src/java/org/apache/launcher/example/0040755000175000017500000000000010132743154026154 5ustar arnaudarnaudlibcommons-launcher-java-1.1/example/src/java/org/apache/launcher/example/Main.java0100644000175000017500000000150110100554755027677 0ustar arnaudarnaud/* * Copyright 2002-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.apache.launcher.example; import org.apache.commons.logging.LogFactory; public class Main { public static void main(String[] args) { LogFactory.getLog(Main.class).info("start"); } } libcommons-launcher-java-1.1/example/build.properties.sample0100644000175000017500000000165610100473342023674 0ustar arnaudarnaud# 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. # log4j.jar - log4j classes (see http://jakarta.apache.org/log4j) log4j.jar=/java/log4j/log4j.jar # commons-logging.home=../../logging/dist # commons-logging.jar=${commons-logging.home}/commons-logging.jar # commons-launcher.home=../dist/bin # commons-launcher.jar=${commons-launcher.home}/commons-launcher.jar libcommons-launcher-java-1.1/example/build.xml0100644000175000017500000001364210100556023021014 0ustar arnaudarnaud libcommons-launcher-java-1.1/src/0040755000175000017500000000000010020121104016311 5ustar arnaudarnaudlibcommons-launcher-java-1.1/src/bin/0040755000175000017500000000000010132743155017105 5ustar arnaudarnaudlibcommons-launcher-java-1.1/src/bin/launch-ant.bat0100644000175000017500000000227207556213351021635 0ustar arnaudarnaud@echo off if "%OS%" == "Windows_NT" setlocal rem --------------------------------------------------------------------------- rem rem Sample script for launching Ant using the Launcher rem rem --------------------------------------------------------------------------- rem Get standard environment variables set PRG=%0 if exist %PRG%\..\settings.bat goto gotCmdPath rem %0 must have been found by DOS using the %PATH% so we assume that rem settings.bat will also be found in the %PATH% call settings.bat goto doneSetenv :gotCmdPath call %PRG%\..\settings.bat :doneSetenv rem Make sure prerequisite environment variables are set if not "%JAVA_HOME%" == "" goto gotJavaHome echo The JAVA_HOME environment variable is not defined echo This environment variable is needed to run this program goto end :gotJavaHome rem Get command line arguments and save them with the proper quoting set CMD_LINE_ARGS= :setArgs if ""%1""=="""" goto doneSetArgs set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 shift goto setArgs :doneSetArgs rem Execute the Launcher using the "ant" target "%JAVA_HOME%\bin\java.exe" -classpath %PRG%\..;"%PATH%" LauncherBootstrap -verbose ant %CMD_LINE_ARGS% :end libcommons-launcher-java-1.1/src/bin/launch-ant.sh0100644000175000017500000000137107556213351021500 0ustar arnaudarnaud#!/bin/sh # ----------------------------------------------------------------------------- # # Sample script for launching Ant using the Launcher # # ----------------------------------------------------------------------------- # Resolve links - $0 may be a softlink PRG="$0" 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 # Get standard environment variables PRGDIR=`dirname "$PRG"` if [ -r "$PRGDIR"/settings.sh ]; then . "$PRGDIR"/settings.sh fi # Execute the Launcher using the "ant" target exec "$JAVA_HOME"/bin/java -classpath "$PRGDIR" LauncherBootstrap -verbose ant "$@" libcommons-launcher-java-1.1/src/bin/launcher.properties0100644000175000017500000000234207556213351023030 0ustar arnaudarnaud# # Properties for the LauncherBootstrap class # # This file contains the following configurable properties: # - ant.class.path - This property is a ":" separated list of the URL file # fragments where the Ant classes are located. The list must include a JAXP # compliant XML parser if you are not using Java(TM) SE 1.4 or higher. # # Important notes: # - Relative URL file fragments, such as "../lib", are supported and strongly # encouraged as absolute files prevent cross platform distribution. # - URL file fragments are the portions of a URL after the "file:" string. # This means that you must use "/" characters as directory separators on # all platforms. Also, ":" characters in a file fragment, such as in drive # portion of absolute Windows files, must be URL encoded as "%3A". Lastly, # directories must have a "/" character at the end. # - All relative URL file fragments in the above properties will be resolved # using the URL of the directory that the LauncherBootstrap class was # loaded from, not the current working directory. This ensures that the # LauncherBootstrap class can properly resolve the files without regard to # the current working directory. # ant.class.path=@ANTJARLIST@ libcommons-launcher-java-1.1/src/bin/launcher.xml0100644000175000017500000000625507556213351021443 0ustar arnaudarnaud libcommons-launcher-java-1.1/src/conf/0040755000175000017500000000000010132743155017262 5ustar arnaudarnaudlibcommons-launcher-java-1.1/src/conf/MANIFEST.MF0100644000175000017500000000027707556213350020724 0ustar arnaudarnaudExtension-Name: @package@ Specification-Vendor: Apache Software Foundation Specification-Version: 1.0 Implementation-Vendor: Apache Software Foundation Implementation-Version: @version@ libcommons-launcher-java-1.1/src/java/0040755000175000017500000000000010132743155017256 5ustar arnaudarnaudlibcommons-launcher-java-1.1/src/java/org/0040755000175000017500000000000010020121104020021 5ustar arnaudarnaudlibcommons-launcher-java-1.1/src/java/org/apache/0040755000175000017500000000000010020121104021242 5ustar arnaudarnaudlibcommons-launcher-java-1.1/src/java/org/apache/commons/0040755000175000017500000000000010020121104022715 5ustar arnaudarnaudlibcommons-launcher-java-1.1/src/java/org/apache/commons/launcher/0040755000175000017500000000000010132743155024542 5ustar arnaudarnaudlibcommons-launcher-java-1.1/src/java/org/apache/commons/launcher/types/0040755000175000017500000000000010132743155025706 5ustar arnaudarnaudlibcommons-launcher-java-1.1/src/java/org/apache/commons/launcher/types/ArgumentSet.java0100644000175000017500000000310210020100364030761 0ustar arnaudarnaud/* * Copyright 1999-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.apache.commons.launcher.types; /** * A class that represents a set of nested elements. * * @author Patrick Luby */ public class ArgumentSet extends ConditionalArgumentSet { //----------------------------------------------------------- Static Fields /** * The name of this data type. */ public final static String TYPE_NAME = "argset"; //----------------------------------------------------------------- Methods /** * Add a {@link ConditionalArgument}. * * @param argument the {@link ConditionalArgument} to be * added */ public void addArg(ConditionalArgument argument) { addConditionalargument(argument); } /** * Add a {@link ArgumentSet}. * * @param set the {@link ArgumentSet} to be added */ public void addArgset(ArgumentSet set) { addConditionalargumentset(set); } } libcommons-launcher-java-1.1/src/java/org/apache/commons/launcher/types/ArgumentSet_en.properties0100644000175000017500000000025007556213350032743 0ustar arnaudarnaud# # Localized strings for ArgumentSet class # cannot.nest=Only and elements can be nested cannot.reference=Only elements can be referenced libcommons-launcher-java-1.1/src/java/org/apache/commons/launcher/types/ConditionalArgument.java0100644000175000017500000001144310020106363032505 0ustar arnaudarnaud/* * Copyright 1999-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.apache.commons.launcher.types; import java.io.File; import org.apache.tools.ant.ProjectHelper; import org.apache.tools.ant.types.Commandline; import org.apache.tools.ant.types.DataType; import org.apache.tools.ant.types.Path; /** * A class that represents nested or elements. This class * provides the same functionality as the class that represents these same * elements in a "java" task. In addition, this class supports conditional "if" * and "unless" attributes. * * @author Patrick Luby */ public class ConditionalArgument extends DataType { //------------------------------------------------------------------ Fields /** * Cached "if" condition flag. */ private String ifCondition = null; /** * Cached "unless" condition flag. */ private String unlessCondition = null; /** * Cached command line arguments. */ private String[] parts = null; //----------------------------------------------------------------- Methods /** * Get the "if" condition flag. * * @return the "if" condition flag */ public String getIf() { return ProjectHelper.replaceProperties(project, ifCondition, project.getProperties()); } /** * Get a single command line argument. * * @return a single command line argument */ public String[] getParts() { String[] list = new String[parts.length]; for (int i = 0; i < parts.length; i++) list[i] = ProjectHelper.replaceProperties(project, parts[i], project.getProperties()); return list; } /** * Get the "unless" condition flag. * * @return the "unless" condition flag */ public String getUnless() { return ProjectHelper.replaceProperties(project, unlessCondition, project.getProperties()); } /** * Set a single command line argument to the absolute * filename of the specified file. * * @param file a single command line argument */ public void setFile(File file) { this.parts = new String[]{ file.getAbsolutePath() }; } /** * Set the "if" condition. Tasks that nest this class as an element * should evaluate this flag in their {@link org.apache.tools.ant.Task#execute()} method. If the * following conditions are true, the task should process this element: *
    *
      The flag is neither null nor a empty string *
        The property that the flag resolves to after macro substitution * is defined *
* * @param property a property name or macro */ public void setIf(String property) { this.ifCondition = property; } /** * Set a line to split into several command line arguments. * * @param line line to split into several commandline arguments */ public void setLine(String line) { parts = Commandline.translateCommandline(line); } /** * Set a single command line argument and treat it like a path. The * correct path separator for the platform is used. * * @param path a single command line argument */ public void setPath(Path path) { this.parts = new String[]{ path.toString() }; } /** * Set the "unless" condition. Tasks that nest this class as an element * should evaluate this flag in their {@link org.apache.tools.ant.Task#execute()} method. If the * following conditions are true, the task should ignore this element: *
    *
      The flag is neither null nor a empty string *
        The property that the flag resolves to after macro substitution * is defined *
* * @param property a property name or macro */ public void setUnless(String property) { this.unlessCondition = property; } /** * Set a single command line argument. * * @param value a single command line argument */ public void setValue(String value) { this.parts = new String[]{ value }; } } libcommons-launcher-java-1.1/src/java/org/apache/commons/launcher/types/ConditionalArgumentSet.java0100644000175000017500000001017310020100364033153 0ustar arnaudarnaud/* * Copyright 1999-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.apache.commons.launcher.types; import java.util.ArrayList; import java.util.Stack; import org.apache.commons.launcher.Launcher; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.types.DataType; import org.apache.tools.ant.types.Reference; /** * A class that represents a set of nested elements of * {@link ConditionalArgument} objects. * * @author Patrick Luby */ public class ConditionalArgumentSet extends DataType { //------------------------------------------------------------------ Fields /** * Cached arguments and nested ConditionalArgumentSet objects */ private ArrayList list = new ArrayList(); //----------------------------------------------------------------- Methods /** * Add a {@link ConditionalArgument}. * * @param argument the {@link ConditionalArgument} to be * added */ protected void addConditionalargument(ConditionalArgument argument) { if (isReference()) throw noChildrenAllowed(); list.add(argument); } /** * Add a {@link ConditionalArgumentSet}. * * @param set the {@link ConditionalArgumentSet} to be added */ protected void addConditionalargumentset(ConditionalArgumentSet set) { if (isReference()) throw noChildrenAllowed(); list.add(set); } /** * Get {@link ConditionalArgument} instances. * * @return the {@link ConditionalArgument} instances */ public ArrayList getList() { // Make sure we don't have a circular reference to this instance if (!checked) { Stack stk = new Stack(); stk.push(this); dieOnCircularReference(stk, project); } // Recursively work through the tree of ConditionalArgumentSet objects // and accumulate the list of ConditionalArgument objects. ArrayList mergedList = new ArrayList(list.size()); for (int i = 0; i < list.size(); i++) { Object o = list.get(i); ConditionalArgumentSet nestedSet = null; if (o instanceof Reference) { o = ((Reference)o).getReferencedObject(project); // Only references to this class are allowed if (!o.getClass().isInstance(this)) throw new BuildException(Launcher.getLocalizedString("cannot.reference", this.getClass().getName())); nestedSet = (ConditionalArgumentSet)o; } else if (o.getClass().isInstance(this)) { nestedSet = (ConditionalArgumentSet)o; } else if (o instanceof ConditionalArgument) { mergedList.add(o); } else { throw new BuildException(Launcher.getLocalizedString("cannot.nest", this.getClass().getName())); } if (nestedSet != null) mergedList.addAll(nestedSet.getList()); } return mergedList; } /** * Makes this instance a reference to another instance. You must not * set another attribute or nest elements inside this element if you * make it a reference. * * @param r the reference to another {@link ConditionalArgumentSet} * instance */ public void setRefid(Reference r) throws BuildException { if (!list.isEmpty()) throw tooManyAttributes(); list.add(r); super.setRefid(r); } } libcommons-launcher-java-1.1/src/java/org/apache/commons/launcher/types/ConditionalVariable.java0100644000175000017500000001141210020106363032444 0ustar arnaudarnaud/* * Copyright 1999-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.apache.commons.launcher.types; import java.io.File; import org.apache.tools.ant.ProjectHelper; import org.apache.tools.ant.types.DataType; import org.apache.tools.ant.types.Path; /** * A class that represents nested or elements. This class * provides the same functionality as the class that represents these same * elements in a "java" task. In addition, this class supports conditional "if" * and "unless" attributes. * * @author Patrick Luby */ public class ConditionalVariable extends DataType { //------------------------------------------------------------------ Fields /** * Cached "if" condition flag. */ private String ifCondition = null; /** * Cached key. */ private String key = null; /** * Cached "unless" condition flag. */ private String unlessCondition = null; /** * Cached value. */ private String value = null; //----------------------------------------------------------------- Methods /** * Get the "if" condition flag. * * @return the "if" condition flag */ public String getIf() { return ProjectHelper.replaceProperties(project, ifCondition, project.getProperties()); } /** * Get the key. * * @return the key for this variable */ public String getKey() { return ProjectHelper.replaceProperties(project, key, project.getProperties()); } /** * Get the "unless" condition flag. * * @return the "unless" condition flag */ public String getUnless() { return ProjectHelper.replaceProperties(project, unlessCondition, project.getProperties()); } /** * Get the value. * * @return the value for this variable */ public String getValue() { return ProjectHelper.replaceProperties(project, value, project.getProperties()); } /** * Set the value to a {@link File}. * * @param value the {@link File} for this variable */ public void setFile(File file) { this.value = file.getAbsolutePath(); } /** * Set the value to a {@link Path}. * * @param value the {@link Path} for this variable */ public void setPath(Path path) { this.value = path.toString(); } /** * Set the "if" condition. Tasks that nest this class as an element * should evaluate this flag in their {@link org.apache.tools.ant.Task#execute()} method. If the * following conditions are true, the task should process this element: *
    *
      The flag is neither null nor a empty string *
        The property that the flag resolves to after macro substitution * is defined *
* * @param property a property name or macro */ public void setIf(String property) { this.ifCondition = property; } /** * Set the key. * * @param key the key for this variable */ public void setKey(String key) { this.key = key; } /** * Set the value to a {@link Path}. * * @param value the {@link Path} for this variable */ public void setFile(Path path) { this.value = path.toString(); } /** * Set the "unless" condition. Tasks that nest this class as an element * should evaluate this flag in their {@link org.apache.tools.ant.Task#execute()} method. If the * following conditions are true, the task should ignore this element: *
    *
      The flag is neither null nor a empty string *
        The property that the flag resolves to after macro substitution * is defined *
* * @param property a property name or macro */ public void setUnless(String property) { this.unlessCondition = property; } /** * Set the value. * * @param value the value for this variable */ public void setValue(String value) { this.value = value; } } libcommons-launcher-java-1.1/src/java/org/apache/commons/launcher/types/ConditionalVariableSet.java0100644000175000017500000001017310020100364033116 0ustar arnaudarnaud/* * Copyright 1999-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.apache.commons.launcher.types; import java.util.ArrayList; import java.util.Stack; import org.apache.commons.launcher.Launcher; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.types.DataType; import org.apache.tools.ant.types.Reference; /** * A class that represents a set of nested elements of * {@link ConditionalVariable} objects. * * @author Patrick Luby */ public class ConditionalVariableSet extends DataType { //------------------------------------------------------------------ Fields /** * Cached variables and nested ConditionalVariableSet objects */ private ArrayList list = new ArrayList(); //----------------------------------------------------------------- Methods /** * Add a {@link ConditionalVariable}. * * @param variable the {@link ConditionalVariable} to be * added */ protected void addConditionalvariable(ConditionalVariable variable) { if (isReference()) throw noChildrenAllowed(); list.add(variable); } /** * Add a {@link ConditionalVariableSet}. * * @param set the {@link ConditionalVariableSet} to be added */ protected void addConditionalvariableset(ConditionalVariableSet set) { if (isReference()) throw noChildrenAllowed(); list.add(set); } /** * Get {@link ConditionalVariable} instances. * * @return the {@link ConditionalVariable} instances */ public ArrayList getList() { // Make sure we don't have a circular reference to this instance if (!checked) { Stack stk = new Stack(); stk.push(this); dieOnCircularReference(stk, project); } // Recursively work through the tree of ConditionalVariableSet objects // and accumulate the list of ConditionalVariable objects. ArrayList mergedList = new ArrayList(list.size()); for (int i = 0; i < list.size(); i++) { Object o = list.get(i); ConditionalVariableSet nestedSet = null; if (o instanceof Reference) { o = ((Reference)o).getReferencedObject(project); // Only references to this class are allowed if (!o.getClass().isInstance(this)) throw new BuildException(Launcher.getLocalizedString("cannot.reference", this.getClass().getName())); nestedSet = (ConditionalVariableSet)o; } else if (o.getClass().isInstance(this)) { nestedSet = (ConditionalVariableSet)o; } else if (o instanceof ConditionalVariable) { mergedList.add(o); } else { throw new BuildException(Launcher.getLocalizedString("cannot.nest", this.getClass().getName())); } if (nestedSet != null) mergedList.addAll(nestedSet.getList()); } return mergedList; } /** * Makes this instance a reference to another instance. You must not * set another attribute or nest elements inside this element if you * make it a reference. * * @param r the reference to another {@link ConditionalVariableSet} * instance */ public void setRefid(Reference r) throws BuildException { if (!list.isEmpty()) throw tooManyAttributes(); list.add(r); super.setRefid(r); } } libcommons-launcher-java-1.1/src/java/org/apache/commons/launcher/types/JVMArgumentSet.java0100644000175000017500000000313210020100364031341 0ustar arnaudarnaud/* * Copyright 1999-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.apache.commons.launcher.types; /** * A class that represents a set of nested elements. * * @author Patrick Luby */ public class JVMArgumentSet extends ConditionalArgumentSet { //----------------------------------------------------------- Static Fields /** * The name of this data type. */ public final static String TYPE_NAME = "jvmargset"; //----------------------------------------------------------------- Methods /** * Add a {@link ConditionalArgument}. * * @param argument the {@link ConditionalArgument} to be * added */ public void addJvmarg(ConditionalArgument argument) { addConditionalargument(argument); } /** * Add a {@link JVMArgumentSet}. * * @param set the {@link JVMArgumentSet} to be added */ public void addJvmargset(JVMArgumentSet set) { addConditionalargumentset(set); } } ././@LongLink0000000000000000000000000000014500000000000011565 Lustar rootrootlibcommons-launcher-java-1.1/src/java/org/apache/commons/launcher/types/JVMArgumentSet_en.propertieslibcommons-launcher-java-1.1/src/java/org/apache/commons/launcher/types/JVMArgumentSet_en.propertie0100644000175000017500000000026407556213350033142 0ustar arnaudarnaud# # Localized strings for JVMArgumentSet class # cannot.nest=Only and elements can be nested cannot.reference=Only elements can be referenced libcommons-launcher-java-1.1/src/java/org/apache/commons/launcher/types/SysPropertySet.java0100644000175000017500000000315610020100364031533 0ustar arnaudarnaud/* * Copyright 1999-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.apache.commons.launcher.types; /** * A class that represents a set of nested elements. * * @author Patrick Luby */ public class SysPropertySet extends ConditionalVariableSet { //----------------------------------------------------------- Static Fields /** * The name of this data type. */ public final static String TYPE_NAME = "syspropertyset"; //----------------------------------------------------------------- Methods /** * Add a {@link ConditionalVariable}. * * @param variable the {@link ConditionalVariable} to be * added */ public void addSysproperty(ConditionalVariable variable) { addConditionalvariable(variable); } /** * Add a {@link SysPropertySet}. * * @param set the {@link SysPropertySet} to be added */ public void addSyspropertyset(SysPropertySet set) { addConditionalvariableset(set); } } ././@LongLink0000000000000000000000000000014500000000000011565 Lustar rootrootlibcommons-launcher-java-1.1/src/java/org/apache/commons/launcher/types/SysPropertySet_en.propertieslibcommons-launcher-java-1.1/src/java/org/apache/commons/launcher/types/SysPropertySet_en.propertie0100644000175000017500000000030307556213350033320 0ustar arnaudarnaud# # Localized strings for SysPropertySet class # cannot.nest=Only and elements can be nested cannot.reference=Only elements can be referenced libcommons-launcher-java-1.1/src/java/org/apache/commons/launcher/ChildMain.java0100644000175000017500000002313310027363665027243 0ustar arnaudarnaud/* * Copyright 1999-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.apache.commons.launcher; import java.awt.Frame; import java.awt.Image; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.FileOutputStream; import java.io.PrintStream; import java.lang.reflect.Method; /** * A wrapper class that invokes another class' * main(String[]). This particular class uses several system * properties to control features: *
    *
  • Redirecting System.out and System.err. *
  • Displaying a minimized window in the Windows taskbar. *
* This class is normally not invoked directly. Instead, it is invoked by the * {@link LaunchTask} class. * * @author Patrick Luby */ public class ChildMain extends Thread { //----------------------------------------------------------- Static Fields /** * The appendOutput system property name. */ public final static String APPEND_OUTPUT_PROP_NAME = "org.apache.commons.launcher.appendOutput"; /** * The displayMiminizedWindow system property name. */ public final static String DISPLAY_MINIMIZED_WINDOW_PROP_NAME = "org.apache.commons.launcher.displayMinimizedWindow"; /** * The disposeMiminizedWindow system property name. */ public final static String DISPOSE_MINIMIZED_WINDOW_PROP_NAME = "org.apache.commons.launcher.disposeMinimizedWindow"; /** * The executableName system property name. */ public final static String EXECUTABLE_PROP_NAME = "org.apache.commons.launcher.executableName"; /** * The heartbeatFile system property name. */ public final static String HEARTBEAT_FILE_PROP_NAME = "org.apache.commons.launcher.heartbeatFile"; /** * The miminizedWindowTitle system property name. */ public final static String MINIMIZED_WINDOW_TITLE_PROP_NAME = "org.apache.commons.launcher.minimizedWindowTitle"; /** * The miminizedWindowIcon system property name. */ public final static String MINIMIZED_WINDOW_ICON_PROP_NAME= "org.apache.commons.launcher.minimizedWindowIcon"; /** * The outputFile system property name. */ public final static String OUTPUT_FILE_PROP_NAME = "org.apache.commons.launcher.outputFile"; /** * The waitForChild system property name. */ public final static String WAIT_FOR_CHILD_PROP_NAME = "org.apache.commons.launcher.waitForChild"; //------------------------------------------------------------------ Fields /** * Cached command line arguments */ private String[] args = null; //------------------------------------------------------------ Constructors /** * Construct an instance of this {@link Thread} subclass and cache the * args parameter for use by the {@link #run()} method. * * @param group the ThreadGroup to use for this thread * @param args the command line arguments */ private ChildMain(ThreadGroup group, String[] args) { super(group, ChildMain.class.getName()); this.args = args; } //---------------------------------------------------------- Static Methods /** * Main entry point for the child process. This method should only be * invoked by the {@link LaunchTask} class. * * @param args command line arguments */ public static void main(String[] args) { // Invoke the target application in a separate thread so that we // caught any uncaught errors thrown by the target application Thread mainThread = new ChildMain(new ExitOnErrorThreadGroup(ChildMain.class.getName()), args); mainThread.start(); } //----------------------------------------------------------------- Methods /** * Invoke the target application. * * @param args command line arguments */ public void run() { // If there are no arguments, do nothing if (args == null || args.length == 0) return; // Invoke the target application try { // Start the thread to check if the parent JVM exits. boolean waitForChild = false; if (System.getProperty(ChildMain.WAIT_FOR_CHILD_PROP_NAME) != null) { waitForChild = true; String heartbeatFile = System.getProperty(ChildMain.HEARTBEAT_FILE_PROP_NAME); ParentListener heartbeat = new ParentListener(heartbeatFile); // Make the thread a daemon thread so that it does not // prevent this process from exiting when all of the // appliation's threads finish. heartbeat.setDaemon(true); heartbeat.start(); } // If applicable, redirect output and error streams String outputPath = System.getProperty(ChildMain.OUTPUT_FILE_PROP_NAME); if (outputPath != null) { boolean appendOutput = false; if (System.getProperty(ChildMain.APPEND_OUTPUT_PROP_NAME) != null) appendOutput = true; PrintStream ps = new PrintStream(new FileOutputStream(outputPath, appendOutput), true); System.setOut(ps); System.setErr(ps); } // The first argument should be the class that we really want to // invoke. Try to load the class and invoke its main(String[]) // method with the first argument shifted out. Class mainClass = Class.forName(args[0]); Class[] paramTypes = new Class[1]; Object[] paramValues = new Object[1]; String[] params = new String[args.length - 1]; // Shift args[0] out of the arguments for (int i = 0; i < params.length; i++) params[i] = args[i + 1]; paramTypes[0] = params.getClass(); paramValues[0] = params; // Create the icon window if this is a waitForChild task Frame frame = null; boolean displayMinimizedWindow = false; if (System.getProperty(ChildMain.DISPLAY_MINIMIZED_WINDOW_PROP_NAME) != null) displayMinimizedWindow = true; String osname = System.getProperty("os.name").toLowerCase(); if (displayMinimizedWindow && osname.indexOf("windows") >= 0) { try { frame = new Frame(); String title = System.getProperty(ChildMain.MINIMIZED_WINDOW_TITLE_PROP_NAME); if (title != null) frame.setTitle(title); frame.setState(Frame.ICONIFIED); String icon = System.getProperty(ChildMain.MINIMIZED_WINDOW_TITLE_PROP_NAME); if (icon != null) { Image iconImage = Toolkit.getDefaultToolkit().createImage(icon); if (iconImage != null) frame.setIconImage(iconImage); } // Ensure that window always remains minimized frame.addWindowListener(new ChildWindowAdapter()); Rectangle bounds = frame.getGraphicsConfiguration().getBounds(); int width = (int)frame.getBounds().getWidth(); int height = frame.getInsets().top + frame.getInsets().bottom; int x = (int)bounds.getWidth() - width; int y = (int)bounds.getHeight() - height; frame.setBounds(x, y, width, height); frame.setResizable(false); frame.setVisible(true); } catch(Exception fe) {} } // Invoke the main() method Method mainMethod = mainClass.getDeclaredMethod("main", paramTypes); mainMethod.invoke(null, paramValues); // Close the frame if it exists if (frame != null && System.getProperty(ChildMain.DISPOSE_MINIMIZED_WINDOW_PROP_NAME) != null) { // Exit this process. Closing or disposing of the window is not // enough to allow the process to exit. System.exit(0); } } catch (Throwable t) { String message = t.getMessage(); t.printStackTrace(); System.exit(1); } } /** * A WindowAdapter subclass that causes the application to exit when its * {@link #windowClosing(WindowEvent)} method is invoked. */ private static class ChildWindowAdapter extends WindowAdapter { /** * Invoked when a window is in the process of being closed. * * @param e the event */ public void windowClosing(WindowEvent e) { System.exit(0); } } } libcommons-launcher-java-1.1/src/java/org/apache/commons/launcher/ExitOnErrorThreadGroup.java0100644000175000017500000000466510020100364031763 0ustar arnaudarnaud/* * Copyright 1999-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.apache.commons.launcher; /** * A class that subclasses the {@link ThreadGroup} class. This class is used * by {@link ChildMain#main(String[])} to run the target application. By using * this class, any {@link Error} other than {@link ThreadDeath} thrown by * threads created by the target application will be caught the process * terminated. By default, the JVM will only print a stack trace of the * {@link Error} and destroy the thread. However, when an uncaught * {@link Error} occurs, it normally means that the JVM has encountered a * severe problem. Hence, an orderly shutdown is a reasonable approach. *

* Note: not all threads created by the target application are guaranteed to * use this class. Target application's may bypass this class by creating a * thread using the {@link Thread#Thread(ThreadGroup, String)} or other similar * constructors. * * @author Patrick Luby */ public class ExitOnErrorThreadGroup extends ThreadGroup { //------------------------------------------------------------ Constructors /** * Constructs a new thread group. The parent of this new group is the * thread group of the currently running thread. * * @param name the name of the new thread group */ public ExitOnErrorThreadGroup(String name) { super(name); } //----------------------------------------------------------------- Methods /** * Trap any uncaught {@link Error} other than {@link ThreadDeath} and exit. * * @param t the thread that is about to exit * @param e the uncaught exception */ public void uncaughtException(Thread t, Throwable e) { if (e instanceof ThreadDeath) return; Launcher.error(e); System.exit(1); } } libcommons-launcher-java-1.1/src/java/org/apache/commons/launcher/LaunchCommand.java0100644000175000017500000003323510020100364030102 0ustar arnaudarnaud/* * Copyright 1999-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.apache.commons.launcher; import java.io.File; import java.util.ArrayList; import java.util.HashMap; /** * A class that represents the holds the various argument types that are used * in a Java command. In addition, it holds many of the flags that are used * by the {@link LaunchTask} class when executing a JVM process. * * @author Patrick Luby */ public class LaunchCommand { //------------------------------------------------------------------ Fields /** * Cached appendOutput flag. */ private boolean appendOutput = false; /** * Cached classpath. */ private String classpath = null; /** * Cached debug flag. */ private boolean debug = false; /** * Cached displayMinimizedWindow flag. */ private boolean displayMinimizedWindow = false; /** * Cached disposeMinimizedWindow flag. */ private boolean disposeMinimizedWindow = true; /** * Cached failOnError flag. */ private boolean failOnError = true; /** * Cached main class name. */ private String mainClassName = null; /** * Cached minimizedWindowIcon. */ private File minimizedWindowIcon = null; /** * Cached minimizedWindowTitle. */ private String minimizedWindowTitle = null; /** * Cached output file. */ private File outputFile = null; /** * Cached print flag. */ private boolean print = false; /** * Cached requireTools flag. */ private boolean requireTools = false; /** * Cached redirect flag. */ private boolean redirect = false; /** * Cached arg elements */ private ArrayList args = null; /** * Cached jvmarg elements */ private ArrayList jvmArgs = null; /** * Cached sysproperty elements */ private HashMap sysProperties = null; /** * Cached useSystemIn flag. */ private boolean useSystemIn = true; /** * Cached waitForChild flag. */ private boolean waitForChild = true; //----------------------------------------------------------------- Methods /** * Get the class name. * * @return the class to execute main(String[]) */ public String getClassname() { return mainClassName; } /** * Get the classpath. * * @return the classpath */ public String getClasspath() { return classpath; } /** * Get the debug flag. * * @return the debug flag */ public boolean getDebug() { return debug; } /** * Get the displayMinimizedWindow flag. * * @return the displayMinimizedWindow flag */ public boolean getDisplayminimizedwindow() { return displayMinimizedWindow; } /** * Get the disposeMinimizedWindow flag. * * @return the disposeMinimizedWindow flag */ public boolean getDisposeminimizedwindow() { return disposeMinimizedWindow; } /** * Get the failOnError flag. * * @return the failOnError flag */ public boolean getFailonerror() { return failOnError; } /** * Get the title for the minimized window that will be displayed in the * Windows taskbar. * * @return the title to set for any minimized window that is displayed * in the Windows taskbar */ public String getMinimizedwindowtitle() { return minimizedWindowTitle; } /** * Get the icon file for the minimized window that will be displayed in the * Windows taskbar. * * @return the icon file to use for any minimized window that is displayed * in the Windows taskbar */ public File getMinimizedwindowicon() { return minimizedWindowIcon; } /** * Get the file that the child JVM's System.out and System.err will be * redirected to. * * @return the File to redirect System.out and System.err to */ public File getOutput() { return outputFile; } /** * Get the appendOutput flag. * * @return the appendOutput flag */ public boolean getAppendoutput() { return appendOutput; } /** * Get the redirect flag. * * @return the redirect flag */ public boolean getRedirectoutput() { return redirect; } /** * Get the list of nested arg elements. * * @return the list of {@link String} objects */ public ArrayList getArgs() { return args; } /** * Get the list of nested jvmarg elements. * * @return the list of {@link String} objects */ public ArrayList getJvmargs() { return jvmArgs; } /** * Get the print flag. * * @return the print flag */ public boolean getPrint() { return print; } /** * Get the requireTools flag. * * @return the requireTools flag */ public boolean getRequiretools() { return requireTools; } /** * Get the list of nested sysproperty elements. * * @return the {@link String} objects */ public HashMap getSysproperties() { return sysProperties; } /** * Get the useSystemIn flag. * * @return the useSystemIn flag */ public boolean getUsesystemin() { return useSystemIn; } /** * Get the waitForChild flag. * * @return the waitForChild flag */ public boolean getWaitforchild() { return waitForChild; } /** * Set the print flag. * * @param print the print flag */ public void setPrint(boolean print) { this.print = print; } /** * Set the requireTools flag. * * @param requireTools the requireTools flag */ public void setRequiretools(boolean requireTools) { this.requireTools = requireTools; } /** * Set the useSystemIn flag. Setting this flag to false will cause this * task to not read System.in. This will cause the child JVM to never * receive any bytes when it reads System.in. Setting this flag to false * is useful in some Unix environments where processes cannot be put in * the background when they read System.in. * * @param useSystemIn the useSystemIn flag */ public void setUsesystemin(boolean useSystemIn) { this.useSystemIn = useSystemIn; } /** * Set the waitForChild flag. Setting this flag to true will cause this * task to wait for the child JVM to finish executing before the task * completes. Setting this flag to false will cause this task to complete * immediately after it starts the execution of the child JVM. Setting it * false emulates the "&" background operator in most Unix shells and is * most of set to false when launching server or GUI applications. * * @param waitForChild the waitForChild flag */ public void setWaitforchild(boolean waitForChild) { this.waitForChild = waitForChild; } /** * Set the class name. * * @param mainClassName the class to execute main(String[]) */ public void setClassname(String mainClassName) { this.mainClassName = mainClassName; } /** * Set the classpath. * * @param classpath the classpath */ public void setClasspath(String classpath) { this.classpath = classpath; } /** * Set the debug flag. * * @param debug the debug flag */ public void setDebug(boolean debug) { this.debug = debug; } /** * Set the displayMinimizedWindow flag. Note that this flag has no effect * on non-Windows platforms. On Windows platform, setting this flag to true * will cause a minimized window to be displayed in the Windows task bar * while the child process is executing. This flag is usually set to true * for server applications that also have their "waitForChild" attribute * set to false via the {@link #setWaitforchild(boolean)} method. * * @param displayMinimizedWindow true if a minimized window should be * displayed in the Windows task bar while the child process is executing */ public void setDisplayminimizedwindow(boolean displayMinimizedWindow) { this.displayMinimizedWindow = displayMinimizedWindow; } /** * Set the disposeMinimizedWindow flag. Note that this flag has no effect * on non-Windows platforms. On Windows platform, setting this flag to true * will cause any minimized window that is display by setting the * "displayMinimizedWindow" attribute to true via the * {@link #setDisplayminimizedwindow(boolean)} to be automatically * disposed of when the child JVM's main(String[]) returns. * This flag is normally used for applications that don't explicitly call * {@link System#exit(int)}. If an application does not explicitly call * {@link System#exit(int)}, an minimized windows need to be disposed of * for the child JVM to exit. * * @param disposeMinimizedWindow true if a minimized window in the Windows * taskbar should be automatically disposed of after the child JVM's * main(String[]) returns */ public void setDisposeminimizedwindow(boolean disposeMinimizedWindow) { this.disposeMinimizedWindow = disposeMinimizedWindow; } /** * Set the failOnError flag. * * @param failOnError the failOnError flag */ public void setFailonerror(boolean failOnError) { this.failOnError = failOnError; } /** * Set the title for the minimized window that will be displayed in the * Windows taskbar. Note that this property has no effect on non-Windows * platforms. * * @param minimizedWindowTitle the title to set for any minimized window * that is displayed in the Windows taskbar */ public void setMinimizedwindowtitle(String minimizedWindowTitle) { this.minimizedWindowTitle = minimizedWindowTitle; } /** * Set the icon file for the minimized window that will be displayed in the * Windows taskbar. Note that this property has no effect on non-Windows * platforms. * * @param minimizedWindowIcon the icon file to use for any minimized window * that is displayed in the Windows taskbar */ public void setMinimizedwindowicon(File minimizedWindowIcon) { this.minimizedWindowIcon = minimizedWindowIcon; } /** * Set the file that the child JVM's System.out and System.err will be * redirected to. Output will only be redirected if the redirect flag * is set to true via the {@link #setRedirectoutput(boolean)} method. * * @param outputFile a File to redirect System.out and System.err to */ public void setOutput(File outputFile) { this.outputFile = outputFile; } /** * Set the appendOutput flag. Setting this flag to true will cause the child * JVM to append System.out and System.err to the file specified by the * {@link #setOutput(File)} method. Setting this flag to false will cause * the child to overwrite the file. * * @param appendOutput true if output should be appended to the output file */ public void setAppendoutput(boolean appendOutput) { this.appendOutput = appendOutput; } /** * Set the list of nested arg elements. * * @param args a list of {@link String} objects */ public void setArgs(ArrayList args) { this.args = args; } /** * Set the list of nested jvmarg elements. * * @param jvmArgs a list of {@link String} objects */ public void setJvmargs(ArrayList jvmArgs) { this.jvmArgs = jvmArgs; } /** * Set the list of nested sysproperty elements. * * @param sysProperties a map of {@link String} objects */ public void setSysproperties(HashMap sysProperties) { this.sysProperties = sysProperties; } /** * Set the redirect flag. Setting this flag to true will cause the child * JVM's System.out and System.err to be redirected to file set using the * {@link #setOutput(File)} method. Setting this flag to false will * cause no redirection. * * @param redirect true if System.out and System.err should be redirected */ public void setRedirectoutput(boolean redirect) { this.redirect = redirect; } } libcommons-launcher-java-1.1/src/java/org/apache/commons/launcher/LaunchFilter.java0100644000175000017500000000426010020100364027745 0ustar arnaudarnaud/* * Copyright 1999-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.apache.commons.launcher; import org.apache.tools.ant.BuildException; /** * An interface that provides a means for application developers to perform * dynamic configuration and error checking of the attributes and nested * elements associated with a "launch" task that connot be easily done within * the constraints of Ant. *

* An implementor of this interface can be attached to a "launch" task by * setting the following "launch" task attributes in the Launcher's XML * file: *

    *
  • filterclassname - The name of the class that implements * this interface *
  • filterclasspath - (Optional) The classpath for the class * that implements *
* * @author Patrick Luby */ public interface LaunchFilter { //----------------------------------------------------------------- Methods /** * Perform error checking and editing of the JVM command line arguments * that an instance of the {@link LaunchTask} class has constructed. * Implementors will receive an instance of the {@link LaunchCommand} from * the {@link LaunchTask} instance that invokes this method. The * implementor of this method can then retrieve and edit any of the * JVM command line arguments via the {@link LaunchCommand} class' public * methods. * * @param launchCommand a configured {@link LaunchCommand} instance * @throws BuildException if any errors occur */ public void filter(LaunchCommand launchCommand) throws BuildException; } libcommons-launcher-java-1.1/src/java/org/apache/commons/launcher/LaunchTask.java0100644000175000017500000011315210020100364027423 0ustar arnaudarnaud/* * Copyright 1999-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.apache.commons.launcher; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.StringTokenizer; import org.apache.commons.launcher.types.ArgumentSet; import org.apache.commons.launcher.types.ConditionalArgument; import org.apache.commons.launcher.types.ConditionalVariable; import org.apache.commons.launcher.types.JVMArgumentSet; import org.apache.commons.launcher.types.SysPropertySet; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; import org.apache.tools.ant.types.Path; import org.apache.tools.ant.types.Reference; /** * A class that eliminates the need for a batch or shell script to launch a Java * class. Some situations where elimination of a batch or shell script may be * desirable are: *
    *
  • You want to avoid having to determining where certain application paths * are e.g. your application's home directory, etc. Determining this * dynamically in a Windows batch scripts is very tricky on some versions of * Windows or when softlinks are used on Unix platforms. *
  • You want to avoid having to handle native file and path separators or * native path quoting issues. *
  • You need to enforce certain system properties e.g. * java.endorsed.dirs when running with JDK 1.4. *
  • You want to allow users to pass in custom JVM arguments or system * properties without having to parse and reorder arguments in your script. * This can be tricky and/or messy in batch and shell scripts. *
  • You want to bootstrap system properties from a configuration file instead * hard-coding them in your batch and shell scripts. *
  • You want to provide localized error messages which is very tricky to do * in batch and shell scripts. *
* * @author Patrick Luby */ public class LaunchTask extends Task { //----------------------------------------------------------- Static Fields /** * The argument property name. */ public final static String ARG_PROP_NAME = "launch.arg."; /** * The name of this task. */ public final static String TASK_NAME = "launch"; /** * Cached synchronous child processes for all instances of this class. */ private static ArrayList childProcesses = new ArrayList(); //------------------------------------------------------------------ Fields /** * Cached appendOutput flag. */ private boolean appendOutput = false; /** * Cached synchronously executing child process. */ private Process childProc = null; /** * Cached classpath. */ private Path classpath = null; /** * Cached debug flag. */ private boolean debug = false; /** * Cached displayMinimizedWindow flag. */ private boolean displayMinimizedWindow = false; /** * Cached disposeMinimizedWindow flag. */ private boolean disposeMinimizedWindow = true; /** * Cached failOnError flag. */ private boolean failOnError = false; /** * Cached filter instance. */ private LaunchFilter filter = null; /** * Cached filterClassName. */ private String filterClassName = null; /** * Cached filterClasspath. */ private Path filterClasspath = null; /** * Cached main class name. */ private String mainClassName = null; /** * Cached minimizedWindowIcon. */ private File minimizedWindowIcon = null; /** * Cached minimizedWindowTitle. */ private String minimizedWindowTitle = null; /** * Cached output file. */ private File outputFile = null; /** * Cached print flag. */ private boolean print = false; /** * Cached redirect flag. */ private boolean redirect = false; /** * Cached requireTools flag. */ private boolean requireTools = false; /** * Cached arg elements */ private ArgumentSet taskArgumentSet = new ArgumentSet(); /** * Cached jvmarg elements */ private JVMArgumentSet taskJVMArgumentSet = new JVMArgumentSet(); /** * Cached sysproperty elements */ private SysPropertySet taskSysPropertySet = new SysPropertySet(); /** * Cached useArgs flag. */ private boolean useArgs = true; /** * Cached useSystemIn flag. */ private boolean useSystemIn = true; /** * Cached waitForChild flag. */ private boolean waitForChild = true; //---------------------------------------------------------- Static Methods /** * Get the synchronous child processes for all instances of this class. * * @return the instances of this class. */ public static Process[] getChildProcesses() { return (Process[])childProcesses.toArray(new Process[childProcesses.size()]); } //----------------------------------------------------------------- Methods /** * Add a nested arg element. Note that Ant will not invoke the specified * arg object's setter methods until after Ant invokes this method so * processing of the specified arg object is handled in the * {@link #execute()} method. * * @param arg the arg element */ public void addArg(ConditionalArgument arg) { taskArgumentSet.addArg(arg); } /** * Add a nested argset element. * * @param set the argset element */ public void addArgset(ArgumentSet set) { taskArgumentSet.addArgset(set); } /** * Add a nested jvmarg element. Note that Ant will not invoke the specified * jvmarg object's setter methods until after Ant invokes this method so * processing of the specified jvmarg object is handled in the * {@link #execute()} method. * * @param jvmArg the jvmarg element */ public void addJvmarg(ConditionalArgument jvmArg) { taskJVMArgumentSet.addJvmarg(jvmArg); } /** * Add a nested jvmargset element. * * @param set the jvmargset element */ public void addJvmargset(JVMArgumentSet set) { taskJVMArgumentSet.addJvmargset(set); } /** * Add a nested sysproperty element. Note that Ant will not invoke the * specified sysproperty object's setter methods until after Ant invokes * this method so processing of the specified sysproperty object is handled * in the {@link #execute()} method. * * @param var the sysproperty element */ public void addSysproperty(ConditionalVariable var) { taskSysPropertySet.addSysproperty(var); } /** * Add a nested syspropertyset element. * * @param set the syspropertyset element */ public void addSyspropertyset(SysPropertySet set) { taskSysPropertySet.addSyspropertyset(set); } /** * Create a nested classpath element. * * @return the Path object that contains all nested classpath elements */ public Path createClasspath() { if (classpath == null) classpath = new Path(project); return classpath; } /** * Create a nested filter classpath element. * * @return the Path object that contains all nested filter classpath * elements */ public Path createFilterclasspath() { if (filterClasspath == null) filterClasspath = new Path(project); return filterClasspath; } /** * Construct a Java command and execute it using the settings that Ant * parsed from the Launcher's XML file. This method is called by the Ant * classes. * * @throws BuildException if there is a configuration or other error */ public void execute() throws BuildException { try { // Check that the Launcher class was used to start Ant as this // task is not designed to use in a standalone Ant installation if (!Launcher.isStarted()) throw new BuildException(Launcher.getLocalizedString("no.run.standalone", this.getClass().getName())); // Don't do anything if the launching process has been stopped if (Launcher.isStopped()) throw new BuildException(); if (mainClassName == null) throw new BuildException(Launcher.getLocalizedString("classname.null", this.getClass().getName())); // Copy all of the nested jvmarg elements into the jvmArgs object ArrayList taskJVMArgs = taskJVMArgumentSet.getList(); ArrayList jvmArgs = new ArrayList(taskJVMArgs.size()); for (int i = 0; i < taskJVMArgs.size(); i++) { ConditionalArgument value = (ConditionalArgument)taskJVMArgs.get(i); // Test "if" and "unless" conditions if (testIfCondition(value.getIf()) && testUnlessCondition(value.getUnless())) { String[] list = value.getParts(); for (int j = 0; j < list.length; j++) jvmArgs.add(list[j]); } } // Copy all of the nested sysproperty elements into the sysProps // object ArrayList taskSysProps = taskSysPropertySet.getList(); HashMap sysProps = new HashMap(taskSysProps.size()); for (int i = 0; i < taskSysProps.size(); i++) { ConditionalVariable variable = (ConditionalVariable)taskSysProps.get(i); // Test "if" and "unless" conditions if (testIfCondition(variable.getIf()) && testUnlessCondition(variable.getUnless())) sysProps.put(variable.getKey(), variable.getValue()); } // Copy all of the nested arg elements into the appArgs object ArrayList taskArgs = taskArgumentSet.getList(); ArrayList appArgs = new ArrayList(taskArgs.size()); for (int i = 0; i < taskArgs.size(); i++) { ConditionalArgument value = (ConditionalArgument)taskArgs.get(i); // Test "if" and "unless" conditions if (testIfCondition(value.getIf()) && testUnlessCondition(value.getUnless())) { String[] list = value.getParts(); for (int j = 0; j < list.length; j++) appArgs.add(list[j]); } } // Add the Launcher's command line arguments to the appArgs object if (useArgs) { int currentArg = 0; String arg = null; while ((arg = project.getUserProperty(LaunchTask.ARG_PROP_NAME + Integer.toString(currentArg++))) != null) appArgs.add(arg); } // Make working copies of some of the flags since they may get // changed by a filter class String filteredClasspath = null; if (classpath != null) filteredClasspath = classpath.toString(); String filteredMainClassName = mainClassName; boolean filteredRedirect = redirect; File filteredOutputFile = outputFile; boolean filteredAppendOutput = appendOutput; boolean filteredDebug = debug; boolean filteredDisplayMinimizedWindow = displayMinimizedWindow; boolean filteredDisposeMinimizedWindow = disposeMinimizedWindow; boolean filteredFailOnError = failOnError; String filteredMinimizedWindowTitle = minimizedWindowTitle; File filteredMinimizedWindowIcon = minimizedWindowIcon; boolean filteredPrint = print; boolean filteredRequireTools = requireTools; boolean filteredUseSystemIn = useSystemIn; boolean filteredWaitForChild = waitForChild; // If there is a filter in the filterclassname attribute, let it // evaluate and edit the attributes and nested elements before we // start evaluating them if (filterClassName != null) { if (filter == null) { try { ClassLoader loader = this.getClass().getClassLoader(); if (filterClasspath != null) { // Construct a class loader to load the class String[] fileList = filterClasspath.list(); URL[] urls = new URL[fileList.length]; for (int i = 0; i < fileList.length; i++) urls[i] = new File(fileList[i]).toURL(); loader = new URLClassLoader(urls, loader); } Class filterClass = loader.loadClass(filterClassName); filter = (LaunchFilter)filterClass.newInstance(); // Execute filter and save any changes LaunchCommand command = new LaunchCommand(); command.setJvmargs(jvmArgs); command.setSysproperties(sysProps); command.setArgs(appArgs); command.setClasspath(filteredClasspath); command.setClassname(filteredMainClassName); command.setRedirectoutput(filteredRedirect); command.setOutput(filteredOutputFile); command.setAppendoutput(filteredAppendOutput); command.setDebug(filteredDebug); command.setDisplayminimizedwindow(filteredDisplayMinimizedWindow); command.setDisposeminimizedwindow(filteredDisposeMinimizedWindow); command.setFailonerror(filteredFailOnError); command.setMinimizedwindowtitle(filteredMinimizedWindowTitle); command.setMinimizedwindowicon(filteredMinimizedWindowIcon); command.setPrint(filteredPrint); command.setRequiretools(filteredRequireTools); command.setUsesystemin(filteredUseSystemIn); command.setWaitforchild(filteredWaitForChild); filter.filter(command); jvmArgs = command.getJvmargs(); sysProps = command.getSysproperties(); appArgs = command.getArgs(); filteredClasspath = command.getClasspath(); filteredMainClassName = command.getClassname(); filteredRedirect = command.getRedirectoutput(); filteredOutputFile = command.getOutput(); filteredAppendOutput = command.getAppendoutput(); filteredDebug = command.getDebug(); filteredDisplayMinimizedWindow = command.getDisplayminimizedwindow(); filteredDisposeMinimizedWindow = command.getDisposeminimizedwindow(); filteredFailOnError = command.getFailonerror(); filteredMinimizedWindowTitle = command.getMinimizedwindowtitle(); filteredMinimizedWindowIcon = command.getMinimizedwindowicon(); filteredPrint = command.getPrint(); filteredRequireTools = command.getRequiretools(); filteredUseSystemIn = command.getUsesystemin(); filteredWaitForChild = command.getWaitforchild(); // Check changes if (filteredMainClassName == null) throw new BuildException(Launcher.getLocalizedString("classname.null", this.getClass().getName())); if (jvmArgs == null) jvmArgs = new ArrayList(); if (sysProps == null) sysProps = new HashMap(); if (appArgs == null) appArgs = new ArrayList(); } catch (BuildException be) { throw new BuildException(filterClassName + " " + Launcher.getLocalizedString("filter.exception", this.getClass().getName()), be); } catch (ClassCastException cce) { throw new BuildException(filterClassName + " " + Launcher.getLocalizedString("filter.not.filter", this.getClass().getName())); } catch (Exception e) { throw new BuildException(e); } } } // Force child JVM into foreground if running using JDB if (filteredDebug) { filteredWaitForChild = true; filteredUseSystemIn = true; } // Prepend standard paths to classpath StringBuffer fullClasspath = new StringBuffer(Launcher.getBootstrapFile().getPath()); if (filteredRequireTools) { fullClasspath.append(File.pathSeparator); fullClasspath.append(Launcher.getToolsClasspath()); } if (filteredClasspath != null) { fullClasspath.append(File.pathSeparator); fullClasspath.append(filteredClasspath); } // Set ChildMain.WAIT_FOR_CHILD_PROP_NAME property for child JVM sysProps.remove(ChildMain.WAIT_FOR_CHILD_PROP_NAME); if (filteredWaitForChild) sysProps.put(ChildMain.WAIT_FOR_CHILD_PROP_NAME, ""); // Set minimized window properties for child JVM sysProps.remove(ChildMain.DISPLAY_MINIMIZED_WINDOW_PROP_NAME); sysProps.remove(ChildMain.MINIMIZED_WINDOW_TITLE_PROP_NAME); sysProps.remove(ChildMain.MINIMIZED_WINDOW_ICON_PROP_NAME); sysProps.remove(ChildMain.DISPOSE_MINIMIZED_WINDOW_PROP_NAME); if (!filteredWaitForChild && filteredDisplayMinimizedWindow) { sysProps.put(ChildMain.DISPLAY_MINIMIZED_WINDOW_PROP_NAME, ""); if (filteredMinimizedWindowTitle != null) sysProps.put(ChildMain.MINIMIZED_WINDOW_TITLE_PROP_NAME, filteredMinimizedWindowTitle); else sysProps.put(ChildMain.MINIMIZED_WINDOW_TITLE_PROP_NAME, getOwningTarget().getName()); if (filteredMinimizedWindowIcon != null) sysProps.put(ChildMain.MINIMIZED_WINDOW_ICON_PROP_NAME, filteredMinimizedWindowIcon.getCanonicalPath()); // Set ChildMain.DISPOSE_MINIMIZED_WINDOW_PROP_NAME property if (filteredDisposeMinimizedWindow) sysProps.put(ChildMain.DISPOSE_MINIMIZED_WINDOW_PROP_NAME, ""); } // Set ChildMain.OUTPUT_FILE_PROP_NAME property for child JVM sysProps.remove(ChildMain.OUTPUT_FILE_PROP_NAME); if (!filteredWaitForChild && filteredRedirect) { if (filteredOutputFile != null) { String outputFilePath = filteredOutputFile.getCanonicalPath(); // Verify that we can write to the output file try { File parentFile = new File(filteredOutputFile.getParent()); // To take care of non-existent log directories if ( !parentFile.exists() ) { //Trying to create non-existent parent directories parentFile.mkdirs(); //If this fails createNewFile also fails //We can give more exact error message, if we choose } filteredOutputFile.createNewFile(); } catch (IOException ioe) { throw new BuildException(outputFilePath + " " + Launcher.getLocalizedString("output.file.not.creatable", this.getClass().getName())); } if (!filteredOutputFile.canWrite()) throw new BuildException(outputFilePath + " " + Launcher.getLocalizedString("output.file.not.writable", this.getClass().getName())); sysProps.put(ChildMain.OUTPUT_FILE_PROP_NAME, outputFilePath); if (filteredAppendOutput) sysProps.put(ChildMain.APPEND_OUTPUT_PROP_NAME, ""); Launcher.getLog().println(Launcher.getLocalizedString("redirect.notice", this.getClass().getName()) + " " + outputFilePath); } else { throw new BuildException(Launcher.getLocalizedString("output.file.null", this.getClass().getName())); } } // Create the heartbeatFile. This file is needed by the // ParentListener class on Windows since the entire child JVM // process will block on Windows machines using some versions of // Unix shells such as MKS, etc. File heartbeatFile = null; FileOutputStream heartbeatOutputStream = null; if (filteredWaitForChild) { File tmpDir = null; String tmpDirName = (String)sysProps.get("java.io.tmpdir"); if (tmpDirName != null) tmpDir = new File(tmpDirName); heartbeatFile = File.createTempFile(ChildMain.HEARTBEAT_FILE_PROP_NAME + ".", "", tmpDir); // Open the heartbeat file for writing so that it the child JVM // will not be able to delete it while this process is running heartbeatOutputStream = new FileOutputStream(heartbeatFile); sysProps.put(ChildMain.HEARTBEAT_FILE_PROP_NAME, heartbeatFile.getCanonicalPath()); } // Assemble child command String[] cmd = new String[5 + jvmArgs.size() + sysProps.size() + appArgs.size()]; int nextCmdArg = 0; if (filteredDebug) cmd[nextCmdArg++] = Launcher.getJDBCommand(); else cmd[nextCmdArg++] = Launcher.getJavaCommand(); // Add jvmArgs to command for (int i = 0; i < jvmArgs.size(); i++) cmd[nextCmdArg++] = (String)jvmArgs.get(i); // Add properties to command Iterator sysPropsKeys = sysProps.keySet().iterator(); while (sysPropsKeys.hasNext()) { String key = (String)sysPropsKeys.next(); if (key == null) continue; String value = (String)sysProps.get(key); if (value == null) value = ""; cmd[nextCmdArg++] = "-D" + key + "=" + value; } // Add classpath to command. Note that it is after the jvmArgs // and system properties to prevent the user from sneaking in an // alterate classpath through the jvmArgs. cmd[nextCmdArg++] = "-classpath"; cmd[nextCmdArg++] = fullClasspath.toString(); // Add main class to command int mainClassArg = nextCmdArg; cmd[nextCmdArg++] = ChildMain.class.getName(); cmd[nextCmdArg++] = filteredMainClassName; // Add args to command for (int i = 0; i < appArgs.size(); i++) { cmd[nextCmdArg++] = (String)appArgs.get(i); } // Print command if (filteredPrint) { // Quote the command arguments String osname = System.getProperty("os.name").toLowerCase(); StringBuffer buf = new StringBuffer(cmd.length * 100); String quote = null; String replaceQuote = null; if (osname.indexOf("windows") >= 0) { // Use double-quotes to quote on Windows quote = "\""; replaceQuote = quote + quote + quote; } else { // Use single-quotes to quote on Unix quote = "'"; replaceQuote = quote + "\\" + quote + quote; } for (int i = 0; i < cmd.length; i++) { // Pull ChildMain out of command as we want to print the // real JVM command that can be executed by the user if (i == mainClassArg) continue; if (i > 0) buf.append(" "); buf.append(quote); StringTokenizer tokenizer = new StringTokenizer(cmd[i], quote, true); while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken(); if (quote.equals(token)) buf.append(replaceQuote); else buf.append(token); } buf.append(quote); } // Print the quoted command System.err.println(Launcher.getLocalizedString("executing.child.command", this.getClass().getName()) + ":"); System.err.println(buf.toString()); } // Create a child JVM if (Launcher.isStopped()) throw new BuildException(); Process proc = null; synchronized (LaunchTask.childProcesses) { proc = Runtime.getRuntime().exec(cmd); // Add the synchronous child process if (filteredWaitForChild) { childProc = proc; LaunchTask.childProcesses.add(proc); } } if (filteredWaitForChild) { StreamConnector stdout = new StreamConnector(proc.getInputStream(), System.out); StreamConnector stderr = new StreamConnector(proc.getErrorStream(), System.err); stdout.start(); stderr.start(); if (filteredUseSystemIn) { StreamConnector stdin = new StreamConnector(System.in, proc.getOutputStream()); stdin.start(); } proc.waitFor(); // Let threads flush any unflushed output stdout.join(); stderr.join(); if (heartbeatOutputStream != null) heartbeatOutputStream.close(); if (heartbeatFile != null) heartbeatFile.delete(); int exitValue = proc.exitValue(); if (filteredFailOnError && exitValue != 0) throw new BuildException(Launcher.getLocalizedString("child.failed", this.getClass().getName()) + " " + exitValue); } // Need to check if the launching process has stopped because // processes don't throw exceptions when they are terminated if (Launcher.isStopped()) throw new BuildException(); } catch (BuildException be) { throw be; } catch (Exception e) { if (Launcher.isStopped()) throw new BuildException(Launcher.getLocalizedString("launch.task.stopped", this.getClass().getName())); else throw new BuildException(e); } } /** * Set the useArgs flag. Setting this flag to true will cause this * task to append all of the command line arguments used to start the * {@link Launcher#start(String[])} method to the arguments * passed to the child JVM. * * @param useArgs the useArgs flag */ public void setUseargs(boolean useArgs) { this.useArgs = useArgs; } /** * Set the useSystemIn flag. Setting this flag to false will cause this * task to not read System.in. This will cause the child JVM to never * receive any bytes when it reads System.in. Setting this flag to false * is useful in some Unix environments where processes cannot be put in * the background when they read System.in. * * @param useSystemIn the useSystemIn flag */ public void setUsesystemin(boolean useSystemIn) { this.useSystemIn = useSystemIn; } /** * Set the waitForChild flag. Setting this flag to true will cause this * task to wait for the child JVM to finish executing before the task * completes. Setting this flag to false will cause this task to complete * immediately after it starts the execution of the child JVM. Setting it * false emulates the "&" background operator in most Unix shells and is * most of set to false when launching server or GUI applications. * * @param waitForChild the waitForChild flag */ public void setWaitforchild(boolean waitForChild) { this.waitForChild = waitForChild; } /** * Set the class name. * * @param mainClassName the class to execute main(String[]) */ public void setClassname(String mainClassName) { this.mainClassName = mainClassName; } /** * Set the classpath. * * @param classpath the classpath */ public void setClasspath(Path classpath) { createClasspath().append(classpath); } /** * Adds a reference to a classpath defined elsewhere. * * @param ref reference to the classpath */ public void setClasspathref(Reference ref) { createClasspath().setRefid(ref); } /** * Set the debug flag. Setting this flag to true will cause this * task to run the child JVM using the JDB debugger. * * @param debug the debug flag */ public void setDebug(boolean debug) { this.debug = debug; } /** * Set the displayMinimizedWindow flag. Note that this flag has no effect * on non-Windows platforms. On Windows platform, setting this flag to true * will cause a minimized window to be displayed in the Windows task bar * while the child process is executing. This flag is usually set to true * for server applications that also have their "waitForChild" attribute * set to false via the {@link #setWaitforchild(boolean)} method. * * @param displayMinimizedWindow true if a minimized window should be * displayed in the Windows task bar while the child process is executing */ public void setDisplayminimizedwindow(boolean displayMinimizedWindow) { this.displayMinimizedWindow = displayMinimizedWindow; } /** * Set the disposeMinimizedWindow flag. Note that this flag has no effect * on non-Windows platforms. On Windows platform, setting this flag to true * will cause any minimized window that is display by setting the * "displayMinimizedWindow" attribute to true via the * {@link #setDisplayminimizedwindow(boolean)} to be automatically * disposed of when the child JVM's main(String[]) returns. * This flag is normally used for applications that don't explicitly call * {@link System#exit(int)}. If an application does not explicitly call * {@link System#exit(int)}, an minimized windows need to be disposed of * for the child JVM to exit. * * @param disposeMinimizedWindow true if a minimized window in the Windows * taskbar should be automatically disposed of after the child JVM's * main(String[]) returns */ public void setDisposeminimizedwindow(boolean disposeMinimizedWindow) { this.disposeMinimizedWindow = disposeMinimizedWindow; } /** * Set the failOnError flag. * * @param failOnError true if the launch process should stop if the child * JVM returns an exit value other than 0 */ public void setFailonerror(boolean failOnError) { this.failOnError = failOnError; } /** * Set the filter class name. * * @param filterClassName the class that implements the * {@link LaunchFilter} interface */ public void setFilterclassname(String filterClassName) { this.filterClassName = filterClassName; } /** * Set the filter class' classpath. * * @param classpath the classpath for the filter class */ public void setFilterclasspath(Path filterClasspath) { createFilterclasspath().append(filterClasspath); } /** * Set the title for the minimized window that will be displayed in the * Windows taskbar. Note that this property has no effect on non-Windows * platforms. * * @param minimizedWindowTitle the title to set for any minimized window * that is displayed in the Windows taskbar */ public void setMinimizedwindowtitle(String minimizedWindowTitle) { this.minimizedWindowTitle = minimizedWindowTitle; } /** * Set the icon file for the minimized window that will be displayed in the * Windows taskbar. Note that this property has no effect on non-Windows * platforms. * * @param minimizedWindowIcon the icon file to use for any minimized window * that is displayed in the Windows taskbar */ public void setMinimizedwindowicon(File minimizedWindowIcon) { this.minimizedWindowIcon = minimizedWindowIcon; } /** * Set the file that the child JVM's System.out and System.err will be * redirected to. Output will only be redirected if the redirect flag * is set to true via the {@link #setRedirectoutput(boolean)} method. * * @param outputFile a File to redirect System.out and System.err to */ public void setOutput(File outputFile) { this.outputFile = outputFile; } /** * Set the print flag. Setting this flag to true will cause the full child * JVM command to be printed to {@link System#out}. * * @param print the print flag */ public void setPrint(boolean print) { this.print = print; } /** * Set the appendOutput flag. Setting this flag to true will cause the child * JVM to append System.out and System.err to the file specified by the * {@link #setOutput(File)} method. Setting this flag to false will cause * the child to overwrite the file. * * @param appendOutput true if output should be appended to the output file */ public void setAppendoutput(boolean appendOutput) { this.appendOutput = appendOutput; } /** * Set the redirect flag. Setting this flag to true will cause the child * JVM's System.out and System.err to be redirected to file set using the * {@link #setOutput(File)} method. Setting this flag to false will * cause no redirection. * * @param redirect true if System.out and System.err should be redirected */ public void setRedirectoutput(boolean redirect) { this.redirect = redirect; } /** * Set the requireTools flag. Setting this flag to true will cause the * JVM's tools.jar to be added to the child JVM's classpath. This * sets an explicit requirement that the user use a JDK instead of a * JRE. Setting this flag to false explicitly allows the user to use * a JRE. * * @param redirect true if a JDK is required and false if only a JRE * is required */ public void setRequiretools(boolean requireTools) { this.requireTools = requireTools; } /** * Determine if the "if" condition flag for a nested element meets all * criteria for use. * * @param ifCondition the "if" condition flag for a nested element * @return true if the nested element should be process and false if it * should be ignored */ private boolean testIfCondition(String ifCondition) { if (ifCondition == null || "".equals(ifCondition)) return true; return project.getProperty(ifCondition) != null; } /** * Determine if the "unless" condition flag for a nested element meets all * criteria for use. * * @param unlessCondition the "unless" condition flag for a nested element * @return true if the nested element should be process and false if it * should be ignored */ private boolean testUnlessCondition(String unlessCondition) { if (unlessCondition == null || "".equals(unlessCondition)) return true; return project.getProperty(unlessCondition) == null; } } libcommons-launcher-java-1.1/src/java/org/apache/commons/launcher/LaunchTask_en.properties0100644000175000017500000000141207556213346031404 0ustar arnaudarnaud# # Localized strings for LaunchTask class # classname.null=The "classname" attribute must be set output.file.null=The "output" attribute must be set when the "redirect" attribute is enabled output.file.not.creatable=output file cannot be created output.file.not.writable=output file is not writable redirect.notice=Redirecting application output to launch.task.stopped=This task has been stopped no.run.standalone=This task can only be used within the Launcher application. It cannot be used within a regular Ant buildfile. filter.not.filter=class does not implement the LaunchFilter interface filter.exception=filter class encountered a problem child.failed=The launched process returned an exit value of executing.child.command=Executing the following command libcommons-launcher-java-1.1/src/java/org/apache/commons/launcher/Launcher.java0100644000175000017500000010433110100516556027143 0ustar arnaudarnaud/* * Copyright 1999-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.apache.commons.launcher; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.net.URL; import java.net.URLClassLoader; import java.net.URLDecoder; import java.util.ResourceBundle; import org.apache.commons.launcher.types.ArgumentSet; import org.apache.commons.launcher.types.JVMArgumentSet; import org.apache.commons.launcher.types.SysPropertySet; import org.apache.tools.ant.Main; import org.apache.tools.ant.Project; import org.apache.tools.ant.ProjectHelper; import org.apache.tools.ant.taskdefs.Ant; import org.apache.tools.ant.taskdefs.Available; import org.apache.tools.ant.taskdefs.CallTarget; import org.apache.tools.ant.taskdefs.ConditionTask; import org.apache.tools.ant.taskdefs.Exit; import org.apache.tools.ant.taskdefs.Property; import org.apache.tools.ant.taskdefs.Mkdir; import org.apache.tools.ant.taskdefs.Copy; import org.apache.tools.ant.taskdefs.Delete; import org.apache.tools.ant.types.Description; import org.apache.tools.ant.types.FileList; import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.types.Path; import org.apache.tools.ant.types.PatternSet; /** * A class that is used to launch a Java process. The primary purpose of this * class is to eliminate the need for a batch or shell script to launch a Java * process. Some situations where elimination of a batch or shell script may be * desirable are: *
    *
  • You want to avoid having to determining where certain application paths * are e.g. your application's home directory, etc. Determining this * dynamically in a Windows batch scripts is very tricky on some versions of * Windows or when softlinks are used on Unix platforms. *
  • You need to enforce certain properties e.g. java.endorsed.dirs when * running with JDK 1.4. *
  • You want to allow users to pass in custom JVM arguments or system * properties without having to parse and reorder arguments in your script. * This can be tricky and/or messy in batch and shell scripts. *
  • You want to bootstrap Java properties from a configuration file instead * hard-coding them in your batch and shell scripts. *
  • You want to provide localized error messages which is very tricky to do * in batch and shell scripts. *
* * @author Patrick Luby */ public class Launcher implements Runnable { //----------------------------------------------------------- Static Fields /** * Cached bootstrap file. */ private static File bootstrapFile = null; /** * Cached java command */ private static String javaCmd = null; /** * Cached JDB command */ private static String jdbCmd = null; /** * Default XML file name */ private final static String DEFAULT_XML_FILE_NAME = "launcher.xml"; /** * Shared lock. */ private static Object lock = new Object(); /** * Cached log */ private static PrintStream log = System.err; /** * Cached resourceBundle */ private static ResourceBundle resourceBundle = null; /** * The started status flag. */ private static boolean started = false; /** * The stopped status flag. */ private static boolean stopped = false; /** * List of supported Ant tasks. */ public final static Object[] SUPPORTED_ANT_TASKS = new Object[] { LaunchTask.TASK_NAME, LaunchTask.class, "ant", Ant.class, "antcall", CallTarget.class, "available", Available.class, "condition", ConditionTask.class, "fail", Exit.class, "property", Property.class, "mkdir", Mkdir.class, "delete", Delete.class, "copy", Copy.class }; /** * List of supported Ant types. */ public final static Object[] SUPPORTED_ANT_TYPES = new Object[] { ArgumentSet.TYPE_NAME, ArgumentSet.class, JVMArgumentSet.TYPE_NAME, JVMArgumentSet.class, SysPropertySet.TYPE_NAME, SysPropertySet.class, "description", Description.class, "fileset", FileSet.class, "filelist", FileList.class, "path", Path.class, "patternset", PatternSet.class }; /** * Cached tools classpath. */ private static String toolsClasspath = null; /** * The verbose flag */ private static boolean verbose = false; //---------------------------------------------------------- Static Methods /** * Get the started flag. * * @return the value of the started flag */ public static synchronized boolean isStarted() { return Launcher.started; } /** * Get the stopped flag. * * @return the value of the stopped flag */ public static synchronized boolean isStopped() { return Launcher.stopped; } /** * Start the launching process. This method is essential the * main(String[]) method for this class except that this method * never invokes {@link System#exit(int)}. This method is designed for * applications that wish to invoke this class directly from within their * application's code. * * @param args command line arguments * @return the exit value of the last synchronous child JVM that was * launched or 1 if any other error occurs * @throws IllegalArgumentException if any error parsing the args parameter * occurs */ public static int start(String[] args) throws IllegalArgumentException { // Check make sure that neither this method or the stop() method is // already running since we do not support concurrency synchronized (Launcher.lock) { if (Launcher.isStarted() || Launcher.isStopped()) return 1; Launcher.setStarted(true); } int returnValue = 0; ClassLoader parentLoader = null; Thread shutdownHook = new Thread(new Launcher()); Runtime runtime = Runtime.getRuntime(); try { // Cache the current class loader for this thread and set the class // loader before running Ant. Note that we only set the class loader // if we are running a Java version earlier than 1.4 as on 1.4 this // causes unnecessary loading of the XML parser classes. parentLoader = Thread.currentThread().getContextClassLoader(); boolean lessThan14 = true; try { Class.forName("java.lang.CharSequence"); lessThan14 = false; } catch (ClassNotFoundException cnfe) { // If this class does not exist, then we are not running Java 1.4 } if (lessThan14) Thread.currentThread().setContextClassLoader(Launcher.class.getClassLoader()); Project project = new Project(); // Set the project's class loader project.setCoreLoader(Launcher.class.getClassLoader()); // Initialize the project. Note that we don't invoke the // Project.init() method directly as this will cause all of // the myriad of Task subclasses to load which is a big // performance hit. Instead, we load only the // Launcher.SUPPORTED_ANT_TASKS and Launcher.SUPPORTED_ANT_TYPES // into the project that the Launcher supports. for (int i = 0; i < Launcher.SUPPORTED_ANT_TASKS.length; i++) { // The even numbered elements should be the task name String taskName = (String)Launcher.SUPPORTED_ANT_TASKS[i]; // The odd numbered elements should be the task class Class taskClass = (Class)Launcher.SUPPORTED_ANT_TASKS[++i]; project.addTaskDefinition(taskName, taskClass); } for (int i = 0; i < Launcher.SUPPORTED_ANT_TYPES.length; i++) { // The even numbered elements should be the type name String typeName = (String)Launcher.SUPPORTED_ANT_TYPES[i]; // The odd numbered elements should be the type class Class typeClass = (Class)Launcher.SUPPORTED_ANT_TYPES[++i]; project.addDataTypeDefinition(typeName, typeClass); } // Add all system properties as project properties project.setSystemProperties(); // Parse the arguments int currentArg = 0; // Set default XML file File launchFile = new File(Launcher.getBootstrapDir(), Launcher.DEFAULT_XML_FILE_NAME); // Get standard launcher arguments for ( ; currentArg < args.length; currentArg++) { // If we find a "-" argument or an argument without a // leading "-", there are no more standard launcher arguments if ("-".equals(args[currentArg])) { currentArg++; break; } else if (args[currentArg].length() > 0 && !"-".equals(args[currentArg].substring(0, 1))) { break; } else if ("-help".equals(args[currentArg])) { throw new IllegalArgumentException(); } else if ("-launchfile".equals(args[currentArg])) { if (currentArg + 1 < args.length){ String fileArg = args[++currentArg]; launchFile = new File(fileArg); if (!launchFile.isAbsolute()) launchFile = new File(Launcher.getBootstrapDir(), fileArg); } else { throw new IllegalArgumentException(args[currentArg] + " " + Launcher.getLocalizedString("missing.arg")); } } else if ("-executablename".equals(args[currentArg])) { if (currentArg + 1 < args.length) System.setProperty(ChildMain.EXECUTABLE_PROP_NAME, args[++currentArg]); else throw new IllegalArgumentException(args[currentArg] + " " + Launcher.getLocalizedString("missing.arg")); } else if ("-verbose".equals(args[currentArg])) { Launcher.setVerbose(true); } else { throw new IllegalArgumentException(args[currentArg] + " " + Launcher.getLocalizedString("invalid.arg")); } } // Get target String target = null; if (currentArg < args.length) target = args[currentArg++]; else throw new IllegalArgumentException(Launcher.getLocalizedString("missing.target")); // Get user properties for ( ; currentArg < args.length; currentArg++) { // If we don't find any more "-" or "-D" arguments, there are no // more user properties if ("-".equals(args[currentArg])) { currentArg++; break; } else if (args[currentArg].length() <= 2 || !"-D".equals(args[currentArg].substring(0, 2))) { break; } int delimiter = args[currentArg].indexOf('=', 2); String key = null; String value = null; if (delimiter >= 2) { key = args[currentArg].substring(2, delimiter); value = args[currentArg].substring(delimiter + 1); } else { // Unfortunately, MS-DOS batch scripts will split an // "-Dname=value" argument into "-Dname" and "value" // arguments. So, we need to assume that the next // argument is the property value unless it appears // to be a different type of argument. key = args[currentArg].substring(2); if (currentArg + 1 < args.length && !"-D".equals(args[currentArg + 1].substring(0, 2))) { value = args[++currentArg]; } else { value = ""; } } project.setUserProperty(key, value); } // Treat all remaining arguments as application arguments String[] appArgs = new String[args.length - currentArg]; for (int i = 0; i < appArgs.length; i++) { appArgs[i] = args[i + currentArg]; project.setUserProperty(LaunchTask.ARG_PROP_NAME + Integer.toString(i), appArgs[i]); } // Set standard Ant user properties project.setUserProperty("ant.version", Main.getAntVersion()); project.setUserProperty("ant.file", launchFile.getCanonicalPath()); project.setUserProperty("ant.java.version", System.getProperty("java.specification.version")); // Set the buildfile ProjectHelper.configureProject(project, launchFile); // Check that the target exists if (!project.getTargets().containsKey(target)) throw new IllegalArgumentException(target + " " + Launcher.getLocalizedString("invalid.target")); // Execute the target try { runtime.addShutdownHook(shutdownHook); } catch (NoSuchMethodError nsme) { // Early JVMs do not support this method } project.executeTarget(target); } catch (Throwable t) { // Log any errors returnValue = 1; String message = t.getMessage(); if (t instanceof IllegalArgumentException) { Launcher.error(message, true); } else { if (Launcher.verbose) Launcher.error(t); else Launcher.error(message, false); } } finally { synchronized (Launcher.lock) { // Remove the shutdown hook try { runtime.removeShutdownHook(shutdownHook); } catch (NoSuchMethodError nsme) { // Early JVMs do not support this method } // Reset the class loader after running Ant Thread.currentThread().setContextClassLoader(parentLoader); // Reset stopped flag Launcher.setStarted(false); // Notify the stop() method that we have set the class loader Launcher.lock.notifyAll(); } } // Override return value with exit value of last synchronous child JVM Process[] childProcesses = LaunchTask.getChildProcesses(); if (childProcesses.length > 0) returnValue = childProcesses[childProcesses.length - 1].exitValue(); return returnValue; } /** * Interrupt the {@link #start(String[])} method. This is done * by forcing the current or next scheduled invocation of the * {@link LaunchTask#execute()} method to throw an exception. In addition, * this method will terminate any synchronous child processes that any * instances of the {@link LaunchTask} class have launched. Note, however, * that this method will not terminate any asynchronous child * processes that have been launched. Accordingly, applications that use * this method are encouraged to always set the LaunchTask.TASK_NAME task's * "waitForChild" attribute to "true" to ensure that the * application that you want to control can be terminated via this method. * After this method has been executed, it will not return until is safe to * execute the {@link #start(String[])} method. * * @return true if this method completed without error and false if an * error occurred or the launch process is already stopped */ public static boolean stop() { synchronized (Launcher.lock) { // Check the stopped flag to avoid concurrent execution of this // method if (Launcher.isStopped()) return false; // Make sure that the start() method is running. If not, just // return as there is nothing to do. if (Launcher.isStarted()) Launcher.setStopped(true); else return false; } boolean returnValue = true; try { // Kill all of the synchronous child processes killChildProcesses(); // Wait for the start() method to reset the start flag synchronized (Launcher.lock) { if (Launcher.isStarted()) Launcher.lock.wait(); } // Make sure that the start() method has really finished if (Launcher.isStarted()) returnValue = true; } catch (Throwable t) { // Log any errors returnValue = false; String message = t.getMessage(); if (Launcher.verbose) Launcher.error(t); else Launcher.error(message, false); } finally { // Reset stopped flag Launcher.setStopped(false); } return returnValue; } /** * Print a detailed error message and exit. * * @param message the message to be printed * @param usage if true, print a usage statement after the message */ public static void error(String message, boolean usage) { if (message != null) Launcher.getLog().println(Launcher.getLocalizedString("error") + ": " + message); if (usage) Launcher.getLog().println(Launcher.getLocalizedString("usage")); } /** * Print a detailed error message and exit. * * @param message the exception whose stack trace is to be printed. */ public static void error(Throwable t) { String message = t.getMessage(); if (!Launcher.verbose && message != null) Launcher.getLog().println(Launcher.getLocalizedString("error") + ": " + message); else t.printStackTrace(Launcher.getLog()); } /** * Get the canonical directory of the class or jar file that this class was * loaded. This method can be used to calculate the root directory of an * installation. * * @return the canonical directory of the class or jar file that this class * file was loaded from * @throws IOException if the canonical directory or jar file * cannot be found */ public static File getBootstrapDir() throws IOException { File file = Launcher.getBootstrapFile(); if (file.isDirectory()) return file; else return file.getParentFile(); } /** * Get the canonical directory or jar file that this class was loaded * from. * * @return the canonical directory or jar file that this class * file was loaded from * @throws IOException if the canonical directory or jar file * cannot be found */ public static File getBootstrapFile() throws IOException { if (bootstrapFile == null) { // Get a URL for where this class was loaded from String classResourceName = "/" + Launcher.class.getName().replace('.', '/') + ".class"; URL resource = Launcher.class.getResource(classResourceName); if (resource == null) throw new IOException(Launcher.getLocalizedString("bootstrap.file.not.found") + ": " + Launcher.class.getName()); String resourcePath = null; String embeddedClassName = null; boolean isJar = false; String protocol = resource.getProtocol(); if ((protocol != null) && (protocol.indexOf("jar") >= 0)) { isJar = true; } if (isJar) { resourcePath = URLDecoder.decode(resource.getFile()); embeddedClassName = "!" + classResourceName; } else { resourcePath = URLDecoder.decode(resource.toExternalForm()); embeddedClassName = classResourceName; } int sep = resourcePath.lastIndexOf(embeddedClassName); if (sep >= 0) resourcePath = resourcePath.substring(0, sep); // Now that we have a URL, make sure that it is a "file" URL // as we need to coerce the URL into a File object if (resourcePath.indexOf("file:") == 0) resourcePath = resourcePath.substring(5); else throw new IOException(Launcher.getLocalizedString("bootstrap.file.not.found") + ": " + Launcher.class.getName()); // Coerce the URL into a file and check that it exists. Note that // the JVM File(String) constructor automatically // flips all '/' characters to '\' on Windows and there are no // valid escape characters so we sould not have to worry about // URL encoded slashes. File file = new File(resourcePath); if (!file.exists() || !file.canRead()) throw new IOException(Launcher.getLocalizedString("bootstrap.file.not.found") + ": " + Launcher.class.getName()); bootstrapFile = file.getCanonicalFile(); } return bootstrapFile; } /** * Get the full path of the Java command to execute. * * @return a string suitable for executing a child JVM */ public static synchronized String getJavaCommand() { if (javaCmd == null) { String osname = System.getProperty("os.name").toLowerCase(); String commandName = null; if (osname.indexOf("windows") >= 0) { // Always use javaw.exe on Windows so that we aren't bound to an // MS-DOS window commandName = "javaw.exe"; } else { commandName = "java"; } javaCmd = System.getProperty("java.home") + File.separator + "bin" + File.separator + commandName; } return javaCmd; } /** * Get the full path of the JDB command to execute. * * @return a string suitable for executing a child JDB debugger */ public static synchronized String getJDBCommand() { if (jdbCmd == null) { String osname = System.getProperty("os.name").toLowerCase(); String commandName = null; if (osname.indexOf("windows") >= 0) commandName = "jdb.exe"; else commandName = "jdb"; jdbCmd = new File(System.getProperty("java.home")).getParent() + File.separator + "bin" + File.separator + commandName; } return jdbCmd; } /** * Get the PrintStream that all output should printed to. The default * PrintStream returned in System.err. * * @return the PrintStream instance to print output to */ public static synchronized PrintStream getLog() { return Launcher.log; } /** * Set the classpath to the current JVM's tools classes. * * @return a string suitable for use as a JVM's -classpath argument * @throws IOException if the tools classes cannot be found */ public static synchronized String getToolsClasspath() throws IOException { if (toolsClasspath == null) { File javaHome = null; javaHome = new File(System.getProperty("java.home")).getCanonicalFile(); Class clazz = null; String[] toolsPaths = new String[2]; toolsPaths[0] = javaHome.getParent() + File.separator + "lib" + File.separator + "tools.jar"; toolsPaths[1] = javaHome.getPath() + File.separator + "lib" + File.separator + "tools.jar"; File toolsFile = null; for (int i = 0; i < toolsPaths.length; i++) { ClassLoader loader = ClassLoader.getSystemClassLoader(); toolsFile = new File(toolsPaths[i]); // Check if the jar file exists and is readable if (!toolsFile.isFile() || !toolsFile.canRead()) toolsFile = null; if (toolsFile != null) { try { URL toolsURL = toolsFile.toURL(); loader = new URLClassLoader(new URL[]{toolsURL}, loader); } catch (Exception e) { toolsFile = null; } } // Try to load the javac class just to be sure. Note that we // use the system class loader if the file does not exist to // handle cases like Mac OS X where the tools.jar classes are // loaded by the bootstrap class loader. try { clazz = loader.loadClass("sun.tools.javac.Main"); if (clazz != null) break; } catch (Exception e) {} } if (clazz == null) throw new IOException(Launcher.getLocalizedString("sdk.tools.not.found")); // Save classpath. if (toolsFile != null) toolsClasspath = toolsFile.getPath(); else toolsClasspath = ""; } return toolsClasspath; } /** * Get a localized property. This method will search for localized * properties and will resolve ${...} style macros in the localized string. * * @param key the localized property to retrieve * @return the localized and resolved property value */ public static String getLocalizedString(String key) { return Launcher.getLocalizedString(key, Launcher.class.getName()); } /** * Get a localized property. This method will search for localized * properties and will resolve ${...} style macros in the localized string. * * @param key the localized property to retrieve * @param className the name of the class to retrieve the property for * @return the localized and resolved property value */ public static String getLocalizedString(String key, String className) { try { ResourceBundle resourceBundle = ResourceBundle.getBundle(className); return Launcher.resolveString(resourceBundle.getString(key)); } catch (Exception e) { // We should at least make it clear that the property is not // defined in the properties file return "<" + key + " property>"; } } /** * Resolve ${...} style macros in strings. This method will replace any * embedded ${...} strings in the specified unresolved parameter with the * value of the system property in the enclosed braces. Note that any '$' * characters can be escaped by putting '$$' in the specified parameter. * In additional, the following special macros will be resolved: *
    *
  • ${launcher.executable.name} will be substituted with the * value of the "org.apache.commons.launcher.executableName" system * property, the "-executablename" command line argument, or, if both of * those are undefined, with the absolute path to the Java executable plus * its classpath and main class name arguments *
  • ${launcher.bootstrap.file} will get substituted with * the value returned by {@link #getBootstrapFile()} *
  • ${launcher.bootstrap.dir} will get substituted with * the value returned by {@link #getBootstrapDir()} * * @param unresolved the string to be resolved * @return the resolved String * @throws IOException if any error occurs */ private static String resolveString(String unresolved) throws IOException { if (unresolved == null) return null; // Substitute system property strings StringBuffer buf = new StringBuffer(); int tokenEnd = 0; int tokenStart = 0; char token = '$'; boolean escapeChar = false; boolean firstToken = true; boolean lastToken = false; while (!lastToken) { tokenEnd = unresolved.indexOf(token, tokenStart); // Determine if this is the first token if (firstToken) { firstToken = false; // Skip if first token is zero length if (tokenEnd - tokenStart == 0) { tokenStart = ++tokenEnd; continue; } } // Determine if this is the last token if (tokenEnd < 0) { lastToken = true; tokenEnd = unresolved.length(); } if (escapeChar) { // Don't parse the string buf.append(token + unresolved.substring(tokenStart, tokenEnd)); escapeChar = !escapeChar; } else { // Parse the string int openProp = unresolved.indexOf('{', tokenStart); int closeProp = unresolved.indexOf('}', tokenStart + 1); String prop = null; // We must have a '{' in the first character and a closing // '}' after that if (openProp != tokenStart || closeProp < tokenStart + 1 || closeProp >= tokenEnd) { buf.append(unresolved.substring(tokenStart, tokenEnd)); } else { // Property found String propName = unresolved.substring(tokenStart + 1, closeProp); if ("launcher.executable.name".equals(propName)) { prop = System.getProperty(ChildMain.EXECUTABLE_PROP_NAME); if (prop != null) { // Quote the property prop = "\"" + prop + "\""; } else { // Set property to fully quoted Java command line String classpath = Launcher.getBootstrapFile().getPath(); prop = "\"" + System.getProperty("java.home") + File.separator + "bin" + File.separator + "java\" -classpath \"" + classpath + "\" LauncherBootstrap"; } } else if ("launcher.bootstrap.file".equals(propName)) { prop = Launcher.getBootstrapFile().getPath(); } else if ("launcher.bootstrap.dir".equals(propName)) { prop = Launcher.getBootstrapDir().getPath(); } else { prop = System.getProperty(unresolved.substring(tokenStart + 1, closeProp)); } if (prop == null) prop = ""; buf.append(prop + unresolved.substring(++closeProp, tokenEnd)); } } // If this is a blank token, then the next starts with the // token character. So, treat this token as an escape // character for the next token. if (tokenEnd - tokenStart == 0) escapeChar = !escapeChar; tokenStart = ++tokenEnd; } return buf.toString(); } /** * Set the PrintStream that all output should printed to. * * @param a PrintStream instance to print output to */ public static synchronized void setLog(PrintStream log) { if (log != null) Launcher.log = log; else Launcher.log = System.err; } /** * Set the started flag. * * @param started the value of the started flag */ private static synchronized void setStarted(boolean started) { Launcher.started = started; } /** * Set the stopped flag. * * @param stopped the value of the stopped flag */ private static synchronized void setStopped(boolean stopped) { Launcher.stopped = stopped; } /** * Set the verbose flag. * * @param verbose the value of the verbose flag */ public static synchronized void setVerbose(boolean verbose) { Launcher.verbose = verbose; } /** * Iterate through the list of synchronous child process launched by * all of the {@link LaunchTask} instances. */ public static void killChildProcesses() { Process[] procs = LaunchTask.getChildProcesses(); for (int i = 0; i < procs.length; i++) procs[i].destroy(); } //----------------------------------------------------------------- Methods /** * Wrapper to allow the {@link #killChildProcesses()} method to be * invoked in a shutdown hook. */ public void run() { Launcher.killChildProcesses(); } } libcommons-launcher-java-1.1/src/java/org/apache/commons/launcher/Launcher_en.properties0100644000175000017500000000240207556213350031103 0ustar arnaudarnaud# # Localized strings for Launcher class # error=Error bootstrap.file.not.found=Cannot determine directory or jar file where the following class was loaded from bootstrap.file.not.file=The following class must be loaded from a local file sdk.tools.not.found=Could not find Java(TM) 2 SDK classes. This application cannot run using the Java(TM) 2 JRE. It requires the full SDK. launch.already.started=The launching process has already started and cannot be restarted until it has finished or been stopped launch.already.stopped=The launching process is already in the process of being stopped missing.arg=requires an argument immediately after it invalid.arg=is not a valid argument missing.target=A target is required invalid.target=is not a valid target usage=Usage: ${launcher.executable.name} [options] [-] target [-D=...] [-] [application arguments...]${line.separator}\ where options include:${line.separator}\ \ -help Print this usage statement${line.separator}\ \ -launchfile The XML file to use (the default is "launcher.xml")${line.separator}\ \ -executablename The executable name to print in this usage statement${line.separator}\ \ -verbose Print stack traces with error messages libcommons-launcher-java-1.1/src/java/org/apache/commons/launcher/ParentListener.java0100644000175000017500000001202510020100364030322 0ustar arnaudarnaud/* * Copyright 1999-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.apache.commons.launcher; import java.io.File; import java.io.InputStream; import java.io.IOException; /** * A class for detecting if the parent JVM that launched this process has * terminated. * * @author Patrick Luby */ public class ParentListener extends Thread { //------------------------------------------------------------------ Fields /** * Cached heartbeat file. */ private File heartbeatFile = null; //------------------------------------------------------------ Constructors /** * Validates and caches a lock file created by the parent JVM. * * @param path the lock file that the parent JVM has an open * FileOutputStream * @throws IOException if the heartbeat cannot be converted into a valid * File object */ public ParentListener(String path) throws IOException { if (path == null) throw new IOException(); // Make sure we have a valid path heartbeatFile = new File(path); heartbeatFile.getCanonicalPath(); } //----------------------------------------------------------------- Methods /** * Periodically check that the parent JVM has not terminated. On all * platforms other than Windows, this method will check that System.in has * not been closed. On Windows NT, 2000, and XP the lock file specified in * the {@link #ParentListener(String)} constructor is monitored as reading * System.in will block the entire process on Windows machines that use * some versions of Unix shells such as MKS, etc. No monitoring is done * on Window 95, 98, and ME. */ public void run() { String osname = System.getProperty("os.name").toLowerCase(); // We need to use file locking on Windows since reading System.in // will block the entire process on some Windows machines. if (osname.indexOf("windows") >= 0) { // Do nothing if this is a Windows 9x platform since our file // locking mechanism does not work on the early versions of // Windows if (osname.indexOf("nt") == -1 && osname.indexOf("2000") == -1 && osname.indexOf("xp") == -1) return; // If we can delete the heartbeatFile on Windows, it means that // the parent JVM has closed its FileOutputStream on the file. // Note that the parent JVM's stream should only be closed when // it exits. for ( ; ; ) { if (heartbeatFile.delete()) break; // Wait awhile before we try again yield(); try { sleep(5000); } catch (Exception e) {} } } else { // Cache System.in in case the application redirects InputStream is = System.in; int bytesAvailable = 0; int bytesRead = 0; byte[] buf = new byte[1024]; try { while (true) { synchronized (is) { // Mark the stream position so that other threads can // reread the strea is.mark(buf.length); // Read one more byte than has already been read to // force the stream to wait for input bytesAvailable = is.available(); if (bytesAvailable < buf.length) { bytesRead = is.read(buf, 0, bytesAvailable + 1); // Reset so that we "unread" the bytes that we read is.reset(); if (bytesRead == -1) break; } else { // Make the buffer larger if (buf.length < Integer.MAX_VALUE / 2) buf = new byte[buf.length * 2]; } } yield(); } } catch (IOException ioe) {} } // Clean up before exiting if (heartbeatFile != null) heartbeatFile.delete(); // Exit this process since the parent JVM has exited System.exit(0); } } libcommons-launcher-java-1.1/src/java/org/apache/commons/launcher/StreamConnector.java0100644000175000017500000000462210020100364030475 0ustar arnaudarnaud/* * Copyright 1999-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.apache.commons.launcher; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; /** * A class for connecting an OutputStream to an InputStream. * * @author Patrick Luby */ public class StreamConnector extends Thread { //------------------------------------------------------------------ Fields /** * Input stream to read from. */ private InputStream is = null; /** * Output stream to write to. */ private OutputStream os = null; //------------------------------------------------------------ Constructors /** * Specify the streams that this object will connect in the {@link #run()} * method. * * @param is the InputStream to read from. * @param os the OutputStream to write to. */ public StreamConnector(InputStream is, OutputStream os) { this.is = is; this.os = os; } //----------------------------------------------------------------- Methods /** * Connect the InputStream and OutputStream objects specified in the * {@link #StreamConnector(InputStream, OutputStream)} constructor. */ public void run() { // If the InputStream is null, don't do anything if (is == null) return; // Connect the streams until the InputStream is unreadable try { int bytesRead = 0; byte[] buf = new byte[4096]; while ((bytesRead = is.read(buf)) != -1) { if (os != null && bytesRead > 0) { os.write(buf, 0, bytesRead); os.flush(); } yield(); } } catch (IOException e) {} } } libcommons-launcher-java-1.1/src/java/LauncherBootstrap.java0100644000175000017500000001627310020100364023547 0ustar arnaudarnaud/* * Copyright 1999-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. */ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.net.URLDecoder; import java.util.ArrayList; import java.util.Properties; import java.util.StringTokenizer; /** * This class is used as a wrapper for loading the * org.apache.commons.launcher.Launcher class and invoking its * main(String[]) method. This particular * class is primary used by the Windows 95, 98, ME, and 2000 platforms to * overcome the difficulty of putting a jar file directly into the JVM's * classpath when using batch scripts on these platforms. *

    * Specifically, the problem on thse platforms is when Windows uses the PATH * environment variable to find and run a batch script, %0 will resolve * incorrectly in that batch script. *

    * The way to work around this Windows limitation is to do the following: *

      *
    1. Put this class' class file - LauncherBootstrap.class - in the same * directory as the batch script. Do not put this class file in a jar file. *
    2. Put the jar file containing the launcher's classes in the same * directory as the batch script and this class' class file. Be sure that * that the jar file is named "commons-launcher.jar". *
    3. Make the Java command in the batch script invoke Java use the following * classpath arguments. Be sure to include the quotes to ensure that paths * containing spaces are handled properly: * -classpath %0\..;"%PATH%" *
    * * @author Patrick Luby */ public class LauncherBootstrap { //---------------------------------------------------------- Static Fields /** * Ant classpath property name */ public final static String ANT_CLASSPATH_PROP_NAME = "ant.class.path"; /** * Jar file name */ public final static String LAUNCHER_JAR_FILE_NAME = "commons-launcher.jar"; /** * Properties file name */ public final static String LAUNCHER_PROPS_FILE_NAME = "launcher.properties"; /** * Class name to load */ public final static String LAUNCHER_MAIN_CLASS_NAME = "org.apache.commons.launcher.Launcher"; /** * Cached Laucher class. */ private static Class launcherClass = null; //---------------------------------------------------------- Static Methods /** * The main method. * * @param args command line arguments */ public static void main(String[] args) { try { // Try to find the LAUNCHER_JAR_FILE_NAME file in the class // loader's and JVM's classpath. URL coreURL = LauncherBootstrap.class.getResource("/" + LauncherBootstrap.LAUNCHER_JAR_FILE_NAME); if (coreURL == null) throw new FileNotFoundException(LauncherBootstrap.LAUNCHER_JAR_FILE_NAME); // Coerce the coreURL's directory into a file File coreDir = new File(URLDecoder.decode(coreURL.getFile())).getCanonicalFile().getParentFile(); // Try to find the LAUNCHER_PROPS_FILE_NAME file in the same // directory as this class File propsFile = new File(coreDir, LauncherBootstrap.LAUNCHER_PROPS_FILE_NAME); if (!propsFile.canRead()) throw new FileNotFoundException(propsFile.getPath()); // Load the properties in the LAUNCHER_PROPS_FILE_NAME Properties props = new Properties(); FileInputStream fis = new FileInputStream(propsFile); props.load(fis); fis.close(); // Create a class loader that contains the Launcher, Ant, and // JAXP classes. URL[] antURLs = LauncherBootstrap.fileListToURLs((String)props.get(LauncherBootstrap.ANT_CLASSPATH_PROP_NAME)); URL[] urls = new URL[1 + antURLs.length]; urls[0] = coreURL; for (int i = 0; i < antURLs.length; i++) urls[i + 1] = antURLs[i]; ClassLoader parentLoader = Thread.currentThread().getContextClassLoader(); URLClassLoader loader = null; if (parentLoader != null) loader = new URLClassLoader(urls, parentLoader); else loader = new URLClassLoader(urls); // Load the LAUNCHER_MAIN_CLASS_NAME class launcherClass = loader.loadClass(LAUNCHER_MAIN_CLASS_NAME); // Get the LAUNCHER_MAIN_CLASS_NAME class' getLocalizedString() // method as we need it for printing the usage statement Method getLocalizedStringMethod = launcherClass.getDeclaredMethod("getLocalizedString", new Class[]{ String.class }); // Invoke the LAUNCHER_MAIN_CLASS_NAME class' start() method. // If the ant.class.path property is not set correctly in the // LAUNCHER_PROPS_FILE_NAME, this will throw an exception. Method startMethod = launcherClass.getDeclaredMethod("start", new Class[]{ String[].class }); int returnValue = ((Integer)startMethod.invoke(null, new Object[]{ args })).intValue(); // Always exit cleanly after invoking the start() method System.exit(returnValue); } catch (Throwable t) { t.printStackTrace(); System.exit(1); } } /** * Convert a ":" separated list of URL file fragments into an array of URL * objects. Note that any all URL file fragments must conform to the format * required by the "file" parameter in the * {@link URL(String, String, String)} constructor. * * @param fileList the ":" delimited list of URL file fragments to be * converted * @return an array of URL objects * @throws MalformedURLException if the fileList parameter contains any * malformed URLs */ private static URL[] fileListToURLs(String fileList) throws MalformedURLException { if (fileList == null || "".equals(fileList)) return new URL[0]; // Parse the path string ArrayList list = new ArrayList(); StringTokenizer tokenizer = new StringTokenizer(fileList, ":"); URL bootstrapURL = LauncherBootstrap.class.getResource("/" + LauncherBootstrap.class.getName() + ".class"); while (tokenizer.hasMoreTokens()) list.add(new URL(bootstrapURL, tokenizer.nextToken())); return (URL[])list.toArray(new URL[list.size()]); } } libcommons-launcher-java-1.1/xdocs/0040755000175000017500000000000010132743155016666 5ustar arnaudarnaudlibcommons-launcher-java-1.1/xdocs/images/0040755000175000017500000000000010132743155020133 5ustar arnaudarnaudlibcommons-launcher-java-1.1/xdocs/images/launcher-logo-white.png0100644000175000017500000003253410034045144024514 0ustar arnaudarnaud‰PNG  IHDRæQÆ¥ÚvbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÔ0çáîÇ IDATxœí}ktTU–ÿ¯’ó±Ry2óaº /E ЂF1@HTZ´g|t‹¢3v;Ú@ƒ­ ¢  Aå!òz´U´IèÀ(ï„7¶Ä¼±TUªÎÿCÜ×}÷ÝçVuþ3ke¯uWݺ÷<öÙ{ÿöÞçÜS·ÆƒV/Þʪ. ­îïST'Ñ>d]¿z~÷ZË«VþRx¶oKkWö©úL„çï#[û?¦ ùÉ.(0ËË˃¨K—.8p rss‘••åaÔÓÙ·ßµÁ”——ã‹/¾Àúõë]÷rss‘››‹ºÚ÷ M §OŸÆºuë0hÐ äææzÚÛ¹s'ÊË˱sçNgŒ®¾m´aÃìÚµ _|ñ…«nnn®Uq’_É÷Î;±~ýz<ÿüóêØ×¯_;w:}æææ¢°°Ð£M»vírÉšêfgg'įM¿Ô>É‘x€ììl§Ÿx¦ô$›ÂÂBG—Ô&Ùé PXX·??’ò€ÂÂB 4È‘ù£>ŠçŸÞê¼ý¾;ç&½ð &;;Ûð= ÌÉ“'M(²ápØ„Ãa‰DLss³‰F£&šçŸ>¡>²³³Í”)SZÝOss³Y³f),,tÚZ³finn6‘HÄ„ÃaSZZjhí{àÀæÄ‰æâÅ‹žãÙgŸõåŸê655¹ê555™¦¦&ß‘HÄœ:uÊ<ÿüó&77×iƒx%~çÌ™ãÛçC=äéïâÅ‹æøñãæ¡‡ò•3Õ¥Cã•óËu¹cÇßñl¦¤¤Ä„B!Wš>iìeeeæá‡vý­·Þräò׿þÕL™2Å׆V®\é‘‹M4¾GyÄÕFaa¡),,tµ  À±¡Dí’äFM,3±XÌcŒ˜ååå®Á?òÈ#¦¬¬ÌÀÉ“'MAAgà+V¬0çÏŸ÷.\p@Œ®^½ÚÕÇÃ?lJKKM86¡PÈœû¬(¼}V~~¾§Ÿ1cÆXû™û÷ï¯Ö«¨¨0gΜ1£GvÆ9qâD¿cÆŒ±ÖÕx%9“.% \¶BQ—ôùæ›oªŽëСCª>óóóãêrÅŠ.=ÆÓEVV–9sæŒsÈñ‘­ò>)ºÛÆÅûáQslܩɬC&evv¶“BqFΟ?o¾ùæsöìY3kÖ,Ï 333Mcc£ihh0¦±±Ñœ9sÆøo¼á,÷0Ôþ¹sç%ýýïwŒ‹£Gvú ~¾úê+§ž-RÐû÷ïo¶nÝj¾úê+§††ÓÐÐ`8 ŽmÉ’%€ÉËË3{öì1µµµÎQWWgêëëÍþýûMff¦§./[[[kêëë9qÚø}ðÁMee¥9s指ß'Ÿ|ÒSo„ &//Ï03gÎTy­¯¯7¯¿þºZW+ߨØèÈøÈ‘#.ƒ;v¬+æú<{ö¬£ËeË–©²=pà€GŸ0šƒ¦þÇŒc<èȤ¾¾ÞÔÕÕ™ºº:sÕUWyê-Y²Äw|Û¶msÊ0À‰~šž={ÖU^shô œ®ÅŸòòr <˜¾â³Ï>Cff&Œ1ˆÅbˆÅbÎ9}~ñÅèÝ»7$!//Àw @{öìÁðáÃr ÀG}ä|ÿ6½vꋎ¾}ûâË/¿Tûâ IIIHJJ¢k‘Ë.»¬äqôèÑXºt©:6¢™3g¢¨¨È3¾‘#GbáÂ…Îw>F⡨¨3gÎtÕÛ¼y3®¼òJç;ñHü&''cóæÍ¸çž{<}.]º£FòðÊùíß¿¿G>°páBŒ9Ò—ßQ£Fa÷îÝN™ŒŒ ü÷ÿ·§çµOŸ>¨ªªrÊ;vÌY‘<ÊóéÓ§cÑ¢E.>óòòPTTäâ‹ú VÙ¼þúëÈËËsÙ*ñ`ŒÁž={0zôhW®CÞoÆŒxõÕWcÆŒÁŠ+<6J}ÀÝwß-[¶ ¾¾ÞÕ—”?—ß ‰*cpÛm·9 =üðÃ(£Ñ(b±¢Ñ(š››ÑÜÜŒH$‚H$‚´´4ôë×Ï#¨Þ½{#»ŽH$‚ßýîw®r&LpÚäG$A8võ‰DAqúýïp8ŒP(„P(äÔ¥>Ãáp²¬sÕUW¡¨¨È)Guùy(Â7Þèé¯oß¾˜7oššš¬G(RÖçŸîjŸÊr¾£Ñ¨§Þ“O>‰‘#Gºø•¼655¹œÑã?ŽaÆ©í0RPPà€1‹©Œ .\èð‚ ššêQÆ®]»\hñZ²=:h°üZïÞ½=ʬ®®ÆâÅ‹~¸ñ| î$JOOwî“B¸"é¼GCƒ¾ ¤6rrr/^ì*›——g¢•¹ùæ›=}Μ9Ó¥?Îcss³§|jjª#—Ö8ÊššO~N€€ªª*,X°Àe›|œ4.rŒš$0 _Zö“´ uݺu.¦û÷ïïB´D9o°sçÎ(++CUUÒÓÓaŒA$ñoºé&¼þúë®vöíÛ‡¿ýíoN„ã|j<677# 9r‘²!’ú€P(Àj&''£¹¹½{÷Æ{ï½ç”>}:b±~ýë_»Rf>2Æ`íÚµŽäÔŠÚç}_À>}úàÃ?ôðÍÍ£‚Ö7­òÉÄûÕê’¡qcçí¿ZÄä‘„ËFÎÉl²âå}¯š3àÓéHb±˜3¿µÕÕ­EL9•‘áÙD @Ÿ>}·‘´uëVµ}´´D#2⛯J"C×VÌlýʾ8È´Å1ÍÐy]žB˾müÊ%{mÁ#¯¶º6~µõþô§?y‘ÙÒo6q^ùã3IÑhÔ×~4G¨÷')S¦`Ù²ejt€ºº:,X°cÆŒAUU•+’-}%]ß>.‘7«ªª¬S›`“€ùœ…&ÐÉÉÉÖÈ£ _s2Õ°= z¢=µ#‰¢«fäZäö#™²%RWF”x€–¼i p6`ñ¬F‹f~FKõ¹3Ñð]äÒž_Kùr¾4ÛHKKó8Z:4ÙØ w~$õ Û‹F£ÈÉÉÁ»ï¾‹GyÄÚN}}=&NœˆmÛ¶©xáY‹œcrÒÑàwÞñÌ1mÑ’„Ì—ýù*cJJ FŒ¡ö³uëVÕKi¦~l^6''Çcì6er#ÓÏP5>²ŠŒH¶¹©4¹¸b“‹6¯û¾üþüç?÷”+..V³> ’6cÓ'=–‘Ì/U—‹ŸÖµÇeͳ§h4ŠqãÆaóæÍ7nœ*¯úúz,\¸ÕÕÕªóOÄ!&cPPPà¹QTT¤¦XZÄä&Pø Ö®]‹¡C‡zÚ­¯¯ÇÚµkÕ`ñcKo“€–¯JÚ³gvïÞí™ѹ̑IÈIIIxÿý÷1iÒ¤„¢&“3­¥=D$dùLô†nPS6›2µûjJ¡¤Yr-E³Í»¹sðãWkOÎï%ñG"¶Ã6=}|O5QCCƒ%üæX²Ý>øÀÕNïÞ½‘žžn•M66Gåç”l‹—ÆÌž=6lðm?55Ó¦MÃO<ái»¤¤DÍãÍ;o#æÀÕ_¼O™2_~ù¥4Ú\ˆµoß>Lœ8‹/ö“o¢&ª¨¨@EE… $6f©íÚ 7Ü z?¿tÁO‘¬Æ*¹x¹D ZòoÁH£D"7çI.ßk†Éy媈~ö³Ÿ¡S§Nžò›6mRçg¶¹·¦Ïo¼ÑÃÖ’lÀáüÚÖ8øˆ&ÃC‡©íÊcèС3fŒ«nCCƒº¤­ËìÐávòäɦkjjð / ººÚ:·áÂÞ»w/&Nœˆ~ýú᪫®r-'''㪫®ÂW\áéçÏþ³ L œZ´ü×ýWddd¨!Å%B\)‰¤²¶ˆiS²l×V¦5üjA+'w$ÉóDø•<ÞrË-žòeeeqí„SMMëwzz:~ùË_zœž_ NüØxo>$•––zÊÞ©L @~~¾§¾\ˆÔ2 ¹ê¤²@ 0µ¨¹mÛ6Üÿý8xð 5ÕŒÅbX¶l Q]]E‹yÒ+:^yåOk×®uvIï'=‰1Ƶ/##?þ¸‰(U Þ]d[_~HÖç”( mmùõ'Ó\É·-¢øiäÈ‘èÚµ««|cc#¶lÙ¢S‚€gkåK/½¤‚²5:l­l⵿~ýzUç|±3))ɵÁºu릮*û-rÒáz\òôÓO«ŒÕÕÕaòäÉ?~<-Z„?þÅÅÅØ¾};æÍ›‡›nº Ï>û,à•W^AFF†Õƒeffbþüùž{O=õ”s.døµåË—;›§322œÍ÷~àðºft2rjäH¿~o"”H¼7*yýR÷‘Gñ¤´o¼ñ<‹jò¨©©qsÁ‚¸âŠ+¬ãJ”G­Ž­®&IëׯG]]l88Ïœ9ãª7xð`Ïê®_ZË–ËMŽ3K–,Q™ZræwÞy³fÍÂSO=…3f`Íš5ÎÖ¸yóæaøðáqŸÞ|ó͘;w®ëÚáÇ1{öl绌šÆ|ðÁŽÈÈÈÀúõë‘‘‘¡ž‘@èžüÁ+u;šlÃfµµµ¾`4ƨ}úCCCƒÊ¯ÍÀã9Êdlå:uê„Y³fyÀ9uêT466ðfAÊ;î¸Ã)ÿòË/ãæ›oVçr\—Ô&'m £´²²²ÕãZVX_~ùeOÔ¤HIÀÜ´i“Sçç?ÿ¹kÎɳ?[Öé™cr¦Fíúe~" ñÌ3Ïà_þå_TO )føðáX±b…+ü—••áÞ{ïÅ–-[\J-..Ư~õ+<öØcZ~¨¼víZ¤§§«‹;œÉÉÉžMúÔWcc£o¤ øóŸÿì©[WW‡âââ¸víÚµžºê†~Nr^Àó³<[”/..öÔݾ}»¯Ò5ßíÛ·ûòЩS'Ìž=ƒ r®766bâĉX±bŽ; E—•••˜?>FމÚÚZ¤§§cþüù1b„”œÿõ_ÿåáaóæÍqSß?þXuxš¼4*..ƽ÷Þ‹ƒºø¡M4¯¾úªó*Ð!C†à‰'žpÊã~é€ß"P ‰zÖG;7B¡N:…I“&áÀ¾ `ܸqÈÎÎFûöíѾ}{ç¹%C2Æ7.„Ãa¼ùæ›X³fMÜHÑ«W/üö·¿E¿~ýoEá?’ŽD"ضmêêêPRR‚#GލíuîÜÝ»wÇàÁƒ]«Œ'NœÀ±cǰcÇ>|ØÊÏ5×\ƒ«¯¾;vÄOúSÀÑ£Gqüøq”••YëƒA\sÍ5èÚµ+:v숟üä'8zô(Ž=Š;v¨QzôèîÝ»£k×®Nš´ü:èøñã(--µÊ0 bèСèÚµ+ºvíŠË.» @ËëdŽ;æ[7''C‡Åe—]†þçÆO~òÇÁÊètôèQ,]ºÔ£‚Á îºë.ÜsÏ=Ž­aÒvJÒçþýûQQQ7ZeÓ¹sg <]»vuDcc#Nœ8¿üå/(++³òÒ£G 2ƒvÆ0gÎ466" "))ÉqZZšó£kc ¶mÛæŒéÖ[oÅØ±c<ñGD„‡víÚ¡}ûöø‡ø×Áñhnykåˆ~É}ñâE|öÙgؽ{7>úè#':uêÔ ]»vÅСC‘’’â4Ö¡C׆ ñ¤42$­¿p8Œýû÷ãàÁƒ.ƒNJJµ×^‹>}ú K—..àS›rK_8ÆôéÓ=«¹üSFðÑ£Gãg?û€–×[;v̺2(W»uë†Q£FÁƒ-[¶àèÑ£qëÒ'eóæÍÖÖÖÍËËÃOúS0µç§uuuŽ£ámæää wïÞ¸òÊ+]º$NŽ›ërõêÕ¨¬¬ô]ã¼>úè£0ÆàøñãøãÿhÝ·-ÇGr¡~Ž?Žôôtdff:¼:tõõõ8xð ó˜' ¢gÏž¸îºëÔçþRV„™:8 ìСƒs¸€É›¢æÅ‹×OÐëø{WÈppra“'”Šã;räë'ä:ò0)))ÓÔ6 ˜çí|·‰+gÑ&ä\xÉÉÉ®1‘“‘Ž€ö‚ò]P|ÇϸS’ﱡºÚ>c"¾hà¤<ïv[¯¼.S[ª'ù’NÞ§\(±=ÃäN’ó&û$‘à}ñ±Q?d{Ò®e°ásGm£Œ´C’7RfŠm¥‰ƒN¾ú• š°xJ+çot—çmP9Í+Æb1—2yy>6î)ù9•ç •@¶Í'µE†x *~uå=úÎǧÕÕÚ¶}—ãоûñ*[äCz LY¥s”ã”)²œq^9(x~jÇ3Û˜¥Üyÿ‰íQµ)ÓY‰M—)œ!9©•‡m1‡<•6xHIIq ÊHs^œec¡pîd].$iÌÚ$œ·¯-<ØŒŸ_ãõ5`ù—×ÕŒÁöêh+Ð~Ƨe/¶g¾¶±p~I‡Ò؈´-x’GnC\gÄ›tè’H—ü;}JPÚœ—ƒVÞ¦éܥܥ-ó ŸÊ¾`òÆx´¤ðoÛ¡ ?m”å€)ͲžÜð,#ï——ÑÎmYŒ7( ¹eÖ! QFªK²àuy¿<úиyyhÎ@‹Z‘xÍ8yvC|ðº|=ë‡e"z$"À3©'-º’\¸läϹL)S¢1H;´ÙŽóÏíœÛ2Ç——MŠÆOC90¹÷“ó.d~HÃ甩&]§”™{Âx—Ñ|4eJ’sip6R{üºW7iXÒ£rg¸³~;™eÏÜ@äJ¡æ½ešÏå*çÄ\^ÜX©9Móg©K®×­H=R›d\×ÜVµèÄå&uÆû±Õ•Y‡tø<èH¹K`J€’üS¸µˆÙ®];u£E5.p 0›Ç–“gaø¤Y›÷ñúR¹’$/”úpž¤çóSŠœŸo2õæós¾P¥9¹8à—J^©Ž¦d®[]âyp^—ƪET9VéÀdÔ´é2‘ŒHÊÚŽF£.Û‘ÎY®•ðˆIÓ,›.´u?^yô”N‰Û£¦t¨)œ)™²H´s¡j«ƒO­ˆ(Òj© æ ¥áR}Ù/×­«–YÄKgå\šGxMŸ’j·¹¹ÙÅ\–XtO:~© é`eÊËI‚Ó–5ryÛ¢¦kŽI çàl×®ÉÉÉêT2J0íž•r}¾ÔLßy:DdËõ¥ñÛ""µÍ½”ö¼‰œŒL£9¸å‚•áJäÆÊÛ—u¹È1P™h4Š””ÖÀÁëñ±ÊÔJ+wñêj©0?4'/#°ælµk\|üü ¦KÑi|š.¤\©¾L @ÞŽ-SЂÓIeyEjL†ùD€© ïÜ/塹 oW ‹ $PJ@qeH…jQH¦Þd¬T‡xäžVKG94Nîx4åIÞ)õ’Ί÷%A-‘- ácå2&ã'žµgÃrŽ)ëËùf¢º”2àS jÆ%3 Ûøx{¤KyÈì…וúä$Áɯó1¹"£H±©}W*Ë ‹ˆ š*ò] RYR@2••žAzVò€d¸¤1IerCÑ@É…ÄÓfêK*…ƒCÎ)Œ1¨ªªÂ’%K––†û·K¸.7VÞ§4$™ÖÉzÜx?Òé‘ñѸej)‰¬KZs"rœÚüKFM-Å‹ÊO?ý‹/Æ<€þýû{äÀÁÇÓX>-áíI™JýkÓ )#M7Ú¹mŒˆRv®T–£š®qPÊFIY6`ÊÎå" 7<ò9PÈKÛÒùiKa9ñ>¸°)…>ÐòRéE‹9¨3räH´oß^—T,Ý—‹Úmr±Ù—‹6&É‹R.»Ù€ŒœÜ;Ð}2h-šiLë\3<Þ6•§PÙ–<×€É$½¬&ÿŸþ韰bÅ c\Í'½žl›R5¹iŠä¼óO)9^éÑm!žÁQyMR§‰¶aÓ% 4GŽÁË/¿ŒÇÜÃ'?ç€GrŽ*£¹_~ºû>ÀÔø’m§hH€×SúlÍ€lÊÓŒ”÷Ÿˆ§µS žÆÃÁï×.téÒŸŸïü(6¸ÒzÙ·&Í8l¶6¤Pˆ¨=îYmQ_ãËvŸ”Î$dtöóÀ’_¿¨ÓÚ±T†ÝIDATK£K4}¶ÕÑdOö~NE’ß¹®´õ ä¢frl¼?¿1µ†â\ž«À¤›6#´Í9lŒhó3<Hý(‘¶µ1ð¶5¥Èº¶±Ê9ƒGf͘¥—ýj ‰7¶xõüôÕšºñÀ))]J›“÷(·=j’Q”<ŠjºŒgÇÚ¸ýêû í;?·“”Q’+ÁOÈñÓ<—4ŠKõVñ„—è4þ1^–§Îœ¿x)Ö¥zh[¦p)õãˆÊ'Âk¼L†îñˆ(Ë(å.G®MZ†’(Ï’÷ï[F+«Õó¦¬èœD°1‘È=ÞçÝ^¼r2Õ‘<ðÍÜ›KO @]hÒxý>iSk@øCÔ—ó};wîô”íÒ¥ rss]×x½;wâÅ_ÄÃ?ì*wúôi¬_¿ååå€ÜÜ\:¼jé'3]ß¹s'ÊËË]¼bРA®—ŒKPÊT–GËææfTUUá½÷ÞsdÚ·o_ÜrË-èÒ¥‹'}%àj´Ö­[‡]»v9àÜ¥K 8Ð#cé0hœ;wîÄúõëQXXèÈïôéÓxñÅqúôiL™2Å#MV.½˜6ŠK±XÌD£QÓÜÜlÂá°;v¬`˜Q£F™êêjó·¿ýÍœûÌ;vÌTVVš˜ýû÷›?üФ¥¥føðáæÔ©SæôéÓŽ±,_¾Ü¥¼É“'›óçÏ»Ž .˜ .˜É“'»ÊjÀàGvv¶ ˜ÜV­ZåºOÇÊ•+ÍÅ‹]ãÓŽ¬¬,sìØ1¯ÄïÅ‹ͪU«ã.))q9i¸cÇŽuñüùóæÜ¹sæë¯¿v•[´h‘9uê”>|¸/éééæÄ‰*8Ï;gΟ?ïŒñ¹çžsÀAέ  @• ébåÊ•ÇJåŽ?®ò”ŸŸo•wjNÿ_·QBdŒ{#4Í…îºë.ç-õ=ö˜'ÝÍËËÃĉv,X`ý‹þýû»úÔ^Ì^Þ÷û|û÷ï£Gâ™gžqµ‹ÅpÇw`×®]˜={6Ž9‚³gÏâðáî·ŠWUUaݺuêÿ`677cݺu?~<²²²°}ûvôïßßµ0–ŸŸ±cÇ:ímܸåååž·ËÉù|,Ãĉ±oß><úè£Ø½{7>ùälÙ²Æ sÊÕÔÔ`É’%¾èûøñã±qãF<óÌ3˜4i’ká.##+W®Ä€œöî¼óN|þùçoééé8|ø0fÍšåáoüøñÈÏÏwý«dff¶êÿKÚ€ÙJ2ÊjQ€öïßï€hy÷¨T“Ó† TcâóVV%k¯z4Ƹ¥¡¹¹<ð€«ÍÇÆTTT`„ ƒˆD"ƒxíµ×™™é”Ý´i“ë¯Ü‰ÏÏ>û ¿üå/>ø 222¢àFmŒq?8ƒA§ožÐwú[¢¦¦&תbMM vïÞ èׯRSS`Êq^qÅxíµ×°yófdffâ¾ûîs"½ì›¨wïÞjt#`^~ùåNÙÚÚZ˜tTUU9üÅb1lذÁ³éÀæ´€–”[ûóe¢û©©‡Ã.ùJYK`ò7Ñ777·¼XÀÚK%LZz›ššŠ¢¢"TVVâ†nð€Ò|û\Tþ´‰Ò.©Häw^V>¾ ´™®i?Õ£¾¹QÉC¦–bÓ®]»œ{iii‡Ãžg¸\F#FŒÀˆ#~¸óÐ~ê'wýÈôOË*¨­h4ŠO>ùĹWTTäDÿDIÓ §ÔÔT'*jŽËJ¾ñßÅbmÀü!Irjj*®»î:Ïü³¦¦~ø!Þÿ}ìÛ·ÏÕF4õxÜ@ D<s¾Èè9(eD’À”û¥3‘ý½÷ÞsÎc±Âá°çGÆñdæÑ50Ê}³r<\öúÓŸœ{/¾ø"FŽéÙà®9/~Î'Islšƒá/Ð"i ೉½~â Ú·oæÎ‹ ==7ÝtæÎ‹ë¯¿Þ)ÏSY®409ɇéD5`r¾ùaß$ÇKr–Ûø8¼Ž”…F˜¶5P +ùå»”Úæ˜?is”mÛ¶aþüù¨««ÃwÞ‰ßüæ7èÓ§:Gäû@¹BµheÛ'/“Æ%Éy’Î`ÿþý…B®7WH>m‹U6×QL3~)KYžhïÞ½¸þúëÕT[‹Ü”6þd¶£9?ùšÚ²)ûkæHµµµX°`Š‹‹ ñú믣oß¾®_›hÆÄߩ˯s¢EN¶ˆIó/9ÓRE`ºFÆ"y@å}ÖÖÖâôéÓÈÈȰ¾v„ó̯iÎE‚ØV^‚‰ß§U[zA´m#»¬ëL?ÇÆç–Ä›Ö6Q0[I‰î­­««Ã„ PWW‡`0ˆ%K– ==ÝQ˜goä·Di§LlÀ”(ÞâŸëÚœ‚mŽ$½¿4¨=z¸þûÃ?Ä/~ñ 5åi] ÀP[[‹áÇ'$_>fí\òFѹsgçzEEöîÝ‹^½z%”f×ÕÕÁãzVªõå¥ã½ÄË%—„FßF­¦·ß~Ûù{õÛo¿©©©ôtŒˆoÖæÿùHä·¹@‚Ž F;8ñëò¶UR~pÃ'мKnD›-æÌ™ƒo¼Ñ©›È/@dY[y’7œ´ljÿÏ*y%ßzë-ÔÖÖzRhÙw|ÚpÕ“©-¿î}%Éy£äïСC˜>}º/´Š¾}ûv×KØl2 OmŽ.Ç@e0$’\YYé\—ÑòÀžºÚ|°[·n®rÅÅÅ0R©S§bûöí®òÒ“k©,•ӌʖzIÞùX())ÁŒ3¬ûC·nÝŠÿüÏÿÄüÇ8mrÊþ´]36pjóXÕÕÕ*555˜8q"n»í6•[R>Zú®½ÝÙtà‘vù’-jÈë´ëhIérrr0lØ0ל孷ÞÂG}äªGs™ÚÚZlذ÷Ýw S§Nèܹ3‹-B÷îÝ 9ËáÇñꫯ" âÚk¯uæ{TŸËi›Äm‹~‰GÓ_ÿú×())qø€ÒÒRüâ¿ÀСCÑ£G$%%¡¡¡ü1*++1lØ0ôêÕ+áþ´yª1Þ?å/H#;v¬Ê_ii)®¾új 2Äi·´´%%%HMMu~›é¥ù£ ¤Ü™È¿Eަ ˜­¤@ àÚ­S]]í\çÄ÷mÀôéÓ±víZ°ƒX¼x1òóór .DEEJJJ0wî\ßÖÕW_wÞy@Kš8~üx\~ùåHMMÅáÇQ__k®¹Ó§OÇ“O>é´YWW‡_ýêW€3f 55±X̉äDõõõ¾+¢Ü˜©<9>þ¹sçâßÿýß]å°qãFlܸÑÕF0Ä”)S\ýR{r¿qmm­œ@ÀÃ_CCƒ³XC`IMMUù€²²2”••¹®¥¦¦bÁ‚Îw0þ# %‹¹þúë'Aû£©ž'¥g[*ÛJz饗\[Ï>ýôS¼öÚkžr“'Ov|ˆ***°}ûvTTT`ܸqØ´iRSS‘““ã*WRR‚'žxݺusE±{ï½Ý»ww•=|ø0JJJP__¡C‡bÚ´ižÔ3 âºë®s²®®ëׯwµµqãF8‰Èè7lØàº¾páBÔ××{ÒÉÎ;ã…^ð,IºæškðÊ+¯ sçΞyluuµç§S+V¬ÀÁƒ­ ”ã‘ü%Ê_çÎ1oÞ{ôè[o½Õ¹œ±vèÐíÛ·G‡СC´k×íÛ·wÿ•a0ã“#)˜VñB¡B¡Âá0B¡ ˜rÞÄW ùóA¹b«­ÜjKët“¶Ê§C[¾·Ób÷ð¼Mm…X›¯ÊB`äÀÔþÙZÊ^>ÎÑÆ(ÚâµE|ð¿‘”ÿ™Êy”+äÔ.µA $P¶oßíÛ·wÆïô× ûl#Aš!ËkÚãþ)7H S¤”}Ø x9Û£›!ÚÆ@M·¨ÍX,æÚçiÌwÿÊ£½MÒi‹'¶ÈÎy‘«ž­áOs š¾l<Ð"õCŽŒt«ýöRs t´óI‹(2%²’«ŶҨEM¿~Zÿ¼ÏïiNËAÇûç[ã>EÍáh¿J¡±k áò¡{‰ò§9FÍñÙÊÈÕaž‘xw,Ïc©Í6`^I£å@áWR<ñåvqm^V¶«EYí\–ó‹šüÍd Ç Gm¯j¢†ïÕyôã2’ΑÚJ”?þ=òÏ,´2Ò>¤ÝÈvÚ€y‰¤yvŠ&|uQ‹r®'Ó,ùúó¦fÈÙæ|Ú˜ø'(Î _ֳͥñKYÚøãe¸lxTâó8¼‰ð§éMK5ÝóèËËð6ø2ž“mf+H 1uÿ™/•·¥r”Ò(ø'ïÛ¶ÛE‹2rng»gK§xß6`HäQòD}k[5õ3ü@ àz‡’漸\åÏ9©=™-ÈÈûãöÀëkàÔì« ˜—HÒ€ä¿`Ë”K‹–xµþlóKªoOk"cá×éSK¿ˆä6> |¶ñrYqãçˆæ€4§gG¢üi»£¸,´UZ `|ñŠó¦m¿³é² ˜ OKè»L]%(ã(`ßÇÊ?eÄä¤E‚xcÒRY~_–“‘Íæh´±ð1Ç‹Jdü|!úókƒd¤e­åO=éœóÉQ{°å3QÍñÐg0 nô]FKéýý¢%?וȾdŸÚb_ªolZ”±õ­yx¿±pÞâEM N[DÒÒO¿±h€´S‹¬Dr‘ÏÆŸä‘וQÓÆóÿf`v$Ç)û?FÒ@%ÐjWš¹4ƒÒ¼8ïOö«)SkW¨4oÛv_ë_’Ö¿­Œ–-hÎ.Þ|ZžÛx»þ$¯¼}í±—™ÍÁjNGÎ[ÿ/DÌÀ·ð@ÿ¿îíåé,)ˆƒ2øî!³_$”FÕÚ´S’f¬¶6ý@¨v"Àµ9m¼€=²óˆ¬ÓÏéøÁ¦[›~™G¼UÕxõd ,§&ÀÿÅ©ùö3Šÿá(ÊHÂŒÅb.PÊ•B-£s¿ûZßüÜ–®%b´ZÛñ€iãAòžHŸ¶4”;<@ô¡E¤D2‚KáÏo7–LéµH-ÇEuåê¶í½»m{e[ARÁÚ*ž6Ÿ±µ¥ESI6Púñ˜h›‰R«ë‘ä¹çÑ,9N[ª(ÏýÆòCñÇyä|ÅëS“|ôÂùif+IK‰´……xQKÍûóóD”hj¬'B~ó¸DÉæ@ø8µs­/­þÅç§5:áå8­Ï2Û€Ùz²Íå¹_]í»0å÷DæQñ¨5€l-xýÈ6ßã}µÖèHJ„?ú¼T§¦¦¯ìûÿKÕÄëÖËÛIEND®B`‚libcommons-launcher-java-1.1/xdocs/images/launcher-logo-white.xcf0100644000175000017500000005744610034044764024530 0ustar arnaudarnaudgimp xcf fileæQBBK/ gimp-commentCreated with The GIMP¦ î$ø4 ]C‘laucherÿ     J$JR‘n Ö â‘†Ï à€€€üq9úÿÿª7ýÆÿÿþª8ÿþª:ûªÿÿª:ûªÿÿª:ûªÿÿª:ûªÿÿª:ûªÿÿª:ûªÿÿª:ûªÿÿªý8qªªýUUþUUþ8ü8ª8üqªûªÿÿªøÆÿÿªªâÿÿþýUqÿÿüUÆÿÿþª÷8ÆÿÿUÿÿûªÿÿªûâÿªþUÿÿþþÿÿûâÿÿªýUâÿÿüUªÿÿûªÿÿªûâÿÿþÿÿþUÿÿûªÿÿªüqÿÿøUªâqûªÿÿªþ8ÿÿþ8ÿÿþUþUÿÿûªÿÿªÿýâªûªÿÿªþUÿÿÿþUþUÿÿûªÿÿªÿþqûªÿÿªûâÿÆÿþUþUÿÿûªÿÿªÿþUûªÿÿªýUþÿÿþUþUÿÿûªÿÿªÿþUûªÿÿª üqÆÿÿþUþUÿÿûªÿÿªÿþUûªÿÿªù8ÆÿâÿÿþUþUÿÿûªÿÿªÿþUûªÿÿªúUâÿ8ÿþUþUÿÿûªÿÿªÿþUûªÿÿªúªÿâ8ÿþUþUÿÿûªÿÿªÿþUûªÿÿªúâÿâÿþUþUÿÿûªÿÿªÿþUûªÿÿªûÿÿqÿþUþUÿÿûªÿÿªÿþUûªÿÿªÿþUÿþUþUÿÿûªÿÿªÿþUûªÿÿªÿþþ8ÿÿþUþÿÿþUþªÿÿþªÿþUûªÿÿªþâÿÿþUüâÿÿûqúâÿÿâø8ƪªÿÿâÿþUûÆÿÿÆþÿÿùƪÆÿâÿÿüªÿ8þÿÿøÆªâÿªªÿÿÆû8ÿÿþqþqÿÿþqþâÿÿûÆÿÿþUþÆÿÿòªªÿÿâqªÿÿýâþ8ªªþ8ùâÿÿª8úâÿÆùâÿÿª8üªâqþqªªª€€€ü8ª89ú8ÆÿÿU7ýUâÿÿþU7üqÿÿþU:ÿþU:ÿþU:ÿþU:ÿþU:ÿþU:ÿþUüªq ý8qªªýUÿþUùqªªq ùUªªUÿýâUù8ÆÿƪÆÿÿþqÿûUÿÿýâúqâ⪪ÿÿüâUÿÿýâûUÿâ8þUÿÿþªÿüUªÿÿþâüªÿqýªÿÿýUªÿÿþqûUÿâþªÿÿþ8ÿ÷UªâqªÿÿþqüªÿqþÆÿÿúâÿÿÆûÿÿqþqÿÿþªÿýâªûâÿÿªü8ÿâþUÿÿýÿÿûÆÿÿþ8ÿÿþÿþûÿÿâüÆÿÿýUÿÿûÿÿÆûUªÿþUþUÿÿûÿÿUUÿýUÿÿûUÿÿªÿþUþUÿÿþUÿ ÿýUÿÿûªÿÿªÿþUþUÿÿûªÿÿU þUÿÿûªÿÿªÿþUþUÿÿûªÿÿU þUÿÿûªÿÿâÿþUþUÿÿûªÿÿ þUÿÿþªÿÿþÿþUþUÿÿûªÿÿÆ þUÿÿþqÿÿþqý8UÿþUþUÿÿþÿÿþ8 þUÿÿþUÿÿþâþÆÿþUþUÿÿþUÿÿþÆ þUÿÿÿþªýUÆÿþUþUÿÿÿþªüUÿÿþÿÿþªüUÿ8ÿþUþUÿÿþÿÿýªûâUÿÿþâÿÿ÷âUUqÆÿªÿþUþUÿÿýâÿÿþªUUúªÿâqÿÿþýâÿÿýâþÿÿþqþqÿÿþýâÿÿûââÿÿýªýâÿÿýªýªÿÿýâ8ýâÿÿýªýâÿÿü⪪þqýqÆÿÿýª8þqªªªþqýqªÿÿýÆqþþþ±ö88ª8ø8ÆÿÿUUÿÿþ8ýUâÿÿýUÿÿøª8qÿÿûUƪqÿÿýªÿöƪ8ââÿÿýâýÿUÿþqýÿUÿþU ÿþU ÿþU ÿþU ÿþUÿþUý8ÿþUþâÿþUþqÿþU ÿþU þÿÿþª ýªÿÿýqþqªªþqH$¯<Drop-Shadow#2Ì     CK ˜¯< ´$à$ì¯< Ì$ðR7 1/þ,ù÷)ø  ö '÷ ö 'õ ô %ç  $æ  !ç !$%$#  ã "&)++)%! ä !'+/00.*%  ä $+04653/*$  ä  '.48::84.("      æ ")17;>><72+%ü      æ #+39>AA?;5/)#ýøç $,4;@CCA=82,'# ûüýùã $-5DHIIGC@<98778:;=?ABCBB@?=<;;:û975311÷2468:<==Ù %-6>DHJJHEB><;:;<>@BDGHIIHGEDBAAï@?=;865579;>@BCCØ %-6>DHJJIFC@>==>?ADFIKMNONMKIHGFFïEDB?=;::;=@CEGHHØ %-6>DIKKJGDB@?@ABDGJMORSTSRQOMLKKïJHFCA?==?ADGIKLMÅ %-6>DIKLJHFCBAABDGILORUWXWVUSQPOONMLJGDBAABDGJMOPPë %-6>EILLKIGECCÜDFHKNRUWY[[ZXVTSRRQPOMJGECCEGJMOQRSÅ %.6>EJLMLJHFEDEFHKMPTWZ\]]\[YWVUTTSQOLJGFFGILORSTUÅ %-6>EJLMLKIGFFGHJLORUX[]__^\ZXWVUUTSQNLJHHILNQTUVVñ %-6>EJMMèLJIHHIJLNQTWZ]_``_][YXWVVðTSPNLKJLNPSUVWWì $-6>EJMNNMKJJîKMNPSUX[]_`a`^\ZXWWïVUTRPNMMNPRTVWXW× $-5=DILMNMLKKLMNPRTVY[^_``_][YXWVVñUSQPOOPQSUWXXWð $,4@ABBCDEGIJLMNOOPPñOMKIGFEEFGHIIJIIJúKJJIGâ !'-268:;<<=>@ACEFGGHIIñHGFDB@?>>?@BCCDDüCBAÛ #(,023455679:<=>?@@AA@@?><:877û9:;<==û<;:9ä "&)+,--./01245677887ò65310/../0234554ü321å "#$%&&'()*+-..//.ñ-,*)('&&'()*+,--,+ü*)(ç  !"#$%%&&%ò$#"  !"#$$#"ý! ð úûúüô ûûüþö      þ ÷       ü     þ© 2.üþü+ûù)ø  ö (õ õ &ö õ %ç  å   ô "%%ï"  à  %(+,+)%! ß %*.121/+&!  ùÞ $*/478851,&       ø Û !(.49<>>;72,&  þÅ  &,28>ACCA=82,&  ö  Ï $*0683.)%! !!"#%&'())ô*))('%# Ð!"#%')-27=CIMPQOMID?950,($!(()*,-.001221÷/-+(%" Ñ !#$%&')*,.16;AFLPSTTQNIE@<840,(%#!/01246789::ö97530-*(&%%&Ò'()*,-./0259>CINSVWWURNJFB?;840-*('789:<>?@AABBAö?=;8520.-,,-.×/0123469?@ACEFGHHõGFEB@=:7543323Ú45578;>BGMRVY[[ZXURPMKHFC@=:87DEFHIKLMMÉLKIGDA?=;:9887665566789=;98766Ý789<:8665679;>CHMRVYZZYXVUTTôSRPONMQQRSUVVüUTRQQüRTUVVñUTRPOMJHEA>;8644ì579=AFLQUWYYXVUTSTUVVýUTSSTýUVWWõUSRPPQRTVXYYáXWUTROLHD@<85322358;@EJOSVWWUTRRûSTVXYYXUVøWXWVURPOOúQTVYZ[[óYXVSPLGB=95311ò369>CINQTUTSQPPùRTVXZ[\\VWáXWVTQOMMNPSVY[\]^]][YWSOJD?:6300è148=BGLPRSRQONMNPSUX[\]^^ýWVWWÃVUROMKKLNQUX[]^__^]\ZVRMGA<731//137CGJKKJHFEEFHKOSVXZ[]^SRRQQPOMJGDCBCEHLORUVXYZZ[[ZXUQMHC>:754469=AEGIIHFDBBCEHLORUVXYZPOONNMLIGDA@?@BEHKNPRSTUVWWÐVTQMID@;854458;?BDEEDBA??@BEHKNPRSTULKJJIIGEC@><<ó>ADFIKLMNOPRSS‘RPMIE@<8543469ADFIKLMNOFEEDDCB@>;97789<>ACDEFGHIKLMNNLJGC?;74212358:<==<:87789<>ACDEFGH@?>>==<:86422Ú468:<=>>?@ACEFGHGEC@<841/../13567765322ô468:<=>??@8776Ä5320.-,-./134566779:<>?@@?=:740-+*)*+-/0110/-,,-.0134566770//.ú-,*)'&&ú'(*+,--.ð01356787641.+(&$$ö%'()**)('&&ò')*+,--../(''&&ú%$#"!  û!"#$%%ä&'(*+-./.-,*'$"  !"##"!  û!"#$%%ý& úýê !#$%&&%$" þõûëþûöþ    û û           û   þ       Ä    öù       ô ö ûò ñ ûñ è  ð ö !#$$#"ú#$%&'((ð'%#  ÷ "#%'(*+,,+*ç+,-/0110/,)%! ð&'')+,.0133443322ç35689::9730+&! .÷/024579:;;:ç;=?@ABA@=95/*$ 6÷789;<>?@AA@æABDFHIIHFC>93,& >ø?@ABCDEFFäEFGHJLNONMJFA;4-&  EFGHIæKLNPRSRPMHB;4-& LKJKæMOQSUUTRNHB:3+$ RQøPONMLKKJJäKLNPRUVVURMG@91)" WõVUTRPNLKJIHHåIKMORTVVTQLE>6-& [ØZXVTQOLJHGFEFGIKNQSUUSOJB;2*" ^õ][YVROLIFDCCæDFILORSSQMG@8/' `Ù_][WTOLHEBA@@ACFJMPQQOKD=4,$ aÚ`^\YUPLHDA?>>?ADGKNOOMHB:2)! `Ü_]YVQMHDA>=<=?BEILMMKF@8/' Ù^__^\ZVRMIDA><;;=@CGIKKHD=6-% Ù[\]\[YVRNIEA>;::;>ADFHHEA;3+# ýWXYYßWURNIEA=:989;>ACEDB>81)! ÚQRSTUTRPLHD@<97678;=@A@>:5.' ÚJKMNOONLIFB>:7433569:<;960*$ ÚBCEGHIHGEA>:6310/02456641,'! ð9:<>@AA@><852/,++ì,./00.+'" ú0135788ø642/,)'%%ì&'())'%" ú'(*,-//ó.-*(%#!  !""ò!  ù !#$%&&ä%#!  ùùð  úúó   û û   ÷     ü ö ú    ÝW+×commonsÿ     %œ×%¸44×%Ô)Ù-×2~€€€ý8qªªüUý8Uªªýq8üq8ýqâÿÿýª ýqâÿÿüâ úUªÿÿUõ8âÿÿ8ªÿÿþUôUâÿÿ8qâÿÿþUüqªÿÿþUúUÿÿÆþÆÿÿþUþqÿÿþUþªÿÿþªüªªÿÿüUÆûUÿÿâþqÿÿþâþUÿÿþUþªÿÿþªþqÿÿùªÿÆ8ÿÿþþÿÿþUþ8ÿÿþÆ þâÿÿþUÿþªûâÿÿþÆÿÿþþÆÿÿþU þ8ÿÿþâÿþÆþqÿÿþ8úâÿÿUþ8ÿÿ þâÿÿþqÿþªþÆÿÿ þþªÿÿþÆ þÿÿþÆÿûªÿÿþÆÿþª þ8ÿÿÿûªUÿÿþªþÿÿþª ÿþ8ÿûªÿÿþªþUÿÿþª þâÿÿþUÿûªªÿÿþªþUÿÿþª þªÿÿþUÿûªªÿÿþâþUÿÿ þªÿÿþUÿûªªÿÿþUÿÿ þªÿÿþ8ÿûªªÿÿþUÿþU þªÿÿÿûªUÿÿþÆ þ8þâÿÿþ þªÿÿþÆÿûª8ÿÿþ8 ýUâþÿÿþÆ ÿþqÿþªþâÿÿýâ ü8ÿ8þ8ÿÿþ8 þÿÿþÿþªþqÿÿýªü8âÆþÆÿÿþ þqÿÿþÿþªþâÿÿýâ8ûqÿÿþÿÿþûâÿÿâÿþªþUÿÿýâUUúâÿÿUþUÿÿþÆúqÿÿâÿþªþUÿ ÿþUþUÿÿþªúUÿÿâþÿÿþªþUÿ ÿýâU ý8âÿÿôâqUÆÿÿÆþqÿÿþýÆÿÿý ýqâÿÿýÆ8üUqÆÿÿýâªýUªªýUý8qªªýU ª€€€ù8qªª8ùUªª8 ý8ùUªªqùUª8ÆÿÿýÆýqâÿÿýÆúqÆÿÿýqâÿÿþýÿÿþÿÿþÆý8âÿÿþâü8ÆÿÿýÆÿÿþqþqÿÿúâUUÿÿùqUÿÿªUUýâÿÿþqüƪÆÿÿöUâÿÆqUUÆÿÿùªÿâUUþ8þÿÿúâUÿªýâÿÿþâþÆÿÿûªÿþqÿÿûªÿq þÿÿþªþqÿÿþ8þUÿÿþUþâÿÿþU þ8ÿÿþÆþ8ÿÿþUþUÿÿþqþÿÿþq ÿþªÿþªþUÿÿþUþUÿÿþU ÿþªÿþªþUÿÿþUþUÿÿþU ÿþªÿþªþUÿÿþUþUÿÿþU ÿþªÿþªþUÿÿþUþUÿÿþU ÿþªÿþªþUÿÿþUþUÿÿþU ÿþªÿþªþUÿÿþUþUÿÿþU ÿþªÿþªþUÿÿþUþUÿÿþU ÿþªÿþªþUÿÿþUþUÿÿþU ÿþªÿþªþUÿÿþUþUÿÿþU ÿþªÿþªþUÿÿþUþUÿÿþU ÿþªÿþªþUÿÿþUþUÿÿþU ÿþªÿþªþUÿÿþUþUÿÿþU ÿþªÿþªþUÿÿþUþUÿÿþU ÿþªÿþªþUÿÿþUþUÿÿþU ÿþªÿþªþUÿÿþUþUÿÿþU þÿÿþâÿþÆþqÿÿþUþqÿÿþ þqÿÿþUþqÿÿþþÆÿÿþÆþÆÿÿýâøU8qÆÿÿ÷ªU88qÆÿÿ÷âU8UâÿÿüÆUüUâÿÿóâUUª8qª ªûqqª ªýq8ª ª ªü8ª€€€ªýqüUªªýUü88ýqªªþUÿþ ý8Æÿÿýª8 õ8âÿÿUÿÿýâUÿþ ùÆÿÿÆUýUÆÿÿþªüUªâÿÿûU8âÿÿûUªÿÿþú8âÿÿªþUÿÿýâªÿUøÿâUUâÿÿþâþUÿÿþúâÿÿªþUÿÿýâþªÿÿûâÿªþÆÿÿþUþÆÿÿþâþâÿÿþþÿÿþªþUÿÿþUþ8ÿÿþªþÿÿþqÿÿþª þâÿÿþ8þUÿÿþqþâÿÿþâþUÿÿþUþâÿÿþU þÿÿþÆþUÿÿþUþªÿÿþUÿÿþUþUÿÿþ þ8ÿÿþþUÿÿþUþªÿÿþUÿÿþUþªÿÿ þâÿÿþUþUÿÿþUþªÿÿþUÿÿþUþÆÿÿ þªÿÿþþUÿÿþUþªÿÿþUÿÿþUÿ þÿÿþªþUÿÿþUþªÿÿþUÿÿþUÿ þUÿÿþªþUÿÿþUþªÿÿþUÿÿþUÿþU þUÿÿþªþUÿÿþUþªÿÿþUÿÿþUÿþU þUÿÿþþUÿÿþUþªÿÿþUÿÿþUþªÿÿþª þUÿÿþUþUÿÿþUþªÿÿþUÿÿþUþÿÿþâ þUÿÿþþUÿÿþUþªÿÿþUÿÿþUþ8ÿÿþ þªÿÿþÆþUÿÿþUþªÿÿþUÿÿþUþâÿÿþ þÆÿÿþqþUÿÿþUþªÿÿþUÿÿþUþqÿÿþâ þÿÿþâþUÿÿþUþªÿÿþUÿÿþUþÆÿÿþqþÿÿþ8þUÿÿþUþªÿÿþUÿÿþUýâÿÿþþÿÿþUþUÿÿþUþªÿÿþUÿÿþqýâÿÿýâúâÿÿUþqÿÿþUþâÿÿûÆÿÿþÆýªÿÿõ88ÿÿâUþâÿÿþÆþUÿÿüqâÿÿûÆqUý8Æÿÿýâqü8qâÿÿ÷âUUªÿÿ ªþ8ýUªªýq8 þqª ªþ8ªªVVV ýUªªúU óÿÿ⪪ÆÿÿªÆÿûÆÿâ8ý8Æÿÿûªÿÿ8üâÿÿû8ÿÿÆü8ÿÿûÿÿªýªÿûªÿÿâýUÿþªÿÿþqþÿþqÿÿþqþ8þÿÿýÆ8þÿÿýÆ þªÿÿý þÿÿýâq ý8âÿÿýâ þqÿÿýâU ýÿÿýâ ýªÿÿþýªqþUÿÿþ⪠þÿÿýªÿþÿÿüªÿqÿþÆûªÿâþÿÿþqûªÿÿªûÿÿªþªÿÿýÆ8öÿÿªÆqøªÆªªÿÿ⪪ÿýâqªþ8ý8ø8UªªUk 5õ8 Drop-ShadowÌ     ÿÿÿúÿÿÿú94Èõ84ä]+]7õ85?PIýTÔU  þþþþ øúùù ô  í     ù  ò ÷ ø ø ×  øî ÷ôøí  !#$%%÷$# ó!"##$%%ù$" Ð  "$&')*+,,+*'%"!#$&'())*+,,ú*(&#!é !$&(*+-.0122ç1.,)&#! !#$'(*+,--./02344ú31.,)×  #'),-/01346787642/,)(''(*,./11223û568:;;û9752ß !&*-/12334679:;<;9742/..è0245677665668:=?ABCB@=:ð "',024566Ù78:<=>>=;97544579;<==<:9878:>á=;:99:<>ABCCB@=;988:=@EIMOPONKâ &-38;==<:8655679;<=>==å>@BEGIIHFC?;9779<@FKPSUVTRÅ $+29=@AA>;853223579:;<==?ADGKMOOMJE@;7556:?EKQVZ[ZXé  (08>CEED@<830..Ü024689;=@CGLPSTSQLGA;63237=CKRX\__]à $,5=CGJIGB=72.+))*,.1369<@EJOTWXWTOHA:40/04:AJRY^abaè '09AHLNMID>71+(%%Ý'),/26:@FLRW[\[WQIA93.,-17?HQY_cddà  )3=ELPRPLF?70*%"!!"$'*.38?FMTZ^_^YSJA92-*+/5=FOX_dfeà ",6@HOTUSOIA81*$!!#'+06>ENU\`a`[TKB91,))-3;DNW^cffà #-8BKSWYWRLC;2+% !$(.55-'" #'-471,)&%&'*.3:AJRZ_bc`ZSJA93/-/28@HOUY[[à !+6ALV]bdd`[TME>83/,*)*+.38?GOV\`a_ZTLC<610149@FMRUWWã (3>IS[aeec_ZSLE?:52/--â/27=DKRX\]\YSME>94336:?EJOQRRà %/:EOX_ceeb^XRLFA<741/./149?FMSWYYWSMF@;7557;?CGKLMLÅ !+5@JS[`dec`\WQLFA<741/./15:@FLQTUSPLGB=9778;>ADFGGFÏ &0:DMU\`bba]YTOID?:51.-,.04:?EJMOOMJFA=:88÷:<>@AA@?Ä !*3=FNUZ]_^\YUPJE?:50-*))+.27=AEHIHFC@=:87789:;;:98Ð $-5>FMRVYYXVRNIC>83.*'%$%(+059=@BBA?=:8755ü421Å &-5=DINPRQPMID?:4/*%" !$(,048:;;:875321100/.,+*Ø %,3:?CFHIHEB>94/*%! $(,/133ò10/.-,+*('%$#Ö $*059<>?><:62.)$  #&)+,,ò+*)('&%#" È !&+.134431.*&"!#$%%$$#"! É !$')**)'%" ò   õ ö ö Ú   õ ô é   ö  ö  ÷ ø øù "    þü      ú  ô      ø ø   ë  üø  ÷ ó ûöø  öî !!û"#$$%%û$#"!  !þ"##ø!ö !!ð"#$%!$&'))*û+,-.//õ.-,*))()*+,,ì*(%!"$&())**ú+,-.÷ #&*-/12334ü57899ú8764211ü23455í31-*&" #'*-01233í4567'%%&(+/369;<==<<ó=>@ACCDCB@><::ý;=>>ì=:62.)&$$%'+/37:;<=<<ñ=>@/--.037<@CEFFþEDDûFGIKMMÞKIGECAABCDFGFEC?:51-+*,.27<@CEFFEDDEFH86558;@DILNOOMLKJJLNPSUVVTROMJHGGIJLMNMKGB=841125:?DILNONMKJJKLN@>==?CHLQTVWVTRPOOPRUX[\]\YVSPMLLMOQSTTRNID?:778;@FKPTVVUSQOO€ÅQSHEDDFJNSX[]][YVSRQRUX\_aba_\XTQONOQTVXXWTPJE@=<=@EKQWZ\\ZXUSQQSVOLKJLOTY]`ba_\XUSRSUY^adfec_[VRPOPRUX[\[YUOJEA@ADJPV[_``^ZWTRRTWUSQPQTY]adedb^YURQRUY^bfhgea\WSONOQUY\^^\XSNHECDHMSY_bcb`\WTQQSV[XUU€;X\`dggfc^YTPOPSW]bfhhfb\WRNLMPTX\_`_[VQLHFGJOU\aded`[WRPOQT_\YXY[^bfhhfb]WRNLMPU[`ehhfb\VPLJKNRW\_a`]YSNJHHKPW]befd`[UPMLNRb_\[[]`dgiifb\UPKIJMRY_dggea[TNJHHKPU[_ba_ZUPKIJLQW]beec_YSNJIKOca^\\^adgiheaZTMIGGJPV]befd`YSLHEFINTZ_ab`\VQLJJMRX]beeb^WQKHGHLda_]]^adghhe`YRKGDEHMT[`dec^XQKFCDGLRY^ab`\WQMJJMRW]bdda\VOIFDFJda_]]^adghgd^XPJEBCFLRY_cdb]WPIDBBEKQX^aba]XRNKKMRW]adc`[UNHDBDHc`^\\^`cfgfc^WOICAAEJQX^bca\VOHCAADJPW]aba]XSNKKMRW]acc`ZTMFBABG`^\[[]_cegfc]VNHC@@DJQX^aba\UNHB@@DIPW]aba^YSOLLNRW]acc_ZSLFB@BF][YXY[^befeb\UNGB?@CIPW]ab`\UNGB@@CIPW]aba^YSOLLNRW\`cb_YRKEA@AEZXVVWY]`deea\UNGB?@CIPW]ab`[UNGB@@CIOW]aba^YTOLLNRW\`bb_YRKEA?AEUTRRTW[_bdda[UMGB?@CIPW\`a`[UNGB@@CIOV\`ba^YTOMLNRW\`ba^YRKEA?AEPONNPTX]acb_[TMFB?@CHOV\_`_ZTMGB@@CHOV\`a`]YTPMMNRW\_a`]XQJEA?AEJIIJLPUZ^``^YSLFA??CHNU[^_^YTMGB@@CHNU[_`_\XSOMLNRV[^`_\WQJD@?ADD€2EHMRW[^^\WQKEA>?BGMSY\]\XRLFA??BGMSY]^][WRNLLMQUY]^]ZUOIC@>@D>=>@CHMSWZZXTNHC?==@EKQVYZXUOJD@>>AEKQVY[ZXTPLJIKNRVY[ZWRLFA>=>B778:>CHNRUUTPKE@=;;>BHMRUVTQLGB><<>CHMRUWVTPLIGGHKOSUVVSOID?<;CHLOPNKGB>:88;>CHLOPPNKHECCDFJMOPPMID?;878;))+.27BFHIHEA=96446:>BFHJIGEB?>>?ADGIIÂGC?:64347"#$'+059=?@?<952/..037;>@A@>:731//147;>@AA@=;9878:=?AAí?<841/./1!$(-1466×41.+)((*,/2578752/,*))*-035788753100134688È630-*)()+!%(+-.-+)'$#""#%(*-./.,*(%$##$&(+-.//.-+*))ü+,.//ú-+)&$""î$!#$%$#! ë #$%&%$" !#$&&õ%$#"!!"#$%&&ú%#!î óû÷úõ õûûî ü  û õ û  ó                õ ü 9 þ,  ú   ô û üþþ     ù ÷  þ  ù ÷ üþö õ ú  é ö  õ ùõ%%û$#"!  ü!""##ö"   óë !"#//õ.,+*)(()*+,,ç+)&# !"#$%%ù$#!ô"$')+,,899õ875321122455Ç42/+'" "$%&'()*+,--,+*(&#"!!"$'*.13566BCDCCA?=;::ü;<=>>å<84/*&" "%')*+,-./012344Ê20.,*))*-037;=?@@JLMMLKIFDBAABCEFGFDA=83.)&%%&(*,.01122Ã34689;<<;975321358=AEGIJJQSUVUTQNLIHGHIKMNNLJE@;61.,,-/2456766è5679<>ABCCB@><::;>AFJNQSSÚVY[\\[XUROMLLMORSTSQMHC>964468:;==<;988‰9;>BEHJKJIGECBCFINRVY[[ZZ]`bba^ZVRPNNPRUWYYWTOJEA><=>@ACCB@>;9889;?CHLOQQPOMKJKMQUY]`aa_[_cefeb^YUQOOQSWZ\]\ZVQLHFDEFGII€ùGD@=9778;?DIOSVWWVTRQRTW[_cefebZ_dghgd`ZUQONPSV[^``^[WSOMLLMOPONKGB=86458=CIPUZ\]\ZYWWY\_cghigdY^cghhe`ZUPMLNQUZ^acb_\XUSRSTUVURNIC=74236;AIPW\`aa`^\\]`cfikjhdW]bfhhe`ZTOKJLOTY_bdec`][YXYZ[[ZVQJC<61/028?GOW^bdedb``acehklkhcT[`eggd_XRMIHIMRX^cfgfda_^^€=`a`^ZTLD<50--055.*(*.5>HQZaeggfeddegijjhc]LSZ_bb_ZSLFA@AFLS[bgijjhggÂijkkid]TJ@70+)+/5>GPX_ceedcbbdfhiigb\LSY_bb_YSLEA@AELS[afijihffåhijjid^ULB92-+,/5=FNV\`bba``Ãbdghhfb\KRY^aa^YRKEA?AEKSZafhihfeddeghigd^VMD<50-.16=EMTY]^^]]…^`ceggea[KRY^aa^YRKEA@AEKSZ`eghfdbaabdefeb^WOF>830037=DKQVXZYYXYZ]`cefd`ZKQX]``]XRKEA@AEKRY_dffdb_^]^_abb`\WPHA:63358>CINRTTÂUWZ]addc_ZJQW\__\WQKEA@AEJQX^bcca^[YXYZ\]^]ZUOIC=86569=BGJMNONNÃPRVZ^aba^XIOUZ]]ZVPJDA?@DIPV[_``]ZWTSRSUWXXVSNIC>:878:=@DFHIHHÛJMRV[^_^[WGMRWYYWSMHB?>?BGMSX[\[XUQNLLìNPQRQOLGC?;9889;>@ABBAÂBDHLQVY[ZXSDJOSUUSOJE@=<=@DJOSVWVSOKHEDEFHIKKJGDA>;97789:;<<;::Ê<>BGLPTVVSO@EIMOOMJE@<989<@EIMPPOLHD@><<=?ABCCB@>;976556ý5433’57;@EJMOOMJ;?CGHIGD@;85457;?CFHIGDA=9654568:;<;:9754221100/.-,+,.049>BFHHFC48?@><-14677641.+*))+.13677530,)&%$$%'(*+,,Ú+*)('&%$"!  "&*.256764&)+-./.,)'%##é$&)+-..,*(%" "#$%%â$#"! #&),-.-+!#$%%¢#" !#$%%$" !#$%$#ä ûýú  û î ú û   þù û   ð  ü      þ  ú ô üþ   ! ˜ ˜ ˜×*   þþ    ù÷÷ ú     öö ù ô ì ñ þ#$$%ì$" ñ -.Ù-,)&"  678ö753/+'"ø!#$%&&ï%$#! @?ê@AA@?<84/*%" !#%(*,--í,+*(&# ýIHGGþHIIÙGEA<71,)&%&'*-/1344321/-*'# ýQPNNÖOPPOMJE?94/-,,.1479:;::8641.*&! æWUSRRSTUVVTQLF@;632247;>@AAì?=;851-(# ü\YVUUÖWYZ[ZWRMGA<978:=ADFHHGEB?<840*% Ð_[XVUVX[]^^\XRLFA><=?BFJLNNMKHD@<72,'! Ð_[WUTUX[^`a_\VPJEB@ACGKNQSSRPMID@:5/(" Ð_ZVSRSVZ^aba^YTMHDCCFINRUWXWURNID>81*$ Ï^XSPOQTX]acc`\VPJFDEGKPTXZ\[YWSNHB<4-& Ï\VQNMNRV\`cca]WQKGEEGKPUY\^^][WSMG@91)" ÏZTNKJKOTZ_bcb^XRLGEDFJOTY]`aa_\XSLE=5-% ÏYRLIGIMSY^bcb^XRLGDCDHMRW\_bcb`\XRKC:1)  ÎWPJGFGLQX^bcb^XRKFBABEJOUZ^acdc`\WPH?6-$ ÎVOIEDFJPW]acb^XQKEA?@BFKQV[_bddc`[UMD;1( ÎUNHDCEJPV]acb^XQJD@==?CGMRW\`bdcb^XQH?5+" ÎUNHDCEIPV\acb^XQJD?<;;:;=@EINSX\_aa_[UMD:0& ÎTMGDCEIOV\`bb^XQJD>;99;>AEJNSW[]^]ZUNE;1( ÎSMGDCEIOU[`ba^XQJD>;98:<>BFJNRVYZZXSMD;1( ÎRLGCCDINUZ_a`]WQJD>;989::8789:@CFIJJIE@:2*" ÎJEA?>?CHMRUWVSOJD?;75445678:<>@BCCB?:4-& êEA=;:BFHJIGC?;630/..è/0123455430,'" ê95311247;>@AA?<840.+*))*+ë,--..-+)%! ë1.,**+-025787630-*'%$$%&î'&%$! ü)'%$$ð&(*-./.-+(&#! ð é! !"$%&%$#!ñ üñò õøó þ  ù ù    ô þ       û  þ  øz=,d Backgroundÿ     ÿÿÿÿ]ê,d^ ___,d^>^\^l^|^Œ^œ^Â^Ò^â^òÿÿÿùÿûúôÿþÿ:ÿý Åÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ&ÿüþýüÿ>ÿýþýÿ>ÿüþÿüÿQÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ0ÿ0ÿ0ÿ0ÿ–2K% libcommons-launcher-java-1.1/xdocs/downloads.xml0100644000175000017500000000600410112100750021361 0ustar arnaudarnaud Downloads Commons Documentation Team $Id: downloads.xml,v 1.5 2004/08/22 11:22:16 dirkv Exp $

    There are no releases available.

    The following releases are available:


    The latest binary release is always available on the Jakarta Binary Downloads page, its source is available from Jakarta Source Downloads page.

    Older releases are retained by the Apache Software Foundation but are moved into a special archive area.

    Nightly source and binary drops are available.

    Access to the source tree to see the latest and greatest code is possible through anonymous CVS access.

    libcommons-launcher-java-1.1/xdocs/example.xml0100644000175000017500000000745510100752427021050 0ustar arnaudarnaud Example Commons Documentation Team

    The Commons-launcher project provides a smart way to start a Java application. In the facts, the CommonsLauncher provides a bootstrap class which starts a ant process.

    This ant process :

    • makes the needed pre execution tasks : create the needed classpath, check resources, download resources ..
    • invoke a launcher task which allows to start a java application

    We want to start a small Main class : package org.apache.launcher.example; import org.apache.commons.logging.LogFactory; public class Main { public static void main(String[] args) { LogFactory.getLog(Main.class).info("start"); } } We will name it "our application".

    This runtime distribution includes:

    • bin/demo.sh : the unix user script to start our small Main class
    • bin/demo.bat : the windows user script to start our small Main class
    • bin/ : contains the other files used by the script
    • etc/ : contains the configuration file (log4j configuration, ..)
    • lib/launcher-demo.jar : contains the small Main class
    • lib/ : contains the needed jar files to the application
    • lib/launcher/ : contains the needed jar files to the commons launcher

    User script

    The demo.(sh/bat) is the bootstrap script used by the user to start the application: java -cp . LauncherBootstrap -executablename launcher-demo demo

    Launcher ant configuration

    Our launcher.xml is as simple as possible : ]]> It creates the needed classpath, the log directory, sets the log.dir system property for log4j and executes our Main class.

    Other files

    • LauncherBootstrap.class, commons-launcher.jar : the neede classes the CommonsLauncher
    • launcher.properties : the bootstrap configuration (used to find the lib/launcher files)

    libcommons-launcher-java-1.1/xdocs/index.xml0100644000175000017500000000507210022600403020502 0ustar arnaudarnaud Overview Commons Documentation Team

    The Launcher Component is designed to be a cross platform Java application launcher.

    The original Java classes come from the Jakarta Tomcat 4.0 project.

    Commons-launcher eliminates the need for a batch or shell script to launch a Java class. Some situations where elimination of a batch or shell script may be desirable are:

    • You want to avoid having to determining where certain application paths are e.g. your application's home directory, etc. Determining this dynamically in a Windows batch scripts is very tricky on some versions of Windows or when softlinks are used on Unix platforms.
    • You want to avoid having to handle native file and path separators or native path quoting issues.
    • You need to enforce certain system properties e.g. java.endorsed.dirs when running with JDK 1.4.
    • You want to allow users to pass in custom JVM arguments or system properties without having to parse and reorder arguments in your script. This can be tricky and/or messy in batch and shell scripts.
    • You want to bootstrap system properties from a configuration file instead hard-coding them in your batch and shell scripts.
    • You want to provide localized error messages which is very tricky to do in batch and shell scripts.


    See the downloads page for information on obtaining releases.


    The JavaDoc API documents are available online.

    libcommons-launcher-java-1.1/xdocs/navigation.xml0100644000175000017500000000256110100752700021537 0ustar arnaudarnaud Commons Launcher &common-menus; libcommons-launcher-java-1.1/xdocs/release-notes-1.1.xml0100644000175000017500000000553610112101125022440 0ustar arnaudarnaud Release notes for Commons-Launcher 1.1 Commons Documentation Team $Id: release-notes-1.1.xml,v 1.2 2004/08/22 11:24:05 dirkv Exp $

    Launcher was imported into jakarta commons almost 2 years ago (25 okt 2002) but never had a release.

    The Launcher Component is designed to be a cross platform Java application launcher.

    The original Java classes come from the Jakarta Tomcat 4.0 project.

    Tomcat has been shipping the 1.0-dev version from CVS for a while now (definitely more than a year), so this official release will be labaled 1.1 to avoid confusion.

    Commons-launcher eliminates the need for a batch or shell script to launch a Java class. Some situations where elimination of a batch or shell script may be desirable are:

    • You want to avoid having to determining where certain application paths are e.g. your application's home directory, etc. Determining this dynamically in a Windows batch scripts is very tricky on some versions of Windows or when softlinks are used on Unix platforms.
    • You want to avoid having to handle native file and path separators or native path quoting issues.
    • You need to enforce certain system properties e.g. java.endorsed.dirs when running with JDK 1.4.
    • You want to allow users to pass in custom JVM arguments or system properties without having to parse and reorder arguments in your script. This can be tricky and/or messy in batch and shell scripts.
    • You want to bootstrap system properties from a configuration file instead hard-coding them in your batch and shell scripts.
    • You want to provide localized error messages which is very tricky to do in batch and shell scripts.

    For more information consult the Commons-Launcher website.

    libcommons-launcher-java-1.1/xdocs/release-plan.xml0100644000175000017500000001116410110140761021746 0ustar arnaudarnaud Release Plan Commons Documentation Team $Id: release-plan.xml,v 1.1 2004/08/16 14:17:21 dirkv Exp $

    This document describes a plan for a 1.0 release of the Jakarta-Commons Launcher component (for the remainder of this document, simply "Launcher"). Per the Jakarta/ASF guidelines, this document doesn't mean anything until accepted by the relevant committer community via a lazy majority vote (hereafter, simply "lazy majority"). Once accepted, it may be replaced by an alternative plan, again subject to lazy majority approval.

    Non-binding votes (votes cast by those outside the relevant committer community) are welcome, but only binding votes are significant for decision making purposes.

    The objective of the 1.0 release of Launcher is to provide a stable and robust release with the intention of providing a stable foundation for the further evolution of the Launcher component.

    • Dirk Verbeeck

    The Jakarta Commons release process will be followed.

    (All days ending at 23:59:59 GMT in case of dispute.)

    • Preparation Period: 11 March 2004 - 27 July 2004
      During this period, all issues preventing building a release candidate should be a addressed. All other updates (documentation and website) are not blocking.

    • Review Period: 27 July 2004 - 16 August 2004
      During the Review Period specific design, functional and contract changes to Launcher will be considered on the Jakarta-Commons mailing list, using the following process:
      1. Any developer or committer that would like to see a specific change (or group of changes) enacted or rolled back will suggest it on the Jakarta-Commons mailing list (jakarta-commons@jakarta.apache.org).
      2. Any interested committer that opposes a given change (or group of changes) is obligated to indicate this disapproval on the list during the Review Period.
      3. We will seek, but not strictly require consensus on each decision point. If consensus cannot be reached, any committer may call for a vote to resolve the issue via a lazy majority vote.
      The Review Period may be extended by one week (at a time) given lazy majority approval, in case issues still need to be resolved.

      To facilitate the review process Release Candidates (RC1, RC2, ...) will be provided at the start of the review period and when mayor issues are resolved.

    • Implementation Period: 16 August 2004 - 20 August 2004
      (assuming the Review Period is not extended)

      During this period, any remaining implementation, testing and documentation will be completed. No new features or "public" interface changes will be considered in-scope at this time (short of a lazy-majority approved revised release plan or any "showstopper" defects).

      At the end of the Implementation Period, a formal release vote will be called, subject to lazy approval.

      A formal release vote may be called before the end of the implementation period, but after the end of the Review Period, if appropriate. (As soon as all remaining issues are resolved)

    • Release: 20 August 2004

    libcommons-launcher-java-1.1/LICENSE.txt0100644000175000017500000002645010020100404017351 0ustar arnaudarnaud 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. libcommons-launcher-java-1.1/NOTICE.txt0100644000175000017500000000014710020100404017243 0ustar arnaudarnaudThis product includes software developed by The Apache Software Foundation (http://www.apache.org/). libcommons-launcher-java-1.1/README.txt0100644000175000017500000000016210100304636017230 0ustar arnaudarnaudSee http://jakarta.apache.org/commons/launcher/ for additional and up-to-date information on Commons Launcher. libcommons-launcher-java-1.1/build.properties.sample0100644000175000017500000000150710100554432022234 0ustar arnaudarnaud# 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. # The directory containing your binary distribution of JUnit, # version 3.7 or later junit.home = /usr/local/junit3.7 # The pathname of the "junit.jar" JAR file junit.jar = ${junit.home}/junit.jar libcommons-launcher-java-1.1/build.xml0100644000175000017500000003143010112102225017346 0ustar arnaudarnaud libcommons-launcher-java-1.1/checkstyle.xml0100644000175000017500000001553210100554404020421 0ustar arnaudarnaud libcommons-launcher-java-1.1/project.properties0100644000175000017500000000264110100554310021316 0ustar arnaudarnaud# Copyright 2002-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. maven.checkstyle.properties = checkstyle.xml # uncomment the next line to work in offline mode (no jar download & no linkcheck) #maven.mode.online= maven.javadoc.author=false maven.javadoc.links=http://java.sun.com/j2se/1.4.2/docs/api maven.xdoc.jsl=../commons-build/commons-site.jsl maven.xdoc.date=bottom maven.xdoc.version=${pom.currentVersion} maven.xdoc.developmentProcessUrl=http://jakarta.apache.org/commons/charter.html maven.xdoc.poweredby.image=maven-feather.png maven.compile.debug=on maven.compile.deprecation=off maven.compile.optimize=off maven.jarResources.basedir=src/java maven.jar.excludes=**/package.html maven.junit.fork=true maven.junit.sysproperties=org.xml.sax.driver org.xml.sax.driver=org.apache.xerces.parsers.SAXParser clover.excludes=**/Test*.java libcommons-launcher-java-1.1/project.xml0100644000175000017500000001324510112076632017735 0ustar arnaudarnaud 3 Commons Launcher commons-launcher 1.1 2002 Commons Launcher Launcher are a set of Java classes which aim at making a cross platform Java application launcher. /images/launcher-logo-white.png http://jakarta.apache.org/commons/${pom.artifactId.substring(8)}/ org.apache.commons.${pom.artifactId.substring(8)} The Apache Software Foundation http://jakarta.apache.org http://jakarta.apache.org/images/jakarta-logo.gif The Apache Software License, Version 2.0 /LICENSE.txt repo jakarta http://issues.apache.org/bugzilla/ jakarta.apache.org /www/jakarta.apache.org/commons/${pom.artifactId.substring(8)}/ /www/jakarta.apache.org/builds/jakarta-commons/${pom.artifactId.substring(8)}/ scm:cvs:pserver:anoncvs@cvs.apache.org:/home/cvspublic:jakarta-commons/${pom.artifactId.substring(8)} http://cvs.apache.org/viewcvs/jakarta-commons/${pom.artifactId.substring(8)}/ Commons Dev List commons-dev-subscribe@jakarta.apache.org commons-dev-unsubscribe@jakarta.apache.org http://nagoya.apache.org/eyebrowse/SummarizeList?listName=commons-dev@jakarta.apache.org Commons User List commons-user-subscribe@jakarta.apache.org commons-user-unsubscribe@jakarta.apache.org http://nagoya.apache.org/eyebrowse/SummarizeList?listName=commons-user@jakarta.apache.org 1.1 1.1 LAUNCHER_1_1 Patrick Luby patrickl Costin Manolache costin Remy Maucherat remm Jean-Frederic Clere jfclere jfrederic.clere@fujitsu-siemens.com FSC Dirk Verbeeck dirkv Alban Peignier ant ant 1.5.3-1 ant ant-optional 1.5.3-1 commons-logging 1.0.4 commons-collections 2.1 junit 3.8.1 xml-apis2.0.2 xerces2.0.2 commons-dev@jakarta.apache.org src/java src/test **/Test*.java maven-changelog-plugin maven-changes-plugin maven-developer-activity-plugin maven-file-activity-plugin maven-javadoc-plugin maven-jdepend-plugin maven-junit-report-plugin maven-jxr-plugin maven-license-plugin maven-tasklist-plugin