FELIX-5177: Added support for configuration proxy on @FactoryConfigurationAdapterService annotation:
if a factoryPidClass is specified when declaring the annotation, then it will be also used as the configuration proxy.
Also adapted the dictionary.annot sample code.
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1729675 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/dependencymanager/org.apache.felix.dependencymanager.annotation/src/org/apache/felix/dm/annotation/plugin/bnd/AnnotationCollector.java b/dependencymanager/org.apache.felix.dependencymanager.annotation/src/org/apache/felix/dm/annotation/plugin/bnd/AnnotationCollector.java
index 0900506..5a9497f 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.annotation/src/org/apache/felix/dm/annotation/plugin/bnd/AnnotationCollector.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.annotation/src/org/apache/felix/dm/annotation/plugin/bnd/AnnotationCollector.java
@@ -921,6 +921,12 @@
// factory pid attribute (can be specified using the factoryPid attribute, or using the factoryPidClass attribute)
String factoryPidClass = parseClassAttrValue(annotation.get(EntryParam.factoryPidClass.toString()));
+
+ // If a factory pid class is specified, consider it as a possible candidate for a configuration proxy.
+ if (factoryPidClass != null) {
+ writer.put(EntryParam.confProxyType, factoryPidClass);
+ }
+
String factoryPid = factoryPidClass != null ? factoryPidClass : get(annotation, EntryParam.factoryPid.toString(), m_className);
writer.put(EntryParam.factoryPid, factoryPid);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.runtime/src/org/apache/felix/dm/runtime/FactoryConfigurationAdapterServiceBuilder.java b/dependencymanager/org.apache.felix.dependencymanager.runtime/src/org/apache/felix/dm/runtime/FactoryConfigurationAdapterServiceBuilder.java
index 0f4eb09..9f13923 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.runtime/src/org/apache/felix/dm/runtime/FactoryConfigurationAdapterServiceBuilder.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.runtime/src/org/apache/felix/dm/runtime/FactoryConfigurationAdapterServiceBuilder.java
@@ -51,9 +51,23 @@
String[] provides = srvMeta.getStrings(Params.provides, null);
Dictionary<String, Object> properties = srvMeta.getDictionary(Params.properties, null);
boolean propagate = "true".equals(srvMeta.getString(Params.propagate, "false"));
- Component c = dm.createFactoryConfigurationAdapterService(factoryPid, updated, propagate);
+ String configProxyClassName = srvMeta.getString(Params.confProxyType, null);
+ Component c = null;
+
+ if (configProxyClassName != null)
+ {
+ Class<?> configProxyClass = b.loadClass(configProxyClassName);
+ c = dm.createFactoryConfigurationAdapterService(factoryPid, updated, propagate, configProxyClass);
+ }
+ else
+ {
+ c = dm.createFactoryConfigurationAdapterService(factoryPid, updated, propagate);
+ }
+
c.setInterface(provides, properties);
String factoryMethod = srvMeta.getString(Params.factoryMethod, null);
+
+
if (factoryMethod == null)
{
c.setImplementation(implClass);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.samples/src/org/apache/felix/dependencymanager/samples/dictionary/annot/DictionaryImpl.java b/dependencymanager/org.apache.felix.dependencymanager.samples/src/org/apache/felix/dependencymanager/samples/dictionary/annot/DictionaryImpl.java
index 995b9ea..019576c 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.samples/src/org/apache/felix/dependencymanager/samples/dictionary/annot/DictionaryImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.samples/src/org/apache/felix/dependencymanager/samples/dictionary/annot/DictionaryImpl.java
@@ -18,7 +18,6 @@
*/
package org.apache.felix.dependencymanager.samples.dictionary.annot;
-import java.util.Dictionary;
import java.util.concurrent.CopyOnWriteArrayList;
import org.apache.felix.dm.annotation.api.FactoryConfigurationAdapterService;
@@ -26,8 +25,6 @@
import org.apache.felix.dm.annotation.api.Start;
import org.osgi.service.log.LogService;
-import aQute.bnd.annotation.metatype.Configurable;
-
/**
* A Dictionary Service. This service uses a FactoryConfigurationAdapterService annotation,
* allowing to instantiate this service from webconsole. This annotation will actually register
@@ -62,16 +59,11 @@
* Our service will be initialized from ConfigAdmin.
* @param config The configuration where we'll lookup our words list (key=".words").
*/
- protected void updated(Dictionary<String, ?> config) {
- if (config != null) {
- // We use the bnd "Configurable" helper in order to get an implementation for our DictionaryConfiguration interface.
- DictionaryConfiguration cnf = Configurable.createConfigurable(DictionaryConfiguration.class, config);
-
- m_lang = cnf.lang();
- m_words.clear();
- for (String word : cnf.words()) {
- m_words.add(word);
- }
+ protected void updated(DictionaryConfiguration cnf) {
+ m_lang = cnf.lang();
+ m_words.clear();
+ for (String word : cnf.words()) {
+ m_words.add(word);
}
}