1 package org.codehaus.xfire.aegis.type;
2
3 import java.math.BigDecimal;
4 import java.sql.Time;
5 import java.sql.Timestamp;
6 import java.util.Calendar;
7 import java.util.Date;
8 import java.util.Hashtable;
9 import java.util.Iterator;
10
11 import javax.xml.namespace.QName;
12
13 import org.codehaus.xfire.aegis.type.basic.Base64Type;
14 import org.codehaus.xfire.aegis.type.basic.BigDecimalType;
15 import org.codehaus.xfire.aegis.type.basic.BooleanType;
16 import org.codehaus.xfire.aegis.type.basic.CalendarType;
17 import org.codehaus.xfire.aegis.type.basic.DateTimeType;
18 import org.codehaus.xfire.aegis.type.basic.DocumentType;
19 import org.codehaus.xfire.aegis.type.basic.DoubleType;
20 import org.codehaus.xfire.aegis.type.basic.FloatType;
21 import org.codehaus.xfire.aegis.type.basic.IntType;
22 import org.codehaus.xfire.aegis.type.basic.LongType;
23 import org.codehaus.xfire.aegis.type.basic.ShortType;
24 import org.codehaus.xfire.aegis.type.basic.StringType;
25 import org.codehaus.xfire.aegis.type.basic.TimeType;
26 import org.codehaus.xfire.aegis.type.basic.TimestampType;
27 import org.codehaus.xfire.soap.Soap11;
28 import org.codehaus.xfire.soap.SoapConstants;
29 import org.codehaus.xfire.util.ClassLoaderUtils;
30 import org.w3c.dom.Document;
31
32 /***
33 * The default implementation of TypeMappingRegistry.
34 *
35 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
36 * @since Feb 22, 2004
37 */
38 public class DefaultTypeMappingRegistry
39 implements TypeMappingRegistry
40 {
41 private static final QName XSD_STRING = new QName(SoapConstants.XSD, "string");
42 private static final QName XSD_LONG = new QName(SoapConstants.XSD, "long");
43 private static final QName XSD_FLOAT = new QName(SoapConstants.XSD, "float");
44 private static final QName XSD_DOUBLE = new QName(SoapConstants.XSD, "double");
45 private static final QName XSD_INT = new QName(SoapConstants.XSD, "int");
46 private static final QName XSD_SHORT = new QName(SoapConstants.XSD, "short");
47 private static final QName XSD_BOOLEAN = new QName(SoapConstants.XSD, "boolean");
48 private static final QName XSD_DATETIME = new QName(SoapConstants.XSD, "dateTime");
49 private static final QName XSD_TIME = new QName(SoapConstants.XSD, "dateTime");
50 private static final QName XSD_BASE64 = new QName(SoapConstants.XSD, "base64Binary");
51 private static final QName XSD_DECIMAL = new QName(SoapConstants.XSD, "decimal");
52
53 private static final QName XSD_ANY = new QName(SoapConstants.XSD, "anyType");
54
55 private static final String ENCODED_NS = Soap11.getInstance().getSoapEncodingStyle();
56 private static final QName ENCODED_STRING = new QName(ENCODED_NS, "string");
57 private static final QName ENCODED_LONG = new QName(ENCODED_NS, "long");
58 private static final QName ENCODED_FLOAT = new QName(ENCODED_NS, "float");
59 private static final QName ENCODED_DOUBLE = new QName(ENCODED_NS, "double");
60 private static final QName ENCODED_INT = new QName(ENCODED_NS, "int");
61 private static final QName ENCODED_SHORT = new QName(ENCODED_NS, "short");
62 private static final QName ENCODED_BOOLEAN = new QName(ENCODED_NS, "boolean");
63 private static final QName ENCODED_DATETIME = new QName(ENCODED_NS, "dateTime");
64 private static final QName ENCODED_BASE64 = new QName(ENCODED_NS, "base64Binary");
65 private static final QName ENCODED_DECIMAL = new QName(ENCODED_NS, "decimal");
66
67 private Hashtable registry;
68
69 private TypeMapping defaultTM;
70
71 public DefaultTypeMappingRegistry()
72 {
73 registry = new Hashtable();
74 }
75
76 public DefaultTypeMappingRegistry(boolean createDefault)
77 {
78 registry = new Hashtable();
79
80 if (createDefault)
81 {
82 createDefaultMappings();
83 }
84 }
85
86 public TypeMapping register(String encodingStyleURI, TypeMapping mapping)
87 {
88 TypeMapping previous = (TypeMapping) registry.get(encodingStyleURI);
89
90 mapping.setEncodingStyleURI(encodingStyleURI);
91
92 registry.put(encodingStyleURI, mapping);
93
94 return previous;
95 }
96
97 public void registerDefault(TypeMapping mapping)
98 {
99 defaultTM = mapping;
100 }
101
102 /***
103 * @see org.codehaus.xfire.aegis.type.TypeMappingRegistry#getDefaultTypeMapping()
104 */
105 public TypeMapping getDefaultTypeMapping()
106 {
107 return defaultTM;
108 }
109
110 /***
111 * @see org.codehaus.xfire.aegis.type.TypeMappingRegistry#getRegisteredEncodingStyleURIs()
112 */
113 public String[] getRegisteredEncodingStyleURIs()
114 {
115 return (String[]) registry.keySet().toArray(new String[0]);
116 }
117
118 /***
119 * @see org.codehaus.xfire.aegis.type.TypeMappingRegistry#getTypeMapping(java.lang.String)
120 */
121 public TypeMapping getTypeMapping(String encodingStyleURI)
122 {
123 return (TypeMapping) registry.get(encodingStyleURI);
124 }
125
126 /***
127 * @see org.codehaus.xfire.aegis.type.TypeMappingRegistry#createTypeMapping(boolean)
128 */
129 public TypeMapping createTypeMapping(boolean autoTypes)
130 {
131 return createTypeMapping(getDefaultTypeMapping(), autoTypes);
132 }
133
134 /***
135 * @see org.codehaus.xfire.aegis.type.TypeMappingRegistry#createTypeMapping(String, boolean)
136 */
137 public TypeMapping createTypeMapping(String parentNamespace, boolean autoTypes)
138 {
139 return createTypeMapping(getTypeMapping(parentNamespace), autoTypes);
140 }
141
142 protected TypeMapping createTypeMapping(TypeMapping parent, boolean autoTypes)
143 {
144 CustomTypeMapping tm = new CustomTypeMapping(parent);
145
146 if (autoTypes) tm.setTypeCreator(createTypeCreator());
147
148 return tm;
149 }
150
151 protected TypeCreator createTypeCreator()
152 {
153 AbstractTypeCreator xmlCreator = createRootTypeCreator();
154 xmlCreator.setNextCreator(new DefaultTypeCreator());
155 try
156 {
157 String j5TC = "org.codehaus.xfire.aegis.type.java5.Java5TypeCreator";
158
159 Class clazz = ClassLoaderUtils.loadClass(j5TC, getClass());
160
161 AbstractTypeCreator j5Creator = (AbstractTypeCreator) clazz.newInstance();
162 j5Creator.setNextCreator(xmlCreator);
163 return j5Creator;
164 }
165 catch (Throwable t)
166 {
167 return xmlCreator;
168 }
169 }
170
171 protected AbstractTypeCreator createRootTypeCreator()
172 {
173 return new XMLTypeCreator();
174 }
175
176 /***
177 * @see org.codehaus.xfire.aegis.type.TypeMappingRegistry#unregisterTypeMapping(java.lang.String)
178 */
179 public TypeMapping unregisterTypeMapping(String encodingStyleURI)
180 {
181 TypeMapping tm = (TypeMapping) registry.get(encodingStyleURI);
182 registry.remove(encodingStyleURI);
183 return tm;
184 }
185
186 public boolean removeTypeMapping(TypeMapping mapping)
187 {
188 int n = 0;
189
190 for (Iterator itr = registry.values().iterator(); itr.hasNext();)
191 {
192 if (itr.next().equals(mapping))
193 {
194 itr.remove();
195 n++;
196 }
197 }
198
199 return (n > 0);
200 }
201
202 /***
203 * @see org.codehaus.xfire.aegis.type.TypeMappingRegistry#clear()
204 */
205 public void clear()
206 {
207 registry.clear();
208 }
209
210 public TypeMapping createDefaultMappings()
211 {
212 TypeMapping tm = createTypeMapping(false);
213
214 tm.register(boolean.class, XSD_BOOLEAN, new BooleanType());
215 tm.register(int.class, XSD_INT, new IntType());
216 tm.register(short.class, XSD_SHORT, new ShortType());
217 tm.register(double.class, XSD_DOUBLE, new DoubleType());
218 tm.register(float.class, XSD_FLOAT, new FloatType());
219 tm.register(long.class, XSD_LONG, new LongType());
220 tm.register(String.class, XSD_STRING, new StringType());
221 tm.register(Boolean.class, XSD_BOOLEAN, new BooleanType());
222 tm.register(Integer.class, XSD_INT, new IntType());
223 tm.register(Short.class, XSD_SHORT, new ShortType());
224 tm.register(Double.class, XSD_DOUBLE, new DoubleType());
225 tm.register(Float.class, XSD_FLOAT, new FloatType());
226 tm.register(Long.class, XSD_LONG, new LongType());
227 tm.register(Date.class, XSD_DATETIME, new DateTimeType());
228 tm.register(Time.class, XSD_TIME, new TimeType());
229 tm.register(Timestamp.class, XSD_DATETIME, new TimestampType());
230 tm.register(Calendar.class, XSD_DATETIME, new CalendarType());
231 tm.register(byte[].class, XSD_BASE64, new Base64Type());
232 tm.register(BigDecimal.class, XSD_DECIMAL, new BigDecimalType());
233 tm.register(Document.class, XSD_ANY, new DocumentType());
234
235 register(SoapConstants.XSD, tm);
236 registerDefault(tm);
237
238
239 TypeMapping soapTM = createTypeMapping(tm, false);
240
241 soapTM.register(boolean.class, ENCODED_BOOLEAN, new BooleanType());
242 soapTM.register(int.class, ENCODED_INT, new IntType());
243 soapTM.register(short.class, ENCODED_SHORT, new ShortType());
244 soapTM.register(double.class, ENCODED_DOUBLE, new DoubleType());
245 soapTM.register(float.class, ENCODED_FLOAT, new FloatType());
246 soapTM.register(long.class, ENCODED_LONG, new LongType());
247 soapTM.register(String.class, ENCODED_STRING, new StringType());
248 soapTM.register(Boolean.class, ENCODED_BOOLEAN, new BooleanType());
249 soapTM.register(Integer.class, ENCODED_INT, new IntType());
250 soapTM.register(Short.class, ENCODED_SHORT, new ShortType());
251 soapTM.register(Double.class, ENCODED_DOUBLE, new DoubleType());
252 soapTM.register(Float.class, ENCODED_FLOAT, new FloatType());
253 soapTM.register(Long.class, ENCODED_LONG, new LongType());
254 soapTM.register(Date.class, ENCODED_DATETIME, new DateTimeType());
255 soapTM.register(Calendar.class, ENCODED_DATETIME, new CalendarType());
256 soapTM.register(byte[].class, ENCODED_BASE64, new Base64Type());
257 soapTM.register(BigDecimal.class, ENCODED_DECIMAL, new BigDecimalType());
258
259 soapTM.register(boolean.class, XSD_BOOLEAN, new BooleanType());
260 soapTM.register(int.class, XSD_INT, new IntType());
261 soapTM.register(short.class, XSD_SHORT, new ShortType());
262 soapTM.register(double.class, XSD_DOUBLE, new DoubleType());
263 soapTM.register(float.class, XSD_FLOAT, new FloatType());
264 soapTM.register(long.class, XSD_LONG, new LongType());
265 soapTM.register(String.class, XSD_STRING, new StringType());
266 soapTM.register(Boolean.class, XSD_BOOLEAN, new BooleanType());
267 soapTM.register(Integer.class, XSD_INT, new IntType());
268 soapTM.register(Short.class, XSD_SHORT, new ShortType());
269 soapTM.register(Double.class, XSD_DOUBLE, new DoubleType());
270 soapTM.register(Float.class, XSD_FLOAT, new FloatType());
271 soapTM.register(Long.class, XSD_LONG, new LongType());
272 soapTM.register(Date.class, XSD_DATETIME, new DateTimeType());
273 soapTM.register(Time.class, XSD_TIME, new TimeType());
274 soapTM.register(Timestamp.class, XSD_DATETIME, new TimestampType());
275 soapTM.register(Calendar.class, XSD_DATETIME, new CalendarType());
276 soapTM.register(byte[].class, XSD_BASE64, new Base64Type());
277 soapTM.register(BigDecimal.class, XSD_DECIMAL, new BigDecimalType());
278 soapTM.register(Document.class, XSD_ANY, new DocumentType());
279
280 register(ENCODED_NS, tm);
281
282 return tm;
283 }
284 }