| package aQute.lib.json; |
| |
| import java.io.*; |
| import java.lang.reflect.*; |
| import java.util.*; |
| import java.util.concurrent.*; |
| |
| public class CollectionHandler extends Handler { |
| Class< ? > rawClass; |
| Type componentType; |
| |
| CollectionHandler(Class< ? > rawClass, Type componentType) { |
| this.componentType = componentType; |
| if (rawClass.isInterface()) { |
| if (rawClass.isAssignableFrom(ArrayList.class)) |
| rawClass = ArrayList.class; |
| else if (rawClass.isAssignableFrom(LinkedList.class)) |
| rawClass = LinkedList.class; |
| else if (rawClass.isAssignableFrom(HashSet.class)) |
| rawClass = HashSet.class; |
| else if (rawClass.isAssignableFrom(TreeSet.class)) |
| rawClass = TreeSet.class; |
| else if (rawClass.isAssignableFrom(Vector.class)) |
| rawClass = Vector.class; |
| else if (rawClass.isAssignableFrom(ConcurrentLinkedQueue.class)) |
| rawClass = ConcurrentLinkedQueue.class; |
| else if (rawClass.isAssignableFrom(CopyOnWriteArrayList.class)) |
| rawClass = CopyOnWriteArrayList.class; |
| else if (rawClass.isAssignableFrom(CopyOnWriteArraySet.class)) |
| rawClass = CopyOnWriteArraySet.class; |
| else |
| throw new IllegalArgumentException("Unknown interface type for collection: " + rawClass); |
| } |
| this.rawClass = rawClass; |
| } |
| |
| @Override |
| void encode(Encoder app, Object object, Map<Object,Type> visited) throws IOException, Exception { |
| Iterable< ? > collection = (Iterable< ? >) object; |
| |
| app.append("["); |
| String del = ""; |
| for (Object o : collection) { |
| app.append(del); |
| app.encode(o, componentType, visited); |
| del = ","; |
| } |
| app.append("]"); |
| } |
| |
| @SuppressWarnings("unchecked") |
| @Override |
| Object decodeArray(Decoder r) throws Exception { |
| Collection<Object> c = (Collection<Object>) rawClass.newInstance(); |
| r.codec.parseArray(c, componentType, r); |
| return c; |
| } |
| } |