git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271149 13f79535-47bb-0310-9956-ffa450edef68master
@@ -52,8 +52,7 @@ | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.antlib; | |||
import org.apache.ant.antcore.util.ConfigException; | |||
import org.apache.ant.common.util.ConfigException; | |||
import org.apache.ant.antcore.xml.ElementHandler; | |||
import org.xml.sax.Attributes; | |||
import org.xml.sax.SAXParseException; | |||
@@ -60,11 +60,11 @@ import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import org.apache.ant.antcore.util.CircularDependencyChecker; | |||
import org.apache.ant.antcore.util.CircularDependencyException; | |||
import org.apache.ant.antcore.util.ConfigException; | |||
import org.apache.ant.antcore.xml.ParseContext; | |||
import org.apache.ant.antcore.xml.XMLParseException; | |||
import org.apache.ant.common.util.CircularDependencyChecker; | |||
import org.apache.ant.common.util.CircularDependencyException; | |||
import org.apache.ant.common.util.ExecutionException; | |||
import org.apache.ant.init.InitConfig; | |||
import org.apache.ant.init.InitUtils; | |||
import org.apache.ant.init.LoaderUtils; | |||
@@ -102,10 +102,10 @@ public class AntLibManager { | |||
* @param libURL the URL from which Ant libraries are to be loaded | |||
* @exception MalformedURLException if the URL for the individual | |||
* library components cannot be formed | |||
* @exception ConfigException if the library specs cannot be parsed | |||
* @exception ExecutionException if the library specs cannot be parsed | |||
*/ | |||
public void addAntLibraries(Map librarySpecs, URL libURL) | |||
throws MalformedURLException, ConfigException { | |||
throws MalformedURLException, ExecutionException { | |||
URL[] libURLs = LoaderUtils.getLocationURLs(libURL, libURL.toString(), | |||
ANTLIB_EXTENSIONS); | |||
@@ -122,7 +122,7 @@ public class AntLibManager { | |||
if (antLibrarySpec != null) { | |||
String libraryId = antLibrarySpec.getLibraryId(); | |||
if (librarySpecs.containsKey(libraryId)) { | |||
throw new ConfigException("Found more than one " | |||
throw new ExecutionException("Found more than one " | |||
+ "copy of library with id = " + libraryId + | |||
" (" + libURLs[i] + ")"); | |||
} | |||
@@ -134,7 +134,7 @@ public class AntLibManager { | |||
// ignore file not found exceptions - means the | |||
// jar does not provide META-INF/antlib.xml | |||
if (!(t instanceof FileNotFoundException)) { | |||
throw new ConfigException("Unable to parse Ant library " | |||
throw new ExecutionException("Unable to parse Ant library " | |||
+ libURLs[i], e); | |||
} | |||
} | |||
@@ -149,12 +149,12 @@ 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 | |||
* @exception ConfigException if a library cannot be configured from the | |||
* given specification | |||
* @exception ExecutionException if a library cannot be configured from | |||
* the given specification | |||
*/ | |||
public void configLibraries(InitConfig initConfig, Map librarySpecs, | |||
Map libraries) | |||
throws ConfigException { | |||
throws ExecutionException { | |||
// check if any already defined | |||
for (Iterator i = librarySpecs.keySet().iterator(); i.hasNext(); ) { | |||
@@ -162,7 +162,7 @@ public class AntLibManager { | |||
if (libraries.containsKey(libraryId)) { | |||
AntLibrary currentVersion | |||
= (AntLibrary)libraries.get(libraryId); | |||
throw new ConfigException("Ant Library \"" + libraryId | |||
throw new ExecutionException("Ant Library \"" + libraryId | |||
+ "\" is already loaded from " | |||
+ currentVersion.getDefinitionURL()); | |||
} | |||
@@ -185,12 +185,12 @@ public class AntLibManager { | |||
* @param libLocationString URL or file where libraries can be found | |||
* @param librarySpecs A collection of library specs which will be | |||
* populated with the libraries found | |||
* @exception ConfigException if the libraries cannot be loaded | |||
* @exception ExecutionException if the libraries cannot be loaded | |||
* @exception MalformedURLException if the library's location cannot be | |||
* formed | |||
*/ | |||
public void loadLib(Map librarySpecs, String libLocationString) | |||
throws ConfigException, MalformedURLException { | |||
throws ExecutionException, MalformedURLException { | |||
File libLocation = new File(libLocationString); | |||
if (!libLocation.exists()) { | |||
@@ -198,7 +198,7 @@ public class AntLibManager { | |||
URL libLocationURL = new URL(libLocationString); | |||
if (!libLocationURL.getProtocol().equals("file") | |||
&& !remoteAllowed) { | |||
throw new ConfigException("The config library " | |||
throw new ExecutionException("The config library " | |||
+ "location \"" + libLocationString | |||
+ "\" cannot be used because config does " | |||
+ "not allow remote libraries"); | |||
@@ -223,13 +223,13 @@ public class AntLibManager { | |||
* dependencies. | |||
* @param libraries the collection of libraries which have already been | |||
* configured | |||
* @exception ConfigException if the library cannot be configured. | |||
* @exception ExecutionException if the library cannot be configured. | |||
*/ | |||
private void configLibrary(InitConfig initConfig, Map librarySpecs, | |||
String libraryId, | |||
CircularDependencyChecker configuring, | |||
Map libraries) | |||
throws ConfigException { | |||
throws ExecutionException { | |||
try { | |||
configuring.visitNode(libraryId); | |||
@@ -240,7 +240,7 @@ public class AntLibManager { | |||
if (extendsId != null) { | |||
if (!libraries.containsKey(extendsId)) { | |||
if (!librarySpecs.containsKey(extendsId)) { | |||
throw new ConfigException("Could not find library, " | |||
throw new ExecutionException("Could not find library, " | |||
+ extendsId + ", upon which library " | |||
+ libraryId + " depends"); | |||
} | |||
@@ -284,7 +284,7 @@ public class AntLibManager { | |||
libraries.put(libraryId, antLibrary); | |||
configuring.leaveNode(libraryId); | |||
} catch (CircularDependencyException e) { | |||
throw new ConfigException(e); | |||
throw new ExecutionException(e); | |||
} | |||
} | |||
@@ -57,7 +57,7 @@ import java.util.ArrayList; | |||
import java.util.HashMap; | |||
import java.util.List; | |||
import java.util.Map; | |||
import org.apache.ant.antcore.util.ConfigException; | |||
import org.apache.ant.common.util.ConfigException; | |||
/** | |||
* This class represents the specification of an Ant library. It is merely | |||
@@ -60,7 +60,7 @@ import java.util.HashMap; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import org.apache.ant.antcore.util.ConfigException; | |||
import org.apache.ant.common.util.ConfigException; | |||
import org.apache.ant.common.util.PathTokenizer; | |||
import org.apache.ant.init.InitUtils; | |||
@@ -52,7 +52,7 @@ | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.config; | |||
import org.apache.ant.antcore.util.ConfigException; | |||
import org.apache.ant.common.util.ConfigException; | |||
import org.apache.ant.antcore.xml.ElementHandler; | |||
import org.xml.sax.Attributes; | |||
import org.xml.sax.SAXParseException; | |||
@@ -56,7 +56,7 @@ import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import org.apache.ant.antcore.model.ModelElement; | |||
import org.apache.ant.common.model.ModelElement; | |||
import org.apache.ant.common.event.BuildListener; | |||
import org.apache.ant.common.event.BuildEvent; | |||
@@ -101,19 +101,6 @@ public class BuildEventSupport { | |||
listeners.remove(listener); | |||
} | |||
/** | |||
* Forward the given event to the subscibed listeners | |||
* | |||
* @param event the event to be forwarded to the listeners | |||
*/ | |||
public void forwardEvent(BuildEvent event) { | |||
for (Iterator i = listeners.iterator(); i.hasNext(); ) { | |||
BuildListener listener = (BuildListener)i.next(); | |||
listener.processBuildEvent(event); | |||
} | |||
} | |||
/** | |||
* Fire a build started event | |||
* | |||
@@ -121,7 +108,10 @@ public class BuildEventSupport { | |||
*/ | |||
public void fireBuildStarted(ModelElement element) { | |||
BuildEvent event = new BuildEvent(element, BuildEvent.BUILD_STARTED); | |||
forwardEvent(event); | |||
for (Iterator i = listeners.iterator(); i.hasNext(); ) { | |||
BuildListener listener = (BuildListener)i.next(); | |||
listener.buildStarted(event); | |||
} | |||
} | |||
/** | |||
@@ -134,7 +124,10 @@ public class BuildEventSupport { | |||
Throwable cause) { | |||
BuildEvent event = new BuildEvent(element, BuildEvent.BUILD_FINISHED, | |||
cause); | |||
forwardEvent(event); | |||
for (Iterator i = listeners.iterator(); i.hasNext(); ) { | |||
BuildListener listener = (BuildListener)i.next(); | |||
listener.buildFinished(event); | |||
} | |||
} | |||
/** | |||
@@ -144,7 +137,10 @@ public class BuildEventSupport { | |||
*/ | |||
public void fireTargetStarted(ModelElement element) { | |||
BuildEvent event = new BuildEvent(element, BuildEvent.TARGET_STARTED); | |||
forwardEvent(event); | |||
for (Iterator i = listeners.iterator(); i.hasNext(); ) { | |||
BuildListener listener = (BuildListener)i.next(); | |||
listener.targetStarted(event); | |||
} | |||
} | |||
/** | |||
@@ -157,7 +153,10 @@ public class BuildEventSupport { | |||
Throwable cause) { | |||
BuildEvent event = new BuildEvent(element, BuildEvent.TARGET_FINISHED, | |||
cause); | |||
forwardEvent(event); | |||
for (Iterator i = listeners.iterator(); i.hasNext(); ) { | |||
BuildListener listener = (BuildListener)i.next(); | |||
listener.targetFinished(event); | |||
} | |||
} | |||
/** | |||
@@ -167,7 +166,10 @@ public class BuildEventSupport { | |||
*/ | |||
public void fireTaskStarted(ModelElement element) { | |||
BuildEvent event = new BuildEvent(element, BuildEvent.TASK_STARTED); | |||
forwardEvent(event); | |||
for (Iterator i = listeners.iterator(); i.hasNext(); ) { | |||
BuildListener listener = (BuildListener)i.next(); | |||
listener.taskStarted(event); | |||
} | |||
} | |||
/** | |||
@@ -180,7 +182,10 @@ public class BuildEventSupport { | |||
Throwable cause) { | |||
BuildEvent event = new BuildEvent(element, BuildEvent.TASK_FINISHED, | |||
cause); | |||
forwardEvent(event); | |||
for (Iterator i = listeners.iterator(); i.hasNext(); ) { | |||
BuildListener listener = (BuildListener)i.next(); | |||
listener.taskFinished(event); | |||
} | |||
} | |||
/** | |||
@@ -193,7 +198,10 @@ public class BuildEventSupport { | |||
public void fireMessageLogged(ModelElement element, | |||
String message, int priority) { | |||
BuildEvent event = new BuildEvent(element, message, priority); | |||
forwardEvent(event); | |||
for (Iterator i = listeners.iterator(); i.hasNext(); ) { | |||
BuildListener listener = (BuildListener)i.next(); | |||
listener.messageLogged(event); | |||
} | |||
} | |||
} | |||
@@ -95,7 +95,16 @@ public class ClassIntrospector { | |||
&& !args[0].isArray()) { | |||
reflector.addAttributeMethod(m, getPropertyName(name, "set"), | |||
converters); | |||
} else if (name.startsWith("add") | |||
} else if (name.startsWith("addConfigured") | |||
&& name.length() > 13 | |||
&& returnType.equals(Void.TYPE) | |||
&& args.length == 1 | |||
&& !args[0].equals(String.class) | |||
&& !args[0].isArray() | |||
&& !args[0].isPrimitive()) { | |||
reflector.addElementMethod(m, | |||
getPropertyName(name, "addConfigured")); | |||
} else if (name.startsWith("add") | |||
&& name.length() > 3 | |||
&& returnType.equals(Void.TYPE) | |||
&& args.length == 1 | |||
@@ -103,7 +112,7 @@ public class ClassIntrospector { | |||
&& !args[0].isArray() | |||
&& !args[0].isPrimitive()) { | |||
reflector.addElementMethod(m, getPropertyName(name, "add")); | |||
} else if (name.startsWith("create") | |||
} else if (name.startsWith("create") | |||
&& name.length() > 6 | |||
&& !returnType.isArray() | |||
&& !returnType.isPrimitive() | |||
@@ -0,0 +1,358 @@ | |||
/* | |||
* 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.execution; | |||
import java.io.File; | |||
import java.net.MalformedURLException; | |||
import java.util.HashMap; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import org.apache.ant.antcore.antlib.AntLibDefinition; | |||
import org.apache.ant.antcore.antlib.AntLibManager; | |||
import org.apache.ant.antcore.antlib.AntLibrary; | |||
import org.apache.ant.antcore.modelparser.XMLProjectParser; | |||
import org.apache.ant.antcore.xml.XMLParseException; | |||
import org.apache.ant.common.antlib.AntLibFactory; | |||
import org.apache.ant.common.antlib.Converter; | |||
import org.apache.ant.common.antlib.StandardLibFactory; | |||
import org.apache.ant.common.model.Project; | |||
import org.apache.ant.common.service.ComponentService; | |||
import org.apache.ant.common.util.ExecutionException; | |||
import org.apache.ant.init.InitUtils; | |||
/** | |||
* The instance of the ComponentServices made available by the core to the | |||
* ant libraries. | |||
* | |||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||
* @created 27 January 2002 | |||
*/ | |||
public class ComponentManager implements ComponentService { | |||
/** The prefix for library ids that are automatically imported */ | |||
public final static String ANT_LIB_PREFIX = "ant."; | |||
/** | |||
* Type converters for this executionFrame. Converters are used when | |||
* configuring Tasks to handle special type conversions. | |||
*/ | |||
private Map converters = new HashMap(); | |||
/** The factory objects for each library, indexed by the library Id */ | |||
private Map libFactories = new HashMap(); | |||
/** The ExecutionFrame this service instance is working for */ | |||
private ExecutionFrame frame; | |||
/** The library manager instance used to configure libraries. */ | |||
private AntLibManager libManager; | |||
/** | |||
* These are AntLibraries which have been loaded into this component | |||
* manager | |||
*/ | |||
private Map antLibraries; | |||
/** The definitions which have been imported into this frame. */ | |||
private Map definitions = new HashMap(); | |||
/** | |||
* Constructor | |||
* | |||
* @param executionFrame the frame containing this context | |||
* @param allowRemoteLibs true if remote libraries can be loaded though | |||
* this service. | |||
*/ | |||
protected ComponentManager(ExecutionFrame executionFrame, | |||
boolean allowRemoteLibs) { | |||
this.frame = executionFrame; | |||
libManager = new AntLibManager(allowRemoteLibs); | |||
} | |||
/** | |||
* Load a library or set of libraries from a location making them | |||
* available for use | |||
* | |||
* @param libLocation the file or URL of the library location | |||
* @param importAll if true all tasks are imported as the library is | |||
* loaded | |||
* @exception ExecutionException if the library cannot be loaded | |||
*/ | |||
public void loadLib(String libLocation, boolean importAll) | |||
throws ExecutionException { | |||
try { | |||
Map librarySpecs = new HashMap(); | |||
libManager.loadLib(librarySpecs, libLocation); | |||
libManager.configLibraries(frame.getInitConfig(), librarySpecs, | |||
antLibraries); | |||
if (importAll) { | |||
Iterator i = librarySpecs.keySet().iterator(); | |||
while (i.hasNext()) { | |||
String libraryId = (String)i.next(); | |||
importLibrary(libraryId); | |||
} | |||
} | |||
} catch (MalformedURLException e) { | |||
throw new ExecutionException("Unable to load libraries from " | |||
+ libLocation, e); | |||
} | |||
} | |||
/** | |||
* Run a sub-build. | |||
* | |||
* @param antFile the file containing the XML description of the model | |||
* @param targets A list of targets to be run | |||
* @param properties the initiali properties to be used in the build | |||
* @exception ExecutionException if the subbuild cannot be run | |||
*/ | |||
public void runBuild(File antFile, Map properties, List targets) | |||
throws ExecutionException { | |||
try { | |||
// Parse the build file into a project | |||
XMLProjectParser parser = new XMLProjectParser(); | |||
Project project | |||
= parser.parseBuildFile(InitUtils.getFileURL(antFile)); | |||
runBuild(project, properties, targets); | |||
} catch (MalformedURLException e) { | |||
throw new ExecutionException(e); | |||
} catch (XMLParseException e) { | |||
throw new ExecutionException(e); | |||
} | |||
} | |||
/** | |||
* Run a sub-build. | |||
* | |||
* @param model the project model to be used for the build | |||
* @param targets A list of targets to be run | |||
* @param properties the initiali properties to be used in the build | |||
* @exception ExecutionException if the subbuild cannot be run | |||
*/ | |||
public void runBuild(Project model, Map properties, List targets) | |||
throws ExecutionException { | |||
ExecutionFrame newFrame = frame.createFrame(model); | |||
newFrame.setInitialProperties(properties); | |||
newFrame.runBuild(targets); | |||
} | |||
/** | |||
* Run a sub-build using the current frame's project model | |||
* | |||
* @param targets A list of targets to be run | |||
* @param properties the initiali properties to be used in the build | |||
* @exception ExecutionException if the subbuild cannot be run | |||
*/ | |||
public void callTarget(Map properties, List targets) | |||
throws ExecutionException { | |||
runBuild(frame.getProject(), properties, targets); | |||
} | |||
/** | |||
* 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(ANT_LIB_PREFIX)) { | |||
// standard library - import whole library | |||
importLibrary(libraryId); | |||
} | |||
} | |||
} | |||
/** | |||
* Get the collection ov converters currently configured | |||
* | |||
* @return A map of converter instances indexed on the class they can | |||
* convert | |||
*/ | |||
protected Map getConverters() { | |||
return converters; | |||
} | |||
/** | |||
* Get the collection of Ant Libraries defined for this frame | |||
* | |||
* @return a map of Ant Libraries indexed by thier library Id | |||
*/ | |||
protected Map getAntLibraries() { | |||
return antLibraries; | |||
} | |||
/** | |||
* Gets the factory object for the given library | |||
* | |||
* @param antLibrary the library for which the factory is required | |||
* @return the library's factory object | |||
* @exception ExecutionException if the factory cannot be initialised | |||
*/ | |||
protected AntLibFactory getLibFactory(AntLibrary antLibrary) | |||
throws ExecutionException { | |||
String libraryId = antLibrary.getLibraryId(); | |||
if (libFactories.containsKey(libraryId)) { | |||
return (AntLibFactory)libFactories.get(libraryId); | |||
} | |||
AntLibFactory libFactory = antLibrary.getFactory(); | |||
if (libFactory == null) { | |||
libFactory = new StandardLibFactory(); | |||
} | |||
libFactories.put(libraryId, libFactory); | |||
libFactory.init(new ExecutionContext(frame)); | |||
return libFactory; | |||
} | |||
/** | |||
* Get an imported definition from the component manager | |||
* | |||
* @param name the name under which the component has been imported | |||
* @return the ImportInfo object detailing the import's library and | |||
* other details | |||
*/ | |||
protected ImportInfo getDefinition(String name) { | |||
return (ImportInfo)definitions.get(name); | |||
} | |||
/** | |||
* Import a complete library into this frame | |||
* | |||
* @param libraryId The id of the library to be imported | |||
* @exception ExecutionException if the library cannot be imported | |||
*/ | |||
protected void importLibrary(String libraryId) throws ExecutionException { | |||
AntLibrary library = (AntLibrary)antLibraries.get(libraryId); | |||
if (library == null) { | |||
throw new ExecutionException("Unable to import library " + libraryId | |||
+ " as it has not been loaded"); | |||
} | |||
Map libDefs = library.getDefinitions(); | |||
for (Iterator i = libDefs.keySet().iterator(); i.hasNext(); ) { | |||
String defName = (String)i.next(); | |||
AntLibDefinition libdef | |||
= (AntLibDefinition)libDefs.get(defName); | |||
definitions.put(defName, new ImportInfo(library, libdef)); | |||
} | |||
addLibraryConverters(library); | |||
} | |||
/** | |||
* Add the converters from the given library to those managed by this | |||
* frame. | |||
* | |||
* @param library the library from which the converters are required | |||
* @exception ExecutionException if a converter defined in the library | |||
* cannot be instantiated | |||
*/ | |||
private void addLibraryConverters(AntLibrary library) | |||
throws ExecutionException { | |||
if (!library.hasConverters()) { | |||
return; | |||
} | |||
String className = null; | |||
try { | |||
AntLibFactory libFactory = getLibFactory(library); | |||
ClassLoader converterLoader = library.getClassLoader(); | |||
for (Iterator i = library.getConverterClassNames(); i.hasNext(); ) { | |||
className = (String)i.next(); | |||
Class converterClass | |||
= Class.forName(className, true, converterLoader); | |||
if (!Converter.class.isAssignableFrom(converterClass)) { | |||
throw new ExecutionException("In Ant library \"" | |||
+ library.getLibraryId() + "\" the converter class " | |||
+ converterClass.getName() | |||
+ " does not implement the Converter interface"); | |||
} | |||
Converter converter | |||
= libFactory.createConverter(converterClass); | |||
ExecutionContext context | |||
= new ExecutionContext(frame); | |||
converter.init(context); | |||
Class[] converterTypes = converter.getTypes(); | |||
for (int j = 0; j < converterTypes.length; ++j) { | |||
converters.put(converterTypes[j], converter); | |||
} | |||
} | |||
} catch (ClassNotFoundException e) { | |||
throw new ExecutionException("In Ant library \"" | |||
+ library.getLibraryId() + "\" converter class " | |||
+ className + " was not found", e); | |||
} catch (NoClassDefFoundError e) { | |||
throw new ExecutionException("In Ant library \"" | |||
+ library.getLibraryId() | |||
+ "\" could not load a dependent class (" | |||
+ e.getMessage() + ") for converter " + className); | |||
} catch (InstantiationException e) { | |||
throw new ExecutionException("In Ant library \"" | |||
+ library.getLibraryId() | |||
+ "\" unable to instantiate converter class " | |||
+ className, e); | |||
} catch (IllegalAccessException e) { | |||
throw new ExecutionException("In Ant library \"" | |||
+ library.getLibraryId() | |||
+ "\" unable to access converter class " | |||
+ className, e); | |||
} | |||
} | |||
} | |||
@@ -53,11 +53,10 @@ | |||
*/ | |||
package org.apache.ant.antcore.execution; | |||
import java.io.File; | |||
import org.apache.ant.antcore.model.ModelElement; | |||
import org.apache.ant.common.antlib.AntContext; | |||
import org.apache.ant.common.model.ModelElement; | |||
import org.apache.ant.common.util.ExecutionException; | |||
import org.apache.ant.common.util.FileUtils; | |||
import org.apache.ant.common.util.Location; | |||
/** | |||
* This is the core's implementation of the AntContext for all core objects. | |||
@@ -83,13 +82,10 @@ public class ExecutionContext implements AntContext { | |||
* Initilaise this context's environment | |||
* | |||
* @param frame the frame containing this context | |||
* @param eventSupport the event support instance used to send build | |||
* events | |||
*/ | |||
public ExecutionContext(ExecutionFrame frame, | |||
BuildEventSupport eventSupport) { | |||
public ExecutionContext(ExecutionFrame frame) { | |||
this.frame = frame; | |||
this.eventSupport = eventSupport; | |||
this.eventSupport = frame.getEventSupport(); | |||
} | |||
/** | |||
@@ -116,15 +112,17 @@ public class ExecutionContext implements AntContext { | |||
} | |||
/** | |||
* Get the build fiel location with which this context is associated | |||
* Get the model element associated with this context. If the context is | |||
* not associated with any particular model element, the project model | |||
* is returned. | |||
* | |||
* @return the associated location object. | |||
* @return the model element. | |||
*/ | |||
public Location getLocation() { | |||
if (modelElement != null) { | |||
return modelElement.getLocation(); | |||
public ModelElement getModelElement() { | |||
if (modelElement == null) { | |||
return frame.getProject(); | |||
} | |||
return Location.UNKNOWN_LOCATION; | |||
return modelElement; | |||
} | |||
/** | |||
@@ -131,6 +131,18 @@ public class ExecutionDataService implements DataService { | |||
return frame.isDataValueSet(name); | |||
} | |||
/** | |||
* Get all the properties from the frame and any references frames. This | |||
* is an expensive operation since it must clone all of the property | |||
* stores in all frames | |||
* | |||
* @return a Map containing the frames properties indexed by their full | |||
* name. | |||
*/ | |||
public Map getAllProperties() { | |||
return frame.getAllProperties(); | |||
} | |||
/** | |||
* Replace ${} style constructions in the given value with the string | |||
* value of the corresponding data values in the frame | |||
@@ -157,8 +169,8 @@ public class ExecutionDataService implements DataService { | |||
if (fragment == null) { | |||
String propertyName = (String)j.next(); | |||
if (!isDataValueSet(propertyName)) { | |||
throw new ExecutionException("Property " + propertyName | |||
+ " has not been set"); | |||
throw new ExecutionException("Property \"" + propertyName | |||
+ "\" has not been set"); | |||
} | |||
fragment = getDataValue(propertyName).toString(); | |||
} | |||
@@ -207,16 +219,5 @@ public class ExecutionDataService implements DataService { | |||
return sb.toString(); | |||
} | |||
/** | |||
* Get all the properties from the frame and any references frames. This | |||
* is an expensive operation since it must clone all of the property | |||
* stores in all frames | |||
* | |||
* @return a Map containing the frames properties indexed by their full name. | |||
*/ | |||
public Map getAllProperties() { | |||
return frame.getAllProperties(); | |||
} | |||
} | |||
@@ -59,25 +59,23 @@ import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.StringTokenizer; | |||
import org.apache.ant.antcore.antlib.AntLibDefinition; | |||
import org.apache.ant.antcore.antlib.AntLibrary; | |||
import org.apache.ant.antcore.config.AntConfig; | |||
import org.apache.ant.antcore.model.BuildElement; | |||
import org.apache.ant.antcore.model.Project; | |||
import org.apache.ant.antcore.model.Target; | |||
import org.apache.ant.antcore.util.ConfigException; | |||
import org.apache.ant.common.antlib.AntLibFactory; | |||
import org.apache.ant.common.antlib.Converter; | |||
import org.apache.ant.common.antlib.ExecutionComponent; | |||
import org.apache.ant.common.antlib.StandardLibFactory; | |||
import org.apache.ant.common.antlib.Task; | |||
import org.apache.ant.common.antlib.TaskContainer; | |||
import org.apache.ant.common.event.BuildListener; | |||
import org.apache.ant.common.model.BuildElement; | |||
import org.apache.ant.common.model.Project; | |||
import org.apache.ant.common.model.Target; | |||
import org.apache.ant.common.service.ComponentService; | |||
import org.apache.ant.common.service.DataService; | |||
import org.apache.ant.common.service.FileService; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.ant.common.util.ConfigException; | |||
import org.apache.ant.common.util.ExecutionException; | |||
import org.apache.ant.common.util.FileUtils; | |||
import org.apache.ant.common.util.Location; | |||
import org.apache.ant.common.util.MessageLevel; | |||
import org.apache.ant.init.InitConfig; | |||
@@ -91,74 +89,18 @@ import org.apache.ant.init.InitConfig; | |||
* @created 14 January 2002 | |||
*/ | |||
public class ExecutionFrame { | |||
/** | |||
* This class is used to maintain information about imports | |||
* | |||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||
* @created 16 January 2002 | |||
*/ | |||
private static class ImportInfo { | |||
/** the ant library from which the import is made */ | |||
private AntLibrary library; | |||
/** the library definition information */ | |||
private AntLibDefinition libDefinition; | |||
/** | |||
* ImportInfo records what has been imported from an Ant Library | |||
* | |||
* @param library The library from which the import was made | |||
* @param libDefinition the library definition information | |||
*/ | |||
public ImportInfo(AntLibrary library, AntLibDefinition libDefinition) { | |||
this.library = library; | |||
this.libDefinition = libDefinition; | |||
} | |||
/** | |||
* Get the classname that has been imported | |||
* | |||
* @return the classname that was imported. | |||
*/ | |||
public String getClassName() { | |||
return libDefinition.getClassName(); | |||
} | |||
/** | |||
* Get the library from which the import was made | |||
* | |||
* @return the library from which the import was made | |||
*/ | |||
public AntLibrary getAntLibrary() { | |||
return library; | |||
} | |||
/** | |||
* Get the type of the definition that was imported | |||
* | |||
* @return the type of definition | |||
*/ | |||
public int getDefinitionType() { | |||
return libDefinition.getDefinitionType(); | |||
} | |||
} | |||
/** A magic property which sets the execution base directory */ | |||
public final static String BASEDIR_PROP = "basedir"; | |||
/** The Ant aspect used to identify Ant metadata */ | |||
public final static String ANT_ASPECT = "ant"; | |||
/** The prefix for library ids that are automatically imported */ | |||
public final static String ANT_LIB_PREFIX = "ant."; | |||
/** the base dir of the project */ | |||
private File baseDir; | |||
/** The Project that this execution frame is processing */ | |||
private Project project = null; | |||
/** The factory objects for each library, indexed by the library Id */ | |||
private Map libFactories = new HashMap(); | |||
/** The referenced frames corresponding to the referenced projects */ | |||
private Map referencedFrames = new HashMap(); | |||
@@ -183,24 +125,9 @@ public class ExecutionFrame { | |||
*/ | |||
private Map standardLibs; | |||
/** | |||
* These are AntLibraries which have been loaded in this | |||
* ExecutionFrame's build file. | |||
*/ | |||
private Map antLibraries; | |||
/** The definitions which have been imported into this frame. */ | |||
private Map definitions = new HashMap(); | |||
/** BuildEvent support used to fire events and manage listeners */ | |||
private BuildEventSupport eventSupport = new BuildEventSupport(); | |||
/** | |||
* Type converters for this executionFrame. Converters are used when | |||
* configuring Tasks to handle special type conversions. | |||
*/ | |||
private Map converters = new HashMap(); | |||
/** | |||
* The services map is a map of service interface classes to instances | |||
* which provide the service. | |||
@@ -218,6 +145,15 @@ public class ExecutionFrame { | |||
*/ | |||
private DataService dataService; | |||
/** The execution file service instance */ | |||
private FileService fileService; | |||
/** | |||
* the Component Manager used to manage the importing of library | |||
* components from the Ant libraries | |||
*/ | |||
private ComponentManager componentManager; | |||
/** | |||
* Create an Execution Frame for the given project | |||
* | |||
@@ -225,32 +161,17 @@ public class ExecutionFrame { | |||
* this frame | |||
* @param config the user config to use for this execution of Ant | |||
* @param initConfig Ant's initialisation config | |||
* @exception ConfigException if a component of the library cannot be | |||
* @exception ExecutionException if a component of the library cannot be | |||
* imported | |||
*/ | |||
protected ExecutionFrame(Map standardLibs, InitConfig initConfig, | |||
AntConfig config) throws ConfigException { | |||
AntConfig config) throws ExecutionException { | |||
this.standardLibs = standardLibs; | |||
this.config = config; | |||
this.initConfig = initConfig; | |||
configureServices(); | |||
antLibraries = new HashMap(standardLibs); | |||
try { | |||
// 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(ANT_LIB_PREFIX)) { | |||
// standard library - import whole library | |||
importLibrary(libraryId); | |||
} | |||
} | |||
} catch (ExecutionException e) { | |||
throw new ConfigException(e); | |||
} | |||
componentManager.setStandardLibraries(standardLibs); | |||
} | |||
/** | |||
@@ -267,88 +188,24 @@ public class ExecutionFrame { | |||
return currentLoader; | |||
} | |||
/** | |||
* Gets the project model this frame is working with | |||
* | |||
* @return the project model | |||
*/ | |||
public Project getProject() { | |||
return project; | |||
} | |||
/** | |||
* Get all the properties from the frame and any references frames. This | |||
* is an expensive operation since it must clone all of the property | |||
* stores in all frames | |||
* | |||
* @return a Map containing the frames properties indexed by their full name. | |||
*/ | |||
public Map getAllProperties() { | |||
Map allProperties = new HashMap(dataValues); | |||
Iterator i = referencedFrames.keySet().iterator(); | |||
while (i.hasNext()) { | |||
String refName = (String)i.next(); | |||
ExecutionFrame refFrame = getReferencedFrame(refName); | |||
Map refProperties = refFrame.getAllProperties(); | |||
Iterator j = refProperties.keySet().iterator(); | |||
while (j.hasNext()) { | |||
String name = (String)j.next(); | |||
Object value = refProperties.get(name); | |||
allProperties.put(refName + Project.REF_DELIMITER + name, | |||
value); | |||
} | |||
} | |||
return allProperties; | |||
} | |||
/** | |||
* Log a message as a build event | |||
* | |||
* @param message the message to be logged | |||
* @param level the priority level of the message | |||
*/ | |||
public void log(String message, int level) { | |||
eventSupport.fireMessageLogged(project, message, level); | |||
} | |||
/** | |||
* Sets the Project of the ExecutionFrame | |||
* | |||
* @param project The new Project value | |||
* @exception ConfigException if any required sub-frames cannot be | |||
* @exception ExecutionException if any required sub-frames cannot be | |||
* created and configured | |||
*/ | |||
protected void setProject(Project project) throws ConfigException { | |||
protected void setProject(Project project) throws ExecutionException { | |||
this.project = project; | |||
URL projectURL = project.getSourceURL(); | |||
if (projectURL.getProtocol().equals("file")) { | |||
File projectFile = new File(projectURL.getFile()); | |||
String base = project.getBase(); | |||
if (base == null) { | |||
base = "."; | |||
} | |||
baseDir = new File(projectFile.getParentFile(), base); | |||
} else { | |||
baseDir = new File("."); | |||
} | |||
referencedFrames = new HashMap(); | |||
for (Iterator i = project.getReferencedProjectNames(); i.hasNext(); ) { | |||
String referenceName = (String)i.next(); | |||
Project referencedProject | |||
= project.getReferencedProject(referenceName); | |||
ExecutionFrame referencedFrame | |||
= new ExecutionFrame(standardLibs, initConfig, config); | |||
referencedFrame.setProject(referencedProject); | |||
ExecutionFrame referencedFrame = createFrame(referencedProject); | |||
referencedFrames.put(referenceName, referencedFrame); | |||
for (Iterator j = eventSupport.getListeners(); j.hasNext(); ) { | |||
BuildListener listener = (BuildListener)j.next(); | |||
referencedFrame.addBuildListener(listener); | |||
} | |||
} | |||
} | |||
@@ -376,12 +233,59 @@ public class ExecutionFrame { | |||
} | |||
/** | |||
* Get the collection of Ant Libraries defined for this frame | |||
* Set the initial properties to be used when the frame starts execution | |||
* | |||
* @param properties a Map of named properties which may in fact be any | |||
* object | |||
* @exception ExecutionException if the properties cannot be set | |||
*/ | |||
protected void setInitialProperties(Map properties) | |||
throws ExecutionException { | |||
if (properties == null) { | |||
return; | |||
} | |||
for (Iterator i = properties.keySet().iterator(); i.hasNext(); ) { | |||
String name = (String)i.next(); | |||
Object value = properties.get(name); | |||
setDataValue(name, value, false); | |||
} | |||
} | |||
/** | |||
* Gets the project model this frame is working with | |||
* | |||
* @return the project model | |||
*/ | |||
protected Project getProject() { | |||
return project; | |||
} | |||
/** | |||
* Get all the properties from the frame and any references frames. This | |||
* is an expensive operation since it must clone all of the property | |||
* stores in all frames | |||
* | |||
* @return a map of Ant Libraries indexed by thier library Id | |||
* @return a Map containing the frames properties indexed by their full | |||
* name. | |||
*/ | |||
protected Map getAntLibraries() { | |||
return antLibraries; | |||
protected Map getAllProperties() { | |||
Map allProperties = new HashMap(dataValues); | |||
Iterator i = referencedFrames.keySet().iterator(); | |||
while (i.hasNext()) { | |||
String refName = (String)i.next(); | |||
ExecutionFrame refFrame = getReferencedFrame(refName); | |||
Map refProperties = refFrame.getAllProperties(); | |||
Iterator j = refProperties.keySet().iterator(); | |||
while (j.hasNext()) { | |||
String name = (String)j.next(); | |||
Object value = refProperties.get(name); | |||
allProperties.put(refName + Project.REF_DELIMITER + name, | |||
value); | |||
} | |||
} | |||
return allProperties; | |||
} | |||
/** | |||
@@ -422,6 +326,16 @@ public class ExecutionFrame { | |||
return service; | |||
} | |||
/** | |||
* Get the EventSupport instance for this frame. This tracks the build | |||
* listeners on this frame | |||
* | |||
* @return the EventSupport instance | |||
*/ | |||
protected BuildEventSupport getEventSupport() { | |||
return eventSupport; | |||
} | |||
/** | |||
* Gets the baseDir of the ExecutionFrame | |||
* | |||
@@ -500,6 +414,35 @@ public class ExecutionFrame { | |||
} | |||
} | |||
/** | |||
* Create a new frame for a given project | |||
* | |||
* @param project the project model the frame will deal with | |||
* @return an ExecutionFrame ready to build the project | |||
* @exception ExecutionException if the frame cannot be created. | |||
*/ | |||
protected ExecutionFrame createFrame(Project project) | |||
throws ExecutionException { | |||
ExecutionFrame newFrame | |||
= new ExecutionFrame(standardLibs, initConfig, config); | |||
newFrame.setProject(project); | |||
for (Iterator j = eventSupport.getListeners(); j.hasNext(); ) { | |||
BuildListener listener = (BuildListener)j.next(); | |||
newFrame.addBuildListener(listener); | |||
} | |||
return newFrame; | |||
} | |||
/** | |||
* Log a message as a build event | |||
* | |||
* @param message the message to be logged | |||
* @param level the priority level of the message | |||
*/ | |||
protected void log(String message, int level) { | |||
eventSupport.fireMessageLogged(project, message, level); | |||
} | |||
/** | |||
* Add a build listener to this execution frame | |||
* | |||
@@ -533,9 +476,9 @@ public class ExecutionFrame { | |||
* @exception ExecutionException if there is a problem in the build | |||
*/ | |||
protected void runBuild(List targets) throws ExecutionException { | |||
System.out.println("Initilizing frame"); | |||
determineBaseDirs(); | |||
initialize(); | |||
log("Initialized", MessageLevel.MSG_DEBUG); | |||
if (targets.isEmpty()) { | |||
// we just execute the default target if any | |||
String defaultTarget = project.getDefaultTarget(); | |||
@@ -565,8 +508,8 @@ public class ExecutionFrame { | |||
// to execute a target we must determine its dependencies and | |||
// execute them in order. | |||
// firstly build a list of fully qualified target names to execute. | |||
try { | |||
// firstly build a list of fully qualified target names to execute. | |||
List dependencyOrder = project.getTargetDependencies(targetName); | |||
for (Iterator i = dependencyOrder.iterator(); i.hasNext(); ) { | |||
String fullTargetName = (String)i.next(); | |||
@@ -577,6 +520,7 @@ public class ExecutionFrame { | |||
} catch (ConfigException e) { | |||
throw new ExecutionException(e); | |||
} | |||
} | |||
/** | |||
@@ -593,7 +537,7 @@ public class ExecutionFrame { | |||
BuildElement model = (BuildElement)taskIterator.next(); | |||
// what sort of element is this. | |||
ImportInfo importInfo | |||
= (ImportInfo)definitions.get(model.getType()); | |||
= componentManager.getDefinition(model.getType()); | |||
if (importInfo == null) { | |||
throw new ExecutionException("There is no definition for the <" | |||
+ model.getType() + "> element", model.getLocation()); | |||
@@ -620,10 +564,7 @@ public class ExecutionFrame { | |||
} catch (AntException te) { | |||
ExecutionException e | |||
= new ExecutionException(te, te.getLocation()); | |||
if (e.getLocation() == null | |||
|| e.getLocation() == Location.UNKNOWN_LOCATION) { | |||
e.setLocation(model.getLocation()); | |||
} | |||
e.setLocation(model.getLocation(), false); | |||
failureCause = e; | |||
throw e; | |||
} catch (RuntimeException e) { | |||
@@ -653,12 +594,7 @@ public class ExecutionFrame { | |||
eventSupport.fireTargetStarted(target); | |||
executeTasks(taskIterator); | |||
} catch (ExecutionException e) { | |||
System.out.println("Exception location is " + e.getLocation()); | |||
if (e.getLocation() == null | |||
|| e.getLocation() == Location.UNKNOWN_LOCATION) { | |||
e.setLocation(target.getLocation()); | |||
} | |||
System.out.println("Exception location is now " + e.getLocation()); | |||
e.setLocation(target.getLocation(), false); | |||
failureCause = e; | |||
throw e; | |||
} catch (RuntimeException e) { | |||
@@ -686,28 +622,6 @@ public class ExecutionFrame { | |||
} | |||
/** | |||
* Import a complete library into this frame | |||
* | |||
* @param libraryId The id of the library to be imported | |||
* @exception ExecutionException if the library cannot be imported | |||
*/ | |||
protected void importLibrary(String libraryId) throws ExecutionException { | |||
AntLibrary library = (AntLibrary)antLibraries.get(libraryId); | |||
if (library == null) { | |||
throw new ExecutionException("Unable to import library " + libraryId | |||
+ " as it has not been loaded"); | |||
} | |||
Map libDefs = library.getDefinitions(); | |||
for (Iterator i = libDefs.keySet().iterator(); i.hasNext(); ) { | |||
String defName = (String)i.next(); | |||
AntLibDefinition libdef | |||
= (AntLibDefinition)libDefs.get(defName); | |||
definitions.put(defName, new ImportInfo(library, libdef)); | |||
} | |||
addLibraryConverters(library); | |||
} | |||
/** | |||
* Gets the reflector for the given class | |||
* | |||
@@ -718,7 +632,8 @@ public class ExecutionFrame { | |||
if (reflectors.containsKey(c)) { | |||
return (Reflector)reflectors.get(c); | |||
} | |||
ClassIntrospector introspector = new ClassIntrospector(c, converters); | |||
ClassIntrospector introspector | |||
= new ClassIntrospector(c, componentManager.getConverters()); | |||
Reflector reflector = introspector.getReflector(); | |||
reflectors.put(c, reflector); | |||
return reflector; | |||
@@ -755,27 +670,36 @@ public class ExecutionFrame { | |||
} | |||
/** | |||
* Gets the factory object for the given library | |||
* Determine the base directory for each frame in the frame hierarchy | |||
* | |||
* @param antLibrary the library for which the factory instance is | |||
* required. | |||
* @return the library;s factory object | |||
* @exception ExecutionException the factory object for the library | |||
* cannot be created. | |||
* @exception ExecutionException if the base directories cannot be | |||
* determined | |||
*/ | |||
private AntLibFactory getLibFactory(AntLibrary antLibrary) | |||
throws ExecutionException { | |||
String libraryId = antLibrary.getLibraryId(); | |||
if (libFactories.containsKey(libraryId)) { | |||
return (AntLibFactory)libFactories.get(libraryId); | |||
private void determineBaseDirs() throws ExecutionException { | |||
if (isDataValueSet(BASEDIR_PROP)) { | |||
baseDir = new File(getDataValue(BASEDIR_PROP).toString()); | |||
} else { | |||
URL projectURL = project.getSourceURL(); | |||
if (projectURL.getProtocol().equals("file")) { | |||
File projectFile = new File(projectURL.getFile()); | |||
File projectFileParent = projectFile.getParentFile(); | |||
String base = project.getBase(); | |||
if (base == null) { | |||
baseDir = projectFileParent; | |||
} else { | |||
FileUtils fileUtils = new FileUtils(); | |||
baseDir = fileUtils.resolveFile(projectFileParent, base); | |||
} | |||
} else { | |||
baseDir = new File("."); | |||
} | |||
setDataValue(BASEDIR_PROP, baseDir.getPath(), true); | |||
} | |||
AntLibFactory libFactory = antLibrary.getFactory(); | |||
if (libFactory == null) { | |||
libFactory = new StandardLibFactory(); | |||
for (Iterator i = getReferencedFrames(); i.hasNext(); ) { | |||
ExecutionFrame refFrame = (ExecutionFrame)i.next(); | |||
refFrame.determineBaseDirs(); | |||
} | |||
libFactories.put(libraryId, libFactory); | |||
libFactory.init(new ExecutionContext(this, eventSupport)); | |||
return libFactory; | |||
} | |||
/** | |||
@@ -784,71 +708,14 @@ public class ExecutionFrame { | |||
*/ | |||
private void configureServices() { | |||
// create services and make them available in our services map | |||
services.put(FileService.class, new ExecutionFileService(this)); | |||
services.put(ComponentService.class, | |||
new ExecutionComponentService(this, config.isRemoteLibAllowed())); | |||
fileService = new ExecutionFileService(this); | |||
componentManager | |||
= new ComponentManager(this, config.isRemoteLibAllowed()); | |||
dataService = new ExecutionDataService(this); | |||
services.put(DataService.class, dataService); | |||
} | |||
/** | |||
* Add the converters from the given library to those managed by this | |||
* frame. | |||
* | |||
* @param library the library from which the converters are required | |||
* @exception ExecutionException if a converter defined in the library | |||
* cannot be instantiated | |||
*/ | |||
private void addLibraryConverters(AntLibrary library) | |||
throws ExecutionException { | |||
if (!library.hasConverters()) { | |||
return; | |||
} | |||
String className = null; | |||
try { | |||
AntLibFactory libFactory = getLibFactory(library); | |||
ClassLoader converterLoader = library.getClassLoader(); | |||
for (Iterator i = library.getConverterClassNames(); i.hasNext(); ) { | |||
className = (String)i.next(); | |||
Class converterClass | |||
= Class.forName(className, true, converterLoader); | |||
if (!Converter.class.isAssignableFrom(converterClass)) { | |||
throw new ExecutionException("In Ant library \"" | |||
+ library.getLibraryId() + "\" the converter class " | |||
+ converterClass.getName() | |||
+ " does not implement the Converter interface"); | |||
} | |||
Converter converter | |||
= libFactory.createConverter(converterClass); | |||
ExecutionContext context | |||
= new ExecutionContext(this, eventSupport); | |||
converter.init(context); | |||
Class[] converterTypes = converter.getTypes(); | |||
for (int j = 0; j < converterTypes.length; ++j) { | |||
converters.put(converterTypes[j], converter); | |||
} | |||
} | |||
} catch (ClassNotFoundException e) { | |||
throw new ExecutionException("In Ant library \"" | |||
+ library.getLibraryId() + "\" converter class " | |||
+ className + " was not found", e); | |||
} catch (NoClassDefFoundError e) { | |||
throw new ExecutionException("In Ant library \"" | |||
+ library.getLibraryId() | |||
+ "\" could not load a dependent class (" | |||
+ e.getMessage() + ") for converter " + className); | |||
} catch (InstantiationException e) { | |||
throw new ExecutionException("In Ant library \"" | |||
+ library.getLibraryId() | |||
+ "\" unable to instantiate converter class " | |||
+ className, e); | |||
} catch (IllegalAccessException e) { | |||
throw new ExecutionException("In Ant library \"" | |||
+ library.getLibraryId() | |||
+ "\" unable to access converter class " | |||
+ className, e); | |||
} | |||
services.put(FileService.class, fileService); | |||
services.put(ComponentService.class, componentManager); | |||
services.put(DataService.class, dataService); | |||
} | |||
/** | |||
@@ -890,7 +757,7 @@ public class ExecutionFrame { | |||
BuildElement nestedElementModel = (BuildElement)i.next(); | |||
String nestedElementName = nestedElementModel.getType(); | |||
ImportInfo info = (ImportInfo)definitions.get(nestedElementName); | |||
ImportInfo info = componentManager.getDefinition(nestedElementName); | |||
if (element instanceof TaskContainer | |||
&& info != null | |||
&& info.getDefinitionType() == AntLibrary.TASKDEF | |||
@@ -937,18 +804,21 @@ public class ExecutionFrame { | |||
String nestedElementName = model.getType(); | |||
Object nestedElement | |||
= reflector.createElement(element, nestedElementName); | |||
if (nestedElement instanceof ExecutionComponent) { | |||
ExecutionComponent component = (ExecutionComponent)nestedElement; | |||
ExecutionContext context | |||
= new ExecutionContext(this, eventSupport); | |||
context.setModelElement(model); | |||
component.init(context); | |||
} | |||
try { | |||
configureElement(nestedElement, model); | |||
if (nestedElement instanceof ExecutionComponent) { | |||
ExecutionComponent component | |||
= (ExecutionComponent)nestedElement; | |||
ExecutionContext context | |||
= new ExecutionContext(this); | |||
context.setModelElement(model); | |||
component.init(context); | |||
configureElement(nestedElement, model); | |||
component.validateComponent(); | |||
} else { | |||
configureElement(nestedElement, model); | |||
} | |||
} catch (ExecutionException e) { | |||
e.setLocation(model.getLocation()); | |||
e.setLocation(model.getLocation(), false); | |||
throw e; | |||
} | |||
} | |||
@@ -1045,7 +915,7 @@ public class ExecutionFrame { | |||
throws ExecutionException { | |||
String taskType = model.getType(); | |||
ImportInfo taskDefInfo = (ImportInfo)definitions.get(taskType); | |||
ImportInfo taskDefInfo = componentManager.getDefinition(taskType); | |||
if (taskDefInfo == null | |||
|| taskDefInfo.getDefinitionType() != AntLibrary.TASKDEF) { | |||
throw new ExecutionException("There is no defintion for a " | |||
@@ -1059,7 +929,8 @@ public class ExecutionFrame { | |||
ClassLoader taskClassLoader = antLibrary.getClassLoader(); | |||
Class elementClass | |||
= Class.forName(className, true, taskClassLoader); | |||
AntLibFactory libFactory = getLibFactory(antLibrary); | |||
AntLibFactory libFactory | |||
= componentManager.getLibFactory(antLibrary); | |||
Object element = libFactory.createTaskInstance(elementClass); | |||
Task task = null; | |||
@@ -1072,9 +943,10 @@ public class ExecutionFrame { | |||
// set the context loader while configuring the element | |||
ClassLoader currentLoader = setContextLoader(taskClassLoader); | |||
TaskContext taskContext = new TaskContext(this, eventSupport); | |||
TaskContext taskContext = new TaskContext(this); | |||
taskContext.init(taskClassLoader, task, model); | |||
configureElement(element, model); | |||
task.validateComponent(); | |||
setContextLoader(currentLoader); | |||
return taskContext; | |||
} catch (ClassNotFoundException e) { | |||
@@ -1094,7 +966,7 @@ public class ExecutionFrame { | |||
+ className + " for task <" + taskType + ">", | |||
e, model.getLocation()); | |||
} catch (ExecutionException e) { | |||
e.setLocation(model.getLocation()); | |||
e.setLocation(model.getLocation(), false); | |||
throw e; | |||
} | |||
} | |||
@@ -1112,7 +984,7 @@ public class ExecutionFrame { | |||
*/ | |||
private Object configureType(String typeName, BuildElement model) | |||
throws ExecutionException { | |||
ImportInfo typeDefInfo = (ImportInfo)definitions.get(typeName); | |||
ImportInfo typeDefInfo = componentManager.getDefinition(typeName); | |||
if (typeDefInfo == null | |||
|| typeDefInfo.getDefinitionType() != AntLibrary.TYPEDEF) { | |||
throw new ExecutionException("There is no defintion for a " | |||
@@ -1128,7 +1000,8 @@ public class ExecutionFrame { | |||
= Class.forName(className, true, typeClassLoader); | |||
ClassLoader currentLoader = setContextLoader(typeClassLoader); | |||
AntLibFactory libFactory = getLibFactory(antLibrary); | |||
AntLibFactory libFactory | |||
= componentManager.getLibFactory(antLibrary); | |||
Object typeInstance | |||
= createTypeInstance(typeClass, libFactory, model); | |||
setContextLoader(currentLoader); | |||
@@ -1169,12 +1042,14 @@ public class ExecutionFrame { | |||
if (typeInstance instanceof ExecutionComponent) { | |||
ExecutionComponent component = (ExecutionComponent)typeInstance; | |||
ExecutionContext context | |||
= new ExecutionContext(this, eventSupport); | |||
= new ExecutionContext(this); | |||
context.setModelElement(model); | |||
component.init(context); | |||
configureElement(typeInstance, model); | |||
component.validateComponent(); | |||
} else { | |||
configureElement(typeInstance, model); | |||
} | |||
configureElement(typeInstance, model); | |||
return typeInstance; | |||
} catch (InstantiationException e) { | |||
throw new ExecutionException("Unable to instantiate type class " | |||
@@ -1185,10 +1060,9 @@ public class ExecutionFrame { | |||
+ typeClass.getName() + " for type <" + model.getType() + ">", | |||
e, model.getLocation()); | |||
} catch (ExecutionException e) { | |||
e.setLocation(model.getLocation()); | |||
e.setLocation(model.getLocation(), false); | |||
throw e; | |||
} | |||
} | |||
} | |||
@@ -61,10 +61,10 @@ import java.util.Map; | |||
import org.apache.ant.antcore.antlib.AntLibManager; | |||
import org.apache.ant.antcore.antlib.AntLibrary; | |||
import org.apache.ant.antcore.config.AntConfig; | |||
import org.apache.ant.antcore.model.Project; | |||
import org.apache.ant.antcore.util.ConfigException; | |||
import org.apache.ant.common.event.BuildListener; | |||
import org.apache.ant.common.model.Project; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.ant.common.util.ExecutionException; | |||
import org.apache.ant.init.InitConfig; | |||
/** | |||
@@ -105,11 +105,11 @@ public class ExecutionManager { | |||
* | |||
* @param initConfig Ant's configuration - classloaders etc | |||
* @param config The user config to use - may be null | |||
* @exception ConfigException if there is a problem with one of Ant's | |||
* @exception ExecutionException if there is a problem with one of Ant's | |||
* tasks | |||
*/ | |||
public ExecutionManager(InitConfig initConfig, AntConfig config) | |||
throws ConfigException { | |||
throws ExecutionException { | |||
this.config = config; | |||
this.initConfig = initConfig; | |||
@@ -140,7 +140,7 @@ public class ExecutionManager { | |||
mainFrame = new ExecutionFrame(antLibraries, initConfig, config); | |||
} catch (MalformedURLException e) { | |||
throw new ConfigException("Unable to load Ant libraries", e); | |||
throw new ExecutionException("Unable to load Ant libraries", e); | |||
} | |||
} | |||
@@ -149,13 +149,17 @@ public class ExecutionManager { | |||
* | |||
* @param project the project model to be used for the build | |||
* @param targets a list of target names to be executed. | |||
* @param commandProperties the properties defined by the front end to | |||
* control the build | |||
*/ | |||
public void runBuild(Project project, List targets) { | |||
public void runBuild(Project project, List targets, Map commandProperties) { | |||
Throwable buildFailureCause = null; | |||
try { | |||
// start by validating the project we have been given. | |||
project.validate(null); | |||
project.validate(); | |||
mainFrame.setProject(project); | |||
mainFrame.setInitialProperties(commandProperties); | |||
eventSupport.fireBuildStarted(project); | |||
mainFrame.runBuild(targets); | |||
@@ -193,10 +197,10 @@ public class ExecutionManager { | |||
* Add the library paths from the AntConfig instance to the Ant | |||
* Libraries. | |||
* | |||
* @exception ConfigException if remote libraries are not allowed. | |||
* @exception ExecutionException if remote libraries are not allowed. | |||
*/ | |||
private void addConfigLibPaths() | |||
throws ConfigException { | |||
throws ExecutionException { | |||
if (config == null) { | |||
return; | |||
} | |||
@@ -212,7 +216,7 @@ public class ExecutionManager { | |||
URL pathElementURL = (URL)j.next(); | |||
if (!pathElementURL.getProtocol().equals("file") | |||
&& !config.isRemoteLibAllowed()) { | |||
throw new ConfigException("Remote libpaths are not" | |||
throw new ExecutionException("Remote libpaths are not" | |||
+ " allowed: " + pathElementURL); | |||
} | |||
antLib.addLibraryURL(pathElementURL); | |||
@@ -0,0 +1,110 @@ | |||
/* | |||
* 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.execution; | |||
import org.apache.ant.antcore.antlib.AntLibDefinition; | |||
import org.apache.ant.antcore.antlib.AntLibrary; | |||
/** | |||
* This class is used to maintain information about imports | |||
* | |||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||
* @created 16 January 2002 | |||
*/ | |||
public class ImportInfo { | |||
/** the ant library from which the import is made */ | |||
private AntLibrary library; | |||
/** the library definition information */ | |||
private AntLibDefinition libDefinition; | |||
/** | |||
* ImportInfo records what has been imported from an Ant Library | |||
* | |||
* @param library The library from which the import was made | |||
* @param libDefinition the library definition information | |||
*/ | |||
public ImportInfo(AntLibrary library, AntLibDefinition libDefinition) { | |||
this.library = library; | |||
this.libDefinition = libDefinition; | |||
} | |||
/** | |||
* Get the classname that has been imported | |||
* | |||
* @return the classname that was imported. | |||
*/ | |||
public String getClassName() { | |||
return libDefinition.getClassName(); | |||
} | |||
/** | |||
* Get the library from which the import was made | |||
* | |||
* @return the library from which the import was made | |||
*/ | |||
public AntLibrary getAntLibrary() { | |||
return library; | |||
} | |||
/** | |||
* Get the type of the definition that was imported | |||
* | |||
* @return the type of definition | |||
*/ | |||
public int getDefinitionType() { | |||
return libDefinition.getDefinitionType(); | |||
} | |||
} | |||
@@ -52,8 +52,8 @@ | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.execution; | |||
import org.apache.ant.antcore.model.ModelElement; | |||
import org.apache.ant.common.antlib.Task; | |||
import org.apache.ant.common.model.ModelElement; | |||
import org.apache.ant.common.util.ExecutionException; | |||
/** | |||
* This is the core's implementation of the AntContext for Tasks. | |||
@@ -77,12 +77,9 @@ public class TaskContext extends ExecutionContext { | |||
* Initilaise this context's environment | |||
* | |||
* @param frame the frame containing this context | |||
* @param eventSupport the event support instance used to send build | |||
* events | |||
*/ | |||
public TaskContext(ExecutionFrame frame, | |||
BuildEventSupport eventSupport) { | |||
super(frame, eventSupport); | |||
public TaskContext(ExecutionFrame frame) { | |||
super(frame); | |||
} | |||
/** | |||
@@ -109,7 +106,7 @@ public class TaskContext extends ExecutionContext { | |||
* @param task the task to be manager | |||
* @param loader the classloader | |||
* @param modelElement the model element associated with this context | |||
* @exception ExecutionException if the task cannot be initialized | |||
* @exception ExecutionException if the task cannot be initialized | |||
*/ | |||
public void init(ClassLoader loader, Task task, ModelElement modelElement) | |||
throws ExecutionException { | |||
@@ -122,7 +119,8 @@ public class TaskContext extends ExecutionContext { | |||
/** | |||
* execute this context's task | |||
* | |||
* @exception ExecutionException if there is a problem executing the task | |||
* @exception ExecutionException if there is a problem executing the | |||
* task | |||
*/ | |||
public void execute() throws ExecutionException { | |||
task.execute(); | |||
@@ -51,10 +51,10 @@ | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.model.xmlparser; | |||
package org.apache.ant.antcore.modelparser; | |||
import java.util.Iterator; | |||
import org.apache.ant.antcore.model.BuildElement; | |||
import org.apache.ant.common.model.BuildElement; | |||
import org.apache.ant.antcore.xml.ElementHandler; | |||
import org.xml.sax.Attributes; | |||
import org.xml.sax.SAXParseException; |
@@ -51,11 +51,11 @@ | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.model.xmlparser; | |||
package org.apache.ant.antcore.modelparser; | |||
import java.net.MalformedURLException; | |||
import java.net.URL; | |||
import org.apache.ant.antcore.model.Project; | |||
import org.apache.ant.common.model.Project; | |||
import org.apache.ant.antcore.xml.ElementHandler; | |||
import org.apache.ant.antcore.xml.XMLParseException; | |||
import org.xml.sax.SAXParseException; |
@@ -51,7 +51,7 @@ | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.model.xmlparser; | |||
package org.apache.ant.antcore.modelparser; | |||
/** | |||
* A NoProjectReadException is used to indicate that a project was not read |
@@ -51,9 +51,9 @@ | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.model.xmlparser; | |||
import org.apache.ant.antcore.model.ModelException; | |||
import org.apache.ant.antcore.model.Project; | |||
package org.apache.ant.antcore.modelparser; | |||
import org.apache.ant.common.model.ModelException; | |||
import org.apache.ant.common.model.Project; | |||
import org.apache.ant.antcore.xml.ElementHandler; | |||
import org.xml.sax.Attributes; | |||
import org.xml.sax.SAXParseException; |
@@ -51,11 +51,11 @@ | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.model.xmlparser; | |||
package org.apache.ant.antcore.modelparser; | |||
import java.net.MalformedURLException; | |||
import java.net.URL; | |||
import org.apache.ant.antcore.model.Project; | |||
import org.apache.ant.common.model.Project; | |||
import org.apache.ant.antcore.xml.ElementHandler; | |||
import org.apache.ant.antcore.xml.XMLParseException; | |||
import org.xml.sax.SAXParseException; | |||
@@ -129,14 +129,14 @@ public class RefHandler extends ElementHandler { | |||
referencedProject = referencedProjectHandler.getProject(); | |||
} catch (XMLParseException e) { | |||
throw new SAXParseException("Error parsing referenced project " | |||
+ projectSystemId + ": " + e.getMessage(), getLocator()); | |||
+ projectSystemId + ": " + e.getMessage(), getLocator(), e); | |||
} catch (NoProjectReadException e) { | |||
throw new SAXParseException("No project found in the reference: " | |||
+ projectSystemId, getLocator()); | |||
+ projectSystemId, getLocator(), e); | |||
} catch (MalformedURLException e) { | |||
throw new SAXParseException("Unable to reference project " | |||
+ projectSystemId + ": " + e.getMessage(), | |||
getLocator()); | |||
getLocator(), e); | |||
} | |||
} | |||
@@ -51,10 +51,10 @@ | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.model.xmlparser; | |||
package org.apache.ant.antcore.modelparser; | |||
import java.util.StringTokenizer; | |||
import org.apache.ant.antcore.model.Target; | |||
import org.apache.ant.common.model.Target; | |||
import org.apache.ant.antcore.xml.ElementHandler; | |||
import org.xml.sax.Attributes; | |||
import org.xml.sax.SAXParseException; | |||
@@ -75,6 +75,12 @@ public class TargetHandler extends ElementHandler { | |||
/** The depends attribute name */ | |||
public final static String DESC_ATTR = "description"; | |||
/** The if attribute name */ | |||
public final static String IF_ATTR = "if"; | |||
/** The unless attribute name */ | |||
public final static String UNLESS_ATTR = "unless"; | |||
/** The target being configured. */ | |||
private Target target; | |||
@@ -105,7 +111,7 @@ public class TargetHandler extends ElementHandler { | |||
if (depends != null) { | |||
StringTokenizer tokenizer = new StringTokenizer(depends, ","); | |||
while (tokenizer.hasMoreTokens()) { | |||
String dependency = tokenizer.nextToken(); | |||
String dependency = tokenizer.nextToken().trim(); | |||
target.addDependency(dependency); | |||
} | |||
} | |||
@@ -143,9 +149,11 @@ public class TargetHandler extends ElementHandler { | |||
protected void validateAttribute(String attributeName, | |||
String attributeValue) | |||
throws SAXParseException { | |||
if (!attributeName.equals(NAME_ATTR) && | |||
!attributeName.equals(DEPENDS_ATTR) && | |||
!attributeName.equals(DESC_ATTR)) { | |||
if (!attributeName.equals(NAME_ATTR) | |||
&& !attributeName.equals(DEPENDS_ATTR) | |||
&& !attributeName.equals(DESC_ATTR) | |||
&& !attributeName.equals(IF_ATTR) | |||
&& !attributeName.equals(UNLESS_ATTR)) { | |||
throwInvalidAttribute(attributeName); | |||
} | |||
} |
@@ -51,11 +51,11 @@ | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.model.xmlparser; | |||
package org.apache.ant.antcore.modelparser; | |||
import java.net.URL; | |||
import org.apache.ant.common.util.Location; | |||
import org.apache.ant.antcore.model.Project; | |||
import org.apache.ant.common.model.Project; | |||
import org.apache.ant.antcore.xml.ParseContext; | |||
import org.apache.ant.antcore.xml.XMLParseException; | |||
@@ -59,8 +59,9 @@ import javax.xml.parsers.ParserConfigurationException; | |||
import javax.xml.parsers.SAXParser; | |||
import javax.xml.parsers.SAXParserFactory; | |||
import org.apache.ant.common.util.Location; | |||
import org.apache.ant.antcore.util.CircularDependencyChecker; | |||
import org.apache.ant.antcore.util.CircularDependencyException; | |||
import org.apache.ant.common.util.CircularDependencyChecker; | |||
import org.apache.ant.common.util.CircularDependencyException; | |||
import org.apache.ant.common.util.AntException; | |||
import org.xml.sax.SAXException; | |||
import org.xml.sax.SAXParseException; | |||
import org.xml.sax.XMLReader; | |||
@@ -128,7 +129,11 @@ public class ParseContext { | |||
Location location = new Location(e.getSystemId(), | |||
e.getLineNumber(), e.getColumnNumber()); | |||
if (e.getException() != null) { | |||
throw new XMLParseException(e.getException(), location); | |||
Throwable nestedException = e.getException(); | |||
if (nestedException instanceof AntException) { | |||
location = ((AntException)nestedException).getLocation(); | |||
} | |||
throw new XMLParseException(nestedException, location); | |||
} else { | |||
throw new XMLParseException(e, location); | |||
} | |||
@@ -4,20 +4,149 @@ | |||
<factory classname="org.apache.tools.ant.Ant1Factory"/> | |||
<taskdef name="echo" classname="org.apache.tools.ant.taskdefs.Echo"/> | |||
<taskdef name="property" classname="org.apache.tools.ant.taskdefs.Property"/> | |||
<typedef name="patternset" classname="org.apache.tools.ant.types.PatternSet"/> | |||
<typedef name="fileset" classname="org.apache.tools.ant.types.FileSet"/> | |||
<typedef name="path" classname="org.apache.tools.ant.types.Path"/> | |||
<converter classname="org.apache.tools.ant.Ant1Converter"/> | |||
<taskdef name="ant" classname="org.apache.tools.ant.taskdefs.Ant"/> | |||
<taskdef name="antcall" classname="org.apache.tools.ant.taskdefs.CallTarget"/> | |||
<taskdef name="antlr" classname="org.apache.tools.ant.taskdefs.optional.ANTLR"/> | |||
<taskdef name="antstructure" classname="org.apache.tools.ant.taskdefs.AntStructure"/> | |||
<taskdef name="apply" classname="org.apache.tools.ant.taskdefs.Transform"/> | |||
<taskdef name="available" classname="org.apache.tools.ant.taskdefs.Available"/> | |||
<taskdef name="blgenclient" classname="org.apache.tools.ant.taskdefs.optional.ejb.BorlandGenerateClient"/> | |||
<taskdef name="bunzip2" classname="org.apache.tools.ant.taskdefs.BUnzip2"/> | |||
<taskdef name="bzip2" classname="org.apache.tools.ant.taskdefs.BZip2"/> | |||
<taskdef name="cab" classname="org.apache.tools.ant.taskdefs.optional.Cab"/> | |||
<taskdef name="cccheckin" classname="org.apache.tools.ant.taskdefs.optional.clearcase.CCCheckin"/> | |||
<taskdef name="cccheckout" classname="org.apache.tools.ant.taskdefs.optional.clearcase.CCCheckout"/> | |||
<taskdef name="ccmcheckin" classname="org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckin"/> | |||
<taskdef name="ccmcheckintask" classname="org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckinDefault"/> | |||
<taskdef name="ccmcheckout" classname="org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckout"/> | |||
<taskdef name="ccmcreatetask" classname="org.apache.tools.ant.taskdefs.optional.ccm.CCMCreateTask"/> | |||
<taskdef name="ccmreconfigure" classname="org.apache.tools.ant.taskdefs.optional.ccm.CCMReconfigure"/> | |||
<taskdef name="ccuncheckout" classname="org.apache.tools.ant.taskdefs.optional.clearcase.CCUnCheckout"/> | |||
<taskdef name="ccupdate" classname="org.apache.tools.ant.taskdefs.optional.clearcase.CCUpdate"/> | |||
<taskdef name="checksum" classname="org.apache.tools.ant.taskdefs.Checksum"/> | |||
<taskdef name="chmod" classname="org.apache.tools.ant.taskdefs.Chmod"/> | |||
<taskdef name="condition" classname="org.apache.tools.ant.taskdefs.ConditionTask"/> | |||
<taskdef name="javac" classname="org.apache.tools.ant.taskdefs.Javac"/> | |||
<taskdef name="mkdir" classname="org.apache.tools.ant.taskdefs.Mkdir"/> | |||
<taskdef name="copy" classname="org.apache.tools.ant.taskdefs.Copy"/> | |||
<taskdef name="csc" classname="org.apache.tools.ant.taskdefs.optional.dotnet.CSharp"/> | |||
<taskdef name="cvs" classname="org.apache.tools.ant.taskdefs.Cvs"/> | |||
<taskdef name="cvspass" classname="org.apache.tools.ant.taskdefs.CVSPass"/> | |||
<taskdef name="ddcreator" classname="org.apache.tools.ant.taskdefs.optional.ejb.DDCreator"/> | |||
<taskdef name="delete" classname="org.apache.tools.ant.taskdefs.Delete"/> | |||
<taskdef name="depend" classname="org.apache.tools.ant.taskdefs.optional.depend.Depend"/> | |||
<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="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"/> | |||
<taskdef name="execon" classname="org.apache.tools.ant.taskdefs.ExecuteOn"/> | |||
<taskdef name="fail" classname="org.apache.tools.ant.taskdefs.Exit"/> | |||
<taskdef name="filter" classname="org.apache.tools.ant.taskdefs.Filter"/> | |||
<taskdef name="fixcrlf" classname="org.apache.tools.ant.taskdefs.FixCRLF"/> | |||
<taskdef name="ftp" classname="org.apache.tools.ant.taskdefs.optional.net.FTP"/> | |||
<taskdef name="genkey" classname="org.apache.tools.ant.taskdefs.GenerateKey"/> | |||
<taskdef name="get" classname="org.apache.tools.ant.taskdefs.Get"/> | |||
<taskdef name="gunzip" classname="org.apache.tools.ant.taskdefs.GUnzip"/> | |||
<taskdef name="gzip" classname="org.apache.tools.ant.taskdefs.GZip"/> | |||
<taskdef name="icontract" classname="org.apache.tools.ant.taskdefs.optional.IContract"/> | |||
<taskdef name="ilasm" classname="org.apache.tools.ant.taskdefs.optional.dotnet.Ilasm"/> | |||
<taskdef name="input" classname="org.apache.tools.ant.taskdefs.Input"/> | |||
<taskdef name="iplanet-ejbc" classname="org.apache.tools.ant.taskdefs.optional.ejb.IPlanetEjbcTask"/> | |||
<taskdef name="jar" classname="org.apache.tools.ant.taskdefs.Jar"/> | |||
<taskdef name="delete" classname="org.apache.tools.ant.taskdefs.Delete"/> | |||
<taskdef name="java" classname="org.apache.tools.ant.taskdefs.Java"/> | |||
<taskdef name="javac" classname="org.apache.tools.ant.taskdefs.Javac"/> | |||
<taskdef name="javacc" classname="org.apache.tools.ant.taskdefs.optional.javacc.JavaCC"/> | |||
<taskdef name="javadoc" classname="org.apache.tools.ant.taskdefs.Javadoc"/> | |||
<taskdef name="javah" classname="org.apache.tools.ant.taskdefs.optional.Javah"/> | |||
<taskdef name="jdepend" classname="org.apache.tools.ant.taskdefs.optional.jdepend.JDependTask"/> | |||
<taskdef name="jjtree" classname="org.apache.tools.ant.taskdefs.optional.javacc.JJTree"/> | |||
<taskdef name="jlink" classname="org.apache.tools.ant.taskdefs.optional.jlink.JlinkTask"/> | |||
<taskdef name="jpcoverage" classname="org.apache.tools.ant.taskdefs.optional.sitraka.Coverage"/> | |||
<taskdef name="jpcovmerge" classname="org.apache.tools.ant.taskdefs.optional.sitraka.CovMerge"/> | |||
<taskdef name="jpcovreport" classname="org.apache.tools.ant.taskdefs.optional.sitraka.CovReport"/> | |||
<taskdef name="jspc" classname="org.apache.tools.ant.taskdefs.optional.jsp.JspC"/> | |||
<taskdef name="junit" classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask"/> | |||
<taskdef name="junitreport" classname="org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregator"/> | |||
<taskdef name="loadfile" classname="org.apache.tools.ant.taskdefs.LoadFile"/> | |||
<taskdef name="mail" classname="org.apache.tools.ant.taskdefs.SendEmail"/> | |||
<taskdef name="manifest" classname="org.apache.tools.ant.taskdefs.Manifest"/> | |||
<taskdef name="maudit" classname="org.apache.tools.ant.taskdefs.optional.metamata.MAudit"/> | |||
<taskdef name="mimemail" classname="org.apache.tools.ant.taskdefs.optional.net.MimeMail"/> | |||
<taskdef name="mkdir" classname="org.apache.tools.ant.taskdefs.Mkdir"/> | |||
<taskdef name="mmetrics" classname="org.apache.tools.ant.taskdefs.optional.metamata.MMetrics"/> | |||
<taskdef name="move" classname="org.apache.tools.ant.taskdefs.Move"/> | |||
<taskdef name="mparse" classname="org.apache.tools.ant.taskdefs.optional.metamata.MParse"/> | |||
<taskdef name="native2ascii" classname="org.apache.tools.ant.taskdefs.optional.Native2Ascii"/> | |||
<taskdef name="netrexxc" classname="org.apache.tools.ant.taskdefs.optional.NetRexxC"/> | |||
<taskdef name="p4add" classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Add"/> | |||
<taskdef name="p4change" classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Change"/> | |||
<taskdef name="p4counter" classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Counter"/> | |||
<taskdef name="p4edit" classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Edit"/> | |||
<taskdef name="p4have" classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Have"/> | |||
<taskdef name="p4label" classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Label"/> | |||
<taskdef name="p4submit" classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Submit"/> | |||
<taskdef name="p4sync" classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Sync"/> | |||
<taskdef name="parallel" classname="org.apache.tools.ant.taskdefs.Parallel"/> | |||
<taskdef name="patch" classname="org.apache.tools.ant.taskdefs.Patch"/> | |||
<taskdef name="pathconvert" classname="org.apache.tools.ant.taskdefs.PathConvert"/> | |||
<taskdef name="property" classname="org.apache.tools.ant.taskdefs.Property"/> | |||
<taskdef name="propertyfile" classname="org.apache.tools.ant.taskdefs.optional.PropertyFile"/> | |||
<taskdef name="pvcs" classname="org.apache.tools.ant.taskdefs.optional.pvcs.Pvcs"/> | |||
<taskdef name="record" classname="org.apache.tools.ant.taskdefs.Recorder"/> | |||
<taskdef name="renameext" classname="org.apache.tools.ant.taskdefs.optional.RenameExtensions"/> | |||
<taskdef name="replace" classname="org.apache.tools.ant.taskdefs.Replace"/> | |||
<taskdef name="replaceregexp" classname="org.apache.tools.ant.taskdefs.optional.ReplaceRegExp"/> | |||
<taskdef name="rmic" classname="org.apache.tools.ant.taskdefs.Rmic"/> | |||
<taskdef name="rpm" classname="org.apache.tools.ant.taskdefs.optional.Rpm"/> | |||
<taskdef name="script" classname="org.apache.tools.ant.taskdefs.optional.Script"/> | |||
<taskdef name="sequential" classname="org.apache.tools.ant.taskdefs.Sequential"/> | |||
<taskdef name="signjar" classname="org.apache.tools.ant.taskdefs.SignJar"/> | |||
<taskdef name="sleep" classname="org.apache.tools.ant.taskdefs.Sleep"/> | |||
<taskdef name="soscheckin" classname="org.apache.tools.ant.taskdefs.optional.sos.SOSCheckin"/> | |||
<taskdef name="soscheckout" classname="org.apache.tools.ant.taskdefs.optional.sos.SOSCheckout"/> | |||
<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="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"/> | |||
<taskdef name="stlabel" classname="org.apache.tools.ant.taskdefs.optional.starteam.StarTeamLabel"/> | |||
<taskdef name="stlist" classname="org.apache.tools.ant.taskdefs.optional.starteam.StarTeamList"/> | |||
<taskdef name="style" classname="org.apache.tools.ant.taskdefs.XSLTProcess"/> | |||
<taskdef name="stylebook" classname="org.apache.tools.ant.taskdefs.optional.StyleBook"/> | |||
<taskdef name="tar" classname="org.apache.tools.ant.taskdefs.Tar"/> | |||
<taskdef name="taskdef" classname="org.apache.tools.ant.taskdefs.Taskdef"/> | |||
<taskdef name="telnet" classname="org.apache.tools.ant.taskdefs.optional.net.TelnetTask"/> | |||
<taskdef name="test" classname="org.apache.tools.ant.taskdefs.optional.Test"/> | |||
<taskdef name="touch" classname="org.apache.tools.ant.taskdefs.Touch"/> | |||
<taskdef name="translate" classname="org.apache.tools.ant.taskdefs.optional.i18n.Translate"/> | |||
<taskdef name="tstamp" classname="org.apache.tools.ant.taskdefs.Tstamp"/> | |||
<taskdef name="typedef" classname="org.apache.tools.ant.taskdefs.Typedef"/> | |||
<taskdef name="unjar" classname="org.apache.tools.ant.taskdefs.Expand"/> | |||
<taskdef name="untar" classname="org.apache.tools.ant.taskdefs.Untar"/> | |||
<taskdef name="unwar" classname="org.apache.tools.ant.taskdefs.Expand"/> | |||
<taskdef name="unzip" classname="org.apache.tools.ant.taskdefs.Expand"/> | |||
<taskdef name="uptodate" classname="org.apache.tools.ant.taskdefs.UpToDate"/> | |||
<taskdef name="vajexport" classname="org.apache.tools.ant.taskdefs.optional.ide.VAJExport"/> | |||
<taskdef name="vajimport" classname="org.apache.tools.ant.taskdefs.optional.ide.VAJImport"/> | |||
<taskdef name="vajload" classname="org.apache.tools.ant.taskdefs.optional.ide.VAJLoadProjects"/> | |||
<taskdef name="vsscheckin" classname="org.apache.tools.ant.taskdefs.optional.vss.MSVSSCHECKIN"/> | |||
<taskdef name="vsscheckout" classname="org.apache.tools.ant.taskdefs.optional.vss.MSVSSCHECKOUT"/> | |||
<taskdef name="vssget" classname="org.apache.tools.ant.taskdefs.optional.vss.MSVSSGET"/> | |||
<taskdef name="vsshistory" classname="org.apache.tools.ant.taskdefs.optional.vss.MSVSSHISTORY"/> | |||
<taskdef name="vsslabel" classname="org.apache.tools.ant.taskdefs.optional.vss.MSVSSLABEL"/> | |||
<taskdef name="waitfor" classname="org.apache.tools.ant.taskdefs.WaitFor"/> | |||
<taskdef name="war" classname="org.apache.tools.ant.taskdefs.War"/> | |||
<taskdef name="wljspc" classname="org.apache.tools.ant.taskdefs.optional.jsp.WLJspc"/> | |||
<taskdef name="wlrun" classname="org.apache.tools.ant.taskdefs.optional.ejb.WLRun"/> | |||
<taskdef name="wlstop" classname="org.apache.tools.ant.taskdefs.optional.ejb.WLStop"/> | |||
<taskdef name="xmlvalidate" classname="org.apache.tools.ant.taskdefs.optional.XMLValidateTask"/> | |||
<taskdef name="zip" classname="org.apache.tools.ant.taskdefs.Zip"/> | |||
<converter classname="org.apache.tools.ant.Ant1Converter"/> | |||
<typedef name="patternset" classname="org.apache.tools.ant.types.PatternSet"/> | |||
<typedef name="fileset" classname="org.apache.tools.ant.types.FileSet"/> | |||
<typedef name="path" classname="org.apache.tools.ant.types.Path"/> | |||
</antlib> |
@@ -136,7 +136,7 @@ public class AntClassLoader extends URLClassLoader | |||
/** | |||
* Initialize the given class | |||
* | |||
* @param theClass XXX Description of Parameter | |||
* @param theClass the class to be initialised | |||
*/ | |||
public static void initializeClass(Class theClass) { | |||
// do nothing in Ant2 | |||
@@ -188,14 +188,6 @@ public class AntClassLoader extends URLClassLoader | |||
public void cleanup() { | |||
} | |||
/** | |||
* New build listener interface | |||
* | |||
* @param be the build event to be processed | |||
*/ | |||
public void processBuildEvent(BuildEvent be) { | |||
} | |||
/** | |||
* Force a class to be loaded by this loader | |||
* | |||
@@ -219,7 +211,64 @@ public class AntClassLoader extends URLClassLoader | |||
} | |||
/** | |||
* Add a path tot his loader | |||
* build started event | |||
* | |||
* @param event build started event | |||
*/ | |||
public void buildStarted(BuildEvent event) { | |||
} | |||
/** | |||
* build finished event | |||
* | |||
* @param event build finished event | |||
*/ | |||
public void buildFinished(BuildEvent event) { | |||
cleanup(); | |||
} | |||
/** | |||
* target started event. | |||
* | |||
* @param event target started event. | |||
*/ | |||
public void targetStarted(BuildEvent event) { | |||
} | |||
/** | |||
* target finished event | |||
* | |||
* @param event target finished event | |||
*/ | |||
public void targetFinished(BuildEvent event) { | |||
} | |||
/** | |||
* task started event | |||
* | |||
* @param event task started event | |||
*/ | |||
public void taskStarted(BuildEvent event) { | |||
} | |||
/** | |||
* task finished event | |||
* | |||
* @param event task finished event | |||
*/ | |||
public void taskFinished(BuildEvent event) { | |||
} | |||
/** | |||
* message logged event | |||
* | |||
* @param event message logged event | |||
*/ | |||
public void messageLogged(BuildEvent event) { | |||
} | |||
/** | |||
* Add a path to this loader | |||
* | |||
* @param path the path to be added to this loader | |||
*/ | |||
@@ -66,7 +66,7 @@ public class BuildEvent extends org.apache.ant.common.event.BuildEvent { | |||
* @param task the task that emitted the event. | |||
*/ | |||
public BuildEvent(Task task) { | |||
super(task, MESSAGE); | |||
super(task.getContext().getModelElement(), MESSAGE); | |||
} | |||
} | |||
@@ -629,7 +629,7 @@ public class Project { | |||
public Hashtable getProperties() { | |||
Map properties = dataService.getAllProperties(); | |||
Hashtable result = new Hashtable(); | |||
for (Iterator i = properties.keySet().iterator(); i.hasNext();) { | |||
for (Iterator i = properties.keySet().iterator(); i.hasNext(); ) { | |||
String name = (String)i.next(); | |||
Object value = properties.get(name); | |||
if (value instanceof String) { | |||
@@ -655,7 +655,7 @@ public class Project { | |||
public Hashtable getReferences() { | |||
Map properties = dataService.getAllProperties(); | |||
Hashtable result = new Hashtable(); | |||
for (Iterator i = properties.keySet().iterator(); i.hasNext();) { | |||
for (Iterator i = properties.keySet().iterator(); i.hasNext(); ) { | |||
String name = (String)i.next(); | |||
Object value = properties.get(name); | |||
if (!(value instanceof String)) { | |||
@@ -117,7 +117,7 @@ public abstract class ProjectComponent { | |||
public void init(AntContext context) throws ExecutionException { | |||
this.context = context; | |||
org.apache.ant.common.util.Location contextLocation | |||
= context.getLocation(); | |||
= context.getModelElement().getLocation(); | |||
if (contextLocation | |||
== org.apache.ant.common.util.Location.UNKNOWN_LOCATION) { | |||
@@ -153,5 +153,14 @@ public abstract class ProjectComponent { | |||
context.log(message, Project.MSG_INFO); | |||
} | |||
/** | |||
* Get the context associated with this component | |||
* | |||
* @return the AntContext | |||
*/ | |||
protected AntContext getContext() { | |||
return context; | |||
} | |||
} | |||
@@ -121,12 +121,18 @@ public abstract class Task extends ProjectComponent | |||
/** | |||
* Gets the description of the Task | |||
* | |||
* @return the task's description | |||
* @return the task's description | |||
*/ | |||
public String getDescription() { | |||
return description; | |||
} | |||
/** Validate this component */ | |||
public void validateComponent() { | |||
// no default validation for Ant1 tasks | |||
} | |||
/** | |||
* Handle output captured for this task | |||
* | |||
@@ -153,6 +159,5 @@ public abstract class Task extends ProjectComponent | |||
void setTaskType(String type) { | |||
this.taskType = type; | |||
} | |||
} | |||
@@ -132,6 +132,12 @@ public abstract class DataType extends ProjectComponent | |||
return ref != null; | |||
} | |||
/** Validate this component */ | |||
public void validateComponent() { | |||
// no default validation for Ant1 types | |||
} | |||
/** | |||
* Performs the check for circular references and returns the referenced | |||
* object. | |||
@@ -7,6 +7,9 @@ | |||
<taskdef name="typedef" classname="org.apache.ant.antlib.system.TypeDef"/> | |||
<taskdef name="loadlib" classname="org.apache.ant.antlib.system.LoadLib"/> | |||
<taskdef name="ant" classname="org.apache.ant.antlib.system.Ant"/> | |||
<taskdef name="antcall" classname="org.apache.ant.antlib.system.AntCall"/> | |||
<converter classname="org.apache.ant.antlib.system.FileConverter"/> | |||
<converter classname="org.apache.ant.antlib.system.URLConverter"/> | |||
<converter classname="org.apache.ant.antlib.system.PrimitiveConverter"/> | |||
@@ -51,73 +51,69 @@ | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.execution; | |||
import java.net.MalformedURLException; | |||
import java.util.HashMap; | |||
import java.util.Iterator; | |||
import java.util.Map; | |||
import org.apache.ant.antcore.antlib.AntLibManager; | |||
import org.apache.ant.antcore.util.ConfigException; | |||
package org.apache.ant.antlib.system; | |||
import java.io.File; | |||
import org.apache.ant.common.service.ComponentService; | |||
import org.apache.ant.common.util.ExecutionException; | |||
/** | |||
* The instance of the ComponentServices made available by the core to the | |||
* ant libraries. | |||
* The Ant task - used to execute a different build file | |||
* | |||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||
* @created 27 January 2002 | |||
* @created 4 February 2002 | |||
*/ | |||
public class ExecutionComponentService implements ComponentService { | |||
/** The ExecutionFrame this service instance is working for */ | |||
private ExecutionFrame frame; | |||
public class Ant extends AntBase { | |||
/** The ant file to be run */ | |||
private File antFile; | |||
/** the base directory to use for the run */ | |||
private File baseDir; | |||
/** File to capture any output */ | |||
private File outputFile; | |||
/** The library manager instance used to configure libraries. */ | |||
private AntLibManager libManager; | |||
/** | |||
* sets the file containing the XML representation model to build | |||
* | |||
* @param antFile the file to build | |||
*/ | |||
public void setAntFile(File antFile) { | |||
this.antFile = antFile; | |||
} | |||
/** | |||
* Constructor | |||
* Set the base directory for the execution of the build | |||
* | |||
* @param executionFrame the frame containing this context | |||
* @param allowRemoteLibs true if remote libraries can be loaded though | |||
* this service. | |||
* @param baseDir the base directory for the build | |||
*/ | |||
public ExecutionComponentService(ExecutionFrame executionFrame, | |||
boolean allowRemoteLibs) { | |||
this.frame = executionFrame; | |||
libManager = new AntLibManager(allowRemoteLibs); | |||
public void setBaseDir(File baseDir) { | |||
this.baseDir = baseDir; | |||
} | |||
/** | |||
* Load a library or set of libraries from a location making them | |||
* available for use | |||
* The output file for capturing the build output | |||
* | |||
* @param libLocation the file or URL of the library location | |||
* @param importAll if true all tasks are imported as the library is | |||
* loaded | |||
* @exception ExecutionException if the library cannot be loaded | |||
* @param outputFile the output file for capturing the build output | |||
*/ | |||
public void loadLib(String libLocation, boolean importAll) | |||
throws ExecutionException { | |||
try { | |||
Map librarySpecs = new HashMap(); | |||
libManager.loadLib(librarySpecs, libLocation); | |||
libManager.configLibraries(frame.getInitConfig(), librarySpecs, | |||
frame.getAntLibraries()); | |||
public void setOutput(File outputFile) { | |||
this.outputFile = outputFile; | |||
} | |||
if (importAll) { | |||
Iterator i = librarySpecs.keySet().iterator(); | |||
while (i.hasNext()) { | |||
String libraryId = (String)i.next(); | |||
frame.importLibrary(libraryId); | |||
} | |||
} | |||
} catch (MalformedURLException e) { | |||
throw new ExecutionException("Unable to load libraries from " | |||
+ libLocation, e); | |||
} catch (ConfigException e) { | |||
throw new ExecutionException(e); | |||
/** | |||
* Run the sub-build | |||
* | |||
* @exception ExecutionException if the build can't be run | |||
*/ | |||
public void execute() throws ExecutionException { | |||
if (baseDir == null) { | |||
baseDir = getContext().getBaseDir(); | |||
} | |||
if (antFile == null) { | |||
antFile = new File(baseDir, "build.ant"); | |||
} | |||
ComponentService componentService | |||
= (ComponentService)getCoreService(ComponentService.class); | |||
componentService.runBuild(antFile, getProperties(), getTargets()); | |||
} | |||
} | |||
@@ -0,0 +1,293 @@ | |||
/* | |||
* 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.ArrayList; | |||
import java.util.HashMap; | |||
import java.util.List; | |||
import java.util.Map; | |||
import org.apache.ant.common.antlib.AbstractTask; | |||
import org.apache.ant.common.antlib.AntContext; | |||
import org.apache.ant.common.antlib.AbstractComponent; | |||
import org.apache.ant.common.service.DataService; | |||
import org.apache.ant.common.util.ExecutionException; | |||
/** | |||
* Common Base class for the Ant and AntCall tasks | |||
* | |||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||
* @created 4 February 2002 | |||
*/ | |||
public abstract class AntBase extends AbstractTask { | |||
/** | |||
* Simple Property value storing class | |||
* | |||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||
* @created 5 February 2002 | |||
*/ | |||
public static class Property extends AbstractComponent { | |||
/** The property name */ | |||
private String name; | |||
/** The property value*/ | |||
private String 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; | |||
} | |||
/** | |||
* 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; | |||
} | |||
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 <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||
* @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; | |||
/** | |||
* 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; | |||
} | |||
/** | |||
* 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; | |||
} | |||
public void validateComponent() throws ExecutionException { | |||
if (refId == null) { | |||
throw new ExecutionException("\"refid\" attribute of <reference> must be supplied"); | |||
} | |||
} | |||
} | |||
/** The name of the target to be evaluated in the sub-build */ | |||
private String targetName; | |||
/** flag which indicates if all current properties should be passed to the subbuild */ | |||
private boolean inheritAll = true; | |||
/** flag which indicates if all current references should be passed to the subbuild */ | |||
private boolean inheritRefs = false; | |||
/** The properties which will be passed to the sub-build */ | |||
private Map properties = new HashMap(); | |||
/** The core's data service for manipulating the properties */ | |||
private DataService dataService; | |||
/** | |||
* Sets the target to be executed in the subbuild | |||
* | |||
* @param targetName the name of the target to build | |||
*/ | |||
public void setTarget(String targetName) { | |||
this.targetName = targetName; | |||
} | |||
/** | |||
* Indicate if all properties should be passed | |||
* | |||
* @param inheritAll true if all properties should be passed | |||
*/ | |||
public void setInheritAll(boolean inheritAll) { | |||
this.inheritAll = inheritAll; | |||
} | |||
/** | |||
* Indicate if all references are to be passed to the subbuild | |||
* | |||
* @param inheritRefs true if the sub-build should be given all the current references | |||
*/ | |||
public void setInheritRefs(boolean inheritRefs) { | |||
this.inheritRefs = inheritRefs; | |||
} | |||
/** | |||
* Initialise this task | |||
* | |||
* @param context core's context | |||
* @exception ExecutionException if we can't access the data service | |||
*/ | |||
public void init(AntContext context) throws ExecutionException { | |||
super.init(context); | |||
dataService = (DataService)getCoreService(DataService.class); | |||
} | |||
/** | |||
* 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 list of targets to be executed | |||
* | |||
* @return A List of string target names. | |||
*/ | |||
protected List getTargets() { | |||
List targets = new ArrayList(); | |||
if (targetName != null) { | |||
targets.add(targetName); | |||
} | |||
return targets; | |||
} | |||
/** | |||
* Get the properties to be used with the sub-build | |||
* | |||
* @return the properties the sub-build will start with | |||
*/ | |||
protected Map getProperties() { | |||
return properties; | |||
} | |||
} | |||
@@ -0,0 +1,87 @@ | |||
/* | |||
* 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 org.apache.ant.common.service.ComponentService; | |||
import org.apache.ant.common.util.ExecutionException; | |||
/** | |||
* The Ant task - used to execute a different build file | |||
* | |||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||
* @created 4 February 2002 | |||
*/ | |||
public class AntCall extends AntBase { | |||
/** | |||
* Execute the sub-build | |||
* | |||
* @exception ExecutionException if the build fails | |||
*/ | |||
public void execute() throws ExecutionException { | |||
ComponentService componentService | |||
= (ComponentService)getCoreService(ComponentService.class); | |||
componentService.callTarget(getProperties(), getTargets()); | |||
} | |||
/** | |||
* Alias to add a property to the sub-build | |||
* | |||
* @param param descriptor for the property to be passed | |||
*/ | |||
public void addParam(Property param) { | |||
super.addProperty(param); | |||
} | |||
} | |||
@@ -60,18 +60,20 @@ import java.io.PrintStream; | |||
import java.net.MalformedURLException; | |||
import java.net.URL; | |||
import java.util.ArrayList; | |||
import java.util.HashMap; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import org.apache.ant.antcore.config.AntConfig; | |||
import org.apache.ant.antcore.config.AntConfigHandler; | |||
import org.apache.ant.antcore.execution.ExecutionManager; | |||
import org.apache.ant.antcore.model.Project; | |||
import org.apache.ant.antcore.model.xmlparser.XMLProjectParser; | |||
import org.apache.ant.antcore.util.ConfigException; | |||
import org.apache.ant.antcore.modelparser.XMLProjectParser; | |||
import org.apache.ant.antcore.xml.ParseContext; | |||
import org.apache.ant.antcore.xml.XMLParseException; | |||
import org.apache.ant.common.event.BuildListener; | |||
import org.apache.ant.common.model.Project; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.ant.common.util.ConfigException; | |||
import org.apache.ant.common.util.Location; | |||
import org.apache.ant.common.util.MessageLevel; | |||
import org.apache.ant.init.InitConfig; | |||
@@ -87,6 +89,9 @@ public class Commandline { | |||
/** The default build file name */ | |||
public final static String DEFAULT_BUILD_FILENAME = "build.ant"; | |||
/** The default build file name */ | |||
public final static String DEFAULT_ANT1_FILENAME = "build.xml"; | |||
/** The initialisation configuration for Ant */ | |||
private InitConfig config; | |||
@@ -102,6 +107,9 @@ public class Commandline { | |||
/** The list of targets to be evaluated in this invocation */ | |||
private List targets = new ArrayList(4); | |||
/** The command line properties */ | |||
private Map definedProperties = new HashMap(); | |||
/** | |||
* This is the build file to run. By default it is a file: type URL but | |||
* other URL protocols can be used. | |||
@@ -237,7 +245,7 @@ public class Commandline { | |||
ExecutionManager executionManager | |||
= new ExecutionManager(initConfig, config); | |||
addBuildListeners(executionManager); | |||
executionManager.runBuild(project, targets); | |||
executionManager.runBuild(project, targets, definedProperties); | |||
} catch (Throwable t) { | |||
if (t instanceof AntException) { | |||
AntException e = (AntException)t; | |||
@@ -329,6 +337,9 @@ public class Commandline { | |||
} else if (arg.equals("-verbose") || arg.equals("-v")) { | |||
// printVersion(); | |||
messageOutputLevel = MessageLevel.MSG_VERBOSE; | |||
} else if (arg.equals("-debug")) { | |||
// printVersion(); | |||
messageOutputLevel = MessageLevel.MSG_DEBUG; | |||
} else if (arg.equals("-listener")) { | |||
try { | |||
listeners.add(args[i++]); | |||
@@ -350,6 +361,17 @@ public class Commandline { | |||
"using the -logger argument"); | |||
return; | |||
} | |||
} else if (arg.startsWith("-D")) { | |||
String name = arg.substring(2, arg.length()); | |||
String value = null; | |||
int posEq = name.indexOf("="); | |||
if (posEq > 0) { | |||
value = name.substring(posEq + 1); | |||
name = name.substring(0, posEq); | |||
} else if (i < args.length - 1) { | |||
value = args[++i]; | |||
} | |||
definedProperties.put(name, value); | |||
} else if (arg.startsWith("-")) { | |||
// we don't have any more args to recognize! | |||
System.out.println("Unknown option: " + arg); | |||
@@ -362,6 +384,12 @@ public class Commandline { | |||
if (buildFileURL == null) { | |||
File defaultBuildFile = new File(DEFAULT_BUILD_FILENAME); | |||
if (!defaultBuildFile.exists()) { | |||
File ant1BuildFile = new File(DEFAULT_ANT1_FILENAME); | |||
if (ant1BuildFile.exists()) { | |||
defaultBuildFile = ant1BuildFile; | |||
} | |||
} | |||
try { | |||
buildFileURL = InitUtils.getFileURL(defaultBuildFile); | |||
} catch (MalformedURLException e) { | |||
@@ -1,125 +1,103 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.cli; | |||
import java.io.PrintStream; | |||
import org.apache.ant.common.model.BuildElement; | |||
import org.apache.ant.common.model.Target; | |||
import org.apache.ant.common.event.BuildEvent; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.ant.common.util.Location; | |||
import org.apache.ant.common.util.MessageLevel; | |||
import org.apache.ant.common.event.BuildEvent; | |||
import org.apache.ant.antcore.model.BuildElement; | |||
import org.apache.ant.antcore.model.Target; | |||
/** | |||
* Writes build event to a PrintStream. Currently, it only writes which | |||
* targets are being executed, and any messages that get logged. | |||
* Writes build event to a PrintStream. Currently, it only writes which | |||
* targets are being executed, and any messages that get logged. | |||
* | |||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||
* @created 15 January 2002 | |||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||
* @created 15 January 2002 | |||
*/ | |||
public class DefaultLogger implements BuildLogger { | |||
/** Standard field separator */ | |||
private static String lSep = System.getProperty("line.separator"); | |||
/** spacing to allow for task tags */ | |||
private final static int LEFT_COLUMN_SIZE = 12; | |||
/** The stream where output should be written */ | |||
/** The stream where output should be written */ | |||
private PrintStream out; | |||
/** The stream to where errors should be written */ | |||
/** The stream to where errors should be written */ | |||
private PrintStream err; | |||
/** The level of messages which should be let through */ | |||
/** The level of messages which should be let through */ | |||
private int messageOutputLevel = MessageLevel.MSG_ERR; | |||
/** Controls whether adornments are added */ | |||
/** Controls whether adornments are added */ | |||
private boolean emacsMode = false; | |||
/** The time at which the build started */ | |||
/** The time at which the build started */ | |||
private long startTime = System.currentTimeMillis(); | |||
/** | |||
* Format the time into something readable | |||
* | |||
* @param millis Java millis value | |||
* @return the formatted time | |||
*/ | |||
protected static String formatTime(long millis) { | |||
long seconds = millis / 1000; | |||
long minutes = seconds / 60; | |||
if (minutes > 0) { | |||
return Long.toString(minutes) + " minute" | |||
+ (minutes == 1 ? " " : "s ") | |||
+ Long.toString(seconds % 60) + " second" | |||
+ (seconds % 60 == 1 ? "" : "s"); | |||
} else { | |||
return Long.toString(seconds) + " second" | |||
+ (seconds % 60 == 1 ? "" : "s"); | |||
} | |||
} | |||
/** Standard field separator */ | |||
private static String lSep = System.getProperty("line.separator"); | |||
/** spacing to allow for task tags */ | |||
private final static int LEFT_COLUMN_SIZE = 12; | |||
/** | |||
* Set the messageOutputLevel this logger is to respond to. Only | |||
* messages with a message level lower than or equal to the given level | |||
* are output to the log. <P> | |||
* Set the messageOutputLevel this logger is to respond to. Only | |||
* messages with a message level lower than or equal to the given level | |||
* are output to the log. <P> | |||
* | |||
* Constants for the message levels are in Project.java. The order of | |||
* the levels, from least to most verbose, is MSG_ERR, MSG_WARN, | |||
* MSG_INFO, MSG_VERBOSE, MSG_DEBUG. The default message level for | |||
* DefaultLogger is Project.MSG_ERR. | |||
* Constants for the message levels are in Project.java. The order of | |||
* the levels, from least to most verbose, is MSG_ERR, MSG_WARN, | |||
* MSG_INFO, MSG_VERBOSE, MSG_DEBUG. The default message level for | |||
* DefaultLogger is Project.MSG_ERR. | |||
* | |||
* @param level the logging level for the logger. | |||
* @param level the logging level for the logger. | |||
*/ | |||
public void setMessageOutputLevel(int level) { | |||
this.messageOutputLevel = level; | |||
@@ -127,27 +105,28 @@ public class DefaultLogger implements BuildLogger { | |||
/** | |||
* Set the output stream to which this logger is to send its output. | |||
* Set the output stream to which this logger is to send its output. | |||
* | |||
* @param output the output stream for the logger. | |||
* @param output the output stream for the logger. | |||
*/ | |||
public void setOutputPrintStream(PrintStream output) { | |||
this.out = output; | |||
} | |||
/** | |||
* Set the output stream to which this logger is to send error messages. | |||
* Set the output stream to which this logger is to send error | |||
* messages. | |||
* | |||
* @param err the error stream for the logger. | |||
* @param err the error stream for the logger. | |||
*/ | |||
public void setErrorPrintStream(PrintStream err) { | |||
this.err = err; | |||
} | |||
/** | |||
* Set this logger to produce emacs (and other editor) friendly output. | |||
* Set this logger to produce emacs (and other editor) friendly output. | |||
* | |||
* @param emacsMode true if output is to be unadorned so that emacs and | |||
* @param emacsMode true if output is to be unadorned so that emacs and | |||
* other editors can parse files names, etc. | |||
*/ | |||
public void setEmacsMode(boolean emacsMode) { | |||
@@ -155,9 +134,9 @@ public class DefaultLogger implements BuildLogger { | |||
} | |||
/** | |||
* Report an exception | |||
* Report an exception | |||
* | |||
* @param t The exception to be reported. | |||
* @param t The exception to be reported. | |||
*/ | |||
public void reportException(Throwable t) { | |||
if (t instanceof AntException) { | |||
@@ -182,72 +161,121 @@ public class DefaultLogger implements BuildLogger { | |||
} | |||
/** | |||
* Process an incoming build event | |||
* Description of the Method | |||
* | |||
* @param event the build event to be processed | |||
* @param event Description of Parameter | |||
*/ | |||
public void processBuildEvent(BuildEvent event) { | |||
switch (event.getEventType()) { | |||
case BuildEvent.BUILD_STARTED: | |||
startTime = System.currentTimeMillis(); | |||
break; | |||
case BuildEvent.BUILD_FINISHED: | |||
Throwable cause = event.getCause(); | |||
if (cause == null) { | |||
out.println(lSep + "BUILD SUCCESSFUL"); | |||
} else { | |||
err.println(lSep + "BUILD FAILED" + lSep); | |||
reportException(cause); | |||
} | |||
public void buildStarted(BuildEvent event) { | |||
startTime = System.currentTimeMillis(); | |||
} | |||
out.println(lSep + "Total time: " | |||
+ formatTime(System.currentTimeMillis() - startTime)); | |||
break; | |||
case BuildEvent.TARGET_STARTED: | |||
if (MessageLevel.MSG_INFO <= messageOutputLevel) { | |||
Target target = (Target)event.getSource(); | |||
out.println(lSep + target.getName() + ":"); | |||
} | |||
break; | |||
case BuildEvent.TARGET_FINISHED: | |||
break; | |||
case BuildEvent.TASK_STARTED: | |||
break; | |||
case BuildEvent.TASK_FINISHED: | |||
break; | |||
case BuildEvent.MESSAGE: | |||
PrintStream logTo | |||
= event.getPriority() == MessageLevel.MSG_ERR ? err : out; | |||
// Filter out messages based on priority | |||
if (event.getPriority() <= messageOutputLevel | |||
&& event.getSource() instanceof BuildElement) { | |||
// Print out the name of the task if we're in one | |||
BuildElement buildElement | |||
= (BuildElement)event.getSource(); | |||
String name = buildElement.getType(); | |||
if (!emacsMode) { | |||
String msg = "[" + name + "] "; | |||
int indentSize = LEFT_COLUMN_SIZE - msg.length(); | |||
for (int i = 0; i < indentSize; i++) { | |||
logTo.print(" "); | |||
} | |||
logTo.print(msg); | |||
} | |||
// Print the message | |||
logTo.println(event.getMessage()); | |||
/** | |||
* Description of the Method | |||
* | |||
* @param event Description of Parameter | |||
*/ | |||
public void buildFinished(BuildEvent event) { | |||
Throwable cause = event.getCause(); | |||
if (cause == null) { | |||
out.println(lSep + "BUILD SUCCESSFUL"); | |||
} else { | |||
err.println(lSep + "BUILD FAILED" + lSep); | |||
reportException(cause); | |||
} | |||
out.println(lSep + "Total time: " | |||
+ formatTime(System.currentTimeMillis() - startTime)); | |||
} | |||
/** | |||
* Description of the Method | |||
* | |||
* @param event Description of Parameter | |||
*/ | |||
public void targetStarted(BuildEvent event) { | |||
if (MessageLevel.MSG_INFO <= messageOutputLevel) { | |||
Target target = (Target)event.getSource(); | |||
out.println(lSep + target.getName() + ":"); | |||
} | |||
} | |||
/** | |||
* Description of the Method | |||
* | |||
* @param event Description of Parameter | |||
*/ | |||
public void targetFinished(BuildEvent event) { | |||
} | |||
/** | |||
* Description of the Method | |||
* | |||
* @param event Description of Parameter | |||
*/ | |||
public void taskStarted(BuildEvent event) { | |||
} | |||
/** | |||
* Description of the Method | |||
* | |||
* @param event Description of Parameter | |||
*/ | |||
public void taskFinished(BuildEvent event) { | |||
} | |||
/** | |||
* Description of the Method | |||
* | |||
* @param event Description of Parameter | |||
*/ | |||
public void messageLogged(BuildEvent event) { | |||
PrintStream logTo | |||
= event.getPriority() == MessageLevel.MSG_ERR ? err : out; | |||
// Filter out messages based on priority | |||
if (event.getPriority() <= messageOutputLevel | |||
&& event.getModelElement() instanceof BuildElement) { | |||
// Print out the name of the task if we're in one | |||
BuildElement buildElement | |||
= (BuildElement)event.getModelElement(); | |||
String name = buildElement.getType(); | |||
if (!emacsMode) { | |||
String msg = "[" + name + "] "; | |||
int indentSize = LEFT_COLUMN_SIZE - msg.length(); | |||
for (int i = 0; i < indentSize; i++) { | |||
logTo.print(" "); | |||
} | |||
break; | |||
default: | |||
err.println("Unrecognized event type = " + | |||
event.getEventType()); | |||
break; | |||
logTo.print(msg); | |||
} | |||
// Print the message | |||
logTo.println(event.getMessage()); | |||
} | |||
} | |||
/** | |||
* Format the time into something readable | |||
* | |||
* @param millis Java millis value | |||
* @return the formatted time | |||
*/ | |||
protected static String formatTime(long millis) { | |||
long seconds = millis / 1000; | |||
long minutes = seconds / 60; | |||
if (minutes > 0) { | |||
return Long.toString(minutes) + " minute" | |||
+ (minutes == 1 ? " " : "s ") | |||
+ Long.toString(seconds % 60) + " second" | |||
+ (seconds % 60 == 1 ? "" : "s"); | |||
} else { | |||
return Long.toString(seconds) + " second" | |||
+ (seconds % 60 == 1 ? "" : "s"); | |||
} | |||
} | |||
} | |||
@@ -0,0 +1,122 @@ | |||
/* | |||
* 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.common.antlib; | |||
import org.apache.ant.common.util.ExecutionException; | |||
/** | |||
* Abstract implementation of the ExecutionComponent | |||
* | |||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||
* @created 5 February 2002 | |||
*/ | |||
public abstract class AbstractComponent implements ExecutionComponent { | |||
/** The components's context */ | |||
private AntContext context; | |||
/** | |||
* Initialise the component. The component may use the AntContext to | |||
* request services from the Ant core. | |||
* | |||
* @param context the component's context | |||
* @exception ExecutionException if initialisation fails | |||
*/ | |||
public void init(AntContext context) throws ExecutionException { | |||
this.context = context; | |||
} | |||
/** | |||
* Validate the component. This is called after the element has been | |||
* configured from its build model. The element may perform validation | |||
* of its configuration | |||
* | |||
* @exception ExecutionException if validation fails | |||
*/ | |||
public void validateComponent() throws ExecutionException { | |||
// no validation by default | |||
} | |||
/** | |||
* Get this component's context | |||
* | |||
* @return the component context | |||
*/ | |||
protected AntContext getContext() { | |||
return context; | |||
} | |||
/** | |||
* Short cut to get a core service instance | |||
* | |||
* @param serviceClass the required interface of which an instance is required | |||
* @return the core's instance of the requested service | |||
* @exception ExecutionException if the core does not support the requested service | |||
*/ | |||
protected Object getCoreService(Class serviceClass) | |||
throws ExecutionException { | |||
return context.getCoreService(serviceClass); | |||
} | |||
/** | |||
* Log a message as a build event | |||
* | |||
* @param message the message to be logged | |||
* @param level the priority level of the message | |||
*/ | |||
protected void log(String message, int level) { | |||
context.log(message, level); | |||
} | |||
} | |||
@@ -59,42 +59,10 @@ package org.apache.ant.common.antlib; | |||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||
* @created 16 January 2002 | |||
*/ | |||
public abstract class AbstractTask implements Task { | |||
/** The task's context */ | |||
private AntContext context; | |||
/** | |||
* Initialise the task. The task may use the AntContext to request | |||
* services from the Ant core. | |||
* | |||
* @param context the Task's context | |||
*/ | |||
public void init(AntContext context) { | |||
this.context = context; | |||
} | |||
public abstract class AbstractTask extends AbstractComponent implements Task { | |||
/** Task is about to be cleaned up */ | |||
public void destroy() { | |||
// do nothing here | |||
} | |||
/** | |||
* Get this task's context | |||
* | |||
* @return the task context | |||
*/ | |||
protected AntContext getContext() { | |||
return context; | |||
} | |||
/** | |||
* Log a message as a build event | |||
* | |||
* @param message the message to be logged | |||
* @param level the priority level of the message | |||
*/ | |||
protected void log(String message, int level) { | |||
context.log(message, level); | |||
} | |||
} | |||
@@ -53,9 +53,9 @@ | |||
*/ | |||
package org.apache.ant.common.antlib; | |||
import java.io.File; | |||
import org.apache.ant.common.model.ModelElement; | |||
import org.apache.ant.common.util.ExecutionException; | |||
import org.apache.ant.common.util.Location; | |||
/** | |||
* The AntContext is the interface through which the Ant container and the | |||
@@ -88,17 +88,17 @@ public interface AntContext { | |||
throws ExecutionException; | |||
/** | |||
* Get the build file location with which this context is associated. | |||
* Get the basedir for the current execution | |||
* | |||
* @return the associated build file location | |||
* @return the base directory for this execution of Ant | |||
*/ | |||
Location getLocation(); | |||
File getBaseDir(); | |||
/** | |||
* Get the basedir for the current execution | |||
* Get the model element associated with this context | |||
* | |||
* @return the base directory for this execution of Ant | |||
* @return the modelElement associated with this context | |||
*/ | |||
File getBaseDir(); | |||
ModelElement getModelElement(); | |||
} | |||
@@ -55,8 +55,8 @@ package org.apache.ant.common.antlib; | |||
import org.apache.ant.common.util.ExecutionException; | |||
/** | |||
* An execution component is a component from an AntLibrary which is used in the | |||
* execution of an Ant build. A component can have a context. | |||
* An execution component is a component from an AntLibrary which is used in | |||
* the execution of an Ant build. A component can have a context. | |||
* | |||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||
* @created 1 February 2002 | |||
@@ -70,5 +70,14 @@ public interface ExecutionComponent { | |||
* @exception ExecutionException if the component cannot be initialised | |||
*/ | |||
void init(AntContext context) throws ExecutionException; | |||
/** | |||
* Validate the component. This is called after the element has been | |||
* configured from its build model. The element may perform validation | |||
* of its configuration | |||
* | |||
* @exception ExecutionException if the component is not validly configured | |||
*/ | |||
void validateComponent() throws ExecutionException; | |||
} | |||
@@ -54,6 +54,7 @@ | |||
package org.apache.ant.common.event; | |||
import java.util.EventObject; | |||
import org.apache.ant.common.model.ModelElement; | |||
/** | |||
* A BuildEvent indicates the occurence of a significant event in the build. | |||
@@ -96,7 +97,7 @@ public class BuildEvent extends EventObject { | |||
* @param eventType the type of the buildEvent. | |||
* @param source the element with which this event is associated | |||
*/ | |||
public BuildEvent(Object source, int eventType) { | |||
public BuildEvent(ModelElement source, int eventType) { | |||
super(source); | |||
this.eventType = eventType; | |||
} | |||
@@ -108,7 +109,7 @@ public class BuildEvent extends EventObject { | |||
* @param cause An exception if associated with the event | |||
* @param source the object with which this event is associated | |||
*/ | |||
public BuildEvent(Object source, int eventType, | |||
public BuildEvent(ModelElement source, int eventType, | |||
Throwable cause) { | |||
this(source, eventType); | |||
this.cause = cause; | |||
@@ -117,12 +118,11 @@ public class BuildEvent extends EventObject { | |||
/** | |||
* Create a build event for a message | |||
* | |||
* @param source the object with which the event is | |||
* associated. | |||
* @param source the object with which the event is associated. | |||
* @param message the message associated with this event | |||
* @param priority the message priority | |||
*/ | |||
public BuildEvent(Object source, String message, | |||
public BuildEvent(ModelElement source, String message, | |||
int priority) { | |||
this(source, MESSAGE); | |||
this.message = message; | |||
@@ -168,5 +168,14 @@ public class BuildEvent extends EventObject { | |||
public Throwable getCause() { | |||
return cause; | |||
} | |||
/** | |||
* Gets the modelElement of the BuildEvent | |||
* | |||
* @return the model element this event is associated with | |||
*/ | |||
public ModelElement getModelElement() { | |||
return (ModelElement)getSource(); | |||
} | |||
} | |||
@@ -65,10 +65,55 @@ import java.util.EventListener; | |||
*/ | |||
public interface BuildListener extends EventListener { | |||
/** | |||
* Process an incoming build event | |||
* Fired before any targets are started. | |||
* | |||
* @param event the event to be processed. | |||
* @param event the build event for this notification | |||
*/ | |||
void processBuildEvent(BuildEvent event); | |||
void buildStarted(BuildEvent event); | |||
/** | |||
* Fired after the last target has finished. This event will still be | |||
* thrown if an error occured during the build. | |||
* | |||
* @param event the build event for this notification | |||
*/ | |||
void buildFinished(BuildEvent event); | |||
/** | |||
* Fired when a target is started. | |||
* | |||
* @param event the build event for this notification | |||
*/ | |||
void targetStarted(BuildEvent event); | |||
/** | |||
* Fired when a target has finished. This event will still be thrown if | |||
* an error occured during the build. | |||
* | |||
* @param event the build event for this notification | |||
*/ | |||
void targetFinished(BuildEvent event); | |||
/** | |||
* Fired when a task is started. | |||
* | |||
* @param event the build event for this notification | |||
*/ | |||
void taskStarted(BuildEvent event); | |||
/** | |||
* Fired when a task has finished. This event will still be throw if an | |||
* error occured during the build. | |||
* | |||
* @param event the build event for this notification | |||
*/ | |||
void taskFinished(BuildEvent event); | |||
/** | |||
* Fired whenever a message is logged. | |||
* | |||
* @param event the build event for this notification | |||
*/ | |||
void messageLogged(BuildEvent event); | |||
} | |||
@@ -51,7 +51,7 @@ | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.model; | |||
package org.apache.ant.common.model; | |||
import java.util.ArrayList; | |||
import java.util.HashMap; | |||
import java.util.Iterator; |
@@ -51,7 +51,7 @@ | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.model; | |||
package org.apache.ant.common.model; | |||
import java.util.HashMap; | |||
import java.util.Iterator; | |||
import java.util.Map; |
@@ -51,7 +51,7 @@ | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.model; | |||
package org.apache.ant.common.model; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.ant.common.util.Location; |
@@ -51,7 +51,7 @@ | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.model; | |||
package org.apache.ant.common.model; | |||
import java.net.URL; | |||
import java.util.ArrayList; | |||
import java.util.HashMap; | |||
@@ -61,10 +61,10 @@ import java.util.List; | |||
import java.util.Map; | |||
import java.util.Set; | |||
import java.util.StringTokenizer; | |||
import org.apache.ant.common.util.CircularDependencyChecker; | |||
import org.apache.ant.common.util.CircularDependencyException; | |||
import org.apache.ant.common.util.ConfigException; | |||
import org.apache.ant.common.util.Location; | |||
import org.apache.ant.antcore.util.CircularDependencyChecker; | |||
import org.apache.ant.antcore.util.CircularDependencyException; | |||
import org.apache.ant.antcore.util.ConfigException; | |||
/** | |||
* A project is a collection of targets and global tasks. A project may | |||
@@ -366,42 +366,12 @@ public class Project extends ModelElement { | |||
} | |||
/** | |||
* Validate that this build element is configured correctly | |||
* Validate this project | |||
* | |||
* @param globalName The name of this project in the reference name | |||
* space | |||
* @exception ModelException if the element is invalid | |||
* @exception ModelException if the project is not valid | |||
*/ | |||
public void validate(String globalName) throws ModelException { | |||
Set keys = referencedProjects.keySet(); | |||
for (Iterator i = keys.iterator(); i.hasNext(); ) { | |||
String refName = (String)i.next(); | |||
Project referencedProject | |||
= (Project)referencedProjects.get(refName); | |||
String refGlobalName = refName; | |||
if (globalName != null) { | |||
refGlobalName = globalName + REF_DELIMITER + refName; | |||
} | |||
referencedProject.validate(refGlobalName); | |||
} | |||
// we now check whether all of dependencies for our targets | |||
// exist in the model | |||
// visited contains the targets we have already visited and verified | |||
Set visited = new HashSet(); | |||
// checker records the targets we are currently visiting | |||
CircularDependencyChecker checker | |||
= new CircularDependencyChecker("checking target dependencies"); | |||
// dependency order is purely recorded for debug purposes | |||
List dependencyOrder = new ArrayList(); | |||
for (Iterator i = getTargets(); i.hasNext(); ) { | |||
Target target = (Target)i.next(); | |||
target.validate(); | |||
fillinDependencyOrder(globalName, target, dependencyOrder, | |||
visited, checker); | |||
} | |||
public void validate() throws ModelException { | |||
validate(null); | |||
} | |||
/** | |||
@@ -466,8 +436,47 @@ public class Project extends ModelElement { | |||
} | |||
/** | |||
* Given a fully qualified target name, this method simply returns the | |||
* fully qualified name of the project | |||
* Validate that this build element is configured correctly | |||
* | |||
* @param globalName The name of this project in the reference name | |||
* space | |||
* @exception ModelException if the element is invalid | |||
*/ | |||
protected void validate(String globalName) throws ModelException { | |||
Set keys = referencedProjects.keySet(); | |||
for (Iterator i = keys.iterator(); i.hasNext(); ) { | |||
String refName = (String)i.next(); | |||
Project referencedProject | |||
= (Project)referencedProjects.get(refName); | |||
String refGlobalName = refName; | |||
if (globalName != null) { | |||
refGlobalName = globalName + REF_DELIMITER + refName; | |||
} | |||
referencedProject.validate(refGlobalName); | |||
} | |||
// we now check whether all of dependencies for our targets | |||
// exist in the model | |||
// visited contains the targets we have already visited and verified | |||
Set visited = new HashSet(); | |||
// checker records the targets we are currently visiting | |||
CircularDependencyChecker checker | |||
= new CircularDependencyChecker("checking target dependencies"); | |||
// dependency order is purely recorded for debug purposes | |||
List dependencyOrder = new ArrayList(); | |||
for (Iterator i = getTargets(); i.hasNext(); ) { | |||
Target target = (Target)i.next(); | |||
target.validate(); | |||
fillinDependencyOrder(globalName, target, dependencyOrder, | |||
visited, checker); | |||
} | |||
} | |||
/** | |||
* Given a fully qualified target name, this method returns the fully | |||
* qualified name of the project | |||
* | |||
* @param fullTargetName the full qualified target name | |||
* @return the full name of the containing project |
@@ -51,7 +51,7 @@ | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.model; | |||
package org.apache.ant.common.model; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; |
@@ -52,6 +52,10 @@ | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.common.service; | |||
import java.io.File; | |||
import java.util.List; | |||
import java.util.Map; | |||
import org.apache.ant.common.model.Project; | |||
import org.apache.ant.common.util.ExecutionException; | |||
/** | |||
@@ -80,5 +84,37 @@ public interface ComponentService { | |||
*/ | |||
void loadLib(String libLocation, boolean importAll) | |||
throws ExecutionException; | |||
/** | |||
* Run a sub-build. | |||
* | |||
* @param antFile the file containing the XML description of the model | |||
* @param targets A list of targets to be run | |||
* @param properties the initiali properties to be used in the build | |||
* @exception ExecutionException if the subbuild cannot be run | |||
*/ | |||
void runBuild(File antFile, Map properties, List targets) | |||
throws ExecutionException; | |||
/** | |||
* Run a sub-build. | |||
* | |||
* @param model the project model to be used for the build | |||
* @param targets A list of targets to be run | |||
* @param properties the initiali properties to be used in the build | |||
* @exception ExecutionException if the subbuild cannot be run | |||
*/ | |||
void runBuild(Project model, Map properties, List targets) | |||
throws ExecutionException; | |||
/** | |||
* Run a sub-build using the current frame's project model | |||
* | |||
* @param targets A list of targets to be run | |||
* @param properties the initiali properties to be used in the build | |||
* @exception ExecutionException if the subbuild cannot be run | |||
*/ | |||
void callTarget(Map properties, List targets) | |||
throws ExecutionException; | |||
} | |||
@@ -133,9 +133,10 @@ public interface DataService { | |||
* is an expensive operation since it must clone all of the property | |||
* stores in all frames | |||
* | |||
* @return a Map containing the frames properties indexed by their full name. | |||
* @return a Map containing the frames properties indexed by their full | |||
* name. | |||
*/ | |||
Map getAllProperties(); | |||
Map getAllProperties(); | |||
} | |||
@@ -105,7 +105,7 @@ public abstract class AntException extends Exception { | |||
*/ | |||
public AntException(String msg, Throwable cause, Location location) { | |||
this(msg, cause); | |||
setLocation(location); | |||
setLocation(location, true); | |||
} | |||
/** | |||
@@ -127,7 +127,7 @@ public abstract class AntException extends Exception { | |||
*/ | |||
public AntException(String msg, Location location) { | |||
super(msg); | |||
setLocation(location); | |||
setLocation(location, true); | |||
} | |||
/** | |||
@@ -139,19 +139,22 @@ public abstract class AntException extends Exception { | |||
*/ | |||
public AntException(Throwable cause, Location location) { | |||
this(cause); | |||
setLocation(location); | |||
setLocation(location, true); | |||
} | |||
/** | |||
* Sets the file location where the error occured. | |||
* | |||
* @param location the new location value | |||
* @param newLocation the new location value | |||
* @param override true if the location should override any currently set location | |||
*/ | |||
public void setLocation(Location location) { | |||
if (location == null) { | |||
this.location = Location.UNKNOWN_LOCATION; | |||
} else { | |||
this.location = location; | |||
public void setLocation(Location newLocation, boolean override) { | |||
if (override || location == Location.UNKNOWN_LOCATION) { | |||
if (newLocation == null) { | |||
this.location = Location.UNKNOWN_LOCATION; | |||
} else { | |||
this.location = newLocation; | |||
} | |||
} | |||
} | |||
@@ -51,7 +51,7 @@ | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.util; | |||
package org.apache.ant.common.util; | |||
import java.util.Stack; | |||
/** |
@@ -51,10 +51,7 @@ | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.util; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.ant.common.util.Location; | |||
package org.apache.ant.common.util; | |||
/** | |||
* A CircularDependencyException indicates that a circular dependency has |
@@ -51,10 +51,7 @@ | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.util; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.ant.common.util.Location; | |||
package org.apache.ant.common.util; | |||
/** | |||
* A ConfigException indicates a problem with Ant's configuration or the |
@@ -0,0 +1,140 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2001 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.common.util; | |||
import java.io.PrintWriter; | |||
import java.io.StringWriter; | |||
import java.util.List; | |||
import java.util.ArrayList; | |||
/** | |||
* A set of helper methods related to string manipulation. | |||
* | |||
* @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||
*/ | |||
public final class StringUtils { | |||
/** the line separator for this OS */ | |||
public final static String LINE_SEP = System.getProperty("line.separator"); | |||
/** | |||
* Convenient method to retrieve the full stacktrace from a given | |||
* exception. | |||
* | |||
* @param t the exception to get the stacktrace from. | |||
* @return the stacktrace from the given exception. | |||
*/ | |||
public static String getStackTrace(Throwable t) { | |||
StringWriter sw = new StringWriter(); | |||
PrintWriter pw = new PrintWriter(sw, true); | |||
t.printStackTrace(pw); | |||
pw.flush(); | |||
pw.close(); | |||
return sw.toString(); | |||
} | |||
/** | |||
* Splits up a string into a list of lines. It is equivalent to <tt> | |||
* split(data, '\n')</tt> . | |||
* | |||
* @param data the string to split up into lines. | |||
* @return the list of lines available in the string. | |||
*/ | |||
public static List lineSplit(String data) { | |||
return split(data, '\n'); | |||
} | |||
/** | |||
* Splits up a string where elements are separated by a specific | |||
* character and return all elements. | |||
* | |||
* @param data the string to split up. | |||
* @param ch the separator character. | |||
* @return the list of elements. | |||
*/ | |||
public static List split(String data, int ch) { | |||
List elems = new ArrayList(); | |||
int pos = -1; | |||
int i = 0; | |||
while ((pos = data.indexOf(ch, i)) != -1) { | |||
String elem = data.substring(i, pos); | |||
elems.add(elem); | |||
i = pos + 1; | |||
} | |||
elems.add(data.substring(i)); | |||
return elems; | |||
} | |||
/** | |||
* Replace occurrences into a string. | |||
* | |||
* @param data the string to replace occurrences into | |||
* @param from the occurrence to replace. | |||
* @param to the occurrence to be used as a replacement. | |||
* @return the new string with replaced occurrences. | |||
*/ | |||
public static String replace(String data, String from, String to) { | |||
StringBuffer buf = new StringBuffer(data.length()); | |||
int pos = -1; | |||
int i = 0; | |||
while ((pos = data.indexOf(from, i)) != -1) { | |||
buf.append(data.substring(i, pos)).append(to); | |||
i = pos + from.length(); | |||
} | |||
buf.append(data.substring(i)); | |||
return buf.toString(); | |||
} | |||
} | |||