Add capability to specify configs on command line Clean up audit stuff Add if/unless to targets Implement inheritAll git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271172 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -66,7 +66,7 @@ | |||||
| <patternset refid="converted"/> | <patternset refid="converted"/> | ||||
| </fileset> | </fileset> | ||||
| <path id="classpath.ant1compat"> | |||||
| <path id="classpath"> | |||||
| <pathelement location="${distlib.dir}/init.jar"/> | <pathelement location="${distlib.dir}/init.jar"/> | ||||
| <fileset dir="${lib.dir}/parser" includes="*.jar"/> | <fileset dir="${lib.dir}/parser" includes="*.jar"/> | ||||
| <fileset dir="${lib.dir}/ant1compat" includes="*.jar"/> | <fileset dir="${lib.dir}/ant1compat" includes="*.jar"/> | ||||
| @@ -79,95 +79,98 @@ | |||||
| <available property="jdk1.4+" classname="java.lang.CharSequence" /> | <available property="jdk1.4+" classname="java.lang.CharSequence" /> | ||||
| <available property="bsf.present" | <available property="bsf.present" | ||||
| classname="com.ibm.bsf.BSFManager" | classname="com.ibm.bsf.BSFManager" | ||||
| classpathref="classpath.ant1compat" /> | |||||
| classpathref="classpath" /> | |||||
| <available property="netrexx.present" | <available property="netrexx.present" | ||||
| classname="netrexx.lang.Rexx" | classname="netrexx.lang.Rexx" | ||||
| classpathref="classpath.ant1compat" /> | |||||
| classpathref="classpath" /> | |||||
| <available property="trax.present" | <available property="trax.present" | ||||
| classname="javax.xml.transform.Transformer" | classname="javax.xml.transform.Transformer" | ||||
| classpathref="classpath.ant1compat" /> | |||||
| classpathref="classpath" /> | |||||
| <available property="xslp.present" | <available property="xslp.present" | ||||
| classname="com.kvisco.xsl.XSLProcessor" | classname="com.kvisco.xsl.XSLProcessor" | ||||
| classpathref="classpath.ant1compat" /> | |||||
| classpathref="classpath" /> | |||||
| <available property="xalan.present" | <available property="xalan.present" | ||||
| classname="org.apache.xalan.xslt.XSLTProcessorFactory" | classname="org.apache.xalan.xslt.XSLTProcessorFactory" | ||||
| classpathref="classpath.ant1compat" /> | |||||
| classpathref="classpath" /> | |||||
| <available property="xalan2.present" | <available property="xalan2.present" | ||||
| classname="org.apache.xalan.transformer.TransformerImpl" | classname="org.apache.xalan.transformer.TransformerImpl" | ||||
| classpathref="classpath.ant1compat" /> | |||||
| classpathref="classpath" /> | |||||
| <available property="ejb.ejbc.present" | <available property="ejb.ejbc.present" | ||||
| classname="weblogic.ejbc" | classname="weblogic.ejbc" | ||||
| classpathref="classpath.ant1compat" /> | |||||
| classpathref="classpath" /> | |||||
| <available property="ejb.DDCreator.present" | <available property="ejb.DDCreator.present" | ||||
| classname="weblogic.ejb.utils.DDCreator" | classname="weblogic.ejb.utils.DDCreator" | ||||
| classpathref="classpath.ant1compat" /> | |||||
| classpathref="classpath" /> | |||||
| <available property="ejb.wls.present" | <available property="ejb.wls.present" | ||||
| classname="weblogic.Server" | classname="weblogic.Server" | ||||
| classpathref="classpath.ant1compat" /> | |||||
| classpathref="classpath" /> | |||||
| <available property="junit.present" | <available property="junit.present" | ||||
| classname="junit.framework.TestCase" | classname="junit.framework.TestCase" | ||||
| classpathref="classpath.ant1compat" /> | |||||
| classpathref="classpath" /> | |||||
| <available property="netcomp.present" | <available property="netcomp.present" | ||||
| classname="com.oroinc.net.ftp.FTPClient" | classname="com.oroinc.net.ftp.FTPClient" | ||||
| classpathref="classpath.ant1compat" /> | |||||
| classpathref="classpath" /> | |||||
| <available property="starteam.present" | <available property="starteam.present" | ||||
| classname="com.starbase.util.Platform" | classname="com.starbase.util.Platform" | ||||
| classpathref="classpath.ant1compat" /> | |||||
| classpathref="classpath" /> | |||||
| <available property="antlr.present" | <available property="antlr.present" | ||||
| classname="antlr.Tool" | classname="antlr.Tool" | ||||
| classpathref="classpath.ant1compat"/> | |||||
| classpathref="classpath"/> | |||||
| <available property="vaj.present" | <available property="vaj.present" | ||||
| classname="com.ibm.ivj.util.base.Workspace" | classname="com.ibm.ivj.util.base.Workspace" | ||||
| classpathref="classpath.ant1compat"/> | |||||
| classpathref="classpath"/> | |||||
| <available property="stylebook.present" | <available property="stylebook.present" | ||||
| classname="org.apache.stylebook.Engine" | classname="org.apache.stylebook.Engine" | ||||
| classpathref="classpath.ant1compat"/> | |||||
| classpathref="classpath"/> | |||||
| <available property="jakarta.regexp.present" | <available property="jakarta.regexp.present" | ||||
| classname="org.apache.regexp.RE" | classname="org.apache.regexp.RE" | ||||
| classpathref="classpath.ant1compat"/> | |||||
| classpathref="classpath"/> | |||||
| <available property="jakarta.oro.present" | <available property="jakarta.oro.present" | ||||
| classname="org.apache.oro.text.regex.Perl5Matcher" | classname="org.apache.oro.text.regex.Perl5Matcher" | ||||
| classpathref="classpath.ant1compat" /> | |||||
| classpathref="classpath" /> | |||||
| <available property="jmf.present" | <available property="jmf.present" | ||||
| classname="javax.sound.sampled.Clip" | classname="javax.sound.sampled.Clip" | ||||
| classpathref="classpath.ant1compat"/> | |||||
| classpathref="classpath"/> | |||||
| <available property="icontract.present" | <available property="icontract.present" | ||||
| classname="com.reliablesystems.iContract.IContracted" | classname="com.reliablesystems.iContract.IContracted" | ||||
| classpathref="classpath.ant1compat"/> | |||||
| classpathref="classpath"/> | |||||
| <available property="jdepend.present" | <available property="jdepend.present" | ||||
| classname="jdepend.framework.JDepend" | classname="jdepend.framework.JDepend" | ||||
| classpathref="classpath.ant1compat"/> | |||||
| classpathref="classpath"/> | |||||
| <available property="log4j.present" | <available property="log4j.present" | ||||
| classname="org.apache.log4j.Category" | classname="org.apache.log4j.Category" | ||||
| classpathref="classpath.ant1compat"/> | |||||
| classpathref="classpath"/> | |||||
| <!-- this is just a way to check for a TraX implementation --> | <!-- this is just a way to check for a TraX implementation --> | ||||
| <available property="trax.impl.present" | <available property="trax.impl.present" | ||||
| resource="META-INF/services/javax.xml.transform.TransformerFactory" | resource="META-INF/services/javax.xml.transform.TransformerFactory" | ||||
| classpathref="classpath.ant1compat"/> | |||||
| classpathref="classpath"/> | |||||
| <available property="xalan.envcheck" | <available property="xalan.envcheck" | ||||
| classname="org.apache.xalan.xslt.EnvironmentCheck" | classname="org.apache.xalan.xslt.EnvironmentCheck" | ||||
| classpathref="classpath.ant1compat" /> | |||||
| classpathref="classpath" /> | |||||
| <available property="which.present" | <available property="which.present" | ||||
| classname="org.apache.env.Which" | classname="org.apache.env.Which" | ||||
| classpathref="classpath.ant1compat" /> | |||||
| classpathref="classpath" /> | |||||
| <available property="servlet.present" | <available property="servlet.present" | ||||
| classname="javax.servlet.Servlet" | classname="javax.servlet.Servlet" | ||||
| classpathref="classpath.ant1compat"/> | |||||
| classpathref="classpath"/> | |||||
| <available property="xerces.present" | <available property="xerces.present" | ||||
| classname="org.apache.xerces.parsers.SAXParser" | classname="org.apache.xerces.parsers.SAXParser" | ||||
| classpathref="classpath.ant1compat" /> | |||||
| classpathref="classpath" /> | |||||
| <available property="bcel.present" | <available property="bcel.present" | ||||
| classname="org.apache.bcel.Constants" | classname="org.apache.bcel.Constants" | ||||
| classpathref="classpath.ant1compat" /> | |||||
| classpathref="classpath" /> | |||||
| <available property="sunuue.present" | |||||
| classname="sun.misc.UUEncoder" | |||||
| classpathref="classpath" /> | |||||
| <condition property="javamail.complete"> | <condition property="javamail.complete"> | ||||
| <and> | <and> | ||||
| <available classname="javax.activation.DataHandler" | <available classname="javax.activation.DataHandler" | ||||
| classpathref="classpath.ant1compat"/> | |||||
| classpathref="classpath"/> | |||||
| <available classname="javax.mail.Transport" | <available classname="javax.mail.Transport" | ||||
| classpathref="classpath.ant1compat"/> | |||||
| classpathref="classpath"/> | |||||
| </and> | </and> | ||||
| </condition> | </condition> | ||||
| @@ -194,12 +197,12 @@ | |||||
| <fileset refid="ant1src"/> | <fileset refid="ant1src"/> | ||||
| </copy> | </copy> | ||||
| <depend destdir="${bin.dir}/ant1compat" srcdir="${bin.dir}/ant1src;${java.dir}/antlibs/ant1compat"> | <depend destdir="${bin.dir}/ant1compat" srcdir="${bin.dir}/ant1src;${java.dir}/antlibs/ant1compat"> | ||||
| <classpath refid="classpath.ant1compat"/> | |||||
| <classpath refid="classpath"/> | |||||
| </depend> | </depend> | ||||
| <javac destdir="${bin.dir}/ant1compat" | <javac destdir="${bin.dir}/ant1compat" | ||||
| srcdir="${bin.dir}/ant1src;${java.dir}/antlibs/ant1compat" | srcdir="${bin.dir}/ant1src;${java.dir}/antlibs/ant1compat" | ||||
| includeAntRuntime="false" debug="${debug}"> | includeAntRuntime="false" debug="${debug}"> | ||||
| <classpath refid="classpath.ant1compat"/> | |||||
| <classpath refid="classpath"/> | |||||
| <exclude name="${regexp.package}/JakartaRegexp*.java" | <exclude name="${regexp.package}/JakartaRegexp*.java" | ||||
| unless="jakarta.regexp.present" /> | unless="jakarta.regexp.present" /> | ||||
| <exclude name="${regexp.package}/JakartaOro*.java" | <exclude name="${regexp.package}/JakartaOro*.java" | ||||
| @@ -208,9 +211,14 @@ | |||||
| unless="jdk1.4+" /> | unless="jdk1.4+" /> | ||||
| <exclude name="${ant.package}/AntSecurityManager.java" | <exclude name="${ant.package}/AntSecurityManager.java" | ||||
| unless="jdk1.2+" /> | unless="jdk1.2+" /> | ||||
| <exclude name="${ant.package}/util/optional/NoExitSecurityManager.java" | |||||
| unless="jdk1.2+" /> | |||||
| <exclude name="${ant.package}/listener/Log4jListener.java" | <exclude name="${ant.package}/listener/Log4jListener.java" | ||||
| unless="log4j.present" /> | unless="log4j.present" /> | ||||
| <exclude name="${ant.package}/taskdefs/email/UUMailer.java" unless="sunuue.present" /> | |||||
| <exclude name="${ant.package}/taskdefs/email/MimeMailer.java" unless="javamail.complete" /> | |||||
| <exclude name="${optional.package}/IContract.java" unless="icontract.present" /> | <exclude name="${optional.package}/IContract.java" unless="icontract.present" /> | ||||
| <exclude name="${optional.package}/Script.java" unless="bsf.present" /> | <exclude name="${optional.package}/Script.java" unless="bsf.present" /> | ||||
| <exclude name="${optional.package}/StyleBook.java" unless="stylebook.present" /> | <exclude name="${optional.package}/StyleBook.java" unless="stylebook.present" /> | ||||
| @@ -228,7 +236,6 @@ | |||||
| <exclude name="${optional.package}/ejb/IPlanet*.java" unless="ejbjar.support" /> | <exclude name="${optional.package}/ejb/IPlanet*.java" unless="ejbjar.support" /> | ||||
| <exclude name="${optional.package}/Javah.java" unless="jdk1.2+" /> | <exclude name="${optional.package}/Javah.java" unless="jdk1.2+" /> | ||||
| <exclude name="${optional.package}/junit/*" unless="junit.present" /> | <exclude name="${optional.package}/junit/*" unless="junit.present" /> | ||||
| <exclude name="${optional.package}/net/MimeMail.java" unless="javamail.complete" /> | |||||
| <exclude name="${optional.package}/net/FTP.java" unless="netcomp.present" /> | <exclude name="${optional.package}/net/FTP.java" unless="netcomp.present" /> | ||||
| <exclude name="${optional.package}/net/TelnetTask.java" unless="netcomp.present" /> | <exclude name="${optional.package}/net/TelnetTask.java" unless="netcomp.present" /> | ||||
| <exclude name="${optional.package}/scm/AntStarTeam*.java" unless="starteam.present" /> | <exclude name="${optional.package}/scm/AntStarTeam*.java" unless="starteam.present" /> | ||||
| @@ -106,9 +106,6 @@ public class AntLibrarySpec { | |||||
| /** Flag which indicates if tools.jar is required */ | /** Flag which indicates if tools.jar is required */ | ||||
| private boolean toolsJarRequired = false; | private boolean toolsJarRequired = false; | ||||
| /** Flag which indicates that this library is a system library */ | |||||
| private boolean systemLibrary = false; | |||||
| /** | /** | ||||
| * This flag indicates that this task processes XML and wishes to use | * This flag indicates that this task processes XML and wishes to use | ||||
| * the XML parser packaged with Ant | * the XML parser packaged with Ant | ||||
| @@ -56,7 +56,6 @@ import java.io.File; | |||||
| import org.apache.ant.common.antlib.AntContext; | import org.apache.ant.common.antlib.AntContext; | ||||
| import org.apache.ant.common.model.ModelElement; | import org.apache.ant.common.model.ModelElement; | ||||
| import org.apache.ant.common.util.ExecutionException; | import org.apache.ant.common.util.ExecutionException; | ||||
| import org.apache.ant.common.util.FileUtils; | |||||
| /** | /** | ||||
| * This is the core's implementation of the AntContext for all core objects. | * This is the core's implementation of the AntContext for all core objects. | ||||
| @@ -75,9 +74,6 @@ public class ExecutionContext implements AntContext { | |||||
| /** the model in the build model with which this context is associated */ | /** the model in the build model with which this context is associated */ | ||||
| private ModelElement modelElement; | private ModelElement modelElement; | ||||
| /** General file utilities */ | |||||
| private FileUtils fileUtils = new FileUtils(); | |||||
| /** | /** | ||||
| * Initilaise this context's environment | * Initilaise this context's environment | ||||
| * | * | ||||
| @@ -604,6 +604,24 @@ public class ExecutionFrame { | |||||
| throws ExecutionException { | throws ExecutionException { | ||||
| Throwable failureCause = null; | Throwable failureCause = null; | ||||
| Target target = project.getTarget(targetName); | Target target = project.getTarget(targetName); | ||||
| String ifCondition = target.getIfCondition(); | |||||
| String unlessCondition = target.getUnlessCondition(); | |||||
| if (ifCondition != null) { | |||||
| ifCondition = dataService.replacePropertyRefs(ifCondition.trim()); | |||||
| if (!isDataValueSet(ifCondition)) { | |||||
| return; | |||||
| } | |||||
| } | |||||
| if (unlessCondition != null) { | |||||
| unlessCondition | |||||
| = dataService.replacePropertyRefs(unlessCondition.trim()); | |||||
| if (isDataValueSet(unlessCondition)) { | |||||
| return; | |||||
| } | |||||
| } | |||||
| try { | try { | ||||
| Iterator taskIterator = target.getTasks(); | Iterator taskIterator = target.getTasks(); | ||||
| eventSupport.fireTargetStarted(target); | eventSupport.fireTargetStarted(target); | ||||
| @@ -832,7 +850,6 @@ public class ExecutionFrame { | |||||
| = reflector.createElement(element, nestedElementName); | = reflector.createElement(element, nestedElementName); | ||||
| factory.registerCreatedElement(nestedElement); | factory.registerCreatedElement(nestedElement); | ||||
| if (nestedElement instanceof ExecutionComponent) { | if (nestedElement instanceof ExecutionComponent) { | ||||
| System.out.println("element is an execution component"); | |||||
| ExecutionComponent component | ExecutionComponent component | ||||
| = (ExecutionComponent)nestedElement; | = (ExecutionComponent)nestedElement; | ||||
| ExecutionContext context | ExecutionContext context | ||||
| @@ -127,13 +127,11 @@ public class ExecutionManager { | |||||
| librarySpecs.clear(); | librarySpecs.clear(); | ||||
| // add any additional libraries. | // add any additional libraries. | ||||
| if (config != null) { | |||||
| for (Iterator i = config.getLibraryLocations(); i.hasNext(); ) { | for (Iterator i = config.getLibraryLocations(); i.hasNext(); ) { | ||||
| // try file first | // try file first | ||||
| String libLocation = (String)i.next(); | String libLocation = (String)i.next(); | ||||
| libManager.loadLib(librarySpecs, libLocation); | libManager.loadLib(librarySpecs, libLocation); | ||||
| } | } | ||||
| } | |||||
| libManager.configLibraries(initConfig, librarySpecs, antLibraries); | libManager.configLibraries(initConfig, librarySpecs, antLibraries); | ||||
| addConfigLibPaths(); | addConfigLibPaths(); | ||||
| @@ -201,10 +199,6 @@ public class ExecutionManager { | |||||
| */ | */ | ||||
| private void addConfigLibPaths() | private void addConfigLibPaths() | ||||
| throws ExecutionException { | throws ExecutionException { | ||||
| if (config == null) { | |||||
| return; | |||||
| } | |||||
| // now add any additional library Paths specified by the config | // now add any additional library Paths specified by the config | ||||
| for (Iterator i = config.getLibraryIds(); i.hasNext(); ) { | for (Iterator i = config.getLibraryIds(); i.hasNext(); ) { | ||||
| String libraryId = (String)i.next(); | String libraryId = (String)i.next(); | ||||
| @@ -115,6 +115,8 @@ public class TargetHandler extends ElementHandler { | |||||
| target.addDependency(dependency); | target.addDependency(dependency); | ||||
| } | } | ||||
| } | } | ||||
| target.setIfCondition(getAttribute(IF_ATTR)); | |||||
| target.setUnlessCondition(getAttribute(UNLESS_ATTR)); | |||||
| } | } | ||||
| @@ -135,17 +135,12 @@ public class Ant1Factory extends StandardLibFactory { | |||||
| */ | */ | ||||
| public Object createTaskInstance(Class taskClass) | public Object createTaskInstance(Class taskClass) | ||||
| throws InstantiationException, IllegalAccessException { | throws InstantiationException, IllegalAccessException { | ||||
| Object o = taskClass.newInstance(); | |||||
| if (o instanceof ProjectComponent) { | |||||
| ((ProjectComponent)o).setProject(project); | |||||
| Object instance = taskClass.newInstance(); | |||||
| if (instance instanceof ProjectComponent) { | |||||
| ((ProjectComponent)instance).setProject(project); | |||||
| } | } | ||||
| // XXX task.setTaskType(taskType); | |||||
| // set default value, can be changed by the user | |||||
| // XXX task.setTaskName(taskType); | |||||
| return o; | |||||
| return instance; | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -141,7 +141,9 @@ public abstract class ProjectComponent { | |||||
| * @param level the priority level of the message | * @param level the priority level of the message | ||||
| */ | */ | ||||
| public void log(String message, int level) { | public void log(String message, int level) { | ||||
| context.log(message, level); | |||||
| if (context != null) { | |||||
| context.log(message, level); | |||||
| } | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -150,7 +152,7 @@ public abstract class ProjectComponent { | |||||
| * @param message the message to be logged | * @param message the message to be logged | ||||
| */ | */ | ||||
| public void log(String message) { | public void log(String message) { | ||||
| context.log(message, Project.MSG_INFO); | |||||
| log(message, Project.MSG_INFO); | |||||
| } | } | ||||
| @@ -53,6 +53,10 @@ | |||||
| */ | */ | ||||
| package org.apache.tools.ant; | package org.apache.tools.ant; | ||||
| import org.apache.ant.common.antlib.AntContext; | |||||
| import org.apache.ant.common.util.ExecutionException; | |||||
| import org.apache.ant.common.model.BuildElement; | |||||
| /** | /** | ||||
| * Ant1 Task facade | * Ant1 Task facade | ||||
| * | * | ||||
| @@ -70,6 +74,20 @@ public abstract class Task extends ProjectComponent | |||||
| /** The description of this task */ | /** The description of this task */ | ||||
| protected String description = null; | protected String description = null; | ||||
| /** | |||||
| * Initialise this component | |||||
| * | |||||
| * @param context the core context for this component | |||||
| * @exception ExecutionException if the component cannot be initialized | |||||
| */ | |||||
| public void init(AntContext context) throws ExecutionException { | |||||
| super.init(context); | |||||
| BuildElement buildElement = (BuildElement)context.getModelElement(); | |||||
| taskType = buildElement.getType(); | |||||
| taskName = taskType; | |||||
| } | |||||
| /** | /** | ||||
| * Set the name to use in logging messages. | * Set the name to use in logging messages. | ||||
| * | * | ||||
| @@ -307,7 +307,14 @@ public abstract class AntBase extends AbstractTask { | |||||
| * @return the properties the sub-build will start with | * @return the properties the sub-build will start with | ||||
| */ | */ | ||||
| protected Map getProperties() { | protected Map getProperties() { | ||||
| return properties; | |||||
| if (!inheritAll) { | |||||
| return properties; | |||||
| } | |||||
| // need to combine existing properties with new ones | |||||
| Map subBuildProperties = dataService.getAllProperties(); | |||||
| subBuildProperties.putAll(properties); | |||||
| return subBuildProperties; | |||||
| } | } | ||||
| } | } | ||||
| @@ -93,7 +93,7 @@ public class Commandline { | |||||
| public final static String DEFAULT_ANT1_FILENAME = "build.xml"; | public final static String DEFAULT_ANT1_FILENAME = "build.xml"; | ||||
| /** The initialisation configuration for Ant */ | /** The initialisation configuration for Ant */ | ||||
| private InitConfig config; | |||||
| private InitConfig initConfig; | |||||
| /** Stream that we are using for logging */ | /** Stream that we are using for logging */ | ||||
| private PrintStream out = System.out; | private PrintStream out = System.out; | ||||
| @@ -110,6 +110,9 @@ public class Commandline { | |||||
| /** The command line properties */ | /** The command line properties */ | ||||
| private Map definedProperties = new HashMap(); | private Map definedProperties = new HashMap(); | ||||
| /** The Config files to use in this run */ | |||||
| private List configFiles = new ArrayList(); | |||||
| /** | /** | ||||
| * This is the build file to run. By default it is a file: type URL but | * This is the build file to run. By default it is a file: type URL but | ||||
| * other URL protocols can be used. | * other URL protocols can be used. | ||||
| @@ -186,8 +189,26 @@ public class Commandline { | |||||
| * formed. | * formed. | ||||
| */ | */ | ||||
| private AntConfig getAntConfig(File configArea) throws ConfigException { | private AntConfig getAntConfig(File configArea) throws ConfigException { | ||||
| File configFile = new File(configArea, "antconfig.xml"); | |||||
| try { | |||||
| return getAntConfigFile(configFile); | |||||
| } catch (FileNotFoundException e) { | |||||
| // ignore if files are not present | |||||
| return null; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Read in a config file | |||||
| * | |||||
| * @param configFile the file containing the XML config | |||||
| * @return the parsed config object | |||||
| * @exception ConfigException if the config cannot be parsed | |||||
| * @exception FileNotFoundException if the file cannot be found. | |||||
| */ | |||||
| private AntConfig getAntConfigFile(File configFile) | |||||
| throws ConfigException, FileNotFoundException { | |||||
| try { | try { | ||||
| File configFile = new File(configArea, "antconfig.xml"); | |||||
| URL configFileURL = InitUtils.getFileURL(configFile); | URL configFileURL = InitUtils.getFileURL(configFile); | ||||
| ParseContext context = new ParseContext(); | ParseContext context = new ParseContext(); | ||||
| @@ -198,17 +219,38 @@ public class Commandline { | |||||
| return configHandler.getAntConfig(); | return configHandler.getAntConfig(); | ||||
| } catch (MalformedURLException e) { | } catch (MalformedURLException e) { | ||||
| throw new ConfigException("Unable to form URL to read config from " | throw new ConfigException("Unable to form URL to read config from " | ||||
| + configArea, e); | |||||
| + configFile, e); | |||||
| } catch (XMLParseException e) { | } catch (XMLParseException e) { | ||||
| if (!(e.getCause() instanceof FileNotFoundException)) { | |||||
| throw new ConfigException("Unable to parse config file from " | |||||
| + configArea, e); | |||||
| if (e.getCause() instanceof FileNotFoundException) { | |||||
| throw (FileNotFoundException)e.getCause(); | |||||
| } | } | ||||
| // ignore missing config files | |||||
| return null; | |||||
| throw new ConfigException("Unable to parse config file from " | |||||
| + configFile, e); | |||||
| } | } | ||||
| } | } | ||||
| /** | |||||
| * Get an option value | |||||
| * | |||||
| * @param args the full list of command line arguments | |||||
| * @param position the position in the args array where the value shoudl be | |||||
| * @param argType the option type | |||||
| * @return the value of the option | |||||
| * @exception ConfigException if the option cannot be read | |||||
| */ | |||||
| private String getOption(String[] args, int position, String argType) | |||||
| throws ConfigException { | |||||
| String value = null; | |||||
| try { | |||||
| value = args[position]; | |||||
| } catch (IndexOutOfBoundsException e) { | |||||
| throw new ConfigException("You must specify a value for the " | |||||
| + argType + " argument"); | |||||
| } | |||||
| return value; | |||||
| } | |||||
| /** | /** | ||||
| * Start the command line front end for mutant. | * Start the command line front end for mutant. | ||||
| @@ -217,22 +259,29 @@ public class Commandline { | |||||
| * @param initConfig Ant's initialization configuration | * @param initConfig Ant's initialization configuration | ||||
| */ | */ | ||||
| private void process(String[] args, InitConfig initConfig) { | private void process(String[] args, InitConfig initConfig) { | ||||
| this.config = initConfig; | |||||
| this.initConfig = initConfig; | |||||
| System.out.println("Ant Home is " + initConfig.getAntHome()); | System.out.println("Ant Home is " + initConfig.getAntHome()); | ||||
| try { | try { | ||||
| parseArguments(args); | parseArguments(args); | ||||
| AntConfig config = new AntConfig(); | |||||
| AntConfig userConfig = getAntConfig(initConfig.getUserConfigArea()); | AntConfig userConfig = getAntConfig(initConfig.getUserConfigArea()); | ||||
| AntConfig systemConfig | AntConfig systemConfig | ||||
| = getAntConfig(initConfig.getSystemConfigArea()); | = getAntConfig(initConfig.getSystemConfigArea()); | ||||
| AntConfig config = systemConfig; | |||||
| if (config == null) { | |||||
| config = userConfig; | |||||
| } else if (userConfig != null) { | |||||
| if (systemConfig != null) { | |||||
| config.merge(systemConfig); | |||||
| } | |||||
| if (userConfig != null) { | |||||
| config.merge(userConfig); | config.merge(userConfig); | ||||
| } | } | ||||
| for (Iterator i = configFiles.iterator(); i.hasNext(); ) { | |||||
| File configFile = (File)i.next(); | |||||
| AntConfig runConfig = getAntConfigFile(configFile); | |||||
| config.merge(runConfig); | |||||
| } | |||||
| if (!buildFileURL.getProtocol().equals("file") | if (!buildFileURL.getProtocol().equals("file") | ||||
| && !config.isRemoteProjectAllowed()) { | && !config.isRemoteProjectAllowed()) { | ||||
| throw new ConfigException("Remote Projects are not allowed: " | throw new ConfigException("Remote Projects are not allowed: " | ||||
| @@ -284,6 +333,7 @@ public class Commandline { | |||||
| return project; | return project; | ||||
| } | } | ||||
| /** | /** | ||||
| * Parse the command line arguments. | * Parse the command line arguments. | ||||
| * | * | ||||
| @@ -301,7 +351,7 @@ public class Commandline { | |||||
| if (arg.equals("-buildfile") || arg.equals("-file") | if (arg.equals("-buildfile") || arg.equals("-file") | ||||
| || arg.equals("-f")) { | || arg.equals("-f")) { | ||||
| try { | try { | ||||
| String url = args[i++]; | |||||
| String url = getOption(args, i++, arg); | |||||
| if (url.indexOf(":") == -1) { | if (url.indexOf(":") == -1) { | ||||
| // We convert any hash characters to their URL escape. | // We convert any hash characters to their URL escape. | ||||
| buildFileURL = InitUtils.getFileURL(new File(url)); | buildFileURL = InitUtils.getFileURL(new File(url)); | ||||
| @@ -312,14 +362,10 @@ public class Commandline { | |||||
| System.err.println("Buildfile is not valid: " + | System.err.println("Buildfile is not valid: " + | ||||
| e.getMessage()); | e.getMessage()); | ||||
| throw new ConfigException("Build file is not valid", e); | throw new ConfigException("Build file is not valid", e); | ||||
| } catch (ArrayIndexOutOfBoundsException e) { | |||||
| System.err.println("You must specify a buildfile when " + | |||||
| "using the -buildfile argument"); | |||||
| return; | |||||
| } | } | ||||
| } else if (arg.equals("-logfile") || arg.equals("-l")) { | } else if (arg.equals("-logfile") || arg.equals("-l")) { | ||||
| try { | try { | ||||
| File logFile = new File(args[i++]); | |||||
| File logFile = new File(getOption(args, i++, arg)); | |||||
| out = new PrintStream(new FileOutputStream(logFile)); | out = new PrintStream(new FileOutputStream(logFile)); | ||||
| err = out; | err = out; | ||||
| } catch (IOException ioe) { | } catch (IOException ioe) { | ||||
| @@ -327,10 +373,6 @@ public class Commandline { | |||||
| "file. Make sure the path exists and " + | "file. Make sure the path exists and " + | ||||
| "you have write permissions."); | "you have write permissions."); | ||||
| return; | return; | ||||
| } catch (ArrayIndexOutOfBoundsException aioobe) { | |||||
| System.err.println("You must specify a log file when " + | |||||
| "using the -log argument"); | |||||
| return; | |||||
| } | } | ||||
| } else if (arg.equals("-quiet") || arg.equals("-q")) { | } else if (arg.equals("-quiet") || arg.equals("-q")) { | ||||
| messageOutputLevel = MessageLevel.MSG_WARN; | messageOutputLevel = MessageLevel.MSG_WARN; | ||||
| @@ -340,27 +382,17 @@ public class Commandline { | |||||
| } else if (arg.equals("-debug")) { | } else if (arg.equals("-debug")) { | ||||
| // printVersion(); | // printVersion(); | ||||
| messageOutputLevel = MessageLevel.MSG_DEBUG; | messageOutputLevel = MessageLevel.MSG_DEBUG; | ||||
| } else if (arg.equals("-config") || arg.equals("-c")) { | |||||
| configFiles.add(new File(getOption(args, i++, arg))); | |||||
| } else if (arg.equals("-listener")) { | } else if (arg.equals("-listener")) { | ||||
| try { | |||||
| listeners.add(args[i++]); | |||||
| } catch (ArrayIndexOutOfBoundsException aioobe) { | |||||
| System.err.println("You must specify a classname when " + | |||||
| "using the -listener argument"); | |||||
| return; | |||||
| } | |||||
| listeners.add(getOption(args, i++, arg)); | |||||
| } else if (arg.equals("-logger")) { | } else if (arg.equals("-logger")) { | ||||
| if (loggerClassname != null) { | if (loggerClassname != null) { | ||||
| System.err.println("Only one logger class may be " + | System.err.println("Only one logger class may be " + | ||||
| "specified."); | "specified."); | ||||
| return; | return; | ||||
| } | } | ||||
| try { | |||||
| loggerClassname = args[i++]; | |||||
| } catch (ArrayIndexOutOfBoundsException aioobe) { | |||||
| System.err.println("You must specify a classname when " + | |||||
| "using the -logger argument"); | |||||
| return; | |||||
| } | |||||
| loggerClassname = getOption(args, i++, arg); | |||||
| } else if (arg.startsWith("-D")) { | } else if (arg.startsWith("-D")) { | ||||
| String name = arg.substring(2, arg.length()); | String name = arg.substring(2, arg.length()); | ||||
| String value = null; | String value = null; | ||||
| @@ -368,8 +400,8 @@ public class Commandline { | |||||
| if (posEq > 0) { | if (posEq > 0) { | ||||
| value = name.substring(posEq + 1); | value = name.substring(posEq + 1); | ||||
| name = name.substring(0, posEq); | name = name.substring(0, posEq); | ||||
| } else if (i < args.length - 1) { | |||||
| value = args[++i]; | |||||
| } else { | |||||
| value = getOption(args, i++, arg); | |||||
| } | } | ||||
| definedProperties.put(name, value); | definedProperties.put(name, value); | ||||
| } else if (arg.startsWith("-")) { | } else if (arg.startsWith("-")) { | ||||
| @@ -385,7 +417,7 @@ public class Commandline { | |||||
| if (buildFileURL == null) { | if (buildFileURL == null) { | ||||
| File defaultBuildFile = new File(DEFAULT_BUILD_FILENAME); | File defaultBuildFile = new File(DEFAULT_BUILD_FILENAME); | ||||
| if (!defaultBuildFile.exists()) { | if (!defaultBuildFile.exists()) { | ||||
| File ant1BuildFile = new File(DEFAULT_ANT1_FILENAME); | |||||
| File ant1BuildFile = new File(DEFAULT_ANT1_FILENAME); | |||||
| if (ant1BuildFile.exists()) { | if (ant1BuildFile.exists()) { | ||||
| defaultBuildFile = ant1BuildFile; | defaultBuildFile = ant1BuildFile; | ||||
| } | } | ||||
| @@ -1,55 +1,55 @@ | |||||
| /* | /* | ||||
| * The Apache Software License, Version 1.1 | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | * | ||||
| * Copyright (c) 2002 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * Copyright (c) 2002 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | * | ||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | * | ||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | * | ||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | * | ||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | * | ||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | * | ||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | * | ||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | * | ||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| */ | */ | ||||
| package org.apache.ant.common.model; | package org.apache.ant.common.model; | ||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||
| @@ -59,30 +59,36 @@ import java.util.List; | |||||
| import org.apache.ant.common.util.Location; | import org.apache.ant.common.util.Location; | ||||
| /** | /** | ||||
| * A Target is a collection of tasks. It may have dependencies on other | |||||
| * targets | |||||
| * A Target is a collection of tasks. It may have dependencies on other | |||||
| * targets | |||||
| * | * | ||||
| * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
| * @created 12 January 2002 | |||||
| * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
| * @created 12 January 2002 | |||||
| */ | */ | ||||
| public class Target extends ModelElement { | public class Target extends ModelElement { | ||||
| /** This target's dependencies on other targets, if any */ | |||||
| /** This target's dependencies on other targets, if any */ | |||||
| private List dependencies = new ArrayList(); | private List dependencies = new ArrayList(); | ||||
| /** This target's list of tasks */ | |||||
| /** This target's list of tasks */ | |||||
| private List tasks = new ArrayList(); | private List tasks = new ArrayList(); | ||||
| /** The target's name. */ | |||||
| /** The target's name. */ | |||||
| private String name; | private String name; | ||||
| /** The Target's description */ | |||||
| /** The Target's description */ | |||||
| private String description; | private String description; | ||||
| /** Description of the Field */ | |||||
| private String ifCondition; | |||||
| /** Description of the Field */ | |||||
| private String unlessCondition; | |||||
| /** | /** | ||||
| * Construct the target, given its name | |||||
| * Construct the target, given its name | |||||
| * | * | ||||
| * @param location the location of the element | |||||
| * @param name the target's name. | |||||
| * @param location the location of the element | |||||
| * @param name the target's name. | |||||
| */ | */ | ||||
| public Target(Location location, String name) { | public Target(Location location, String name) { | ||||
| super(location); | super(location); | ||||
| @@ -90,27 +96,63 @@ public class Target extends ModelElement { | |||||
| } | } | ||||
| /** | /** | ||||
| * Sets the Target's description | |||||
| * Sets the IfCondition of the Target | |||||
| * | |||||
| * @param ifCondition The new IfCondition value | |||||
| */ | |||||
| public void setIfCondition(String ifCondition) { | |||||
| this.ifCondition = ifCondition; | |||||
| } | |||||
| /** | |||||
| * Sets the UnlessCondition of the Target | |||||
| * | |||||
| * @param unlessCondition The new UnlessCondition value | |||||
| */ | |||||
| public void setUnlessCondition(String unlessCondition) { | |||||
| this.unlessCondition = unlessCondition; | |||||
| } | |||||
| /** | |||||
| * Sets the Target's description | |||||
| * | * | ||||
| * @param description The new description value | |||||
| * @param description The new description value | |||||
| */ | */ | ||||
| public void setDescription(String description) { | public void setDescription(String description) { | ||||
| this.description = description; | this.description = description; | ||||
| } | } | ||||
| /** | /** | ||||
| * Get this target's name. | |||||
| * Gets the IfCondition of the Target | |||||
| * | |||||
| * @return The IfCondition value | |||||
| */ | |||||
| public String getIfCondition() { | |||||
| return ifCondition; | |||||
| } | |||||
| /** | |||||
| * Gets the UnlessCondition of the Target | |||||
| * | |||||
| * @return The UnlessCondition value | |||||
| */ | |||||
| public String getUnlessCondition() { | |||||
| return unlessCondition; | |||||
| } | |||||
| /** | |||||
| * Get this target's name. | |||||
| * | * | ||||
| * @return the target's name. | |||||
| * @return the target's name. | |||||
| */ | */ | ||||
| public String getName() { | public String getName() { | ||||
| return name; | return name; | ||||
| } | } | ||||
| /** | /** | ||||
| * Gets the Target's description | |||||
| * Gets the Target's description | |||||
| * | * | ||||
| * @return The description value | |||||
| * @return The description value | |||||
| */ | */ | ||||
| public String getDescription() { | public String getDescription() { | ||||
| return description; | return description; | ||||
| @@ -118,45 +160,46 @@ public class Target extends ModelElement { | |||||
| /** | /** | ||||
| * Get this target's dependencies. | |||||
| * Get this target's dependencies. | |||||
| * | * | ||||
| * @return an iterator over the target's dependencies. | |||||
| * @return an iterator over the target's dependencies. | |||||
| */ | */ | ||||
| public Iterator getDependencies() { | public Iterator getDependencies() { | ||||
| return dependencies.iterator(); | return dependencies.iterator(); | ||||
| } | } | ||||
| /** | /** | ||||
| * Get the tasks for this target | |||||
| * Get the tasks for this target | |||||
| * | * | ||||
| * @return an iterator over the set of tasks for this target. | |||||
| * @return an iterator over the set of tasks for this target. | |||||
| */ | */ | ||||
| public Iterator getTasks() { | public Iterator getTasks() { | ||||
| return tasks.iterator(); | return tasks.iterator(); | ||||
| } | } | ||||
| /** | /** | ||||
| * Add a task to this target | |||||
| * Add a task to this target | |||||
| * | * | ||||
| * @param task the task to be added to the target. | |||||
| * @param task the task to be added to the target. | |||||
| */ | */ | ||||
| public void addTask(BuildElement task) { | public void addTask(BuildElement task) { | ||||
| tasks.add(task); | tasks.add(task); | ||||
| } | } | ||||
| /** | /** | ||||
| * Add a dependency to this target | |||||
| * Add a dependency to this target | |||||
| * | * | ||||
| * @param dependency the name of a target upon which this target depends | |||||
| * @param dependency the name of a target upon which this target | |||||
| * depends | |||||
| */ | */ | ||||
| public void addDependency(String dependency) { | public void addDependency(String dependency) { | ||||
| dependencies.add(dependency); | dependencies.add(dependency); | ||||
| } | } | ||||
| /** | /** | ||||
| * Validate that this build element is configured correctly | |||||
| * Validate that this build element is configured correctly | |||||
| * | * | ||||
| * @exception ModelException if the element is invalid | |||||
| * @exception ModelException if the element is invalid | |||||
| */ | */ | ||||
| public void validate() throws ModelException { | public void validate() throws ModelException { | ||||
| if (name == null) { | if (name == null) { | ||||
| @@ -221,7 +221,8 @@ public class FileUtils { | |||||
| } | } | ||||
| StringBuffer sb = new StringBuffer(); | StringBuffer sb = new StringBuffer(); | ||||
| for (int i = 0; i < s.size(); i++) { | |||||
| int size = s.size(); | |||||
| for (int i = 0; i < size; i++) { | |||||
| if (i > 1) { | if (i > 1) { | ||||
| // not before the filesystem root and not after it, since root | // not before the filesystem root and not after it, since root | ||||
| // already contains one | // already contains one | ||||
| @@ -243,6 +243,8 @@ public class Main { | |||||
| = new URLClassLoader(LoaderUtils.getLocationURLs(cliJarLib, | = new URLClassLoader(LoaderUtils.getLocationURLs(cliJarLib, | ||||
| "cli.jar"), coreLoader); | "cli.jar"), coreLoader); | ||||
| //System.out.println("System Loader config"); | |||||
| //LoaderUtils.dumpLoader(System.out, systemLoader); | |||||
| // System.out.println("Front End Loader config"); | // System.out.println("Front End Loader config"); | ||||
| // LoaderUtils.dumpLoader(System.out, frontEndLoader); | // LoaderUtils.dumpLoader(System.out, frontEndLoader); | ||||