From 1230606adac945091ad1586de8e7cf7fdf8a199f Mon Sep 17 00:00:00 2001 From: Harald Wellmann Date: Sat, 28 May 2011 21:45:02 +0200 Subject: [PATCH 1/4] fixes to springbridge for named beans --- spring/pom.xml | 16 +++-- spring/src/META-INF/MANIFEST.MF | 3 + .../CdiBeanFactoryPostProcessor.java | 64 +++++++++++++++++-- .../springintegration/CdiFactoryBean.java | 14 ++-- .../main/resources/META-INF/web-fragment.xml | 2 +- .../springintegration/ProducerBean.java | 17 +++++ .../SpringBeanUsingAutoWired.java | 19 ++++++ 7 files changed, 122 insertions(+), 13 deletions(-) create mode 100644 spring/src/META-INF/MANIFEST.MF create mode 100644 spring/src/test/java/org/cdisource/springintegration/ProducerBean.java diff --git a/spring/pom.xml b/spring/pom.xml index 59fc2e6..268322c 100644 --- a/spring/pom.xml +++ b/spring/pom.xml @@ -46,7 +46,7 @@ cdi-api 1.0-SP1 jar - compile + provided junit @@ -60,6 +60,7 @@ org.aspectj aspectjrt ${aspectj.version} + test @@ -77,22 +78,26 @@ org.springframework spring-aop ${spring.version} + test org.springframework spring-aspects ${spring.version} + test org.springframework spring-web ${spring.version} + test org.springframework spring-tx ${spring.version} + test @@ -159,7 +164,7 @@ resin - true + false @@ -186,12 +191,15 @@ weld - + + true + + org.cdisource.beancontainer diff --git a/spring/src/META-INF/MANIFEST.MF b/spring/src/META-INF/MANIFEST.MF new file mode 100644 index 0000000..5e94951 --- /dev/null +++ b/spring/src/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/spring/src/main/java/org/cdisource/springintegration/CdiBeanFactoryPostProcessor.java b/spring/src/main/java/org/cdisource/springintegration/CdiBeanFactoryPostProcessor.java index 86de614..70fd504 100644 --- a/spring/src/main/java/org/cdisource/springintegration/CdiBeanFactoryPostProcessor.java +++ b/spring/src/main/java/org/cdisource/springintegration/CdiBeanFactoryPostProcessor.java @@ -1,9 +1,14 @@ package org.cdisource.springintegration; +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; import java.util.Set; import javax.enterprise.inject.spi.Bean; import javax.inject.Named; + import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; @@ -33,23 +38,74 @@ public void postProcessBeanFactory( if (bean.getName()!=null && bean.getName().equals("Spring Injection")){ continue; } + System.out.println("bean types = " + bean.getTypes()); + Class beanClass = getBeanClass(bean); BeanDefinitionBuilder definition = BeanDefinitionBuilder.rootBeanDefinition(CdiFactoryBean.class) - .addPropertyValue("beanClass", bean.getBeanClass()) + .addPropertyValue("beanClass", beanClass) .addPropertyValue("beanManager", beanManagerLocationUtil.beanManager()) + .addPropertyValue("qualifiers", bean.getQualifiers()) .setLazyInit(true); String name = generateName(bean); factory.registerBeanDefinition(name, definition.getBeanDefinition()); + System.out.println("bean name = " + name +", bean class = " + beanClass.getName()); + } + } + + private List getAnnotation(Bean bean) { + Named named = bean.getBeanClass().getAnnotation(Named.class); + ArrayList annotations = new ArrayList(); + if (named != null) { + annotations.add(named); + } + return annotations; + } + + private Class getBeanClass(Bean bean) { +// if (bean.getTypes().contains(bean.getBeanClass())) { +// return bean.getBeanClass(); +// } +// +// if (bean.getTypes().contains(String.class)) { +// return String.class; +// } +// +// Stateless stateless = bean.getBeanClass().getAnnotation(Stateless.class); +// if (stateless == null) { +// return bean.getBeanClass(); +// } +// for (Type type : bean.getTypes()) { +// if (type instanceof Class) { +// Class cls = (Class) type; +// if (cls.isInterface()) { +// return cls; +// } +// } +// } +// return null; + return getMostDerivedClass(bean); + } + + private Class getMostDerivedClass(Bean bean) { + Class klass = Object.class; + for (Type type : bean.getTypes()) { + if (type instanceof Class) { + Class currentClass = (Class) type; + if (klass.isAssignableFrom(currentClass)) { + klass = currentClass; + } + } } + return klass; } private String generateName(Bean bean) { - Named named = (Named) bean.getBeanClass().getAnnotation(Named.class); - String name = named != null ? named.value() : generateNameBasedOnClassName(bean); + String name = bean.getName() != null ? bean.getName() : generateNameBasedOnClassName(bean); return name; } private String generateNameBasedOnClassName(Bean bean) { - return !useLongName ? bean.getBeanClass().getSimpleName() + "FactoryBean" : bean.getBeanClass().getName().replace(".", "_") + "FactoryBean"; + Class beanClass = getBeanClass(bean); + return !useLongName ? beanClass.getSimpleName() + "FactoryBean" : beanClass.getName().replace(".", "_") + "FactoryBean"; } diff --git a/spring/src/main/java/org/cdisource/springintegration/CdiFactoryBean.java b/spring/src/main/java/org/cdisource/springintegration/CdiFactoryBean.java index cf60a16..8d4723a 100644 --- a/spring/src/main/java/org/cdisource/springintegration/CdiFactoryBean.java +++ b/spring/src/main/java/org/cdisource/springintegration/CdiFactoryBean.java @@ -1,12 +1,15 @@ package org.cdisource.springintegration; +import java.lang.annotation.Annotation; +import java.util.Set; + import javax.enterprise.inject.spi.BeanManager; -import org.springframework.beans.factory.FactoryBean; -import org.springframework.beans.factory.InitializingBean; import org.cdisource.beancontainer.BeanContainer; import org.cdisource.beancontainer.BeanContainerImpl; +import org.springframework.beans.factory.FactoryBean; +import org.springframework.beans.factory.InitializingBean; public class CdiFactoryBean implements FactoryBean, InitializingBean { @@ -14,7 +17,7 @@ public class CdiFactoryBean implements FactoryBean, InitializingBean { private boolean singleton = true; private BeanContainer beanContainer; private BeanManager beanManager; - + private Set qualifiers; @Override public void afterPropertiesSet() throws Exception { @@ -28,7 +31,7 @@ public void setBeanClass(Class beanClass) { @Override public Object getObject() throws Exception { - return beanContainer.getBeanByType(beanClass); + return beanContainer.getBeanByType(beanClass, qualifiers.toArray(new Annotation[]{})); } @Override @@ -49,4 +52,7 @@ public void setBeanManager(BeanManager beanManager) { this.beanManager = beanManager; } + public void setQualifiers(Set qualifiers) { + this.qualifiers = qualifiers; + } } diff --git a/spring/src/main/resources/META-INF/web-fragment.xml b/spring/src/main/resources/META-INF/web-fragment.xml index 2de8541..1b68a51 100644 --- a/spring/src/main/resources/META-INF/web-fragment.xml +++ b/spring/src/main/resources/META-INF/web-fragment.xml @@ -2,7 +2,7 @@ - Spring CDI Bridge + SpringCDIBridge diff --git a/spring/src/test/java/org/cdisource/springintegration/ProducerBean.java b/spring/src/test/java/org/cdisource/springintegration/ProducerBean.java new file mode 100644 index 0000000..7fb8bef --- /dev/null +++ b/spring/src/test/java/org/cdisource/springintegration/ProducerBean.java @@ -0,0 +1,17 @@ +package org.cdisource.springintegration; + +import javax.enterprise.inject.Produces; +import javax.inject.Named; + +public class ProducerBean { + + @Produces @Named("mailHost") + public String mailHost() { + return "mail.example.com"; + } + + @Produces @Named("mailReceiver") + public String mailReceiver() { + return "joe.user@example.com"; + } +} diff --git a/spring/src/test/java/org/cdisource/springintegration/SpringBeanUsingAutoWired.java b/spring/src/test/java/org/cdisource/springintegration/SpringBeanUsingAutoWired.java index bcec0b6..b2b766e 100644 --- a/spring/src/test/java/org/cdisource/springintegration/SpringBeanUsingAutoWired.java +++ b/spring/src/test/java/org/cdisource/springintegration/SpringBeanUsingAutoWired.java @@ -1,4 +1,7 @@ package org.cdisource.springintegration; +import javax.inject.Inject; +import javax.inject.Named; + import org.springframework.beans.factory.annotation.Autowired; public class SpringBeanUsingAutoWired { @@ -8,6 +11,12 @@ public class SpringBeanUsingAutoWired { @Autowired ClassWithInjectionPoints foo; + @Inject @Named("mailHost") + String mailHost; + + @Inject @Named("mailReceiver") + String mailReceiver; + public void validate() { if (bean == null) { throw new IllegalStateException("CDI bean is null"); @@ -21,6 +30,16 @@ public void validate() { throw new IllegalStateException("you got no foo bean and I pity you!"); } + + if (mailHost == null) { + throw new IllegalStateException("mailHost is null"); + + } + + if (mailReceiver == null) { + throw new IllegalStateException("mailReceiver is null"); + + } } } From 5dfa1d1b35c729c045e70b710625221679cc6197 Mon Sep 17 00:00:00 2001 From: Harald Wellmann Date: Tue, 14 Jun 2011 23:23:34 +0200 Subject: [PATCH 2/4] dependency cleanup --- spring/pom.xml | 31 +++++++++---------------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/spring/pom.xml b/spring/pom.xml index 268322c..61f9c2d 100644 --- a/spring/pom.xml +++ b/spring/pom.xml @@ -42,10 +42,9 @@ - javax.enterprise - cdi-api - 1.0-SP1 - jar + org.apache.geronimo.specs + geronimo-jcdi_1.0_spec + 1.0 provided @@ -60,7 +59,7 @@ org.aspectj aspectjrt ${aspectj.version} - test + test @@ -78,28 +77,19 @@ org.springframework spring-aop ${spring.version} - test + test org.springframework spring-aspects ${spring.version} - test + test org.springframework spring-web ${spring.version} - test - - - - org.springframework - spring-tx - ${spring.version} - test - org.apache.geronimo.specs geronimo-servlet_3.0_spec @@ -164,7 +154,7 @@ resin - false + true @@ -191,15 +181,12 @@ weld - - true - - + org.cdisource.beancontainer From 7ab7690e61e8e99d546920c716dbb3ea00194d37 Mon Sep 17 00:00:00 2001 From: Harald Wellmann Date: Tue, 14 Jun 2011 23:24:57 +0200 Subject: [PATCH 3/4] use Logger and weed out obsolete code --- .../CdiBeanFactoryPostProcessor.java | 46 +++---------------- 1 file changed, 6 insertions(+), 40 deletions(-) diff --git a/spring/src/main/java/org/cdisource/springintegration/CdiBeanFactoryPostProcessor.java b/spring/src/main/java/org/cdisource/springintegration/CdiBeanFactoryPostProcessor.java index 70fd504..043a53d 100644 --- a/spring/src/main/java/org/cdisource/springintegration/CdiBeanFactoryPostProcessor.java +++ b/spring/src/main/java/org/cdisource/springintegration/CdiBeanFactoryPostProcessor.java @@ -1,23 +1,23 @@ package org.cdisource.springintegration; -import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; import java.util.Set; import javax.enterprise.inject.spi.Bean; -import javax.inject.Named; +import org.cdisource.logging.Logger; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.DefaultListableBeanFactory; +import static org.cdisource.logging.LogFactoryManager.logger; public class CdiBeanFactoryPostProcessor implements BeanFactoryPostProcessor { + private static Logger logger = logger(CdiBeanFactoryPostProcessor.class); + private boolean useLongName; private BeanManagerLocationUtil beanManagerLocationUtil = new BeanManagerLocationUtil(); @@ -38,7 +38,7 @@ public void postProcessBeanFactory( if (bean.getName()!=null && bean.getName().equals("Spring Injection")){ continue; } - System.out.println("bean types = " + bean.getTypes()); + logger.debug("bean types = {}", bean.getTypes()); Class beanClass = getBeanClass(bean); BeanDefinitionBuilder definition = BeanDefinitionBuilder.rootBeanDefinition(CdiFactoryBean.class) .addPropertyValue("beanClass", beanClass) @@ -47,45 +47,11 @@ public void postProcessBeanFactory( .setLazyInit(true); String name = generateName(bean); factory.registerBeanDefinition(name, definition.getBeanDefinition()); - System.out.println("bean name = " + name +", bean class = " + beanClass.getName()); - } - } - - private List getAnnotation(Bean bean) { - Named named = bean.getBeanClass().getAnnotation(Named.class); - ArrayList annotations = new ArrayList(); - if (named != null) { - annotations.add(named); + logger.debug("bean name = {}, bean class = {}", bean.getName(), beanClass.getName()); } - return annotations; } private Class getBeanClass(Bean bean) { -// if (bean.getTypes().contains(bean.getBeanClass())) { -// return bean.getBeanClass(); -// } -// -// if (bean.getTypes().contains(String.class)) { -// return String.class; -// } -// -// Stateless stateless = bean.getBeanClass().getAnnotation(Stateless.class); -// if (stateless == null) { -// return bean.getBeanClass(); -// } -// for (Type type : bean.getTypes()) { -// if (type instanceof Class) { -// Class cls = (Class) type; -// if (cls.isInterface()) { -// return cls; -// } -// } -// } -// return null; - return getMostDerivedClass(bean); - } - - private Class getMostDerivedClass(Bean bean) { Class klass = Object.class; for (Type type : bean.getTypes()) { if (type instanceof Class) { From 8546f0a46d61c92a2756f2bf965502c79ced741e Mon Sep 17 00:00:00 2001 From: Harald Wellmann Date: Tue, 14 Jun 2011 23:26:35 +0200 Subject: [PATCH 4/4] use provided scope for CDI API --- beancontainer/api/pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/beancontainer/api/pom.xml b/beancontainer/api/pom.xml index b8996e1..4a74889 100644 --- a/beancontainer/api/pom.xml +++ b/beancontainer/api/pom.xml @@ -25,8 +25,7 @@ javax.enterprise cdi-api 1.0-SP1 - jar - compile + provided junit