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 }