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;