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])) { | |||