KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > oddjob > values > types > ListType


1 /*
2  * Copyright (c) 2005, Rob Gordon.
3  */

4 package org.oddjob.values.types;
5
6 import java.util.ArrayList JavaDoc;
7 import java.util.Arrays JavaDoc;
8 import java.util.Collection JavaDoc;
9 import java.util.Iterator JavaDoc;
10 import java.util.List JavaDoc;
11
12 import org.oddjob.arooa.ArooaHandler;
13 import org.oddjob.arooa.ArooaContext;
14 import org.oddjob.arooa.handlers.ValueHandler;
15 import org.oddjob.arooa.reflect.IntrospectionHelper;
16
17 /**
18  * @oddjob.description A list can list any other type including another list.
19  * <p>
20  * If the merge property is set to true then sub lists are merged
21  * with the main list. This feature is currently unsupported in
22  * Oddjob Designer.
23  *
24  * @oddjob.example
25  *
26  * <pre>
27  * &lt;list&gt;
28  * &lt;value value="Hello World"/&gt;
29  * &lt;value value="Goodbye World"/&gt;
30  * &lt;list&gt;
31  * &lt;value value="42"/&gt;
32  * &lt;/list&gt;
33  * &lt;/list&gt;
34  * </pre>
35  *
36  * @author Rob Gordon.
37  */

38 public class ListType {
39     
40     /**
41      * @oddjob.element values
42      * @oddjob.description Any values.
43      * @oddjob.required No.
44      */

45     private final transient List JavaDoc types = new ArrayList JavaDoc();
46             
47     /**
48      * @oddjob.element
49      * @oddjob.description If true then sub lists are merged in with
50      * this list..
51      * @oddjob.required No, defaults to false.
52      */

53     private boolean merge;
54     
55     /**
56      * Add a value to the list.
57      *
58      * @param type The type.
59      */

60     public void addConfiguredValue(Object JavaDoc type) {
61         types.add(type);
62     }
63     
64     public Object JavaDoc valueFor(Class JavaDoc required)
65     throws ClassCastException JavaDoc, NumberFormatException JavaDoc {
66         if (required.isAssignableFrom(Object JavaDoc.class)) {
67             return convertTypes(Object JavaDoc.class).toArray();
68         }
69         if (required.isAssignableFrom(List JavaDoc.class)) {
70             return convertTypes(Object JavaDoc.class);
71         }
72         if (required.isArray()) {
73             return convertTypes(required.getComponentType())
74                 .toArray();
75         }
76
77         throw new ClassCastException JavaDoc("Can not convert a List to " + required);
78     }
79
80     private List JavaDoc convertTypes(Class JavaDoc required) {
81         List JavaDoc results= new ArrayList JavaDoc();
82         for (Iterator JavaDoc it = types.iterator(); it.hasNext(); ) {
83             Object JavaDoc proxy = it.next();
84             // use helper to get value by inspection.
85
Object JavaDoc o = IntrospectionHelper.valueFor(proxy, required);
86             if (merge && o.getClass().isArray()) {
87                     Object JavaDoc[] os = (Object JavaDoc[])o;
88                     results.addAll(Arrays.asList(os));
89             }
90             else if (merge && o instanceof Collection JavaDoc) {
91                 results.addAll((Collection JavaDoc) o);
92             }
93             else {
94                 results.add(o);
95             }
96         }
97         return results;
98     }
99
100     public String JavaDoc toString() {
101         return "List of " + types.size() + " things.";
102     }
103     
104     /**
105      * Provide our own handler for the values.
106      *
107      * @param context Not required.
108      * @return Our handler.
109      */

110     public ArooaHandler handlerFor(ArooaContext context) {
111         return new ValueHandler();
112     }
113         
114     /**
115      * @return Returns the merge.
116      */

117     public boolean isMerge() {
118         return merge;
119     }
120     /**
121      * @param merge The merge to set.
122      */

123     public void setMerge(boolean merge) {
124         this.merge = merge;
125     }
126 }
127
Popular Tags