1 package org.codehaus.xfire.type;
2
3 import java.util.Hashtable;
4 import java.util.Iterator;
5 import javax.xml.namespace.QName;
6
7 import org.codehaus.xfire.AbstractXFireComponent;
8 import org.codehaus.xfire.soap.Soap11;
9 import org.codehaus.xfire.soap.SoapConstants;
10 import org.codehaus.xfire.type.basic.BooleanType;
11 import org.codehaus.xfire.type.basic.DoubleType;
12 import org.codehaus.xfire.type.basic.FloatType;
13 import org.codehaus.xfire.type.basic.IntType;
14 import org.codehaus.xfire.type.basic.LongType;
15 import org.codehaus.xfire.type.basic.StringType;
16
17 /***
18 * The default implementation of TypeMappingRegistry.
19 *
20 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
21 * @since Feb 22, 2004
22 */
23 public class DefaultTypeMappingRegistry
24 extends AbstractXFireComponent
25 implements TypeMappingRegistry
26 {
27 private static final QName XSD_STRING = new QName( SoapConstants.XSD, "string" );
28 private static final QName XSD_LONG = new QName( SoapConstants.XSD, "long" );
29 private static final QName XSD_FLOAT = new QName( SoapConstants.XSD, "float" );
30 private static final QName XSD_DOUBLE = new QName( SoapConstants.XSD, "double" );
31 private static final QName XSD_INT = new QName( SoapConstants.XSD, "int" );
32 private static final QName XSD_BOOLEAN = new QName( SoapConstants.XSD, "boolean" );
33
34 private static final String ENCODED_NS = Soap11.getInstance().getSoapEncodingStyle();
35 private static final QName ENCODED_STRING = new QName( ENCODED_NS, "string" );
36 private static final QName ENCODED_LONG = new QName( ENCODED_NS, "long" );
37 private static final QName ENCODED_FLOAT = new QName( ENCODED_NS, "float" );
38 private static final QName ENCODED_DOUBLE = new QName( ENCODED_NS, "double" );
39 private static final QName ENCODED_INT = new QName( ENCODED_NS, "int" );
40 private static final QName ENCODED_BOOLEAN = new QName( ENCODED_NS, "boolean" );
41
42 private Hashtable registry;
43
44 private TypeMapping defaultTM;
45
46 public DefaultTypeMappingRegistry()
47 {
48 registry = new Hashtable();
49 }
50
51 public DefaultTypeMappingRegistry(boolean createDefault)
52 {
53 registry = new Hashtable();
54
55 if (createDefault)
56 {
57 createDefaultMappings();
58 }
59 }
60
61 /***
62 * @see org.codehaus.xfire.type.TypeMappingRegistry#register(java.lang.String,
63 * org.codehaus.xfire.java.mapping.TypeMapping)
64 */
65 public TypeMapping register(String encodingStyleURI, TypeMapping mapping)
66 {
67 TypeMapping previous = (TypeMapping) registry.get(encodingStyleURI);
68
69 mapping.setEncodingStyleURI(encodingStyleURI);
70
71 registry.put(encodingStyleURI, mapping);
72
73 return previous;
74 }
75
76 /***
77 * @see org.codehaus.xfire.type.TypeMappingRegistry#registerDefault(org.codehaus.xfire.java.mapping.TypeMapping)
78 */
79 public void registerDefault(TypeMapping mapping)
80 {
81 defaultTM = mapping;
82 }
83
84 /***
85 * @see org.codehaus.xfire.type.TypeMappingRegistry#getDefaultTypeMapping()
86 */
87 public TypeMapping getDefaultTypeMapping()
88 {
89 return defaultTM;
90 }
91
92 /***
93 * @see org.codehaus.xfire.type.TypeMappingRegistry#getRegisteredEncodingStyleURIs()
94 */
95 public String[] getRegisteredEncodingStyleURIs()
96 {
97 return (String[]) registry.keySet().toArray(new String[0]);
98 }
99
100 /***
101 * @see org.codehaus.xfire.type.TypeMappingRegistry#getTypeMapping(java.lang.String)
102 */
103 public TypeMapping getTypeMapping(String encodingStyleURI)
104 {
105 return (TypeMapping) registry.get(encodingStyleURI);
106 }
107
108 /***
109 * @see org.codehaus.xfire.type.TypeMappingRegistry#createTypeMapping(boolean)
110 */
111 public TypeMapping createTypeMapping(boolean autoTypes)
112 {
113 return createTypeMapping(getDefaultTypeMapping(), autoTypes);
114 }
115
116 /***
117 * @see org.codehaus.xfire.type.TypeMappingRegistry#createTypeMapping(String,
118 * boolean)
119 */
120 public TypeMapping createTypeMapping(String parentNamespace, boolean autoTypes)
121 {
122 return createTypeMapping(getTypeMapping(parentNamespace), autoTypes);
123 }
124
125 protected TypeMapping createTypeMapping(TypeMapping parent, boolean autoTypes)
126 {
127 if (autoTypes)
128 {
129 return new AutoTypeMapping(parent);
130 }
131 else
132 {
133 return new CustomTypeMapping(parent);
134 }
135 }
136
137 /***
138 * @see org.codehaus.xfire.type.TypeMappingRegistry#unregisterTypeMapping(java.lang.String)
139 */
140 public TypeMapping unregisterTypeMapping(String encodingStyleURI)
141 {
142 TypeMapping tm = (TypeMapping) registry.get(encodingStyleURI);
143 registry.remove(encodingStyleURI);
144 return tm;
145 }
146
147 /***
148 * @see org.codehaus.xfire.type.TypeMappingRegistry#removeTypeMapping(org.codehaus.xfire.java.mapping.TypeMapping)
149 */
150 public boolean removeTypeMapping(TypeMapping mapping)
151 {
152 int n = 0;
153
154 for (Iterator itr = registry.values().iterator(); itr.hasNext();)
155 {
156 if (itr.next().equals(mapping))
157 {
158 itr.remove();
159 n++;
160 }
161 }
162
163 return (n > 0);
164 }
165
166 /***
167 * @see org.codehaus.xfire.type.TypeMappingRegistry#clear()
168 */
169 public void clear()
170 {
171 registry.clear();
172 }
173
174 public TypeMapping createDefaultMappings()
175 {
176 TypeMapping tm = createTypeMapping(false);
177
178 tm.register(boolean.class, XSD_BOOLEAN, new BooleanType());
179 tm.register(int.class, XSD_INT, new IntType());
180 tm.register(double.class, XSD_DOUBLE, new DoubleType());
181 tm.register(float.class, XSD_FLOAT, new FloatType());
182 tm.register(long.class, XSD_LONG, new LongType());
183 tm.register(String.class, XSD_STRING, new StringType());
184 tm.register(Boolean.class, XSD_BOOLEAN, new BooleanType());
185 tm.register(Integer.class, XSD_INT, new IntType());
186 tm.register(Double.class, XSD_DOUBLE, new DoubleType());
187 tm.register(Float.class, XSD_FLOAT, new FloatType());
188 tm.register(Long.class, XSD_LONG, new LongType());
189
190 register(SoapConstants.XSD, tm);
191 registerDefault(tm);
192
193
194 TypeMapping soapTM = createTypeMapping(tm, false);
195
196 soapTM.register(boolean.class, ENCODED_BOOLEAN, new BooleanType());
197 soapTM.register(int.class, ENCODED_INT, new IntType());
198 soapTM.register(double.class, ENCODED_DOUBLE, new DoubleType());
199 soapTM.register(float.class, ENCODED_FLOAT, new FloatType());
200 soapTM.register(long.class, ENCODED_LONG, new LongType());
201 soapTM.register(String.class, ENCODED_STRING, new StringType());
202 soapTM.register(Boolean.class, ENCODED_BOOLEAN, new BooleanType());
203 soapTM.register(Integer.class, ENCODED_INT, new IntType());
204 soapTM.register(Double.class, ENCODED_DOUBLE, new DoubleType());
205 soapTM.register(Float.class, ENCODED_FLOAT, new FloatType());
206 soapTM.register(Long.class, ENCODED_LONG, new LongType());
207
208 soapTM.register(boolean.class, XSD_BOOLEAN, new BooleanType());
209 soapTM.register(int.class, XSD_INT, new IntType());
210 soapTM.register(double.class, XSD_DOUBLE, new DoubleType());
211 soapTM.register(float.class, XSD_FLOAT, new FloatType());
212 soapTM.register(long.class, XSD_LONG, new LongType());
213 soapTM.register(String.class, XSD_STRING, new StringType());
214 soapTM.register(Boolean.class, XSD_BOOLEAN, new BooleanType());
215 soapTM.register(Integer.class, XSD_INT, new IntType());
216 soapTM.register(Double.class, XSD_DOUBLE, new DoubleType());
217 soapTM.register(Float.class, XSD_FLOAT, new FloatType());
218 soapTM.register(Long.class, XSD_LONG, new LongType());
219
220 register(ENCODED_NS, tm);
221
222 return tm;
223 }
224 }