|
18 | 18 |
|
19 | 19 | import java.util.Arrays;
|
20 | 20 | import java.util.Collections;
|
| 21 | +import java.util.HashSet; |
21 | 22 | import java.util.List;
|
| 23 | +import java.util.Set; |
22 | 24 |
|
23 | 25 | import org.apache.aries.blueprint.ComponentDefinitionRegistry;
|
24 | 26 | import org.apache.aries.blueprint.services.ExtendedBlueprintContainer;
|
|
37 | 39 | import org.springframework.beans.factory.BeanFactory;
|
38 | 40 | import org.springframework.beans.factory.BeanNotOfRequiredTypeException;
|
39 | 41 | import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
| 42 | +import org.springframework.beans.factory.NoUniqueBeanDefinitionException; |
| 43 | +import org.springframework.beans.factory.ObjectProvider; |
40 | 44 | import org.springframework.beans.factory.config.BeanDefinition;
|
41 | 45 | import org.springframework.beans.factory.support.DefaultListableBeanFactory;
|
42 | 46 | import org.springframework.core.ResolvableType;
|
43 | 47 | import org.springframework.core.io.Resource;
|
44 | 48 | import org.springframework.core.io.ResourceLoader;
|
| 49 | +import org.springframework.lang.Nullable; |
45 | 50 |
|
46 | 51 | public class BlueprintBeanFactory extends DefaultListableBeanFactory implements ResourceLoader {
|
47 | 52 |
|
@@ -123,7 +128,7 @@ public List<String> getDependsOn() {
|
123 | 128 |
|
124 | 129 | @Override
|
125 | 130 | public String getClassName() {
|
126 |
| - return null; |
| 131 | + return getDefinition().getBeanClassName(); |
127 | 132 | }
|
128 | 133 |
|
129 | 134 | @Override
|
@@ -218,7 +223,30 @@ public <T> T getBean(String name, Class<T> requiredType) throws BeansException {
|
218 | 223 |
|
219 | 224 | @Override
|
220 | 225 | public <T> T getBean(Class<T> requiredType) throws BeansException {
|
221 |
| - throw new UnsupportedOperationException(); |
| 226 | + T beanToReturn = null; |
| 227 | + Set<String> beanNames = new HashSet<String>(); |
| 228 | + for (String name : container.getComponentIds()) { |
| 229 | + ComponentMetadata cmeta = container.getComponentMetadata(name); |
| 230 | + try { |
| 231 | + if (requiredType != null && cmeta != null && cmeta instanceof BeanMetadata |
| 232 | + && ((BeanMetadata) cmeta).getClassName() != null |
| 233 | + && !requiredType.isAssignableFrom(Class.forName(((BeanMetadata) cmeta).getClassName()))) { |
| 234 | + try { |
| 235 | + Object bean = getBean(name); |
| 236 | + bean = container.getConverter().convert(bean, new ReifiedType(requiredType)); |
| 237 | + beanToReturn = (T) bean; |
| 238 | + beanNames.add(name); |
| 239 | + } catch (Exception ex) { |
| 240 | + } |
| 241 | + } |
| 242 | + } catch (ClassNotFoundException cfne) { |
| 243 | + |
| 244 | + } |
| 245 | + } |
| 246 | + if (beanNames.size() > 1) { |
| 247 | + throw new NoUniqueBeanDefinitionException(requiredType, beanNames); |
| 248 | + } |
| 249 | + return beanToReturn; |
222 | 250 | }
|
223 | 251 |
|
224 | 252 | @Override
|
@@ -265,5 +293,52 @@ public Class<?> getType(String name) throws NoSuchBeanDefinitionException {
|
265 | 293 | public String[] getAliases(String name) {
|
266 | 294 | throw new UnsupportedOperationException();
|
267 | 295 | }
|
| 296 | + |
| 297 | + @Override |
| 298 | + public <T> ObjectProvider<T> getBeanProvider(final Class<T> requiredType) { |
| 299 | + return new ObjectProvider<T>() { |
| 300 | + @Override |
| 301 | + public T getObject() throws BeansException { |
| 302 | + return getBean(requiredType); |
| 303 | + } |
| 304 | + |
| 305 | + @Override |
| 306 | + public T getObject(Object... args) throws BeansException { |
| 307 | + return getBean(requiredType, args); |
| 308 | + } |
| 309 | + |
| 310 | + @Override |
| 311 | + @Nullable |
| 312 | + public T getIfAvailable() throws BeansException { |
| 313 | + try { |
| 314 | + return getBean(requiredType); |
| 315 | + } catch (NoUniqueBeanDefinitionException ex) { |
| 316 | + throw ex; |
| 317 | + } catch (NoSuchBeanDefinitionException ex) { |
| 318 | + return null; |
| 319 | + } |
| 320 | + } |
| 321 | + |
| 322 | + @Override |
| 323 | + @Nullable |
| 324 | + public T getIfUnique() throws BeansException { |
| 325 | + try { |
| 326 | + return getBean(requiredType); |
| 327 | + } catch (NoSuchBeanDefinitionException ex) { |
| 328 | + return null; |
| 329 | + } |
| 330 | + } |
| 331 | + }; |
| 332 | + } |
| 333 | + |
| 334 | + @Override |
| 335 | + public <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType) { |
| 336 | + return (ObjectProvider<T>) getBeanProvider(requiredType.resolve()); |
| 337 | + } |
| 338 | + |
| 339 | + @Override |
| 340 | + public Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException { |
| 341 | + return getBean(name).getClass(); |
| 342 | + } |
268 | 343 | }
|
269 | 344 | }
|
0 commit comments