View Javadoc

1   package org.apache.commons.betwixt.registry;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one or more
5    * contributor license agreements.  See the NOTICE file distributed with
6    * this work for additional information regarding copyright ownership.
7    * The ASF licenses this file to You under the Apache License, Version 2.0
8    * (the "License"); you may not use this file except in compliance with
9    * the License.  You may obtain a copy of the License at
10   * 
11   *      http://www.apache.org/licenses/LICENSE-2.0
12   * 
13   * Unless required by applicable law or agreed to in writing, software
14   * distributed under the License is distributed on an "AS IS" BASIS,
15   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16   * See the License for the specific language governing permissions and
17   * limitations under the License.
18   */ 
19  
20  import java.util.Collection;
21  import java.util.HashMap;
22  import java.util.Iterator;
23  import java.util.Map;
24  
25  import org.apache.commons.betwixt.ElementDescriptor;
26  import org.apache.commons.betwixt.XMLBeanInfo;
27  import org.apache.commons.betwixt.io.read.ElementMapping;
28  import org.apache.commons.betwixt.io.read.ReadContext;
29  
30  /** The default caching implementation.
31    * A hashmap is used.
32    *
33    * @author <a href="mailto:rdonkin@apache.org">Robert Burrell Donkin</a>
34    * @version $Id: DefaultXMLBeanInfoRegistry.java 438373 2006-08-30 05:17:21Z bayard $
35    */
36  public class DefaultXMLBeanInfoRegistry implements XMLBeanInfoRegistry, PolymorphicReferenceResolver {
37  
38      /** Used to associated <code>XMLBeanInfo</code>'s to classes */
39      private Map xmlBeanInfos = new HashMap();
40      
41      /**
42        * Get <code>XMLBeanInfo</code> from cache. 
43        *
44        * @param forThisClass the class for which to find a <code>XMLBeanInfo</code>
45        * @return cached <code>XMLBeanInfo</code> associated with given class
46        * or <code>null</code> if no <code>XMLBeanInfo</code> has been associated
47        */
48      public XMLBeanInfo get(Class forThisClass) {
49          return (XMLBeanInfo) xmlBeanInfos.get(forThisClass);
50      }
51      
52      /**
53        * Put into cache
54        *
55        * @param forThisClass the class to cache the <code>XMLBeanInfo</code> for
56        * @param beanInfo the <code>XMLBeanInfo</code> to cache
57        */
58      public void put(Class forThisClass, XMLBeanInfo beanInfo) {
59          xmlBeanInfos.put(forThisClass, beanInfo);
60      }
61      
62      /**
63        * Flush existing cached <code>XMLBeanInfo</code>'s.
64        */
65      public void flush() {
66          xmlBeanInfos.clear();
67      }
68  
69      /**
70       * Checks all registered <code>XMLBeanInfo</code>'s for the
71       * first suitable match. 
72       * If a suitable one is found, then the class of that info is used. 
73       * @see org.apache.commons.betwixt.registry.PolymorphicReferenceResolver#resolveType(org.apache.commons.betwixt.io.read.ElementMapping, org.apache.commons.betwixt.io.read.ReadContext)
74       * @since 0.7
75       */
76      public Class resolveType(ElementMapping mapping, ReadContext context) {
77          Class result = null;
78          Collection cachedClasses = getCachedClasses();
79          ElementDescriptor mappedDescriptor = mapping.getDescriptor();
80          Class mappedType = mappedDescriptor.getSingularPropertyType();
81          if (mappedType == null) {
82              mappedType = mappedDescriptor.getPropertyType();
83          }
84          for (Iterator it = cachedClasses.iterator(); it.hasNext();) {
85              XMLBeanInfo  beanInfo  = get((Class)it.next());
86              ElementDescriptor typeDescriptor = beanInfo.getElementDescriptor();
87              boolean sameName = mapping.getName().equals(typeDescriptor.getQualifiedName());
88              if (sameName)
89              {
90                  
91                  boolean compatibleClass = mappedType.isAssignableFrom(beanInfo.getBeanClass());
92                  if (compatibleClass ) {
93                      result = beanInfo.getBeanClass();
94                      break;
95                  }
96              }
97          }
98          return result;
99      }
100     
101     /**
102      * Gets all classes that are cached in this registry.
103      * 
104      * @return The classes
105      */
106     private Collection getCachedClasses()
107     {
108         return xmlBeanInfos.keySet();
109     }
110 }