View Javadoc

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         // Handle array'd types.
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 }