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