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/BuildEvent.java"/> | |||
<include name="org/apache/tools/ant/BuildListener.java"/> | |||
<patternset refid="deprecated"/> | |||
<!-- <patternset refid="deprecated"/> --> | |||
<patternset refid="toohard"/> | |||
<patternset refid="converted"/> | |||
</fileset> | |||
@@ -38,8 +38,8 @@ | |||
<available file="../checkstyle" property="checkstyle.available"/> | |||
<mkdir dir="${bin.dir}"/> | |||
<mkdir dir="${distlib.dir}"/> | |||
<copy todir="${distlib.dir}"> | |||
<fileset dir="${lib.dir}"/> | |||
<copy todir="${distlib.dir}/parser"> | |||
<fileset dir="${lib.dir}/parser"/> | |||
</copy> | |||
</target> | |||
@@ -130,6 +130,7 @@ | |||
<antcall target="build-lib" inheritall="false"> | |||
<param name="libset" value="system"/> | |||
</antcall> | |||
<ant antfile="script.xml" inheritAll="false"/> | |||
</target> | |||
<target name="build-lib"> | |||
@@ -139,10 +140,10 @@ | |||
<path refid="classpath.common"/> | |||
<pathelement location="${distlib.dir}/common/common.jar"/> | |||
</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"/> | |||
</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"/> | |||
</javac> | |||
<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 initConfig the Ant initialization configuration | |||
* @param libraries the collection of libraries already configured | |||
* @param libPathsMap a map of lists of library patsh fro each library | |||
* @exception ExecutionException if a library cannot be configured from | |||
* the given specification | |||
*/ | |||
public void configLibraries(InitConfig initConfig, Map librarySpecs, | |||
Map libraries) | |||
Map libraries, Map libPathsMap) | |||
throws ExecutionException { | |||
// check if any already defined | |||
@@ -174,7 +175,7 @@ public class AntLibManager { | |||
String libraryId = (String)i.next(); | |||
if (!libraries.containsKey(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 | |||
* formed | |||
*/ | |||
public void loadLib(Map librarySpecs, String libLocationString) | |||
public void loadLibs(Map librarySpecs, String libLocationString) | |||
throws ExecutionException, MalformedURLException { | |||
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. | |||
* | |||
@@ -223,12 +242,13 @@ public class AntLibManager { | |||
* dependencies. | |||
* @param libraries the collection of libraries which have already been | |||
* configured | |||
* @param libPathsMap a map of lists of library patsh fro each library | |||
* @exception ExecutionException if the library cannot be configured. | |||
*/ | |||
private void configLibrary(InitConfig initConfig, Map librarySpecs, | |||
String libraryId, | |||
CircularDependencyChecker configuring, | |||
Map libraries) | |||
Map libraries, Map libPathsMap) | |||
throws ExecutionException { | |||
try { | |||
@@ -245,7 +265,7 @@ public class AntLibManager { | |||
+ libraryId + " depends"); | |||
} | |||
configLibrary(initConfig, librarySpecs, extendsId, | |||
configuring, libraries); | |||
configuring, libraries, libPathsMap); | |||
} | |||
} | |||
@@ -265,8 +285,8 @@ public class AntLibManager { | |||
urlsList.add(initConfig.getToolsJarURL()); | |||
} | |||
URL[] parserURLs = initConfig.getParserURLs(); | |||
if (librarySpec.usesAntXML()) { | |||
URL[] parserURLs = initConfig.getParserURLs(); | |||
for (int i = 0; i < parserURLs.length; ++i) { | |||
urlsList.add(parserURLs[i]); | |||
} | |||
@@ -282,12 +302,22 @@ public class AntLibManager { | |||
} | |||
antLibrary.setParentLoader(initConfig.getCommonLoader()); | |||
libraries.put(libraryId, antLibrary); | |||
List libPaths = (List)libPathsMap.get(libraryId); | |||
if (libPaths != null) { | |||
for (Iterator j = libPaths.iterator(); j.hasNext(); ) { | |||
URL pathURL = (URL)j.next(); | |||
addLibPath(antLibrary, pathURL); | |||
} | |||
} | |||
configuring.leaveNode(libraryId); | |||
} catch (CircularDependencyException e) { | |||
throw new ExecutionException(e); | |||
} | |||
} | |||
/** | |||
* Read an Ant library definition from a URL | |||
* | |||
@@ -69,9 +69,6 @@ import org.apache.ant.common.util.ExecutionException; | |||
* @created 14 January 2002 | |||
*/ | |||
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 | |||
* 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) { | |||
int dynamicId = 0; | |||
synchronized (DynamicLibrary.class) { | |||
dynamicId = dynamicIdCounter++; | |||
dynamicId = dynamicIdCounter; | |||
dynamicIdCounter++; | |||
} | |||
this.libraryId = DYNAMIC_LIB_PREFIX + dynamicId; | |||
this.loader = loader; | |||
@@ -142,6 +142,18 @@ public class AntConfig { | |||
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 | |||
* | |||
@@ -191,13 +191,13 @@ public class BuildEventSupport { | |||
/** | |||
* 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 priority the priority of the message | |||
*/ | |||
public void fireMessageLogged(ModelElement element, | |||
public void fireMessageLogged(Object source, | |||
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(); ) { | |||
BuildListener listener = (BuildListener)i.next(); | |||
listener.messageLogged(event); | |||
@@ -53,9 +53,14 @@ | |||
*/ | |||
package org.apache.ant.antcore.execution; | |||
import java.net.MalformedURLException; | |||
import java.net.URL; | |||
import java.util.ArrayList; | |||
import java.util.HashMap; | |||
import java.util.HashSet; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.Set; | |||
import org.apache.ant.antcore.antlib.AntLibDefinition; | |||
import org.apache.ant.antcore.antlib.AntLibManager; | |||
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.Converter; | |||
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.util.ExecutionException; | |||
@@ -84,6 +90,9 @@ public class ComponentManager implements ComponentService { | |||
*/ | |||
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 */ | |||
private Map libFactories = new HashMap(); | |||
@@ -105,18 +114,27 @@ public class ComponentManager implements ComponentService { | |||
/** The definitions which have been imported into this frame. */ | |||
private Map definitions = new HashMap(); | |||
/** | |||
* This map stores a list of additional paths for each library indexed | |||
* by the libraryId | |||
*/ | |||
private Map libPathsMap; | |||
/** | |||
* Constructor | |||
* | |||
* @param frame the frame containing this context | |||
* @param allowRemoteLibs true if remote libraries can be loaded though | |||
* this service. | |||
* @param configLibPaths the additional library paths specified in the | |||
* configuration | |||
*/ | |||
protected ComponentManager(Frame frame, | |||
boolean allowRemoteLibs) { | |||
protected ComponentManager(Frame frame, boolean allowRemoteLibs, | |||
Map configLibPaths) { | |||
this.frame = frame; | |||
libManager = new AntLibManager(allowRemoteLibs); | |||
dynamicLibraries = new HashMap(); | |||
libPathsMap = new HashMap(configLibPaths); | |||
} | |||
/** | |||
@@ -132,9 +150,9 @@ public class ComponentManager implements ComponentService { | |||
throws ExecutionException { | |||
try { | |||
Map librarySpecs = new HashMap(); | |||
libManager.loadLib(librarySpecs, libLocation); | |||
libManager.loadLibs(librarySpecs, libLocation); | |||
libManager.configLibraries(frame.getInitConfig(), librarySpecs, | |||
antLibraries); | |||
antLibraries, libPathsMap); | |||
if (importAll) { | |||
Iterator i = librarySpecs.keySet().iterator(); | |||
@@ -183,6 +201,72 @@ public class ComponentManager implements ComponentService { | |||
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 | |||
* build files) to be used in this component manager | |||
@@ -252,25 +336,6 @@ public class ComponentManager implements ComponentService { | |||
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 | |||
* | |||
@@ -287,6 +352,9 @@ public class ComponentManager implements ComponentService { | |||
} | |||
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)); | |||
} | |||
@@ -313,6 +381,7 @@ public class ComponentManager implements ComponentService { | |||
importLibraryDef(dynamicLibrary, componentName, null); | |||
} | |||
/** | |||
* Add the converters from the given library to those managed by this | |||
* frame. | |||
@@ -323,7 +392,8 @@ public class ComponentManager implements ComponentService { | |||
*/ | |||
private void addLibraryConverters(AntLibrary library) | |||
throws ExecutionException { | |||
if (!library.hasConverters()) { | |||
if (!library.hasConverters() | |||
|| loadedConverters.contains(library.getLibraryId())) { | |||
return; | |||
} | |||
@@ -351,6 +421,7 @@ public class ComponentManager implements ComponentService { | |||
converters.put(converterTypes[j], converter); | |||
} | |||
} | |||
loadedConverters.add(library.getLibraryId()); | |||
} catch (ClassNotFoundException e) { | |||
throw new ExecutionException("In Ant library \"" | |||
+ 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 | |||
*/ | |||
public void log(String message, int level) { | |||
ModelElement source = modelElement; | |||
if (modelElement == null) { | |||
Object source = modelElement; | |||
if (source == null) { | |||
source = frame.getProject(); | |||
if (source == null) { | |||
source = frame; | |||
} | |||
} | |||
eventSupport.fireMessageLogged(source, message, level); | |||
} | |||
@@ -59,7 +59,6 @@ import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import org.apache.ant.antcore.antlib.AntLibManager; | |||
import org.apache.ant.antcore.antlib.AntLibrary; | |||
import org.apache.ant.antcore.config.AntConfig; | |||
import org.apache.ant.common.event.BuildListener; | |||
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 | |||
* 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> | |||
* @created 12 January 2002 | |||
@@ -112,7 +111,15 @@ public class ExecutionManager { | |||
throws ExecutionException { | |||
this.config = config; | |||
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); | |||
try { | |||
// start by loading the task libraries | |||
@@ -123,20 +130,19 @@ public class ExecutionManager { | |||
= new AntLibManager(config.isRemoteLibAllowed()); | |||
libManager.addAntLibraries(librarySpecs, standardLibsURL); | |||
libManager.configLibraries(initConfig, librarySpecs, antLibraries); | |||
libManager.configLibraries(initConfig, librarySpecs, antLibraries, | |||
config.getLibraryPathsMap()); | |||
librarySpecs.clear(); | |||
// add any additional libraries. | |||
for (Iterator i = config.getLibraryLocations(); i.hasNext(); ) { | |||
// try file first | |||
String libLocation = (String)i.next(); | |||
libManager.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) { | |||
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. | |||
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.setInitialProperties(commandProperties); | |||
@@ -178,7 +190,9 @@ public class ExecutionManager { | |||
*/ | |||
public void addBuildListener(BuildListener 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) { | |||
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.config.AntConfig; | |||
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.Task; | |||
import org.apache.ant.common.antlib.TaskContainer; | |||
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.Project; | |||
import org.apache.ant.common.model.Target; | |||
import org.apache.ant.common.service.ComponentService; | |||
import org.apache.ant.common.service.DataService; | |||
import org.apache.ant.common.service.FileService; | |||
import org.apache.ant.common.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.util.AntException; | |||
import org.apache.ant.common.util.ConfigException; | |||
import org.apache.ant.common.util.ExecutionException; | |||
import org.apache.ant.common.util.FileUtils; | |||
import org.apache.ant.common.util.MessageLevel; | |||
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> | |||
* @created 14 January 2002 | |||
@@ -105,7 +106,7 @@ public class Frame { | |||
private Map referencedFrames = new HashMap(); | |||
/** 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 | |||
@@ -165,7 +166,7 @@ public class Frame { | |||
* imported | |||
*/ | |||
protected Frame(Map standardLibs, InitConfig initConfig, | |||
AntConfig config) throws ExecutionException { | |||
AntConfig config) throws ExecutionException { | |||
this.standardLibs = standardLibs; | |||
this.config = config; | |||
this.initConfig = initConfig; | |||
@@ -202,7 +203,6 @@ public class Frame { | |||
= project.getReferencedProject(referenceName); | |||
Frame referencedFrame = createFrame(referencedProject); | |||
referencedFrames.put(referenceName, referencedFrame); | |||
} | |||
configureServices(); | |||
@@ -359,8 +359,8 @@ public class Frame { | |||
* Get a referenced frame by its reference name | |||
* | |||
* @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) { | |||
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 | |||
* @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() { | |||
// create services and make them available in our services map | |||
fileService = new CoreFileService(this); | |||
componentManager | |||
= new ComponentManager(this, config.isRemoteLibAllowed()); | |||
componentManager = new ComponentManager(this, | |||
config.isRemoteLibAllowed(), config.getLibraryPathsMap()); | |||
dataService = new CoreDataService(this, | |||
config.isUnsetPropertiesAllowed()); | |||
services.put(FileService.class, fileService); | |||
services.put(ComponentService.class, componentManager); | |||
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)); | |||
} | |||
@@ -784,27 +790,27 @@ public class Frame { | |||
BuildElement model) | |||
throws ExecutionException { | |||
Reflector reflector = getReflector(element.getClass()); | |||
Setter setter = getSetter(element.getClass()); | |||
// start by setting the attributes of this element | |||
for (Iterator i = model.getAttributeNames(); i.hasNext(); ) { | |||
String attributeName = (String)i.next(); | |||
String attributeValue = model.getAttributeValue(attributeName); | |||
if (!reflector.supportsAttribute(attributeName)) { | |||
if (!setter.supportsAttribute(attributeName)) { | |||
throw new ExecutionException(model.getType() | |||
+ " does not support the \"" + attributeName | |||
+ "\" attribute", model.getLocation()); | |||
} | |||
reflector.setAttribute(element, attributeName, | |||
setter.setAttribute(element, attributeName, | |||
dataService.replacePropertyRefs(attributeValue)); | |||
} | |||
String modelText = model.getText().trim(); | |||
if (modelText.length() != 0) { | |||
if (!reflector.supportsText()) { | |||
if (!setter.supportsText()) { | |||
throw new ExecutionException(model.getType() | |||
+ " does not support content", model.getLocation()); | |||
} | |||
reflector.addText(element, | |||
setter.addText(element, | |||
dataService.replacePropertyRefs(modelText)); | |||
} | |||
@@ -817,7 +823,7 @@ public class Frame { | |||
if (element instanceof TaskContainer | |||
&& info != null | |||
&& info.getDefinitionType() == AntLibrary.TASKDEF | |||
&& !reflector.supportsNestedElement(nestedElementName)) { | |||
&& !setter.supportsNestedElement(nestedElementName)) { | |||
// it is a nested task | |||
TaskContext nestedContext | |||
= configureTask(nestedElementModel); | |||
@@ -826,11 +832,11 @@ public class Frame { | |||
// method of executing tasks | |||
container.addTask(nestedContext.getTask()); | |||
} else { | |||
if (reflector.supportsNestedAdder(nestedElementName)) { | |||
addNestedElement(factory, reflector, element, | |||
if (setter.supportsNestedAdder(nestedElementName)) { | |||
addNestedElement(factory, setter, element, | |||
nestedElementModel); | |||
} else if (reflector.supportsNestedCreator(nestedElementName)) { | |||
createNestedElement(factory, reflector, element, | |||
} else if (setter.supportsNestedCreator(nestedElementName)) { | |||
createNestedElement(factory, setter, element, | |||
nestedElementModel); | |||
} else { | |||
throw new ExecutionException(model.getType() | |||
@@ -846,7 +852,7 @@ public class Frame { | |||
/** | |||
* 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 | |||
* required. | |||
* @param model the build model for the nestd element | |||
@@ -855,7 +861,7 @@ public class Frame { | |||
* @exception ExecutionException if the nested element cannot be | |||
* created. | |||
*/ | |||
private void createNestedElement(AntLibFactory factory, Reflector reflector, | |||
private void createNestedElement(AntLibFactory factory, Setter setter, | |||
Object element, BuildElement model) | |||
throws ExecutionException { | |||
log("The use of create methods is deprecated - class: " | |||
@@ -864,7 +870,7 @@ public class Frame { | |||
String nestedElementName = model.getType(); | |||
try { | |||
Object nestedElement | |||
= reflector.createElement(element, nestedElementName); | |||
= setter.createElement(element, nestedElementName); | |||
factory.registerCreatedElement(nestedElement); | |||
if (nestedElement instanceof ExecutionComponent) { | |||
ExecutionComponent component | |||
@@ -891,7 +897,7 @@ public class Frame { | |||
/** | |||
* 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 | |||
* be created | |||
* @param model the model of the nested element | |||
@@ -899,12 +905,12 @@ public class Frame { | |||
* which the attribute is to be added. | |||
* @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) | |||
throws ExecutionException { | |||
String nestedElementName = model.getType(); | |||
Class nestedType = reflector.getType(nestedElementName); | |||
Class nestedType = setter.getType(nestedElementName); | |||
// is there a polymorph indicator - look in Ant aspects | |||
String typeName = model.getAspectValue(ANT_ASPECT, "type"); | |||
@@ -947,7 +953,7 @@ public class Frame { | |||
model.getLocation()); | |||
} | |||
typeInstance = createTypeInstance(nestedType, factory, model); | |||
typeInstance = createTypeInstance(nestedType, factory, model, null); | |||
} | |||
// is the typeInstance compatible with the type expected | |||
@@ -965,7 +971,7 @@ public class Frame { | |||
model.getLocation()); | |||
} | |||
} | |||
reflector.addElement(element, nestedElementName, typeInstance); | |||
setter.addElement(element, nestedElementName, typeInstance); | |||
} | |||
@@ -989,8 +995,9 @@ public class Frame { | |||
} | |||
String className = taskDefInfo.getClassName(); | |||
ComponentLibrary componentLibrary | |||
= taskDefInfo.getComponentLibrary(); | |||
ComponentLibrary componentLibrary | |||
= taskDefInfo.getComponentLibrary(); | |||
String localName = taskDefInfo.getLocalName(); | |||
try { | |||
ClassLoader taskClassLoader = componentLibrary.getClassLoader(); | |||
@@ -998,7 +1005,8 @@ public class Frame { | |||
= Class.forName(className, true, taskClassLoader); | |||
AntLibFactory libFactory | |||
= componentManager.getLibFactory(componentLibrary); | |||
Object element = libFactory.createTaskInstance(elementClass); | |||
Object element | |||
= libFactory.createTaskInstance(elementClass, localName); | |||
Task task = null; | |||
if (element instanceof Task) { | |||
@@ -1062,8 +1070,9 @@ public class Frame { | |||
} | |||
String className = typeDefInfo.getClassName(); | |||
ComponentLibrary componentLibrary | |||
= typeDefInfo.getComponentLibrary(); | |||
ComponentLibrary componentLibrary | |||
= typeDefInfo.getComponentLibrary(); | |||
String localName = typeDefInfo.getLocalName(); | |||
try { | |||
ClassLoader typeClassLoader = componentLibrary.getClassLoader(); | |||
@@ -1074,7 +1083,7 @@ public class Frame { | |||
AntLibFactory libFactory | |||
= componentManager.getLibFactory(componentLibrary); | |||
Object typeInstance | |||
= createTypeInstance(typeClass, libFactory, model); | |||
= createTypeInstance(typeClass, libFactory, model, localName); | |||
setContextLoader(currentLoader); | |||
return typeInstance; | |||
@@ -1095,15 +1104,17 @@ public class Frame { | |||
* @param model the model describing the required configuration of the | |||
* instance | |||
* @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 | |||
* @exception ExecutionException if there is a problem creating the type | |||
* instance | |||
*/ | |||
private Object createTypeInstance(Class typeClass, AntLibFactory libFactory, | |||
BuildElement model) | |||
BuildElement model, String localName) | |||
throws ExecutionException { | |||
try { | |||
Object typeInstance = libFactory.createTypeInstance(typeClass); | |||
Object typeInstance | |||
= libFactory.createTypeInstance(typeClass, localName); | |||
if (typeInstance instanceof ExecutionComponent) { | |||
ExecutionComponent component = (ExecutionComponent)typeInstance; | |||
@@ -107,5 +107,14 @@ public class ImportInfo { | |||
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> | |||
* @created 19 January 2002 | |||
*/ | |||
public class Reflector { | |||
public class Reflector implements Setter { | |||
/** | |||
* 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.FileService; | |||
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.tools.ant.types.FilterSet; | |||
import org.apache.tools.ant.types.FilterSetCollection; | |||
@@ -199,6 +199,14 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||
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 | |||
* 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" | |||
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="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="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; | |||
} | |||
/** | |||
* 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 | |||
@@ -136,10 +148,6 @@ public class LoadLib extends AbstractTask { | |||
* loaded. | |||
*/ | |||
public void execute() throws ExecutionException { | |||
if (url == null) { | |||
throw new ExecutionException("A location from which to load " | |||
+ "libraries must be provided"); | |||
} | |||
AntContext context = getContext(); | |||
ComponentService componentService = (ComponentService) | |||
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.ConfigException; | |||
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.InitUtils; | |||
@@ -234,7 +234,8 @@ public class Commandline { | |||
* Get an option value | |||
* | |||
* @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 | |||
* @return the value of the option | |||
* @exception ConfigException if the option cannot be read | |||
@@ -262,6 +263,7 @@ public class Commandline { | |||
this.initConfig = initConfig; | |||
try { | |||
parseArguments(args); | |||
determineBuildFile(); | |||
AntConfig config = new AntConfig(); | |||
AntConfig userConfig = getAntConfig(initConfig.getUserConfigArea()); | |||
@@ -293,6 +295,7 @@ public class Commandline { | |||
ExecutionManager executionManager | |||
= new ExecutionManager(initConfig, config); | |||
addBuildListeners(executionManager); | |||
executionManager.init(); | |||
executionManager.runBuild(project, targets, definedProperties); | |||
} catch (Throwable t) { | |||
if (t instanceof AntException) { | |||
@@ -332,6 +335,79 @@ public class Commandline { | |||
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. | |||
@@ -349,30 +425,9 @@ public class Commandline { | |||
if (arg.equals("-buildfile") || arg.equals("-file") | |||
|| 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")) { | |||
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")) { | |||
messageOutputLevel = MessageLevel.MSG_WARN; | |||
} else if (arg.equals("-verbose") || arg.equals("-v")) { | |||
@@ -386,12 +441,7 @@ public class Commandline { | |||
} else if (arg.equals("-listener")) { | |||
listeners.add(getOption(args, i++, arg)); | |||
} 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")) { | |||
String name = arg.substring(2, arg.length()); | |||
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.util.AntException; | |||
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 | |||
@@ -235,20 +235,22 @@ public class DefaultLogger implements BuildLogger { | |||
= event.getPriority() == MessageLevel.MSG_ERR ? err : out; | |||
// Filter out messages based on priority | |||
if (event.getPriority() <= messageOutputLevel | |||
&& event.getModelElement() instanceof BuildElement) { | |||
// Print out the name of the task if we're in one | |||
BuildElement buildElement | |||
= (BuildElement)event.getModelElement(); | |||
String name = buildElement.getType(); | |||
if (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 | |||
@@ -68,12 +68,14 @@ public interface AntLibFactory { | |||
* Create an instance of the given type class | |||
* | |||
* @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 | |||
* @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 type | |||
*/ | |||
Object createTypeInstance(Class typeClass) | |||
Object createTypeInstance(Class typeClass, String localName) | |||
throws InstantiationException, IllegalAccessException, | |||
ExecutionException; | |||
@@ -89,12 +91,14 @@ public interface AntLibFactory { | |||
* 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 under 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 | |||
*/ | |||
Object createTaskInstance(Class taskClass) | |||
Object createTaskInstance(Class taskClass, String localName) | |||
throws InstantiationException, IllegalAccessException, | |||
ExecutionException; | |||
@@ -51,24 +51,38 @@ | |||
* 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; | |||
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> | |||
* @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 | |||
*/ | |||
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 | |||
* | |||
* @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 | |||
* @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) | |||
public Object createTaskInstance(Class taskClass, String localName) | |||
throws InstantiationException, IllegalAccessException, | |||
ExecutionException { | |||
return taskClass.newInstance(); | |||
@@ -81,12 +86,14 @@ public class StandardLibFactory implements AntLibFactory { | |||
* Create an instance of the given type class | |||
* | |||
* @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 | |||
* @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 type | |||
*/ | |||
public Object createTypeInstance(Class typeClass) | |||
public Object createTypeInstance(Class typeClass, String localName) | |||
throws InstantiationException, IllegalAccessException, | |||
ExecutionException { | |||
return typeClass.newInstance(); | |||
@@ -99,7 +106,7 @@ public class StandardLibFactory implements AntLibFactory { | |||
* @exception ExecutionException if the factory cannot be initialized | |||
*/ | |||
public void init(AntContext context) throws ExecutionException { | |||
// do nothing | |||
this.context = context; | |||
} | |||
/** | |||
@@ -132,5 +139,14 @@ public class StandardLibFactory implements AntLibFactory { | |||
// 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 priority the message priority | |||
*/ | |||
public BuildEvent(ModelElement source, String message, | |||
public BuildEvent(Object source, String message, | |||
int priority) { | |||
this(source, MESSAGE); | |||
super(source); | |||
this.eventType = MESSAGE; | |||
this.message = message; | |||
this.messagePriority = priority; | |||
} | |||
@@ -175,7 +176,12 @@ public class BuildEvent extends EventObject { | |||
* @return the model element this event is associated with | |||
*/ | |||
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 | |||
* <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. |
@@ -52,6 +52,7 @@ | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.common.service; | |||
import java.net.URL; | |||
import org.apache.ant.common.antlib.AntLibFactory; | |||
import org.apache.ant.common.util.ExecutionException; | |||
@@ -82,11 +83,23 @@ public interface ComponentService { | |||
void loadLib(String libLocation, boolean importAll) | |||
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 | |||
* | |||
* @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 className the name of the class implementing the type | |||
* @exception ExecutionException if the type cannot be defined | |||
@@ -99,7 +112,8 @@ public interface ComponentService { | |||
* Experimental - define a new task | |||
* | |||
* @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 className the name of the class implementing the task | |||
* @exception ExecutionException if the task cannot be defined | |||
@@ -108,5 +122,28 @@ public interface ComponentService { | |||
String taskName, String className) | |||
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; | |||
} | |||