001 package org.apache.commons.betwixt.registry;
002
003 /*
004 * Licensed to the Apache Software Foundation (ASF) under one or more
005 * contributor license agreements. See the NOTICE file distributed with
006 * this work for additional information regarding copyright ownership.
007 * The ASF licenses this file to You under the Apache License, Version 2.0
008 * (the "License"); you may not use this file except in compliance with
009 * the License. You may obtain a copy of the License at
010 *
011 * http://www.apache.org/licenses/LICENSE-2.0
012 *
013 * Unless required by applicable law or agreed to in writing, software
014 * distributed under the License is distributed on an "AS IS" BASIS,
015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016 * See the License for the specific language governing permissions and
017 * limitations under the License.
018 */
019
020 import java.util.Collection;
021 import java.util.HashMap;
022 import java.util.Iterator;
023 import java.util.Map;
024
025 import org.apache.commons.betwixt.ElementDescriptor;
026 import org.apache.commons.betwixt.XMLBeanInfo;
027 import org.apache.commons.betwixt.io.read.ElementMapping;
028 import org.apache.commons.betwixt.io.read.ReadContext;
029
030 /** The default caching implementation.
031 * A hashmap is used.
032 *
033 * @author <a href="mailto:rdonkin@apache.org">Robert Burrell Donkin</a>
034 * @version $Id: DefaultXMLBeanInfoRegistry.java 438373 2006-08-30 05:17:21Z bayard $
035 */
036 public class DefaultXMLBeanInfoRegistry implements XMLBeanInfoRegistry, PolymorphicReferenceResolver {
037
038 /** Used to associated <code>XMLBeanInfo</code>'s to classes */
039 private Map xmlBeanInfos = new HashMap();
040
041 /**
042 * Get <code>XMLBeanInfo</code> from cache.
043 *
044 * @param forThisClass the class for which to find a <code>XMLBeanInfo</code>
045 * @return cached <code>XMLBeanInfo</code> associated with given class
046 * or <code>null</code> if no <code>XMLBeanInfo</code> has been associated
047 */
048 public XMLBeanInfo get(Class forThisClass) {
049 return (XMLBeanInfo) xmlBeanInfos.get(forThisClass);
050 }
051
052 /**
053 * Put into cache
054 *
055 * @param forThisClass the class to cache the <code>XMLBeanInfo</code> for
056 * @param beanInfo the <code>XMLBeanInfo</code> to cache
057 */
058 public void put(Class forThisClass, XMLBeanInfo beanInfo) {
059 xmlBeanInfos.put(forThisClass, beanInfo);
060 }
061
062 /**
063 * Flush existing cached <code>XMLBeanInfo</code>'s.
064 */
065 public void flush() {
066 xmlBeanInfos.clear();
067 }
068
069 /**
070 * Checks all registered <code>XMLBeanInfo</code>'s for the
071 * first suitable match.
072 * If a suitable one is found, then the class of that info is used.
073 * @see org.apache.commons.betwixt.registry.PolymorphicReferenceResolver#resolveType(org.apache.commons.betwixt.io.read.ElementMapping, org.apache.commons.betwixt.io.read.ReadContext)
074 * @since 0.7
075 */
076 public Class resolveType(ElementMapping mapping, ReadContext context) {
077 Class result = null;
078 Collection cachedClasses = getCachedClasses();
079 ElementDescriptor mappedDescriptor = mapping.getDescriptor();
080 Class mappedType = mappedDescriptor.getSingularPropertyType();
081 if (mappedType == null) {
082 mappedType = mappedDescriptor.getPropertyType();
083 }
084 for (Iterator it = cachedClasses.iterator(); it.hasNext();) {
085 XMLBeanInfo beanInfo = get((Class)it.next());
086 ElementDescriptor typeDescriptor = beanInfo.getElementDescriptor();
087 boolean sameName = mapping.getName().equals(typeDescriptor.getQualifiedName());
088 if (sameName)
089 {
090
091 boolean compatibleClass = mappedType.isAssignableFrom(beanInfo.getBeanClass());
092 if (compatibleClass ) {
093 result = beanInfo.getBeanClass();
094 break;
095 }
096 }
097 }
098 return result;
099 }
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 }