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 }