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 }