View Javadoc

1   package net.sourceforge.jparam.output;
2   
3   import java.io.PrintStream;
4   import java.lang.reflect.Method;
5   import java.util.HashMap;
6   import java.util.Map;
7   
8   import net.sourceforge.jparam.JParamException;
9   import net.sourceforge.jparam.util.Utils;
10  
11  public class SerializerRegistry {
12  	private static SerializerRegistry registry = null;
13  
14  	private Map serializers = new HashMap();
15  
16  	private ISerializer nullSerializer = new ISerializer() {
17  		public void serialize(Object obj, PrintStream out) {
18  		    Utils.assert(obj == null, "Null serializer got a non-null object: " + obj);
19  
20  		    out.print("NULL");
21  		}
22  
23  		public Class getSupportedClass() {
24  			return Object.class;
25  		}
26  	};
27  
28  	private SerializerRegistry() {
29  	}
30  
31  	public static SerializerRegistry getInstance() {
32  		if (registry == null) {
33  			registry = new SerializerRegistry();
34  		}
35  		return registry;
36  	}
37  
38  	public ISerializer getSerializer(Object obj) throws JParamException {
39  
40  		// check if the object is its own serializer
41  		if (obj instanceof ISerializer) {
42  			return (ISerializer) obj;
43  		}
44  
45  		if (obj == null) {
46  			return nullSerializer;
47  		}
48  
49  		// check if any serializer was registered for this objects class
50  		Object serializerObj = serializers.get(obj.getClass());
51  		if (serializerObj != null) {
52  			return (ISerializer) serializerObj;
53  		}
54  
55  		throw new JParamException("No serializer found for class "
56  				+ obj.getClass().getName());
57  	}
58  
59  	public void registerSerializer(Class c, ISerializer s) {
60  		Object prevSerializer = serializers.put(c, s);
61  		if (prevSerializer != null) {
62  			throw new RuntimeException(
63  					"A serializer is already registered for: " + c.getName()
64  							+ " previous serializer: " + prevSerializer);
65  		}
66  	}
67  
68  	public static void clearSingleton() {
69  		registry = null;
70  	}
71  
72  	public void registerHelperClass(Class c) {
73  		Method[] outputClassMethods = c.getMethods();
74  		for (int i = 0; i < outputClassMethods.length; i++) {
75  			Method m = outputClassMethods[i];
76  
77  			ISerializer serializer = null;
78  			if (OutputMethodSerializer.isMethodValid(m)) {
79  				serializer = new OutputMethodSerializer(m);
80  			} else if (SerializeMethodSerializer.isMethodValid(m)) {
81  				serializer = new SerializeMethodSerializer(m);
82  			}
83  
84  			if (serializer != null) {
85  				registerSerializer(serializer.getSupportedClass(), serializer);
86  			}
87  		}
88  	}
89  }