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"/> | |||
| </fileset> | |||
| <path id="classpath.ant1compat"> | |||
| <path id="classpath"> | |||
| <pathelement location="${distlib.dir}/init.jar"/> | |||
| <fileset dir="${lib.dir}/parser" includes="*.jar"/> | |||
| <fileset dir="${lib.dir}/ant1compat" includes="*.jar"/> | |||
| @@ -79,95 +79,98 @@ | |||
| <available property="jdk1.4+" classname="java.lang.CharSequence" /> | |||
| <available property="bsf.present" | |||
| classname="com.ibm.bsf.BSFManager" | |||
| classpathref="classpath.ant1compat" /> | |||
| classpathref="classpath" /> | |||
| <available property="netrexx.present" | |||
| classname="netrexx.lang.Rexx" | |||
| classpathref="classpath.ant1compat" /> | |||
| classpathref="classpath" /> | |||
| <available property="trax.present" | |||
| classname="javax.xml.transform.Transformer" | |||
| classpathref="classpath.ant1compat" /> | |||
| classpathref="classpath" /> | |||
| <available property="xslp.present" | |||
| classname="com.kvisco.xsl.XSLProcessor" | |||
| classpathref="classpath.ant1compat" /> | |||
| classpathref="classpath" /> | |||
| <available property="xalan.present" | |||
| classname="org.apache.xalan.xslt.XSLTProcessorFactory" | |||
| classpathref="classpath.ant1compat" /> | |||
| classpathref="classpath" /> | |||
| <available property="xalan2.present" | |||
| classname="org.apache.xalan.transformer.TransformerImpl" | |||
| classpathref="classpath.ant1compat" /> | |||
| classpathref="classpath" /> | |||
| <available property="ejb.ejbc.present" | |||
| classname="weblogic.ejbc" | |||
| classpathref="classpath.ant1compat" /> | |||
| classpathref="classpath" /> | |||
| <available property="ejb.DDCreator.present" | |||
| classname="weblogic.ejb.utils.DDCreator" | |||
| classpathref="classpath.ant1compat" /> | |||
| classpathref="classpath" /> | |||
| <available property="ejb.wls.present" | |||
| classname="weblogic.Server" | |||
| classpathref="classpath.ant1compat" /> | |||
| classpathref="classpath" /> | |||
| <available property="junit.present" | |||
| classname="junit.framework.TestCase" | |||
| classpathref="classpath.ant1compat" /> | |||
| classpathref="classpath" /> | |||
| <available property="netcomp.present" | |||
| classname="com.oroinc.net.ftp.FTPClient" | |||
| classpathref="classpath.ant1compat" /> | |||
| classpathref="classpath" /> | |||
| <available property="starteam.present" | |||
| classname="com.starbase.util.Platform" | |||
| classpathref="classpath.ant1compat" /> | |||
| classpathref="classpath" /> | |||
| <available property="antlr.present" | |||
| classname="antlr.Tool" | |||
| classpathref="classpath.ant1compat"/> | |||
| classpathref="classpath"/> | |||
| <available property="vaj.present" | |||
| classname="com.ibm.ivj.util.base.Workspace" | |||
| classpathref="classpath.ant1compat"/> | |||
| classpathref="classpath"/> | |||
| <available property="stylebook.present" | |||
| classname="org.apache.stylebook.Engine" | |||
| classpathref="classpath.ant1compat"/> | |||
| classpathref="classpath"/> | |||
| <available property="jakarta.regexp.present" | |||
| classname="org.apache.regexp.RE" | |||
| classpathref="classpath.ant1compat"/> | |||
| classpathref="classpath"/> | |||
| <available property="jakarta.oro.present" | |||
| classname="org.apache.oro.text.regex.Perl5Matcher" | |||
| classpathref="classpath.ant1compat" /> | |||
| classpathref="classpath" /> | |||
| <available property="jmf.present" | |||
| classname="javax.sound.sampled.Clip" | |||
| classpathref="classpath.ant1compat"/> | |||
| classpathref="classpath"/> | |||
| <available property="icontract.present" | |||
| classname="com.reliablesystems.iContract.IContracted" | |||
| classpathref="classpath.ant1compat"/> | |||
| classpathref="classpath"/> | |||
| <available property="jdepend.present" | |||
| classname="jdepend.framework.JDepend" | |||
| classpathref="classpath.ant1compat"/> | |||
| classpathref="classpath"/> | |||
| <available property="log4j.present" | |||
| classname="org.apache.log4j.Category" | |||
| classpathref="classpath.ant1compat"/> | |||
| classpathref="classpath"/> | |||
| <!-- this is just a way to check for a TraX implementation --> | |||
| <available property="trax.impl.present" | |||
| resource="META-INF/services/javax.xml.transform.TransformerFactory" | |||
| classpathref="classpath.ant1compat"/> | |||
| classpathref="classpath"/> | |||
| <available property="xalan.envcheck" | |||
| classname="org.apache.xalan.xslt.EnvironmentCheck" | |||
| classpathref="classpath.ant1compat" /> | |||
| classpathref="classpath" /> | |||
| <available property="which.present" | |||
| classname="org.apache.env.Which" | |||
| classpathref="classpath.ant1compat" /> | |||
| classpathref="classpath" /> | |||
| <available property="servlet.present" | |||
| classname="javax.servlet.Servlet" | |||
| classpathref="classpath.ant1compat"/> | |||
| classpathref="classpath"/> | |||
| <available property="xerces.present" | |||
| classname="org.apache.xerces.parsers.SAXParser" | |||
| classpathref="classpath.ant1compat" /> | |||
| classpathref="classpath" /> | |||
| <available property="bcel.present" | |||
| classname="org.apache.bcel.Constants" | |||
| classpathref="classpath.ant1compat" /> | |||
| classpathref="classpath" /> | |||
| <available property="sunuue.present" | |||
| classname="sun.misc.UUEncoder" | |||
| classpathref="classpath" /> | |||
| <condition property="javamail.complete"> | |||
| <and> | |||
| <available classname="javax.activation.DataHandler" | |||
| classpathref="classpath.ant1compat"/> | |||
| classpathref="classpath"/> | |||
| <available classname="javax.mail.Transport" | |||
| classpathref="classpath.ant1compat"/> | |||
| classpathref="classpath"/> | |||
| </and> | |||
| </condition> | |||
| @@ -194,12 +197,12 @@ | |||
| <fileset refid="ant1src"/> | |||
| </copy> | |||
| <depend destdir="${bin.dir}/ant1compat" srcdir="${bin.dir}/ant1src;${java.dir}/antlibs/ant1compat"> | |||
| <classpath refid="classpath.ant1compat"/> | |||
| <classpath refid="classpath"/> | |||
| </depend> | |||
| <javac destdir="${bin.dir}/ant1compat" | |||
| srcdir="${bin.dir}/ant1src;${java.dir}/antlibs/ant1compat" | |||
| includeAntRuntime="false" debug="${debug}"> | |||
| <classpath refid="classpath.ant1compat"/> | |||
| <classpath refid="classpath"/> | |||
| <exclude name="${regexp.package}/JakartaRegexp*.java" | |||
| unless="jakarta.regexp.present" /> | |||
| <exclude name="${regexp.package}/JakartaOro*.java" | |||
| @@ -208,9 +211,14 @@ | |||
| unless="jdk1.4+" /> | |||
| <exclude name="${ant.package}/AntSecurityManager.java" | |||
| unless="jdk1.2+" /> | |||
| <exclude name="${ant.package}/util/optional/NoExitSecurityManager.java" | |||
| unless="jdk1.2+" /> | |||
| <exclude name="${ant.package}/listener/Log4jListener.java" | |||
| 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}/Script.java" unless="bsf.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}/Javah.java" unless="jdk1.2+" /> | |||
| <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/TelnetTask.java" unless="netcomp.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 */ | |||
| 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 | |||
| * 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.model.ModelElement; | |||
| 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. | |||
| @@ -75,9 +74,6 @@ public class ExecutionContext implements AntContext { | |||
| /** the model in the build model with which this context is associated */ | |||
| private ModelElement modelElement; | |||
| /** General file utilities */ | |||
| private FileUtils fileUtils = new FileUtils(); | |||
| /** | |||
| * Initilaise this context's environment | |||
| * | |||
| @@ -604,6 +604,24 @@ public class ExecutionFrame { | |||
| throws ExecutionException { | |||
| Throwable failureCause = null; | |||
| 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 { | |||
| Iterator taskIterator = target.getTasks(); | |||
| eventSupport.fireTargetStarted(target); | |||
| @@ -832,7 +850,6 @@ public class ExecutionFrame { | |||
| = reflector.createElement(element, nestedElementName); | |||
| factory.registerCreatedElement(nestedElement); | |||
| if (nestedElement instanceof ExecutionComponent) { | |||
| System.out.println("element is an execution component"); | |||
| ExecutionComponent component | |||
| = (ExecutionComponent)nestedElement; | |||
| ExecutionContext context | |||
| @@ -127,13 +127,11 @@ public class ExecutionManager { | |||
| librarySpecs.clear(); | |||
| // add any additional libraries. | |||
| if (config != null) { | |||
| for (Iterator i = config.getLibraryLocations(); i.hasNext(); ) { | |||
| // try file first | |||
| String libLocation = (String)i.next(); | |||
| libManager.loadLib(librarySpecs, libLocation); | |||
| } | |||
| } | |||
| libManager.configLibraries(initConfig, librarySpecs, antLibraries); | |||
| addConfigLibPaths(); | |||
| @@ -201,10 +199,6 @@ public class ExecutionManager { | |||
| */ | |||
| private void addConfigLibPaths() | |||
| throws ExecutionException { | |||
| if (config == null) { | |||
| return; | |||
| } | |||
| // now add any additional library Paths specified by the config | |||
| for (Iterator i = config.getLibraryIds(); i.hasNext(); ) { | |||
| String libraryId = (String)i.next(); | |||
| @@ -115,6 +115,8 @@ public class TargetHandler extends ElementHandler { | |||
| 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) | |||
| 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 | |||
| */ | |||
| 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 | |||
| */ | |||
| 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; | |||
| import org.apache.ant.common.antlib.AntContext; | |||
| import org.apache.ant.common.util.ExecutionException; | |||
| import org.apache.ant.common.model.BuildElement; | |||
| /** | |||
| * Ant1 Task facade | |||
| * | |||
| @@ -70,6 +74,20 @@ public abstract class Task extends ProjectComponent | |||
| /** The description of this task */ | |||
| 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. | |||
| * | |||
| @@ -307,7 +307,14 @@ public abstract class AntBase extends AbstractTask { | |||
| * @return the properties the sub-build will start with | |||
| */ | |||
| 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"; | |||
| /** The initialisation configuration for Ant */ | |||
| private InitConfig config; | |||
| private InitConfig initConfig; | |||
| /** Stream that we are using for logging */ | |||
| private PrintStream out = System.out; | |||
| @@ -110,6 +110,9 @@ public class Commandline { | |||
| /** The command line properties */ | |||
| 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 | |||
| * other URL protocols can be used. | |||
| @@ -186,8 +189,26 @@ public class Commandline { | |||
| * formed. | |||
| */ | |||
| 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 { | |||
| File configFile = new File(configArea, "antconfig.xml"); | |||
| URL configFileURL = InitUtils.getFileURL(configFile); | |||
| ParseContext context = new ParseContext(); | |||
| @@ -198,17 +219,38 @@ public class Commandline { | |||
| return configHandler.getAntConfig(); | |||
| } catch (MalformedURLException e) { | |||
| throw new ConfigException("Unable to form URL to read config from " | |||
| + configArea, e); | |||
| + configFile, 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. | |||
| @@ -217,22 +259,29 @@ public class Commandline { | |||
| * @param initConfig Ant's initialization configuration | |||
| */ | |||
| private void process(String[] args, InitConfig initConfig) { | |||
| this.config = initConfig; | |||
| this.initConfig = initConfig; | |||
| System.out.println("Ant Home is " + initConfig.getAntHome()); | |||
| try { | |||
| parseArguments(args); | |||
| AntConfig config = new AntConfig(); | |||
| AntConfig userConfig = getAntConfig(initConfig.getUserConfigArea()); | |||
| AntConfig systemConfig | |||
| = 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); | |||
| } | |||
| for (Iterator i = configFiles.iterator(); i.hasNext(); ) { | |||
| File configFile = (File)i.next(); | |||
| AntConfig runConfig = getAntConfigFile(configFile); | |||
| config.merge(runConfig); | |||
| } | |||
| if (!buildFileURL.getProtocol().equals("file") | |||
| && !config.isRemoteProjectAllowed()) { | |||
| throw new ConfigException("Remote Projects are not allowed: " | |||
| @@ -284,6 +333,7 @@ public class Commandline { | |||
| return project; | |||
| } | |||
| /** | |||
| * Parse the command line arguments. | |||
| * | |||
| @@ -301,7 +351,7 @@ public class Commandline { | |||
| if (arg.equals("-buildfile") || arg.equals("-file") | |||
| || arg.equals("-f")) { | |||
| try { | |||
| String url = args[i++]; | |||
| String url = getOption(args, i++, arg); | |||
| if (url.indexOf(":") == -1) { | |||
| // We convert any hash characters to their URL escape. | |||
| buildFileURL = InitUtils.getFileURL(new File(url)); | |||
| @@ -312,14 +362,10 @@ public class Commandline { | |||
| System.err.println("Buildfile is not valid: " + | |||
| e.getMessage()); | |||
| 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")) { | |||
| try { | |||
| File logFile = new File(args[i++]); | |||
| File logFile = new File(getOption(args, i++, arg)); | |||
| out = new PrintStream(new FileOutputStream(logFile)); | |||
| err = out; | |||
| } catch (IOException ioe) { | |||
| @@ -327,10 +373,6 @@ public class Commandline { | |||
| "file. Make sure the path exists and " + | |||
| "you have write permissions."); | |||
| 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")) { | |||
| messageOutputLevel = MessageLevel.MSG_WARN; | |||
| @@ -340,27 +382,17 @@ public class Commandline { | |||
| } else if (arg.equals("-debug")) { | |||
| // printVersion(); | |||
| 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")) { | |||
| 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")) { | |||
| if (loggerClassname != null) { | |||
| System.err.println("Only one logger class may be " + | |||
| "specified."); | |||
| 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")) { | |||
| String name = arg.substring(2, arg.length()); | |||
| String value = null; | |||
| @@ -368,8 +400,8 @@ public class Commandline { | |||
| if (posEq > 0) { | |||
| value = name.substring(posEq + 1); | |||
| name = name.substring(0, posEq); | |||
| } else if (i < args.length - 1) { | |||
| value = args[++i]; | |||
| } else { | |||
| value = getOption(args, i++, arg); | |||
| } | |||
| definedProperties.put(name, value); | |||
| } else if (arg.startsWith("-")) { | |||
| @@ -385,7 +417,7 @@ public class Commandline { | |||
| if (buildFileURL == null) { | |||
| File defaultBuildFile = new File(DEFAULT_BUILD_FILENAME); | |||
| if (!defaultBuildFile.exists()) { | |||
| File ant1BuildFile = new File(DEFAULT_ANT1_FILENAME); | |||
| File ant1BuildFile = new File(DEFAULT_ANT1_FILENAME); | |||
| if (ant1BuildFile.exists()) { | |||
| 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; | |||
| import java.util.ArrayList; | |||
| @@ -59,30 +59,36 @@ import java.util.List; | |||
| 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 { | |||
| /** This target's dependencies on other targets, if any */ | |||
| /** This target's dependencies on other targets, if any */ | |||
| private List dependencies = new ArrayList(); | |||
| /** This target's list of tasks */ | |||
| /** This target's list of tasks */ | |||
| private List tasks = new ArrayList(); | |||
| /** The target's name. */ | |||
| /** The target's name. */ | |||
| private String name; | |||
| /** The Target's description */ | |||
| /** The Target's 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) { | |||
| 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) { | |||
| 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() { | |||
| return name; | |||
| } | |||
| /** | |||
| * Gets the Target's description | |||
| * Gets the Target's description | |||
| * | |||
| * @return The description value | |||
| * @return The description value | |||
| */ | |||
| public String getDescription() { | |||
| 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() { | |||
| 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() { | |||
| 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) { | |||
| 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) { | |||
| 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 { | |||
| if (name == null) { | |||
| @@ -221,7 +221,8 @@ public class FileUtils { | |||
| } | |||
| 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) { | |||
| // not before the filesystem root and not after it, since root | |||
| // already contains one | |||
| @@ -243,6 +243,8 @@ public class Main { | |||
| = new URLClassLoader(LoaderUtils.getLocationURLs(cliJarLib, | |||
| "cli.jar"), coreLoader); | |||
| //System.out.println("System Loader config"); | |||
| //LoaderUtils.dumpLoader(System.out, systemLoader); | |||
| // System.out.println("Front End Loader config"); | |||
| // LoaderUtils.dumpLoader(System.out, frontEndLoader); | |||