View Javadoc

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         // Create a Type Mapping for SOAP 1.1 Encoding
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 }