View Javadoc

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