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]

Reply via email to