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
41 if (obj instanceof ISerializer) {
42 return (ISerializer) obj;
43 }
44
45 if (obj == null) {
46 return nullSerializer;
47 }
48
49
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 }