001 /**
002 * Copyright 2005-2011 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.rice.test;
017
018 import org.apache.commons.logging.Log;
019 import org.apache.commons.logging.LogFactory;
020 import org.kuali.rice.core.impl.resourceloader.SpringResourceLoader;
021 import org.springframework.beans.BeansException;
022 import org.springframework.beans.factory.BeanFactory;
023 import org.springframework.beans.factory.NoSuchBeanDefinitionException;
024
025 import java.util.ArrayList;
026 import java.util.Collection;
027
028 /**
029 * Wraps a collection of bean factories delegating to the inner bean factories.
030 *
031 * The first bean factory that returns a non-null/true result is the value that is returned/
032 */
033 public final class CompositeBeanFactory implements BeanFactory {
034
035 private static final Log LOG = LogFactory.getLog(CompositeBeanFactory.class);
036
037 private final Collection<BeanFactory> factories;
038
039 public static BeanFactory createBeanFactory(Collection<? extends SpringResourceLoader> rls) {
040 if (rls == null || rls.isEmpty()) {
041 throw new IllegalArgumentException("rls is null or empty");
042 }
043
044 final Collection<BeanFactory> bfs = new ArrayList<BeanFactory>();
045 for (SpringResourceLoader rl : rls) {
046 bfs.add(rl.getContext());
047 }
048 return new CompositeBeanFactory(bfs);
049 }
050
051 public CompositeBeanFactory(Collection<? extends BeanFactory> factories) {
052 if (factories == null || factories.isEmpty()) {
053 throw new IllegalArgumentException("factories is null or empty");
054 }
055
056 this.factories = new ArrayList<BeanFactory>(factories);
057 }
058
059 @Override
060 public Object getBean(String name) throws BeansException {
061 for (BeanFactory f : factories) {
062 try {
063 Object o = f.getBean(name);
064 if (o != null) {
065 return o;
066 }
067 } catch (BeansException e) {
068 LOG.debug("bean exception", e);
069 }
070 }
071 return null;
072 }
073
074 @Override
075 public <T> T getBean(String name, Class<T> requiredType) throws BeansException {
076 for (BeanFactory f : factories) {
077 try {
078 T t = f.getBean(name, requiredType);
079 if (t != null) {
080 return t;
081 }
082 } catch (BeansException e) {
083 LOG.info("bean exception", e);
084 }
085 }
086 return null;
087 }
088
089 @Override
090 public <T> T getBean(Class<T> requiredType) throws BeansException {
091 for (BeanFactory f : factories) {
092 try {
093 T t = f.getBean(requiredType);
094 if (t != null) {
095 return t;
096 }
097 } catch (BeansException e) {
098 LOG.info("bean exception", e);
099 }
100 }
101 return null;
102 }
103
104 @Override
105 public Object getBean(String name, Object... args) throws BeansException {
106 for (BeanFactory f : factories) {
107 try {
108 Object o = f.getBean(name, args);
109 if (o != null) {
110 return o;
111 }
112 } catch (BeansException e) {
113 LOG.info("bean exception", e);
114 }
115 }
116 return null;
117 }
118
119 @Override
120 public boolean containsBean(String name) {
121 for (BeanFactory f : factories) {
122 try {
123 boolean b = f.containsBean(name);
124 if (b) {
125 return b;
126 }
127 } catch (BeansException e) {
128 LOG.info("bean exception", e);
129 }
130 }
131 return false;
132 }
133
134 @Override
135 public boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
136 for (BeanFactory f : factories) {
137 try {
138 boolean b = f.isSingleton(name);
139 if (b) {
140 return b;
141 }
142 } catch (BeansException e) {
143 LOG.info("bean exception", e);
144 }
145 }
146 return false;
147 }
148
149 @Override
150 public boolean isPrototype(String name) throws NoSuchBeanDefinitionException {
151 for (BeanFactory f : factories) {
152 try {
153 boolean b = f.isPrototype(name);
154 if (b) {
155 return b;
156 }
157 } catch (BeansException e) {
158 LOG.info("bean exception", e);
159 }
160 }
161 return false;
162 }
163
164 @Override
165 public boolean isTypeMatch(String name, Class targetType) throws NoSuchBeanDefinitionException {
166 for (BeanFactory f : factories) {
167 try {
168 boolean b = f.isTypeMatch(name, targetType);
169 if (b) {
170 return b;
171 }
172 } catch (BeansException e) {
173 LOG.info("bean exception", e);
174 }
175 }
176 return false;
177 }
178
179 @Override
180 public Class<?> getType(String name) throws NoSuchBeanDefinitionException {
181 for (BeanFactory f : factories) {
182 try {
183 Class<?> c = f.getType(name);
184 if (c != null) {
185 return c;
186 }
187 } catch (BeansException e) {
188 LOG.info("bean exception", e);
189 }
190 }
191 return null;
192 }
193
194 @Override
195 public String[] getAliases(String name) {
196 for (BeanFactory f : factories) {
197 try {
198 String[] s = f.getAliases(name);
199 if (s != null) {
200 return s;
201 }
202 } catch (BeansException e) {
203 LOG.info("bean exception", e);
204 }
205 }
206 return null;
207 }
208 }