peterreilly 2003/09/10 03:37:14 Modified: src/etc/testcases/taskdefs antlib.xml src/main/org/apache/tools/ant ComponentHelper.java UnknownElement.java src/main/org/apache/tools/ant/helper ProjectHelper2.java src/main/org/apache/tools/ant/taskdefs Antlib.java Definer.java src/testcases/org/apache/tools/ant/taskdefs AntlibTest.java Added: src/etc/testcases/taskdefs antlib.current-test.xml Log: Change design for storing the current antlib uri Allows deferred execution to work - for example ant script in macro def. Bugzilla report : 23029 from Yannick Menager Revision Changes Path 1.2 +4 -0 ant/src/etc/testcases/taskdefs/antlib.xml Index: antlib.xml =================================================================== RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/antlib.xml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- antlib.xml 24 Jul 2003 13:48:45 -0000 1.1 +++ antlib.xml 10 Sep 2003 10:37:13 -0000 1.2 @@ -14,4 +14,8 @@ <mytask/> </target> + <target name="ns.current"> + <typedef file="antlib.current-test.xml" uri="abc"/> + <x:useecho2 xmlns:x="abc"/> + </target> </project> 1.1 ant/src/etc/testcases/taskdefs/antlib.current-test.xml Index: antlib.current-test.xml =================================================================== <?xml version="1.0"?> <antlib xmlns:c="ant:current"> <typedef name="echo2" classname="org.apache.tools.ant.taskdefs.Echo"/> <c:echo2>Echo2 called</c:echo2> <macrodef name="useecho2"> <sequential> <c:echo2>Echo2 inside a macro</c:echo2> </sequential> </macrodef> </antlib> 1.28 +16 -22 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.27 retrieving revision 1.28 diff -u -r1.27 -r1.28 --- ComponentHelper.java 9 Sep 2003 16:52:03 -0000 1.27 +++ ComponentHelper.java 10 Sep 2003 10:37:13 -0000 1.28 @@ -111,8 +111,8 @@ * processing antlib */ private Stack antLibStack = new Stack(); - /** current antlib context */ - private AntTypeTable antLibCurrentTypeTable = null; + /** current antlib uri */ + private String antLibCurrentUri = null; /** * Map from task names to vectors of created tasks @@ -268,14 +268,7 @@ public AntTypeDefinition getDefinition(String componentName) { checkNamespace(componentName); AntTypeDefinition ret = null; - if (antLibCurrentTypeTable != null - && ProjectHelper.ANT_CURRENT_URI.equals( - ProjectHelper.extractUriFromComponentName(componentName))) { - ret = antLibCurrentTypeTable.getDefinition(componentName); - } - if (ret == null) { - ret = antTypeTable.getDefinition(componentName); - } + ret = antTypeTable.getDefinition(componentName); return ret; } @@ -690,22 +683,23 @@ project.log(" +Datatype " + name + " " + def.getClassName(), Project.MSG_DEBUG); antTypeTable.put(name, def); - - if (antLibCurrentTypeTable != null && name.lastIndexOf(':') != -1) { - String baseName = name.substring(name.lastIndexOf(':') + 1); - antLibCurrentTypeTable.put( - ProjectHelper.genComponentName( - ProjectHelper.ANT_CURRENT_URI, baseName), def); - } } } /** * Called at the start of processing an antlib + * @param uri the uri that is associated with this antlib + */ + public void enterAntLib(String uri) { + antLibCurrentUri = uri; + antLibStack.push(uri); + } + + /** + * @return the current antlib uri */ - public void enterAntLib() { - antLibCurrentTypeTable = new AntTypeTable(project); - antLibStack.push(antLibCurrentTypeTable); + public String getCurrentAntlibUri() { + return antLibCurrentUri; } /** @@ -714,9 +708,9 @@ public void exitAntLib() { antLibStack.pop(); if (antLibStack.size() != 0) { - antLibCurrentTypeTable = (AntTypeTable) antLibStack.peek(); + antLibCurrentUri = (String) antLibStack.peek(); } else { - antLibCurrentTypeTable = null; + antLibCurrentUri = null; } } 1.63 +9 -1 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.62 retrieving revision 1.63 diff -u -r1.62 -r1.63 --- UnknownElement.java 15 Aug 2003 15:04:29 -0000 1.62 +++ UnknownElement.java 10 Sep 2003 10:37:13 -0000 1.63 @@ -125,12 +125,20 @@ return namespace; } - /** Set the namespace of the XML element associated with this component. + /** + * Set the namespace of the XML element associated with this component. * This method is typically called by the XML processor. + * If the namespace is "ant:current", the component helper + * is used to get the current antlib uri. * * @param namespace URI used in the xmlns declaration. */ public void setNamespace(String namespace) { + if (namespace.equals(ProjectHelper.ANT_CURRENT_URI)) { + ComponentHelper helper = ComponentHelper.getComponentHelper( + getProject()); + namespace = helper.getCurrentAntlibUri(); + } this.namespace = namespace; } 1.31 +1 -1 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.30 retrieving revision 1.31 diff -u -r1.30 -r1.31 --- ProjectHelper2.java 13 Aug 2003 14:06:19 -0000 1.30 +++ ProjectHelper2.java 10 Sep 2003 10:37:13 -0000 1.31 @@ -926,8 +926,8 @@ /* UnknownElement is used for tasks and data types - with delayed eval */ UnknownElement task = new UnknownElement(tag); - task.setNamespace(uri); task.setProject(context.getProject()); + task.setNamespace(uri); //XXX task.setTaskType(qname); task.setQName(qname); task.setTaskName(qname); 1.8 +39 -37 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.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- Antlib.java 22 Aug 2003 15:25:44 -0000 1.7 +++ Antlib.java 10 Sep 2003 10:37:14 -0000 1.8 @@ -90,9 +90,11 @@ * * @param project the current project * @param antlibUrl the url to read the definitions from + * @param uri the uri that the antlib is to be placed in * @return the ant lib task */ - public static Antlib createAntlib(Project project, URL antlibUrl) { + public static Antlib createAntlib(Project project, URL antlibUrl, + String uri) { // Check if we can contact the URL try { antlibUrl.openConnection().connect(); @@ -100,22 +102,29 @@ throw new BuildException( "Unable to find " + antlibUrl, ex); } - // Should be safe to parse - ProjectHelper2 parser = new ProjectHelper2(); - UnknownElement ue = - parser.parseUnknownElement(project, antlibUrl); - // Check name is "antlib" - if (!(ue.getTag().equals(TAG))) { - throw new BuildException( - "Unexpected tag " + ue.getTag() + " expecting " - + TAG, ue.getLocation()); + ComponentHelper helper = + ComponentHelper.getComponentHelper(project); + helper.enterAntLib(uri); + try { + // Should be safe to parse + ProjectHelper2 parser = new ProjectHelper2(); + UnknownElement ue = + parser.parseUnknownElement(project, antlibUrl); + // Check name is "antlib" + if (!(ue.getTag().equals(TAG))) { + throw new BuildException( + "Unexpected tag " + ue.getTag() + " expecting " + + TAG, ue.getLocation()); + } + Antlib antlib = new Antlib(); + antlib.setProject(project); + antlib.setLocation(ue.getLocation()); + antlib.init(); + ue.configure(antlib); + return antlib; + } finally { + helper.exitAntLib(); } - Antlib antlib = new Antlib(); - antlib.setProject(project); - antlib.setLocation(ue.getLocation()); - antlib.init(); - ue.configure(antlib); - return antlib; } @@ -166,28 +175,21 @@ * any tasks that derive from Definer. */ public void execute() { - 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(); + 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; } - } finally { - helper.exitAntLib(); + if (t instanceof AntlibInterface) { + AntlibInterface d = (AntlibInterface) t; + d.setURI(uri); + d.setAntlibClassLoader(getClassLoader()); + } + t.init(); + t.execute(); } } 1.43 +1 -1 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.42 retrieving revision 1.43 diff -u -r1.42 -r1.43 --- Definer.java 22 Aug 2003 15:25:44 -0000 1.42 +++ Definer.java 10 Sep 2003 10:37:14 -0000 1.43 @@ -315,7 +315,7 @@ */ private void loadAntlib(ClassLoader classLoader, URL url) { try { - Antlib antlib = Antlib.createAntlib(getProject(), url); + Antlib antlib = Antlib.createAntlib(getProject(), url, getUri()); antlib.setClassLoader(classLoader); antlib.setURI(getUri()); antlib.perform(); 1.2 +4 -0 ant/src/testcases/org/apache/tools/ant/taskdefs/AntlibTest.java Index: AntlibTest.java =================================================================== RCS file: /home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/AntlibTest.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- AntlibTest.java 24 Jul 2003 13:48:45 -0000 1.1 +++ AntlibTest.java 10 Sep 2003 10:37:14 -0000 1.2 @@ -74,6 +74,10 @@ expectLog("antlib.file", "MyTask called"); } + public void testNsCurrent() { + expectLog("ns.current", "Echo2 calledEcho2 inside a macro"); + } + public static class MyTask extends Task { public void execute() { log("MyTask called");
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]