All Downloads are FREE. Search and download functionalities are using the official Maven repository.

aQute.lib.json.CollectionHandler Maven / Gradle / Ivy

Go to download

A command line utility and Ant plugin to wrap, build, or examine bundles.

There is a newer version: 2.4.0
Show newest version
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 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("]");
	}

	@Override
	Object decodeArray(Decoder r) throws Exception {
		Collection c = (Collection) rawClass.newInstance();
		r.codec.parseArray(c, componentType, r);
		return c;
	}
}