Browse Source

Make config processing use Tasks to provide config operations

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272626 13f79535-47bb-0310-9956-ffa450edef68
master
Conor MacNeill 23 years ago
parent
commit
cba254e641
20 changed files with 544 additions and 784 deletions
  1. +8
    -11
      proposal/mutant/build.xml
  2. +4
    -1
      proposal/mutant/build/ant1compat.xml
  3. +9
    -7
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/antlib/AntLibManager.java
  4. +17
    -119
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/config/AntConfig.java
  5. +12
    -30
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/config/AntConfigHandler.java
  6. +0
    -141
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/config/LibPathHandler.java
  7. +0
    -110
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/config/LoadLibHandler.java
  8. +12
    -38
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/ComponentManager.java
  9. +0
    -1
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/Constants.java
  10. +0
    -24
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/CoreExecService.java
  11. +1
    -30
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/ExecutionManager.java
  12. +143
    -25
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/Frame.java
  13. +6
    -0
      proposal/mutant/src/java/antlibs/ant1compat/antlib.xml
  14. +6
    -234
      proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/AntBase.java
  15. +3
    -0
      proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/LibPath.java
  16. +313
    -0
      proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/SubBuild.java
  17. +2
    -1
      proposal/mutant/src/java/bootstrap/org/apache/ant/builder/Ant1CompatBuilder.java
  18. +1
    -6
      proposal/mutant/src/java/bootstrap/org/apache/ant/builder/Builder.java
  19. +6
    -6
      proposal/mutant/src/java/bootstrap/org/apache/ant/builder/MutantBuilder.java
  20. +1
    -0
      proposal/mutant/src/java/init/org/apache/ant/init/LoaderUtils.java

+ 8
- 11
proposal/mutant/build.xml View File

@@ -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>


+ 4
- 1
proposal/mutant/build/ant1compat.xml View File

@@ -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"/>


+ 9
- 7
proposal/mutant/src/java/antcore/org/apache/ant/antcore/antlib/AntLibManager.java View File

@@ -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);
}
}
}



+ 17
- 119
proposal/mutant/src/java/antcore/org/apache/ant/antcore/config/AntConfig.java View File

@@ -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);
}
}


+ 12
- 30
proposal/mutant/src/java/antcore/org/apache/ant/antcore/config/AntConfigHandler.java View File

@@ -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);
// }
}

/**


+ 0
- 141
proposal/mutant/src/java/antcore/org/apache/ant/antcore/config/LibPathHandler.java View File

@@ -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);
}
}
}



+ 0
- 110
proposal/mutant/src/java/antcore/org/apache/ant/antcore/config/LoadLibHandler.java View File

@@ -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);
}
}
}



+ 12
- 38
proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/ComponentManager.java View File

@@ -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
*


+ 0
- 1
proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/Constants.java View File

@@ -65,6 +65,5 @@ public abstract class Constants {

/** The Ant aspect used to identify Ant metadata */
public static final String ANT_ASPECT = "ant";

}


+ 0
- 24
proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/CoreExecService.java View File

@@ -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.
*


+ 1
- 30
proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/ExecutionManager.java View File

@@ -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);


+ 143
- 25
proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/Frame.java View File

@@ -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);


+ 6
- 0
proposal/mutant/src/java/antlibs/ant1compat/antlib.xml View File

@@ -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>

+ 6
- 234
proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/AntBase.java View File

@@ -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
*


+ 3
- 0
proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/LibPath.java View File

@@ -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);
}



+ 313
- 0
proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/SubBuild.java View File

@@ -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);
}
}


+ 2
- 1
proposal/mutant/src/java/bootstrap/org/apache/ant/builder/Ant1CompatBuilder.java View File

@@ -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);
}


+ 1
- 6
proposal/mutant/src/java/bootstrap/org/apache/ant/builder/Builder.java View File

@@ -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();


+ 6
- 6
proposal/mutant/src/java/bootstrap/org/apache/ant/builder/MutantBuilder.java View File

@@ -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) {
}


+ 1
- 0
proposal/mutant/src/java/init/org/apache/ant/init/LoaderUtils.java View File

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


Loading…
Cancel
Save