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 diff --git a/spring/pom.xml b/spring/pom.xml index 59fc2e6..61f9c2d 100644 --- a/spring/pom.xml +++ b/spring/pom.xml @@ -42,11 +42,10 @@ - javax.enterprise - cdi-api - 1.0-SP1 - jar - compile + org.apache.geronimo.specs + geronimo-jcdi_1.0_spec + 1.0 + provided junit @@ -60,6 +59,7 @@ org.aspectj aspectjrt ${aspectj.version} + test @@ -77,24 +77,19 @@ org.springframework spring-aop ${spring.version} + test org.springframework spring-aspects ${spring.version} + test org.springframework spring-web ${spring.version} - - - org.springframework - spring-tx - ${spring.version} - - org.apache.geronimo.specs geronimo-servlet_3.0_spec 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..043a53d 100644 --- a/spring/src/main/java/org/cdisource/springintegration/CdiBeanFactoryPostProcessor.java +++ b/spring/src/main/java/org/cdisource/springintegration/CdiBeanFactoryPostProcessor.java @@ -1,18 +1,23 @@ package org.cdisource.springintegration; +import java.lang.reflect.Type; 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(); @@ -33,23 +38,40 @@ public void postProcessBeanFactory( if (bean.getName()!=null && bean.getName().equals("Spring Injection")){ continue; } + logger.debug("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()); + logger.debug("bean name = {}, bean class = {}", bean.getName(), beanClass.getName()); + } + } + + private Class getBeanClass(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"); + + } } }