diff --git a/itest/src/it/itest-cdi10/pom.xml b/itest/src/it/itest-cdi10/pom.xml index 51f67041..a8fc1036 100644 --- a/itest/src/it/itest-cdi10/pom.xml +++ b/itest/src/it/itest-cdi10/pom.xml @@ -114,6 +114,13 @@ provided + + org.ops4j.pax.cdi.samples + pax-cdi-sample-osgi-provider-producer-method + ${project.version} + provided + + org.ops4j.pax.cdi pax-cdi-extension diff --git a/itest/src/it/itest-cdi10/src/test/java/org/ops4j/pax/cdi/test/GreeterProducerTest.java b/itest/src/it/itest-cdi10/src/test/java/org/ops4j/pax/cdi/test/GreeterProducerTest.java new file mode 100644 index 00000000..d85114a5 --- /dev/null +++ b/itest/src/it/itest-cdi10/src/test/java/org/ops4j/pax/cdi/test/GreeterProducerTest.java @@ -0,0 +1,63 @@ +/* + * Copyright 2013 Harald Wellmann. + * + * Licensed 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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.ops4j.pax.cdi.test; + + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.ops4j.pax.exam.Configuration; +import org.ops4j.pax.exam.Option; +import org.ops4j.pax.exam.junit.PaxExam; +import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy; +import org.ops4j.pax.exam.spi.reactors.PerClass; +import org.osgi.framework.InvalidSyntaxException; +import sample.osgiProviderProducerMethod.Greeter; + +import javax.inject.Inject; + +import static org.junit.Assert.assertEquals; +import static org.ops4j.pax.cdi.test.support.TestConfiguration.cdiProviderBundles; +import static org.ops4j.pax.cdi.test.support.TestConfiguration.paxCdiProviderAdapter; +import static org.ops4j.pax.cdi.test.support.TestConfiguration.regressionDefaults; +import static org.ops4j.pax.cdi.test.support.TestConfiguration.workspaceBundle; +import static org.ops4j.pax.exam.CoreOptions.options; + + +@RunWith(PaxExam.class) +@ExamReactorStrategy(PerClass.class) +public class GreeterProducerTest { + + @Inject + private Greeter greeter; + + @Configuration + public Option[] config() { + return options( + regressionDefaults(), + + workspaceBundle("org.ops4j.pax.cdi.samples", "pax-cdi-sample-osgi-provider-producer-method"), + + paxCdiProviderAdapter(), + cdiProviderBundles()); + } + + @Test + public void checkInjection() throws InvalidSyntaxException { + assertEquals(greeter.sayHello(), "Hello!"); + } +} diff --git a/pax-cdi-extension/src/main/java/org/ops4j/pax/cdi/extension/impl/component/ComponentLifecycleManager.java b/pax-cdi-extension/src/main/java/org/ops4j/pax/cdi/extension/impl/component/ComponentLifecycleManager.java index 9cc76766..554bd12a 100644 --- a/pax-cdi-extension/src/main/java/org/ops4j/pax/cdi/extension/impl/component/ComponentLifecycleManager.java +++ b/pax-cdi-extension/src/main/java/org/ops4j/pax/cdi/extension/impl/component/ComponentLifecycleManager.java @@ -18,6 +18,7 @@ package org.ops4j.pax.cdi.extension.impl.component; +import java.lang.annotation.Annotation; import java.lang.reflect.Type; import java.util.Arrays; import java.util.Collection; @@ -26,7 +27,6 @@ import java.util.Set; import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.inject.spi.AnnotatedType; import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.BeanManager; import javax.enterprise.inject.spi.InjectionPoint; @@ -175,22 +175,33 @@ private void registerService(Bean bean, S service, ComponentDescriptor de return; } - Class klass = bean.getBeanClass(); - AnnotatedType annotatedType = beanManager.createAnnotatedType(klass); - OsgiServiceProvider provider = annotatedType.getAnnotation(OsgiServiceProvider.class); + OsgiServiceProvider provider = find(OsgiServiceProvider.class, bean.getQualifiers()); - String[] typeNames; - if (provider.classes().length == 0) { - typeNames = getTypeNamesForBeanTypes(bean); - } - else { - typeNames = getTypeNamesForClasses(provider.classes()); + if (provider != null) { + String[] typeNames; + if (provider.classes().length == 0) { + typeNames = getTypeNamesForBeanTypes(bean); + } + else { + typeNames = getTypeNamesForClasses(provider.classes()); + } + + // todo: This will not fetch the properties correctly for a producer method + Properties properties = bean.getBeanClass().getAnnotation(Properties.class); + Dictionary props = createProperties(properties); + log.debug("publishing service {}, props = {}", typeNames[0], props); + ServiceRegistration reg = bundleContext.registerService(typeNames, service, props); + descriptor.setServiceRegistration(reg); } + } - Dictionary props = createProperties(klass, service); - log.debug("publishing service {}, props = {}", typeNames[0], props); - ServiceRegistration reg = bundleContext.registerService(typeNames, service, props); - descriptor.setServiceRegistration(reg); + private T find(Class annotationType, Iterable qualifiers) { + for (Annotation qualifier : qualifiers ) { + if (annotationType.isInstance(qualifier)) { + return (T) qualifier; + } + } + return null; } private void unregisterService(Bean bean, Object service, @@ -231,8 +242,7 @@ private String[] getTypeNamesForClasses(Class[] classes) { return typeNames; } - private Dictionary createProperties(Class klass, Object service) { - Properties props = klass.getAnnotation(Properties.class); + private Dictionary createProperties(Properties props) { if (props == null) { return null; } diff --git a/pax-cdi-samples/pax-cdi-sample-osgi-provider-producer-method/pom.xml b/pax-cdi-samples/pax-cdi-sample-osgi-provider-producer-method/pom.xml new file mode 100644 index 00000000..56006206 --- /dev/null +++ b/pax-cdi-samples/pax-cdi-sample-osgi-provider-producer-method/pom.xml @@ -0,0 +1,61 @@ + + + + pax-cdi-samples + org.ops4j.pax.cdi + 0.13.0-SNAPSHOT + + 4.0.0 + + org.ops4j.pax.cdi.samples + pax-cdi-sample-osgi-provider-producer-method + bundle + + OPS4J Pax CDI Sample - OSGi Provider Producer Method + + + + org.ops4j.pax.cdi + pax-cdi-api + ${project.version} + + + org.apache.geronimo.specs + geronimo-jcdi_1.0_spec + + + + + + + org.apache.felix + maven-bundle-plugin + + + org.ops4j.pax.cdi.sample.osgi-provider-producer-method + + org.ops4j.pax.cdi.extension; filter:="(&(extension=pax-cdi-extension)(version>=${version;==;${pax.cdi.osgi.version.clean}})(!(version>=${version;=+;${pax.cdi.osgi.version.clean}})))", + osgi.extender; filter:="(osgi.extender=pax.cdi)" + + + + + + versions + validate + + cleanVersions + + + + ${project.version} + + + + + + + + \ No newline at end of file diff --git a/pax-cdi-samples/pax-cdi-sample-osgi-provider-producer-method/src/main/java/sample/osgiProviderProducerMethod/Beans.java b/pax-cdi-samples/pax-cdi-sample-osgi-provider-producer-method/src/main/java/sample/osgiProviderProducerMethod/Beans.java new file mode 100644 index 00000000..159418ff --- /dev/null +++ b/pax-cdi-samples/pax-cdi-sample-osgi-provider-producer-method/src/main/java/sample/osgiProviderProducerMethod/Beans.java @@ -0,0 +1,22 @@ +package sample.osgiProviderProducerMethod; + + +import org.ops4j.pax.cdi.api.OsgiServiceProvider; +import org.ops4j.pax.cdi.api.SingletonScoped; + +import javax.enterprise.inject.Produces; + + +/** + * @author mwinkels + * @since Jul 25, 2016 + */ +public class Beans { + + @Produces + @OsgiServiceProvider + @SingletonScoped + public Greeter greeter() { + return new EnglishGreeter(); + } +} diff --git a/pax-cdi-samples/pax-cdi-sample-osgi-provider-producer-method/src/main/java/sample/osgiProviderProducerMethod/EnglishGreeter.java b/pax-cdi-samples/pax-cdi-sample-osgi-provider-producer-method/src/main/java/sample/osgiProviderProducerMethod/EnglishGreeter.java new file mode 100644 index 00000000..7dd2e6bc --- /dev/null +++ b/pax-cdi-samples/pax-cdi-sample-osgi-provider-producer-method/src/main/java/sample/osgiProviderProducerMethod/EnglishGreeter.java @@ -0,0 +1,31 @@ +/* + * Copyright 2013 Harald Wellmann + * + * Licensed 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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 sample.osgiProviderProducerMethod; + +/** + * @author mwinkels + * @since Jul 25, 2016 + */ +public class EnglishGreeter implements Greeter { + + @Override + public String sayHello() { + return "Hello!"; + } +} diff --git a/pax-cdi-samples/pax-cdi-sample-osgi-provider-producer-method/src/main/java/sample/osgiProviderProducerMethod/Greeter.java b/pax-cdi-samples/pax-cdi-sample-osgi-provider-producer-method/src/main/java/sample/osgiProviderProducerMethod/Greeter.java new file mode 100644 index 00000000..800033f4 --- /dev/null +++ b/pax-cdi-samples/pax-cdi-sample-osgi-provider-producer-method/src/main/java/sample/osgiProviderProducerMethod/Greeter.java @@ -0,0 +1,28 @@ +/* + * Copyright 2013 Harald Wellmann + * + * Licensed 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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 sample.osgiProviderProducerMethod; + + +/** + * @author mwinkels + * @since Jul 25, 2016 + */ +public interface Greeter { + String sayHello(); +} diff --git a/pax-cdi-samples/pom.xml b/pax-cdi-samples/pom.xml index 5e6f6d2e..f0f4214e 100644 --- a/pax-cdi-samples/pom.xml +++ b/pax-cdi-samples/pom.xml @@ -24,6 +24,7 @@ pax-cdi-sample5-client1 pax-cdi-sample5-client2 pax-cdi-sample6 + pax-cdi-sample-osgi-provider-producer-method \ No newline at end of file