git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271213 13f79535-47bb-0310-9956-ffa450edef68master
@@ -29,9 +29,9 @@ | |||||
<exclude name="org/apache/tools/ant/taskdefs/optional/sound/*.java"/> | <exclude name="org/apache/tools/ant/taskdefs/optional/sound/*.java"/> | ||||
<exclude name="org/apache/tools/ant/taskdefs/optional/Native2Ascii.java"/> | <exclude name="org/apache/tools/ant/taskdefs/optional/Native2Ascii.java"/> | ||||
<exclude name="org/apache/tools/ant/taskdefs/optional/Javah.java"/> | <exclude name="org/apache/tools/ant/taskdefs/optional/Javah.java"/> | ||||
<exclude name="org/apache/tools/ant/taskdefs/Typedef.java"/> | |||||
<exclude name="org/apache/tools/ant/taskdefs/Taskdef.java"/> | |||||
<exclude name="org/apache/tools/ant/taskdefs/Definer.java"/> | |||||
<!-- <exclude name="org/apache/tools/ant/taskdefs/Typedef.java"/> --> | |||||
<!-- <exclude name="org/apache/tools/ant/taskdefs/Taskdef.java"/> --> | |||||
<!-- <exclude name="org/apache/tools/ant/taskdefs/Definer.java"/> --> | |||||
<exclude name="org/apache/tools/ant/taskdefs/Parallel.java"/> | <exclude name="org/apache/tools/ant/taskdefs/Parallel.java"/> | ||||
<exclude name="org/apache/tools/ant/taskdefs/Sequential.java"/> | <exclude name="org/apache/tools/ant/taskdefs/Sequential.java"/> | ||||
<exclude name="org/apache/tools/ant/taskdefs/optional/ejb/**/*.java"/> | <exclude name="org/apache/tools/ant/taskdefs/optional/ejb/**/*.java"/> | ||||
@@ -61,6 +61,9 @@ | |||||
<include name="org/apache/tools/ant/FileScanner.java"/> | <include name="org/apache/tools/ant/FileScanner.java"/> | ||||
<include name="org/apache/tools/ant/TaskAdapter.java"/> | <include name="org/apache/tools/ant/TaskAdapter.java"/> | ||||
<include name="org/apache/tools/ant/Location.java"/> | <include name="org/apache/tools/ant/Location.java"/> | ||||
<include name="org/apache/tools/ant/AntClassLoader.java"/> | |||||
<include name="org/apache/tools/ant/BuildEvent.java"/> | |||||
<include name="org/apache/tools/ant/BuildListener.java"/> | |||||
<patternset refid="deprecated"/> | <patternset refid="deprecated"/> | ||||
<patternset refid="toohard"/> | <patternset refid="toohard"/> | ||||
<patternset refid="converted"/> | <patternset refid="converted"/> | ||||
@@ -60,7 +60,7 @@ package org.apache.ant.antcore.antlib; | |||||
* @created 19 January 2002 | * @created 19 January 2002 | ||||
*/ | */ | ||||
public class AntLibDefinition { | public class AntLibDefinition { | ||||
/** The tpye of element being defined int his definition */ | |||||
/** The type of element being defined int his definition */ | |||||
private int definitionType; | private int definitionType; | ||||
/** The default name for the defintion */ | /** The default name for the defintion */ | ||||
private String definitionName; | private String definitionName; | ||||
@@ -55,6 +55,7 @@ package org.apache.ant.antcore.antlib; | |||||
import java.net.URL; | import java.net.URL; | ||||
import java.net.URLClassLoader; | import java.net.URLClassLoader; | ||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.HashMap; | |||||
import java.util.Iterator; | import java.util.Iterator; | ||||
import java.util.List; | import java.util.List; | ||||
import java.util.Map; | import java.util.Map; | ||||
@@ -68,10 +69,13 @@ import org.apache.ant.common.util.ExecutionException; | |||||
* @created 14 January 2002 | * @created 14 January 2002 | ||||
*/ | */ | ||||
public class AntLibrary { | public class AntLibrary { | ||||
/** constant indicating a taskdef definition */ | /** constant indicating a taskdef definition */ | ||||
public final static int TASKDEF = 1; | public final static int TASKDEF = 1; | ||||
/** constant indicating a typedef definition */ | /** constant indicating a typedef definition */ | ||||
public final static int TYPEDEF = 2; | public final static int TYPEDEF = 2; | ||||
/** A counter for generating unique ids */ | |||||
private static int implicitLibCount = 0; | |||||
/** | /** | ||||
* This is the globally unique name of this library. It uses the same | * This is the globally unique name of this library. It uses the same | ||||
@@ -124,6 +128,25 @@ public class AntLibrary { | |||||
this.definitionURL = spec.getLibraryURL(); | this.definitionURL = spec.getLibraryURL(); | ||||
} | } | ||||
/** | |||||
* Create an Ant library to wrap around an existing class | |||||
* | |||||
* @param componentName the name of the component to be wrapped | |||||
* @param componentClass the class to be wrapped | |||||
* @param defType the type of definition being defined | |||||
*/ | |||||
public AntLibrary(int defType, String componentName, Class componentClass) { | |||||
this.libraryId = "_internal" + (implicitLibCount++); | |||||
this.definitions = new HashMap(); | |||||
AntLibDefinition definition = new AntLibDefinition(defType, | |||||
componentName, componentClass.getName()); | |||||
this.definitions.put(componentName, definition); | |||||
this.isolated = false; | |||||
this.factoryClassName = null; | |||||
this.definitionURL = null; | |||||
loader = componentClass.getClassLoader(); | |||||
} | |||||
/** | /** | ||||
* Sets the Library which this library extends | * Sets the Library which this library extends | ||||
* | * | ||||
@@ -198,6 +198,30 @@ public class ComponentManager implements ComponentService { | |||||
runBuild(frame.getProject(), properties, targets); | runBuild(frame.getProject(), properties, targets); | ||||
} | } | ||||
/** | |||||
* Experimental - define a new task | |||||
* | |||||
* @param taskName the name by which this task will be referred | |||||
* @param taskClass the class of the task | |||||
* @exception ExecutionException if the task cannot be defined | |||||
*/ | |||||
public void taskdef(String taskName, Class taskClass) | |||||
throws ExecutionException { | |||||
defineComponent(AntLibrary.TASKDEF, taskName, taskClass); | |||||
} | |||||
/** | |||||
* Experimental - define a new type | |||||
* | |||||
* @param typeName the name by which this type will be referred | |||||
* @param typeClass the class of the type | |||||
* @exception ExecutionException if the type cannot be defined | |||||
*/ | |||||
public void typedef(String typeName, Class typeClass) | |||||
throws ExecutionException { | |||||
defineComponent(AntLibrary.TYPEDEF, typeName, typeClass); | |||||
} | |||||
/** | /** | ||||
* Set the standard libraries (i.e. those which are independent of the | * Set the standard libraries (i.e. those which are independent of the | ||||
* build files) to be used in this component manager | * build files) to be used in this component manager | ||||
@@ -295,6 +319,24 @@ public class ComponentManager implements ComponentService { | |||||
addLibraryConverters(library); | addLibraryConverters(library); | ||||
} | } | ||||
/** | |||||
* Experimental - define a new component | |||||
* | |||||
* @param componentName the name this component will take | |||||
* @param componentClass the component's class | |||||
* @param defType the type of component being defined | |||||
* @exception ExecutionException if the component cannot be defined | |||||
*/ | |||||
private void defineComponent(int defType, String componentName, | |||||
Class componentClass) | |||||
throws ExecutionException { | |||||
AntLibrary wrapperLibrary | |||||
= new AntLibrary(defType, componentName, componentClass); | |||||
String libraryId = wrapperLibrary.getLibraryId(); | |||||
antLibraries.put(libraryId, wrapperLibrary); | |||||
importLibrary(libraryId); | |||||
} | |||||
/** | /** | ||||
* Add the converters from the given library to those managed by this | * Add the converters from the given library to those managed by this | ||||
* frame. | * frame. | ||||
@@ -51,15 +51,50 @@ | |||||
* information on the Apache Software Foundation, please see | * information on the Apache Software Foundation, please see | ||||
* <http://www.apache.org/>. | * <http://www.apache.org/>. | ||||
*/ | */ | ||||
package org.apache.tools.ant; | |||||
package org.apache.ant.antcore.execution; | |||||
import org.apache.ant.common.event.BuildListener; | |||||
import org.apache.ant.common.service.EventService; | |||||
import org.apache.ant.common.util.ExecutionException; | |||||
/** | /** | ||||
* BuildListener facade | |||||
* Core implementation of the event service | |||||
* | * | ||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | ||||
* @created 31 January 2002 | |||||
* @created 7 February 2002 | |||||
*/ | */ | ||||
public interface BuildListener | |||||
extends org.apache.ant.common.event.BuildListener { | |||||
public class CoreEventService implements EventService { | |||||
/** The ExecutionFrame this service instance is working for */ | |||||
private ExecutionFrame frame; | |||||
/** | |||||
* Constructor | |||||
* | |||||
* @param frame the frame for which this instance is providing service | |||||
*/ | |||||
public CoreEventService(ExecutionFrame frame) { | |||||
this.frame = frame; | |||||
} | |||||
/** | |||||
* Add a build listener to the current frame | |||||
* | |||||
* @param listener the lister which will receive build events | |||||
* @exception ExecutionException if the listener cannot be added | |||||
*/ | |||||
public void addBuildListener(BuildListener listener) | |||||
throws ExecutionException { | |||||
frame.addBuildListener(listener); | |||||
} | |||||
/** | |||||
* Remove a listener from the current frame | |||||
* | |||||
* @param listener the listener to be removed | |||||
* @exception ExecutionException if the listener could not be removed | |||||
*/ | |||||
public void removeBuildListener(BuildListener listener) | |||||
throws ExecutionException { | |||||
frame.removeBuildListener(listener); | |||||
} | |||||
} | } | ||||
@@ -72,6 +72,7 @@ import org.apache.ant.common.model.Target; | |||||
import org.apache.ant.common.service.ComponentService; | import org.apache.ant.common.service.ComponentService; | ||||
import org.apache.ant.common.service.DataService; | import org.apache.ant.common.service.DataService; | ||||
import org.apache.ant.common.service.FileService; | import org.apache.ant.common.service.FileService; | ||||
import org.apache.ant.common.service.EventService; | |||||
import org.apache.ant.common.service.MagicProperties; | import org.apache.ant.common.service.MagicProperties; | ||||
import org.apache.ant.common.util.AntException; | import org.apache.ant.common.util.AntException; | ||||
import org.apache.ant.common.util.ConfigException; | import org.apache.ant.common.util.ConfigException; | ||||
@@ -764,6 +765,7 @@ public class ExecutionFrame { | |||||
services.put(FileService.class, fileService); | services.put(FileService.class, fileService); | ||||
services.put(ComponentService.class, componentManager); | services.put(ComponentService.class, componentManager); | ||||
services.put(DataService.class, dataService); | services.put(DataService.class, dataService); | ||||
services.put(EventService.class, new CoreEventService(this)); | |||||
} | } | ||||
/** | /** | ||||
@@ -56,6 +56,7 @@ import org.apache.ant.common.antlib.AntContext; | |||||
import org.apache.ant.common.antlib.Converter; | import org.apache.ant.common.antlib.Converter; | ||||
import org.apache.ant.common.antlib.StandardLibFactory; | import org.apache.ant.common.antlib.StandardLibFactory; | ||||
import org.apache.ant.common.util.ExecutionException; | import org.apache.ant.common.util.ExecutionException; | ||||
import org.apache.ant.common.service.EventService; | |||||
import org.apache.ant.init.LoaderUtils; | import org.apache.ant.init.LoaderUtils; | ||||
/** | /** | ||||
@@ -89,6 +90,10 @@ public class Ant1Factory extends StandardLibFactory { | |||||
project = new Project(); | project = new Project(); | ||||
project.init(context); | project.init(context); | ||||
EventService eventService = | |||||
(EventService)context.getCoreService(EventService.class); | |||||
eventService.addBuildListener(project); | |||||
} | } | ||||
@@ -1,329 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||||
* reserved. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in | |||||
* the documentation and/or other materials provided with the | |||||
* distribution. | |||||
* | |||||
* 3. The end-user documentation included with the redistribution, if | |||||
* any, must include the following acknowlegement: | |||||
* "This product includes software developed by the | |||||
* Apache Software Foundation (http://www.apache.org/)." | |||||
* Alternately, this acknowlegement may appear in the software itself, | |||||
* if and wherever such third-party acknowlegements normally appear. | |||||
* | |||||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
* Foundation" must not be used to endorse or promote products derived | |||||
* from this software without prior written permission. For written | |||||
* permission, please contact apache@apache.org. | |||||
* | |||||
* 5. Products derived from this software may not be called "Apache" | |||||
* nor may "Apache" appear in their names without prior written | |||||
* permission of the Apache Group. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
* SUCH DAMAGE. | |||||
* ==================================================================== | |||||
* | |||||
* This software consists of voluntary contributions made by many | |||||
* individuals on behalf of the Apache Software Foundation. For more | |||||
* information on the Apache Software Foundation, please see | |||||
* <http://www.apache.org/>. | |||||
*/ | |||||
package org.apache.tools.ant; | |||||
import java.io.File; | |||||
import java.net.MalformedURLException; | |||||
import java.net.URL; | |||||
import java.net.URLClassLoader; | |||||
import org.apache.ant.common.event.BuildEvent; | |||||
import org.apache.ant.init.InitUtils; | |||||
import org.apache.tools.ant.types.Path; | |||||
/** | |||||
* AntClassLoader facade | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 2 February 2002 | |||||
*/ | |||||
public class AntClassLoader extends URLClassLoader | |||||
implements BuildListener { | |||||
/** | |||||
* The context loader saved when setting the thread's current context | |||||
* loader. | |||||
*/ | |||||
private ClassLoader savedContextLoader = null; | |||||
/** | |||||
* Flag which indicates if this loader is currently set as the thread's | |||||
* context loader | |||||
*/ | |||||
private boolean isContextLoaderSaved = false; | |||||
/** | |||||
* indicates this loader should load classes by delegating to the parent | |||||
* loader first | |||||
*/ | |||||
private boolean parentFirst = true; | |||||
/** label used in debugging messages */ | |||||
private String debugLabel = null; | |||||
/** flag to indicate of debugging is turned on */ | |||||
private boolean debug = false; | |||||
/** | |||||
* Create an AntClassLoader | |||||
* | |||||
* @param project Project instance this loader is associated with | |||||
* @param classpath the classpath to use in searching for classes | |||||
*/ | |||||
public AntClassLoader(Project project, Path classpath) { | |||||
super(new URL[0]); | |||||
addPath(classpath); | |||||
} | |||||
/** | |||||
* Constructor for the AntClassLoader object | |||||
* | |||||
* @param project Project instance this loader is associated with | |||||
* @param classpath the classpath to use in searching for classes | |||||
* @param parentFirst true if this loader should delagate to its parent | |||||
* loader | |||||
*/ | |||||
public AntClassLoader(Project project, Path classpath, | |||||
boolean parentFirst) { | |||||
this(project, classpath); | |||||
this.parentFirst = parentFirst; | |||||
} | |||||
/** | |||||
* Constructor for the AntClassLoader object | |||||
* | |||||
* @param parent the parent classloader | |||||
* @param project Project instance this loader is associated with | |||||
* @param classpath the classpath to use in searching for classes | |||||
* @param parentFirst true if this loader should delagate to its parent | |||||
* loader | |||||
*/ | |||||
public AntClassLoader(ClassLoader parent, Project project, Path classpath, | |||||
boolean parentFirst) { | |||||
super(new URL[0], parent); | |||||
addPath(classpath); | |||||
this.parentFirst = parentFirst; | |||||
} | |||||
/** | |||||
* Initialize the given class | |||||
* | |||||
* @param theClass the class to be initialised | |||||
*/ | |||||
public static void initializeClass(Class theClass) { | |||||
// do nothing in Ant2 | |||||
} | |||||
/** | |||||
* Set this classloader to operate in isolated mode | |||||
* | |||||
* @param isolated true if this loader should isolate it from other | |||||
* classes in the VM | |||||
*/ | |||||
public void setIsolated(boolean isolated) { | |||||
} | |||||
/** | |||||
* Set the current thread's context loader to this classloader, storing | |||||
* the current loader value for later resetting | |||||
*/ | |||||
public void setThreadContextLoader() { | |||||
if (isContextLoaderSaved) { | |||||
throw new BuildException("Context loader has not been reset"); | |||||
} | |||||
Thread currentThread = Thread.currentThread(); | |||||
savedContextLoader = currentThread.getContextClassLoader(); | |||||
currentThread.setContextClassLoader(this); | |||||
isContextLoaderSaved = true; | |||||
} | |||||
/** | |||||
* sets this loader to debug mode | |||||
* | |||||
* @param debug true if loads should be debugged | |||||
*/ | |||||
public void setDebug(boolean debug) { | |||||
this.debug = debug; | |||||
dumpURLs(); | |||||
} | |||||
/** | |||||
* Sets the debugLabel of the AntClassLoader | |||||
* | |||||
* @param debugLabel the label to use in debug statements | |||||
*/ | |||||
public void setDebugLabel(String debugLabel) { | |||||
this.debugLabel = debugLabel; | |||||
} | |||||
/** Cleanup this loader */ | |||||
public void cleanup() { | |||||
} | |||||
/** | |||||
* Force a class to be loaded by this loader | |||||
* | |||||
* @param classname the name of the class to be loaded | |||||
* @return an instance of the requested class | |||||
* @exception ClassNotFoundException if the class cannot be found | |||||
*/ | |||||
public Class forceLoadClass(String classname) | |||||
throws ClassNotFoundException { | |||||
return super.loadClass(classname); | |||||
} | |||||
/** Reset the thread's class loader to its original value */ | |||||
public void resetThreadContextLoader() { | |||||
if (!isContextLoaderSaved) { | |||||
throw new BuildException("Context loader is not currently set"); | |||||
} | |||||
Thread currentThread = Thread.currentThread(); | |||||
currentThread.setContextClassLoader(savedContextLoader); | |||||
isContextLoaderSaved = false; | |||||
} | |||||
/** | |||||
* 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 | |||||
*/ | |||||
private void addPath(Path path) { | |||||
try { | |||||
String[] pathElements = path.list(); | |||||
for (int i = 0; i < pathElements.length; ++i) { | |||||
File elementFile = new File(pathElements[i]); | |||||
URL elementURL = InitUtils.getFileURL(elementFile); | |||||
addURL(elementURL); | |||||
} | |||||
} catch (MalformedURLException e) { | |||||
throw new BuildException(e); | |||||
} | |||||
} | |||||
/** Dump the URLs being used for this loader */ | |||||
private void dumpURLs() { | |||||
if (debug && debugLabel != null) { | |||||
System.out.println(debugLabel + ": loader URLs"); | |||||
URL[] urls = getURLs(); | |||||
for (int i = 0; i < urls.length; ++i) { | |||||
System.out.println(debugLabel + ": URL: " + urls[i]); | |||||
} | |||||
} | |||||
} | |||||
/* | |||||
protected Class loadClass(String name, boolean resolve) | |||||
throws ClassNotFoundException { | |||||
if (debug && debugLabel != null) { | |||||
System.out.println(debugLabel + ": Trying to load class " + name); | |||||
} | |||||
Class c = findLoadedClass(name); | |||||
if (c == null) { | |||||
try { | |||||
c = findClass(name); | |||||
if (debug && debugLabel != null) { | |||||
System.out.println(debugLabel + ": Found class " | |||||
+ name + " in this loader"); | |||||
} | |||||
} catch (ClassNotFoundException e) { | |||||
c = super.loadClass(name, resolve); | |||||
if (debug && debugLabel != null) { | |||||
System.out.println(debugLabel + ": Found class " | |||||
+ name + " in parent loader"); | |||||
} | |||||
return c; | |||||
} | |||||
} | |||||
if (resolve) { | |||||
resolveClass(c); | |||||
} | |||||
return c; | |||||
} | |||||
*/ | |||||
} | |||||
@@ -60,7 +60,10 @@ import java.util.Hashtable; | |||||
import java.util.Iterator; | import java.util.Iterator; | ||||
import java.util.Map; | import java.util.Map; | ||||
import java.util.Properties; | import java.util.Properties; | ||||
import java.util.Stack; | |||||
import java.util.Vector; | |||||
import org.apache.ant.common.antlib.AntContext; | import org.apache.ant.common.antlib.AntContext; | ||||
import org.apache.ant.common.service.ComponentService; | |||||
import org.apache.ant.common.service.DataService; | import org.apache.ant.common.service.DataService; | ||||
import org.apache.ant.common.service.FileService; | import org.apache.ant.common.service.FileService; | ||||
import org.apache.ant.common.util.ExecutionException; | import org.apache.ant.common.util.ExecutionException; | ||||
@@ -76,7 +79,7 @@ import org.apache.tools.ant.util.FileUtils; | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | ||||
* @created 30 January 2002 | * @created 30 January 2002 | ||||
*/ | */ | ||||
public class Project { | |||||
public class Project implements org.apache.ant.common.event.BuildListener { | |||||
/** String which indicates Java version 1.0 */ | /** String which indicates Java version 1.0 */ | ||||
public final static String JAVA_1_0 = "1.0"; | public final static String JAVA_1_0 = "1.0"; | ||||
@@ -133,12 +136,21 @@ public class Project { | |||||
/** The core's DataService instance */ | /** The core's DataService instance */ | ||||
private DataService dataService; | private DataService dataService; | ||||
/** Ant1 FileUtils instance fro manipulating files */ | |||||
/** The core's Component Service instance */ | |||||
private ComponentService componentService; | |||||
/** Ant1 FileUtils instance for manipulating files */ | |||||
private FileUtils fileUtils; | private FileUtils fileUtils; | ||||
/** The collection of global filters */ | /** The collection of global filters */ | ||||
private FilterSetCollection globalFilters | private FilterSetCollection globalFilters | ||||
= new FilterSetCollection(globalFilterSet); | = new FilterSetCollection(globalFilterSet); | ||||
/** This project's listeners */ | |||||
private Vector listeners = new Vector(); | |||||
/** the target's we have seen */ | |||||
private Stack targetStack = new Stack(); | |||||
static { | static { | ||||
// Determine the Java version by looking at available classes | // Determine the Java version by looking at available classes | ||||
@@ -272,6 +284,15 @@ public class Project { | |||||
} | } | ||||
} | } | ||||
/** | |||||
* Gets the buildListeners of the Project | |||||
* | |||||
* @return A Vector of BuildListener instances | |||||
*/ | |||||
public Vector getBuildListeners() { | |||||
return listeners; | |||||
} | |||||
/** | /** | ||||
* Gets the AntContext of the Project | * Gets the AntContext of the Project | ||||
* | * | ||||
@@ -409,6 +430,91 @@ public class Project { | |||||
return result; | return result; | ||||
} | } | ||||
/** | |||||
* build started event | |||||
* | |||||
* @param event build started event | |||||
*/ | |||||
public void buildStarted(org.apache.ant.common.event.BuildEvent event) { | |||||
fireBuildStarted(); | |||||
} | |||||
/** | |||||
* build finished event | |||||
* | |||||
* @param event build finished event | |||||
*/ | |||||
public void buildFinished(org.apache.ant.common.event.BuildEvent event) { | |||||
fireBuildFinished(event.getCause()); | |||||
} | |||||
/** | |||||
* target started event. | |||||
* | |||||
* @param event target started event. | |||||
*/ | |||||
public void targetStarted(org.apache.ant.common.event.BuildEvent event) { | |||||
Target newTarget = new Target(this); | |||||
org.apache.ant.common.model.Target realTarget = | |||||
(org.apache.ant.common.model.Target)event.getModelElement(); | |||||
newTarget.setName(realTarget.getName()); | |||||
targetStack.push(newTarget); | |||||
fireTargetStarted(newTarget); | |||||
} | |||||
/** | |||||
* target finished event | |||||
* | |||||
* @param event target finished event | |||||
*/ | |||||
public void targetFinished(org.apache.ant.common.event.BuildEvent event) { | |||||
Target currentTarget = (Target)targetStack.pop(); | |||||
fireTargetFinished(currentTarget, event.getCause()); | |||||
currentTarget = null; | |||||
} | |||||
/** | |||||
* task started event | |||||
* | |||||
* @param event task started event | |||||
*/ | |||||
public void taskStarted(org.apache.ant.common.event.BuildEvent event) { | |||||
} | |||||
/** | |||||
* task finished event | |||||
* | |||||
* @param event task finished event | |||||
*/ | |||||
public void taskFinished(org.apache.ant.common.event.BuildEvent event) { | |||||
} | |||||
/** | |||||
* message logged event | |||||
* | |||||
* @param event message logged event | |||||
*/ | |||||
public void messageLogged(org.apache.ant.common.event.BuildEvent event) { | |||||
} | |||||
/** | |||||
* add a build listener to this project | |||||
* | |||||
* @param listener the listener to be added to the project | |||||
*/ | |||||
public void addBuildListener(BuildListener listener) { | |||||
listeners.addElement(listener); | |||||
} | |||||
/** | |||||
* remove a build listener from this project | |||||
* | |||||
* @param listener the listener to be removed | |||||
*/ | |||||
public void removeBuildListener(BuildListener listener) { | |||||
listeners.removeElement(listener); | |||||
} | |||||
/** | /** | ||||
* Add a reference to an object. NOte that in Ant2 objects and | * Add a reference to an object. NOte that in Ant2 objects and | ||||
* properties occupy the same namespace. | * properties occupy the same namespace. | ||||
@@ -577,6 +683,8 @@ public class Project { | |||||
this.context = context; | this.context = context; | ||||
fileService = (FileService)context.getCoreService(FileService.class); | fileService = (FileService)context.getCoreService(FileService.class); | ||||
dataService = (DataService)context.getCoreService(DataService.class); | dataService = (DataService)context.getCoreService(DataService.class); | ||||
componentService | |||||
= (ComponentService)context.getCoreService(ComponentService.class); | |||||
String defs = "/org/apache/tools/ant/taskdefs/defaults.properties"; | String defs = "/org/apache/tools/ant/taskdefs/defaults.properties"; | ||||
@@ -701,12 +809,35 @@ public class Project { | |||||
} | } | ||||
/** | /** | ||||
* add a build listener to this project | |||||
* define a new task | |||||
* | * | ||||
* @param listener the listener to be added to the project | |||||
* @param taskName the anme of the task in build files | |||||
* @param taskClass the class that implements the task | |||||
* @exception BuildException if the task cannot be defined | |||||
*/ | */ | ||||
public void addBuildListener(BuildListener listener) { | |||||
// XXX do nothing for now | |||||
public void addTaskDefinition(String taskName, Class taskClass) | |||||
throws BuildException { | |||||
try { | |||||
componentService.taskdef(taskName, taskClass); | |||||
taskClassDefinitions.put(taskName, taskClass); | |||||
} catch (ExecutionException e) { | |||||
throw new BuildException(e); | |||||
} | |||||
} | |||||
/** | |||||
* Add a new type definition | |||||
* | |||||
* @param typeName the name of the type | |||||
* @param typeClass the class which implements the type | |||||
*/ | |||||
public void addDataTypeDefinition(String typeName, Class typeClass) { | |||||
try { | |||||
componentService.typedef(typeName, typeClass); | |||||
dataClassDefinitions.put(typeName, typeClass); | |||||
} catch (ExecutionException e) { | |||||
throw new BuildException(e); | |||||
} | |||||
} | } | ||||
/** | /** | ||||
@@ -719,12 +850,12 @@ public class Project { | |||||
public Task createTask(String taskType) { | public Task createTask(String taskType) { | ||||
// we piggy back the task onto the current context | // we piggy back the task onto the current context | ||||
Task task = null; | Task task = null; | ||||
Class c = (Class) taskClassDefinitions.get(taskType); | |||||
Class c = (Class)taskClassDefinitions.get(taskType); | |||||
if (c == null) { | if (c == null) { | ||||
return null; | return null; | ||||
} | } | ||||
try { | try { | ||||
task = (Task)c.newInstance(); | task = (Task)c.newInstance(); | ||||
task.setProject(this); | task.setProject(this); | ||||
@@ -734,5 +865,145 @@ public class Project { | |||||
throw new BuildException(e); | throw new BuildException(e); | ||||
} | } | ||||
} | } | ||||
/** send build started event to the listeners */ | |||||
protected void fireBuildStarted() { | |||||
BuildEvent event = new BuildEvent(this); | |||||
for (int i = 0; i < listeners.size(); i++) { | |||||
BuildListener listener = (BuildListener)listeners.elementAt(i); | |||||
listener.buildStarted(event); | |||||
} | |||||
} | |||||
/** | |||||
* send build finished event to the listeners | |||||
* | |||||
* @param exception exception which indicates failure if not null | |||||
*/ | |||||
protected void fireBuildFinished(Throwable exception) { | |||||
BuildEvent event = new BuildEvent(this); | |||||
event.setException(exception); | |||||
for (int i = 0; i < listeners.size(); i++) { | |||||
BuildListener listener = (BuildListener)listeners.elementAt(i); | |||||
listener.buildFinished(event); | |||||
} | |||||
} | |||||
/** | |||||
* send target started event to the listeners | |||||
* | |||||
* @param target the target which has started | |||||
*/ | |||||
protected void fireTargetStarted(Target target) { | |||||
BuildEvent event = new BuildEvent(target); | |||||
for (int i = 0; i < listeners.size(); i++) { | |||||
BuildListener listener = (BuildListener)listeners.elementAt(i); | |||||
listener.targetStarted(event); | |||||
} | |||||
} | |||||
/** | |||||
* send build finished event to the listeners | |||||
* | |||||
* @param exception exception which indicates failure if not null | |||||
* @param target the target which is just finished | |||||
*/ | |||||
protected void fireTargetFinished(Target target, Throwable exception) { | |||||
BuildEvent event = new BuildEvent(target); | |||||
event.setException(exception); | |||||
for (int i = 0; i < listeners.size(); i++) { | |||||
BuildListener listener = (BuildListener)listeners.elementAt(i); | |||||
listener.targetFinished(event); | |||||
} | |||||
} | |||||
/** | |||||
* fire a task started event | |||||
* | |||||
* @param task the task which has started | |||||
*/ | |||||
protected void fireTaskStarted(Task task) { | |||||
// register this as the current task on the current thread. | |||||
// threadTasks.put(Thread.currentThread(), task); | |||||
BuildEvent event = new BuildEvent(task); | |||||
for (int i = 0; i < listeners.size(); i++) { | |||||
BuildListener listener = (BuildListener)listeners.elementAt(i); | |||||
listener.taskStarted(event); | |||||
} | |||||
} | |||||
/** | |||||
* Fire a task finished event | |||||
* | |||||
* @param task the task which has finsihed | |||||
* @param exception the exception associated with the task | |||||
*/ | |||||
protected void fireTaskFinished(Task task, Throwable exception) { | |||||
// threadTasks.remove(Thread.currentThread()); | |||||
//System.out.flush(); | |||||
// System.err.flush(); | |||||
BuildEvent event = new BuildEvent(task); | |||||
event.setException(exception); | |||||
for (int i = 0; i < listeners.size(); i++) { | |||||
BuildListener listener = (BuildListener)listeners.elementAt(i); | |||||
listener.taskFinished(event); | |||||
} | |||||
} | |||||
/** | |||||
* Fire a message event from the project | |||||
* | |||||
* @param project the project sending the event | |||||
* @param message the message | |||||
* @param priority the messsage priority | |||||
*/ | |||||
protected void fireMessageLogged(Project project, String message, | |||||
int priority) { | |||||
BuildEvent event = new BuildEvent(project); | |||||
fireMessageLoggedEvent(event, message, priority); | |||||
} | |||||
/** | |||||
* Fire a message event from the project | |||||
* | |||||
* @param message the message | |||||
* @param priority the messsage priority | |||||
* @param target the target sending the message | |||||
*/ | |||||
protected void fireMessageLogged(Target target, String message, | |||||
int priority) { | |||||
BuildEvent event = new BuildEvent(target); | |||||
fireMessageLoggedEvent(event, message, priority); | |||||
} | |||||
/** | |||||
* Fire a message event from the project | |||||
* | |||||
* @param message the message | |||||
* @param priority the messsage priority | |||||
* @param task the task sending the message | |||||
*/ | |||||
protected void fireMessageLogged(Task task, String message, | |||||
int priority) { | |||||
BuildEvent event = new BuildEvent(task); | |||||
fireMessageLoggedEvent(event, message, priority); | |||||
} | |||||
/** | |||||
* Fire a message event from the project | |||||
* | |||||
* @param message the message | |||||
* @param priority the messsage priority | |||||
* @param event the message event | |||||
*/ | |||||
private void fireMessageLoggedEvent(BuildEvent event, String message, | |||||
int priority) { | |||||
event.setMessage(message, priority); | |||||
for (int i = 0; i < listeners.size(); i++) { | |||||
BuildListener listener = (BuildListener)listeners.elementAt(i); | |||||
listener.messageLogged(event); | |||||
} | |||||
} | |||||
} | } | ||||
@@ -60,5 +60,47 @@ package org.apache.tools.ant; | |||||
* @created 31 January 2002 | * @created 31 January 2002 | ||||
*/ | */ | ||||
public class Target { | public class Target { | ||||
/** The project to which this target belongs */ | |||||
private Project project; | |||||
/** The name of this target */ | |||||
private String name; | |||||
/** | |||||
* Construct a Target that is part of the project | |||||
* | |||||
* @param project the target's project | |||||
*/ | |||||
public Target(Project project) { | |||||
this.project = project; | |||||
} | |||||
/** | |||||
* set the name of the target | |||||
* | |||||
* @param name the new name value | |||||
*/ | |||||
public void setName(String name) { | |||||
this.name = name; | |||||
} | |||||
/** | |||||
* get the project to which this target belongs | |||||
* | |||||
* @return the target's project. | |||||
*/ | |||||
public Project getProject() { | |||||
return project; | |||||
} | |||||
/** | |||||
* Gets the name of the Target | |||||
* | |||||
* @return the target's name | |||||
*/ | |||||
public String getName() { | |||||
return name; | |||||
} | |||||
} | } | ||||
@@ -3,8 +3,6 @@ | |||||
<taskdef name="import" classname="org.apache.ant.antlib.system.Import"/> | <taskdef name="import" classname="org.apache.ant.antlib.system.Import"/> | ||||
<taskdef name="libpath" classname="org.apache.ant.antlib.system.LibPath"/> | <taskdef name="libpath" classname="org.apache.ant.antlib.system.LibPath"/> | ||||
<taskdef name="taskdef" classname="org.apache.ant.antlib.system.TaskDef"/> | |||||
<taskdef name="typedef" classname="org.apache.ant.antlib.system.TypeDef"/> | |||||
<taskdef name="loadlib" classname="org.apache.ant.antlib.system.LoadLib"/> | <taskdef name="loadlib" classname="org.apache.ant.antlib.system.LoadLib"/> | ||||
<taskdef name="ant" classname="org.apache.ant.antlib.system.Ant"/> | <taskdef name="ant" classname="org.apache.ant.antlib.system.Ant"/> | ||||
@@ -116,5 +116,26 @@ public interface ComponentService { | |||||
*/ | */ | ||||
void callTarget(Map properties, List targets) | void callTarget(Map properties, List targets) | ||||
throws ExecutionException; | throws ExecutionException; | ||||
/** | |||||
* Experimental - define a new type | |||||
* | |||||
* @param typeName the name by which this type will be referred | |||||
* @param typeClass the class of the type | |||||
* @exception ExecutionException if the type cannot be defined | |||||
*/ | |||||
void typedef(String typeName, Class typeClass) | |||||
throws ExecutionException; | |||||
/** | |||||
* Experimental - define a new task | |||||
* | |||||
* @param taskName the name by which this task will be referred | |||||
* @param taskClass the class of the task | |||||
* @exception ExecutionException if the task cannot be defined | |||||
*/ | |||||
void taskdef(String taskName, Class taskClass) | |||||
throws ExecutionException; | |||||
} | } | ||||
@@ -51,22 +51,31 @@ | |||||
* information on the Apache Software Foundation, please see | * information on the Apache Software Foundation, please see | ||||
* <http://www.apache.org/>. | * <http://www.apache.org/>. | ||||
*/ | */ | ||||
package org.apache.tools.ant; | |||||
package org.apache.ant.common.service; | |||||
import org.apache.ant.common.event.BuildListener; | |||||
import org.apache.ant.common.util.ExecutionException; | |||||
/** | /** | ||||
* BuildEvent facade | |||||
* Core service to manage receiving of events by components within Ant. | |||||
* | * | ||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | ||||
* @created 31 January 2002 | |||||
* @created 7 February 2002 | |||||
*/ | */ | ||||
public class BuildEvent extends org.apache.ant.common.event.BuildEvent { | |||||
public interface EventService { | |||||
/** | /** | ||||
* Construct a BuildEvent for a task level event | |||||
* Add a build listener to the current frame | |||||
* | * | ||||
* @param task the task that emitted the event. | |||||
* @param listener the lister which will receive build events | |||||
* @exception ExecutionException if the listener cannot be added | |||||
*/ | */ | ||||
public BuildEvent(Task task) { | |||||
super(task.getContext().getModelElement(), MESSAGE); | |||||
} | |||||
void addBuildListener(BuildListener listener) throws ExecutionException; | |||||
/** | |||||
* Remove a listener from the current frame | |||||
* | |||||
* @param listener the listener to be removed | |||||
* @exception ExecutionException if the listener could not be removed | |||||
*/ | |||||
void removeBuildListener(BuildListener listener) throws ExecutionException; | |||||
} | } | ||||