Author: alien11689 Date: Fri Jun 3 21:58:39 2016 New Revision: 1746775 URL: http://svn.apache.org/viewvc?rev=1746775&view=rev Log: [ARIES-1561] Allow for exposing service from produced beans
Added: aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyFactoryBeanAsService.java Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Context.java aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/service/ServiceProvider.java aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyFactoryNamedBean.java aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ServiceReferences.java Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Context.java URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Context.java?rev=1746775&r1=1746774&r2=1746775&view=diff ============================================================================== --- aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Context.java (original) +++ aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Context.java Fri Jun 3 21:58:39 2016 @@ -6,9 +6,9 @@ * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * <p> + * <p/> * http://www.apache.org/licenses/LICENSE-2.0 - * <p> + * <p/> * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -93,6 +93,10 @@ public class Context implements Matcher producedBean.setSingleton(); } reg.add(producedBean); + ServiceProvider serviceProvider = ServiceProvider.fromMethod(producedBean, method); + if (serviceProvider != null) { + serviceProviders.add(serviceProvider); + } } } } Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/service/ServiceProvider.java URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/service/ServiceProvider.java?rev=1746775&r1=1746774&r2=1746775&view=diff ============================================================================== --- aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/service/ServiceProvider.java (original) +++ aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/service/ServiceProvider.java Fri Jun 3 21:58:39 2016 @@ -1,11 +1,32 @@ +/** + * 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.model.service; import com.google.common.collect.Lists; import org.apache.aries.blueprint.plugin.model.Bean; +import org.apache.aries.blueprint.plugin.model.BeanRef; import org.ops4j.pax.cdi.api.OsgiServiceProvider; import org.ops4j.pax.cdi.api.Properties; import org.ops4j.pax.cdi.api.Property; +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Method; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -22,25 +43,43 @@ public class ServiceProvider { } public static ServiceProvider fromBean(Bean bean) { - OsgiServiceProvider serviceProvider = bean.clazz.getAnnotation(OsgiServiceProvider.class); + return createServiceProvider(bean.clazz, bean.id); + } + + public static ServiceProvider fromMethod(BeanRef beanRef, Method method) { + return createServiceProvider(method, beanRef.id); + } + + private static ServiceProvider createServiceProvider(AnnotatedElement annotatedElement, String ref) { + OsgiServiceProvider serviceProvider = annotatedElement.getAnnotation(OsgiServiceProvider.class); + Properties properties = annotatedElement.getAnnotation(Properties.class); + if (serviceProvider == null) { return null; } - List<String> interfaceNames = Lists.newArrayList(); - for (Class<?> serviceIf : serviceProvider.classes()) { - interfaceNames.add(serviceIf.getName()); - } + List<String> interfaceNames = extractServiceInterfaces(serviceProvider); + + Map<String, String> propertiesAsMap = extractProperties(properties); - Properties properties = bean.clazz.getAnnotation(Properties.class); + return new ServiceProvider(interfaceNames, ref, propertiesAsMap); + } + private static Map<String, String> extractProperties(Properties properties) { Map<String, String> propertiesAsMap = new HashMap<>(); if (properties != null) { for (Property property : properties.value()) { propertiesAsMap.put(property.name(), property.value()); } } + return propertiesAsMap; + } - return new ServiceProvider(interfaceNames, bean.id, propertiesAsMap); + private static List<String> extractServiceInterfaces(OsgiServiceProvider serviceProvider) { + List<String> interfaceNames = Lists.newArrayList(); + for (Class<?> serviceIf : serviceProvider.classes()) { + interfaceNames.add(serviceIf.getName()); + } + return interfaceNames; } } Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java?rev=1746775&r1=1746774&r2=1746775&view=diff ============================================================================== --- aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java (original) +++ aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java Fri Jun 3 21:58:39 2016 @@ -22,6 +22,7 @@ import com.google.common.collect.Sets; import org.apache.aries.blueprint.plugin.model.Context; import org.apache.aries.blueprint.plugin.model.TransactionalDef; import org.apache.aries.blueprint.plugin.test.MyBean1; +import org.apache.aries.blueprint.plugin.test.MyProduced; import org.apache.aries.blueprint.plugin.test.ServiceA; import org.apache.aries.blueprint.plugin.test.ServiceB; import org.apache.commons.io.output.ByteArrayOutputStream; @@ -221,6 +222,46 @@ public class GeneratorTest { assertEquals("ser1", xpath.evaluate("argument[3]/@ref", bean1)); } + @Test + public void testExposeProducedBeanAsServiceWithAutoExport() throws Exception { + Node service = getServiceByRef("producedForService"); + assertEquals("interfaces", xpath.evaluate("@auto-export", service)); + assertEquals("", xpath.evaluate("@interface", service)); + assertEquals("0", xpath.evaluate("count(interfaces)", service)); + assertEquals("0", xpath.evaluate("count(service-properties)", service)); + } + + @Test + public void testExposeProducedBeanAsServiceWithOneInterface() throws Exception { + Node service = getServiceByRef("producedForServiceWithOneInterface"); + assertEquals("", xpath.evaluate("@auto-export", service)); + assertEquals(MyProduced.class.getName(), xpath.evaluate("@interface", service)); + assertEquals("0", xpath.evaluate("count(interfaces)", service)); + assertEquals("0", xpath.evaluate("count(service-properties)", service)); + } + + @Test + public void testExposeProducedBeanAsServiceWithTwoInterfaces() throws Exception { + Node service = getServiceByRef("producedForServiceWithTwoInterfaces"); + assertEquals("", xpath.evaluate("@auto-export", service)); + assertEquals("", xpath.evaluate("@interface", service)); + assertEquals("2", xpath.evaluate("count(interfaces/value)", service)); + assertEquals(MyProduced.class.getName(), xpath.evaluate("interfaces/value[1]", service)); + assertEquals(ServiceA.class.getName(), xpath.evaluate("interfaces/value[2]", service)); + assertEquals("0", xpath.evaluate("count(service-properties)", service)); + } + + @Test + public void testExposeProducedBeanAsServiceWithServiceProperties() throws Exception { + Node service = getServiceByRef("producedForServiceWithProperties"); + assertEquals("interfaces", xpath.evaluate("@auto-export", service)); + assertEquals("", xpath.evaluate("@interface", service)); + assertEquals("0", xpath.evaluate("count(interfaces)", service)); + assertEquals("2", xpath.evaluate("count(service-properties/entry)", service)); + assertEquals("v1", xpath.evaluate("service-properties/entry[@key='n1']/@value", service)); + assertEquals("v2", xpath.evaluate("service-properties/entry[@key='n2']/@value", service)); + } + private static Document readToDocument(ByteArrayOutputStream os) throws ParserConfigurationException, SAXException, IOException { InputStream is = new ByteArrayInputStream(os.toByteArray()); Added: aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyFactoryBeanAsService.java URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyFactoryBeanAsService.java?rev=1746775&view=auto ============================================================================== --- aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyFactoryBeanAsService.java (added) +++ aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyFactoryBeanAsService.java Fri Jun 3 21:58:39 2016 @@ -0,0 +1,62 @@ +/** + * 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; + +import org.ops4j.pax.cdi.api.OsgiServiceProvider; +import org.ops4j.pax.cdi.api.Properties; +import org.ops4j.pax.cdi.api.Property; + +import javax.enterprise.inject.Produces; +import javax.inject.Named; +import javax.inject.Singleton; + +@Singleton +public class MyFactoryBeanAsService { + + @Produces + @Named("producedForService") + @OsgiServiceProvider + public MyProduced createBeanWithServiceExpose1() { + return new MyProduced("My message"); + } + + @Produces + @Named("producedForServiceWithOneInterface") + @OsgiServiceProvider(classes = MyProduced.class) + public MyProduced createBeanWithServiceExpose2() { + return new MyProduced("My message"); + } + @Produces + @Named("producedForServiceWithTwoInterfaces") + @OsgiServiceProvider(classes = {MyProduced.class, ServiceA.class}) + public MyProduced createBeanWithServiceExpose3() { + return new MyProduced("My message"); + } + + @Produces + @Named("producedForServiceWithProperties") + @OsgiServiceProvider + @Properties({ + @Property(name = "n1", value = "v1"), + @Property(name = "n2", value = "v2") + }) + public MyProduced createBeanWithServiceExpose4() { + return new MyProduced("My message"); + } +} Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyFactoryNamedBean.java URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyFactoryNamedBean.java?rev=1746775&r1=1746774&r2=1746775&view=diff ============================================================================== --- aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyFactoryNamedBean.java (original) +++ aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyFactoryNamedBean.java Fri Jun 3 21:58:39 2016 @@ -37,4 +37,5 @@ public class MyFactoryNamedBean { public MyProduced createBean2() { return new MyProduced("My message"); } + } Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ServiceReferences.java URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ServiceReferences.java?rev=1746775&r1=1746774&r2=1746775&view=diff ============================================================================== --- aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ServiceReferences.java (original) +++ aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ServiceReferences.java Fri Jun 3 21:58:39 2016 @@ -1,4 +1,3 @@ - /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file