View Javadoc

1   package org.codehaus.xfire.aegis.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 class2Type;
21  
22      private Map xml2Type;
23  
24      private Map class2xml;
25      
26      private TypeMapping defaultTM;
27      
28      private String encodingStyleURI;
29      
30      private TypeCreator typeCreator;
31      
32      public CustomTypeMapping( TypeMapping defaultTM )
33      {
34          this();
35          
36          this.defaultTM = defaultTM;
37      }
38      
39      public CustomTypeMapping()
40      {
41          class2Type = new HashMap();
42          class2xml = new HashMap();
43          xml2Type = new HashMap();
44      }
45  
46  	public boolean isRegistered(Class javaType)
47  	{
48          boolean registered = class2Type.containsKey(javaType);
49          
50          if ( !registered && defaultTM != null )
51              registered = defaultTM.isRegistered(javaType);
52          
53          return registered;
54  	}
55  
56      public boolean isRegistered(QName xmlType)
57      {
58          boolean registered = xml2Type.containsKey(xmlType);
59          
60          if ( !registered && defaultTM != null )
61              registered = defaultTM.isRegistered(xmlType);
62          
63          return registered;
64      }
65  
66  	public void register(Class javaType, QName xmlType, Type type)
67      {
68          type.setSchemaType(xmlType);
69          type.setTypeClass(javaType);
70  
71          register(type);
72      }
73  
74      public void register(Type type)
75      {
76          if (type.getTypeClass() == null)
77              throw new NullPointerException("Type class cannot be null.");
78          
79          if (type.getSchemaType() == null)
80              throw new NullPointerException("Schema type cannot be null.");
81          
82          type.setTypeMapping(this);
83          
84          class2Type.put( type.getTypeClass(), type );
85          xml2Type.put( type.getSchemaType(), type );
86          class2xml.put( type.getTypeClass(), type.getSchemaType() );
87      }
88  
89  	public void removeType(Type type)
90  	{
91          if (!xml2Type.containsKey(type.getSchemaType()))
92          {
93             defaultTM.removeType(type);
94          }
95          else
96          {
97              xml2Type.remove(type.getSchemaType());
98              class2Type.remove(type.getTypeClass());
99              class2xml.remove(type.getTypeClass());
100         }
101 	}
102 
103     /***
104      * @see org.codehaus.xfire.aegis.type.TypeMapping#getType(java.lang.Class)
105      */
106     public Type getType(Class javaType)
107     {
108         Type type = (Type) class2Type.get( javaType );
109         
110         if ( type == null && defaultTM != null )
111         {
112             type = defaultTM.getType( javaType );
113         }
114         
115         return type;
116     }
117 
118     /***
119      * @see org.codehaus.xfire.aegis.type.TypeMapping#getType(javax.xml.namespace.QName)
120      */
121     public Type getType(QName xmlType)
122     {
123         Type type = (Type) xml2Type.get( xmlType );
124 
125         if ( type == null && defaultTM != null )
126             type = defaultTM.getType( xmlType );
127         
128         return type;
129     }
130 
131     /***
132      * @see org.codehaus.xfire.aegis.type.TypeMapping#getTypeQName(java.lang.Class)
133      */
134     public QName getTypeQName(Class clazz)
135     {
136         QName qname = (QName) class2xml.get( clazz );
137 
138         if ( qname == null && defaultTM != null )
139             qname = defaultTM.getTypeQName( clazz );
140         
141         return qname;
142     }
143 
144     public String getEncodingStyleURI()
145     {
146         return encodingStyleURI;
147     }
148     
149     public void setEncodingStyleURI( String encodingStyleURI )
150     {
151         this.encodingStyleURI = encodingStyleURI;
152     }
153 
154     public TypeCreator getTypeCreator()
155     {
156         return typeCreator;
157     }
158 
159     public void setTypeCreator(TypeCreator typeCreator)
160     {
161         this.typeCreator = typeCreator;
162         
163         typeCreator.setTypeMapping(this);
164     }
165 }