blob: 89492c160c3283972d07fc404ad598996e407a30 [file] [log] [blame]
Stuart McCullochf3173222012-06-07 21:57:32 +00001package aQute.lib.json;
2
3import java.io.*;
4import java.lang.reflect.*;
5import java.util.*;
6import java.util.concurrent.*;
7
8public class CollectionHandler extends Handler {
9 Class<?> rawClass;
10 Type componentType;
11
12 CollectionHandler(Class<?> rawClass, Type componentType) {
13 this.componentType = componentType;
14 if (rawClass.isInterface()) {
15 if (rawClass.isAssignableFrom(ArrayList.class))
16 rawClass = ArrayList.class;
17 else if (rawClass.isAssignableFrom(LinkedList.class))
18 rawClass = LinkedList.class;
19 else if (rawClass.isAssignableFrom(HashSet.class))
20 rawClass = HashSet.class;
21 else if (rawClass.isAssignableFrom(TreeSet.class))
22 rawClass = TreeSet.class;
23 else if (rawClass.isAssignableFrom(Vector.class))
24 rawClass = Vector.class;
25 else if (rawClass.isAssignableFrom(ConcurrentLinkedQueue.class))
26 rawClass = ConcurrentLinkedQueue.class;
27 else if (rawClass.isAssignableFrom(CopyOnWriteArrayList.class))
28 rawClass = CopyOnWriteArrayList.class;
29 else if (rawClass.isAssignableFrom(CopyOnWriteArraySet.class))
30 rawClass = CopyOnWriteArraySet.class;
31 else
32 throw new IllegalArgumentException("Unknown interface type for collection: "
33 + rawClass);
34 }
35 this.rawClass = rawClass;
36 }
37
38 @Override void encode(Encoder app, Object object, Map<Object, Type> visited)
39 throws IOException, Exception {
Stuart McCulloch0b639c62012-06-12 12:41:16 +000040 Iterable<?> collection = (Iterable<?>) object;
Stuart McCullochf3173222012-06-07 21:57:32 +000041
42 app.append("[");
43 String del = "";
44 for (Object o : collection) {
45 app.append(del);
46 app.encode(o, componentType, visited);
47 del = ",";
48 }
49 app.append("]");
50 }
51
52 @SuppressWarnings("unchecked") @Override Object decodeArray(Decoder r) throws Exception {
53 Collection<Object> c = (Collection<Object>) rawClass.newInstance();
54 r.codec.parseArray(c, componentType, r);
55 return c;
56 }
57}