001: /*
002: * This file is part of PFIXCORE.
003: *
004: * PFIXCORE is free software; you can redistribute it and/or modify
005: * it under the terms of the GNU Lesser General Public License as published by
006: * the Free Software Foundation; either version 2 of the License, or
007: * (at your option) any later version.
008: *
009: * PFIXCORE is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
012: * GNU Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public License
015: * along with PFIXCORE; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: *
018: */
019: package de.schlund.pfixcore.oxm.impl;
020:
021: import java.io.File;
022: import java.net.URI;
023: import java.net.URL;
024: import java.util.Currency;
025: import java.util.Date;
026: import java.util.GregorianCalendar;
027: import java.util.HashMap;
028: import java.util.List;
029: import java.util.Map;
030: import java.util.Properties;
031:
032: import de.schlund.pfixcore.beans.BeanDescriptor;
033: import de.schlund.pfixcore.beans.BeanDescriptorFactory;
034: import de.schlund.pfixcore.oxm.impl.serializers.ArraySerializer;
035: import de.schlund.pfixcore.oxm.impl.serializers.BeanSerializer;
036: import de.schlund.pfixcore.oxm.impl.serializers.ClassSerializer;
037: import de.schlund.pfixcore.oxm.impl.serializers.CollectionSerializer;
038: import de.schlund.pfixcore.oxm.impl.serializers.ComplexEnumSerializer;
039: import de.schlund.pfixcore.oxm.impl.serializers.DateSerializer;
040: import de.schlund.pfixcore.oxm.impl.serializers.MapSerializer;
041: import de.schlund.pfixcore.oxm.impl.serializers.ObjectToStringSerializer;
042: import de.schlund.pfixcore.oxm.impl.serializers.PropertiesSerializer;
043: import de.schlund.pfixcore.oxm.impl.serializers.SimpleEnumSerializer;
044:
045: /**
046: * @author mleidig@schlund.de
047: */
048: public class SerializerRegistry {
049:
050: BeanDescriptorFactory beanDescFactory;
051: ClassNameMapping classNameMapping;
052:
053: Map<Class<?>, ComplexTypeSerializer> complexSerializers;
054: Map<Class<?>, SimpleTypeSerializer> simpleSerializers;
055:
056: ArraySerializer arraySerializer;
057: BeanSerializer beanSerializer;
058: CollectionSerializer collSerializer;
059: MapSerializer mapSerializer;
060: SimpleEnumSerializer simpleEnumSerializer;
061: ComplexEnumSerializer complexEnumSerializer;
062:
063: public SerializerRegistry(BeanDescriptorFactory beanDescFactory) {
064:
065: this .beanDescFactory = beanDescFactory;
066: classNameMapping = new ClassNameMapping();
067:
068: complexSerializers = new HashMap<Class<?>, ComplexTypeSerializer>();
069: simpleSerializers = new HashMap<Class<?>, SimpleTypeSerializer>();
070:
071: arraySerializer = new ArraySerializer();
072: beanSerializer = new BeanSerializer(beanDescFactory);
073: collSerializer = new CollectionSerializer();
074: mapSerializer = new MapSerializer();
075: simpleEnumSerializer = new SimpleEnumSerializer();
076: complexEnumSerializer = new ComplexEnumSerializer(
077: beanDescFactory);
078:
079: SimpleTypeSerializer ser = new ObjectToStringSerializer();
080: simpleSerializers.put(String.class, ser);
081: simpleSerializers.put(Character.class, ser);
082: simpleSerializers.put(Boolean.class, ser);
083: simpleSerializers.put(Byte.class, ser);
084: simpleSerializers.put(Short.class, ser);
085: simpleSerializers.put(Integer.class, ser);
086: simpleSerializers.put(Long.class, ser);
087: simpleSerializers.put(Float.class, ser);
088: simpleSerializers.put(Double.class, ser);
089: simpleSerializers.put(Currency.class, ser);
090: simpleSerializers.put(URL.class, ser);
091: simpleSerializers.put(URI.class, ser);
092: simpleSerializers.put(File.class, ser);
093:
094: ser = new DateSerializer();
095: simpleSerializers.put(Date.class, ser);
096: simpleSerializers.put(GregorianCalendar.class, ser);
097:
098: simpleSerializers.put(Class.class, new ClassSerializer());
099:
100: complexSerializers.put(Properties.class,
101: new PropertiesSerializer());
102:
103: }
104:
105: public ComplexTypeSerializer getSerializer(Class<?> clazz) {
106: ComplexTypeSerializer serializer = complexSerializers
107: .get(clazz);
108: if (serializer == null) {
109: if (clazz.isArray())
110: serializer = arraySerializer;
111: else if (List.class.isAssignableFrom(clazz))
112: serializer = collSerializer;
113: else if (Map.class.isAssignableFrom(clazz))
114: serializer = mapSerializer;
115: else if (Enum.class.isAssignableFrom(clazz))
116: serializer = complexEnumSerializer;
117: else
118: serializer = beanSerializer;
119: }
120: return serializer;
121: }
122:
123: public SimpleTypeSerializer getSimpleTypeSerializer(Class<?> clazz) {
124: SimpleTypeSerializer serializer = simpleSerializers.get(clazz);
125: if (Enum.class.isAssignableFrom(clazz)) {
126: BeanDescriptor beanDesc = beanDescFactory
127: .getBeanDescriptor(clazz);
128: if (beanDesc.getReadableProperties().isEmpty())
129: serializer = simpleEnumSerializer;
130: }
131: return serializer;
132: }
133:
134: public String mapClassName(Object obj) {
135: if (obj == null)
136: return "null";
137: return classNameMapping.mapClassName(obj.getClass());
138: }
139:
140: }
|