View Javadoc

1   package org.codehaus.xfire.java.mapping;
2   
3   import java.util.HashMap;
4   import java.util.Map;
5   import org.codehaus.xfire.java.type.Type;
6   import org.dom4j.QName;
7   
8   /***
9    * Contains type mappings for java/qname pairs and 
10   * Serializer/Deserializer factories.
11   * 
12   * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
13   * @since Feb 21, 2004
14   */
15  public class CustomTypeMapping
16      implements TypeMapping
17  {
18  	private Map types;
19      
20      private Map class2Type;
21  
22      private Map xml2Type;
23  
24      private Map class2xml;
25      
26      private TypeMapping defaultTM;
27      
28      private String encodingStyleURI;
29      
30      public CustomTypeMapping( TypeMapping defaultTM )
31      {
32          this();
33          
34          this.defaultTM = defaultTM;
35      }
36      
37      public CustomTypeMapping()
38      {
39          types = new HashMap();
40          class2Type = new HashMap();
41          class2xml = new HashMap();
42          xml2Type = new HashMap();
43      }
44  
45  	/***
46  	 * @see org.codehaus.xfire.java.mapping.TypeMapping#isRegistered(java.lang.Class, javax.xml.namespace.QName)
47  	 */
48  	public boolean isRegistered( Class javaType, QName xmlType )
49  	{
50          ClassQNamePair pair = new ClassQNamePair(javaType, xmlType);
51          
52          boolean registered =  types.containsKey( pair );
53          
54          if ( !registered && defaultTM != null )
55              registered = defaultTM.isRegistered( javaType, xmlType );
56          
57          return registered;
58  	}
59  
60  	/***
61  	 * @see org.codehaus.xfire.java.mapping.TypeMapping#register(java.lang.Class, javax.xml.namespace.QName, org.codehaus.xfire.java.encoding.SerializerFactory, org.codehaus.xfire.java.encoding.DeserializerFactory)
62  	 */
63  	public void register( Class javaType, QName xmlType, Class typeClass )
64  	{
65  		ClassQNamePair pair = new ClassQNamePair(javaType, xmlType);
66          
67  		types.put( pair, typeClass );
68          
69          class2Type.put( javaType, typeClass );
70          xml2Type.put( xmlType, typeClass );
71          class2xml.put( javaType, xmlType );
72  	}
73  
74  	/***
75  	 * @see org.codehaus.xfire.java.mapping.TypeMapping#getSerializer(java.lang.Class, javax.xml.namespace.QName)
76  	 */
77  	public Type getType( Class javaType, QName xmlType )
78  	{
79          ClassQNamePair pair = new ClassQNamePair(javaType, xmlType);
80          
81          Type type = instantiateType( (Class) types.get( pair ),
82                                       javaType,
83                                       xmlType );
84  
85          if ( type == null && defaultTM != null )
86              type = defaultTM.getType( javaType, xmlType );
87          
88          return type;
89  	}
90      
91  	/***
92  	 * @see org.codehaus.xfire.java.mapping.TypeMapping#removeSerializer(java.lang.Class, javax.xml.namespace.QName)
93  	 */
94  	public void removeType( Class javaType, QName xmlType )
95  	{
96          ClassQNamePair pair = new ClassQNamePair(javaType, xmlType);
97          
98          Type type = instantiateType( (Class) types.remove( pair ), javaType, xmlType );
99  
100         if ( type == null && defaultTM != null )
101            defaultTM.removeType( javaType, xmlType );
102 	}
103 
104     /***
105      * @see org.codehaus.xfire.java.mapping.TypeMapping#getType(java.lang.Class)
106      */
107     public Type getType(Class javaType)
108     {
109         Type type = instantiateType( (Class) class2Type.get( javaType ), 
110                                      javaType,
111                                      (QName) getTypeQName( javaType ) );
112 
113         if ( type == null && defaultTM != null )
114             type = defaultTM.getType( javaType );
115         
116         return type;
117     }
118 
119     /***
120      * @see org.codehaus.xfire.java.mapping.TypeMapping#getType(javax.xml.namespace.QName)
121      */
122     public Type getType(QName xmlType)
123     {
124         Type type = (Type) xml2Type.get( xmlType );
125 
126         if ( type == null && defaultTM != null )
127             type = defaultTM.getType( xmlType );
128         
129         return type;
130     }
131 
132     /***
133      * @see org.codehaus.xfire.java.mapping.TypeMapping#getTypeQName(java.lang.Class)
134      */
135     public QName getTypeQName(Class clazz)
136     {
137         QName qname = (QName) class2xml.get( clazz );
138 
139         if ( qname == null && defaultTM != null )
140             qname = defaultTM.getTypeQName( clazz );
141         
142         return qname;
143     }
144     
145     public Type instantiateType( Class typeClass, Class clazz, QName qname )
146     {
147 		try
148 		{
149             Type type = (Type) typeClass.newInstance();
150             type.setTypeClass( clazz );
151             type.setSchemaType( qname );
152             type.setTypeMapping( this );
153             
154             return type;
155 		}
156 		catch (Exception e)
157 		{
158             return null;
159 		}
160     }
161     
162     public String getEncodingStyleURI()
163     {
164         return encodingStyleURI;
165     }
166     
167     public void setEncodingStyleURI( String encodingStyleURI )
168     {
169         this.encodingStyleURI = encodingStyleURI;
170     }
171 }