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) { + + } +}