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 }