peterreilly 2003/08/13 06:18:54 Modified: src/main/org/apache/tools/ant ComponentHelper.java ProjectHelper.java RuntimeConfigurable.java UnknownElement.java src/main/org/apache/tools/ant/helper AntXMLContext.java ProjectHelper2.java src/main/org/apache/tools/ant/taskdefs Antlib.java Definer.java Added: src/main/org/apache/tools/ant/taskdefs AntlibInterface.java DefBase.java Log: Add ns support Also split Definer.java in a base class (DefBase) to allow it to be used for other defining tasks Also add AntlibInterface to allow antlib to set uri and classloader for other tasks/types that Definer. Bugzilla: 19897 Revision Changes Path 1.21 +106 -14 ant/src/main/org/apache/tools/ant/ComponentHelper.java Index: ComponentHelper.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/ComponentHelper.java,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- ComponentHelper.java 12 Aug 2003 15:15:06 -0000 1.20 +++ ComponentHelper.java 13 Aug 2003 13:18:54 -0000 1.21 @@ -58,14 +58,19 @@ import java.util.Enumeration; import java.util.Hashtable; +import java.util.HashSet; import java.util.Iterator; import java.util.Properties; +import java.util.Set; +import java.util.Stack; import java.util.Vector; import java.io.InputStream; import java.io.IOException; import java.lang.reflect.Modifier; +import org.apache.tools.ant.taskdefs.Typedef; + /** * Component creation and configuration. * @@ -98,6 +103,17 @@ /** flag to rebuild typeClassDefinitions */ private boolean rebuildTypeClassDefinitions = true; + /** Set of namespaces that have been checked for antlibs */ + private Set checkedNamespaces = new HashSet(); + + /** + * Stack of antlib contexts used to resolve definitions while + * processing antlib + */ + private Stack antLibStack = new Stack(); + /** current antlib context */ + private AntTypeTable antLibTypeTable = null; + /** * Map from task names to vectors of created tasks * (String to Vector of Task). This is used to invalidate tasks if @@ -175,32 +191,38 @@ AntTypeDefinition def = (AntTypeDefinition) i.next(); antTypeTable.put(def.getName(), def); } + // add the parsed namespaces of the parent project + checkedNamespaces.add(helper.checkedNamespaces); } /** Factory method to create the components. * * This should be called by UnknownElement. * - * @param ue The component helper has access via ue to the entire XML tree. - * @param ns Namespace. Also available as ue.getNamespace() - * @param taskName The element name. Also available as ue.getTag() + * @param ue The Unknown Element creating this component + * @param ns Namespace URI. Also available as ue.getNamespace() + * @param componentType The component type, + * Also available as ue.getComponentName() * @return the created component * @throws BuildException if an error occuries */ public Object createComponent(UnknownElement ue, String ns, - String taskName) + String componentType) throws BuildException { - Object component = createComponent(taskName); + Object component = createComponent(componentType); if (component == null) { return null; } if (component instanceof Task) { Task task = (Task) component; - task.setTaskType(taskName); - task.setTaskName(taskName); - addCreatedTask(taskName, task); + task.setLocation(ue.getLocation()); + task.setTaskType(componentType); + task.setTaskName(ue.getTaskName()); + task.setOwningTarget(ue.getOwningTarget()); + task.init(); + addCreatedTask(componentType, task); } return component; @@ -215,7 +237,11 @@ * @return the class if found or null if not. */ public Object createComponent(String componentName) { - return antTypeTable.create(componentName); + AntTypeDefinition def = getDefinition(componentName); + if (def == null) { + return null; + } + return def.create(project); } /** @@ -227,7 +253,11 @@ * @return the class if found or null if not. */ public Class getComponentClass(String componentName) { - return antTypeTable.getExposedClass(componentName); + AntTypeDefinition def = getDefinition(componentName); + if (def == null) { + return null; + } + return def.getExposedClass(project); } /** @@ -236,7 +266,15 @@ * @return the ant definition or null if not present */ public AntTypeDefinition getDefinition(String componentName) { - return antTypeTable.getDefinition(componentName); + checkNamespace(componentName); + AntTypeDefinition ret = null; + if (antLibTypeTable != null && componentName.indexOf(':') == -1) { + ret = antLibTypeTable.getDefinition(componentName); + } + if (ret == null) { + ret = antTypeTable.getDefinition(componentName); + } + return ret; } /** @@ -474,7 +512,7 @@ * creation fails. */ private Task createNewTask(String taskType) throws BuildException { - Class c = antTypeTable.getExposedClass(taskType); + Class c = getComponentClass(taskType); if (c == null) { return null; } @@ -482,7 +520,7 @@ if (!(Task.class.isAssignableFrom(c))) { return null; } - Task task = (Task) antTypeTable.create(taskType); + Task task = (Task) createComponent(taskType); if (task == null) { return null; } @@ -557,7 +595,7 @@ * instance creation fails. */ public Object createDataType(String typeName) throws BuildException { - return antTypeTable.create(typeName); + return createComponent(typeName); } /** @@ -660,6 +698,31 @@ project.log(" +Datatype " + name + " " + def.getClassName(), Project.MSG_DEBUG); antTypeTable.put(name, def); + + if (antLibTypeTable != null && name.lastIndexOf(':') != -1) { + String baseName = name.substring(name.lastIndexOf(':') + 1); + antLibTypeTable.put(baseName, def); + } + } + } + + /** + * Called at the start of processing an antlib + */ + public void enterAntLib() { + antLibTypeTable = new AntTypeTable(project); + antLibStack.push(antLibTypeTable); + } + + /** + * Called at the end of processing an antlib + */ + public void exitAntLib() { + antLibStack.pop(); + if (antLibStack.size() != 0) { + antLibTypeTable = (AntTypeTable) antLibStack.peek(); + } else { + antLibTypeTable = null; } } @@ -749,6 +812,35 @@ } } } + } + + /** + * called for each component name, check if the + * associated URI has been examined for antlibs. + */ + private void checkNamespace(String componentName) { + if (componentName.indexOf(':') == -1) { + return; // not a namespaced name + } + + String uri = ProjectHelper.extractUriFromComponentName(componentName); + if (!uri.startsWith(ProjectHelper.ANTLIB_URI)) { + return; // namespace that does not contain antlib + } + if (checkedNamespaces.contains(uri)) { + return; // Alreay processed + } + checkedNamespaces.add(uri); + Typedef definer = new Typedef(); + definer.setProject(project); + definer.setURI(uri); + definer.setResource( + uri.substring("antlib:".length()).replace('.', '/') + + "/antlib.xml"); + // a fishing expedition :- ignore errors if antlib not present + definer.setOnError(new Typedef.OnError("ignore")); + definer.init(); + definer.execute(); } /** 1.99 +35 -0 ant/src/main/org/apache/tools/ant/ProjectHelper.java Index: ProjectHelper.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/ProjectHelper.java,v retrieving revision 1.98 retrieving revision 1.99 diff -u -r1.98 -r1.99 --- ProjectHelper.java 18 Jul 2003 12:45:54 -0000 1.98 +++ ProjectHelper.java 13 Aug 2003 13:18:54 -0000 1.99 @@ -85,6 +85,12 @@ * @author [EMAIL PROTECTED] */ public class ProjectHelper { + /** The URI for ant name space */ + public static final String ANT_CORE_URI = "ant:core"; + + /** The URI for defined types/tasks - the format is antlib:<package> */ + public static final String ANTLIB_URI = "antlib:"; + /** * Name of JVM system property which provides the name of the * ProjectHelper class to use. @@ -492,6 +498,35 @@ throws BuildException { PropertyHelper.parsePropertyStringDefault(value, fragments, propertyRefs); + } + /** + * Map a namespaced {uri,name} to an internal string format. + * For BC purposes the names from the ant core uri will be + * mapped to "name", other names will be mapped to + * uri + ":" + name. + * @param uri The namepace URI + * @param name The localname + * @return The stringified form of the ns name + */ + public static String genComponentName(String uri, String name) { + if (uri == null || uri.equals("") || uri.equals(ANT_CORE_URI)) { + return name; + } + return uri + ":" + name; + } + + /** + * extract a uri from a component name + * + * @param componentName The stringified form for {uri, name} + * @return The uri or "" if not present + */ + public static String extractUriFromComponentName(String componentName) { + int index = componentName.lastIndexOf(':'); + if (index == -1) { + return ""; + } + return componentName.substring(0, index); } //end class } 1.43 +10 -2 ant/src/main/org/apache/tools/ant/RuntimeConfigurable.java Index: RuntimeConfigurable.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/RuntimeConfigurable.java,v retrieving revision 1.42 retrieving revision 1.43 diff -u -r1.42 -r1.43 --- RuntimeConfigurable.java 25 Jul 2003 08:37:50 -0000 1.42 +++ RuntimeConfigurable.java 13 Aug 2003 13:18:54 -0000 1.43 @@ -177,6 +177,14 @@ } /** + * set the polymorphic type for this element + * @param polyType the ant component type name, null if not set + */ + public void setPolyType(String polyType) { + this.polyType = polyType; + } + + /** * Sets the attributes for the wrapped element. * * @deprecated @@ -260,10 +268,10 @@ /** * Returns an enumeration of all child wrappers. - * + * @return an enumeration of the child wrappers. * @since Ant 1.5.1 */ - Enumeration getChildren() { + public Enumeration getChildren() { if (children != null) { return Collections.enumeration(children); } else { 1.60 +39 -4 ant/src/main/org/apache/tools/ant/UnknownElement.java Index: UnknownElement.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/UnknownElement.java,v retrieving revision 1.59 retrieving revision 1.60 diff -u -r1.59 -r1.60 --- UnknownElement.java 25 Jul 2003 08:37:50 -0000 1.59 +++ UnknownElement.java 13 Aug 2003 13:18:54 -0000 1.60 @@ -82,6 +82,11 @@ private String namespace; /** + * Holds the namespace qname of the element. + */ + private String qname; + + /** * The real object after it has been loaded. */ private Object realThing; @@ -129,6 +134,24 @@ this.namespace = namespace; } + /** Return the qname of the XML element associated with this component. + * + * @return namespace Qname used in the element declaration. + */ + public String getQName() { + return qname; + } + + /** Set the namespace qname of the XML element. + * This method is typically called by the XML processor. + * + * @param qname the qualified name of the element + */ + public void setQName(String qname) { + this.qname = qname; + } + + /** * Get the RuntimeConfigurable instance for this UnknownElement, containing * the configuration information. @@ -335,6 +358,13 @@ } /** + * @return the component name - uses ProjectHelper#genComponentName() + */ + protected String getComponentName() { + return ProjectHelper.genComponentName(getNamespace(), getTag()); + } + + /** * Creates a named task or data type. If the real object is a task, * it is configured up to the init() stage. * @@ -345,12 +375,17 @@ * @return the task or data type represented by the given unknown element. */ protected Object makeObject(UnknownElement ue, RuntimeConfigurable w) { - Object o = makeTask(ue, w); + ComponentHelper helper = ComponentHelper.getComponentHelper( + getProject()); + String name = ue.getComponentName(); + Object o = helper.createComponent(ue, ue.getNamespace(), name); if (o == null) { - o = getProject().createDataType(ue.getTag()); + throw getNotFoundException("task or type", name); } - if (o == null) { - throw getNotFoundException("task or type", ue.getTag()); + if (o instanceof Task) { + Task task = (Task) o; + task.setOwningTarget(getOwningTarget()); + task.init(); } return o; } 1.4 +54 -1 ant/src/main/org/apache/tools/ant/helper/AntXMLContext.java Index: AntXMLContext.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/helper/AntXMLContext.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- AntXMLContext.java 25 Jul 2003 18:42:54 -0000 1.3 +++ AntXMLContext.java 13 Aug 2003 13:18:54 -0000 1.4 @@ -54,6 +54,10 @@ package org.apache.tools.ant.helper; import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Vector; import org.xml.sax.Locator; @@ -120,6 +124,11 @@ * when processing a particular build file. */ private boolean ignoreProjectTag = false; + + /** Keeps track of prefix -> uri mapping during parsing */ + private Map prefixMapping = new HashMap(); + + /** * constructor * @param project the project to which this antxml context belongs to @@ -263,7 +272,7 @@ /** * sets the implicit target - * @param target + * @param target the implicit target */ public void setImplicitTarget(Target target) { this.implicitTarget = target; @@ -284,6 +293,8 @@ * <p> * This method was moved out of the configure method to allow * it to be executed at parse time. + * @param element the current element + * @param attr attributes of the current element */ public void configureId(Object element, Attributes attr) { String id = attr.getValue("id"); @@ -322,6 +333,48 @@ */ public void setIgnoreProjectTag(boolean flag) { this.ignoreProjectTag = flag; + } + + /** + * Called during parsing, stores the prefix to uri mapping. + * + * @param prefix a namespace prefix + * @param uri a namespace uri + */ + public void startPrefixMapping(String prefix, String uri) { + List list = (List) prefixMapping.get(prefix); + if (list == null) { + list = new ArrayList(); + prefixMapping.put(prefix, list); + } + list.add(uri); + } + + /** + * End of prefix to uri mapping. + * + * @param prefix the namespace prefix + */ + public void endPrefixMapping(String prefix) { + List list = (List) prefixMapping.get(prefix); + if (list == null || list.size() == 0) { + return; // Should not happen + } + list.remove(list.size() - 1); + } + + /** + * prefix to namespace uri mapping + * + * @param prefix the prefix to map + * @return the uri for this prefix, null if not present + */ + public String getPrefixMapping(String prefix) { + List list = (List) prefixMapping.get(prefix); + if (list == null || list.size() == 0) { + return null; + } + return (String) list.get(list.size() - 1); } } 1.29 +50 -7 ant/src/main/org/apache/tools/ant/helper/ProjectHelper2.java Index: ProjectHelper2.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/helper/ProjectHelper2.java,v retrieving revision 1.28 retrieving revision 1.29 diff -u -r1.28 -r1.29 --- ProjectHelper2.java 1 Aug 2003 05:52:31 -0000 1.28 +++ ProjectHelper2.java 13 Aug 2003 13:18:54 -0000 1.29 @@ -474,6 +474,9 @@ */ public void startElement(String uri, String tag, String qname, Attributes attrs) throws SAXParseException { + if (uri.equals(ANT_CORE_URI)) { + uri = ""; + } AntHandler next = currentHandler.onStartChild(uri, tag, qname, attrs, context); antHandlers.push(currentHandler); @@ -506,6 +509,9 @@ * */ public void endElement(String uri, String name, String qName) throws SAXException { + if (uri.equals(ANT_CORE_URI)) { + uri = ""; + } currentHandler.onEndElement(uri, name, context); AntHandler prev = (AntHandler) antHandlers.pop(); currentHandler = prev; @@ -526,6 +532,25 @@ throws SAXParseException { currentHandler.characters(buf, start, count, context); } + + /** + * Start a namespace prefix to uri mapping + * + * @param prefix the namespace prefix + * @param uri the namespace uri + */ + public void startPrefixMapping(String prefix, String uri) { + context.startPrefixMapping(prefix, uri); + } + + /** + * End a namepace prefix to uri mapping + * + * @param prefix the prefix that is not mapped anymore + */ + public void endPrefixMapping(String prefix) { + context.endPrefixMapping(prefix); + } } /** @@ -550,7 +575,7 @@ Attributes attrs, AntXMLContext context) throws SAXParseException { - if (qname.equals("project")) { + if (name.equals("project") && uri.equals("")) { return ProjectHelper2.projectHandler; } else { // if (context.importlevel > 0) { @@ -610,7 +635,7 @@ */ for (int i = 0; i < attrs.getLength(); i++) { - String key = attrs.getQName(i); + String key = attrs.getLocalName(i); String value = attrs.getValue(i); if (key.equals("default")) { @@ -715,7 +740,7 @@ Attributes attrs, AntXMLContext context) throws SAXParseException { - if (qname.equals("target")) { + if (name.equals("target") && uri.equals("")) { return ProjectHelper2.targetHandler; } else { return ProjectHelper2.elementHandler; @@ -761,7 +786,7 @@ context.addTarget(target); for (int i = 0; i < attrs.getLength(); i++) { - String key = attrs.getQName(i); + String key = attrs.getLocalName(i); String value = attrs.getValue(i); if (key.equals("name")) { @@ -904,7 +929,7 @@ task.setNamespace(uri); task.setProject(context.getProject()); //XXX task.setTaskType(qname); - + task.setQName(qname); task.setTaskName(qname); Location location = new Location(context.getLocator().getSystemId(), @@ -930,8 +955,26 @@ = new RuntimeConfigurable(task, task.getTaskName()); for (int i = 0; i < attrs.getLength(); i++) { - wrapper.setAttribute(attrs.getQName(i), - attrs.getValue(i)); + String name = attrs.getLocalName(i); + String value = attrs.getValue(i); + // PR: Hack for ant-type value + // an ant-type is a component name which can + // be namespaced, need to extract the name + // and convert from qualifed name to uri/name + if (name.equals("ant-type")) { + int index = value.indexOf(":"); + if (index != -1) { + String prefix = value.substring(0, index); + String mappedUri = context.getPrefixMapping(prefix); + if (mappedUri == null) { + throw new BuildException( + "Unable to find XML NS prefix " + prefix); + } + value = ProjectHelper.genComponentName( + mappedUri, value.substring(index + 1)); + } + } + wrapper.setAttribute(name, value); } if (parentWrapper != null) { 1.6 +31 -14 ant/src/main/org/apache/tools/ant/taskdefs/Antlib.java Index: Antlib.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Antlib.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- Antlib.java 1 Aug 2003 08:34:00 -0000 1.5 +++ Antlib.java 13 Aug 2003 13:18:54 -0000 1.6 @@ -62,7 +62,7 @@ import org.apache.tools.ant.TaskContainer; import org.apache.tools.ant.BuildException; -import org.apache.tools.ant.Location; +import org.apache.tools.ant.ComponentHelper; import org.apache.tools.ant.Project; import org.apache.tools.ant.Task; import org.apache.tools.ant.helper.ProjectHelper2; @@ -124,6 +124,7 @@ // private ClassLoader classLoader; private String prefix; + private String uri = ""; private List tasks = new ArrayList(); /** @@ -137,6 +138,14 @@ this.classLoader = classLoader; } + /** + * Set the URI for this antlib. + * @param uri the namespace uri + */ + protected void setURI(String uri) { + this.uri = uri; + } + private ClassLoader getClassLoader() { if (classLoader == null) { classLoader = Antlib.class.getClassLoader(); @@ -158,20 +167,28 @@ * any tasks that derive from Definer. */ public void execute() { - for (Iterator i = tasks.iterator(); i.hasNext();) { - UnknownElement ue = (UnknownElement) i.next(); - ue.maybeConfigure(); - setLocation(ue.getLocation()); - Task t = ue.getTask(); - if (t == null) { - continue; - } - if (t instanceof Definer) { - Definer d = (Definer) t; - d.setInternalClassLoader(getClassLoader()); + ComponentHelper helper = + ComponentHelper.getComponentHelper(getProject()); + helper.enterAntLib(); + try { + for (Iterator i = tasks.iterator(); i.hasNext();) { + UnknownElement ue = (UnknownElement) i.next(); + ue.maybeConfigure(); + setLocation(ue.getLocation()); + Task t = ue.getTask(); + if (t == null) { + continue; + } + if (t instanceof AntlibInterface) { + AntlibInterface d = (AntlibInterface) t; + d.setURI(uri); + d.setAntlibClassLoader(getClassLoader()); + } + t.init(); + t.execute(); } - t.init(); - t.execute(); + } finally { + helper.exitAntLib(); } } 1.41 +10 -131 ant/src/main/org/apache/tools/ant/taskdefs/Definer.java Index: Definer.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Definer.java,v retrieving revision 1.40 retrieving revision 1.41 diff -u -r1.40 -r1.41 --- Definer.java 1 Aug 2003 08:34:00 -0000 1.40 +++ Definer.java 13 Aug 2003 13:18:54 -0000 1.41 @@ -63,32 +63,29 @@ import java.util.Properties; import org.apache.tools.ant.AntTypeDefinition; -import org.apache.tools.ant.AntClassLoader; import org.apache.tools.ant.ComponentHelper; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Location; import org.apache.tools.ant.Project; -import org.apache.tools.ant.Task; -import org.apache.tools.ant.types.Path; -import org.apache.tools.ant.types.Reference; -import org.apache.tools.ant.util.ClasspathUtils; +import org.apache.tools.ant.ProjectHelper; import org.apache.tools.ant.types.EnumeratedAttribute; /** - * Base class for Taskdef and Typedef - does all the classpath - * handling and and class loading. + * Base class for Taskdef and Typedef - handles all + * the attributes for Typedef. The uri and class + * handling is handled by DefBase * * @author Costin Manolache * @author Stefan Bodewig + * @author Peter Reilly * * @since Ant 1.4 */ -public abstract class Definer extends Task { +public abstract class Definer extends DefBase { private String name; private String classname; private File file; private String resource; - private ClasspathUtils.Delegate cpDelegate; private int format = Format.PROPERTIES; private boolean definerSet = false; @@ -173,18 +170,6 @@ } /** - * @param reverseLoader if true a delegated loader will take precedence over - * the parent - * @deprecated stop using this attribute - * @ant.attribute ignore="true" - */ - public void setReverseLoader(boolean reverseLoader) { - this.cpDelegate.setReverseLoader(reverseLoader); - log("The reverseloader attribute is DEPRECATED. It will be removed", - Project.MSG_WARN); - } - - /** * @return the name for this definition */ public String getName() { @@ -192,13 +177,6 @@ } /** - * @return the class path path for this definition - */ - public Path getClasspath() { - return cpDelegate.getClasspath(); - } - - /** * @return the file containing definitions */ public File getFile() { @@ -212,72 +190,6 @@ return resource; } - /** - * @return the reverse loader attribute of the classpath delegate. - */ - public boolean isReverseLoader() { - return cpDelegate.isReverseLoader(); - } - - /** - * Returns the loader id of the class path Delegate. - * @return the loader id - */ - public String getLoaderId() { - return cpDelegate.getClassLoadId(); - } - - /** - * Returns the class path id of the class path delegate. - * @return the class path id - */ - public String getClasspathId() { - return cpDelegate.getClassLoadId(); - } - - /** - * Set the classpath to be used when searching for component being defined - * - * @param classpath an Ant Path object containing the classpath. - */ - public void setClasspath(Path classpath) { - this.cpDelegate.setClasspath(classpath); - } - - /** - * Create the classpath to be used when searching for component being - * defined - * @return the classpath of the this definition - */ - public Path createClasspath() { - return this.cpDelegate.createClasspath(); - } - - /** - * reference to a classpath to use when loading the files. - * To actually share the same loader, set loaderref as well - * @param r the reference to the classpath - */ - public void setClasspathRef(Reference r) { - this.cpDelegate.setClasspathref(r); - } - - /** - * Use the reference to locate the loader. If the loader is not - * found, taskdef will use the specified classpath and register it - * with the specified name. - * - * This allow multiple taskdef/typedef to use the same class loader, - * so they can be used together. It eliminate the need to - * put them in the CLASSPATH. - * - * @param r the reference to locate the loader. - * @since Ant 1.5 - */ - public void setLoaderRef(Reference r) { - this.cpDelegate.setLoaderRef(r); - } - /** * Run the definition. @@ -406,6 +318,7 @@ try { Antlib antlib = Antlib.createAntlib(getProject(), url); antlib.setClassLoader(classLoader); + antlib.setURI(getUri()); antlib.perform(); } catch (BuildException ex) { Location exLocation = ex.getLocation(); @@ -421,23 +334,6 @@ } /** - * create a classloader for this definition - * @return the classloader from the cpDelegate - */ - protected ClassLoader createLoader() { - if (internalClassLoader != null) { - return internalClassLoader; - } - ClassLoader al = this.cpDelegate.getClassLoader(); - // need to load Task via system classloader or the new - // task we want to define will never be a Task but always - // be wrapped into a TaskAdapter. - ((AntClassLoader) al).addSystemPackageRoot("org.apache.tools.ant"); - - return al; - } - - /** * Name of the property file to load * ant name/classname pairs from. * @param file the file @@ -474,7 +370,7 @@ definerSet = true; this.name = name; } - + /** * Returns the classname of the object we are defining. * May be <code>null</code>. @@ -542,25 +438,6 @@ /** - * Set the class loader, overrides the cpDelagate - * classloader. - * - * @param classLoader a <code>ClassLoader</code> value - */ - protected void setInternalClassLoader(ClassLoader classLoader) { - this.internalClassLoader = classLoader; - } - - /** - * @see org.apache.tools.ant.Task#init() - * @since Ant 1.6 - */ - public void init() throws BuildException { - this.cpDelegate = ClasspathUtils.getDelegate(this); - super.init(); - } - - /** * Add a definition using the attributes of Definer * * @param al the ClassLoader to use @@ -573,6 +450,8 @@ Class cl = null; try { try { + name = ProjectHelper.genComponentName(getUri(), name); + if (onError != OnError.IGNORE) { cl = Class.forName(classname, true, al); } 1.1 ant/src/main/org/apache/tools/ant/taskdefs/AntlibInterface.java Index: AntlibInterface.java =================================================================== /* * The Apache Software License, Version 1.1 * * Copyright (c) 2003 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 "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 [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package org.apache.tools.ant.taskdefs; /** * Interface for tasks that should be informed when * they are loaded in antlib's. * For handling uri and and class loading. * * @author Peter Reilly * * @since Ant 1.6 */ public interface AntlibInterface { /** * The URI for this definition. * @param uri the namespace URI */ void setURI(String uri); /** * Set the class loader of the loading object * * @param classLoader a <code>ClassLoader</code> value */ void setAntlibClassLoader(ClassLoader classLoader); } 1.1 ant/src/main/org/apache/tools/ant/taskdefs/DefBase.java Index: DefBase.java =================================================================== /* * The Apache Software License, Version 1.1 * * Copyright (c) 2001-2003 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 "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 [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package org.apache.tools.ant.taskdefs; import org.apache.tools.ant.AntClassLoader; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.ProjectHelper; import org.apache.tools.ant.Task; import org.apache.tools.ant.types.Path; import org.apache.tools.ant.types.Reference; import org.apache.tools.ant.util.ClasspathUtils; /** * Base class for Definitions * handling uri and and class loading. * (This was part of Definer) * * @author Costin Manolache * @author Stefan Bodewig * @author Peter Reilly * * @since Ant 1.6 */ public abstract class DefBase extends Task implements AntlibInterface { private String uri = ""; private ClassLoader internalClassLoader; private ClassLoader createdLoader; private ClasspathUtils.Delegate cpDelegate; /** * The URI for this definition. * If the URI is "ant:core", the uri will be set to "". (This * is the default uri). * URIs that start with "ant:" and are not * "ant:core" are reserved and are not allowed in this context. * @param uri the namespace URI * @throws BuildException if a reserved URI is used */ public void setURI(String uri) throws BuildException { if (uri.equals(ProjectHelper.ANT_CORE_URI)) { uri = ""; } if (uri.startsWith("ant:") && !uri.startsWith("antlib:")) { throw new BuildException("Attempt to use use a reserved URI " + uri); } this.uri = uri; } /** * @return the namespace uri for this definition */ public String getUri() { return uri; } /** * Set the class loader, overrides the cpDelagate * classloader. * * @param classLoader a <code>ClassLoader</code> value */ public void setAntlibClassLoader(ClassLoader classLoader) { this.internalClassLoader = classLoader; } /** * @param reverseLoader if true a delegated loader will take precedence over * the parent * @deprecated stop using this attribute * @ant.attribute ignore="true" */ public void setReverseLoader(boolean reverseLoader) { this.cpDelegate.setReverseLoader(reverseLoader); log("The reverseloader attribute is DEPRECATED. It will be removed", Project.MSG_WARN); } /** * @return the class path path for this definition */ public Path getClasspath() { return cpDelegate.getClasspath(); } /** * @return the reverse loader attribute of the classpath delegate. */ public boolean isReverseLoader() { return cpDelegate.isReverseLoader(); } /** * Returns the loader id of the class path Delegate. * @return the loader id */ public String getLoaderId() { return cpDelegate.getClassLoadId(); } /** * Returns the class path id of the class path delegate. * @return the class path id */ public String getClasspathId() { return cpDelegate.getClassLoadId(); } /** * Set the classpath to be used when searching for component being defined * * @param classpath an Ant Path object containing the classpath. */ public void setClasspath(Path classpath) { this.cpDelegate.setClasspath(classpath); } /** * Create the classpath to be used when searching for component being * defined * @return the classpath of the this definition */ public Path createClasspath() { return this.cpDelegate.createClasspath(); } /** * reference to a classpath to use when loading the files. * To actually share the same loader, set loaderref as well * @param r the reference to the classpath */ public void setClasspathRef(Reference r) { this.cpDelegate.setClasspathref(r); } /** * Use the reference to locate the loader. If the loader is not * found, taskdef will use the specified classpath and register it * with the specified name. * * This allow multiple taskdef/typedef to use the same class loader, * so they can be used together. It eliminate the need to * put them in the CLASSPATH. * * @param r the reference to locate the loader. * @since Ant 1.5 */ public void setLoaderRef(Reference r) { this.cpDelegate.setLoaderRef(r); } /** * create a classloader for this definition * @return the classloader from the cpDelegate */ protected ClassLoader createLoader() { if (internalClassLoader != null) { return internalClassLoader; } if (createdLoader == null) { createdLoader = this.cpDelegate.getClassLoader(); // need to load Task via system classloader or the new // task we want to define will never be a Task but always // be wrapped into a TaskAdapter. ((AntClassLoader) createdLoader) .addSystemPackageRoot("org.apache.tools.ant"); } return createdLoader; } /** * @see org.apache.tools.ant.Task#init() * @since Ant 1.6 */ public void init() throws BuildException { this.cpDelegate = ClasspathUtils.getDelegate(this); super.init(); } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]