diff --git a/docs/manual/develop.html b/docs/manual/develop.html index a19e1c198..b3544f406 100644 --- a/docs/manual/develop.html +++ b/docs/manual/develop.html @@ -188,7 +188,9 @@ three options:

For the options 2 and 3, Ant has to create an instance of NestedInner before it can pass it to the task, this means, NestedInner must have a public no-arg -constructor. This is the only difference between options 1 and 2.

+ constructor or a public one-arg constructor + taking a Project class as a parameter. +This is the only difference between options 1 and 2.

The difference between 2 and 3 is what Ant has done to the object before it passes it to the method. addInner will receive @@ -201,6 +203,106 @@ handled.

the methods will be called, but we don't know which, this depends on the implementation of your Java virtual machine.

+

Nested Types

+If your task needs to nest an arbitary type that has been defined + using <taskdef> you have two options. +
    +
  1. public void add(Type type)
  2. +
  3. public void addConfigured(Type type)
  4. +
+ The difference between 1 and 2 is the same as between 2 and 3 in the + previous section. +

+ For example suppose one wanted to handle objects object of type + org.apache.tools.ant.taskdefs.condition.Condition, one may + have a class: +

+
+
+public class MyTask extends Task {
+    private List conditions = new ArrayList();
+    public void add(Condition c) {
+        conditions.add(c);
+    }
+    public void execute() {
+     // iterator over the conditions
+    }
+}
+  
+
+

+ One may define and use this class like this: +

+
+
+<taskdef name="mytask" classname="MyTask" classpath="classes"/>
+<typedef name="condition.equals"
+         classname="org.apache.tools.ant.taskdefs.conditions.Equals"/>
+<mytask>
+    <condition.equals arg1="${debug}" arg2="true"/>
+</mytask>
+    
+
+

+ A more complicated example follows: +

+
+
+public class Sample {
+    public static class MyFileSelector implements FileSelector {
+         public void setAttrA(int a) {}
+         public void setAttrB(int b) {}
+         public void add(Path path) {}
+         public boolean isSelected(File basedir, String filename, File file) {
+             return true;
+         }
+     }
+
+    interface MyInterface {
+        void setVerbose(boolean val);
+    }        
+
+    public static class BuildPath extends Path {
+        public BuildPath(Project project) {
+            super(project);
+        }
+        
+        public void add(MyInterface inter) {}
+        public void setUrl(String url) {}
+    }
+
+    public static class XInterface implements MyInterface {
+        public void setVerbose(boolean x) {}
+        public void setCount(int c) {}
+    }
+}
+    
+
+

+ This class defines a number of static classes that implement/extend + Path, MyFileSelector and MyInterface. These may be defined and used + as follows: +

+
+    
+<typedef name="myfileselector" classname="Sample$MyFileSelector" + classpath="classes" loaderref="classes"/> +<typedef name="buildpath" classname="Sample$BuildPath" + classpath="classes" loaderref="classes"/> +<typedef name="xinterface" classname="Sample$XInterface" + classpath="classes" loaderref="classes"/> + +<copy todir="copy-classes"> + <fileset dir="classes"> + <myfileselector attra="10" attrB="-10"> + <buildpath path="." url="abc"> + <xinterface count="4"/> + </buildpath> + </myfileselector> + </fileset> +</copy> +
+

TaskContainer

The TaskContainer consists of a single method,