git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272626 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -144,28 +144,25 @@ | |||
| <delete dir="${dist.dir}"/> | |||
| </target> | |||
| <target name="antlibs" depends="common"> | |||
| <antcall target="build-lib"> | |||
| <param name="libset" value="system"/> | |||
| </antcall> | |||
| <target name="antlibs" depends="common, systemlib"> | |||
| <ant antfile="build/script.xml"/> | |||
| </target> | |||
| <target name="build-lib"> | |||
| <mkdir dir="${bin.dir}/antlibs/${libset}"/> | |||
| <mkdir dir="${distlib.dir}/antlibs"/> | |||
| <target name="systemlib" depends="common"> | |||
| <mkdir dir="${bin.dir}/antlibs/system"/> | |||
| <mkdir dir="${distlib.dir}/syslibs"/> | |||
| <path id="classpath.antlibs"> | |||
| <path refid="classpath.common"/> | |||
| <pathelement location="${distlib.dir}/common/common.jar"/> | |||
| </path> | |||
| <depend destdir="${bin.dir}/antlibs/${libset}" srcdir="${java.dir}/antlibs/${libset}"> | |||
| <depend destdir="${bin.dir}/antlibs/system" srcdir="${java.dir}/antlibs/system"> | |||
| <classpath refid="classpath.antlibs"/> | |||
| </depend> | |||
| <javac destdir="${bin.dir}/antlibs/${libset}" srcdir="${java.dir}/antlibs/${libset}" debug="${debug}"> | |||
| <javac destdir="${bin.dir}/antlibs/system" srcdir="${java.dir}/antlibs/system" debug="${debug}"> | |||
| <classpath refid="classpath.antlibs"/> | |||
| </javac> | |||
| <jar basedir="${bin.dir}/antlibs/${libset}" jarfile="${distlib.dir}/antlibs/${libset}.jar"> | |||
| <metainf dir="${java.dir}/antlibs/${libset}" | |||
| <jar basedir="${bin.dir}/antlibs/system" jarfile="${distlib.dir}/syslibs/system.jar"> | |||
| <metainf dir="${java.dir}/antlibs/system" | |||
| includes="antlib.xml"/> | |||
| </jar> | |||
| </target> | |||
| @@ -43,6 +43,7 @@ | |||
| <exclude name="org/apache/tools/ant/ProjectHelper.java"/> | |||
| <exclude name="org/apache/tools/ant/Task.java"/> | |||
| <exclude name="org/apache/tools/ant/Main.java"/> | |||
| <exclude name="org/apache/tools/ant/input/InputRequest.java"/> | |||
| </patternset> | |||
| <patternset id="notrequired"> | |||
| @@ -63,6 +64,7 @@ | |||
| <include name="org/apache/tools/mail/**/*.java"/> | |||
| <include name="org/apache/tools/tar/**/*.java"/> | |||
| <include name="org/apache/tools/ant/*.java"/> | |||
| <include name="org/apache/tools/ant/input/*.java"/> | |||
| <!-- <patternset refid="deprecated"/> --> | |||
| <patternset refid="toohard"/> | |||
| <patternset refid="converted"/> | |||
| @@ -74,7 +76,7 @@ | |||
| <fileset dir="${lib.dir}/parser" includes="*.jar"/> | |||
| <fileset dir="${lib.dir}/ant1compat" includes="*.jar"/> | |||
| <pathelement location="${distlib.dir}/common/common.jar"/> | |||
| <pathelement location="${distlib.dir}/antlibs/system.jar"/> | |||
| <pathelement location="${distlib.dir}/syslibs/system.jar"/> | |||
| </path> | |||
| <!-- | |||
| @@ -480,6 +482,7 @@ | |||
| </fileset> | |||
| </copy> | |||
| <mkdir dir="${distlib.dir}/antlibs/"/> | |||
| <jar basedir="${bin.dir}/ant1compat" jarfile="${distlib.dir}/antlibs/ant1compat.jar"> | |||
| <metainf dir="${java.dir}/antlibs/ant1compat" | |||
| includes="antlib.xml"/> | |||
| @@ -152,7 +152,7 @@ public class AntLibManager { | |||
| * @param librarySpecs the loaded specifications of the Ant libraries | |||
| * @param initConfig the Ant initialization configuration | |||
| * @param libraries the collection of libraries already configured | |||
| * @param libPathsMap a map of lists of library patsh fro each library | |||
| * @param libPathsMap a map of lists of library paths for each library | |||
| * @exception ExecutionException if a library cannot be configured from | |||
| * the given specification | |||
| */ | |||
| @@ -231,7 +231,7 @@ public class AntLibManager { | |||
| } | |||
| /** | |||
| * add a library path to the given library | |||
| * Add a library path to the given library | |||
| * | |||
| * @param antLibrary the library to which the path is to be added | |||
| * @param path the path to be added | |||
| @@ -320,11 +320,13 @@ public class AntLibManager { | |||
| antLibrary.setParentLoader(initConfig.getCommonLoader()); | |||
| libraries.put(libraryId, antLibrary); | |||
| List libPaths = (List) libPathsMap.get(libraryId); | |||
| if (libPaths != null) { | |||
| for (Iterator j = libPaths.iterator(); j.hasNext();) { | |||
| URL pathURL = (URL) j.next(); | |||
| addLibPath(antLibrary, pathURL); | |||
| if (libPathsMap != null) { | |||
| List libPaths = (List) libPathsMap.get(libraryId); | |||
| if (libPaths != null) { | |||
| for (Iterator j = libPaths.iterator(); j.hasNext();) { | |||
| URL pathURL = (URL) j.next(); | |||
| addLibPath(antLibrary, pathURL); | |||
| } | |||
| } | |||
| } | |||
| @@ -63,6 +63,7 @@ import java.util.Map; | |||
| import org.apache.ant.common.util.ConfigException; | |||
| import org.apache.ant.common.util.PathTokenizer; | |||
| import org.apache.ant.init.InitUtils; | |||
| import org.apache.ant.common.model.BuildElement; | |||
| /** | |||
| * An AntConfig is the java class representation of the antconfig.xml files | |||
| @@ -72,15 +73,6 @@ import org.apache.ant.init.InitUtils; | |||
| * @created 20 January 2002 | |||
| */ | |||
| public class AntConfig { | |||
| /** The list of additional directories to be searched for Ant libraries */ | |||
| private List libraryLocations = new ArrayList(); | |||
| /** | |||
| * A list of additional paths for each ant library, indexed on the | |||
| * library id | |||
| */ | |||
| private Map libPaths = new HashMap(); | |||
| /** Indicates if remote libraries may be used */ | |||
| private boolean remoteLibs = false; | |||
| @@ -90,6 +82,11 @@ public class AntConfig { | |||
| /** Indicates if unset properties are ignored */ | |||
| private boolean unsetProperties = true; | |||
| /** | |||
| * Configuration tasks. | |||
| */ | |||
| private List tasks = new ArrayList(); | |||
| /** | |||
| * Indicate if unset properties are OK. | |||
| * | |||
| @@ -118,50 +115,21 @@ public class AntConfig { | |||
| } | |||
| /** | |||
| * Get the additional locations in which to search for Ant Libraries | |||
| * | |||
| * @return an iterator over the library locations | |||
| */ | |||
| public Iterator getLibraryLocations() { | |||
| return libraryLocations.iterator(); | |||
| } | |||
| /** | |||
| * Get the list of additional path components for a given path | |||
| * Get the configuration tasks | |||
| * | |||
| * @param libraryId the identifier for the library | |||
| * @return the list of URLs for the additional paths for the given | |||
| * library | |||
| * @return an iterator over the set of config tasks. | |||
| */ | |||
| public List getLibraryPathList(String libraryId) { | |||
| List libraryPathList = (List) libPaths.get(libraryId); | |||
| if (libraryPathList == null) { | |||
| libraryPathList = new ArrayList(); | |||
| libPaths.put(libraryId, libraryPathList); | |||
| } | |||
| return libraryPathList; | |||
| public Iterator getTasks() { | |||
| return tasks.iterator(); | |||
| } | |||
| /** | |||
| * Get the map of library paths. This map contains a collection of List | |||
| * instances, indexed by the libraryIds. Each list is a set of | |||
| * additional classpath entries for the given library | |||
| * Add a config task. | |||
| * | |||
| * @return the library paths map | |||
| * @param task a task to be executed as part of the configuration process. | |||
| */ | |||
| public Map getLibraryPathsMap() { | |||
| return libPaths; | |||
| } | |||
| /** | |||
| * Gets the libraryIds of the AntConfig | |||
| * | |||
| * @return an interator over the library identifiers for which there is | |||
| * additional path information | |||
| */ | |||
| public Iterator getLibraryIds() { | |||
| return libPaths.keySet().iterator(); | |||
| public void addTask(BuildElement task) { | |||
| tasks.add(task); | |||
| } | |||
| /** | |||
| @@ -191,88 +159,18 @@ public class AntConfig { | |||
| public void allowUnsetProperties(boolean allowUnsetProperties) { | |||
| this.unsetProperties = allowUnsetProperties; | |||
| } | |||
| /** | |||
| * Add an additional set of paths for the given library. | |||
| * | |||
| * @param libraryId The library id for which the additional class path | |||
| * is being specified | |||
| * @param libraryPath the classpath style string for the library's | |||
| * additonal paths | |||
| * @exception ConfigException if the appropriate URLs cannot be formed. | |||
| */ | |||
| public void addLibPath(String libraryId, String libraryPath) | |||
| throws ConfigException { | |||
| try { | |||
| List libraryPathList = getLibraryPathList(libraryId); | |||
| PathTokenizer p = new PathTokenizer(libraryPath); | |||
| while (p.hasMoreTokens()) { | |||
| String pathElement = p.nextToken(); | |||
| File pathElementFile = new File(pathElement); | |||
| URL pathElementURL = InitUtils.getFileURL(pathElementFile); | |||
| libraryPathList.add(pathElementURL); | |||
| } | |||
| } catch (MalformedURLException e) { | |||
| throw new ConfigException("Unable to process libraryPath '" | |||
| + libraryPath + "' for library '" + libraryId + "'", e); | |||
| } | |||
| } | |||
| /** | |||
| * Add an additional URL for the library's classpath | |||
| * | |||
| * @param libraryId the library's unique Id | |||
| * @param libraryURL a string which points to the additonal path | |||
| * @exception ConfigException if the URL could not be formed | |||
| */ | |||
| public void addLibURL(String libraryId, String libraryURL) | |||
| throws ConfigException { | |||
| try { | |||
| List libraryPathList = getLibraryPathList(libraryId); | |||
| libraryPathList.add(new URL(libraryURL)); | |||
| } catch (MalformedURLException e) { | |||
| throw new ConfigException("Unable to process libraryURL '" | |||
| + libraryURL + "' for library '" + libraryId + "'", e); | |||
| } | |||
| } | |||
| /** | |||
| * Merge in another ocnfiguration. The configuration being merged in | |||
| * Merge in another configuration. The configuration being merged in | |||
| * takes precedence | |||
| * | |||
| * @param otherConfig the other AntConfig to be merged. | |||
| */ | |||
| public void merge(AntConfig otherConfig) { | |||
| // merge by | |||
| List currentLibraryLocations = libraryLocations; | |||
| libraryLocations = new ArrayList(); | |||
| libraryLocations.addAll(otherConfig.libraryLocations); | |||
| libraryLocations.addAll(currentLibraryLocations); | |||
| Iterator i = otherConfig.libPaths.keySet().iterator(); | |||
| while (i.hasNext()) { | |||
| String libraryId = (String) i.next(); | |||
| List currentList = getLibraryPathList(libraryId); | |||
| List combined = new ArrayList(); | |||
| combined.addAll(otherConfig.getLibraryPathList(libraryId)); | |||
| combined.addAll(currentList); | |||
| libPaths.put(libraryId, combined); | |||
| } | |||
| remoteLibs = otherConfig.remoteLibs; | |||
| remoteProjects = otherConfig.remoteProjects; | |||
| unsetProperties = otherConfig.unsetProperties; | |||
| } | |||
| /** | |||
| * Add a new task directory to be searched for additional Ant libraries | |||
| * | |||
| * @param libraryLocation the location (can be a file or a URL) where | |||
| * the libraries may be loaded from. | |||
| */ | |||
| public void addAntLibraryLocation(String libraryLocation) { | |||
| libraryLocations.add(libraryLocation); | |||
| tasks.addAll(otherConfig.tasks); | |||
| } | |||
| } | |||
| @@ -54,6 +54,7 @@ | |||
| package org.apache.ant.antcore.config; | |||
| import org.apache.ant.common.util.ConfigException; | |||
| import org.apache.ant.antcore.xml.ElementHandler; | |||
| import org.apache.ant.antcore.modelparser.BuildElementHandler; | |||
| import org.xml.sax.Attributes; | |||
| import org.xml.sax.SAXParseException; | |||
| @@ -123,36 +124,17 @@ public class AntConfigHandler extends ElementHandler { | |||
| Attributes attributes) | |||
| throws SAXParseException { | |||
| try { | |||
| if (qualifiedName.equals("loadlib")) { | |||
| LoadLibHandler loadlibHandler | |||
| = new LoadLibHandler(); | |||
| loadlibHandler.start(getParseContext(), getXMLReader(), | |||
| this, getLocator(), attributes, getElementSource(), | |||
| qualifiedName); | |||
| config.addAntLibraryLocation(loadlibHandler.getLibLocation()); | |||
| } else if (qualifiedName.equals("libpath")) { | |||
| LibPathHandler libPathHandler | |||
| = new LibPathHandler(); | |||
| libPathHandler.start(getParseContext(), getXMLReader(), | |||
| this, getLocator(), attributes, getElementSource(), | |||
| qualifiedName); | |||
| if (libPathHandler.getLibraryPath() != null) { | |||
| config.addLibPath(libPathHandler.getLibraryId(), | |||
| libPathHandler.getLibraryPath()); | |||
| } else { | |||
| config.addLibURL(libPathHandler.getLibraryId(), | |||
| libPathHandler.getLibraryURL()); | |||
| } | |||
| } else { | |||
| super.startElement(uri, localName, qualifiedName, attributes); | |||
| } | |||
| } catch (ConfigException e) { | |||
| throw new SAXParseException("Unable to process config", | |||
| getLocator(), e); | |||
| } | |||
| // everything else is a task | |||
| BuildElementHandler buildElementHandler = new BuildElementHandler(); | |||
| buildElementHandler.start(getParseContext(), getXMLReader(), | |||
| this, getLocator(), attributes, getElementSource(), | |||
| qualifiedName); | |||
| config.addTask(buildElementHandler.getBuildElement()); | |||
| // try { | |||
| // } catch (ConfigException e) { | |||
| // throw new SAXParseException("Unable to process config", | |||
| // getLocator(), e); | |||
| // } | |||
| } | |||
| /** | |||
| @@ -1,141 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * 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: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by 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. | |||
| * | |||
| * 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 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.antcore.config; | |||
| import org.apache.ant.antcore.xml.ElementHandler; | |||
| import org.xml.sax.SAXParseException; | |||
| /** | |||
| * An XML Handler for the libpath element in an Ant config file | |||
| * | |||
| * @author Conor MacNeill | |||
| * @created 20 January 2002 | |||
| */ | |||
| public class LibPathHandler extends ElementHandler { | |||
| /** The library identifier attribute name */ | |||
| public static final String LIBID_ATTR = "libid"; | |||
| /** The path attribute name */ | |||
| public static final String PATH_ATTR = "path"; | |||
| /** The path attribute name */ | |||
| public static final String URL_ATTR = "url"; | |||
| /** | |||
| * Get the libraryId for which the additional path is being defined | |||
| * | |||
| * @return the library's unique id | |||
| */ | |||
| public String getLibraryId() { | |||
| return getAttribute(LIBID_ATTR); | |||
| } | |||
| /** | |||
| * Get the additional path being defined fro the library | |||
| * | |||
| * @return the libraryPath value, may be null | |||
| */ | |||
| public String getLibraryPath() { | |||
| return getAttribute(PATH_ATTR); | |||
| } | |||
| /** | |||
| * Get the URL (as a string) containing the additional path for the | |||
| * library. | |||
| * | |||
| * @return the libraryURL value | |||
| */ | |||
| public String getLibraryURL() { | |||
| return getAttribute(URL_ATTR); | |||
| } | |||
| /** | |||
| * Process the libpath element | |||
| * | |||
| * @param elementName the name of the element | |||
| * @exception SAXParseException if there is a problem parsing the | |||
| * element | |||
| */ | |||
| public void processElement(String elementName) | |||
| throws SAXParseException { | |||
| if (getLibraryId() == null | |||
| || (getLibraryPath() == null && getLibraryURL() == null) | |||
| || (getLibraryPath() != null && getLibraryURL() != null)) { | |||
| throw new SAXParseException("The " + LIBID_ATTR | |||
| + " attribute and only one of " | |||
| + PATH_ATTR + " or " + URL_ATTR | |||
| + " attributes must be specified for a libpath element", | |||
| getLocator()); | |||
| } | |||
| } | |||
| /** | |||
| * Validate that the given attribute and value are valid. | |||
| * | |||
| * @param attributeName The name of the attributes | |||
| * @param attributeValue The value of the attributes | |||
| * @exception SAXParseException if the attribute is not allowed on the | |||
| * element. | |||
| */ | |||
| protected void validateAttribute(String attributeName, | |||
| String attributeValue) | |||
| throws SAXParseException { | |||
| if (!attributeName.equals(LIBID_ATTR) && | |||
| !attributeName.equals(PATH_ATTR) && | |||
| !attributeName.equals(URL_ATTR)) { | |||
| throwInvalidAttribute(attributeName); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,110 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * 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: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by 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. | |||
| * | |||
| * 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 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.antcore.config; | |||
| import org.apache.ant.antcore.xml.ElementHandler; | |||
| import org.xml.sax.SAXParseException; | |||
| /** | |||
| * An XML handler to handle the loadlib element of an AntConfig file. | |||
| * | |||
| * @author Conor MacNeill | |||
| * @created 20 January 2002 | |||
| */ | |||
| public class LoadLibHandler extends ElementHandler { | |||
| /** The location attribute name */ | |||
| public static final String LOCATION_ATTR = "location"; | |||
| /** | |||
| * Get the location of the additional search directory | |||
| * | |||
| * @return the additional directory to be searched for Ant libraries. | |||
| */ | |||
| public String getLibLocation() { | |||
| return getAttribute(LOCATION_ATTR); | |||
| } | |||
| /** | |||
| * Process the loadlibs element | |||
| * | |||
| * @param elementName the name of the element | |||
| * @exception SAXParseException if there is a problem parsing the | |||
| * element | |||
| */ | |||
| public void processElement(String elementName) | |||
| throws SAXParseException { | |||
| if (getLocation() == null) { | |||
| throw new SAXParseException(LOCATION_ATTR | |||
| + " must be specified for a taskdir element", getLocator()); | |||
| } | |||
| } | |||
| /** | |||
| * Validate that the given attribute and value are valid. | |||
| * | |||
| * @param attributeName The name of the attributes | |||
| * @param attributeValue The value of the attributes | |||
| * @exception SAXParseException if the attribute is not allowed on the | |||
| * element. | |||
| */ | |||
| protected void validateAttribute(String attributeName, | |||
| String attributeValue) | |||
| throws SAXParseException { | |||
| if (!attributeName.equals(LOCATION_ATTR)) { | |||
| throwInvalidAttribute(attributeName); | |||
| } | |||
| } | |||
| } | |||
| @@ -79,6 +79,7 @@ import org.apache.ant.common.service.ComponentService; | |||
| import org.apache.ant.common.util.ExecutionException; | |||
| import org.apache.ant.common.util.Location; | |||
| import org.apache.ant.init.LoaderUtils; | |||
| import org.apache.ant.antcore.config.AntConfig; | |||
| /** | |||
| * The instance of the ComponentServices made available by the core to the | |||
| @@ -110,7 +111,7 @@ public class ComponentManager implements ComponentService { | |||
| * These are AntLibraries which have been loaded into this component | |||
| * manager | |||
| */ | |||
| private Map antLibraries; | |||
| private Map antLibraries = new HashMap(); | |||
| /** dynamic libraries which have been defined */ | |||
| private Map dynamicLibraries; | |||
| @@ -122,7 +123,7 @@ public class ComponentManager implements ComponentService { | |||
| * This map stores a list of additional paths for each library indexed | |||
| * by the libraryId | |||
| */ | |||
| private Map libPathsMap; | |||
| private Map libPathsMap = new HashMap(); | |||
| /** Reflector objects used to configure Tasks from the Task models. */ | |||
| private Map setters = new HashMap(); | |||
| @@ -132,17 +133,13 @@ public class ComponentManager implements ComponentService { | |||
| * Constructor | |||
| * | |||
| * @param frame the frame containing this context | |||
| * @param allowRemoteLibs true if remote libraries can be loaded though | |||
| * this service. | |||
| * @param configLibPaths the additional library paths specified in the | |||
| * configuration | |||
| */ | |||
| protected ComponentManager(Frame frame, boolean allowRemoteLibs, | |||
| Map configLibPaths) { | |||
| protected ComponentManager(Frame frame) { | |||
| this.frame = frame; | |||
| libManager = new AntLibManager(allowRemoteLibs); | |||
| AntConfig config = frame.getConfig(); | |||
| libManager = new AntLibManager(config.isRemoteLibAllowed()); | |||
| dynamicLibraries = new HashMap(); | |||
| libPathsMap = new HashMap(configLibPaths); | |||
| libPathsMap = new HashMap(); | |||
| } | |||
| /** | |||
| @@ -162,10 +159,11 @@ public class ComponentManager implements ComponentService { | |||
| libManager.configLibraries(frame.getInitConfig(), librarySpecs, | |||
| antLibraries, libPathsMap); | |||
| if (importAll) { | |||
| Iterator i = librarySpecs.keySet().iterator(); | |||
| while (i.hasNext()) { | |||
| String libraryId = (String) i.next(); | |||
| Iterator i = librarySpecs.keySet().iterator(); | |||
| while (i.hasNext()) { | |||
| String libraryId = (String) i.next(); | |||
| if (importAll | |||
| || libraryId.startsWith(Constants.ANT_LIB_PREFIX)) { | |||
| importLibrary(libraryId); | |||
| } | |||
| } | |||
| @@ -345,30 +343,6 @@ public class ComponentManager implements ComponentService { | |||
| componentName, componentName, addTaskAdapter, null); | |||
| } | |||
| /** | |||
| * Set the standard libraries (i.e. those which are independent of the | |||
| * build files) to be used in this component manager | |||
| * | |||
| * @param standardLibs A collection of AntLibrary objects indexed by | |||
| * their libraryId | |||
| * @exception ExecutionException if the components cannot be imported | |||
| * form the libraries fro which such importing is automatic. | |||
| */ | |||
| protected void setStandardLibraries(Map standardLibs) | |||
| throws ExecutionException { | |||
| antLibraries = new HashMap(standardLibs); | |||
| // go through the libraries and import all standard ant libraries | |||
| for (Iterator i = antLibraries.keySet().iterator(); i.hasNext();) { | |||
| String libraryId = (String) i.next(); | |||
| if (libraryId.startsWith(Constants.ANT_LIB_PREFIX)) { | |||
| // standard library - import whole library | |||
| importLibrary(libraryId); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Get the collection ov converters currently configured | |||
| * | |||
| @@ -65,6 +65,5 @@ public abstract class Constants { | |||
| /** The Ant aspect used to identify Ant metadata */ | |||
| public static final String ANT_ASPECT = "ant"; | |||
| } | |||
| @@ -234,30 +234,6 @@ public class CoreExecService implements ExecService { | |||
| } | |||
| /** | |||
| * Setup a sub-build. | |||
| * | |||
| * @param properties the initiali properties to be used in the build | |||
| * @param model XXX Description of the Parameter | |||
| * @return Description of the Return Value | |||
| * @exception ExecutionException if the subbuild cannot be run | |||
| */ | |||
| /* | |||
| public Object setupBuild(File antFile, Map properties) | |||
| throws ExecutionException { | |||
| try { | |||
| // Parse the build file into a project | |||
| XMLProjectParser parser = new XMLProjectParser(); | |||
| Project project | |||
| = parser.parseBuildFile(InitUtils.getFileURL(antFile)); | |||
| return setupBuild(project, properties); | |||
| } catch (MalformedURLException e) { | |||
| throw new ExecutionException(e); | |||
| } catch (XMLParseException e) { | |||
| throw new ExecutionException(e); | |||
| } | |||
| } | |||
| */ | |||
| /** | |||
| * Setup a sub-build. | |||
| * | |||
| @@ -77,9 +77,6 @@ import org.apache.ant.init.InitConfig; | |||
| * @created 12 January 2002 | |||
| */ | |||
| public class ExecutionManager implements DemuxOutputReceiver { | |||
| /** The AntLibraries built from Ant's Populated Task Libraries. */ | |||
| private Map antLibraries = new HashMap(); | |||
| /** BuildEvent support used to fire events and manage listeners */ | |||
| private BuildEventSupport eventSupport = new BuildEventSupport(); | |||
| @@ -122,32 +119,6 @@ public class ExecutionManager implements DemuxOutputReceiver { | |||
| * loaded | |||
| */ | |||
| public void init() throws ExecutionException { | |||
| Map librarySpecs = new HashMap(10); | |||
| try { | |||
| // start by loading the task libraries | |||
| URL standardLibsURL | |||
| = new URL(initConfig.getLibraryURL(), "antlibs/"); | |||
| AntLibManager libManager | |||
| = new AntLibManager(config.isRemoteLibAllowed()); | |||
| libManager.loadLibs(librarySpecs, standardLibsURL); | |||
| libManager.configLibraries(initConfig, librarySpecs, antLibraries, | |||
| config.getLibraryPathsMap()); | |||
| librarySpecs.clear(); | |||
| // add any additional libraries. | |||
| for (Iterator i = config.getLibraryLocations(); i.hasNext();) { | |||
| // try file first | |||
| String libLocation = (String) i.next(); | |||
| libManager.loadLibs(librarySpecs, libLocation); | |||
| } | |||
| libManager.configLibraries(initConfig, librarySpecs, antLibraries, | |||
| config.getLibraryPathsMap()); | |||
| } catch (MalformedURLException e) { | |||
| throw new ExecutionException("Unable to load Ant libraries", e); | |||
| } | |||
| } | |||
| /** | |||
| @@ -167,7 +138,7 @@ public class ExecutionManager implements DemuxOutputReceiver { | |||
| // start by validating the project we have been given. | |||
| project.validate(); | |||
| mainFrame = new Frame(antLibraries, initConfig, config); | |||
| mainFrame = new Frame(initConfig, config); | |||
| for (Iterator j = eventSupport.getListeners(); j.hasNext();) { | |||
| BuildListener listener = (BuildListener) j.next(); | |||
| mainFrame.addBuildListener(listener); | |||
| @@ -54,6 +54,7 @@ | |||
| package org.apache.ant.antcore.execution; | |||
| import java.io.File; | |||
| import java.net.URL; | |||
| import java.net.MalformedURLException; | |||
| import java.util.HashMap; | |||
| import java.util.Iterator; | |||
| import java.util.Map; | |||
| @@ -97,6 +98,13 @@ public class Frame implements DemuxOutputReceiver { | |||
| /** The referenced frames corresponding to the referenced projects */ | |||
| private Map referencedFrames = new HashMap(); | |||
| /** | |||
| * The property overrides for the referenced frames. This map is indexed | |||
| * by the reference names of the frame. Each entry is another Map of | |||
| * property values indexed by their relative name. | |||
| */ | |||
| private Map overrides = new HashMap(); | |||
| /** | |||
| * The context of this execution. This contains all data object's created | |||
| * by tasks that have been executed | |||
| @@ -109,12 +117,6 @@ public class Frame implements DemuxOutputReceiver { | |||
| */ | |||
| private InitConfig initConfig; | |||
| /** | |||
| * These are the standard libraries from which taskdefs, typedefs, etc may | |||
| * be imported. | |||
| */ | |||
| private Map standardLibs; | |||
| /** BuildEvent support used to fire events and manage listeners */ | |||
| private BuildEventSupport eventSupport = new BuildEventSupport(); | |||
| @@ -158,9 +160,8 @@ public class Frame implements DemuxOutputReceiver { | |||
| * @exception ExecutionException if a component of the library cannot be | |||
| * imported | |||
| */ | |||
| protected Frame(Map standardLibs, InitConfig initConfig, | |||
| protected Frame(InitConfig initConfig, | |||
| AntConfig config) throws ExecutionException { | |||
| this.standardLibs = standardLibs; | |||
| this.config = config; | |||
| this.initConfig = initConfig; | |||
| } | |||
| @@ -189,11 +190,7 @@ public class Frame implements DemuxOutputReceiver { | |||
| */ | |||
| protected void setProject(Project project) throws ExecutionException { | |||
| this.project = project; | |||
| referencedFrames = new HashMap(); | |||
| configureServices(); | |||
| componentManager.setStandardLibraries(standardLibs); | |||
| setMagicProperties(); | |||
| referencedFrames.clear(); | |||
| } | |||
| @@ -223,9 +220,10 @@ public class Frame implements DemuxOutputReceiver { | |||
| Frame frame = getContainingFrame(name); | |||
| if (frame == null) { | |||
| throw new ExecutionException("There is no project corresponding " | |||
| + "to the name \"" + name + "\""); | |||
| setOverrideProperty(name, value, mutable); | |||
| return; | |||
| } | |||
| if (frame == this) { | |||
| if (dataValues.containsKey(name) && !mutable) { | |||
| log("Ignoring oveeride for data value " + name, | |||
| @@ -238,6 +236,104 @@ public class Frame implements DemuxOutputReceiver { | |||
| } | |||
| } | |||
| /** | |||
| * When a frame has not yet been referenced, this method is used | |||
| * to set the initial properties for the frame when it is introduced. | |||
| * | |||
| * @param name the name of the value | |||
| * @param value the actual value | |||
| * @param mutable if true, existing values can be changed | |||
| * @exception ExecutionException if attempting to override a property in | |||
| * the current frame. | |||
| */ | |||
| private void setOverrideProperty(String name, Object value, | |||
| boolean mutable) | |||
| throws ExecutionException { | |||
| int refIndex = name.indexOf(Project.REF_DELIMITER); | |||
| if (refIndex == -1) { | |||
| throw new ExecutionException("Property overrides can only be set" | |||
| + " for properties in referenced projects - not " | |||
| + name); | |||
| } | |||
| String firstFrameName = name.substring(0, refIndex); | |||
| String relativeName | |||
| = name.substring(refIndex + Project.REF_DELIMITER.length()); | |||
| Map frameOverrides = (Map) overrides.get(firstFrameName); | |||
| if (frameOverrides == null) { | |||
| frameOverrides = new HashMap(); | |||
| overrides.put(firstFrameName, frameOverrides); | |||
| } | |||
| if (mutable || !frameOverrides.containsKey(relativeName)) { | |||
| frameOverrides.put(relativeName, value); | |||
| } | |||
| } | |||
| /** | |||
| * Get a value which exists in the frame property overrides awaiting | |||
| * the frame to be introduced. | |||
| * | |||
| * @param name the name of the value | |||
| * @return the value of the property or null if the property does not | |||
| * exist. | |||
| * @exception ExecutionException if attempting to get an override in | |||
| * the current frame. | |||
| */ | |||
| private Object getOverrideProperty(String name) throws ExecutionException { | |||
| int refIndex = name.indexOf(Project.REF_DELIMITER); | |||
| if (refIndex == -1) { | |||
| throw new ExecutionException("Property overrides can only be" | |||
| + " returned for properties in referenced projects - not " | |||
| + name); | |||
| } | |||
| String firstFrameName = name.substring(0, refIndex); | |||
| String relativeName | |||
| = name.substring(refIndex + Project.REF_DELIMITER.length()); | |||
| Map frameOverrides = (Map) overrides.get(firstFrameName); | |||
| if (frameOverrides == null) { | |||
| return null; | |||
| } | |||
| return frameOverrides.get(relativeName); | |||
| } | |||
| /** | |||
| * Get a value which exists in the frame property overrides awaiting | |||
| * the frame to be introduced. | |||
| * | |||
| * @param name the name of the value | |||
| * @return the value of the property or null if the property does not | |||
| * exist. | |||
| * @exception ExecutionException if attempting to check an override in | |||
| * the current frame. | |||
| */ | |||
| private boolean isOverrideSet(String name) throws ExecutionException { | |||
| int refIndex = name.indexOf(Project.REF_DELIMITER); | |||
| if (refIndex == -1) { | |||
| throw new ExecutionException("Property overrides can only be" | |||
| + " returned for properties in referenced projects - not " | |||
| + name); | |||
| } | |||
| String firstFrameName = name.substring(0, refIndex); | |||
| String relativeName | |||
| = name.substring(refIndex + Project.REF_DELIMITER.length()); | |||
| Map frameOverrides = (Map) overrides.get(firstFrameName); | |||
| if (frameOverrides == null) { | |||
| return false; | |||
| } | |||
| return frameOverrides.containsKey(relativeName); | |||
| } | |||
| /** | |||
| * Set the initial properties to be used when the frame starts execution | |||
| @@ -456,8 +552,7 @@ public class Frame implements DemuxOutputReceiver { | |||
| Frame frame = getContainingFrame(name); | |||
| if (frame == null) { | |||
| throw new ExecutionException("There is no project corresponding " | |||
| + "to the name \"" + name + "\""); | |||
| return getOverrideProperty(name); | |||
| } | |||
| if (frame == this) { | |||
| return dataValues.get(name); | |||
| @@ -480,8 +575,7 @@ public class Frame implements DemuxOutputReceiver { | |||
| Frame frame = getContainingFrame(name); | |||
| if (frame == null) { | |||
| throw new ExecutionException("There is no project corresponding " | |||
| + "to the name \"" + name + "\""); | |||
| return isOverrideSet(name); | |||
| } | |||
| if (frame == this) { | |||
| return dataValues.containsKey(name); | |||
| @@ -551,6 +645,14 @@ public class Frame implements DemuxOutputReceiver { | |||
| protected void createProjectReference(String name, Project project) | |||
| throws ExecutionException { | |||
| Frame referencedFrame = createFrame(project); | |||
| // does the frame have any overrides? | |||
| Map initialProperties = (Map) overrides.get(name); | |||
| if (initialProperties != null) { | |||
| referencedFrame.setInitialProperties(initialProperties); | |||
| overrides.remove(name); | |||
| } | |||
| referencedFrames.put(name, referencedFrame); | |||
| referencedFrame.initialize(); | |||
| } | |||
| @@ -565,7 +667,7 @@ public class Frame implements DemuxOutputReceiver { | |||
| protected Frame createFrame(Project project) | |||
| throws ExecutionException { | |||
| Frame newFrame | |||
| = new Frame(standardLibs, initConfig, config); | |||
| = new Frame(initConfig, config); | |||
| newFrame.setProject(project); | |||
| for (Iterator j = eventSupport.getListeners(); j.hasNext();) { | |||
| @@ -573,6 +675,7 @@ public class Frame implements DemuxOutputReceiver { | |||
| newFrame.addBuildListener(listener); | |||
| } | |||
| return newFrame; | |||
| } | |||
| @@ -840,11 +943,27 @@ public class Frame implements DemuxOutputReceiver { | |||
| * failed | |||
| */ | |||
| protected void initialize() throws ExecutionException { | |||
| configureServices(); | |||
| setMagicProperties(); | |||
| determineBaseDir(); | |||
| Iterator taskIterator = project.getTasks(); | |||
| executeTasks(taskIterator); | |||
| try { | |||
| // load system ant lib | |||
| URL systemLibs | |||
| = new URL(initConfig.getLibraryURL(), "syslibs/"); | |||
| componentManager.loadLib(systemLibs.toString(), true); | |||
| // execute any config tasks | |||
| executeTasks(config.getTasks()); | |||
| // now load other system libraries | |||
| URL antLibs = new URL(initConfig.getLibraryURL(), "antlibs/"); | |||
| componentManager.loadLib(antLibs.toString(), false); | |||
| executeTasks(project.getTasks()); | |||
| } catch (MalformedURLException e) { | |||
| throw new ExecutionException("Unable to initialize antlibs", e); | |||
| } | |||
| } | |||
| @@ -888,8 +1007,7 @@ public class Frame implements DemuxOutputReceiver { | |||
| private void configureServices() { | |||
| // create services and make them available in our services map | |||
| fileService = new CoreFileService(this); | |||
| componentManager = new ComponentManager(this, | |||
| config.isRemoteLibAllowed(), config.getLibraryPathsMap()); | |||
| componentManager = new ComponentManager(this); | |||
| dataService = new CoreDataService(this, | |||
| config.isUnsetPropertiesAllowed()); | |||
| execService = new CoreExecService(this); | |||
| @@ -38,6 +38,7 @@ | |||
| <taskdef name="dependset" classname="org.apache.tools.ant.taskdefs.DependSet"/> | |||
| <taskdef name="ear" classname="org.apache.tools.ant.taskdefs.Ear"/> | |||
| <taskdef name="echo" classname="org.apache.tools.ant.taskdefs.Echo"/> | |||
| <taskdef name="echoproperties" classname="org.apache.tools.ant.taskdefs.optional.EchoProperties"/> | |||
| <taskdef name="ejbc" classname="org.apache.tools.ant.taskdefs.optional.ejb.Ejbc"/> | |||
| <taskdef name="ejbjar" classname="org.apache.tools.ant.taskdefs.optional.ejb.EjbJar"/> | |||
| <taskdef name="exec" classname="org.apache.tools.ant.taskdefs.ExecTask"/> | |||
| @@ -107,6 +108,7 @@ | |||
| <taskdef name="sosget" classname="org.apache.tools.ant.taskdefs.optional.sos.SOSGet"/> | |||
| <taskdef name="soslabel" classname="org.apache.tools.ant.taskdefs.optional.sos.SOSLabel"/> | |||
| <taskdef name="sound" classname="org.apache.tools.ant.taskdefs.optional.sound.SoundTask"/> | |||
| <taskdef name="splash" classname="org.apache.tools.ant.taskdefs.optional.splash.SplashTask"/> | |||
| <taskdef name="sql" classname="org.apache.tools.ant.taskdefs.SQLExec"/> | |||
| <taskdef name="stcheckin" classname="org.apache.tools.ant.taskdefs.optional.starteam.StarTeamCheckin"/> | |||
| <taskdef name="stcheckout" classname="org.apache.tools.ant.taskdefs.optional.starteam.StarTeamCheckout"/> | |||
| @@ -155,9 +157,13 @@ | |||
| <typedef name="filelist" classname="org.apache.tools.ant.types.FileList"/> | |||
| <typedef name="patternset" classname="org.apache.tools.ant.types.PatternSet"/> | |||
| <typedef name="mapper" classname="org.apache.tools.ant.types.Mapper"/> | |||
| <typedef name="filterchain" classname="org.apache.tools.ant.types.FilterChain"/> | |||
| <typedef name="filterreader" classname="org.apache.tools.ant.types.AntFilterReader"/> | |||
| <typedef name="filterset" classname="org.apache.tools.ant.types.FilterSet"/> | |||
| <typedef name="description" classname="org.apache.tools.ant.types.Description"/> | |||
| <typedef name="classfileset" classname="org.apache.tools.ant.types.optional.depend.ClassfileSet"/> | |||
| <typedef name="substitution" classname="org.apache.tools.ant.types.Substitution"/> | |||
| <typedef name="regexp" classname="org.apache.tools.ant.types.RegularExpression"/> | |||
| <typedef name="regularexpression" classname="org.apache.tools.ant.types.RegularExpression"/> | |||
| <typedef name="xmlcatalog" classname="org.apache.tools.ant.types.XMLCatalog"/> | |||
| </antlib> | |||
| @@ -53,14 +53,8 @@ | |||
| */ | |||
| package org.apache.ant.antlib.system; | |||
| import java.util.ArrayList; | |||
| import java.util.HashMap; | |||
| import java.util.List; | |||
| import java.util.Map; | |||
| import org.apache.ant.common.antlib.AbstractComponent; | |||
| import org.apache.ant.common.antlib.AbstractTask; | |||
| import org.apache.ant.common.antlib.AntContext; | |||
| import org.apache.ant.common.service.DataService; | |||
| import org.apache.ant.common.service.ExecService; | |||
| import org.apache.ant.common.util.ExecutionException; | |||
| /** | |||
| @@ -69,154 +63,8 @@ import org.apache.ant.common.util.ExecutionException; | |||
| * @author Conor MacNeill | |||
| * @created 4 February 2002 | |||
| */ | |||
| public abstract class AntBase extends AbstractTask { | |||
| public abstract class AntBase extends SubBuild { | |||
| /** | |||
| * Simple Property value storing class | |||
| * | |||
| * @author Conor MacNeill | |||
| * @created 5 February 2002 | |||
| */ | |||
| public static class Property extends AbstractComponent { | |||
| /** The property name */ | |||
| private String name; | |||
| /** The property value */ | |||
| private String value; | |||
| /** | |||
| * Gets the name of the Property | |||
| * | |||
| * @return the name value | |||
| */ | |||
| public String getName() { | |||
| return name; | |||
| } | |||
| /** | |||
| * Gets the value of the Property | |||
| * | |||
| * @return the value value | |||
| */ | |||
| public String getValue() { | |||
| return value; | |||
| } | |||
| /** | |||
| * Sets the name of the Property | |||
| * | |||
| * @param name the new name value | |||
| */ | |||
| public void setName(String name) { | |||
| this.name = name; | |||
| } | |||
| /** | |||
| * Sets the value of the Property | |||
| * | |||
| * @param value the new value value | |||
| */ | |||
| public void setValue(String value) { | |||
| this.value = value; | |||
| } | |||
| /** | |||
| * Validate this data type instance | |||
| * | |||
| * @exception ExecutionException if either attribute has not been set | |||
| */ | |||
| public void validateComponent() throws ExecutionException { | |||
| if (name == null) { | |||
| throw new ExecutionException("\"name\" attribute of " | |||
| + "<property> must be supplied"); | |||
| } | |||
| if (value == null) { | |||
| throw new ExecutionException("\"value\" attribute of " | |||
| + "<property> must be supplied"); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * A simple class to store information about references being passed | |||
| * | |||
| * @author Conor MacNeill | |||
| * @created 5 February 2002 | |||
| */ | |||
| public static class Reference extends AbstractComponent { | |||
| /** The id of the reference to be passed */ | |||
| private String refId; | |||
| /** The id to be used in the sub-build for this reference */ | |||
| private String toId; | |||
| /** | |||
| * Gets the refId of the Reference | |||
| * | |||
| * @return the refId value | |||
| */ | |||
| public String getRefId() { | |||
| return refId; | |||
| } | |||
| /** | |||
| * Gets the toId of the Reference | |||
| * | |||
| * @return the toId value | |||
| */ | |||
| public String getToId() { | |||
| return toId; | |||
| } | |||
| /** | |||
| * Sets the refId of the Reference | |||
| * | |||
| * @param refId the new refId value | |||
| */ | |||
| public void setRefId(String refId) { | |||
| this.refId = refId; | |||
| } | |||
| /** | |||
| * Sets the toId of the Reference | |||
| * | |||
| * @param toId the new toId value | |||
| */ | |||
| public void setToId(String toId) { | |||
| this.toId = toId; | |||
| } | |||
| /** | |||
| * Validate this data type instance | |||
| * | |||
| * @exception ExecutionException if the refid attribute has not been | |||
| * set | |||
| */ | |||
| public void validateComponent() throws ExecutionException { | |||
| if (refId == null) { | |||
| throw new ExecutionException("\"refid\" attribute of " | |||
| + "<reference> must be supplied"); | |||
| } | |||
| } | |||
| } | |||
| /** The core's data service for manipulating the properties */ | |||
| private DataService dataService; | |||
| /** The core's ExecutionService for running builds and external programs */ | |||
| private ExecService execService; | |||
| /** | |||
| * flag which indicates if all current properties should be passed to the | |||
| * subbuild | |||
| @@ -229,9 +77,6 @@ public abstract class AntBase extends AbstractTask { | |||
| */ | |||
| private boolean inheritRefs = false; | |||
| /** The properties which will be passed to the sub-build */ | |||
| private Map properties = new HashMap(); | |||
| /** | |||
| * The key to the subbuild with which the Ant task can manage the subbuild | |||
| */ | |||
| @@ -240,51 +85,6 @@ public abstract class AntBase extends AbstractTask { | |||
| /** The name of the target to be evaluated in the sub-build */ | |||
| private String targetName; | |||
| /** | |||
| * Add a property to be passed to the subbuild | |||
| * | |||
| * @param property descriptor for the property to be passed | |||
| */ | |||
| public void addProperty(Property property) { | |||
| properties.put(property.getName(), property.getValue()); | |||
| } | |||
| /** | |||
| * Add a reference to be passed | |||
| * | |||
| * @param reference the descriptor of the reference to be passed | |||
| * @exception ExecutionException if the reference does not reference a | |||
| * valid object | |||
| */ | |||
| public void addReference(Reference reference) throws ExecutionException { | |||
| String refId = reference.getRefId(); | |||
| if (!dataService.isDataValueSet(refId)) { | |||
| throw new ExecutionException("RefId \"" + refId + "\" is not set"); | |||
| } | |||
| Object value = dataService.getDataValue(refId); | |||
| String toId = reference.getToId(); | |||
| if (toId == null) { | |||
| toId = refId; | |||
| } | |||
| properties.put(toId, value); | |||
| } | |||
| /** | |||
| * Get the core's execution service | |||
| * | |||
| * @return the core's execution service. | |||
| */ | |||
| protected ExecService getExecService() { | |||
| return execService; | |||
| } | |||
| /** | |||
| * Get the properties to be used with the sub-build | |||
| * | |||
| @@ -292,13 +92,13 @@ public abstract class AntBase extends AbstractTask { | |||
| */ | |||
| protected Map getProperties() { | |||
| if (!inheritAll) { | |||
| return properties; | |||
| return super.getProperties(); | |||
| } | |||
| // need to combine existing properties with new ones | |||
| Map subBuildProperties = dataService.getAllProperties(); | |||
| Map subBuildProperties = getDataService().getAllProperties(); | |||
| subBuildProperties.putAll(properties); | |||
| subBuildProperties.putAll(super.getProperties()); | |||
| return subBuildProperties; | |||
| } | |||
| @@ -331,7 +131,7 @@ public abstract class AntBase extends AbstractTask { | |||
| if (subbuildKey == null) { | |||
| super.handleSystemErr(line); | |||
| } else { | |||
| execService.handleBuildOutput(subbuildKey, line, true); | |||
| getExecService().handleBuildOutput(subbuildKey, line, true); | |||
| } | |||
| } | |||
| @@ -349,28 +149,11 @@ public abstract class AntBase extends AbstractTask { | |||
| if (subbuildKey == null) { | |||
| super.handleSystemOut(line); | |||
| } else { | |||
| execService.handleBuildOutput(subbuildKey, line, false); | |||
| getExecService().handleBuildOutput(subbuildKey, line, false); | |||
| } | |||
| } | |||
| /** | |||
| * Initialise this task | |||
| * | |||
| * @param context core's context | |||
| * @param componentType the component type of this component (i.e its | |||
| * defined name in the build file) | |||
| * @exception ExecutionException if we can't access the data service | |||
| */ | |||
| public void init(AntContext context, String componentType) | |||
| throws ExecutionException { | |||
| super.init(context, componentType); | |||
| dataService = (DataService) getCoreService(DataService.class); | |||
| execService = (ExecService) getCoreService(ExecService.class); | |||
| } | |||
| /** | |||
| * Indicate if all properties should be passed | |||
| * | |||
| @@ -392,17 +175,6 @@ public abstract class AntBase extends AbstractTask { | |||
| } | |||
| /** | |||
| * Set a property for the subbuild | |||
| * | |||
| * @param propertyName the property name | |||
| * @param propertyValue the value of the property | |||
| */ | |||
| protected void setProperty(String propertyName, Object propertyValue) { | |||
| properties.put(propertyName, propertyValue); | |||
| } | |||
| /** | |||
| * Set the key of the subbuild | |||
| * | |||
| @@ -60,6 +60,7 @@ import org.apache.ant.common.antlib.AbstractTask; | |||
| import org.apache.ant.common.antlib.AntContext; | |||
| import org.apache.ant.common.service.ComponentService; | |||
| import org.apache.ant.common.util.ExecutionException; | |||
| import org.apache.ant.common.event.MessageLevel; | |||
| import org.apache.ant.init.InitUtils; | |||
| /** | |||
| @@ -153,6 +154,8 @@ public class LibPath extends AbstractTask { | |||
| AntContext context = getAntContext(); | |||
| ComponentService componentService = (ComponentService) | |||
| context.getCoreService(ComponentService.class); | |||
| log("Adding lib path " + url + " for " + libraryId, | |||
| MessageLevel.MSG_DEBUG); | |||
| componentService.addLibPath(libraryId, url); | |||
| } | |||
| @@ -0,0 +1,313 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * 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: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by 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. | |||
| * | |||
| * 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 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.antlib.system; | |||
| import java.util.HashMap; | |||
| import java.util.Map; | |||
| import org.apache.ant.common.antlib.AbstractComponent; | |||
| import org.apache.ant.common.antlib.AbstractTask; | |||
| import org.apache.ant.common.antlib.AntContext; | |||
| import org.apache.ant.common.service.DataService; | |||
| import org.apache.ant.common.service.ExecService; | |||
| import org.apache.ant.common.util.ExecutionException; | |||
| /** | |||
| * Common Base class all tasks that can pass references and property overrides | |||
| * to a subbuild | |||
| * | |||
| * @author Conor MacNeill | |||
| * @created 22 April 2002 | |||
| */ | |||
| public abstract class SubBuild extends AbstractTask { | |||
| /** | |||
| * Simple Property value storing class | |||
| * | |||
| * @author Conor MacNeill | |||
| * @created 5 February 2002 | |||
| */ | |||
| public static class Property extends AbstractComponent { | |||
| /** The property name */ | |||
| private String name; | |||
| /** The property value */ | |||
| private String value; | |||
| /** | |||
| * Gets the name of the Property | |||
| * | |||
| * @return the name value | |||
| */ | |||
| public String getName() { | |||
| return name; | |||
| } | |||
| /** | |||
| * Gets the value of the Property | |||
| * | |||
| * @return the value value | |||
| */ | |||
| public String getValue() { | |||
| return value; | |||
| } | |||
| /** | |||
| * Sets the name of the Property | |||
| * | |||
| * @param name the new name value | |||
| */ | |||
| public void setName(String name) { | |||
| this.name = name; | |||
| } | |||
| /** | |||
| * Sets the value of the Property | |||
| * | |||
| * @param value the new value value | |||
| */ | |||
| public void setValue(String value) { | |||
| this.value = value; | |||
| } | |||
| /** | |||
| * Validate this data type instance | |||
| * | |||
| * @exception ExecutionException if either attribute has not been set | |||
| */ | |||
| public void validateComponent() throws ExecutionException { | |||
| if (name == null) { | |||
| throw new ExecutionException("\"name\" attribute of " | |||
| + "<property> must be supplied"); | |||
| } | |||
| if (value == null) { | |||
| throw new ExecutionException("\"value\" attribute of " | |||
| + "<property> must be supplied"); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * A simple class to store information about references being passed | |||
| * | |||
| * @author Conor MacNeill | |||
| * @created 5 February 2002 | |||
| */ | |||
| public static class Reference extends AbstractComponent { | |||
| /** The id of the reference to be passed */ | |||
| private String refId; | |||
| /** The id to be used in the sub-build for this reference */ | |||
| private String toId; | |||
| /** | |||
| * Gets the refId of the Reference | |||
| * | |||
| * @return the refId value | |||
| */ | |||
| public String getRefId() { | |||
| return refId; | |||
| } | |||
| /** | |||
| * Gets the toId of the Reference | |||
| * | |||
| * @return the toId value | |||
| */ | |||
| public String getToId() { | |||
| return toId; | |||
| } | |||
| /** | |||
| * Sets the refId of the Reference | |||
| * | |||
| * @param refId the new refId value | |||
| */ | |||
| public void setRefId(String refId) { | |||
| this.refId = refId; | |||
| } | |||
| /** | |||
| * Sets the toId of the Reference | |||
| * | |||
| * @param toId the new toId value | |||
| */ | |||
| public void setToId(String toId) { | |||
| this.toId = toId; | |||
| } | |||
| /** | |||
| * Validate this data type instance | |||
| * | |||
| * @exception ExecutionException if the refid attribute has not been | |||
| * set | |||
| */ | |||
| public void validateComponent() throws ExecutionException { | |||
| if (refId == null) { | |||
| throw new ExecutionException("\"refid\" attribute of " | |||
| + "<reference> must be supplied"); | |||
| } | |||
| } | |||
| } | |||
| /** The core's data service for manipulating the properties */ | |||
| private DataService dataService; | |||
| /** The core's ExecutionService for running builds and external programs */ | |||
| private ExecService execService; | |||
| /** The properties which will be passed to the sub-build */ | |||
| private Map properties = new HashMap(); | |||
| /** | |||
| * Add a property to be passed to the subbuild | |||
| * | |||
| * @param property descriptor for the property to be passed | |||
| */ | |||
| public void addProperty(Property property) { | |||
| properties.put(property.getName(), property.getValue()); | |||
| } | |||
| /** | |||
| * Add a reference to be passed | |||
| * | |||
| * @param reference the descriptor of the reference to be passed | |||
| * @exception ExecutionException if the reference does not reference a | |||
| * valid object | |||
| */ | |||
| public void addReference(Reference reference) throws ExecutionException { | |||
| String refId = reference.getRefId(); | |||
| if (!dataService.isDataValueSet(refId)) { | |||
| throw new ExecutionException("RefId \"" + refId + "\" is not set"); | |||
| } | |||
| Object value = dataService.getDataValue(refId); | |||
| String toId = reference.getToId(); | |||
| if (toId == null) { | |||
| toId = refId; | |||
| } | |||
| properties.put(toId, value); | |||
| } | |||
| /** | |||
| * Get the core's execution service | |||
| * | |||
| * @return the core's execution service. | |||
| */ | |||
| protected ExecService getExecService() { | |||
| return execService; | |||
| } | |||
| /** | |||
| * Get the core's date service | |||
| * | |||
| * @return the core's data service. | |||
| */ | |||
| protected DataService getDataService() { | |||
| return dataService; | |||
| } | |||
| /** | |||
| * Get the properties to be used with the sub-build | |||
| * | |||
| * @return the properties the sub-build will start with | |||
| */ | |||
| protected Map getProperties() { | |||
| return properties; | |||
| } | |||
| /** | |||
| * Initialise this task | |||
| * | |||
| * @param context core's context | |||
| * @param componentType the component type of this component (i.e its | |||
| * defined name in the build file) | |||
| * @exception ExecutionException if we can't access the data service | |||
| */ | |||
| public void init(AntContext context, String componentType) | |||
| throws ExecutionException { | |||
| super.init(context, componentType); | |||
| dataService = (DataService) getCoreService(DataService.class); | |||
| execService = (ExecService) getCoreService(ExecService.class); | |||
| } | |||
| /** | |||
| * Set a property for the subbuild | |||
| * | |||
| * @param propertyName the property name | |||
| * @param propertyValue the value of the property | |||
| */ | |||
| protected void setProperty(String propertyName, Object propertyValue) { | |||
| properties.put(propertyName, propertyValue); | |||
| } | |||
| } | |||
| @@ -25,7 +25,7 @@ public class Ant1CompatBuilder { | |||
| "${lib.dir}/ant1compat", "*.jar"); | |||
| helper.addPathElementToPath("classpath", "${distlib.dir}/init.jar"); | |||
| helper.addPathElementToPath("classpath", "${distlib.dir}/common/common.jar"); | |||
| helper.addPathElementToPath("classpath", "${distlib.dir}/antlibs/system.jar"); | |||
| helper.addPathElementToPath("classpath", "${distlib.dir}/syslibs/system.jar"); | |||
| } | |||
| protected void check_for_optional_packages(BuildHelper helper) { | |||
| } | |||
| @@ -36,6 +36,7 @@ public class Ant1CompatBuilder { | |||
| helper.javac("${bin.dir}/ant1src_copy:${java.dir}/antlibs/ant1compat", "${bin.dir}/ant1compat", "classpath"); | |||
| helper.copyFileset("${bin.dir}/ant1src_copy", "${bin.dir}/ant1compat"); | |||
| helper.copyFileset("${ant1etc.dir}", "${bin.dir}/ant1compat/${optional.package}/junit/xsl"); | |||
| helper.mkdir("${distlib.dir}/antlibs/"); | |||
| helper.jar("${bin.dir}/ant1compat", "${distlib.dir}/antlibs/ant1compat.jar", | |||
| "${java.dir}/antlibs/ant1compat", "antlib.xml", null, null); | |||
| } | |||
| @@ -209,12 +209,7 @@ public class Builder { | |||
| mutantBuilder.antcore(mainBuild); | |||
| mutantBuilder.start(mainBuild); | |||
| mutantBuilder.frontend(mainBuild); | |||
| BuildHelper systemBuild = new BuildHelper(); | |||
| systemBuild.setProperty("libset", "system"); | |||
| systemBuild.setProperty("dist.dir", "bootstrap"); | |||
| mutantBuilder._init(systemBuild); | |||
| mutantBuilder.build_lib(systemBuild); | |||
| mutantBuilder.systemlib(mainBuild); | |||
| Ant1CompatBuilder ant1Builder = new Ant1CompatBuilder(); | |||
| BuildHelper ant1Build = new BuildHelper(); | |||
| @@ -78,15 +78,15 @@ public class MutantBuilder { | |||
| } | |||
| protected void antlibs(BuildHelper helper) { | |||
| } | |||
| protected void build_lib(BuildHelper helper) { | |||
| helper.mkdir("${bin.dir}/antlibs/${libset}"); | |||
| helper.mkdir("${distlib.dir}/antlibs"); | |||
| protected void systemlib(BuildHelper helper) { | |||
| helper.mkdir("${bin.dir}/antlibs/system"); | |||
| helper.mkdir("${distlib.dir}/syslibs"); | |||
| helper.createPath("classpath.antlibs"); | |||
| helper.addPathElementToPath("classpath.antlibs", "${distlib.dir}/common/common.jar"); | |||
| helper.addPathToPath("classpath.antlibs", "classpath.common"); | |||
| helper.javac("${java.dir}/antlibs/${libset}", "${bin.dir}/antlibs/${libset}", "classpath.antlibs"); | |||
| helper.jar("${bin.dir}/antlibs/${libset}", "${distlib.dir}/antlibs/${libset}.jar", | |||
| "${java.dir}/antlibs/${libset}", "antlib.xml", null, null); | |||
| helper.javac("${java.dir}/antlibs/system", "${bin.dir}/antlibs/system", "classpath.antlibs"); | |||
| helper.jar("${bin.dir}/antlibs/system", "${distlib.dir}/syslibs/system.jar", | |||
| "${java.dir}/antlibs/system", "antlib.xml", null, null); | |||
| } | |||
| protected void main(BuildHelper helper) { | |||
| } | |||
| @@ -240,6 +240,7 @@ public class LoaderUtils { | |||
| } | |||
| if (!location.isDirectory()) { | |||
| urls = new URL[1]; | |||
| String path = location.getPath(); | |||
| for (int i = 0; i < extensions.length; ++i) { | |||
| if (path.endsWith(extensions[i])) { | |||