You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by al...@apache.org on 2017/09/30 15:27:36 UTC

svn commit: r1810215 - in /aries/trunk/blueprint/plugin: blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/service/ blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ b...

Author: alien11689
Date: Sat Sep 30 15:27:35 2017
New Revision: 1810215

URL: http://svn.apache.org/viewvc?rev=1810215&view=rev
Log:
[ARIES-1740] Add @ReferenceList annotation

Added:
    aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/service/MemberType.java
    aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/service/ReferenceList.java
      - copied, changed from r1810198, aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/service/Reference.java
    aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceListHandler.java
      - copied, changed from r1810198, aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceHandler.java
    aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceListInvalidInterface.java
    aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/reference/BeanWithReferenceLists.java
      - copied, changed from r1810013, aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/reference/BeanWithReferences.java
Modified:
    aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceHandler.java
    aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceId.java
    aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceParameters.java
    aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/resources/META-INF/services/org.apache.aries.blueprint.plugin.spi.CustomDependencyAnnotationHandler
    aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/BlueprintFileWriterTest.java

Added: aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/service/MemberType.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/service/MemberType.java?rev=1810215&view=auto
==============================================================================
--- aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/service/MemberType.java (added)
+++ aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/service/MemberType.java Sat Sep 30 15:27:35 2017
@@ -0,0 +1,24 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * 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>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <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
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.aries.blueprint.annotation.service;
+
+public enum MemberType {
+    SERVICE_OBJECT,
+    SERVICE_REFERENCE
+}

Copied: aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/service/ReferenceList.java (from r1810198, aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/service/Reference.java)
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/service/ReferenceList.java?p2=aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/service/ReferenceList.java&p1=aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/service/Reference.java&r1=1810198&r2=1810215&rev=1810215&view=diff
==============================================================================
--- aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/service/Reference.java (original)
+++ aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/service/ReferenceList.java Sat Sep 30 15:27:35 2017
@@ -24,18 +24,24 @@ import java.lang.annotation.RetentionPol
 import java.lang.annotation.Target;
 
 /**
- * Annotate dependency to inject a service.
+ * Annotate dependency to inject a list of services.
  */
 @Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
 @Retention(RetentionPolicy.RUNTIME)
-public @interface Reference {
+public @interface ReferenceList {
+
+    /**
+     * @return service interface class to inject
+     */
+    Class<?> referenceInterface();
+
     /**
-     * @return filter on reference
+     * @return filter on reference-list
      */
     String filter() default "";
 
     /**
-     * @return component-name on reference
+     * @return component-name on reference-list
      */
     String componentName() default "";
 
@@ -45,7 +51,7 @@ public @interface Reference {
     Availability availability() default Availability.MANDATORY;
 
     /**
-     * @return timeout on reference - negative value means blueprint default
+     * @return should proxy or service reference be injected
      */
-    long timeout() default Long.MIN_VALUE;
+    MemberType memberType() default MemberType.SERVICE_OBJECT;
 }

Modified: aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceHandler.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceHandler.java?rev=1810215&r1=1810214&r2=1810215&view=diff
==============================================================================
--- aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceHandler.java (original)
+++ aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceHandler.java Sat Sep 30 15:27:35 2017
@@ -66,10 +66,10 @@ public class ReferenceHandler implements
                 if (!"".equals(reference.componentName())) {
                     writer.writeAttribute("component-name", reference.componentName());
                 }
-                if (needTimeout(reference)) {
+                if (needTimeout(reference.timeout())) {
                     writer.writeAttribute("timeout", String.valueOf(reference.timeout()));
                 }
-                if (needAvailability(contextEnricher, reference)) {
+                if (needAvailability(contextEnricher, reference.availability())) {
                     writer.writeAttribute("availability", reference.availability().name().toLowerCase());
                 }
             }

Modified: aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceId.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceId.java?rev=1810215&r1=1810214&r2=1810215&view=diff
==============================================================================
--- aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceId.java (original)
+++ aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceId.java Sat Sep 30 15:27:35 2017
@@ -18,7 +18,10 @@
  */
 package org.apache.aries.blueprint.plugin.handlers.blueprint.service;
 
+import org.apache.aries.blueprint.annotation.service.Availability;
+import org.apache.aries.blueprint.annotation.service.MemberType;
 import org.apache.aries.blueprint.annotation.service.Reference;
+import org.apache.aries.blueprint.annotation.service.ReferenceList;
 import org.apache.aries.blueprint.plugin.spi.ContextEnricher;
 
 import static org.apache.aries.blueprint.plugin.handlers.blueprint.service.ReferenceParameters.needAvailability;
@@ -28,25 +31,58 @@ class ReferenceId {
     static String generateReferenceId(Class clazz, Reference reference, ContextEnricher contextEnricher) {
         StringBuilder sb = new StringBuilder();
         writeBeanNameFromSimpleName(sb, clazz.getSimpleName());
+        appendFilter(sb, reference.filter());
+        appendComponentName(sb, reference.componentName());
+        appendAvailability(sb, reference.availability(), contextEnricher);
+        appendTimeout(sb, reference.timeout());
+        return sb.toString().replaceAll("-+$", "");
+    }
+
+    private static void appendTimeout(StringBuilder sb, long timeout) {
         sb.append("-");
-        if (!"".equals(reference.filter())) {
-            writeEscapedFilter(sb, reference.filter());
+        if (needTimeout(timeout)) {
+            sb.append(timeout);
         }
+    }
+
+    private static void appendAvailability(StringBuilder sb, Availability availability, ContextEnricher contextEnricher) {
         sb.append("-");
-        if (!"".equals(reference.componentName())) {
-            sb.append(reference.componentName());
+        if (needAvailability(contextEnricher, availability)) {
+            sb.append(availability.name().toLowerCase());
         }
+    }
+
+    private static void appendComponentName(StringBuilder sb, String componentName) {
         sb.append("-");
-        if (needAvailability(contextEnricher, reference)) {
-            sb.append(reference.availability().name().toLowerCase());
+        if (!"".equals(componentName)) {
+            sb.append(componentName);
         }
+    }
+
+    private static void appendFilter(StringBuilder sb, String filter) {
         sb.append("-");
-        if (needTimeout(reference)) {
-            sb.append(reference.timeout());
+        if (!"".equals(filter)) {
+            writeEscapedFilter(sb, filter);
         }
+    }
+
+    static String generateReferenceListId(ReferenceList referenceList, ContextEnricher contextEnricher) {
+        StringBuilder sb = new StringBuilder("listOf-");
+        writeBeanNameFromSimpleName(sb, referenceList.referenceInterface().getSimpleName());
+        appendFilter(sb, referenceList.filter());
+        appendComponentName(sb, referenceList.componentName());
+        appendAvailability(sb, referenceList.availability(), contextEnricher);
+        appendMemberType(sb, referenceList.memberType());
         return sb.toString().replaceAll("-+$", "");
     }
 
+    private static void appendMemberType(StringBuilder sb, MemberType memberType) {
+        sb.append("-");
+        if (memberType == MemberType.SERVICE_REFERENCE) {
+            sb.append("reference");
+        }
+    }
+
     private static void writeBeanNameFromSimpleName(StringBuilder sb, String name) {
         sb.append(name.substring(0, 1).toLowerCase());
         sb.append(name.substring(1, name.length()));

Copied: aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceListHandler.java (from r1810198, aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceHandler.java)
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceListHandler.java?p2=aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceListHandler.java&p1=aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceHandler.java&r1=1810198&r2=1810215&rev=1810215&view=diff
==============================================================================
--- aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceHandler.java (original)
+++ aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceListHandler.java Sat Sep 30 15:27:35 2017
@@ -18,7 +18,8 @@
  */
 package org.apache.aries.blueprint.plugin.handlers.blueprint.service;
 
-import org.apache.aries.blueprint.annotation.service.Reference;
+import org.apache.aries.blueprint.annotation.service.MemberType;
+import org.apache.aries.blueprint.annotation.service.ReferenceList;
 import org.apache.aries.blueprint.plugin.spi.ContextEnricher;
 import org.apache.aries.blueprint.plugin.spi.CustomDependencyAnnotationHandler;
 import org.apache.aries.blueprint.plugin.spi.XmlWriter;
@@ -28,56 +29,59 @@ import javax.xml.stream.XMLStreamWriter;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
+import java.util.List;
 
 import static org.apache.aries.blueprint.plugin.handlers.blueprint.service.ReferenceParameters.needAvailability;
-import static org.apache.aries.blueprint.plugin.handlers.blueprint.service.ReferenceParameters.needTimeout;
 
-public class ReferenceHandler implements CustomDependencyAnnotationHandler<Reference> {
+public class ReferenceListHandler implements CustomDependencyAnnotationHandler<ReferenceList> {
     @Override
-    public Class<Reference> getAnnotation() {
-        return Reference.class;
+    public Class<ReferenceList> getAnnotation() {
+        return ReferenceList.class;
     }
 
     @Override
     public String handleDependencyAnnotation(AnnotatedElement annotatedElement, String name, ContextEnricher contextEnricher) {
-        Reference reference = annotatedElement.getAnnotation(Reference.class);
+        ReferenceList referenceList = annotatedElement.getAnnotation(ReferenceList.class);
         final Class<?> clazz = getClass(annotatedElement);
-        return handleDependencyAnnotation(clazz, reference, name, contextEnricher);
+        return handleDependencyAnnotation(clazz, referenceList, name, contextEnricher);
     }
 
     @Override
-    public String handleDependencyAnnotation(final Class<?> clazz, Reference reference, String name, ContextEnricher contextEnricher) {
-        final String id = name != null ? name : ReferenceId.generateReferenceId(clazz, reference, contextEnricher);
+    public String handleDependencyAnnotation(final Class<?> clazz, ReferenceList referenceList, String name, ContextEnricher contextEnricher) {
+        if (clazz != List.class) {
+            throw new ReferenceListInvalidInterface(clazz);
+        }
+        final String id = name != null ? name : ReferenceId.generateReferenceListId(referenceList, contextEnricher);
         contextEnricher.addBean(id, clazz);
-        contextEnricher.addBlueprintContentWriter(getWriterId(id, clazz), getXmlWriter(id, clazz, reference, contextEnricher));
+        contextEnricher.addBlueprintContentWriter(getWriterId(id, referenceList.referenceInterface()), getXmlWriter(id, referenceList, contextEnricher));
         return id;
     }
 
-    private XmlWriter getXmlWriter(final String id, final Class<?> clazz, final Reference reference, final ContextEnricher contextEnricher) {
+    private XmlWriter getXmlWriter(final String id, final ReferenceList referenceList, final ContextEnricher contextEnricher) {
         return new XmlWriter() {
             @Override
             public void write(XMLStreamWriter writer) throws XMLStreamException {
-                writer.writeEmptyElement("reference");
+                writer.writeEmptyElement("reference-list");
                 writer.writeAttribute("id", id);
-                writer.writeAttribute("interface", clazz.getName());
-                if (!"".equals(reference.filter())) {
-                    writer.writeAttribute("filter", reference.filter());
+                writer.writeAttribute("interface", referenceList.referenceInterface().getName());
+                if (!"".equals(referenceList.filter())) {
+                    writer.writeAttribute("filter", referenceList.filter());
                 }
-                if (!"".equals(reference.componentName())) {
-                    writer.writeAttribute("component-name", reference.componentName());
+                if (!"".equals(referenceList.componentName())) {
+                    writer.writeAttribute("component-name", referenceList.componentName());
                 }
-                if (needTimeout(reference)) {
-                    writer.writeAttribute("timeout", String.valueOf(reference.timeout()));
+                if (needAvailability(contextEnricher, referenceList.availability())) {
+                    writer.writeAttribute("availability", referenceList.availability().name().toLowerCase());
                 }
-                if (needAvailability(contextEnricher, reference)) {
-                    writer.writeAttribute("availability", reference.availability().name().toLowerCase());
+                if (referenceList.memberType() == MemberType.SERVICE_REFERENCE) {
+                    writer.writeAttribute("member-type", "service-reference");
                 }
             }
         };
     }
 
     private String getWriterId(String id, Class<?> clazz) {
-        return "reference/" + clazz.getName() + "/" + id;
+        return "referenceList/" + clazz.getName() + "/" + id;
     }
 
     private Class<?> getClass(AnnotatedElement annotatedElement) {

Added: aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceListInvalidInterface.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceListInvalidInterface.java?rev=1810215&view=auto
==============================================================================
--- aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceListInvalidInterface.java (added)
+++ aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceListInvalidInterface.java Sat Sep 30 15:27:35 2017
@@ -0,0 +1,27 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * 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>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <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
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.aries.blueprint.plugin.handlers.blueprint.service;
+
+import java.util.List;
+
+public class ReferenceListInvalidInterface extends RuntimeException {
+    public ReferenceListInvalidInterface(Class<?> received) {
+        super("Reference list must be " + List.class.getName() + " but received " + received.getName());
+    }
+}

Modified: aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceParameters.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceParameters.java?rev=1810215&r1=1810214&r2=1810215&view=diff
==============================================================================
--- aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceParameters.java (original)
+++ aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/blueprint/service/ReferenceParameters.java Sat Sep 30 15:27:35 2017
@@ -18,20 +18,18 @@
  */
 package org.apache.aries.blueprint.plugin.handlers.blueprint.service;
 
-import org.apache.aries.blueprint.annotation.service.Reference;
 import org.apache.aries.blueprint.plugin.spi.Availability;
 import org.apache.aries.blueprint.plugin.spi.ContextEnricher;
 
 class ReferenceParameters {
 
-    static boolean needTimeout(Reference reference) {
-        return reference.timeout() >= 0;
+    static boolean needTimeout(long timeout) {
+        return timeout >= 0;
     }
 
-    static boolean needAvailability(ContextEnricher contextEnricher, Reference reference) {
-        org.apache.aries.blueprint.annotation.service.Availability availability = reference.availability();
+    static boolean needAvailability(ContextEnricher contextEnricher, org.apache.aries.blueprint.annotation.service.Availability availability) {
         Availability defaultAvailability = contextEnricher.getBlueprintConfiguration().getDefaultAvailability();
         return defaultAvailability == null && availability.equals(org.apache.aries.blueprint.annotation.service.Availability.OPTIONAL) ||
-                defaultAvailability != null && !defaultAvailability.name().equals(reference.availability().name());
+                defaultAvailability != null && !defaultAvailability.name().equals(availability.name());
     }
 }

Modified: aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/resources/META-INF/services/org.apache.aries.blueprint.plugin.spi.CustomDependencyAnnotationHandler
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/resources/META-INF/services/org.apache.aries.blueprint.plugin.spi.CustomDependencyAnnotationHandler?rev=1810215&r1=1810214&r2=1810215&view=diff
==============================================================================
--- aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/resources/META-INF/services/org.apache.aries.blueprint.plugin.spi.CustomDependencyAnnotationHandler (original)
+++ aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/resources/META-INF/services/org.apache.aries.blueprint.plugin.spi.CustomDependencyAnnotationHandler Sat Sep 30 15:27:35 2017
@@ -16,4 +16,5 @@
 #
 
 org.apache.aries.blueprint.plugin.handlers.blueprint.config.ConfigPropertiesHandler
-org.apache.aries.blueprint.plugin.handlers.blueprint.service.ReferenceHandler
\ No newline at end of file
+org.apache.aries.blueprint.plugin.handlers.blueprint.service.ReferenceHandler
+org.apache.aries.blueprint.plugin.handlers.blueprint.service.ReferenceListHandler
\ No newline at end of file

Modified: aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/BlueprintFileWriterTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/BlueprintFileWriterTest.java?rev=1810215&r1=1810214&r2=1810215&view=diff
==============================================================================
--- aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/BlueprintFileWriterTest.java (original)
+++ aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/BlueprintFileWriterTest.java Sat Sep 30 15:27:35 2017
@@ -1217,6 +1217,150 @@ public class BlueprintFileWriterTest {
         assertXpathEquals(service, "service-properties/entry[@key='service.ranking']/value/text()", "5");
     }
 
+    @Test
+    public void shouldInjectReferenceListViaField() throws Exception {
+        Node bean = getBeanById("beanWithReferenceLists");
+        assertXpathEquals(bean, "property[@name='ref1Field']/@ref", "listOf-ref1");
+        assertXpathEquals(bean, "property[@name='myRef1Field']/@ref", "myRef1List");
+        assertXpathEquals(bean, "property[@name='myRef1FieldAllProps']/@ref", "listOf-ref1-a453-r1-optional");
+        assertXpathEquals(bean, "property[@name='myRef1FieldFilter']/@ref", "listOf-ref1-x1---reference");
+    }
+
+    @Test
+    public void shouldGenerateReferenceListFromBeanField() throws Exception {
+        Node ref1 = getReferenceListById("listOf-ref1");
+        assertXpathEquals(ref1, "@interface", Ref1.class.getName());
+        assertXpathEquals(ref1, "count(@member-type)", "0");
+
+        Node myRef1 = getReferenceListById("myRef1List");
+        assertXpathEquals(myRef1, "@interface", Ref1.class.getName());
+
+        Node ref1a453r1 = getReferenceListById("listOf-ref1-a453-r1-optional");
+        assertXpathEquals(ref1a453r1, "@interface", Ref1.class.getName());
+        assertXpathEquals(ref1a453r1, "@component-name", "r1");
+        assertXpathEquals(ref1a453r1, "@filter", "(a=453)");
+        assertXpathEquals(ref1a453r1, "@availability", "optional");
+
+        Node ref1x1 = getReferenceListById("listOf-ref1-x1---reference");
+        assertXpathEquals(ref1x1, "@interface", Ref1.class.getName());
+        assertXpathEquals(ref1x1, "@filter", "(x=1)");
+        assertXpathEquals(ref1x1, "count(@component-name)", "0");
+        assertXpathEquals(ref1x1, "@member-type", "service-reference");
+    }
+
+    @Test
+    public void shouldInjectReferenceListViaSetter() throws Exception {
+        Node bean = getBeanById("beanWithReferenceLists");
+        assertXpathEquals(bean, "property[@name='ref2Setter']/@ref", "listOf-ref2");
+        assertXpathEquals(bean, "property[@name='ref2SetterNamed']/@ref", "myRef2List");
+        assertXpathEquals(bean, "property[@name='ref2SetterFull']/@ref", "listOf-ref2-b453-r2-optional");
+        assertXpathEquals(bean, "property[@name='ref2SetterComponent']/@ref", "listOf-ref2--blablabla--reference");
+    }
+
+    @Test
+    public void shouldGenerateReferenceListFromBeanSetter() throws Exception {
+        Node ref2 = getReferenceListById("listOf-ref2");
+        assertXpathEquals(ref2, "@interface", Ref2.class.getName());
+        assertXpathEquals(ref2, "count(@member-type)", "0");
+
+        Node myRef2 = getReferenceListById("myRef2List");
+        assertXpathEquals(myRef2, "@interface", Ref2.class.getName());
+
+        Node ref1b453r2 = getReferenceListById("listOf-ref2-b453-r2-optional");
+        assertXpathEquals(ref1b453r2, "@interface", Ref2.class.getName());
+        assertXpathEquals(ref1b453r2, "@component-name", "r2");
+        assertXpathEquals(ref1b453r2, "@filter", "(b=453)");
+        assertXpathEquals(ref1b453r2, "@availability", "optional");
+
+        Node ref2blablabla = getReferenceListById("listOf-ref2--blablabla--reference");
+        assertXpathEquals(ref2blablabla, "@interface", Ref2.class.getName());
+        assertXpathEquals(ref2blablabla, "@component-name", "blablabla");
+        assertXpathEquals(ref2blablabla, "count(@filter)", "0");
+        assertXpathEquals(ref2blablabla, "@member-type", "service-reference");
+    }
+
+    @Test
+    public void shouldInjectReferenceListViaConstructor() throws Exception {
+        Node bean = getBeanById("beanWithReferenceLists");
+        assertXpathEquals(bean, "argument[1]/@ref", "listOf-ref1");
+        assertXpathEquals(bean, "argument[2]/@ref", "listOf-ref2---optional-reference");
+        assertXpathEquals(bean, "argument[3]/@ref", "listOf-ref1-y3");
+        assertXpathEquals(bean, "argument[4]/@ref", "listOf-ref1--compForConstr");
+        assertXpathEquals(bean, "argument[5]/@ref", "listOf-ref1-y3-compForConstr");
+        assertXpathEquals(bean, "argument[6]/@ref", "ref1ListForCons");
+    }
+
+    @Test
+    public void shouldGenerateReferenceListFromBeanConstructor() throws Exception {
+        Node ref1 = getReferenceListById("listOf-ref1");
+        assertXpathEquals(ref1, "@interface", Ref1.class.getName());
+        assertXpathEquals(ref1, "count(@member-type)", "0");
+
+        Node ref2optional20000 = getReferenceListById("listOf-ref2---optional-reference");
+        assertXpathEquals(ref2optional20000, "@interface", Ref2.class.getName());
+        assertXpathEquals(ref2optional20000, "@availability", "optional");
+        assertXpathEquals(ref2optional20000, "@member-type", "service-reference");
+
+        Node ref1y3 = getReferenceListById("listOf-ref1-y3");
+        assertXpathEquals(ref1y3, "@interface", Ref1.class.getName());
+        assertXpathEquals(ref1y3, "count(@component-name)", "0");
+        assertXpathEquals(ref1y3, "@filter", "(y=3)");
+
+        Node ref1compForConstr = getReferenceListById("listOf-ref1--compForConstr");
+        assertXpathEquals(ref1compForConstr, "@interface", Ref1.class.getName());
+        assertXpathEquals(ref1compForConstr, "@component-name", "compForConstr");
+        assertXpathEquals(ref1compForConstr, "count(@filter)", "0");
+
+        Node ref1y3compForConstr = getReferenceListById("listOf-ref1-y3-compForConstr");
+        assertXpathEquals(ref1y3compForConstr, "@interface", Ref1.class.getName());
+        assertXpathEquals(ref1y3compForConstr, "@component-name", "compForConstr");
+        assertXpathEquals(ref1y3compForConstr, "@filter", "(y=3)");
+
+        Node ref1ForCons = getReferenceListById("ref1ListForCons");
+        assertXpathEquals(ref1ForCons, "@interface", Ref1.class.getName());
+        assertXpathEquals(ref1ForCons, "@availability", "optional");
+    }
+
+    @Test
+    public void shouldInjectReferenceListToProducedBean() throws Exception {
+        Node bean = getBeanById("producedWithReferenceLists");
+        assertXpathEquals(bean, "argument[1]/@ref", "listOf-ref3");
+        assertXpathEquals(bean, "argument[2]/@ref", "listOf-ref4---optional");
+        assertXpathEquals(bean, "argument[3]/@ref", "listOf-ref3-y3");
+        assertXpathEquals(bean, "argument[4]/@ref", "listOf-ref3--compForProduces");
+        assertXpathEquals(bean, "argument[5]/@ref", "listOf-ref3-y3-compForProduces--reference");
+        assertXpathEquals(bean, "argument[6]/@ref", "ref3ListForProduces");
+    }
+
+    @Test
+    public void shouldGenerateReferenceListFromProducedBean() throws Exception {
+        Node ref3 = getReferenceListById("listOf-ref3");
+        assertXpathEquals(ref3, "@interface", Ref3.class.getName());
+        assertXpathEquals(ref3, "count(@member-type)", "0");
+
+        Node ref4optional = getReferenceListById("listOf-ref4---optional");
+        assertXpathEquals(ref4optional, "@interface", Ref4.class.getName());
+        assertXpathEquals(ref4optional, "@availability", "optional");
+
+        Node ref3y3 = getReferenceListById("listOf-ref3-y3");
+        assertXpathEquals(ref3y3, "@interface", Ref3.class.getName());
+        assertXpathEquals(ref3y3, "count(@component-name)", "0");
+        assertXpathEquals(ref3y3, "@filter", "(y=3)");
+
+        Node ref3compForProduces = getReferenceListById("listOf-ref3--compForProduces");
+        assertXpathEquals(ref3compForProduces, "@interface", Ref3.class.getName());
+        assertXpathEquals(ref3compForProduces, "@component-name", "compForProduces");
+        assertXpathEquals(ref3compForProduces, "count(@filter)", "0");
+
+        Node ref3y3compForProduces = getReferenceListById("listOf-ref3-y3-compForProduces--reference");
+        assertXpathEquals(ref3y3compForProduces, "@interface", Ref3.class.getName());
+        assertXpathEquals(ref3y3compForProduces, "@component-name", "compForProduces");
+        assertXpathEquals(ref3y3compForProduces, "@filter", "(y=3)");
+        assertXpathEquals(ref3y3compForProduces, "@member-type", "service-reference");
+
+        Node ref1ForCons = getReferenceListById("ref3ListForProduces");
+        assertXpathEquals(ref1ForCons, "@interface", Ref3.class.getName());
+    }
     private void assertXpathDoesNotExist(Node node, String xpathExpression) throws XPathExpressionException {
         assertXpathEquals(node, "count(" + xpathExpression + ")", "0");
     }

Copied: aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/reference/BeanWithReferenceLists.java (from r1810013, aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/reference/BeanWithReferences.java)
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/reference/BeanWithReferenceLists.java?p2=aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/reference/BeanWithReferenceLists.java&p1=aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/reference/BeanWithReferences.java&r1=1810013&r2=1810215&rev=1810215&view=diff
==============================================================================
--- aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/reference/BeanWithReferences.java (original)
+++ aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/reference/BeanWithReferenceLists.java Sat Sep 30 15:27:35 2017
@@ -19,74 +19,77 @@
 package org.apache.aries.blueprint.plugin.test.reference;
 
 import org.apache.aries.blueprint.annotation.service.Availability;
+import org.apache.aries.blueprint.annotation.service.MemberType;
 import org.apache.aries.blueprint.annotation.service.Reference;
+import org.apache.aries.blueprint.annotation.service.ReferenceList;
+import org.osgi.framework.ServiceReference;
 
 import javax.enterprise.inject.Produces;
 import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
+import java.util.List;
 
 @Singleton
-public class BeanWithReferences {
+public class BeanWithReferenceLists {
 
     @Inject
-    @Reference
-    Ref1 ref1Field;
+    @ReferenceList(referenceInterface = Ref1.class)
+    List<Ref1> ref1Field;
 
     @Inject
-    @Reference
-    @Named("myRef1")
-    Ref1 myRef1Field;
+    @ReferenceList(referenceInterface = Ref1.class)
+    @Named("myRef1List")
+    List<Ref1> myRef1Field;
 
     @Inject
-    @Reference(filter = "(a=453)", componentName = "r1", timeout = 2000, availability = Availability.OPTIONAL)
-    Ref1 myRef1FieldAllProps;
+    @ReferenceList(referenceInterface = Ref1.class, filter = "(a=453)", componentName = "r1", availability = Availability.OPTIONAL)
+    List<Ref1> myRef1FieldAllProps;
 
     @Inject
-    @Reference(filter = "(x=1)")
-    Ref1 myRef1FieldFilter;
+    @ReferenceList(referenceInterface = Ref1.class, filter = "(x=1)", memberType = MemberType.SERVICE_REFERENCE)
+    List<ServiceReference<Ref1>> myRef1FieldFilter;
 
     @Inject
-    @Reference
-    public void setRef2Setter(Ref2 ref) {
+    @ReferenceList(referenceInterface = Ref2.class)
+    public void setRef2Setter(List<Ref2> ref) {
     }
 
     @Inject
-    @Reference
-    @Named("myRef2")
-    public void setRef2SetterNamed(Ref2 ref) {
+    @ReferenceList(referenceInterface = Ref2.class)
+    @Named("myRef2List")
+    public void setRef2SetterNamed(List<Ref2> ref) {
     }
 
     @Inject
-    @Reference(filter = "(b=453)", componentName = "r2", timeout = 1000, availability = Availability.OPTIONAL)
-    public void setRef2SetterFull(Ref2 ref) {
+    @ReferenceList(referenceInterface = Ref2.class, filter = "(b=453)", componentName = "r2", availability = Availability.OPTIONAL)
+    public void setRef2SetterFull(List<Ref2> ref) {
     }
 
     @Inject
-    @Reference(componentName = "blablabla")
-    public void setRef2SetterComponent(Ref2 ref) {
+    @ReferenceList(referenceInterface = Ref2.class, componentName = "blablabla", memberType = MemberType.SERVICE_REFERENCE)
+    public void setRef2SetterComponent(List<ServiceReference<Ref2>> ref) {
     }
 
-    public BeanWithReferences(
-            @Reference Ref1 ref1,
-            @Reference(availability = Availability.OPTIONAL, timeout = 20000) Ref2 ref2,
-            @Reference(filter = "(y=3)") Ref1 ref1x,
-            @Reference(componentName = "compForConstr") Ref1 ref1c,
-            @Reference(filter = "(y=3)", componentName = "compForConstr") Ref1 ref1fc,
-            @Reference(availability = Availability.OPTIONAL) @Named("ref1ForCons") Ref1 ref1Named
+    public BeanWithReferenceLists(
+            @ReferenceList(referenceInterface = Ref1.class) List<Ref1> ref1,
+            @ReferenceList(referenceInterface = Ref2.class, availability = Availability.OPTIONAL, memberType = MemberType.SERVICE_REFERENCE) List<ServiceReference<Ref2>> ref2,
+            @ReferenceList(referenceInterface = Ref1.class, filter = "(y=3)") List<Ref1> ref1x,
+            @ReferenceList(referenceInterface = Ref1.class, componentName = "compForConstr") List<Ref1> ref1c,
+            @ReferenceList(referenceInterface = Ref1.class, filter = "(y=3)", componentName = "compForConstr") List<Ref1> ref1fc,
+            @ReferenceList(referenceInterface = Ref1.class, availability = Availability.OPTIONAL) @Named("ref1ListForCons") List<Ref1> ref1Named
     ) {
     }
 
     @Produces
-    @Named("producedWithReferences")
+    @Named("producedWithReferenceLists")
     public String create(
-            @Reference Ref3 ref3,
-            @Reference(timeout = 20000) Ref4 ref4,
-            @Reference(availability = Availability.OPTIONAL) Ref4 ref4a,
-            @Reference(filter = "(y=3)") Ref3 ref3f,
-            @Reference(componentName = "compForProduces") Ref3 ref3c,
-            @Reference(filter = "(y=3)", componentName = "compForProduces") Ref3 ref3fc,
-            @Reference(timeout = 1000) @Named("ref3ForProduces") Ref3 ref3Named
+            @ReferenceList(referenceInterface = Ref3.class) List<Ref3> ref3,
+            @ReferenceList(referenceInterface = Ref4.class, availability = Availability.OPTIONAL) List<Ref4> ref4a,
+            @ReferenceList(referenceInterface = Ref3.class, filter = "(y=3)") List<Ref3> ref3f,
+            @ReferenceList(referenceInterface = Ref3.class, componentName = "compForProduces") List<Ref3> ref3c,
+            @ReferenceList(referenceInterface = Ref3.class, filter = "(y=3)", componentName = "compForProduces", memberType = MemberType.SERVICE_REFERENCE) List<Ref3> ref3fc,
+            @ReferenceList(referenceInterface = Ref3.class) @Named("ref3ListForProduces") List<Ref3> ref3Named
     ) {
         return null;
     }