Author: alien11689
Date: Sun Jan 22 12:23:22 2017
New Revision: 1779797

URL: http://svn.apache.org/viewvc?rev=1779797&view=rev
Log:
[ARIES-1669] Genreate reference listener via annotations

Added:
    
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/
    
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/Availability.java
    
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/Bind.java
    
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/Cardinality.java
    
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/ReferenceListener.java
    
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/Unbind.java
    
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/packageinfo
      - copied, changed from r1779380, 
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/config/packageinfo
    
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/referencelistener/
    
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/referencelistener/ReferenceListenerDefinition.java
    
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/referencelistener/ReferenceListenerHandler.java
    
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/
    
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerBeanWithName.java
    
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerBeanWithoutMethodsAnnotation.java
    
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerListBean.java
    
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerProducer.java
    
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerToProduce.java
    
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerToProduceWithoutAnnotation.java
Modified:
    aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/pom.xml
    
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/resources/META-INF/services/org.apache.aries.blueprint.plugin.spi.BeanAnnotationHandler
    
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java

Modified: aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/pom.xml
URL: 
http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/pom.xml?rev=1779797&r1=1779796&r2=1779797&view=diff
==============================================================================
--- aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/pom.xml 
(original)
+++ aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/pom.xml Sun 
Jan 22 12:23:22 2017
@@ -22,7 +22,8 @@
 
     <properties>
         <aries.osgi.export.pkg>
-            org.apache.aries.blueprint.annotation.config
+            org.apache.aries.blueprint.annotation.config,
+            org.apache.aries.blueprint.annotation.referencelistener
         </aries.osgi.export.pkg>
         <aries.osgi.import.pkg/>
         <aries.osgi.private.pkg/>

Added: 
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/Availability.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/Availability.java?rev=1779797&view=auto
==============================================================================
--- 
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/Availability.java
 (added)
+++ 
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/Availability.java
 Sun Jan 22 12:23:22 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.referencelistener;
+
+public enum Availability {
+    MANDATORY,
+    OPTIONAL
+}

Added: 
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/Bind.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/Bind.java?rev=1779797&view=auto
==============================================================================
--- 
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/Bind.java
 (added)
+++ 
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/Bind.java
 Sun Jan 22 12:23:22 2017
@@ -0,0 +1,33 @@
+/**
+ * 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.referencelistener;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Method annotated with this annotation is bind method of reference listener
+ */
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Bind {
+
+}

Added: 
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/Cardinality.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/Cardinality.java?rev=1779797&view=auto
==============================================================================
--- 
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/Cardinality.java
 (added)
+++ 
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/Cardinality.java
 Sun Jan 22 12:23:22 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.referencelistener;
+
+public enum Cardinality {
+    SINGLE,
+    MULTIPLE
+}

Added: 
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/ReferenceListener.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/ReferenceListener.java?rev=1779797&view=auto
==============================================================================
--- 
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/ReferenceListener.java
 (added)
+++ 
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/ReferenceListener.java
 Sun Jan 22 12:23:22 2017
@@ -0,0 +1,79 @@
+/**
+ * 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.referencelistener;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotating any class with this will create a
+ * reference or referenclist element in blueprint
+ * with annotated bean as reference-listener.
+ */
+@Target({ElementType.TYPE, ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ReferenceListener {
+
+    /**
+     * @return interface class of referenced service
+     */
+    Class<?> referenceInterface();
+
+    /**
+     * @return filter on reference or reference-list
+     */
+    String filter() default "";
+
+    /**
+     * @return component-name on reference or reference-list
+     */
+    String componentName() default "";
+
+    /**
+     * @return if existence of at least one service is necessary
+     */
+    Availability availability() default Availability.OPTIONAL;
+
+    /**
+     * @return id of reference or reference-list
+     */
+    String referenceName() default "";
+
+    /**
+     * @return should generate reference or reference-list
+     */
+    Cardinality cardinality() default Cardinality.MULTIPLE;
+
+    /**
+     * @return bind method of reference-listener
+     * if not provided then method annotated with {{@link Bind}}
+     * will be found and used
+     */
+    String bindMethod() default "";
+
+    /**
+     * @return unbind method of reference-listener
+     * if not provided then method annotated with {{@link Unbind}}
+     * will be found and used
+     */
+    String unbindMethod() default "";
+
+}

Added: 
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/Unbind.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/Unbind.java?rev=1779797&view=auto
==============================================================================
--- 
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/Unbind.java
 (added)
+++ 
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/Unbind.java
 Sun Jan 22 12:23:22 2017
@@ -0,0 +1,33 @@
+/**
+ * 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.referencelistener;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Method annotated with this annotation is unbind method of reference listener
+ */
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Unbind {
+
+}

Copied: 
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/packageinfo
 (from r1779380, 
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/config/packageinfo)
URL: 
http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/packageinfo?p2=aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/packageinfo&p1=aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/config/packageinfo&r1=1779380&r2=1779797&rev=1779797&view=diff
==============================================================================
--- 
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/config/packageinfo
 (original)
+++ 
aries/trunk/blueprint/plugin/blueprint-maven-plugin-annotation/src/main/java/org/apache/aries/blueprint/annotation/referencelistener/packageinfo
 Sun Jan 22 12:23:22 2017
@@ -16,4 +16,4 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-version 1.1.0
+version 1.0.0

Added: 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/referencelistener/ReferenceListenerDefinition.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/referencelistener/ReferenceListenerDefinition.java?rev=1779797&view=auto
==============================================================================
--- 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/referencelistener/ReferenceListenerDefinition.java
 (added)
+++ 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/referencelistener/ReferenceListenerDefinition.java
 Sun Jan 22 12:23:22 2017
@@ -0,0 +1,35 @@
+/**
+ * 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.referencelistener;
+
+class ReferenceListenerDefinition {
+    final String ref;
+    final String bind;
+    final String unbind;
+
+    public ReferenceListenerDefinition(String ref, String bind, String unbind) 
{
+        this.ref = ref;
+        this.bind = getOrNull(bind);
+        this.unbind = getOrNull(unbind);
+    }
+
+    private static String getOrNull(String unbind) {
+        return unbind == null || unbind.isEmpty() ? null : unbind;
+    }
+}

Added: 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/referencelistener/ReferenceListenerHandler.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/referencelistener/ReferenceListenerHandler.java?rev=1779797&view=auto
==============================================================================
--- 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/referencelistener/ReferenceListenerHandler.java
 (added)
+++ 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/referencelistener/ReferenceListenerHandler.java
 Sun Jan 22 12:23:22 2017
@@ -0,0 +1,177 @@
+/**
+ * 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.referencelistener;
+
+import org.apache.aries.blueprint.annotation.referencelistener.Bind;
+import org.apache.aries.blueprint.annotation.referencelistener.Cardinality;
+import 
org.apache.aries.blueprint.annotation.referencelistener.ReferenceListener;
+import org.apache.aries.blueprint.annotation.referencelistener.Unbind;
+import org.apache.aries.blueprint.plugin.spi.BeanAnnotationHandler;
+import org.apache.aries.blueprint.plugin.spi.BeanEnricher;
+import org.apache.aries.blueprint.plugin.spi.ContextEnricher;
+import org.apache.aries.blueprint.plugin.spi.XmlWriter;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Method;
+import java.util.List;
+
+public class ReferenceListenerHandler implements 
BeanAnnotationHandler<ReferenceListener> {
+    @Override
+    public void handleBeanAnnotation(AnnotatedElement annotatedElement, String 
id, ContextEnricher contextEnricher, BeanEnricher beanEnricher) {
+        ReferenceListener annotation = 
annotatedElement.getAnnotation(ReferenceListener.class);
+        Class<?> referenceListenerClass = getClass(annotatedElement);
+        String bindMethod = annotation.bindMethod().isEmpty() ? 
getAnnotatedMethodName(referenceListenerClass, Bind.class) : 
annotation.bindMethod();
+        String unbindMethod = annotation.unbindMethod().isEmpty() ? 
getAnnotatedMethodName(referenceListenerClass, Unbind.class) : 
annotation.unbindMethod();
+        ReferenceListenerDefinition referenceListenerDefinition = new 
ReferenceListenerDefinition(
+                id, bindMethod, unbindMethod
+        );
+        String referenceBeanName = annotation.referenceName().isEmpty() ? 
createReferenceBeanName(annotation) : annotation.referenceName();
+        if (annotation.cardinality() == Cardinality.SINGLE) {
+            contextEnricher.addBean(referenceBeanName, 
annotation.referenceInterface());
+            createReference(referenceBeanName, referenceListenerDefinition, 
annotation, contextEnricher);
+        } else {
+            contextEnricher.addBean(referenceBeanName, List.class);
+            createReferenceList(referenceBeanName, 
referenceListenerDefinition, annotation, contextEnricher);
+        }
+    }
+
+    private void createReference(final String referenceBeanName,
+                                 final ReferenceListenerDefinition 
referenceListenerDefinition,
+                                 final ReferenceListener annotation,
+                                 ContextEnricher contextEnricher) {
+        
contextEnricher.addBlueprintContentWriter("referenceWithReferenceListener/" + 
referenceBeanName + "/" + referenceListenerDefinition.ref, new XmlWriter() {
+            @Override
+            public void write(XMLStreamWriter xmlStreamWriter) throws 
XMLStreamException {
+                xmlStreamWriter.writeStartElement("reference");
+                xmlStreamWriter.writeAttribute("interface", 
annotation.referenceInterface().getName());
+                xmlStreamWriter.writeAttribute("availability", 
annotation.availability().name().toLowerCase());
+                xmlStreamWriter.writeAttribute("id", referenceBeanName);
+                if (!annotation.filter().isEmpty()) {
+                    xmlStreamWriter.writeAttribute("filter", 
annotation.filter());
+                }
+                if (!annotation.componentName().isEmpty()) {
+                    xmlStreamWriter.writeAttribute("component-name", 
annotation.componentName());
+                }
+                writeReferenceListner(xmlStreamWriter, 
referenceListenerDefinition);
+                xmlStreamWriter.writeEndElement();
+            }
+        });
+    }
+
+    private void createReferenceList(final String referenceBeanName,
+                                     final ReferenceListenerDefinition 
referenceListenerDefinition,
+                                     final ReferenceListener annotation,
+                                     ContextEnricher contextEnricher) {
+        
contextEnricher.addBlueprintContentWriter("referenceListWithReferenceListener/" 
+ referenceBeanName + "/" + referenceListenerDefinition.ref, new XmlWriter() {
+            @Override
+            public void write(XMLStreamWriter xmlStreamWriter) throws 
XMLStreamException {
+                xmlStreamWriter.writeStartElement("reference-list");
+                xmlStreamWriter.writeAttribute("interface", 
annotation.referenceInterface().getName());
+                xmlStreamWriter.writeAttribute("availability", 
annotation.availability().name().toLowerCase());
+                xmlStreamWriter.writeAttribute("id", referenceBeanName);
+                if (!annotation.filter().isEmpty()) {
+                    xmlStreamWriter.writeAttribute("filter", 
annotation.filter());
+                }
+                if (!annotation.componentName().isEmpty()) {
+                    xmlStreamWriter.writeAttribute("component-name", 
annotation.componentName());
+                }
+                writeReferenceListner(xmlStreamWriter, 
referenceListenerDefinition);
+                xmlStreamWriter.writeEndElement();
+            }
+        });
+    }
+
+    private void writeReferenceListner(XMLStreamWriter xmlStreamWriter, 
ReferenceListenerDefinition referenceListenerDefinition) throws 
XMLStreamException {
+        xmlStreamWriter.writeStartElement("reference-listener");
+        xmlStreamWriter.writeAttribute("ref", referenceListenerDefinition.ref);
+        if (referenceListenerDefinition.bind != null) {
+            xmlStreamWriter.writeAttribute("bind", 
referenceListenerDefinition.bind);
+        }
+        if (referenceListenerDefinition.unbind != null) {
+            xmlStreamWriter.writeAttribute("unbind", 
referenceListenerDefinition.unbind);
+        }
+        xmlStreamWriter.writeEndElement();
+    }
+
+    private String createReferenceBeanName(ReferenceListener annotation) {
+        String prefix = 
getBeanNameFromSimpleName(annotation.referenceInterface().getSimpleName());
+        String listPart = annotation.cardinality() == Cardinality.SINGLE ? "" 
: "List";
+        String suffix = createIdSuffix(annotation);
+        return prefix + listPart + suffix;
+    }
+
+    private static String getBeanNameFromSimpleName(String name) {
+        return name.substring(0, 1).toLowerCase() + name.substring(1, 
name.length());
+    }
+
+    private String createIdSuffix(ReferenceListener listener) {
+        return createComponentNamePart(listener) + createFilterPart(listener);
+    }
+
+    private String createComponentNamePart(ReferenceListener listener) {
+        if (!listener.componentName().isEmpty()) {
+            return "-" + listener.componentName();
+        }
+        return "";
+    }
+
+    private String createFilterPart(ReferenceListener listener) {
+        if (!listener.filter().isEmpty()) {
+            return "-" + getId(listener.filter());
+        }
+        return "";
+    }
+
+    private String getId(String raw) {
+        StringBuilder builder = new StringBuilder();
+        for (int c = 0; c < raw.length(); c++) {
+            char ch = raw.charAt(c);
+            if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z' || ch >= '0' 
&& ch <= '9') {
+                builder.append(ch);
+            }
+        }
+        return builder.toString();
+    }
+
+    private String getAnnotatedMethodName(Class<?> referenceListenerClass, 
Class annotation) {
+        for (Method method : referenceListenerClass.getMethods()) {
+            if (method.getAnnotation(annotation) != null) {
+                return method.getName();
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public Class<ReferenceListener> getAnnotation() {
+        return ReferenceListener.class;
+    }
+
+    private Class<?> getClass(AnnotatedElement annotatedElement) {
+        if (annotatedElement instanceof Class<?>) {
+            return (Class<?>) annotatedElement;
+        }
+        if (annotatedElement instanceof Method) {
+            return ((Method) annotatedElement).getReturnType();
+        }
+        throw new RuntimeException("Unknown annotated element");
+    }
+}

Modified: 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/resources/META-INF/services/org.apache.aries.blueprint.plugin.spi.BeanAnnotationHandler
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.BeanAnnotationHandler?rev=1779797&r1=1779796&r2=1779797&view=diff
==============================================================================
--- 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/resources/META-INF/services/org.apache.aries.blueprint.plugin.spi.BeanAnnotationHandler
 (original)
+++ 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/resources/META-INF/services/org.apache.aries.blueprint.plugin.spi.BeanAnnotationHandler
 Sun Jan 22 12:23:22 2017
@@ -22,3 +22,4 @@ org.apache.aries.blueprint.plugin.spring
 org.apache.aries.blueprint.plugin.javax.JavaxTransactionFactory
 org.apache.aries.blueprint.plugin.javax.cdi.CdiTransactionFactory
 org.apache.aries.blueprint.plugin.config.ConfigAnnotationHandler
+org.apache.aries.blueprint.plugin.referencelistener.ReferenceListenerHandler

Modified: 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java?rev=1779797&r1=1779796&r2=1779797&view=diff
==============================================================================
--- 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java
 (original)
+++ 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java
 Sun Jan 22 12:23:22 2017
@@ -26,6 +26,7 @@ import org.apache.aries.blueprint.plugin
 import org.apache.aries.blueprint.plugin.test.ServiceA;
 import org.apache.aries.blueprint.plugin.test.ServiceB;
 import org.apache.aries.blueprint.plugin.test.ServiceD;
+import 
org.apache.aries.blueprint.plugin.test.referencelistener.ReferenceListenerToProduceWithoutAnnotation;
 import org.apache.commons.io.output.ByteArrayOutputStream;
 import org.apache.xbean.finder.ClassFinder;
 import org.junit.BeforeClass;
@@ -46,7 +47,6 @@ import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
@@ -54,6 +54,7 @@ import java.util.Set;
 
 import static 
org.apache.aries.blueprint.plugin.FilteredClassFinder.findClasses;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 
 public class GeneratorTest {
 
@@ -66,8 +67,10 @@ public class GeneratorTest {
     @BeforeClass
     public static void setUp() throws Exception {
         ClassFinder classFinder = new 
ClassFinder(GeneratorTest.class.getClassLoader());
-        String packageName = MyBean1.class.getPackage().getName();
-        Set<Class<?>> beanClasses = findClasses(classFinder, 
Collections.singletonList(packageName));
+        Set<Class<?>> beanClasses = findClasses(classFinder, Arrays.asList(
+                MyBean1.class.getPackage().getName(),
+                
ReferenceListenerToProduceWithoutAnnotation.class.getPackage().getName()
+        ));
         Set<String> namespaces = new HashSet<String>(Arrays.asList(NS_JPA, 
NS_TX1));
         Map<String, String> customParameters = new HashMap<>();
         customParameters.put("ex.t", "1");
@@ -502,6 +505,102 @@ public class GeneratorTest {
         assertXpathEquals(testProps9, "@update", "true");
     }
 
+    @Test
+    public void referenceListnerForReferenceList() throws Exception {
+        assertNotNull(getBeanById("referenceListenerListBean"));
+
+        Node referenceList = getReferenceListById("serviceAList-a-bc");
+        assertXpathEquals(referenceList, "@filter", "(b=c)");
+        assertXpathEquals(referenceList, "@component-name", "a");
+        assertXpathEquals(referenceList, "@availability", "mandatory");
+        assertXpathEquals(referenceList, "@interface", 
ServiceA.class.getName());
+        assertXpathEquals(referenceList, "reference-listener/@ref", 
"referenceListenerListBean");
+        assertXpathEquals(referenceList, "reference-listener/@bind", "add");
+        assertXpathEquals(referenceList, "reference-listener/@unbind", 
"remove");
+    }
+
+    @Test
+    public void referenceListnerForReference() throws Exception {
+        
assertNotNull(getBeanById("referenceListenerBeanWithNameWithoutMethods"));
+
+        Node reference = getReferenceById("serviceAReference");
+        assertXpathDoesNotExist(reference, "@filter");
+        assertXpathDoesNotExist(reference, "@component-name");
+        assertXpathEquals(reference, "@availability", "optional");
+        assertXpathEquals(reference, "@interface", ServiceA.class.getName());
+        assertXpathEquals(reference, "reference-listener/@ref", 
"referenceListenerBeanWithNameWithoutMethods");
+        assertXpathDoesNotExist(reference, "reference-listener/@bind");
+        assertXpathDoesNotExist(reference, "reference-listener/@unbind");
+    }
+
+    @Test
+    public void referenceListnerForReferenceWithouMethodAnnotations() throws 
Exception {
+        
assertNotNull(getBeanById("referenceListenerBeanWithoutMethodsAnnotation"));
+
+        Node reference = getReferenceListById("serviceAReference");
+        assertXpathDoesNotExist(reference, "@filter");
+        assertXpathDoesNotExist(reference, "@component-name");
+        assertXpathEquals(reference, "@availability", "optional");
+        assertXpathEquals(reference, "@interface", ServiceA.class.getName());
+        assertXpathEquals(reference, "reference-listener/@ref", 
"referenceListenerBeanWithoutMethodsAnnotation");
+        assertXpathEquals(reference, "reference-listener/@bind", "addMe");
+        assertXpathEquals(reference, "reference-listener/@unbind", "removeMe");
+    }
+
+    @Test
+    public void produceReferenceListnerForReference() throws Exception {
+        assertNotNull(getBeanById("referenceListenerProducer"));
+
+        Node referenceListenerToProduceForSingle = 
getBeanById("referenceListenerToProduceForSingle");
+        assertXpathEquals(referenceListenerToProduceForSingle, "@factory-ref", 
"referenceListenerProducer");
+        assertXpathEquals(referenceListenerToProduceForSingle, 
"@factory-method", "single");
+
+        Node reference = getReferenceById("serviceB-producer123-b123");
+        assertXpathEquals(reference, "@filter", "(b=123)");
+        assertXpathEquals(reference, "@component-name", "producer123");
+        assertXpathEquals(reference, "@availability", "optional");
+        assertXpathEquals(reference, "@interface", ServiceB.class.getName());
+        assertXpathEquals(reference, "reference-listener/@ref", 
"referenceListenerToProduceForSingle");
+        assertXpathEquals(reference, "reference-listener/@bind", "register");
+        assertXpathEquals(reference, "reference-listener/@unbind", 
"unregister");
+    }
+
+    @Test
+    public void produceReferenceListnerForReferenceList() throws Exception {
+        assertNotNull(getBeanById("referenceListenerProducer"));
+
+        Node referenceListenerToProduceForList = 
getBeanById("referenceListenerToProduceForList");
+        assertXpathEquals(referenceListenerToProduceForList, "@factory-ref", 
"referenceListenerProducer");
+        assertXpathEquals(referenceListenerToProduceForList, 
"@factory-method", "list");
+
+        Node referenceList = getReferenceListById("referenceListForProducer");
+        assertXpathEquals(referenceList, "@filter", "(b=456)");
+        assertXpathEquals(referenceList, "@component-name", "producer456");
+        assertXpathEquals(referenceList, "@availability", "optional");
+        assertXpathEquals(referenceList, "@interface", 
ServiceB.class.getName());
+        assertXpathEquals(referenceList, "reference-listener/@ref", 
"referenceListenerToProduceForList");
+        assertXpathEquals(referenceList, "reference-listener/@bind", "addMe");
+        assertXpathEquals(referenceList, "reference-listener/@unbind", 
"removeMe");
+    }
+
+    @Test
+    public void 
produceReferenceListnerForReferenceListWithOverrideAnnotatedMethods() throws 
Exception {
+        assertNotNull(getBeanById("referenceListenerProducer"));
+
+        Node referenceListenerToProduceWithBindingMethodsByName = 
getBeanById("referenceListenerToProduceWithBindingMethodsByName");
+        assertXpathEquals(referenceListenerToProduceWithBindingMethodsByName, 
"@factory-ref", "referenceListenerProducer");
+        assertXpathEquals(referenceListenerToProduceWithBindingMethodsByName, 
"@factory-method", "listWithDefinedMethods");
+
+        Node referenceList = getReferenceListById("serviceBList");
+        assertXpathDoesNotExist(referenceList, "@filter");
+        assertXpathDoesNotExist(referenceList, "@component-name");
+        assertXpathEquals(referenceList, "@availability", "mandatory");
+        assertXpathEquals(referenceList, "@interface", 
ServiceB.class.getName());
+        assertXpathEquals(referenceList, "reference-listener/@ref", 
"referenceListenerToProduceWithBindingMethodsByName");
+        assertXpathEquals(referenceList, "reference-listener/@bind", "addMe");
+        assertXpathEquals(referenceList, "reference-listener/@unbind", 
"removeMe");
+    }
+
     private void assertXpathDoesNotExist(Node node, String xpathExpression) 
throws XPathExpressionException {
         assertXpathEquals(node, "count(" + xpathExpression + ")", "0");
     }
@@ -534,4 +633,8 @@ public class GeneratorTest {
         return (Node) xpath.evaluate("/blueprint/reference[@id='" + id + "']", 
document, XPathConstants.NODE);
     }
 
+    private static Node getReferenceListById(String id) throws 
XPathExpressionException {
+        return (Node) xpath.evaluate("/blueprint/reference-list[@id='" + id + 
"']", document, XPathConstants.NODE);
+    }
+
 }

Added: 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerBeanWithName.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerBeanWithName.java?rev=1779797&view=auto
==============================================================================
--- 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerBeanWithName.java
 (added)
+++ 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerBeanWithName.java
 Sun Jan 22 12:23:22 2017
@@ -0,0 +1,33 @@
+/**
+ * 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.test.referencelistener;
+
+import com.google.inject.Singleton;
+import org.apache.aries.blueprint.annotation.referencelistener.Cardinality;
+import 
org.apache.aries.blueprint.annotation.referencelistener.ReferenceListener;
+import org.apache.aries.blueprint.plugin.test.ServiceA;
+
+import javax.inject.Named;
+
+@ReferenceListener(referenceInterface = ServiceA.class, cardinality = 
Cardinality.SINGLE, referenceName = "serviceAReference")
+@Singleton
+@Named("referenceListenerBeanWithNameWithoutMethods")
+public class ReferenceListenerBeanWithName {
+
+}

Added: 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerBeanWithoutMethodsAnnotation.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerBeanWithoutMethodsAnnotation.java?rev=1779797&view=auto
==============================================================================
--- 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerBeanWithoutMethodsAnnotation.java
 (added)
+++ 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerBeanWithoutMethodsAnnotation.java
 Sun Jan 22 12:23:22 2017
@@ -0,0 +1,39 @@
+/**
+ * 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.test.referencelistener;
+
+import org.apache.aries.blueprint.annotation.referencelistener.Cardinality;
+import 
org.apache.aries.blueprint.annotation.referencelistener.ReferenceListener;
+import org.apache.aries.blueprint.plugin.test.ServiceA;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+@ReferenceListener(referenceInterface = ServiceA.class, cardinality = 
Cardinality.MULTIPLE,
+        referenceName = "serviceAReference", bindMethod = "addMe", 
unbindMethod = "removeMe")
+@Singleton
+public class ReferenceListenerBeanWithoutMethodsAnnotation {
+    public void addMe(ServiceA serviceB) {
+
+    }
+
+    public void removeMe(ServiceA serviceB) {
+
+    }
+}

Added: 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerListBean.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerListBean.java?rev=1779797&view=auto
==============================================================================
--- 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerListBean.java
 (added)
+++ 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerListBean.java
 Sun Jan 22 12:23:22 2017
@@ -0,0 +1,41 @@
+/**
+ * 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.test.referencelistener;
+
+import org.apache.aries.blueprint.annotation.referencelistener.Availability;
+import org.apache.aries.blueprint.annotation.referencelistener.Bind;
+import 
org.apache.aries.blueprint.annotation.referencelistener.ReferenceListener;
+import org.apache.aries.blueprint.annotation.referencelistener.Unbind;
+import org.apache.aries.blueprint.plugin.test.ServiceA;
+
+import javax.inject.Singleton;
+
+@ReferenceListener(referenceInterface = ServiceA.class, filter = "(b=c)", 
componentName = "a", availability = Availability.MANDATORY)
+@Singleton
+public class ReferenceListenerListBean {
+
+    @Bind
+    public void add(ServiceA a) {
+    }
+
+    @Unbind
+    public void remove(ServiceA a) {
+    }
+
+}

Added: 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerProducer.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerProducer.java?rev=1779797&view=auto
==============================================================================
--- 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerProducer.java
 (added)
+++ 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerProducer.java
 Sun Jan 22 12:23:22 2017
@@ -0,0 +1,71 @@
+/**
+ * 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.test.referencelistener;
+
+import org.apache.aries.blueprint.annotation.referencelistener.Availability;
+import org.apache.aries.blueprint.annotation.referencelistener.Cardinality;
+import 
org.apache.aries.blueprint.annotation.referencelistener.ReferenceListener;
+import org.apache.aries.blueprint.plugin.test.ServiceB;
+
+import javax.enterprise.inject.Produces;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+@Singleton
+public class ReferenceListenerProducer {
+
+    @Produces
+    @ReferenceListener(cardinality = Cardinality.SINGLE,
+            referenceInterface = ServiceB.class,
+            componentName = "producer123",
+            filter = "(b=123)"
+    )
+    @Named("referenceListenerToProduceForSingle")
+    public ReferenceListenerToProduce single() {
+        return null;
+    }
+
+    @Produces
+    @ReferenceListener(
+            referenceInterface = ServiceB.class,
+            componentName = "producer456",
+            filter = "(b=456)",
+            referenceName = "referenceListForProducer",
+            bindMethod = "addMe",
+            unbindMethod = "removeMe"
+    )
+    @Named("referenceListenerToProduceForList")
+    public ReferenceListenerToProduceWithoutAnnotation list() {
+        return null;
+    }
+
+    @Produces
+    @ReferenceListener(
+            referenceInterface = ServiceB.class,
+            bindMethod = "addMe",
+            unbindMethod = "removeMe",
+            availability = Availability.MANDATORY
+    )
+    @Singleton
+    @Named("referenceListenerToProduceWithBindingMethodsByName")
+    public ReferenceListenerToProduce listWithDefinedMethods() {
+        return null;
+    }
+
+}

Added: 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerToProduce.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerToProduce.java?rev=1779797&view=auto
==============================================================================
--- 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerToProduce.java
 (added)
+++ 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerToProduce.java
 Sun Jan 22 12:23:22 2017
@@ -0,0 +1,43 @@
+/**
+ * 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.test.referencelistener;
+
+import org.apache.aries.blueprint.annotation.referencelistener.Bind;
+import org.apache.aries.blueprint.annotation.referencelistener.Unbind;
+import org.apache.aries.blueprint.plugin.test.ServiceB;
+
+public class ReferenceListenerToProduce {
+    @Bind
+    public void register(ServiceB serviceB) {
+
+    }
+
+    @Unbind
+    public void unregister(ServiceB serviceB) {
+
+    }
+
+    public void addMe(ServiceB serviceB) {
+
+    }
+
+    public void removeMe(ServiceB serviceB) {
+
+    }
+}

Added: 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerToProduceWithoutAnnotation.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerToProduceWithoutAnnotation.java?rev=1779797&view=auto
==============================================================================
--- 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerToProduceWithoutAnnotation.java
 (added)
+++ 
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/referencelistener/ReferenceListenerToProduceWithoutAnnotation.java
 Sun Jan 22 12:23:22 2017
@@ -0,0 +1,31 @@
+/**
+ * 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.test.referencelistener;
+
+import org.apache.aries.blueprint.plugin.test.ServiceB;
+
+public class ReferenceListenerToProduceWithoutAnnotation {
+    public void addMe(ServiceB serviceB) {
+
+    }
+
+    public void removeMe(ServiceB serviceB) {
+
+    }
+}


Reply via email to