git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271285 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -59,7 +59,7 @@ | |||||
| <include name="org/apache/tools/ant/AntClassLoader.java"/> | <include name="org/apache/tools/ant/AntClassLoader.java"/> | ||||
| <include name="org/apache/tools/ant/BuildEvent.java"/> | <include name="org/apache/tools/ant/BuildEvent.java"/> | ||||
| <include name="org/apache/tools/ant/BuildListener.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"/> | ||||
| </fileset> | </fileset> | ||||
| @@ -38,8 +38,8 @@ | |||||
| <available file="../checkstyle" property="checkstyle.available"/> | <available file="../checkstyle" property="checkstyle.available"/> | ||||
| <mkdir dir="${bin.dir}"/> | <mkdir dir="${bin.dir}"/> | ||||
| <mkdir dir="${distlib.dir}"/> | <mkdir dir="${distlib.dir}"/> | ||||
| <copy todir="${distlib.dir}"> | |||||
| <fileset dir="${lib.dir}"/> | |||||
| <copy todir="${distlib.dir}/parser"> | |||||
| <fileset dir="${lib.dir}/parser"/> | |||||
| </copy> | </copy> | ||||
| </target> | </target> | ||||
| @@ -130,6 +130,7 @@ | |||||
| <antcall target="build-lib" inheritall="false"> | <antcall target="build-lib" inheritall="false"> | ||||
| <param name="libset" value="system"/> | <param name="libset" value="system"/> | ||||
| </antcall> | </antcall> | ||||
| <ant antfile="script.xml" inheritAll="false"/> | |||||
| </target> | </target> | ||||
| <target name="build-lib"> | <target name="build-lib"> | ||||
| @@ -139,10 +140,10 @@ | |||||
| <path refid="classpath.common"/> | <path refid="classpath.common"/> | ||||
| <pathelement location="${distlib.dir}/common/common.jar"/> | <pathelement location="${distlib.dir}/common/common.jar"/> | ||||
| </path> | </path> | ||||
| <depend destdir="${bin.dir}/antlibs/${libset}" srcdir="${java.dir}/antlibs/${libset}/code"> | |||||
| <depend destdir="${bin.dir}/antlibs/${libset}" srcdir="${java.dir}/antlibs/${libset}"> | |||||
| <classpath refid="classpath.antlibs"/> | <classpath refid="classpath.antlibs"/> | ||||
| </depend> | </depend> | ||||
| <javac destdir="${bin.dir}/antlibs/${libset}" srcdir="${java.dir}/antlibs/${libset}/code" debug="${debug}"> | |||||
| <javac destdir="${bin.dir}/antlibs/${libset}" srcdir="${java.dir}/antlibs/${libset}" debug="${debug}"> | |||||
| <classpath refid="classpath.antlibs"/> | <classpath refid="classpath.antlibs"/> | ||||
| </javac> | </javac> | ||||
| <jar basedir="${bin.dir}/antlibs/${libset}" jarfile="${distlib.dir}/antlibs/${libset}.tsk"> | <jar basedir="${bin.dir}/antlibs/${libset}" jarfile="${distlib.dir}/antlibs/${libset}.tsk"> | ||||
| @@ -0,0 +1 @@ | |||||
| Please any jars in here which should be used when building the script antlib | |||||
| @@ -0,0 +1,51 @@ | |||||
| <project default="build" name="Ant2 script tasks"> | |||||
| <property name="src.dir" value="src"/> | |||||
| <property name="lib.dir" value="lib"/> | |||||
| <property name="java.dir" value="${src.dir}/java"/> | |||||
| <property name="bin.dir" value="bin"/> | |||||
| <property name="dist.dir" value="dist"/> | |||||
| <property name="javadocs.dir" value="${dist.dir}/javadocs"/> | |||||
| <property name="distlib.dir" value="${dist.dir}/lib"/> | |||||
| <property name="debug" value="true"/> | |||||
| <property name="ant.package" value="org/apache/tools/ant"/> | |||||
| <property name="optional.package" value="${ant.package}/taskdefs/optional"/> | |||||
| <property name="optional.type.package" value="${ant.package}/types/optional"/> | |||||
| <property name="util.package" value="${ant.package}/util"/> | |||||
| <property name="regexp.package" value="${util.package}/regexp"/> | |||||
| <path id="classpath.script"> | |||||
| <pathelement location="${distlib.dir}/init.jar"/> | |||||
| <fileset dir="${lib.dir}/antlib/script" includes="*.jar"/> | |||||
| <pathelement location="${distlib.dir}/common/common.jar"/> | |||||
| </path> | |||||
| <target name="check_bsf"> | |||||
| <available property="bsf.present" | |||||
| classname="com.ibm.bsf.BSFManager" | |||||
| classpathref="classpath.script" /> | |||||
| </target> | |||||
| <target name="nobsf" unless="bsf.present"> | |||||
| <echo message="You must provide the bsf.jar library in the ${lib.dir}/antlib/script directory"/> | |||||
| </target> | |||||
| <target name="build" depends="check_bsf, nobsf" if="bsf.present"> | |||||
| <mkdir dir="${bin.dir}/antlibs/script"/> | |||||
| <mkdir dir="${distlib.dir}/antlibs"/> | |||||
| <depend destdir="${bin.dir}/antlibs/script" srcdir="${java.dir}/antlibs/script"> | |||||
| <classpath refid="classpath.script"/> | |||||
| </depend> | |||||
| <javac destdir="${bin.dir}/antlibs/script" srcdir="${java.dir}/antlibs/script" debug="${debug}"> | |||||
| <classpath refid="classpath.script"/> | |||||
| </javac> | |||||
| <jar basedir="${bin.dir}/antlibs/script" jarfile="${distlib.dir}/antlibs/script.tsk"> | |||||
| <metainf dir="${java.dir}/antlibs/script" | |||||
| includes="antlib.xml"/> | |||||
| </jar> | |||||
| </target> | |||||
| </project> | |||||
| @@ -149,11 +149,12 @@ public class AntLibManager { | |||||
| * @param librarySpecs the loaded specifications of the Ant libraries | * @param librarySpecs the loaded specifications of the Ant libraries | ||||
| * @param initConfig the Ant initialization configuration | * @param initConfig the Ant initialization configuration | ||||
| * @param libraries the collection of libraries already configured | * @param libraries the collection of libraries already configured | ||||
| * @param libPathsMap a map of lists of library patsh fro each library | |||||
| * @exception ExecutionException if a library cannot be configured from | * @exception ExecutionException if a library cannot be configured from | ||||
| * the given specification | * the given specification | ||||
| */ | */ | ||||
| public void configLibraries(InitConfig initConfig, Map librarySpecs, | public void configLibraries(InitConfig initConfig, Map librarySpecs, | ||||
| Map libraries) | |||||
| Map libraries, Map libPathsMap) | |||||
| throws ExecutionException { | throws ExecutionException { | ||||
| // check if any already defined | // check if any already defined | ||||
| @@ -174,7 +175,7 @@ public class AntLibManager { | |||||
| String libraryId = (String)i.next(); | String libraryId = (String)i.next(); | ||||
| if (!libraries.containsKey(libraryId)) { | if (!libraries.containsKey(libraryId)) { | ||||
| configLibrary(initConfig, librarySpecs, libraryId, | configLibrary(initConfig, librarySpecs, libraryId, | ||||
| configuring, libraries); | |||||
| configuring, libraries, libPathsMap); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -189,7 +190,7 @@ public class AntLibManager { | |||||
| * @exception MalformedURLException if the library's location cannot be | * @exception MalformedURLException if the library's location cannot be | ||||
| * formed | * formed | ||||
| */ | */ | ||||
| public void loadLib(Map librarySpecs, String libLocationString) | |||||
| public void loadLibs(Map librarySpecs, String libLocationString) | |||||
| throws ExecutionException, MalformedURLException { | throws ExecutionException, MalformedURLException { | ||||
| File libLocation = new File(libLocationString); | File libLocation = new File(libLocationString); | ||||
| @@ -212,6 +213,24 @@ public class AntLibManager { | |||||
| } | } | ||||
| } | } | ||||
| /** | |||||
| * add a library path to the given library | |||||
| * | |||||
| * @param antLibrary the library to which the path is to be added | |||||
| * @param path the path to be added | |||||
| * @exception ExecutionException if remote paths are not allowed by | |||||
| * configuration | |||||
| */ | |||||
| public void addLibPath(AntLibrary antLibrary, URL path) | |||||
| throws ExecutionException { | |||||
| if (!path.getProtocol().equals("file") | |||||
| && !remoteAllowed) { | |||||
| throw new ExecutionException("Remote libpaths are not" | |||||
| + " allowed: " + path); | |||||
| } | |||||
| antLibrary.addLibraryURL(path); | |||||
| } | |||||
| /** | /** | ||||
| * Configure a library from a specification and the Ant init config. | * Configure a library from a specification and the Ant init config. | ||||
| * | * | ||||
| @@ -223,12 +242,13 @@ public class AntLibManager { | |||||
| * dependencies. | * dependencies. | ||||
| * @param libraries the collection of libraries which have already been | * @param libraries the collection of libraries which have already been | ||||
| * configured | * configured | ||||
| * @param libPathsMap a map of lists of library patsh fro each library | |||||
| * @exception ExecutionException if the library cannot be configured. | * @exception ExecutionException if the library cannot be configured. | ||||
| */ | */ | ||||
| private void configLibrary(InitConfig initConfig, Map librarySpecs, | private void configLibrary(InitConfig initConfig, Map librarySpecs, | ||||
| String libraryId, | String libraryId, | ||||
| CircularDependencyChecker configuring, | CircularDependencyChecker configuring, | ||||
| Map libraries) | |||||
| Map libraries, Map libPathsMap) | |||||
| throws ExecutionException { | throws ExecutionException { | ||||
| try { | try { | ||||
| @@ -245,7 +265,7 @@ public class AntLibManager { | |||||
| + libraryId + " depends"); | + libraryId + " depends"); | ||||
| } | } | ||||
| configLibrary(initConfig, librarySpecs, extendsId, | configLibrary(initConfig, librarySpecs, extendsId, | ||||
| configuring, libraries); | |||||
| configuring, libraries, libPathsMap); | |||||
| } | } | ||||
| } | } | ||||
| @@ -265,8 +285,8 @@ public class AntLibManager { | |||||
| urlsList.add(initConfig.getToolsJarURL()); | urlsList.add(initConfig.getToolsJarURL()); | ||||
| } | } | ||||
| URL[] parserURLs = initConfig.getParserURLs(); | |||||
| if (librarySpec.usesAntXML()) { | if (librarySpec.usesAntXML()) { | ||||
| URL[] parserURLs = initConfig.getParserURLs(); | |||||
| for (int i = 0; i < parserURLs.length; ++i) { | for (int i = 0; i < parserURLs.length; ++i) { | ||||
| urlsList.add(parserURLs[i]); | urlsList.add(parserURLs[i]); | ||||
| } | } | ||||
| @@ -282,12 +302,22 @@ public class AntLibManager { | |||||
| } | } | ||||
| antLibrary.setParentLoader(initConfig.getCommonLoader()); | antLibrary.setParentLoader(initConfig.getCommonLoader()); | ||||
| libraries.put(libraryId, antLibrary); | libraries.put(libraryId, antLibrary); | ||||
| List libPaths = (List)libPathsMap.get(libraryId); | |||||
| if (libPaths != null) { | |||||
| for (Iterator j = libPaths.iterator(); j.hasNext(); ) { | |||||
| URL pathURL = (URL)j.next(); | |||||
| addLibPath(antLibrary, pathURL); | |||||
| } | |||||
| } | |||||
| configuring.leaveNode(libraryId); | configuring.leaveNode(libraryId); | ||||
| } catch (CircularDependencyException e) { | } catch (CircularDependencyException e) { | ||||
| throw new ExecutionException(e); | throw new ExecutionException(e); | ||||
| } | } | ||||
| } | } | ||||
| /** | /** | ||||
| * Read an Ant library definition from a URL | * Read an Ant library definition from a URL | ||||
| * | * | ||||
| @@ -69,9 +69,6 @@ import org.apache.ant.common.util.ExecutionException; | |||||
| * @created 14 January 2002 | * @created 14 January 2002 | ||||
| */ | */ | ||||
| public class AntLibrary implements ComponentLibrary { | public class AntLibrary implements ComponentLibrary { | ||||
| /** 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 | ||||
| * conventions as the Java package space - i.e. reverse order DNS names | * conventions as the Java package space - i.e. reverse order DNS names | ||||
| @@ -97,7 +97,8 @@ public class DynamicLibrary implements ComponentLibrary { | |||||
| public DynamicLibrary(AntLibFactory factory, ClassLoader loader) { | public DynamicLibrary(AntLibFactory factory, ClassLoader loader) { | ||||
| int dynamicId = 0; | int dynamicId = 0; | ||||
| synchronized (DynamicLibrary.class) { | synchronized (DynamicLibrary.class) { | ||||
| dynamicId = dynamicIdCounter++; | |||||
| dynamicId = dynamicIdCounter; | |||||
| dynamicIdCounter++; | |||||
| } | } | ||||
| this.libraryId = DYNAMIC_LIB_PREFIX + dynamicId; | this.libraryId = DYNAMIC_LIB_PREFIX + dynamicId; | ||||
| this.loader = loader; | this.loader = loader; | ||||
| @@ -142,6 +142,18 @@ public class AntConfig { | |||||
| return libraryPathList; | return libraryPathList; | ||||
| } | } | ||||
| /** | |||||
| * Get the map of library paths. This map contains a collection of List | |||||
| * instances, indexed by the libraryIds. Each list is a set of | |||||
| * additional classpath entries for the given library | |||||
| * | |||||
| * @return the library paths map | |||||
| */ | |||||
| public Map getLibraryPathsMap() { | |||||
| return libPaths; | |||||
| } | |||||
| /** | /** | ||||
| * Gets the libraryIds of the AntConfig | * Gets the libraryIds of the AntConfig | ||||
| * | * | ||||
| @@ -191,13 +191,13 @@ public class BuildEventSupport { | |||||
| /** | /** | ||||
| * Send a message event | * Send a message event | ||||
| * | * | ||||
| * @param element the build element with which the event is associated | |||||
| * @param source the build element with which the event is associated | |||||
| * @param message the message to be sent | * @param message the message to be sent | ||||
| * @param priority the priority of the message | * @param priority the priority of the message | ||||
| */ | */ | ||||
| public void fireMessageLogged(ModelElement element, | |||||
| public void fireMessageLogged(Object source, | |||||
| String message, int priority) { | String message, int priority) { | ||||
| BuildEvent event = new BuildEvent(element, message, priority); | |||||
| BuildEvent event = new BuildEvent(source, message, priority); | |||||
| for (Iterator i = listeners.iterator(); i.hasNext(); ) { | for (Iterator i = listeners.iterator(); i.hasNext(); ) { | ||||
| BuildListener listener = (BuildListener)i.next(); | BuildListener listener = (BuildListener)i.next(); | ||||
| listener.messageLogged(event); | listener.messageLogged(event); | ||||
| @@ -53,9 +53,14 @@ | |||||
| */ | */ | ||||
| package org.apache.ant.antcore.execution; | package org.apache.ant.antcore.execution; | ||||
| import java.net.MalformedURLException; | import java.net.MalformedURLException; | ||||
| import java.net.URL; | |||||
| import java.util.ArrayList; | |||||
| import java.util.HashMap; | import java.util.HashMap; | ||||
| import java.util.HashSet; | |||||
| import java.util.Iterator; | import java.util.Iterator; | ||||
| import java.util.List; | |||||
| import java.util.Map; | import java.util.Map; | ||||
| import java.util.Set; | |||||
| import org.apache.ant.antcore.antlib.AntLibDefinition; | import org.apache.ant.antcore.antlib.AntLibDefinition; | ||||
| import org.apache.ant.antcore.antlib.AntLibManager; | import org.apache.ant.antcore.antlib.AntLibManager; | ||||
| import org.apache.ant.antcore.antlib.AntLibrary; | import org.apache.ant.antcore.antlib.AntLibrary; | ||||
| @@ -64,6 +69,7 @@ import org.apache.ant.antcore.antlib.DynamicLibrary; | |||||
| import org.apache.ant.common.antlib.AntLibFactory; | import org.apache.ant.common.antlib.AntLibFactory; | ||||
| 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.event.MessageLevel; | |||||
| import org.apache.ant.common.service.ComponentService; | import org.apache.ant.common.service.ComponentService; | ||||
| import org.apache.ant.common.util.ExecutionException; | import org.apache.ant.common.util.ExecutionException; | ||||
| @@ -84,6 +90,9 @@ public class ComponentManager implements ComponentService { | |||||
| */ | */ | ||||
| private Map converters = new HashMap(); | private Map converters = new HashMap(); | ||||
| /** This is the set of libraries whose converters have been loaded */ | |||||
| private Set loadedConverters = new HashSet(); | |||||
| /** The factory objects for each library, indexed by the library Id */ | /** The factory objects for each library, indexed by the library Id */ | ||||
| private Map libFactories = new HashMap(); | private Map libFactories = new HashMap(); | ||||
| @@ -105,18 +114,27 @@ public class ComponentManager implements ComponentService { | |||||
| /** The definitions which have been imported into this frame. */ | /** The definitions which have been imported into this frame. */ | ||||
| private Map definitions = new HashMap(); | private Map definitions = new HashMap(); | ||||
| /** | |||||
| * This map stores a list of additional paths for each library indexed | |||||
| * by the libraryId | |||||
| */ | |||||
| private Map libPathsMap; | |||||
| /** | /** | ||||
| * Constructor | * Constructor | ||||
| * | * | ||||
| * @param frame the frame containing this context | * @param frame the frame containing this context | ||||
| * @param allowRemoteLibs true if remote libraries can be loaded though | * @param allowRemoteLibs true if remote libraries can be loaded though | ||||
| * this service. | * this service. | ||||
| * @param configLibPaths the additional library paths specified in the | |||||
| * configuration | |||||
| */ | */ | ||||
| protected ComponentManager(Frame frame, | |||||
| boolean allowRemoteLibs) { | |||||
| protected ComponentManager(Frame frame, boolean allowRemoteLibs, | |||||
| Map configLibPaths) { | |||||
| this.frame = frame; | this.frame = frame; | ||||
| libManager = new AntLibManager(allowRemoteLibs); | libManager = new AntLibManager(allowRemoteLibs); | ||||
| dynamicLibraries = new HashMap(); | dynamicLibraries = new HashMap(); | ||||
| libPathsMap = new HashMap(configLibPaths); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -132,9 +150,9 @@ public class ComponentManager implements ComponentService { | |||||
| throws ExecutionException { | throws ExecutionException { | ||||
| try { | try { | ||||
| Map librarySpecs = new HashMap(); | Map librarySpecs = new HashMap(); | ||||
| libManager.loadLib(librarySpecs, libLocation); | |||||
| libManager.loadLibs(librarySpecs, libLocation); | |||||
| libManager.configLibraries(frame.getInitConfig(), librarySpecs, | libManager.configLibraries(frame.getInitConfig(), librarySpecs, | ||||
| antLibraries); | |||||
| antLibraries, libPathsMap); | |||||
| if (importAll) { | if (importAll) { | ||||
| Iterator i = librarySpecs.keySet().iterator(); | Iterator i = librarySpecs.keySet().iterator(); | ||||
| @@ -183,6 +201,72 @@ public class ComponentManager implements ComponentService { | |||||
| typeName, className); | typeName, className); | ||||
| } | } | ||||
| /** | |||||
| * Add a library path for the given library | |||||
| * | |||||
| * @param libraryId the unique id of the library for which an additional | |||||
| * path is being defined | |||||
| * @param libPath the library path (usually a jar) | |||||
| * @exception ExecutionException if the path cannot be specified | |||||
| */ | |||||
| public void addLibPath(String libraryId, URL libPath) | |||||
| throws ExecutionException { | |||||
| List libPaths = (List)libPathsMap.get(libraryId); | |||||
| if (libPaths == null) { | |||||
| libPaths = new ArrayList(); | |||||
| libPathsMap.put(libraryId, libPaths); | |||||
| } | |||||
| libPaths.add(libPath); | |||||
| // If this library already exists give it the new path now | |||||
| AntLibrary library = (AntLibrary)antLibraries.get(libraryId); | |||||
| if (library != null) { | |||||
| libManager.addLibPath(library, libPath); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Import a complete library into the current execution frame | |||||
| * | |||||
| * @param libraryId The id of the library to be imported | |||||
| * @exception ExecutionException if the library cannot be imported | |||||
| */ | |||||
| public 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"); | |||||
| } | |||||
| for (Iterator i = library.getDefinitionNames(); i.hasNext(); ) { | |||||
| String defName = (String)i.next(); | |||||
| importLibraryDef(library, defName, null); | |||||
| } | |||||
| addLibraryConverters(library); | |||||
| } | |||||
| /** | |||||
| * Import a single component from a library, optionally aliasing it to a | |||||
| * new name | |||||
| * | |||||
| * @param libraryId the unique id of the library from which the | |||||
| * component is being imported | |||||
| * @param defName the name of the component within its library | |||||
| * @param alias the name under which this component will be used in the | |||||
| * build scripts. If this is null, the components default name is | |||||
| * used. | |||||
| * @exception ExecutionException if the component cannot be imported | |||||
| */ | |||||
| public void importComponent(String libraryId, String defName, | |||||
| String alias) throws ExecutionException { | |||||
| AntLibrary library = (AntLibrary)antLibraries.get(libraryId); | |||||
| if (library == null) { | |||||
| throw new ExecutionException("Unable to import component from " | |||||
| + "library \"" + libraryId + "\" as it has not been loaded"); | |||||
| } | |||||
| importLibraryDef(library, defName, alias); | |||||
| addLibraryConverters(library); | |||||
| } | |||||
| /** | /** | ||||
| * 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 | ||||
| @@ -252,25 +336,6 @@ public class ComponentManager implements ComponentService { | |||||
| return (ImportInfo)definitions.get(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"); | |||||
| } | |||||
| for (Iterator i = library.getDefinitionNames(); i.hasNext(); ) { | |||||
| String defName = (String)i.next(); | |||||
| importLibraryDef(library, defName, null); | |||||
| } | |||||
| addLibraryConverters(library); | |||||
| } | |||||
| /** | /** | ||||
| * Import a single component from the given library | * Import a single component from the given library | ||||
| * | * | ||||
| @@ -287,6 +352,9 @@ public class ComponentManager implements ComponentService { | |||||
| } | } | ||||
| AntLibDefinition libDef = library.getDefinition(defName); | AntLibDefinition libDef = library.getDefinition(defName); | ||||
| frame.log("Adding component <" + defName + "> as <" + label | |||||
| + "> from library \"" + library.getLibraryId() + "\", class: " | |||||
| + libDef.getClassName(), MessageLevel.MSG_DEBUG); | |||||
| definitions.put(label, new ImportInfo(library, libDef)); | definitions.put(label, new ImportInfo(library, libDef)); | ||||
| } | } | ||||
| @@ -313,6 +381,7 @@ public class ComponentManager implements ComponentService { | |||||
| importLibraryDef(dynamicLibrary, componentName, null); | importLibraryDef(dynamicLibrary, componentName, null); | ||||
| } | } | ||||
| /** | /** | ||||
| * 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. | ||||
| @@ -323,7 +392,8 @@ public class ComponentManager implements ComponentService { | |||||
| */ | */ | ||||
| private void addLibraryConverters(AntLibrary library) | private void addLibraryConverters(AntLibrary library) | ||||
| throws ExecutionException { | throws ExecutionException { | ||||
| if (!library.hasConverters()) { | |||||
| if (!library.hasConverters() | |||||
| || loadedConverters.contains(library.getLibraryId())) { | |||||
| return; | return; | ||||
| } | } | ||||
| @@ -351,6 +421,7 @@ public class ComponentManager implements ComponentService { | |||||
| converters.put(converterTypes[j], converter); | converters.put(converterTypes[j], converter); | ||||
| } | } | ||||
| } | } | ||||
| loadedConverters.add(library.getLibraryId()); | |||||
| } catch (ClassNotFoundException e) { | } catch (ClassNotFoundException e) { | ||||
| throw new ExecutionException("In Ant library \"" | throw new ExecutionException("In Ant library \"" | ||||
| + library.getLibraryId() + "\" converter class " | + library.getLibraryId() + "\" converter class " | ||||
| @@ -0,0 +1,191 @@ | |||||
| /* | |||||
| * 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.common.antlib.DeferredTask; | |||||
| import org.apache.ant.common.util.ExecutionException; | |||||
| /** | |||||
| * An implementation of the Setter interface for configuring instances of | |||||
| * the DeferredTask interface | |||||
| * | |||||
| * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
| * @created 11 February 2002 | |||||
| */ | |||||
| public class DeferredSetter implements Setter { | |||||
| /** | |||||
| * Set an attribute value on an object | |||||
| * | |||||
| * @param obj the object on which the value is being set | |||||
| * @param attributeName the name of the attribute | |||||
| * @param value the string represenation of the attribute's value | |||||
| * @exception ExecutionException if the object does not support the | |||||
| * attribute or the object has a problem setting the value | |||||
| */ | |||||
| public void setAttribute(Object obj, String attributeName, | |||||
| String value) throws ExecutionException { | |||||
| DeferredTask task = (DeferredTask)obj; | |||||
| task.setAttribute(attributeName, value); | |||||
| } | |||||
| /** | |||||
| * Get the type of the given nested element | |||||
| * | |||||
| * @param elementName the nested element whose type is desired | |||||
| * @return the class instance representing the type of the element adder | |||||
| */ | |||||
| public Class getType(String elementName) { | |||||
| return null; | |||||
| } | |||||
| /** | |||||
| * Adds PCDATA to the element | |||||
| * | |||||
| * @param obj the instance whose content is being provided | |||||
| * @param text the required content | |||||
| * @exception ExecutionException if the object does not support | |||||
| * contentor the object has a problem setting the content | |||||
| */ | |||||
| public void addText(Object obj, String text) | |||||
| throws ExecutionException { | |||||
| DeferredTask task = (DeferredTask)obj; | |||||
| task.addText(text); | |||||
| } | |||||
| /** | |||||
| * Add an element to the given object | |||||
| * | |||||
| * @param obj The object to which the element is being added | |||||
| * @param elementName the name of the element | |||||
| * @param value the object to be added - the nested element | |||||
| * @exception ExecutionException if the object does not support content | |||||
| * or the object has a problem setting the content | |||||
| */ | |||||
| public void addElement(Object obj, String elementName, Object value) | |||||
| throws ExecutionException { | |||||
| DeferredTask task = (DeferredTask)obj; | |||||
| task.addElement(elementName, value); | |||||
| } | |||||
| /** | |||||
| * Create a nested element using the object's element factory method. | |||||
| * | |||||
| * @param container the object in which the nested element is required. | |||||
| * @param elementName the name of the nested element | |||||
| * @return the new instance of the nested element | |||||
| * @exception ExecutionException if the nested element cannot be | |||||
| * created. | |||||
| */ | |||||
| public Object createElement(Object container, String elementName) | |||||
| throws ExecutionException { | |||||
| throw new ExecutionException("Deferred Tasks do not support " | |||||
| + "creation of nested elements"); | |||||
| } | |||||
| /** | |||||
| * Indicate if the class assocated with this reflector supports the | |||||
| * addition of text content. | |||||
| * | |||||
| * @return true if the class supports an addText method | |||||
| */ | |||||
| public boolean supportsText() { | |||||
| return true; | |||||
| } | |||||
| /** | |||||
| * Indicate if the class assocated with this reflector supports the | |||||
| * given attribute | |||||
| * | |||||
| * @param attributeName the name of the attribute | |||||
| * @return true if the given attribute is supported | |||||
| */ | |||||
| public boolean supportsAttribute(String attributeName) { | |||||
| return true; | |||||
| } | |||||
| /** | |||||
| * Determine if the class associated with this reflector supports a | |||||
| * particular nested element via a create factory method | |||||
| * | |||||
| * @param elementName the name of the element | |||||
| * @return true if the class supports creation of that element | |||||
| */ | |||||
| public boolean supportsNestedCreator(String elementName) { | |||||
| return false; | |||||
| } | |||||
| /** | |||||
| * Determine if the class associated with this reflector supports a | |||||
| * particular nested element via an add method | |||||
| * | |||||
| * @param elementName the name of the element | |||||
| * @return true if the class supports addition of that element | |||||
| */ | |||||
| public boolean supportsNestedAdder(String elementName) { | |||||
| return true; | |||||
| } | |||||
| /** | |||||
| * Determine if the class associated with this reflector supports a | |||||
| * particular nested element | |||||
| * | |||||
| * @param elementName the name of the element | |||||
| * @return true if the class supports the given type of nested element | |||||
| */ | |||||
| public boolean supportsNestedElement(String elementName) { | |||||
| return true; | |||||
| } | |||||
| } | |||||
| @@ -137,9 +137,12 @@ public class ExecutionContext implements AntContext { | |||||
| * @param level the priority level of the message | * @param level the priority level of the message | ||||
| */ | */ | ||||
| public void log(String message, int level) { | public void log(String message, int level) { | ||||
| ModelElement source = modelElement; | |||||
| if (modelElement == null) { | |||||
| Object source = modelElement; | |||||
| if (source == null) { | |||||
| source = frame.getProject(); | source = frame.getProject(); | ||||
| if (source == null) { | |||||
| source = frame; | |||||
| } | |||||
| } | } | ||||
| eventSupport.fireMessageLogged(source, message, level); | eventSupport.fireMessageLogged(source, message, level); | ||||
| } | } | ||||
| @@ -59,7 +59,6 @@ import java.util.Iterator; | |||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Map; | import java.util.Map; | ||||
| import org.apache.ant.antcore.antlib.AntLibManager; | 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.config.AntConfig; | ||||
| import org.apache.ant.common.event.BuildListener; | import org.apache.ant.common.event.BuildListener; | ||||
| import org.apache.ant.common.model.Project; | import org.apache.ant.common.model.Project; | ||||
| @@ -70,8 +69,8 @@ import org.apache.ant.init.InitConfig; | |||||
| /** | /** | ||||
| * The ExecutionManager is used to manage the execution of a build. The | * The ExecutionManager is used to manage the execution of a build. The | ||||
| * Execution manager is responsible for loading the Ant task libraries, | * Execution manager is responsible for loading the Ant task libraries, | ||||
| * creating Frames for each project that is part of the build and | |||||
| * then executing the tasks within those Execution Frames. | |||||
| * creating Frames for each project that is part of the build and then | |||||
| * executing the tasks within those Execution Frames. | |||||
| * | * | ||||
| * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | ||||
| * @created 12 January 2002 | * @created 12 January 2002 | ||||
| @@ -112,7 +111,15 @@ public class ExecutionManager { | |||||
| throws ExecutionException { | throws ExecutionException { | ||||
| this.config = config; | this.config = config; | ||||
| this.initConfig = initConfig; | this.initConfig = initConfig; | ||||
| } | |||||
| /** | |||||
| * Initialise the execution manager | |||||
| * | |||||
| * @exception ExecutionException if the standard ant libraries cannot be | |||||
| * loaded | |||||
| */ | |||||
| public void init() throws ExecutionException { | |||||
| Map librarySpecs = new HashMap(10); | Map librarySpecs = new HashMap(10); | ||||
| try { | try { | ||||
| // start by loading the task libraries | // start by loading the task libraries | ||||
| @@ -123,20 +130,19 @@ public class ExecutionManager { | |||||
| = new AntLibManager(config.isRemoteLibAllowed()); | = new AntLibManager(config.isRemoteLibAllowed()); | ||||
| libManager.addAntLibraries(librarySpecs, standardLibsURL); | libManager.addAntLibraries(librarySpecs, standardLibsURL); | ||||
| libManager.configLibraries(initConfig, librarySpecs, antLibraries); | |||||
| libManager.configLibraries(initConfig, librarySpecs, antLibraries, | |||||
| config.getLibraryPathsMap()); | |||||
| librarySpecs.clear(); | librarySpecs.clear(); | ||||
| // add any additional libraries. | // add any additional libraries. | ||||
| for (Iterator i = config.getLibraryLocations(); i.hasNext(); ) { | |||||
| // try file first | |||||
| String libLocation = (String)i.next(); | |||||
| libManager.loadLib(librarySpecs, libLocation); | |||||
| } | |||||
| libManager.configLibraries(initConfig, librarySpecs, antLibraries); | |||||
| addConfigLibPaths(); | |||||
| for (Iterator i = config.getLibraryLocations(); i.hasNext(); ) { | |||||
| // try file first | |||||
| String libLocation = (String)i.next(); | |||||
| libManager.loadLibs(librarySpecs, libLocation); | |||||
| } | |||||
| libManager.configLibraries(initConfig, librarySpecs, antLibraries, | |||||
| config.getLibraryPathsMap()); | |||||
| mainFrame = new Frame(antLibraries, initConfig, config); | |||||
| } catch (MalformedURLException e) { | } catch (MalformedURLException e) { | ||||
| throw new ExecutionException("Unable to load Ant libraries", e); | throw new ExecutionException("Unable to load Ant libraries", e); | ||||
| } | } | ||||
| @@ -156,6 +162,12 @@ public class ExecutionManager { | |||||
| // start by validating the project we have been given. | // start by validating the project we have been given. | ||||
| project.validate(); | project.validate(); | ||||
| mainFrame = new Frame(antLibraries, initConfig, config); | |||||
| for (Iterator j = eventSupport.getListeners(); j.hasNext(); ) { | |||||
| BuildListener listener = (BuildListener)j.next(); | |||||
| mainFrame.addBuildListener(listener); | |||||
| } | |||||
| mainFrame.setProject(project); | mainFrame.setProject(project); | ||||
| mainFrame.setInitialProperties(commandProperties); | mainFrame.setInitialProperties(commandProperties); | ||||
| @@ -178,7 +190,9 @@ public class ExecutionManager { | |||||
| */ | */ | ||||
| public void addBuildListener(BuildListener listener) { | public void addBuildListener(BuildListener listener) { | ||||
| eventSupport.addBuildListener(listener); | eventSupport.addBuildListener(listener); | ||||
| mainFrame.addBuildListener(listener); | |||||
| if (mainFrame != null) { | |||||
| mainFrame.addBuildListener(listener); | |||||
| } | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -188,35 +202,10 @@ public class ExecutionManager { | |||||
| */ | */ | ||||
| public void removeBuildListener(BuildListener listener) { | public void removeBuildListener(BuildListener listener) { | ||||
| eventSupport.removeBuildListener(listener); | eventSupport.removeBuildListener(listener); | ||||
| mainFrame.removeBuildListener(listener); | |||||
| } | |||||
| /** | |||||
| * Add the library paths from the AntConfig instance to the Ant | |||||
| * Libraries. | |||||
| * | |||||
| * @exception ExecutionException if remote libraries are not allowed. | |||||
| */ | |||||
| private void addConfigLibPaths() | |||||
| throws ExecutionException { | |||||
| // now add any additional library Paths specified by the config | |||||
| for (Iterator i = config.getLibraryIds(); i.hasNext(); ) { | |||||
| String libraryId = (String)i.next(); | |||||
| if (antLibraries.containsKey(libraryId)) { | |||||
| AntLibrary antLib | |||||
| = (AntLibrary)antLibraries.get(libraryId); | |||||
| List pathList = config.getLibraryPathList(libraryId); | |||||
| for (Iterator j = pathList.iterator(); j.hasNext(); ) { | |||||
| URL pathElementURL = (URL)j.next(); | |||||
| if (!pathElementURL.getProtocol().equals("file") | |||||
| && !config.isRemoteLibAllowed()) { | |||||
| throw new ExecutionException("Remote libpaths are not" | |||||
| + " allowed: " + pathElementURL); | |||||
| } | |||||
| antLib.addLibraryURL(pathElementURL); | |||||
| } | |||||
| } | |||||
| if (mainFrame != null) { | |||||
| mainFrame.removeBuildListener(listener); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -63,30 +63,31 @@ import org.apache.ant.antcore.antlib.AntLibrary; | |||||
| import org.apache.ant.antcore.antlib.ComponentLibrary; | import org.apache.ant.antcore.antlib.ComponentLibrary; | ||||
| import org.apache.ant.antcore.config.AntConfig; | import org.apache.ant.antcore.config.AntConfig; | ||||
| import org.apache.ant.common.antlib.AntLibFactory; | import org.apache.ant.common.antlib.AntLibFactory; | ||||
| import org.apache.ant.common.antlib.DeferredTask; | |||||
| import org.apache.ant.common.antlib.ExecutionComponent; | import org.apache.ant.common.antlib.ExecutionComponent; | ||||
| import org.apache.ant.common.antlib.Task; | import org.apache.ant.common.antlib.Task; | ||||
| import org.apache.ant.common.antlib.TaskContainer; | import org.apache.ant.common.antlib.TaskContainer; | ||||
| import org.apache.ant.common.event.BuildListener; | import org.apache.ant.common.event.BuildListener; | ||||
| import org.apache.ant.common.event.MessageLevel; | |||||
| import org.apache.ant.common.model.BuildElement; | import org.apache.ant.common.model.BuildElement; | ||||
| import org.apache.ant.common.model.Project; | import org.apache.ant.common.model.Project; | ||||
| import org.apache.ant.common.model.Target; | 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.EventService; | import org.apache.ant.common.service.EventService; | ||||
| import org.apache.ant.common.service.ExecService; | |||||
| import org.apache.ant.common.service.FileService; | |||||
| 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; | ||||
| import org.apache.ant.common.util.ExecutionException; | import org.apache.ant.common.util.ExecutionException; | ||||
| import org.apache.ant.common.util.FileUtils; | import org.apache.ant.common.util.FileUtils; | ||||
| import org.apache.ant.common.util.MessageLevel; | |||||
| import org.apache.ant.init.InitConfig; | import org.apache.ant.init.InitConfig; | ||||
| import org.apache.ant.common.service.ExecService; | |||||
| /** | /** | ||||
| * An Frame maintains the state of a project during an execution. | |||||
| * The Frame contains the data values set by Ant tasks as they are | |||||
| * executed, including task definitions, property values, etc. | |||||
| * An Frame maintains the state of a project during an execution. The Frame | |||||
| * contains the data values set by Ant tasks as they are executed, including | |||||
| * task definitions, property values, etc. | |||||
| * | * | ||||
| * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | ||||
| * @created 14 January 2002 | * @created 14 January 2002 | ||||
| @@ -105,7 +106,7 @@ public class Frame { | |||||
| private Map referencedFrames = new HashMap(); | private Map referencedFrames = new HashMap(); | ||||
| /** Reflector objects used to configure Tasks from the Task models. */ | /** Reflector objects used to configure Tasks from the Task models. */ | ||||
| private Map reflectors = new HashMap(); | |||||
| private Map setters = new HashMap(); | |||||
| /** | /** | ||||
| * The context of this execution. This contains all data object's | * The context of this execution. This contains all data object's | ||||
| @@ -165,7 +166,7 @@ public class Frame { | |||||
| * imported | * imported | ||||
| */ | */ | ||||
| protected Frame(Map standardLibs, InitConfig initConfig, | protected Frame(Map standardLibs, InitConfig initConfig, | ||||
| AntConfig config) throws ExecutionException { | |||||
| AntConfig config) throws ExecutionException { | |||||
| this.standardLibs = standardLibs; | this.standardLibs = standardLibs; | ||||
| this.config = config; | this.config = config; | ||||
| this.initConfig = initConfig; | this.initConfig = initConfig; | ||||
| @@ -202,7 +203,6 @@ public class Frame { | |||||
| = project.getReferencedProject(referenceName); | = project.getReferencedProject(referenceName); | ||||
| Frame referencedFrame = createFrame(referencedProject); | Frame referencedFrame = createFrame(referencedProject); | ||||
| referencedFrames.put(referenceName, referencedFrame); | referencedFrames.put(referenceName, referencedFrame); | ||||
| } | } | ||||
| configureServices(); | configureServices(); | ||||
| @@ -359,8 +359,8 @@ public class Frame { | |||||
| * Get a referenced frame by its reference name | * Get a referenced frame by its reference name | ||||
| * | * | ||||
| * @param referenceName the name under which the frame was imported. | * @param referenceName the name under which the frame was imported. | ||||
| * @return the Frame asscociated with the given reference name | |||||
| * or null if there is no such project. | |||||
| * @return the Frame asscociated with the given reference name or null | |||||
| * if there is no such project. | |||||
| */ | */ | ||||
| protected Frame getReferencedFrame(String referenceName) { | protected Frame getReferencedFrame(String referenceName) { | ||||
| return (Frame)referencedFrames.get(referenceName); | return (Frame)referencedFrames.get(referenceName); | ||||
| @@ -672,20 +672,26 @@ public class Frame { | |||||
| /** | /** | ||||
| * Gets the reflector for the given class | |||||
| * Gets the setter for the given class | |||||
| * | * | ||||
| * @param c the class for which the reflector is desired | * @param c the class for which the reflector is desired | ||||
| * @return the reflector | * @return the reflector | ||||
| */ | */ | ||||
| private Reflector getReflector(Class c) { | |||||
| if (reflectors.containsKey(c)) { | |||||
| return (Reflector)reflectors.get(c); | |||||
| private Setter getSetter(Class c) { | |||||
| if (setters.containsKey(c)) { | |||||
| return (Setter)setters.get(c); | |||||
| } | } | ||||
| ClassIntrospector introspector | |||||
| = new ClassIntrospector(c, componentManager.getConverters()); | |||||
| Reflector reflector = introspector.getReflector(); | |||||
| reflectors.put(c, reflector); | |||||
| return reflector; | |||||
| Setter setter = null; | |||||
| if (DeferredTask.class.isAssignableFrom(c)) { | |||||
| setter = new DeferredSetter(); | |||||
| } else { | |||||
| ClassIntrospector introspector | |||||
| = new ClassIntrospector(c, componentManager.getConverters()); | |||||
| setter = introspector.getReflector(); | |||||
| } | |||||
| setters.put(c, setter); | |||||
| return setter; | |||||
| } | } | ||||
| @@ -759,15 +765,15 @@ public class Frame { | |||||
| private void configureServices() { | private void configureServices() { | ||||
| // create services and make them available in our services map | // create services and make them available in our services map | ||||
| fileService = new CoreFileService(this); | fileService = new CoreFileService(this); | ||||
| componentManager | |||||
| = new ComponentManager(this, config.isRemoteLibAllowed()); | |||||
| componentManager = new ComponentManager(this, | |||||
| config.isRemoteLibAllowed(), config.getLibraryPathsMap()); | |||||
| dataService = new CoreDataService(this, | dataService = new CoreDataService(this, | ||||
| config.isUnsetPropertiesAllowed()); | config.isUnsetPropertiesAllowed()); | ||||
| 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)); | |||||
| services.put(EventService.class, new CoreEventService(this)); | |||||
| services.put(ExecService.class, new CoreExecService(this)); | services.put(ExecService.class, new CoreExecService(this)); | ||||
| } | } | ||||
| @@ -784,27 +790,27 @@ public class Frame { | |||||
| BuildElement model) | BuildElement model) | ||||
| throws ExecutionException { | throws ExecutionException { | ||||
| Reflector reflector = getReflector(element.getClass()); | |||||
| Setter setter = getSetter(element.getClass()); | |||||
| // start by setting the attributes of this element | // start by setting the attributes of this element | ||||
| for (Iterator i = model.getAttributeNames(); i.hasNext(); ) { | for (Iterator i = model.getAttributeNames(); i.hasNext(); ) { | ||||
| String attributeName = (String)i.next(); | String attributeName = (String)i.next(); | ||||
| String attributeValue = model.getAttributeValue(attributeName); | String attributeValue = model.getAttributeValue(attributeName); | ||||
| if (!reflector.supportsAttribute(attributeName)) { | |||||
| if (!setter.supportsAttribute(attributeName)) { | |||||
| throw new ExecutionException(model.getType() | throw new ExecutionException(model.getType() | ||||
| + " does not support the \"" + attributeName | + " does not support the \"" + attributeName | ||||
| + "\" attribute", model.getLocation()); | + "\" attribute", model.getLocation()); | ||||
| } | } | ||||
| reflector.setAttribute(element, attributeName, | |||||
| setter.setAttribute(element, attributeName, | |||||
| dataService.replacePropertyRefs(attributeValue)); | dataService.replacePropertyRefs(attributeValue)); | ||||
| } | } | ||||
| String modelText = model.getText().trim(); | String modelText = model.getText().trim(); | ||||
| if (modelText.length() != 0) { | if (modelText.length() != 0) { | ||||
| if (!reflector.supportsText()) { | |||||
| if (!setter.supportsText()) { | |||||
| throw new ExecutionException(model.getType() | throw new ExecutionException(model.getType() | ||||
| + " does not support content", model.getLocation()); | + " does not support content", model.getLocation()); | ||||
| } | } | ||||
| reflector.addText(element, | |||||
| setter.addText(element, | |||||
| dataService.replacePropertyRefs(modelText)); | dataService.replacePropertyRefs(modelText)); | ||||
| } | } | ||||
| @@ -817,7 +823,7 @@ public class Frame { | |||||
| if (element instanceof TaskContainer | if (element instanceof TaskContainer | ||||
| && info != null | && info != null | ||||
| && info.getDefinitionType() == AntLibrary.TASKDEF | && info.getDefinitionType() == AntLibrary.TASKDEF | ||||
| && !reflector.supportsNestedElement(nestedElementName)) { | |||||
| && !setter.supportsNestedElement(nestedElementName)) { | |||||
| // it is a nested task | // it is a nested task | ||||
| TaskContext nestedContext | TaskContext nestedContext | ||||
| = configureTask(nestedElementModel); | = configureTask(nestedElementModel); | ||||
| @@ -826,11 +832,11 @@ public class Frame { | |||||
| // method of executing tasks | // method of executing tasks | ||||
| container.addTask(nestedContext.getTask()); | container.addTask(nestedContext.getTask()); | ||||
| } else { | } else { | ||||
| if (reflector.supportsNestedAdder(nestedElementName)) { | |||||
| addNestedElement(factory, reflector, element, | |||||
| if (setter.supportsNestedAdder(nestedElementName)) { | |||||
| addNestedElement(factory, setter, element, | |||||
| nestedElementModel); | nestedElementModel); | ||||
| } else if (reflector.supportsNestedCreator(nestedElementName)) { | |||||
| createNestedElement(factory, reflector, element, | |||||
| } else if (setter.supportsNestedCreator(nestedElementName)) { | |||||
| createNestedElement(factory, setter, element, | |||||
| nestedElementModel); | nestedElementModel); | ||||
| } else { | } else { | ||||
| throw new ExecutionException(model.getType() | throw new ExecutionException(model.getType() | ||||
| @@ -846,7 +852,7 @@ public class Frame { | |||||
| /** | /** | ||||
| * Create a nested element for the given object according to the model. | * Create a nested element for the given object according to the model. | ||||
| * | * | ||||
| * @param reflector the reflector instance of the container object | |||||
| * @param setter the Setter instance of the container object | |||||
| * @param element the container object for which a nested element is | * @param element the container object for which a nested element is | ||||
| * required. | * required. | ||||
| * @param model the build model for the nestd element | * @param model the build model for the nestd element | ||||
| @@ -855,7 +861,7 @@ public class Frame { | |||||
| * @exception ExecutionException if the nested element cannot be | * @exception ExecutionException if the nested element cannot be | ||||
| * created. | * created. | ||||
| */ | */ | ||||
| private void createNestedElement(AntLibFactory factory, Reflector reflector, | |||||
| private void createNestedElement(AntLibFactory factory, Setter setter, | |||||
| Object element, BuildElement model) | Object element, BuildElement model) | ||||
| throws ExecutionException { | throws ExecutionException { | ||||
| log("The use of create methods is deprecated - class: " | log("The use of create methods is deprecated - class: " | ||||
| @@ -864,7 +870,7 @@ public class Frame { | |||||
| String nestedElementName = model.getType(); | String nestedElementName = model.getType(); | ||||
| try { | try { | ||||
| Object nestedElement | Object nestedElement | ||||
| = reflector.createElement(element, nestedElementName); | |||||
| = setter.createElement(element, nestedElementName); | |||||
| factory.registerCreatedElement(nestedElement); | factory.registerCreatedElement(nestedElement); | ||||
| if (nestedElement instanceof ExecutionComponent) { | if (nestedElement instanceof ExecutionComponent) { | ||||
| ExecutionComponent component | ExecutionComponent component | ||||
| @@ -891,7 +897,7 @@ public class Frame { | |||||
| /** | /** | ||||
| * Create and add a nested element | * Create and add a nested element | ||||
| * | * | ||||
| * @param reflector The reflector instance for the container element | |||||
| * @param setter The Setter instance for the container element | |||||
| * @param element the container element in which the nested element will | * @param element the container element in which the nested element will | ||||
| * be created | * be created | ||||
| * @param model the model of the nested element | * @param model the model of the nested element | ||||
| @@ -899,12 +905,12 @@ public class Frame { | |||||
| * which the attribute is to be added. | * which the attribute is to be added. | ||||
| * @exception ExecutionException if the nested element cannot be created | * @exception ExecutionException if the nested element cannot be created | ||||
| */ | */ | ||||
| private void addNestedElement(AntLibFactory factory, Reflector reflector, | |||||
| private void addNestedElement(AntLibFactory factory, Setter setter, | |||||
| Object element, BuildElement model) | Object element, BuildElement model) | ||||
| throws ExecutionException { | throws ExecutionException { | ||||
| String nestedElementName = model.getType(); | String nestedElementName = model.getType(); | ||||
| Class nestedType = reflector.getType(nestedElementName); | |||||
| Class nestedType = setter.getType(nestedElementName); | |||||
| // is there a polymorph indicator - look in Ant aspects | // is there a polymorph indicator - look in Ant aspects | ||||
| String typeName = model.getAspectValue(ANT_ASPECT, "type"); | String typeName = model.getAspectValue(ANT_ASPECT, "type"); | ||||
| @@ -947,7 +953,7 @@ public class Frame { | |||||
| model.getLocation()); | model.getLocation()); | ||||
| } | } | ||||
| typeInstance = createTypeInstance(nestedType, factory, model); | |||||
| typeInstance = createTypeInstance(nestedType, factory, model, null); | |||||
| } | } | ||||
| // is the typeInstance compatible with the type expected | // is the typeInstance compatible with the type expected | ||||
| @@ -965,7 +971,7 @@ public class Frame { | |||||
| model.getLocation()); | model.getLocation()); | ||||
| } | } | ||||
| } | } | ||||
| reflector.addElement(element, nestedElementName, typeInstance); | |||||
| setter.addElement(element, nestedElementName, typeInstance); | |||||
| } | } | ||||
| @@ -989,8 +995,9 @@ public class Frame { | |||||
| } | } | ||||
| String className = taskDefInfo.getClassName(); | String className = taskDefInfo.getClassName(); | ||||
| ComponentLibrary componentLibrary | |||||
| = taskDefInfo.getComponentLibrary(); | |||||
| ComponentLibrary componentLibrary | |||||
| = taskDefInfo.getComponentLibrary(); | |||||
| String localName = taskDefInfo.getLocalName(); | |||||
| try { | try { | ||||
| ClassLoader taskClassLoader = componentLibrary.getClassLoader(); | ClassLoader taskClassLoader = componentLibrary.getClassLoader(); | ||||
| @@ -998,7 +1005,8 @@ public class Frame { | |||||
| = Class.forName(className, true, taskClassLoader); | = Class.forName(className, true, taskClassLoader); | ||||
| AntLibFactory libFactory | AntLibFactory libFactory | ||||
| = componentManager.getLibFactory(componentLibrary); | = componentManager.getLibFactory(componentLibrary); | ||||
| Object element = libFactory.createTaskInstance(elementClass); | |||||
| Object element | |||||
| = libFactory.createTaskInstance(elementClass, localName); | |||||
| Task task = null; | Task task = null; | ||||
| if (element instanceof Task) { | if (element instanceof Task) { | ||||
| @@ -1062,8 +1070,9 @@ public class Frame { | |||||
| } | } | ||||
| String className = typeDefInfo.getClassName(); | String className = typeDefInfo.getClassName(); | ||||
| ComponentLibrary componentLibrary | |||||
| = typeDefInfo.getComponentLibrary(); | |||||
| ComponentLibrary componentLibrary | |||||
| = typeDefInfo.getComponentLibrary(); | |||||
| String localName = typeDefInfo.getLocalName(); | |||||
| try { | try { | ||||
| ClassLoader typeClassLoader = componentLibrary.getClassLoader(); | ClassLoader typeClassLoader = componentLibrary.getClassLoader(); | ||||
| @@ -1074,7 +1083,7 @@ public class Frame { | |||||
| AntLibFactory libFactory | AntLibFactory libFactory | ||||
| = componentManager.getLibFactory(componentLibrary); | = componentManager.getLibFactory(componentLibrary); | ||||
| Object typeInstance | Object typeInstance | ||||
| = createTypeInstance(typeClass, libFactory, model); | |||||
| = createTypeInstance(typeClass, libFactory, model, localName); | |||||
| setContextLoader(currentLoader); | setContextLoader(currentLoader); | ||||
| return typeInstance; | return typeInstance; | ||||
| @@ -1095,15 +1104,17 @@ public class Frame { | |||||
| * @param model the model describing the required configuration of the | * @param model the model describing the required configuration of the | ||||
| * instance | * instance | ||||
| * @param libFactory the factory object of the typeClass's Ant library | * @param libFactory the factory object of the typeClass's Ant library | ||||
| * @param localName the name of the type within its Ant library | |||||
| * @return an instance of the given class appropriately configured | * @return an instance of the given class appropriately configured | ||||
| * @exception ExecutionException if there is a problem creating the type | * @exception ExecutionException if there is a problem creating the type | ||||
| * instance | * instance | ||||
| */ | */ | ||||
| private Object createTypeInstance(Class typeClass, AntLibFactory libFactory, | private Object createTypeInstance(Class typeClass, AntLibFactory libFactory, | ||||
| BuildElement model) | |||||
| BuildElement model, String localName) | |||||
| throws ExecutionException { | throws ExecutionException { | ||||
| try { | try { | ||||
| Object typeInstance = libFactory.createTypeInstance(typeClass); | |||||
| Object typeInstance | |||||
| = libFactory.createTypeInstance(typeClass, localName); | |||||
| if (typeInstance instanceof ExecutionComponent) { | if (typeInstance instanceof ExecutionComponent) { | ||||
| ExecutionComponent component = (ExecutionComponent)typeInstance; | ExecutionComponent component = (ExecutionComponent)typeInstance; | ||||
| @@ -107,5 +107,14 @@ public class ImportInfo { | |||||
| return libDefinition.getDefinitionType(); | return libDefinition.getDefinitionType(); | ||||
| } | } | ||||
| /** | |||||
| * Get the name of the component within its library. | |||||
| * | |||||
| * @return the name of the component within its library | |||||
| */ | |||||
| public String getLocalName() { | |||||
| return libDefinition.getDefinitionName(); | |||||
| } | |||||
| } | } | ||||
| @@ -69,7 +69,7 @@ import org.apache.ant.common.util.ExecutionException; | |||||
| * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | ||||
| * @created 19 January 2002 | * @created 19 January 2002 | ||||
| */ | */ | ||||
| public class Reflector { | |||||
| public class Reflector implements Setter { | |||||
| /** | /** | ||||
| * AttributeSetter classes are created at introspection time for each | * AttributeSetter classes are created at introspection time for each | ||||
| @@ -0,0 +1,166 @@ | |||||
| /* | |||||
| * 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.common.util.ExecutionException; | |||||
| /** | |||||
| * The Setter interface is used by the Ant core to set values and nested | |||||
| * elements in objects being configured. | |||||
| * | |||||
| * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
| * @created 11 February 2002 | |||||
| */ | |||||
| public interface Setter { | |||||
| /** | |||||
| * Set an attribute value on an object | |||||
| * | |||||
| * @param obj the object on which the value is being set | |||||
| * @param attributeName the name of the attribute | |||||
| * @param value the string represenation of the attribute's value | |||||
| * @exception ExecutionException if the object does not support the | |||||
| * attribute or the object has a problem setting the value | |||||
| */ | |||||
| void setAttribute(Object obj, String attributeName, | |||||
| String value) | |||||
| throws ExecutionException; | |||||
| /** | |||||
| * Get the type of the given nested element | |||||
| * | |||||
| * @param elementName the nested element whose type is desired | |||||
| * @return the class instance representing the type of the element adder | |||||
| */ | |||||
| Class getType(String elementName); | |||||
| /** | |||||
| * Adds PCDATA to the element | |||||
| * | |||||
| * @param obj the instance whose content is being provided | |||||
| * @param text the required content | |||||
| * @exception ExecutionException if the object does not support | |||||
| * contentor the object has a problem setting the content | |||||
| */ | |||||
| void addText(Object obj, String text) | |||||
| throws ExecutionException; | |||||
| /** | |||||
| * Add an element to the given object | |||||
| * | |||||
| * @param obj The object to which the element is being added | |||||
| * @param elementName the name of the element | |||||
| * @param value the object to be added - the nested element | |||||
| * @exception ExecutionException if the object does not support content | |||||
| * or the object has a problem setting the content | |||||
| */ | |||||
| void addElement(Object obj, String elementName, Object value) | |||||
| throws ExecutionException; | |||||
| /** | |||||
| * Create a nested element using the object's element factory method. | |||||
| * | |||||
| * @param container the object in which the nested element is required. | |||||
| * @param elementName the name of the nested element | |||||
| * @return the new instance of the nested element | |||||
| * @exception ExecutionException if the nested element cannot be | |||||
| * created. | |||||
| */ | |||||
| Object createElement(Object container, String elementName) | |||||
| throws ExecutionException; | |||||
| /** | |||||
| * Indicate if the class assocated with this reflector supports the | |||||
| * addition of text content. | |||||
| * | |||||
| * @return true if the class supports an addText method | |||||
| */ | |||||
| boolean supportsText(); | |||||
| /** | |||||
| * Indicate if the class assocated with this reflector supports the | |||||
| * given attribute | |||||
| * | |||||
| * @param attributeName the name of the attribute | |||||
| * @return true if the given attribute is supported | |||||
| */ | |||||
| boolean supportsAttribute(String attributeName); | |||||
| /** | |||||
| * Determine if the class associated with this reflector supports a | |||||
| * particular nested element via a create factory method | |||||
| * | |||||
| * @param elementName the name of the element | |||||
| * @return true if the class supports creation of that element | |||||
| */ | |||||
| boolean supportsNestedCreator(String elementName); | |||||
| /** | |||||
| * Determine if the class associated with this reflector supports a | |||||
| * particular nested element via an add method | |||||
| * | |||||
| * @param elementName the name of the element | |||||
| * @return true if the class supports addition of that element | |||||
| */ | |||||
| boolean supportsNestedAdder(String elementName); | |||||
| /** | |||||
| * Determine if the class associated with this reflector supports a | |||||
| * particular nested element | |||||
| * | |||||
| * @param elementName the name of the element | |||||
| * @return true if the class supports the given type of nested element | |||||
| */ | |||||
| boolean supportsNestedElement(String elementName); | |||||
| } | |||||
| @@ -68,7 +68,7 @@ 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; | ||||
| import org.apache.ant.common.util.MessageLevel; | |||||
| import org.apache.ant.common.event.MessageLevel; | |||||
| import org.apache.ant.common.util.PropertyUtils; | import org.apache.ant.common.util.PropertyUtils; | ||||
| import org.apache.tools.ant.types.FilterSet; | import org.apache.tools.ant.types.FilterSet; | ||||
| import org.apache.tools.ant.types.FilterSetCollection; | import org.apache.tools.ant.types.FilterSetCollection; | ||||
| @@ -199,6 +199,14 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
| return javaVersion; | return javaVersion; | ||||
| } | } | ||||
| /** | |||||
| * get the target hashtable | |||||
| * @return hashtable, the contents of which can be cast to Target | |||||
| */ | |||||
| public Hashtable getTargets() { | |||||
| return new Hashtable(); // XXX can't get targets | |||||
| } | |||||
| /** | /** | ||||
| * returns the boolean equivalent of a string, which is considered true | * returns the boolean equivalent of a string, which is considered true | ||||
| * if either "on", "true", or "yes" is found, ignoring case. | * if either "on", "true", or "yes" is found, ignoring case. | ||||
| @@ -0,0 +1,6 @@ | |||||
| <antlib libid="antopt.script" | |||||
| home="http://jakarta.apache.org/ant"> | |||||
| <factory classname="org.apache.ant.antlib.script.ScriptFactory"/> | |||||
| <taskdef name="scriptdef" classname="org.apache.ant.antlib.script.ScriptDef"/> | |||||
| </antlib> | |||||
| @@ -0,0 +1,177 @@ | |||||
| /* | |||||
| * 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.script; | |||||
| import com.ibm.bsf.BSFEngine; | |||||
| import com.ibm.bsf.BSFException; | |||||
| import com.ibm.bsf.BSFManager; | |||||
| import java.util.ArrayList; | |||||
| import java.util.HashMap; | |||||
| import java.util.Iterator; | |||||
| import java.util.List; | |||||
| import java.util.Map; | |||||
| import org.apache.ant.common.antlib.AbstractTask; | |||||
| import org.apache.ant.common.antlib.DeferredTask; | |||||
| import org.apache.ant.common.util.ExecutionException; | |||||
| /** | |||||
| * Task to import a component or components from a library | |||||
| * | |||||
| * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
| * @created 27 January 2002 | |||||
| */ | |||||
| public class ScriptBase extends AbstractTask implements DeferredTask { | |||||
| /** The script factory instance to be used by this script */ | |||||
| private ScriptFactory factory; | |||||
| /** the name to which this script has been defined */ | |||||
| private String scriptName; | |||||
| /** the attribute values set by the core */ | |||||
| private Map attributes = new HashMap(); | |||||
| /** Any embedded set by the core */ | |||||
| private String text = ""; | |||||
| /** A list of the nested element names which have been configured */ | |||||
| private List nestedElementNames = new ArrayList(); | |||||
| /** A list of the nested elements objects which have been configured */ | |||||
| private List nestedElements = new ArrayList(); | |||||
| /** | |||||
| * Set the given attribute | |||||
| * | |||||
| * @param name the name of the attribute | |||||
| * @param attributeValue the new attribute value | |||||
| */ | |||||
| public void setAttribute(String name, String attributeValue) { | |||||
| attributes.put(name, attributeValue); | |||||
| } | |||||
| /** | |||||
| * Add a nested element | |||||
| * | |||||
| * @param nestedElementName the nested element's name | |||||
| * @param value the object being added | |||||
| */ | |||||
| public void addElement(String nestedElementName, Object value) { | |||||
| nestedElementNames.add(nestedElementName); | |||||
| nestedElements.add(value); | |||||
| } | |||||
| /** | |||||
| * Execute the script | |||||
| * | |||||
| * @exception ExecutionException if tghe script execution fails | |||||
| */ | |||||
| public void execute() throws ExecutionException { | |||||
| String language = factory.getScriptLanguage(scriptName); | |||||
| String script = factory.getScript(scriptName); | |||||
| try { | |||||
| BSFManager manager = new BSFManager(); | |||||
| // execute the script | |||||
| BSFEngine engine = manager.loadScriptingEngine(language); | |||||
| engine.exec(scriptName, 0, 0, script); | |||||
| for (Iterator i = attributes.keySet().iterator(); i.hasNext(); ) { | |||||
| String attributeName = (String)i.next(); | |||||
| String value = (String)attributes.get(attributeName); | |||||
| StringBuffer setter = new StringBuffer(attributeName); | |||||
| setter.setCharAt(0, Character.toUpperCase(setter.charAt(0))); | |||||
| engine.call(null, "set" + setter, new Object[]{value}); | |||||
| } | |||||
| engine.call(null, "execute", new Object[]{}); | |||||
| } catch (BSFException e) { | |||||
| Throwable t = e; | |||||
| Throwable te = e.getTargetException(); | |||||
| if (te != null) { | |||||
| if (te instanceof ExecutionException) { | |||||
| throw (ExecutionException)te; | |||||
| } else { | |||||
| t = te; | |||||
| } | |||||
| } | |||||
| throw new ExecutionException(t); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Defines the script. | |||||
| * | |||||
| * @param text Sets the value for the script variable. | |||||
| */ | |||||
| public void addText(String text) { | |||||
| this.text += text; | |||||
| } | |||||
| /** | |||||
| * Sets the factory of the ScriptBase | |||||
| * | |||||
| * @param factory the script factory this script instance will use | |||||
| */ | |||||
| protected void setFactory(ScriptFactory factory) { | |||||
| this.factory = factory; | |||||
| } | |||||
| /** | |||||
| * set the name of the script | |||||
| * | |||||
| * @param scriptName the script's defined name | |||||
| */ | |||||
| protected void setScriptName(String scriptName) { | |||||
| this.scriptName = scriptName; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,128 @@ | |||||
| /* | |||||
| * 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.script; | |||||
| import org.apache.ant.common.antlib.AbstractTask; | |||||
| import org.apache.ant.common.util.ExecutionException; | |||||
| /** | |||||
| * Define a task using a script | |||||
| * | |||||
| * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
| * @created 11 February 2002 | |||||
| */ | |||||
| public class ScriptDef extends AbstractTask { | |||||
| /** The script factor to use */ | |||||
| private ScriptFactory factory; | |||||
| /** the name by which this script will be activated */ | |||||
| private String name; | |||||
| /** the scripting language used by the script */ | |||||
| private String language; | |||||
| /** the script itself */ | |||||
| private String script = ""; | |||||
| /** | |||||
| * set the name under which this script will be activated in a build | |||||
| * file | |||||
| * | |||||
| * @param name the name of the script | |||||
| */ | |||||
| public void setName(String name) { | |||||
| this.name = name; | |||||
| } | |||||
| /** | |||||
| * Set the scripting language used by this script | |||||
| * | |||||
| * @param language the scripting language used by this script. | |||||
| */ | |||||
| public void setLanguage(String language) { | |||||
| this.language = language; | |||||
| } | |||||
| /** | |||||
| * Define the script. The script itself is stored in the factory where | |||||
| * it is retried by the ScriptBase instance | |||||
| * | |||||
| * @exception ExecutionException if the script cannot be defined | |||||
| */ | |||||
| public void execute() throws ExecutionException { | |||||
| // tell the factory about this script, under this name. | |||||
| factory.defineScript(name, language, script); | |||||
| } | |||||
| /** | |||||
| * Defines the script. | |||||
| * | |||||
| * @param text Sets the value for the script variable. | |||||
| */ | |||||
| public void addText(String text) { | |||||
| this.script += text; | |||||
| } | |||||
| /** | |||||
| * Set the script factory that will be used to store the script for | |||||
| * later execution | |||||
| * | |||||
| * @param factory the script factory used to store script information. | |||||
| */ | |||||
| protected void setFactory(ScriptFactory factory) { | |||||
| this.factory = factory; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,206 @@ | |||||
| /* | |||||
| * 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.script; | |||||
| import java.util.HashMap; | |||||
| import java.util.Map; | |||||
| import org.apache.ant.common.antlib.AntContext; | |||||
| import org.apache.ant.common.antlib.StandardLibFactory; | |||||
| import org.apache.ant.common.service.ComponentService; | |||||
| import org.apache.ant.common.util.ExecutionException; | |||||
| /** | |||||
| * The ScriptFactory class is a factory for the Scripting tasks. It stores | |||||
| * the scripts as they are defined | |||||
| * | |||||
| * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
| * @created 11 February 2002 | |||||
| */ | |||||
| public class ScriptFactory extends StandardLibFactory { | |||||
| /** | |||||
| * An inner class used to record information about defined scripts. | |||||
| * | |||||
| * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
| * @created 11 February 2002 | |||||
| */ | |||||
| private static class ScriptInfo { | |||||
| /** the scripting langauge to use */ | |||||
| private String language; | |||||
| /** the script itself */ | |||||
| private String script; | |||||
| /** | |||||
| * Constructor for the ScriptInfo object | |||||
| * | |||||
| * @param language the language the script is written in | |||||
| * @param script the script | |||||
| */ | |||||
| public ScriptInfo(String language, String script) { | |||||
| this.language = language; | |||||
| this.script = script; | |||||
| } | |||||
| /** | |||||
| * Gets the language of the Script | |||||
| * | |||||
| * @return the language value | |||||
| */ | |||||
| public String getLanguage() { | |||||
| return language; | |||||
| } | |||||
| /** | |||||
| * Gets the script. | |||||
| * | |||||
| * @return the script text | |||||
| */ | |||||
| public String getScript() { | |||||
| return script; | |||||
| } | |||||
| } | |||||
| /** The core's Component Service instance */ | |||||
| private ComponentService componentService; | |||||
| /** the scripts that have been defined */ | |||||
| private Map scripts = new HashMap(); | |||||
| /** | |||||
| * Initialise the factory | |||||
| * | |||||
| * @param context the factory's context | |||||
| * @exception ExecutionException if the factory cannot be initialized | |||||
| */ | |||||
| public void init(AntContext context) throws ExecutionException { | |||||
| super.init(context); | |||||
| componentService | |||||
| = (ComponentService)context.getCoreService(ComponentService.class); | |||||
| try { | |||||
| Class.forName("com.ibm.bsf.BSFManager"); | |||||
| } catch (ClassNotFoundException e) { | |||||
| throw new ExecutionException("The script Ant library requires " | |||||
| + "bsf.jar to be available"); | |||||
| } catch (NoClassDefFoundError e) { | |||||
| throw new ExecutionException("The script Ant library requires " | |||||
| + "bsf.jar to be available. The class " + e.getMessage() | |||||
| + "appears to be missing"); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Create an instance of the given task class | |||||
| * | |||||
| * @param taskClass the class for which an instance is required | |||||
| * @param localName the name within the library undeer which the task is | |||||
| * defined | |||||
| * @return an instance of the required class | |||||
| * @exception InstantiationException if the class cannot be instantiated | |||||
| * @exception IllegalAccessException if the instance cannot be accessed | |||||
| * @exception ExecutionException if there is a problem creating the task | |||||
| */ | |||||
| public Object createTaskInstance(Class taskClass, String localName) | |||||
| throws InstantiationException, IllegalAccessException, | |||||
| ExecutionException { | |||||
| Object task = super.createTaskInstance(taskClass, localName); | |||||
| if (task instanceof ScriptDef) { | |||||
| ScriptDef scriptDef = (ScriptDef)task; | |||||
| scriptDef.setFactory(this); | |||||
| } else if (task instanceof ScriptBase) { | |||||
| ScriptBase scriptBase = (ScriptBase)task; | |||||
| scriptBase.setFactory(this); | |||||
| scriptBase.setScriptName(localName); | |||||
| } | |||||
| return task; | |||||
| } | |||||
| /** | |||||
| * Get the script language of a script | |||||
| * | |||||
| * @param scriptName the name the script is defined under | |||||
| * @return the script language name | |||||
| */ | |||||
| protected String getScriptLanguage(String scriptName) { | |||||
| ScriptInfo scriptInfo = (ScriptInfo)scripts.get(scriptName); | |||||
| return scriptInfo.getLanguage(); | |||||
| } | |||||
| /** | |||||
| * Get a script. | |||||
| * | |||||
| * @param scriptName the name the script is defined under | |||||
| * @return the script text | |||||
| */ | |||||
| protected String getScript(String scriptName) { | |||||
| ScriptInfo scriptInfo = (ScriptInfo)scripts.get(scriptName); | |||||
| return scriptInfo.getScript(); | |||||
| } | |||||
| /** | |||||
| * Define a script | |||||
| * | |||||
| * @param name the name the script is to be defined under | |||||
| * @param language the language of the scripr | |||||
| * @param script the script text | |||||
| * @exception ExecutionException if the script cannot be defined | |||||
| */ | |||||
| protected void defineScript(String name, String language, String script) | |||||
| throws ExecutionException { | |||||
| ScriptInfo scriptDefinition = new ScriptInfo(language, script); | |||||
| scripts.put(name, scriptDefinition); | |||||
| componentService.taskdef(this, ScriptBase.class.getClassLoader(), | |||||
| name, ScriptBase.class.getName()); | |||||
| } | |||||
| } | |||||
| @@ -1,9 +1,9 @@ | |||||
| <antlib libid="ant.system" | <antlib libid="ant.system" | ||||
| home="http://jakarta.apache.org/ant"> | home="http://jakarta.apache.org/ant"> | ||||
| <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="loadlib" classname="org.apache.ant.antlib.system.LoadLib"/> | <taskdef name="loadlib" classname="org.apache.ant.antlib.system.LoadLib"/> | ||||
| <taskdef name="import" classname="org.apache.ant.antlib.system.Import"/> | |||||
| <taskdef name="ant" classname="org.apache.ant.antlib.system.Ant"/> | <taskdef name="ant" classname="org.apache.ant.antlib.system.Ant"/> | ||||
| <taskdef name="antcall" classname="org.apache.ant.antlib.system.AntCall"/> | <taskdef name="antcall" classname="org.apache.ant.antlib.system.AntCall"/> | ||||
| @@ -1,72 +0,0 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2002 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| */ | |||||
| package org.apache.ant.antlib.system; | |||||
| import org.apache.ant.common.antlib.AbstractTask; | |||||
| /** | |||||
| * Task to add an additional classpath search path to the given library | |||||
| * | |||||
| * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
| * @created 27 January 2002 | |||||
| */ | |||||
| public class LibPath extends AbstractTask { | |||||
| /** The id of the library for which this additional path is being set */ | |||||
| private String libraryId; | |||||
| /** Add the libpath to the set of paths associated with the library */ | |||||
| public void execute() { | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,135 @@ | |||||
| /* | |||||
| * 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.antlib.AbstractTask; | |||||
| import org.apache.ant.common.antlib.AntContext; | |||||
| import org.apache.ant.common.service.ComponentService; | |||||
| import org.apache.ant.common.util.ExecutionException; | |||||
| /** | |||||
| * Task to import a component or components from a library | |||||
| * | |||||
| * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
| * @created 27 January 2002 | |||||
| */ | |||||
| public class Import extends AbstractTask { | |||||
| /** The Ant LIbrary Id from which the component must be imported */ | |||||
| private String libraryId = null; | |||||
| /** The name of the component to be imported */ | |||||
| private String name = null; | |||||
| /** The alias that is to be used for the name */ | |||||
| private String alias = null; | |||||
| /** | |||||
| * Sets the libraryId of the Import | |||||
| * | |||||
| * @param libraryId the new libraryId value | |||||
| */ | |||||
| public void setLibraryId(String libraryId) { | |||||
| this.libraryId = libraryId; | |||||
| } | |||||
| /** | |||||
| * Sets the name of the Import | |||||
| * | |||||
| * @param name the new name value | |||||
| */ | |||||
| public void setName(String name) { | |||||
| this.name = name; | |||||
| } | |||||
| /** | |||||
| * Sets the alias of the Import | |||||
| * | |||||
| * @param alias the new alias value | |||||
| */ | |||||
| public void setAlias(String alias) { | |||||
| this.alias = alias; | |||||
| } | |||||
| /** | |||||
| * Validate this task is properly configured | |||||
| * | |||||
| * @exception ExecutionException if the task is not configured correctly | |||||
| */ | |||||
| public void validateComponent() throws ExecutionException { | |||||
| if (libraryId == null) { | |||||
| throw new ExecutionException("You must specify a library identifier" | |||||
| + " with the \"libraryid\" attribute"); | |||||
| } | |||||
| if (alias != null && name == null) { | |||||
| throw new ExecutionException("You may only specify an alias" | |||||
| + " when you specify the component name"); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Do the work and import the component or components | |||||
| * | |||||
| * @exception ExecutionException if the components cannot be imported | |||||
| */ | |||||
| public void execute() throws ExecutionException { | |||||
| AntContext context = getContext(); | |||||
| ComponentService componentService = (ComponentService) | |||||
| context.getCoreService(ComponentService.class); | |||||
| if (name == null) { | |||||
| componentService.importLibrary(libraryId); | |||||
| } else { | |||||
| componentService.importComponent(libraryId, name, alias); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,172 @@ | |||||
| /* | |||||
| * 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.io.File; | |||||
| import java.net.MalformedURLException; | |||||
| import java.net.URL; | |||||
| import org.apache.ant.common.antlib.AbstractTask; | |||||
| import org.apache.ant.common.antlib.AntContext; | |||||
| import org.apache.ant.common.service.ComponentService; | |||||
| import org.apache.ant.common.util.ExecutionException; | |||||
| import org.apache.ant.init.InitUtils; | |||||
| /** | |||||
| * Task to add an additional classpath to the given library | |||||
| * | |||||
| * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
| * @created 27 January 2002 | |||||
| */ | |||||
| public class LibPath extends AbstractTask { | |||||
| /** The id of the library for which this additional path is being set */ | |||||
| private String libraryId; | |||||
| /** | |||||
| * This is the location, either file or URL of the library or libraries | |||||
| * to be loaded | |||||
| */ | |||||
| private URL url; | |||||
| /** | |||||
| * Sets the libraryId of the LibPath | |||||
| * | |||||
| * @param libraryId the new libraryId value | |||||
| */ | |||||
| public void setLibraryId(String libraryId) { | |||||
| this.libraryId = libraryId; | |||||
| } | |||||
| /** | |||||
| * Sets the URL of the library to be loaded | |||||
| * | |||||
| * @param url the URL from which the library is to be loaded | |||||
| * @exception ExecutionException if the URL cannot be set | |||||
| */ | |||||
| public void setURL(URL url) throws ExecutionException { | |||||
| checkNullURL(); | |||||
| this.url = url; | |||||
| } | |||||
| /** | |||||
| * Set the file from which the library should be loaded. | |||||
| * | |||||
| * @param file the file from which the library should be loaded | |||||
| * @exception ExecutionException if the file attribute cannot be set | |||||
| */ | |||||
| public void setFile(File file) throws ExecutionException { | |||||
| checkNullURL(); | |||||
| try { | |||||
| this.url = InitUtils.getFileURL(file); | |||||
| } catch (MalformedURLException e) { | |||||
| throw new ExecutionException(e); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Set the dir in which to search for AntLibraries. | |||||
| * | |||||
| * @param dir the dir from which all Ant Libraries found will be loaded. | |||||
| * @exception ExecutionException if the dir attribute cannot be set | |||||
| */ | |||||
| public void setDir(File dir) throws ExecutionException { | |||||
| checkNullURL(); | |||||
| try { | |||||
| this.url = InitUtils.getFileURL(dir); | |||||
| } catch (MalformedURLException e) { | |||||
| throw new ExecutionException(e); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Validate this task is configured correctly | |||||
| * | |||||
| * @exception ExecutionException if the task is not configured correctly | |||||
| */ | |||||
| public void validateComponent() throws ExecutionException { | |||||
| if (libraryId == null) { | |||||
| throw new ExecutionException("You must specify the id of the" | |||||
| + "library for which you are providing additional classpaths"); | |||||
| } | |||||
| if (url == null) { | |||||
| throw new ExecutionException("You must provide an additional " | |||||
| + "classpath using one of the file, dir or url attributes"); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Add the libpath to the set of paths associated with the library | |||||
| * | |||||
| * @exception ExecutionException if the library path cannot be addded to | |||||
| * the library | |||||
| */ | |||||
| public void execute() throws ExecutionException { | |||||
| AntContext context = getContext(); | |||||
| ComponentService componentService = (ComponentService) | |||||
| context.getCoreService(ComponentService.class); | |||||
| componentService.addLibPath(libraryId, url); | |||||
| } | |||||
| /** | |||||
| * Check if any of the location specifying attributes have already been | |||||
| * set. | |||||
| * | |||||
| * @exception ExecutionException if the search URL has already been set | |||||
| */ | |||||
| private void checkNullURL() throws ExecutionException { | |||||
| if (url != null) { | |||||
| throw new ExecutionException("Location of library has already been " | |||||
| + "set. Please use only one of file, dir or url attributes"); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -128,6 +128,18 @@ public class LoadLib extends AbstractTask { | |||||
| this.importAll = importAll; | this.importAll = importAll; | ||||
| } | } | ||||
| /** | |||||
| * Validate this task is configured correctly | |||||
| * | |||||
| * @exception ExecutionException if the task is not configured correctly | |||||
| */ | |||||
| public void validateComponent() throws ExecutionException { | |||||
| if (url == null) { | |||||
| throw new ExecutionException("A location from which to load " | |||||
| + "libraries must be provided"); | |||||
| } | |||||
| } | |||||
| /** | /** | ||||
| * Load the library or libraries and optiinally import their components | * Load the library or libraries and optiinally import their components | ||||
| @@ -136,10 +148,6 @@ public class LoadLib extends AbstractTask { | |||||
| * loaded. | * loaded. | ||||
| */ | */ | ||||
| public void execute() throws ExecutionException { | public void execute() throws ExecutionException { | ||||
| if (url == null) { | |||||
| throw new ExecutionException("A location from which to load " | |||||
| + "libraries must be provided"); | |||||
| } | |||||
| AntContext context = getContext(); | AntContext context = getContext(); | ||||
| ComponentService componentService = (ComponentService) | ComponentService componentService = (ComponentService) | ||||
| context.getCoreService(ComponentService.class); | context.getCoreService(ComponentService.class); | ||||
| @@ -75,7 +75,7 @@ import org.apache.ant.common.model.Project; | |||||
| 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; | ||||
| import org.apache.ant.common.util.Location; | import org.apache.ant.common.util.Location; | ||||
| import org.apache.ant.common.util.MessageLevel; | |||||
| import org.apache.ant.common.event.MessageLevel; | |||||
| import org.apache.ant.init.InitConfig; | import org.apache.ant.init.InitConfig; | ||||
| import org.apache.ant.init.InitUtils; | import org.apache.ant.init.InitUtils; | ||||
| @@ -234,7 +234,8 @@ public class Commandline { | |||||
| * Get an option value | * Get an option value | ||||
| * | * | ||||
| * @param args the full list of command line arguments | * @param args the full list of command line arguments | ||||
| * @param position the position in the args array where the value shoudl be | |||||
| * @param position the position in the args array where the value shoudl | |||||
| * be | |||||
| * @param argType the option type | * @param argType the option type | ||||
| * @return the value of the option | * @return the value of the option | ||||
| * @exception ConfigException if the option cannot be read | * @exception ConfigException if the option cannot be read | ||||
| @@ -262,6 +263,7 @@ public class Commandline { | |||||
| this.initConfig = initConfig; | this.initConfig = initConfig; | ||||
| try { | try { | ||||
| parseArguments(args); | parseArguments(args); | ||||
| determineBuildFile(); | |||||
| AntConfig config = new AntConfig(); | AntConfig config = new AntConfig(); | ||||
| AntConfig userConfig = getAntConfig(initConfig.getUserConfigArea()); | AntConfig userConfig = getAntConfig(initConfig.getUserConfigArea()); | ||||
| @@ -293,6 +295,7 @@ public class Commandline { | |||||
| ExecutionManager executionManager | ExecutionManager executionManager | ||||
| = new ExecutionManager(initConfig, config); | = new ExecutionManager(initConfig, config); | ||||
| addBuildListeners(executionManager); | addBuildListeners(executionManager); | ||||
| executionManager.init(); | |||||
| executionManager.runBuild(project, targets, definedProperties); | executionManager.runBuild(project, targets, definedProperties); | ||||
| } catch (Throwable t) { | } catch (Throwable t) { | ||||
| if (t instanceof AntException) { | if (t instanceof AntException) { | ||||
| @@ -332,6 +335,79 @@ public class Commandline { | |||||
| return project; | return project; | ||||
| } | } | ||||
| /** | |||||
| * Handle build file argument | |||||
| * | |||||
| * @param url the build file's URL | |||||
| * @exception ConfigException if the build file location is not valid | |||||
| */ | |||||
| private void argBuildFile(String url) throws ConfigException { | |||||
| try { | |||||
| if (url.indexOf(":") == -1) { | |||||
| // We convert any hash characters to their URL escape. | |||||
| buildFileURL = InitUtils.getFileURL(new File(url)); | |||||
| } else { | |||||
| buildFileURL = new URL(url); | |||||
| } | |||||
| } catch (MalformedURLException e) { | |||||
| throw new ConfigException("Build file is not valid", e); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Handle the log file option | |||||
| * | |||||
| * @param arg the value of the log file option | |||||
| * @exception ConfigException if the log file is not writeable | |||||
| */ | |||||
| private void argLogFile(String arg) throws ConfigException { | |||||
| try { | |||||
| File logFile = new File(arg); | |||||
| out = new PrintStream(new FileOutputStream(logFile)); | |||||
| err = out; | |||||
| } catch (IOException ioe) { | |||||
| throw new ConfigException("Cannot write on the specified log " + | |||||
| "file. Make sure the path exists and " + | |||||
| "you have write permissions.", ioe); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Handle the logger attribute | |||||
| * | |||||
| * @param arg the logger classname | |||||
| * @exception ConfigException if a logger has already been defined | |||||
| */ | |||||
| private void argLogger(String arg) throws ConfigException { | |||||
| if (loggerClassname != null) { | |||||
| throw new ConfigException("Only one logger class may be " + | |||||
| "specified."); | |||||
| } | |||||
| loggerClassname = arg; | |||||
| } | |||||
| /** | |||||
| * Determine the build file to use | |||||
| * | |||||
| * @exception ConfigException if the build file cannot be found | |||||
| */ | |||||
| private void determineBuildFile() throws ConfigException { | |||||
| 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) { | |||||
| throw new ConfigException("Build file is not valid", e); | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | /** | ||||
| * Parse the command line arguments. | * Parse the command line arguments. | ||||
| @@ -349,30 +425,9 @@ public class Commandline { | |||||
| if (arg.equals("-buildfile") || arg.equals("-file") | if (arg.equals("-buildfile") || arg.equals("-file") | ||||
| || arg.equals("-f")) { | || arg.equals("-f")) { | ||||
| try { | |||||
| String url = getOption(args, i++, arg); | |||||
| if (url.indexOf(":") == -1) { | |||||
| // We convert any hash characters to their URL escape. | |||||
| buildFileURL = InitUtils.getFileURL(new File(url)); | |||||
| } else { | |||||
| buildFileURL = new URL(url); | |||||
| } | |||||
| } catch (MalformedURLException e) { | |||||
| System.err.println("Buildfile is not valid: " + | |||||
| e.getMessage()); | |||||
| throw new ConfigException("Build file is not valid", e); | |||||
| } | |||||
| argBuildFile(getOption(args, i++, arg)); | |||||
| } else if (arg.equals("-logfile") || arg.equals("-l")) { | } else if (arg.equals("-logfile") || arg.equals("-l")) { | ||||
| try { | |||||
| File logFile = new File(getOption(args, i++, arg)); | |||||
| out = new PrintStream(new FileOutputStream(logFile)); | |||||
| err = out; | |||||
| } catch (IOException ioe) { | |||||
| System.err.println("Cannot write on the specified log " + | |||||
| "file. Make sure the path exists and " + | |||||
| "you have write permissions."); | |||||
| return; | |||||
| } | |||||
| argLogFile(getOption(args, i++, arg)); | |||||
| } else if (arg.equals("-quiet") || arg.equals("-q")) { | } else if (arg.equals("-quiet") || arg.equals("-q")) { | ||||
| messageOutputLevel = MessageLevel.MSG_WARN; | messageOutputLevel = MessageLevel.MSG_WARN; | ||||
| } else if (arg.equals("-verbose") || arg.equals("-v")) { | } else if (arg.equals("-verbose") || arg.equals("-v")) { | ||||
| @@ -386,12 +441,7 @@ public class Commandline { | |||||
| } else if (arg.equals("-listener")) { | } else if (arg.equals("-listener")) { | ||||
| listeners.add(getOption(args, i++, arg)); | listeners.add(getOption(args, i++, arg)); | ||||
| } else if (arg.equals("-logger")) { | } else if (arg.equals("-logger")) { | ||||
| if (loggerClassname != null) { | |||||
| System.err.println("Only one logger class may be " + | |||||
| "specified."); | |||||
| return; | |||||
| } | |||||
| loggerClassname = getOption(args, i++, arg); | |||||
| argLogger(getOption(args, i++, arg)); | |||||
| } else if (arg.startsWith("-D")) { | } else if (arg.startsWith("-D")) { | ||||
| String name = arg.substring(2, arg.length()); | String name = arg.substring(2, arg.length()); | ||||
| String value = null; | String value = null; | ||||
| @@ -413,21 +463,6 @@ 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) { | |||||
| System.err.println("Buildfile is not valid: " + e.getMessage()); | |||||
| throw new ConfigException("Build file is not valid", e); | |||||
| } | |||||
| } | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -59,7 +59,7 @@ import org.apache.ant.common.model.Target; | |||||
| import org.apache.ant.common.event.BuildEvent; | import org.apache.ant.common.event.BuildEvent; | ||||
| import org.apache.ant.common.util.AntException; | import org.apache.ant.common.util.AntException; | ||||
| import org.apache.ant.common.util.Location; | import org.apache.ant.common.util.Location; | ||||
| import org.apache.ant.common.util.MessageLevel; | |||||
| import org.apache.ant.common.event.MessageLevel; | |||||
| /** | /** | ||||
| * Writes build event to a PrintStream. Currently, it only writes which | * Writes build event to a PrintStream. Currently, it only writes which | ||||
| @@ -235,20 +235,22 @@ public class DefaultLogger implements BuildLogger { | |||||
| = event.getPriority() == MessageLevel.MSG_ERR ? err : out; | = event.getPriority() == MessageLevel.MSG_ERR ? err : out; | ||||
| // Filter out messages based on priority | // 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 (event.getPriority() <= messageOutputLevel) { | |||||
| if (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(" "); | |||||
| if (!emacsMode) { | |||||
| String msg = "[" + name + "] "; | |||||
| int indentSize = LEFT_COLUMN_SIZE - msg.length(); | |||||
| for (int i = 0; i < indentSize; i++) { | |||||
| logTo.print(" "); | |||||
| } | |||||
| logTo.print(msg); | |||||
| } | } | ||||
| logTo.print(msg); | |||||
| } | } | ||||
| // Print the message | // Print the message | ||||
| @@ -68,12 +68,14 @@ public interface AntLibFactory { | |||||
| * Create an instance of the given type class | * Create an instance of the given type class | ||||
| * | * | ||||
| * @param typeClass the class for which an instance is required | * @param typeClass the class for which an instance is required | ||||
| * @param localName the name within the library under which the type is | |||||
| * defined | |||||
| * @return an instance of the required class | * @return an instance of the required class | ||||
| * @exception InstantiationException if the class cannot be instantiated | * @exception InstantiationException if the class cannot be instantiated | ||||
| * @exception IllegalAccessException if the instance cannot be accessed | * @exception IllegalAccessException if the instance cannot be accessed | ||||
| * @exception ExecutionException if there is a problem creating the type | * @exception ExecutionException if there is a problem creating the type | ||||
| */ | */ | ||||
| Object createTypeInstance(Class typeClass) | |||||
| Object createTypeInstance(Class typeClass, String localName) | |||||
| throws InstantiationException, IllegalAccessException, | throws InstantiationException, IllegalAccessException, | ||||
| ExecutionException; | ExecutionException; | ||||
| @@ -89,12 +91,14 @@ public interface AntLibFactory { | |||||
| * Create an instance of the given task class | * Create an instance of the given task class | ||||
| * | * | ||||
| * @param taskClass the class for which an instance is required | * @param taskClass the class for which an instance is required | ||||
| * @param localName the name within the library under which the task is | |||||
| * defined | |||||
| * @return an instance of the required class | * @return an instance of the required class | ||||
| * @exception InstantiationException if the class cannot be instantiated | * @exception InstantiationException if the class cannot be instantiated | ||||
| * @exception IllegalAccessException if the instance cannot be accessed | * @exception IllegalAccessException if the instance cannot be accessed | ||||
| * @exception ExecutionException if there is a problem creating the task | * @exception ExecutionException if there is a problem creating the task | ||||
| */ | */ | ||||
| Object createTaskInstance(Class taskClass) | |||||
| Object createTaskInstance(Class taskClass, String localName) | |||||
| throws InstantiationException, IllegalAccessException, | throws InstantiationException, IllegalAccessException, | ||||
| ExecutionException; | ExecutionException; | ||||
| @@ -51,24 +51,38 @@ | |||||
| * 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.ant.antlib.system; | |||||
| import org.apache.ant.common.antlib.AbstractTask; | |||||
| package org.apache.ant.common.antlib; | |||||
| /** | /** | ||||
| * Task to import a component or components from a library | |||||
| * A deferred task is one where the task task responsibility for configuring | |||||
| * itself at execution time. The attributes and nested elements are stored | |||||
| * by the task for later use | |||||
| * | * | ||||
| * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | ||||
| * @created 27 January 2002 | |||||
| * @created 11 February 2002 | |||||
| */ | */ | ||||
| public class Import extends AbstractTask { | |||||
| /** The Ant LIbrary Id from which the component must be imported */ | |||||
| private String antlibId = null; | |||||
| /** The name of the component to be imported */ | |||||
| private String componentName = null; | |||||
| public interface DeferredTask extends Task { | |||||
| /** | |||||
| * Sets the attribute of the DeferredTask | |||||
| * | |||||
| * @param name the attribute name | |||||
| * @param attributeValue the new attribute value | |||||
| */ | |||||
| void setAttribute(String name, String attributeValue); | |||||
| /** | |||||
| * Add a nested element | |||||
| * | |||||
| * @param nestedElementName the name of the nested element | |||||
| * @param value the object which is the nested element | |||||
| */ | |||||
| void addElement(String nestedElementName, Object value); | |||||
| /** Do thw work and import the components */ | |||||
| public void execute() { | |||||
| } | |||||
| /** | |||||
| * Add any text content | |||||
| * | |||||
| * @param text the value of the content | |||||
| */ | |||||
| void addText(String text); | |||||
| } | } | ||||
| @@ -62,16 +62,21 @@ import org.apache.ant.common.util.ExecutionException; | |||||
| * @see AntLibFactory | * @see AntLibFactory | ||||
| */ | */ | ||||
| public class StandardLibFactory implements AntLibFactory { | public class StandardLibFactory implements AntLibFactory { | ||||
| /** The context the factory can use to interact with the core */ | |||||
| private AntContext context; | |||||
| /** | /** | ||||
| * Create an instance of the given task class | * Create an instance of the given task class | ||||
| * | * | ||||
| * @param taskClass the class for which an instance is required | * @param taskClass the class for which an instance is required | ||||
| * @param localName the name within the library under which the task is | |||||
| * defined | |||||
| * @return an instance of the required class | * @return an instance of the required class | ||||
| * @exception InstantiationException if the class cannot be instantiated | * @exception InstantiationException if the class cannot be instantiated | ||||
| * @exception IllegalAccessException if the instance cannot be accessed | * @exception IllegalAccessException if the instance cannot be accessed | ||||
| * @exception ExecutionException if there is a problem creating the task | * @exception ExecutionException if there is a problem creating the task | ||||
| */ | */ | ||||
| public Object createTaskInstance(Class taskClass) | |||||
| public Object createTaskInstance(Class taskClass, String localName) | |||||
| throws InstantiationException, IllegalAccessException, | throws InstantiationException, IllegalAccessException, | ||||
| ExecutionException { | ExecutionException { | ||||
| return taskClass.newInstance(); | return taskClass.newInstance(); | ||||
| @@ -81,12 +86,14 @@ public class StandardLibFactory implements AntLibFactory { | |||||
| * Create an instance of the given type class | * Create an instance of the given type class | ||||
| * | * | ||||
| * @param typeClass the class for which an instance is required | * @param typeClass the class for which an instance is required | ||||
| * @param localName the name within the library under which the type is | |||||
| * defined, if any. | |||||
| * @return an instance of the required class | * @return an instance of the required class | ||||
| * @exception InstantiationException if the class cannot be instantiated | * @exception InstantiationException if the class cannot be instantiated | ||||
| * @exception IllegalAccessException if the instance cannot be accessed | * @exception IllegalAccessException if the instance cannot be accessed | ||||
| * @exception ExecutionException if there is a problem creating the type | * @exception ExecutionException if there is a problem creating the type | ||||
| */ | */ | ||||
| public Object createTypeInstance(Class typeClass) | |||||
| public Object createTypeInstance(Class typeClass, String localName) | |||||
| throws InstantiationException, IllegalAccessException, | throws InstantiationException, IllegalAccessException, | ||||
| ExecutionException { | ExecutionException { | ||||
| return typeClass.newInstance(); | return typeClass.newInstance(); | ||||
| @@ -99,7 +106,7 @@ public class StandardLibFactory implements AntLibFactory { | |||||
| * @exception ExecutionException if the factory cannot be initialized | * @exception ExecutionException if the factory cannot be initialized | ||||
| */ | */ | ||||
| public void init(AntContext context) throws ExecutionException { | public void init(AntContext context) throws ExecutionException { | ||||
| // do nothing | |||||
| this.context = context; | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -132,5 +139,14 @@ public class StandardLibFactory implements AntLibFactory { | |||||
| // do nothing | // do nothing | ||||
| } | } | ||||
| /** | |||||
| * Gets the context of the factory | |||||
| * | |||||
| * @return the context object | |||||
| */ | |||||
| protected AntContext getContext() { | |||||
| return context; | |||||
| } | |||||
| } | } | ||||
| @@ -122,9 +122,10 @@ public class BuildEvent extends EventObject { | |||||
| * @param message the message associated with this event | * @param message the message associated with this event | ||||
| * @param priority the message priority | * @param priority the message priority | ||||
| */ | */ | ||||
| public BuildEvent(ModelElement source, String message, | |||||
| public BuildEvent(Object source, String message, | |||||
| int priority) { | int priority) { | ||||
| this(source, MESSAGE); | |||||
| super(source); | |||||
| this.eventType = MESSAGE; | |||||
| this.message = message; | this.message = message; | ||||
| this.messagePriority = priority; | this.messagePriority = priority; | ||||
| } | } | ||||
| @@ -175,7 +176,12 @@ public class BuildEvent extends EventObject { | |||||
| * @return the model element this event is associated with | * @return the model element this event is associated with | ||||
| */ | */ | ||||
| public ModelElement getModelElement() { | public ModelElement getModelElement() { | ||||
| return (ModelElement)getSource(); | |||||
| Object source = getSource(); | |||||
| if (source instanceof ModelElement) { | |||||
| return (ModelElement)getSource(); | |||||
| } | |||||
| return null; | |||||
| } | } | ||||
| } | } | ||||
| @@ -51,7 +51,7 @@ | |||||
| * 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.ant.common.util; | |||||
| package org.apache.ant.common.event; | |||||
| /** | /** | ||||
| * The levels at which a log message may be sent. | * The levels at which a log message may be sent. | ||||
| @@ -52,6 +52,7 @@ | |||||
| * <http://www.apache.org/>. | * <http://www.apache.org/>. | ||||
| */ | */ | ||||
| package org.apache.ant.common.service; | package org.apache.ant.common.service; | ||||
| import java.net.URL; | |||||
| import org.apache.ant.common.antlib.AntLibFactory; | import org.apache.ant.common.antlib.AntLibFactory; | ||||
| import org.apache.ant.common.util.ExecutionException; | import org.apache.ant.common.util.ExecutionException; | ||||
| @@ -82,11 +83,23 @@ public interface ComponentService { | |||||
| void loadLib(String libLocation, boolean importAll) | void loadLib(String libLocation, boolean importAll) | ||||
| throws ExecutionException; | throws ExecutionException; | ||||
| /** | |||||
| * Add a library path to the given library. The library path is used in | |||||
| * the construction of the library's classloader | |||||
| * | |||||
| * @param libraryId the library's unique identifier | |||||
| * @param libPath the path to be added to the list of paths used by the | |||||
| * library. | |||||
| * @exception ExecutionException if the path cannot be used. | |||||
| */ | |||||
| void addLibPath(String libraryId, URL libPath) throws ExecutionException; | |||||
| /** | /** | ||||
| * Experimental - define a new type | * Experimental - define a new type | ||||
| * | * | ||||
| * @param typeName the name by which this type will be referred | * @param typeName the name by which this type will be referred | ||||
| * @param factory the library factory object to create the type instances | |||||
| * @param factory the library factory object to create the type | |||||
| * instances | |||||
| * @param loader the class loader to use to create the particular types | * @param loader the class loader to use to create the particular types | ||||
| * @param className the name of the class implementing the type | * @param className the name of the class implementing the type | ||||
| * @exception ExecutionException if the type cannot be defined | * @exception ExecutionException if the type cannot be defined | ||||
| @@ -99,7 +112,8 @@ public interface ComponentService { | |||||
| * Experimental - define a new task | * Experimental - define a new task | ||||
| * | * | ||||
| * @param taskName the name by which this task will be referred | * @param taskName the name by which this task will be referred | ||||
| * @param factory the library factory object to create the task instances | |||||
| * @param factory the library factory object to create the task | |||||
| * instances | |||||
| * @param loader the class loader to use to create the particular tasks | * @param loader the class loader to use to create the particular tasks | ||||
| * @param className the name of the class implementing the task | * @param className the name of the class implementing the task | ||||
| * @exception ExecutionException if the task cannot be defined | * @exception ExecutionException if the task cannot be defined | ||||
| @@ -108,5 +122,28 @@ public interface ComponentService { | |||||
| String taskName, String className) | String taskName, String className) | ||||
| throws ExecutionException; | throws ExecutionException; | ||||
| /** | |||||
| * Import a single component from a library, optionally aliasing it to a | |||||
| * new name | |||||
| * | |||||
| * @param libraryId the unique id of the library from which the | |||||
| * component is being imported | |||||
| * @param defName the name of the component within its library | |||||
| * @param alias the name under which this component will be used in the | |||||
| * build scripts. If this is null, the components default name is | |||||
| * used. | |||||
| * @exception ExecutionException if the component cannot be imported | |||||
| */ | |||||
| void importComponent(String libraryId, String defName, | |||||
| String alias) throws ExecutionException; | |||||
| /** | |||||
| * Import a complete library into the current execution frame | |||||
| * | |||||
| * @param libraryId The id of the library to be imported | |||||
| * @exception ExecutionException if the library cannot be imported | |||||
| */ | |||||
| void importLibrary(String libraryId) throws ExecutionException; | |||||
| } | } | ||||