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