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 }