1 4 package org.oddjob.values.types; 5 6 import java.util.ArrayList ; 7 import java.util.Arrays ; 8 import java.util.Collection ; 9 import java.util.Iterator ; 10 import java.util.List ; 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 38 public class ListType { 39 40 45 private final transient List types = new ArrayList (); 46 47 53 private boolean merge; 54 55 60 public void addConfiguredValue(Object type) { 61 types.add(type); 62 } 63 64 public Object valueFor(Class required) 65 throws ClassCastException , NumberFormatException { 66 if (required.isAssignableFrom(Object .class)) { 67 return convertTypes(Object .class).toArray(); 68 } 69 if (required.isAssignableFrom(List .class)) { 70 return convertTypes(Object .class); 71 } 72 if (required.isArray()) { 73 return convertTypes(required.getComponentType()) 74 .toArray(); 75 } 76 77 throw new ClassCastException ("Can not convert a List to " + required); 78 } 79 80 private List convertTypes(Class required) { 81 List results= new ArrayList (); 82 for (Iterator it = types.iterator(); it.hasNext(); ) { 83 Object proxy = it.next(); 84 Object o = IntrospectionHelper.valueFor(proxy, required); 86 if (merge && o.getClass().isArray()) { 87 Object [] os = (Object [])o; 88 results.addAll(Arrays.asList(os)); 89 } 90 else if (merge && o instanceof Collection ) { 91 results.addAll((Collection ) o); 92 } 93 else { 94 results.add(o); 95 } 96 } 97 return results; 98 } 99 100 public String toString() { 101 return "List of " + types.size() + " things."; 102 } 103 104 110 public ArooaHandler handlerFor(ArooaContext context) { 111 return new ValueHandler(); 112 } 113 114 117 public boolean isMerge() { 118 return merge; 119 } 120 123 public void setMerge(boolean merge) { 124 this.merge = merge; 125 } 126 } 127 | Popular Tags |