View Javadoc

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