(no commit message)
[utils] / support / src / org / wamblee / general / SpringBeanFactory.java
1 /*
2  * Copyright 2005 the original author or authors.
3  * 
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  * 
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  * 
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.wamblee.general;
17
18 import org.springframework.beans.BeansException;
19 import org.springframework.beans.factory.access.BeanFactoryLocator;
20 import org.springframework.beans.factory.access.BeanFactoryReference;
21 import org.springframework.context.access.ContextSingletonBeanFactoryLocator;
22
23 /**
24  * Bean factory which uses Spring. This bean factory cannot be configured
25  * directly in the {@link org.wamblee.general.BeanKernel} because it does not
26  * provide a default no-arg constructor. Therefore, it must be delegated to or
27  * it must tbe subclassed to provide a default constructor.
28  */
29 public class SpringBeanFactory implements BeanFactory {
30
31     private BeanFactoryReference _factoryReference;
32
33     /**
34      * Constructs the bean factory.
35      * 
36      * @param aSelector
37      *            Selector to find the appropriate bean ref context.
38      * @param aFactoryName
39      *            Spring bean factory to use.
40      */
41     public SpringBeanFactory(String aSelector, String aFactoryName) {
42         try {
43             BeanFactoryLocator locator = ContextSingletonBeanFactoryLocator
44                     .getInstance(aSelector);
45             _factoryReference = locator.useBeanFactory(aFactoryName);
46         } catch (BeansException e) {
47             throw new BeanFactoryException(
48                     "Could not load bean factory: selector = '" + aSelector
49                             + "', factory = '" + aFactoryName + "'", e);
50         }
51     }
52
53     /*
54      * (non-Javadoc)
55      * 
56      * @see org.wamblee.general.BeanFactory#find(java.lang.String)
57      */
58     public Object find(String aId) {
59         return find(aId, Object.class);
60     }
61
62     /*
63      * (non-Javadoc)
64      * 
65      * @see org.wamblee.general.BeanFactory#find(java.lang.Class)
66      */
67     public <T> T find(Class<T> aClass) {
68         return find(aClass.getName(), aClass);
69     }
70
71     /*
72      * (non-Javadoc)
73      * 
74      * @see org.wamblee.general.BeanFactory#find(java.lang.String,
75      *      java.lang.Class)
76      */
77     public <T> T find(String aId, Class<T> aClass) {
78         try {
79             Object obj = _factoryReference.getFactory().getBean(aId, aClass);
80             assert obj != null;
81             return aClass.cast(obj);
82         } catch (BeansException e) {
83             throw new BeanFactoryException(e.getMessage(), e);
84         }
85     }
86
87 }