KickJava   Java API By Example, From Geeks To Geeks.

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


1 package jfun.yan.xml.nuts.optional;
2
3 import java.lang.reflect.Array JavaDoc;
4 import java.util.Collection JavaDoc;
5 import java.util.Iterator JavaDoc;
6
7 import jfun.yan.Binder;
8 import jfun.yan.Components;
9 import jfun.yan.Creator;
10 import jfun.yan.Monad;
11 import jfun.yan.xml.nuts.DelegatingBinderNut;
12
13 /**
14  * This Nut class creates a Binder object that passes each element in
15  * an array/collection/map to another Binder object for subsequent changes.
16  * <p>
17  * If the object is not an array/collection/Map, it directly calls against the object
18  * itself.
19  * </p>
20  * <p>
21  * @author Ben Yu
22  * Nov 12, 2005 11:59:27 PM
23  */

24 public class ForeachNut extends DelegatingBinderNut {
25   public Binder eval() throws Exception JavaDoc {
26     final Binder binder = getMandatory();
27     return new Binder(){
28       public Creator bind(Object JavaDoc v)
29       throws Throwable JavaDoc{
30         if(v==null) return Components.value(null);
31         final Creator[] steps = getNextSteps(v, binder);
32         return Monad.sequence(steps);
33       }
34       public String JavaDoc toString(){
35         return "foreach";
36       }
37     };
38   }
39   private static Creator[] getNextSteps(Object JavaDoc obj, Binder next)
40   throws Throwable JavaDoc{
41     if(obj instanceof java.util.Map JavaDoc){
42       return getNextSteps((java.util.Map JavaDoc)obj, next);
43     }
44     else if(obj instanceof Object JavaDoc[]){
45       return getNextSteps((Object JavaDoc[])obj, next);
46     }
47     else if(obj instanceof Collection JavaDoc){
48       return getNextSteps((Collection JavaDoc)obj, next);
49     }
50     else if(obj.getClass().isArray()){
51       return getNextStepsForArray(obj, next);
52     }
53     else{
54       return new Creator[]{next.bind(obj)};
55     }
56   }
57   private static Creator[] getNextStepsForArray(Object JavaDoc arr, Binder next)
58   throws Throwable JavaDoc{
59     final int sz = Array.getLength(arr);
60     final Creator[] result = new Creator[sz];
61     for(int i=0; i<sz ;i++){
62       result[i] = next.bind(Array.get(arr, i));
63     }
64     return result;
65   }
66  
67   private static Creator[] getNextSteps(Object JavaDoc[] arr, Binder next)
68   throws Throwable JavaDoc{
69     final Creator[] result = new Creator[arr.length];
70     for(int i=0; i<arr.length ;i++){
71       result[i] = next.bind(arr[i]);
72     }
73     return result;
74   }
75   private static Creator[] getNextSteps(java.util.Map JavaDoc m, Binder next)
76   throws Throwable JavaDoc{
77     return getNextSteps(m.values(), next);
78   }
79   private static Creator[] getNextSteps(Collection JavaDoc c, Binder next)
80   throws Throwable JavaDoc{
81     final Creator[] result = new Creator[c.size()];
82     int i=0;
83     for(Iterator JavaDoc it = c.iterator(); it.hasNext();i++){
84       result[i] = next.bind(it.next());
85     }
86     return result;
87   }
88 }
89
Popular Tags