1 package jfun.yan.xml.nuts.optional; 2 3 import java.lang.reflect.Array ; 4 import java.util.Iterator ; 5 import java.util.List ; 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 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 v) throws Throwable { 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 []){ 45 final Object [] arr = (Object [])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 ){ 58 final List list = (List )v; 59 final int sz = list.size(); 60 final Component[] cargs = new Component[sz]; 61 int i=0; 62 for(Iterator 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 type = cc.getType(); 74 if(type!=null) 75 result = cast(type, result); 76 return result; 77 } 78 79 } 80 | Popular Tags |