Fix FELIX-3374.
Create the propagated properties correctly.
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1326120 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java
index 64475f4..a539984 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java
@@ -549,7 +549,7 @@
if (! alreadyExisting) {
try {
- Property prop = new Property(key, null, null, value.toString(), value.getClass().getName(), getInstanceManager(), m_handler);
+ Property prop = new Property(key, null, null, value, getInstanceManager(), m_handler);
addProperty(prop);
updated = true;
} catch (ConfigurationException e) {
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java
index 084255d..170275a 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java
@@ -518,6 +518,7 @@
*/
public void addProperties(Dictionary dict) {
for (int i = 0; i < m_providedServices.length; i++) {
+ System.out.println("adding properties " + dict);
m_providedServices[i].addProperties(dict);
m_providedServices[i].update();
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Property.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Property.java
index 87d1e9f..13e2282 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Property.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Property.java
@@ -141,6 +141,48 @@
}
}
+ /**
+ * Creates a property.
+ * At least the method or the field need
+ * to be specified.
+ * @param name the name of the property (optional)
+ * @param field the name of the field
+ * @param method the method name
+ * @param value the initial value of the property (optional)
+ * @param manager the instance manager
+ * @param handler the handler object which manage this property.
+ * @throws ConfigurationException if the property value cannot be set.
+ */
+ public Property(String name, String field, String method, Object value, InstanceManager manager, Handler handler) throws ConfigurationException {
+ m_handler = handler;
+ m_manager = manager;
+ m_field = field;
+
+ if (value == null) {
+ throw new ConfigurationException("Cannot create properties without a value");
+ }
+
+ if (name == null) {
+ if (m_field == null) {
+ m_name = method;
+ } else {
+ m_name = field;
+ }
+ } else {
+ m_name = name;
+ }
+
+ m_type = value.getClass();
+ m_value = value;
+ m_defaultValue = m_value;
+
+ if (method != null) {
+ m_method = new Callback(method, new String[] { m_type.getName() }, false, manager);
+ } else {
+ m_method = null;
+ }
+ }
+
public Property(String name, String field, String method, int index,
String value, String type, InstanceManager manager, Handler handler) throws ConfigurationException {
this(name, field, method, value, type, manager, handler);
diff --git a/ipojo/core/src/test/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerTest.java b/ipojo/core/src/test/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerTest.java
index 164f7ec..0034064 100644
--- a/ipojo/core/src/test/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerTest.java
+++ b/ipojo/core/src/test/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerTest.java
@@ -3,9 +3,7 @@
import junit.framework.Assert;
import junit.framework.TestCase;
-import org.apache.felix.ipojo.ComponentFactory;
-import org.apache.felix.ipojo.ConfigurationException;
-import org.apache.felix.ipojo.InstanceManager;
+import org.apache.felix.ipojo.*;
import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
import org.apache.felix.ipojo.handlers.dependency.DependencyHandler;
import org.apache.felix.ipojo.metadata.Attribute;
@@ -16,6 +14,11 @@
import org.mockito.Mockito;
import org.osgi.framework.BundleContext;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Dictionary;
+import java.util.Properties;
+
public class ProvidedServiceHandlerTest extends TestCase {
BundleContext context;
@@ -23,8 +26,9 @@
InstanceManager im;
ComponentTypeDescription desc;
ProvidedServiceHandler handler;
+ Logger logger;
- public void setUp() {
+ public void setUp() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
context = (BundleContext) Mockito.mock(BundleContext.class);
Mockito.when(context.getProperty(DependencyHandler.PROXY_TYPE_PROPERTY)).thenReturn(null);
Mockito.when(context.getProperty(Logger.IPOJO_LOG_LEVEL_PROP)).thenReturn(null);
@@ -32,11 +36,14 @@
factory = (ComponentFactory) Mockito.mock(ComponentFactory.class);
Mockito.when(factory.getBundleClassLoader()).thenReturn(ProvidedServiceHandler.class.getClassLoader());
- Mockito.when(factory.getLogger()).thenReturn(new Logger(context, "TEST", Logger.INFO));
+ logger = Mockito.spy(new Logger(context, "TEST", Logger.INFO));
+ Mockito.when(factory.getLogger()).thenReturn(logger);
im = (InstanceManager) Mockito.mock(InstanceManager.class);
Mockito.when(im.getContext()).thenReturn(context);
+ Mockito.when(im.getGlobalContext()).thenReturn(context);
Mockito.when(im.getFactory()).thenReturn(factory);
+ Mockito.when(im.getInstanceName()).thenReturn("an.instance");
desc = (ComponentTypeDescription) Mockito.mock(ComponentTypeDescription.class);
Mockito.when(desc.getFactory()).thenReturn(factory);
@@ -44,6 +51,12 @@
handler = new ProvidedServiceHandler();
handler.setFactory(factory);
+
+ // Attach the handler
+ Method method = PrimitiveHandler.class.getDeclaredMethod("attach", new Class[]{ComponentInstance.class});
+ method.setAccessible(true);
+ method.invoke(handler, new Object[]{im});
+
}
public void testServiceDetectionNoInterface() throws ConfigurationException {
@@ -130,4 +143,18 @@
}
+ public void testWhenRequiresFilterIsPropagated() throws Exception {
+ Dictionary dictionary = new Properties();
+ Dictionary requiresfilter = new Properties();
+ requiresfilter.put("id1", "(filter1)");
+ dictionary.put("requires.filter", requiresfilter);
+
+
+ ProvidedService providedService = new ProvidedService(handler, new String[] {Runnable.class.getName()}, ProvidedService.SINGLETON_STRATEGY, null, new Properties());
+ Assert.assertEquals(2, providedService.getProperties().length); // instance.name, service.pid
+ providedService.addProperties(dictionary);
+
+ Assert.assertEquals(2 + 1, providedService.getProperties().length);
+ }
+
}
diff --git a/ipojo/core/src/test/java/org/apache/felix/ipojo/test/MockBundle.java b/ipojo/core/src/test/java/org/apache/felix/ipojo/test/MockBundle.java
index 85bc1fc..ddca7e6 100644
--- a/ipojo/core/src/test/java/org/apache/felix/ipojo/test/MockBundle.java
+++ b/ipojo/core/src/test/java/org/apache/felix/ipojo/test/MockBundle.java
@@ -17,7 +17,7 @@
private final ClassLoader m_classloader;
/**
- * @param classloader the Classloader to load classes and resources.
+ * @param cl the Classloader to load classes and resources.
*/
public MockBundle(ClassLoader cl) {
m_classloader = cl;