001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.servicemix.common.xbean;
018    
019    import java.util.Map;
020    
021    import org.springframework.beans.BeansException;
022    import org.springframework.beans.factory.BeanFactory;
023    import org.springframework.beans.factory.BeanNotOfRequiredTypeException;
024    import org.springframework.beans.factory.NoSuchBeanDefinitionException;
025    import org.springframework.beans.factory.BeanDefinitionStoreException;
026    
027    /**
028     * A simple BeanFactory containing a set of predefined beans which can be used
029     * as a parent for another BeanFactory.
030     *  
031     * @author gnodet
032     */
033    public class SimpleBeanFactory implements BeanFactory {
034        
035        private final Map beans;
036        
037        public SimpleBeanFactory(Map beans) {
038            this.beans = beans;
039        }
040        public boolean containsBean(String name) {
041            return beans.containsKey(name);
042        }
043        public String[] getAliases(String name) throws NoSuchBeanDefinitionException {
044            Object bean = beans.get(name);
045            if (bean == null) {
046                throw new NoSuchBeanDefinitionException(name);
047            }
048            return new String[0];
049        }
050        public Object getBean(String name) throws BeansException {
051            return getBean(name, (Class) null);
052        }
053        public Object getBean(String name, Class requiredType) throws BeansException {
054            Object bean = beans.get(name);
055            if (bean == null) {
056                throw new NoSuchBeanDefinitionException(name);
057            }
058            if (requiredType != null && !requiredType.isInstance(bean)) {
059                throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
060            }
061            return bean;
062        }
063        public Object getBean(String name, Object[] args) throws BeansException {
064            if (args != null) {
065                throw new BeanDefinitionStoreException("Bean is not a prototype");
066            }
067            return getBean(name, (Class) null);
068        }
069        public Class getType(String name) throws NoSuchBeanDefinitionException {
070            Object bean = beans.get(name);
071            if (bean == null) {
072                throw new NoSuchBeanDefinitionException(name);
073            }
074            return bean.getClass();
075        }
076        public boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
077            Object bean = beans.get(name);
078            if (bean == null) {
079                throw new NoSuchBeanDefinitionException(name);
080            }
081            return true;
082        }
083        public boolean isTypeMatch(String name, Class targetType) throws NoSuchBeanDefinitionException {
084            if (!beans.containsKey(name)) {
085                throw new NoSuchBeanDefinitionException(name);
086            }
087            if (targetType == null || Object.class.equals(targetType)) {
088                return true;
089            }
090            return targetType.isAssignableFrom(beans.get(name).getClass());
091        }
092        public boolean isPrototype(String name) {
093            return false;
094        }
095        
096    }