You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by st...@apache.org on 2005/08/23 01:02:52 UTC

cvs commit: ant/src/testcases/org/apache/tools/ant/taskdefs AntlibTest.java

stevel      2005/08/22 16:02:52

  Modified:    .        build.xml
               src/etc/testcases/taskdefs antlib.xml
               src/main/org/apache/tools/ant ComponentHelper.java
                        MagicNames.java
               src/main/org/apache/tools/ant/taskdefs Definer.java
               src/testcases/org/apache/tools/ant/taskdefs AntlibTest.java
  Log:
  Antlib changes. One I like, one I am still not sure I have right
  1. you can go <typedef uri="antlib:something" /> and the resource is worked out automatically from the URI.
  2. if you use antlib://org/ex/resource.xml we load in the resource by its full path, so you dont need multiple packages to have multiple antlib files.
  I'm not sure about #2; I think it is convenient once you have antlib-only distros (i.e. inline declaration and script; nothing else), but am not sure about the syntax. Maybe
  antlib://org.ex/antlib.xml would be better, and more in keeping with WWW URLs; if /antlib.xml is omitted, we would add it by default.
  
  Revision  Changes    Path
  1.478     +4 -1      ant/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/ant/build.xml,v
  retrieving revision 1.477
  retrieving revision 1.478
  diff -u -r1.477 -r1.478
  --- build.xml	5 Aug 2005 22:57:54 -0000	1.477
  +++ build.xml	22 Aug 2005 23:02:52 -0000	1.478
  @@ -1602,7 +1602,8 @@
           value="${tests-classpath.value}"/>
         <sysproperty key="root" file="${basedir}"/>
         <sysproperty key="build.compiler" value="${build.compiler}"/>
  -
  +      <sysproperty key="tests.and.ant.share.classloader" 
  +                   value="${tests.and.ant.share.classloader}"/>
         <formatter type="brief" usefile="false"/>
   
         <batchtest>
  @@ -1775,6 +1776,8 @@
           value="${tests-classpath.value}"/>
         <sysproperty key="root" file="${basedir}"/>
         <sysproperty key="build.compiler" value="${build.compiler}"/>
  +      <sysproperty key="tests.and.ant.share.classloader"
  +                   value="${tests.and.ant.share.classloader}"/>
         <classpath refid="tests-classpath"/>
         <formatter type="plain" usefile="false"/>
         <test name="${testcase}"/>
  
  
  
  1.5       +17 -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.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- antlib.xml	24 Oct 2003 10:16:16 -0000	1.4
  +++ antlib.xml	22 Aug 2005 23:02:52 -0000	1.5
  @@ -36,4 +36,21 @@
       <x:preset.echo xmlns:x="abc" name="p"/>
       <x:p xmlns:x="abc">Hello from x:p</x:p>
     </target>
  +
  +  <target name="antlib_uri" >
  +    <typedef uri="antlib:org.example.tasks" onerror="failall"/>
  +  </target>
  +
  +  <target name="antlib_uri_auto" xmlns:ex="antlib:org.example.tasks">
  +    <ex:simple>
  +      <echo message="inside simple" />
  +    </ex:simple>
  +  </target>
  +
  +  <target name="antlib_uri_auto2" xmlns:ex="antlib://org/example/tasks/antlib2.xml">
  +    <ex:simple>
  +      <echo message="inside simple"/>
  +    </ex:simple>
  +  </target>
  +  
   </project>
  \ No newline at end of file
  
  
  
  1.61      +8 -6      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.60
  retrieving revision 1.61
  diff -u -r1.60 -r1.61
  --- ComponentHelper.java	22 Aug 2005 21:24:22 -0000	1.60
  +++ ComponentHelper.java	22 Aug 2005 23:02:52 -0000	1.61
  @@ -36,6 +36,7 @@
   import java.lang.reflect.InvocationTargetException;
   
   import org.apache.tools.ant.taskdefs.Typedef;
  +import org.apache.tools.ant.taskdefs.Definer;
   import org.apache.tools.ant.launch.Launcher;
   
   /**
  @@ -91,7 +92,6 @@
       private static final String ERROR_NO_TASK_LIST_LOAD = "Can't load default task list";
       private static final String ERROR_NO_TYPE_LIST_LOAD = "Can't load default type list";
       public static final String COMPONENT_HELPER_REFERENCE = "ant.ComponentHelper";
  -    private static final String ANTLIB_PREFIX = "antlib:";
   
       /**
        * string used to control build.syspath policy {@value}
  @@ -782,13 +782,15 @@
           checkedNamespaces.add(uri);
           Typedef definer = new Typedef();
           definer.setProject(project);
  +        definer.init();
           definer.setURI(uri);
  -        definer.setResource(
  -            uri.substring(ANTLIB_PREFIX.length()).replace('.', '/')
  -            + "/antlib.xml");
  +        //there to stop error messages being "null"
  +        definer.setTaskName(uri);
  +        //if this is left out, bad things happen. like all build files break
  +        //on the first element encountered.
  +        definer.setResource(Definer.makeResourceFromURI(uri));
           // a fishing expedition :- ignore errors if antlib not present
           definer.setOnError(new Typedef.OnError(Typedef.OnError.POLICY_IGNORE));
  -        definer.init();
           definer.execute();
       }
   
  @@ -813,7 +815,7 @@
           AntTypeDefinition def = getDefinition(componentName);
           if (def == null) {
               //not a known type
  -            boolean isAntlib = componentName.indexOf(ANTLIB_PREFIX) == 0;
  +            boolean isAntlib = componentName.indexOf(MagicNames.ANTLIB_PREFIX) == 0;
               out.println("Cause: The name is undefined.");
               out.println("Action: Check the spelling.");
               out.println("Action: Check that any custom tasks/types have been declared.");
  
  
  
  1.11      +6 -0      ant/src/main/org/apache/tools/ant/MagicNames.java
  
  Index: MagicNames.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/MagicNames.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- MagicNames.java	22 Aug 2005 21:24:22 -0000	1.10
  +++ MagicNames.java	22 Aug 2005 23:02:52 -0000	1.11
  @@ -29,6 +29,12 @@
       }
   
       /**
  +     * prefix for antlib URIs:
  +     * {@value}
  +     */
  +    public static final String ANTLIB_PREFIX = "antlib:";
  +
  +    /**
        * Ant version property. {@value}
        */
       public static final String ANT_VERSION = "ant.version";
  
  
  
  1.58      +63 -14    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.57
  retrieving revision 1.58
  diff -u -r1.57 -r1.58
  --- Definer.java	22 Aug 2005 16:51:16 -0000	1.57
  +++ Definer.java	22 Aug 2005 23:02:52 -0000	1.58
  @@ -33,6 +33,8 @@
   import org.apache.tools.ant.BuildException;
   import org.apache.tools.ant.Project;
   import org.apache.tools.ant.ProjectHelper;
  +import org.apache.tools.ant.MagicNames;
  +import org.apache.tools.ant.util.FileUtils;
   import org.apache.tools.ant.types.EnumeratedAttribute;
   
   /**
  @@ -44,6 +46,13 @@
    * @noinspection ParameterHidesMemberVariable
    */
   public abstract class Definer extends DefBase {
  +
  +    /**
  +     * the extension of an antlib file for autoloading.
  +     * {@value[
  +     */
  +    private static final String ANTLIB_XML = "/antlib.xml";
  +
       private static class ResourceStack extends ThreadLocal {
           public Object initialValue() {
               return new HashMap();
  @@ -188,10 +197,20 @@
           ClassLoader al = createLoader();
   
           if (!definerSet) {
  -            throw new BuildException(
  -                "name, file or resource attribute of "
  -                + getTaskName() + " is undefined", getLocation());
  -        }
  +            //we arent fully defined yet. this is an error unless
  +            //we are in an antlib, in which case the resource name is determined
  +            //automatically.
  +            //NB: URIs in the ant core package will be "" at this point.
  +            if (getURI()!=null && getURI().startsWith(MagicNames.ANTLIB_PREFIX)) {
  +                //convert the URI to a resource
  +                String uri1 = getURI();
  +                setResource(makeResourceFromURI(uri1));
  +            } else {
  +                    throw new BuildException(
  +                        "name, file or resource attribute of "
  +                        + getTaskName() + " is undefined", getLocation());
  +                }
  +            }
   
           if (name != null) {
               if (classname == null) {
  @@ -262,6 +281,38 @@
           }
       }
   
  +    /**
  +     * This is where the logic to map from a URI to an antlib resource
  +     * is kept. 
  +     * @return the name of a resource. It may not exist
  +     */
  +
  +    public static String makeResourceFromURI(String uri) {
  +        String path = uri.substring(MagicNames.ANTLIB_PREFIX.length());
  +        String resource;
  +        if (path.startsWith("//")) {
  +            //handle new style full paths to an antlib, in which 
  +            //all but the forward slashes are allowed. 
  +            resource = path.substring("//".length());
  +            if (!resource.endsWith(".xml")) {
  +                //if we haven't already named an XML file, it gets antlib.xml
  +                resource = resource + ANTLIB_XML;
  +            }
  +        } else {
  +            //convert from a package to a path
  +            resource = path.replace('.', '/') + ANTLIB_XML;
  +        }
  +        return resource;
  +    }
  +
  +    /**
  +     * Convert a file to a file: URL. 
  +     * 
  +     * @return the URL, or null if it isn't valid and the active error policy
  +     * is not to raise a fault
  +     * @throws BuildException if the file is missing/not a file and the 
  +     * policy requires failure at this point.
  +     */
       private URL fileToURL() {
           String message = null;
           if (!(file.exists())) {
  @@ -330,7 +381,7 @@
       }
   
       /**
  -     * Load type definitions as properties from a url.
  +     * Load type definitions as properties from a URL.
        *
        * @param al the classloader to use
        * @param url the url to get the definitions from
  @@ -355,18 +406,12 @@
           } catch (IOException ex) {
               throw new BuildException(ex, getLocation());
           } finally {
  -            if (is != null) {
  -                try {
  -                    is.close();
  -                } catch (IOException e) {
  -                    // ignore
  -                }
  -            }
  +            FileUtils.close(is);
           }
       }
   
       /**
  -     * Load an antlib from a url.
  +     * Load an antlib from a URL.
        *
        * @param classLoader the classloader to use.
        * @param url the url to load the definitions from.
  @@ -551,9 +596,13 @@
           }
       }
   
  +    /**
  +     * handle too many definitions by raising an exception.
  +     * @throws BuildException always.
  +     */
       private void tooManyDefinitions() {
           throw new BuildException(
  -            "Only one of the attributes name,file,resource"
  +            "Only one of the attributes name, file and resource"
               + " can be set", getLocation());
       }
   }
  
  
  
  1.9       +29 -1     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.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- AntlibTest.java	9 Mar 2004 16:48:56 -0000	1.8
  +++ AntlibTest.java	22 Aug 2005 23:02:52 -0000	1.9
  @@ -18,8 +18,8 @@
   package org.apache.tools.ant.taskdefs;
   
   import org.apache.tools.ant.BuildFileTest;
  -import org.apache.tools.ant.Project;
   import org.apache.tools.ant.Task;
  +import org.apache.tools.ant.Project;
   
   /**
    */
  @@ -32,6 +32,15 @@
           configureProject("src/etc/testcases/taskdefs/antlib.xml");
       }
   
  +    /**
  +     * only do the antlib tests if we are in the same JVM as ant.
  +     * @return
  +     */
  +    private boolean isSharedJVM() {
  +        String property = System.getProperty("tests.and.ant.share.classloader");
  +        return property!=null && Project.toBoolean(property);
  +    }
  +
       public void testAntlibFile() {
           expectLog("antlib.file", "MyTask called");
       }
  @@ -49,6 +58,25 @@
           expectLog("ns.current", "Echo2 inside a macroHello from x:p");
       }
   
  +
  +    public void testAntlib_uri() {
  +        if (isSharedJVM()) {
  +            executeTarget("antlib_uri");
  +        }
  +    }
  +
  +    public void testAntlib_uri_auto() {
  +        if (isSharedJVM()) {
  +            executeTarget("antlib_uri_auto");
  +        }
  +    }
  +
  +    public void testAntlib_uri_auto2() {
  +        if (isSharedJVM()) {
  +            executeTarget("antlib_uri_auto2");
  +        }
  +    }
  +    
       public static class MyTask extends Task {
           public void execute() {
               log("MyTask called");
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org


RE: cvs commit: ant/src/testcases/org/apache/tools/ant/taskdefs AntlibTest.java

Posted by Dominique Devienne <dd...@gmail.com>.
> From: Steve Loughran [mailto:stevel@apache.org]
> I dont actually want packages, see. Instead I want a directory that you
> can -lib to that pulls in all the various project-independent
> declarations.
> 
> Then I can run ant
> 
> ant -lib /projects/smartfrog/antbuild/core
> 
> And get everything in there. Currently that is ant-contrib and a version
> of maven artifacts I compiled myself yesterday. Then I can go
>   xmlns:antlib://checkstyle.xml
>   xmlns:antlib://emma.xml
> and get all the relevant declarations pulled in, without having to put
> my unpackaged stuff into subdirs, jar files, etc, etc.

Well sorry, but I still don't follow. And frankly, I'd like a bit more a
priori discussion about adding such new features ;-) Like discussing use
cases before the commit ;-))) --DD


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org


Re: cvs commit: ant/src/testcases/org/apache/tools/ant/taskdefs AntlibTest.java

Posted by Steve Loughran <st...@apache.org>.
Dominique Devienne wrote:
>> 2. if you use antlib://org/ex/resource.xml we load in the resource by its full path, so you dont need multiple packages to have multiple antlib files.
>> I'm not sure about #2; I think it is convenient once you have antlib-only distros (i.e. inline declaration and script; nothing else), but am not sure about the syntax. Maybe
>> antlib://org.ex/antlib.xml would be better, and more in keeping with WWW URLs; if /antlib.xml is omitted, we would add it by default.
> 
> 
> What's the point of having two antlibs in the same package? I would
> much prefer we stick to the simpler auto-magic URIs (in xmlns) we use
> for AntLibs. I'm not too fond of your #2 ;-) We should keep things the
> way they are, i.e. antlib:package.name and that's it IMHO. The
> resource can already be specified with an explicit <typedef> no? --DD

I dont actually want packages, see. Instead I want a directory that you 
can -lib to that pulls in all the various project-independent declarations.

Then I can run ant

ant -lib /projects/smartfrog/antbuild/core

And get everything in there. Currently that is ant-contrib and a version 
of maven artifacts I compiled myself yesterday. Then I can go
  xmlns:antlib://checkstyle.xml
  xmlns:antlib://emma.xml
and get all the relevant declarations pulled in, without having to put 
my unpackaged stuff into subdirs, jar files, etc, etc.







---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org


Re: cvs commit: ant/src/testcases/org/apache/tools/ant/taskdefs AntlibTest.java

Posted by Dominique Devienne <dd...@gmail.com>.
>  2. if you use antlib://org/ex/resource.xml we load in the resource by its full path, so you dont need multiple packages to have multiple antlib files.
>  I'm not sure about #2; I think it is convenient once you have antlib-only distros (i.e. inline declaration and script; nothing else), but am not sure about the syntax. Maybe
>  antlib://org.ex/antlib.xml would be better, and more in keeping with WWW URLs; if /antlib.xml is omitted, we would add it by default.

What's the point of having two antlibs in the same package? I would
much prefer we stick to the simpler auto-magic URIs (in xmlns) we use
for AntLibs. I'm not too fond of your #2 ;-) We should keep things the
way they are, i.e. antlib:package.name and that's it IMHO. The
resource can already be specified with an explicit <typedef> no? --DD

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org