From 95b96dc4dc5d70d9604e09d890e5d6823d5add8b Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Mon, 21 Mar 2016 12:02:30 +0100 Subject: [PATCH] [ARIES-1508] Let beans created with annotation @Produces could be named with @Named --- .../aries/blueprint/plugin/model/Context.java | 39 ++++++++++++------- .../blueprint/plugin/model/ProducedBean.java | 12 +++++- .../aries/blueprint/plugin/GeneratorTest.java | 18 +++++++++ .../blueprint/plugin/model/BeanTest.java | 3 +- .../aries/blueprint/plugin/test/MyBean5.java | 3 +- .../plugin/test/MyFactoryNamedBean.java | 22 +++++++++++ 6 files changed, 80 insertions(+), 17 deletions(-) create mode 100644 blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyFactoryNamedBean.java diff --git a/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Context.java b/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Context.java index 9bc552fb61..28bbec6f91 100644 --- a/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Context.java +++ b/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Context.java @@ -6,9 +6,9 @@ * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

* Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -18,6 +18,15 @@ */ package org.apache.aries.blueprint.plugin.model; +import org.ops4j.pax.cdi.api.OsgiService; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.service.blueprint.container.BlueprintContainer; +import org.osgi.service.blueprint.container.Converter; + +import javax.enterprise.inject.Produces; +import javax.inject.Named; +import javax.inject.Singleton; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays; @@ -25,14 +34,6 @@ import java.util.SortedSet; import java.util.TreeSet; -import javax.enterprise.inject.Produces; - -import org.ops4j.pax.cdi.api.OsgiService; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; -import org.osgi.service.blueprint.container.BlueprintContainer; -import org.osgi.service.blueprint.container.Converter; - public class Context implements Matcher { SortedSet reg; @@ -70,9 +71,19 @@ private void addBean(Class clazz) { private void addProducedBeans(Class clazz, BeanRef factoryBean) { for (Method method : clazz.getMethods()) { Produces produces = method.getAnnotation(Produces.class); + Named named = method.getAnnotation(Named.class); + Singleton singleton = method.getAnnotation(Singleton.class); if (produces != null) { Class producedClass = method.getReturnType(); - ProducedBean producedBean = new ProducedBean(producedClass, factoryBean, method.getName()); + ProducedBean producedBean; + if (named != null) { + producedBean = new ProducedBean(producedClass, named.value(), factoryBean, method.getName()); + } else { + producedBean = new ProducedBean(producedClass, factoryBean, method.getName()); + } + if (singleton != null) { + producedBean.setSingleton(); + } reg.add(producedBean); } } @@ -108,7 +119,7 @@ public SortedSet getBeans() { TreeSet beans = new TreeSet(); for (BeanRef ref : reg) { if (ref instanceof Bean) { - beans.add((Bean)ref); + beans.add((Bean) ref); } } return beans; @@ -118,7 +129,7 @@ public SortedSet getServiceRefs() { TreeSet serviceRefs = new TreeSet(); for (BeanRef ref : reg) { if (ref instanceof OsgiServiceRef) { - serviceRefs.add((OsgiServiceRef)ref); + serviceRefs.add((OsgiServiceRef) ref); } } return serviceRefs; diff --git a/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/ProducedBean.java b/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/ProducedBean.java index 056f9585b6..f7735dbe91 100644 --- a/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/ProducedBean.java +++ b/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/ProducedBean.java @@ -4,11 +4,21 @@ public class ProducedBean extends Bean { public String factoryMethod; public BeanRef factoryBean; - + public ProducedBean(Class clazz, BeanRef factoryBean, String factoryMethod) { super(clazz); this.factoryBean = factoryBean; this.factoryMethod = factoryMethod; } + public ProducedBean(Class clazz, String id, BeanRef factoryBean, String factoryMethod) { + super(clazz); + this.id = id; + this.factoryBean = factoryBean; + this.factoryMethod = factoryMethod; + } + + public void setSingleton(){ + this.isPrototype = false; + } } diff --git a/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java b/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java index acfa3433fa..3182e7ed25 100644 --- a/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java +++ b/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java @@ -185,6 +185,24 @@ public void testGenerateReferenceWithFilter() throws Exception { assertEquals("(mode=123)", xpath.evaluate("@filter", ser2)); } + @Test + public void testProducesNamedBeans() throws Exception { + Node bean1 = getBeanById("produced1"); + assertEquals("org.apache.aries.blueprint.plugin.test.MyProduced", xpath.evaluate("@class", bean1)); + assertEquals("myFactoryNamedBean", xpath.evaluate("@factory-ref", bean1)); + assertEquals("createBean1", xpath.evaluate("@factory-method", bean1)); + assertEquals("prototype", xpath.evaluate("@scope", bean1)); + + Node bean2 = getBeanById("produced2"); + assertEquals("org.apache.aries.blueprint.plugin.test.MyProduced", xpath.evaluate("@class", bean1)); + assertEquals("myFactoryNamedBean", xpath.evaluate("@factory-ref", bean2)); + assertEquals("createBean2", xpath.evaluate("@factory-method", bean2)); + assertEquals("", xpath.evaluate("@scope", bean2)); + + Node myBean5 = getBeanById("myBean5"); + assertEquals("produced2", xpath.evaluate("argument[8]/@ref", myBean5)); + } + private static Document readToDocument(ByteArrayOutputStream os) throws ParserConfigurationException, SAXException, IOException { InputStream is = new ByteArrayInputStream(os.toByteArray()); diff --git a/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/model/BeanTest.java b/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/model/BeanTest.java index 75fc7d0e97..de0095025b 100644 --- a/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/model/BeanTest.java +++ b/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/model/BeanTest.java @@ -166,7 +166,7 @@ public void testParseBeanWithConstructorInject() { assertNull("There should be no destroyMethod", bean.destroyMethod); assertTrue("There should be no persistenceUnit", bean.persistenceFields.isEmpty()); assertEquals(0, bean.properties.size()); - assertEquals(7, bean.constructorArguments.size()); + assertEquals(8, bean.constructorArguments.size()); assertEquals("my2", bean.constructorArguments.get(0).getRef()); assertEquals("serviceA", bean.constructorArguments.get(1).getRef()); assertEquals("serviceB", bean.constructorArguments.get(2).getRef()); @@ -174,6 +174,7 @@ public void testParseBeanWithConstructorInject() { assertEquals("ser1", bean.constructorArguments.get(4).getRef()); assertEquals("ser2", bean.constructorArguments.get(5).getRef()); assertEquals("serviceA", bean.constructorArguments.get(6).getRef()); + assertEquals("produced2", bean.constructorArguments.get(7).getRef()); } } diff --git a/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean5.java b/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean5.java index ea2fba9bad..e4d3c7070d 100644 --- a/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean5.java +++ b/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean5.java @@ -49,7 +49,8 @@ public MyBean5(@Named("my2") ServiceA serviceA1, @Value("100") int bla, @OsgiService(filter = "myRef") @Named("ser1") ServiceC myReference, @OsgiService(filter = "(mode=123)") @Named("ser2") ServiceC myReference2, - @AnnotatedService ServiceA serviceAAnnotated) { + @AnnotatedService ServiceA serviceAAnnotated, + @Named("produced2") MyProduced myProduced) { this.serviceA1 = serviceA1; this.serviceA2 = serviceA2; this.serviceB = serviceB; diff --git a/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyFactoryNamedBean.java b/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyFactoryNamedBean.java new file mode 100644 index 0000000000..0b62dadbac --- /dev/null +++ b/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyFactoryNamedBean.java @@ -0,0 +1,22 @@ +package org.apache.aries.blueprint.plugin.test; + +import javax.enterprise.inject.Produces; +import javax.inject.Named; +import javax.inject.Singleton; + +@Singleton +public class MyFactoryNamedBean { + + @Produces + @Named("produced1") + public MyProduced createBean1() { + return new MyProduced("My message"); + } + + @Produces + @Named("produced2") + @Singleton + public MyProduced createBean2() { + return new MyProduced("My message"); + } +}