From 84dd56085be3cb751cacd5e0c36b8c88cc42f4cb Mon Sep 17 00:00:00 2001 From: arnaud-mergey Date: Wed, 29 Jul 2020 18:08:50 +0200 Subject: [PATCH] ARIES-1993 support for spring 5 and 6 --- blueprint/blueprint-spring/pom.xml | 17 ++-- .../spring/BlueprintBeanFactory.java | 79 ++++++++++++++++++- .../spring/BlueprintNamespaceHandler.java | 2 +- 3 files changed, 87 insertions(+), 11 deletions(-) diff --git a/blueprint/blueprint-spring/pom.xml b/blueprint/blueprint-spring/pom.xml index 7ce6dcabd9..9be69d5eff 100644 --- a/blueprint/blueprint-spring/pom.xml +++ b/blueprint/blueprint-spring/pom.xml @@ -24,7 +24,7 @@ org.apache.aries.blueprint blueprint-parent - 1.0.0 + 1.0.1-SNAPSHOT ../blueprint-parent/pom.xml @@ -58,9 +58,10 @@ org.apache.aries.blueprint.spring.Activator - 1.0.0 - 1.9.0 - 1.5.0 + 1.0.1 + 1.10.3 + 1.6.1 + 5.3.39 @@ -119,13 +120,13 @@ org.springframework spring-context - 4.2.2.RELEASE + ${spring.version} provided org.springframework spring-beans - 4.2.2.RELEASE + ${spring.version} provided @@ -178,13 +179,13 @@ org.springframework spring-tx - 4.2.2.RELEASE + ${spring.version} test org.springframework spring-aop - 4.2.2.RELEASE + ${spring.version} test diff --git a/blueprint/blueprint-spring/src/main/java/org/apache/aries/blueprint/spring/BlueprintBeanFactory.java b/blueprint/blueprint-spring/src/main/java/org/apache/aries/blueprint/spring/BlueprintBeanFactory.java index 922e182999..bcd929e663 100644 --- a/blueprint/blueprint-spring/src/main/java/org/apache/aries/blueprint/spring/BlueprintBeanFactory.java +++ b/blueprint/blueprint-spring/src/main/java/org/apache/aries/blueprint/spring/BlueprintBeanFactory.java @@ -18,7 +18,9 @@ import java.util.Arrays; import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.apache.aries.blueprint.ComponentDefinitionRegistry; import org.apache.aries.blueprint.services.ExtendedBlueprintContainer; @@ -37,11 +39,14 @@ import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanNotOfRequiredTypeException; import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.NoUniqueBeanDefinitionException; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.core.ResolvableType; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; +import org.springframework.lang.Nullable; public class BlueprintBeanFactory extends DefaultListableBeanFactory implements ResourceLoader { @@ -123,7 +128,7 @@ public List getDependsOn() { @Override public String getClassName() { - return null; + return getDefinition().getBeanClassName(); } @Override @@ -218,7 +223,30 @@ public T getBean(String name, Class requiredType) throws BeansException { @Override public T getBean(Class requiredType) throws BeansException { - throw new UnsupportedOperationException(); + T beanToReturn = null; + Set beanNames = new HashSet(); + for (String name : container.getComponentIds()) { + ComponentMetadata cmeta = container.getComponentMetadata(name); + try { + if (requiredType != null && cmeta != null && cmeta instanceof BeanMetadata + && ((BeanMetadata) cmeta).getClassName() != null + && !requiredType.isAssignableFrom(Class.forName(((BeanMetadata) cmeta).getClassName()))) { + try { + Object bean = getBean(name); + bean = container.getConverter().convert(bean, new ReifiedType(requiredType)); + beanToReturn = (T) bean; + beanNames.add(name); + } catch (Exception ex) { + } + } + } catch (ClassNotFoundException cfne) { + + } + } + if (beanNames.size() > 1) { + throw new NoUniqueBeanDefinitionException(requiredType, beanNames); + } + return beanToReturn; } @Override @@ -265,5 +293,52 @@ public Class getType(String name) throws NoSuchBeanDefinitionException { public String[] getAliases(String name) { throw new UnsupportedOperationException(); } + + @Override + public ObjectProvider getBeanProvider(final Class requiredType) { + return new ObjectProvider() { + @Override + public T getObject() throws BeansException { + return getBean(requiredType); + } + + @Override + public T getObject(Object... args) throws BeansException { + return getBean(requiredType, args); + } + + @Override + @Nullable + public T getIfAvailable() throws BeansException { + try { + return getBean(requiredType); + } catch (NoUniqueBeanDefinitionException ex) { + throw ex; + } catch (NoSuchBeanDefinitionException ex) { + return null; + } + } + + @Override + @Nullable + public T getIfUnique() throws BeansException { + try { + return getBean(requiredType); + } catch (NoSuchBeanDefinitionException ex) { + return null; + } + } + }; + } + + @Override + public ObjectProvider getBeanProvider(ResolvableType requiredType) { + return (ObjectProvider) getBeanProvider(requiredType.resolve()); + } + + @Override + public Class getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException { + return getBean(name).getClass(); + } } } diff --git a/blueprint/blueprint-spring/src/main/java/org/apache/aries/blueprint/spring/BlueprintNamespaceHandler.java b/blueprint/blueprint-spring/src/main/java/org/apache/aries/blueprint/spring/BlueprintNamespaceHandler.java index deee304e19..2547c5307c 100644 --- a/blueprint/blueprint-spring/src/main/java/org/apache/aries/blueprint/spring/BlueprintNamespaceHandler.java +++ b/blueprint/blueprint-spring/src/main/java/org/apache/aries/blueprint/spring/BlueprintNamespaceHandler.java @@ -147,7 +147,7 @@ private org.springframework.beans.factory.xml.ParserContext getOrCreateParserCon if (applicationContext == null) { applicationContext = new SpringApplicationContext(container); registry.registerComponentDefinition(createPassThrough(parserContext, - SPRING_APPLICATION_CONTEXT_ID, applicationContext, "destroy" + SPRING_APPLICATION_CONTEXT_ID, applicationContext, "close" )); } // Create registry