KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > jfun > yan > xml > nuts > optional > WithArgumentsNut


1 package jfun.yan.xml.nuts.optional;
2
3 import java.lang.reflect.Array JavaDoc;
4 import java.util.Iterator JavaDoc;
5 import java.util.List JavaDoc;
6
7 import jfun.util.Misc;
8 import jfun.yan.Binder;
9 import jfun.yan.Component;
10 import jfun.yan.Creator;
11 import jfun.yan.xml.NutsUtils;
12 import jfun.yan.xml.nuts.DelegatingNut;
13
14 /**
15  * This Nut class enables calling a method/constructor with
16  * argument list created dynamically, rather than through the
17  * <code>arg</code> and <code>args</code> sub-elements literally.
18  * <p>
19  * @author Ben Yu
20  * Nov 10, 2005 12:10:12 AM
21  */

22 public class WithArgumentsNut extends DelegatingNut {
23   private Component args;
24   
25   public Component getArgs() {
26     checkMandatory("args", args);
27     return args;
28   }
29
30   public void setArgs(Component args) {
31     this.args = args;
32   }
33
34   public Component eval(){
35     final Component a = getArgs();
36     final Component cc = getMandatory();
37     
38     Component result = a.bind(new Binder(){
39       public Creator bind(Object JavaDoc v) throws Throwable JavaDoc {
40         if(v==null) return cc;
41         if(v.getClass().isArray()){
42           final int sz = Array.getLength(v);
43           final Component[] cargs = new Component[sz];
44           if(v instanceof Object JavaDoc[]){
45             final Object JavaDoc[] arr = (Object JavaDoc[])v;
46             for(int i=0; i<cargs.length; i++){
47               cargs[i] = NutsUtils.asComponent(arr[i]);
48             }
49           }
50           else{
51             for(int i=0; i<cargs.length; i++){
52               cargs[i] = NutsUtils.asComponent(Array.get(v, i));
53             }
54           }
55           return cc.withArguments(cargs);
56         }
57         else if(v instanceof List JavaDoc){
58           final List JavaDoc list = (List JavaDoc)v;
59           final int sz = list.size();
60           final Component[] cargs = new Component[sz];
61           int i=0;
62           for(Iterator JavaDoc it=list.iterator(); it.hasNext(); i++){
63               cargs[i] = NutsUtils.asComponent(it.next());
64           }
65           return cc.withArguments(cargs);
66         }
67         else{
68           throw raise(Misc.getTypeName(v.getClass())+
69               " cannot be used as argument list");
70         }
71       }
72     });
73     final Class JavaDoc type = cc.getType();
74     if(type!=null)
75       result = cast(type, result);
76     return result;
77   }
78
79 }
80
Popular Tags