01: /*
02: * Created on 5 Jun 2007
03: */
04: package uk.org.ponder.rsac;
05:
06: import org.springframework.beans.BeansException;
07: import org.springframework.beans.factory.BeanFactory;
08: import org.springframework.beans.factory.BeanNotOfRequiredTypeException;
09: import org.springframework.beans.factory.NoSuchBeanDefinitionException;
10:
11: import uk.org.ponder.beanutil.BeanLocator;
12:
13: /**
14: * Adapts the per-request RSAC container to a standard Spring BeanFactory,
15: * primarily for the purpose of beans which report themselves BeanFactoryAware.
16: *
17: * Note that any bean requiring ApplicationContextAware will actually receive
18: * the main application-scope ApplicationContext rather than a request-scope
19: * container.
20: *
21: * @author Antranig Basman (antranig@caret.cam.ac.uk)
22: *
23: */
24:
25: public class RSACBeanFactory implements BeanFactory {
26: private BeanLocator locator;
27: private RSACBeanLocatorImpl rsacbl;
28:
29: public RSACBeanFactory(RSACBeanLocatorImpl rsacbl, BeanLocator bl) {
30: this .locator = bl;
31: this .rsacbl = rsacbl;
32: }
33:
34: public boolean containsBean(String name) {
35: return rsacbl.getBlankContext().containsBean(name);
36: }
37:
38: public String[] getAliases(String name)
39: throws NoSuchBeanDefinitionException {
40: // Aliases are not supported in RSAC
41: return null;
42: }
43:
44: public Object getBean(String name) throws BeansException {
45: return locator.locateBean(name);
46: }
47:
48: public Object getBean(String name, Class requiredType)
49: throws BeansException {
50: Object bean = locator.locateBean(name);
51: if (requiredType != null
52: && !requiredType.isAssignableFrom(bean.getClass())) {
53: throw new BeanNotOfRequiredTypeException(name,
54: requiredType, bean.getClass());
55: }
56: return bean;
57: }
58:
59: // This peculiar method appeared in Spring 2.0
60: public boolean isTypeMatch(String name, Class targetType)
61: throws NoSuchBeanDefinitionException {
62: Object bean = getBean(name);
63: Class typeToMatch = (targetType != null ? targetType
64: : Object.class);
65: return typeToMatch.isAssignableFrom(bean.getClass());
66: }
67:
68: public Class getType(String name)
69: throws NoSuchBeanDefinitionException {
70: Class staticclazz = rsacbl.getBeanClass(name);
71: if (staticclazz == null) {
72: Object bean = getBean(name);
73: return bean.getClass();
74: } else
75: return staticclazz;
76: }
77:
78: public boolean isSingleton(String name)
79: throws NoSuchBeanDefinitionException {
80: RSACBeanInfo rbi = (RSACBeanInfo) rsacbl.getRBIMap().get(name);
81: if (rbi == null) {
82: throw new NoSuchBeanDefinitionException(name,
83: "No such bean");
84: } else
85: return rbi.issingleton;
86: }
87:
88: public boolean isPrototype(String name)
89: throws NoSuchBeanDefinitionException {
90: return !isSingleton(name);
91: }
92:
93: }
|