1 package org.codehaus.xfire.java.mapping;
2
3 import java.util.Hashtable;
4 import java.util.Iterator;
5
6 import javax.xml.namespace.QName;
7
8 import org.apache.log4j.Logger;
9 import org.codehaus.xfire.AbstractXFireComponent;
10 import org.codehaus.xfire.SOAPConstants;
11 import org.codehaus.xfire.java.JavaServiceHandler;
12 import org.codehaus.xfire.java.type.BooleanType;
13 import org.codehaus.xfire.java.type.DoubleType;
14 import org.codehaus.xfire.java.type.FloatType;
15 import org.codehaus.xfire.java.type.IntType;
16 import org.codehaus.xfire.java.type.LongType;
17 import org.codehaus.xfire.java.type.StringType;
18
19 /***
20 * The default implementation of TypeMappingRegistry.
21 *
22 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
23 * @since Feb 22, 2004
24 */
25 public class DefaultTypeMappingRegistry
26 extends AbstractXFireComponent
27 implements TypeMappingRegistry
28 {
29 private static Logger logger = Logger.getLogger(JavaServiceHandler.class.getName());
30
31 private Hashtable registry;
32
33 private TypeMapping defaultTM;
34
35 public DefaultTypeMappingRegistry()
36 {
37 registry = new Hashtable();
38 }
39
40 /***
41 * @see org.codehaus.xfire.java.mapping.TypeMappingRegistry#register(java.lang.String, org.codehaus.xfire.java.encoding.TypeMapping)
42 */
43 public TypeMapping register( String encodingStyleURI, TypeMapping mapping )
44 {
45 TypeMapping previous = (TypeMapping) registry.get( encodingStyleURI );
46
47 mapping.setEncodingStyleURI( encodingStyleURI );
48
49 registry.put( encodingStyleURI, mapping );
50
51 return previous;
52 }
53
54 /***
55 * @see org.codehaus.xfire.java.mapping.TypeMappingRegistry#registerDefault(org.codehaus.xfire.java.encoding.TypeMapping)
56 */
57 public void registerDefault( TypeMapping mapping )
58 {
59 defaultTM = mapping;
60 }
61
62 /***
63 * @see org.codehaus.xfire.java.mapping.TypeMappingRegistry#getDefaultTypeMapping()
64 */
65 public TypeMapping getDefaultTypeMapping()
66 {
67 return defaultTM;
68 }
69
70 /***
71 * @see org.codehaus.xfire.java.mapping.TypeMappingRegistry#getRegisteredEncodingStyleURIs()
72 */
73 public String[] getRegisteredEncodingStyleURIs()
74 {
75 return (String[]) registry.keySet().toArray(new String[0]);
76 }
77
78 /***
79 * @see org.codehaus.xfire.java.mapping.TypeMappingRegistry#getTypeMapping(java.lang.String)
80 */
81 public TypeMapping getTypeMapping( String encodingStyleURI )
82 {
83 return (TypeMapping) registry.get(encodingStyleURI);
84 }
85
86 /***
87 * @see org.codehaus.xfire.java.mapping.TypeMappingRegistry#createTypeMapping()
88 */
89 public TypeMapping createTypeMapping( boolean autoTypes )
90 {
91 return createTypeMapping( getDefaultTypeMapping(), autoTypes );
92 }
93
94 /***
95 * @see org.codehaus.xfire.java.mapping.TypeMappingRegistry#createTypeMapping(java.lang.String)
96 */
97 public TypeMapping createTypeMapping( String parentNamespace, boolean autoTypes )
98 {
99 return createTypeMapping( getTypeMapping( parentNamespace ), autoTypes );
100 }
101
102 protected TypeMapping createTypeMapping( TypeMapping parent, boolean autoTypes )
103 {
104 if ( autoTypes )
105 {
106 return new AutoTypeMapping( parent );
107 }
108 else
109 {
110 return new CustomTypeMapping( parent );
111 }
112 }
113
114 /***
115 * @see org.codehaus.xfire.java.mapping.TypeMappingRegistry#unregisterTypeMapping(java.lang.String)
116 */
117 public TypeMapping unregisterTypeMapping( String encodingStyleURI )
118 {
119 TypeMapping tm = (TypeMapping) registry.get(encodingStyleURI);
120 registry.remove(encodingStyleURI);
121 return tm;
122 }
123
124 /***
125 * @see org.codehaus.xfire.java.mapping.TypeMappingRegistry#removeTypeMapping(org.codehaus.xfire.java.encoding.TypeMapping)
126 */
127 public boolean removeTypeMapping( TypeMapping mapping )
128 {
129 int n = 0;
130
131 for ( Iterator itr = registry.values().iterator(); itr.hasNext(); )
132 {
133 if ( itr.next().equals( mapping ) )
134 {
135 itr.remove();
136 n++;
137 }
138 }
139
140 return (n > 0);
141 }
142
143 /***
144 * @see org.codehaus.xfire.java.mapping.TypeMappingRegistry#clear()
145 */
146 public void clear()
147 {
148 registry.clear();
149 }
150
151 /***
152 * Load a class from the class loader.
153 *
154 * @param className The name of the class.
155 * @return The class.
156 * @throws Exception
157 */
158 protected Class loadClass( String className )
159 throws Exception
160 {
161
162 if ( className.endsWith("[]") )
163 {
164 className = "[L" + className.substring(0, className.length() - 2 ) + ";";
165 }
166
167 return getClass().getClassLoader().loadClass( className );
168 }
169
170 public TypeMapping createXSDMapping()
171 {
172 TypeMapping tm = createTypeMapping(SOAPConstants.XSD, false);
173
174 tm.register(boolean.class, new QName(SOAPConstants.XSD,"boolean"), BooleanType.class);
175 tm.register(int.class, new QName(SOAPConstants.XSD,"int"), IntType.class);
176 tm.register(double.class, new QName(SOAPConstants.XSD,"double"), DoubleType.class);
177 tm.register(float.class, new QName(SOAPConstants.XSD,"float"), FloatType.class);
178 tm.register(long.class, new QName(SOAPConstants.XSD,"long"), LongType.class);
179 tm.register(String.class, new QName(SOAPConstants.XSD,"string"), StringType.class);
180 tm.register(Boolean.class, new QName(SOAPConstants.XSD,"boolean"), BooleanType.class);
181 tm.register(Integer.class, new QName(SOAPConstants.XSD,"int"), IntType.class);
182 tm.register(Double.class, new QName(SOAPConstants.XSD,"double"), DoubleType.class);
183 tm.register(Float.class, new QName(SOAPConstants.XSD,"float"), FloatType.class);
184 tm.register(Long.class, new QName(SOAPConstants.XSD,"long"), LongType.class);
185
186 register(SOAPConstants.XSD, tm);
187
188 return tm;
189 }
190 }