You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by cs...@apache.org on 2016/05/02 10:54:36 UTC

svn commit: r1741938 - in /aries/trunk/blueprint/blueprint-maven-plugin/src: main/java/org/apache/aries/blueprint/plugin/model/ test/java/org/apache/aries/blueprint/plugin/ test/java/org/apache/aries/blueprint/plugin/test/

Author: cschneider
Date: Mon May  2 08:54:36 2016
New Revision: 1741938

URL: http://svn.apache.org/viewvc?rev=1741938&view=rev
Log:
[ARIES-1531] Add arguments to produced bean based on factory method parameters

Added:
    aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyProducedWithConstructor.java
      - copied, changed from r1741936, aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyFactoryBean.java
Modified:
    aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java
    aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Context.java
    aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/ProducedBean.java
    aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java
    aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyFactoryBean.java

Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java?rev=1741938&r1=1741937&r2=1741938&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java Mon May  2 08:54:36 2016
@@ -89,7 +89,7 @@ public class Bean extends BeanRef {
         }
     }
 
-    private void resolveConstructorArguments(Matcher matcher) {
+    protected void resolveConstructorArguments(Matcher matcher) {
         Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors();
         for (Constructor constructor : declaredConstructors) {
             Annotation inject = constructor.getAnnotation(Inject.class);
@@ -97,44 +97,48 @@ public class Bean extends BeanRef {
             if (inject != null || autowired != null || declaredConstructors.length == 1) {
                 Class[] parameterTypes = constructor.getParameterTypes();
                 Annotation[][] parameterAnnotations = constructor.getParameterAnnotations();
-                for (int i = 0; i < parameterTypes.length; ++i) {
-                    Annotation[] annotations = parameterAnnotations[i];
-                    String ref = null;
-                    String value = null;
-                    Value valueAnnotation = findAnnotation(annotations, Value.class);
-                    OsgiService osgiServiceAnnotation = findAnnotation(annotations, OsgiService.class);
+                resolveParametersForConstructor(matcher, parameterTypes, parameterAnnotations);
+                break;
+            }
+        }
+    }
 
-                    if (valueAnnotation != null) {
-                        value = valueAnnotation.value();
-                    }
+    protected void resolveParametersForConstructor(Matcher matcher, Class[] parameterTypes, Annotation[][] parameterAnnotations) {
+        for (int i = 0; i < parameterTypes.length; ++i) {
+            Annotation[] annotations = parameterAnnotations[i];
+            String ref = null;
+            String value = null;
+            Value valueAnnotation = findAnnotation(annotations, Value.class);
+            OsgiService osgiServiceAnnotation = findAnnotation(annotations, OsgiService.class);
 
-                    if (osgiServiceAnnotation != null) {
-                        Named namedAnnotation = findAnnotation(annotations, Named.class);
-                        ref = namedAnnotation != null ? namedAnnotation.value() : getBeanNameFromSimpleName(parameterTypes[i].getSimpleName());
-                        OsgiServiceRef osgiServiceRef = new OsgiServiceRef(parameterTypes[i], osgiServiceAnnotation, ref);
-                        serviceRefs.add(osgiServiceRef);
-                    }
+            if (valueAnnotation != null) {
+                value = valueAnnotation.value();
+            }
 
-                    if (ref == null && value == null && osgiServiceAnnotation == null) {
-                        BeanRef template = new BeanRef(parameterTypes[i]);
-                        template.setQualifiersFromAnnotations(annotations);
-                        BeanRef bean = matcher.getMatching(template);
-                        if (bean != null) {
-                            ref = bean.id;
-                        } else {
-                            Named namedAnnotation = findAnnotation(annotations, Named.class);
-                            if (namedAnnotation != null) {
-                                ref = namedAnnotation.value();
-                            } else {
-                                ref = getBeanName(parameterTypes[i]);
-                            }
-                        }
-                    }
+            if (osgiServiceAnnotation != null) {
+                Named namedAnnotation = findAnnotation(annotations, Named.class);
+                ref = namedAnnotation != null ? namedAnnotation.value() : getBeanNameFromSimpleName(parameterTypes[i].getSimpleName());
+                OsgiServiceRef osgiServiceRef = new OsgiServiceRef(parameterTypes[i], osgiServiceAnnotation, ref);
+                serviceRefs.add(osgiServiceRef);
+            }
 
-                    constructorArguments.add(new Argument(ref, value));
+            if (ref == null && value == null && osgiServiceAnnotation == null) {
+                BeanRef template = new BeanRef(parameterTypes[i]);
+                template.setQualifiersFromAnnotations(annotations);
+                BeanRef bean = matcher.getMatching(template);
+                if (bean != null) {
+                    ref = bean.id;
+                } else {
+                    Named namedAnnotation = findAnnotation(annotations, Named.class);
+                    if (namedAnnotation != null) {
+                        ref = namedAnnotation.value();
+                    } else {
+                        ref = getBeanName(parameterTypes[i]);
+                    }
                 }
-                break;
             }
+
+            constructorArguments.add(new Argument(ref, value));
         }
     }
 

Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Context.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Context.java?rev=1741938&r1=1741937&r2=1741938&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Context.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Context.java Mon May  2 08:54:36 2016
@@ -77,9 +77,9 @@ public class Context implements Matcher
                 Class<?> producedClass = method.getReturnType();
                 ProducedBean producedBean;
                 if (named != null) {
-                    producedBean = new ProducedBean(producedClass, named.value(), factoryBean, method.getName());
+                    producedBean = new ProducedBean(producedClass, named.value(), factoryBean, method);
                 } else {
-                    producedBean = new ProducedBean(producedClass, factoryBean, method.getName());
+                    producedBean = new ProducedBean(producedClass, factoryBean, method);
                 }
                 if (singleton != null) {
                     producedBean.setSingleton();

Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/ProducedBean.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/ProducedBean.java?rev=1741938&r1=1741937&r2=1741938&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/ProducedBean.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/ProducedBean.java Mon May  2 08:54:36 2016
@@ -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
- * <p>
+ * <p/>
  * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
+ * <p/>
  * 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
@@ -19,24 +19,34 @@
 package org.apache.aries.blueprint.plugin.model;
 
 
+import java.lang.reflect.Method;
+
 public class ProducedBean extends Bean {
     public String factoryMethod;
     public BeanRef factoryBean;
+    private Method producingMethod;
 
-    public ProducedBean(Class<?> clazz, BeanRef factoryBean, String factoryMethod) {
+    public ProducedBean(Class<?> clazz, BeanRef factoryBean, Method factoryMethod) {
         super(clazz);
         this.factoryBean = factoryBean;
-        this.factoryMethod = factoryMethod;
+        this.factoryMethod = factoryMethod.getName();
+        this.producingMethod = factoryMethod;
     }
 
-    public ProducedBean(Class<?> clazz, String id, BeanRef factoryBean, String factoryMethod) {
+    public ProducedBean(Class<?> clazz, String id, BeanRef factoryBean, Method factoryMethod) {
         super(clazz);
         this.id = id;
         this.factoryBean = factoryBean;
-        this.factoryMethod = factoryMethod;
+        this.factoryMethod = factoryMethod.getName();
+        this.producingMethod = factoryMethod;
     }
 
-    public void setSingleton(){
+    public void setSingleton() {
         this.isPrototype = false;
     }
+
+    @Override
+    protected void resolveConstructorArguments(Matcher matcher) {
+        resolveParametersForConstructor(matcher, producingMethod.getParameterTypes(), producingMethod.getParameterAnnotations());
+    }
 }

Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java?rev=1741938&r1=1741937&r2=1741938&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java Mon May  2 08:54:36 2016
@@ -210,6 +210,17 @@ public class GeneratorTest {
         assertEquals("produced2", xpath.evaluate("argument[8]/@ref", myBean5));
     }
 
+    @Test
+    public void testProducesBeanUsingParametersNotConstructor() throws Exception {
+        Node bean1 = getBeanById("myProducedWithConstructor");
+        assertEquals("org.apache.aries.blueprint.plugin.test.MyProducedWithConstructor", xpath.evaluate("@class", bean1));
+        assertEquals("myFactoryBean", xpath.evaluate("@factory-ref", bean1));
+        assertEquals("createBeanWithParameters", xpath.evaluate("@factory-method", bean1));
+        assertEquals("myBean1", xpath.evaluate("argument[1]/@ref", bean1));
+        assertEquals("100", xpath.evaluate("argument[2]/@value", bean1));
+        assertEquals("ser1", xpath.evaluate("argument[3]/@ref", bean1));
+    }
+
     private static Document readToDocument(ByteArrayOutputStream os) throws ParserConfigurationException,
             SAXException, IOException {
         InputStream is = new ByteArrayInputStream(os.toByteArray());

Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyFactoryBean.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyFactoryBean.java?rev=1741938&r1=1741937&r2=1741938&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyFactoryBean.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyFactoryBean.java Mon May  2 08:54:36 2016
@@ -18,8 +18,12 @@
  */
 package org.apache.aries.blueprint.plugin.test;
 
+import org.ops4j.pax.cdi.api.OsgiService;
+import org.springframework.beans.factory.annotation.Value;
+
 import javax.enterprise.inject.Produces;
 import javax.inject.Inject;
+import javax.inject.Named;
 import javax.inject.Singleton;
 
 @Singleton
@@ -32,4 +36,9 @@ public class MyFactoryBean {
     public MyProduced create() {
         return new MyProduced("My message");
     }
+
+    @Produces
+    public MyProducedWithConstructor createBeanWithParameters(MyBean1 myBean1, @Value("100") int bla, @OsgiService(filter = "myRef") @Named("ser1") ServiceC myReference) {
+        return new MyProducedWithConstructor(null);
+    }
 }

Copied: aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyProducedWithConstructor.java (from r1741936, aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyFactoryBean.java)
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyProducedWithConstructor.java?p2=aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyProducedWithConstructor.java&p1=aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyFactoryBean.java&r1=1741936&r2=1741938&rev=1741938&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyFactoryBean.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyProducedWithConstructor.java Mon May  2 08:54:36 2016
@@ -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
- * <p>
+ * <p/>
  * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
+ * <p/>
  * 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,18 +18,14 @@
  */
 package org.apache.aries.blueprint.plugin.test;
 
-import javax.enterprise.inject.Produces;
+import org.ops4j.pax.cdi.api.OsgiService;
+
 import javax.inject.Inject;
-import javax.inject.Singleton;
+import javax.inject.Named;
 
-@Singleton
-public class MyFactoryBean {
-    
-    @Inject
-    ServiceB serviceB;
+public class MyProducedWithConstructor {
 
-    @Produces
-    public MyProduced create() {
-        return new MyProduced("My message");
+    @Inject
+    public MyProducedWithConstructor(@OsgiService @Named("unknown") ServiceA serviceA) {
     }
 }