You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by dj...@apache.org on 2015/09/21 07:18:21 UTC

svn commit: r1704219 - in /felix/trunk/scr: ./ src/main/java/org/apache/felix/scr/impl/manager/ src/test/java/org/apache/felix/scr/impl/manager/ src/test/java/org/apache/felix/scr/integration/ src/test/resources/

Author: djencks
Date: Mon Sep 21 05:18:13 2015
New Revision: 1704219

URL: http://svn.apache.org/viewvc?rev=1704219&view=rev
Log:
FELIX-5044 make sure property changes during service registration eventually get shown

Modified:
    felix/trunk/scr/changelog.txt
    felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
    felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java
    felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/RegistrationManager.java
    felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java
    felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java
    felix/trunk/scr/src/test/java/org/apache/felix/scr/impl/manager/RegistrationManagerTest.java
    felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/MutablePropertiesTest.java
    felix/trunk/scr/src/test/resources/integration_test_mutable_properties.xml

Modified: felix/trunk/scr/changelog.txt
URL: http://svn.apache.org/viewvc/felix/trunk/scr/changelog.txt?rev=1704219&r1=1704218&r2=1704219&view=diff
==============================================================================
--- felix/trunk/scr/changelog.txt (original)
+++ felix/trunk/scr/changelog.txt Mon Sep 21 05:18:13 2015
@@ -1,9 +1,10 @@
 Changes from 2.0.2 to 2.0.4
 ---------------------------
 ** Improvement
-    * [FELIX-5040] When global extender is turned on, get framwork bundle using location not id.
+    * [FELIX-5040] When global extender is turned on, get framework bundle using location not id.
 
 ** Bug
+    * [FELIX-5044] (felix mutable service properties) Make sure service property changes eventually get shown.
 
 
 Changes from 2.0.0 to 2.0.2

Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java?rev=1704219&r1=1704218&r2=1704219&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java Mon Sep 21 05:18:13 2015
@@ -878,6 +878,12 @@ public abstract class AbstractComponentM
         }
 
         @Override
+        void postRegister(ServiceRegistration<S> t)
+        {
+            AbstractComponentManager.this.postRegister();
+        }
+
+        @Override
         void unregister(ServiceRegistration<S> serviceRegistration)
         {
             serviceRegistration.unregister();
@@ -1381,6 +1387,8 @@ public abstract class AbstractComponentM
         }
     }
 
+    abstract void postRegister();
+
     boolean isInternalEnabled()
     {
         return m_internalEnabled;

Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java?rev=1704219&r1=1704218&r2=1704219&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java Mon Sep 21 05:18:13 2015
@@ -276,6 +276,11 @@ public class ComponentFactoryImpl<S> ext
         throw new IllegalStateException( "ComponentFactory service properties are immutable" );
     }
 
+    @Override
+    void postRegister()
+    {
+        //do nothing
+    }
 
     public Dictionary<String, Object> getServiceProperties()
     {
@@ -413,5 +418,4 @@ public class ComponentFactoryImpl<S> ext
         }
     }
 
-
 }

Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/RegistrationManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/RegistrationManager.java?rev=1704219&r1=1704218&r2=1704219&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/RegistrationManager.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/RegistrationManager.java Mon Sep 21 05:18:13 2015
@@ -67,15 +67,14 @@ abstract class RegistrationManager<T>
         {
             return regState.toString();
         }
-        
-        
-        
+
     }
     private final Lock registrationLock = new ReentrantLock();
     //Deque, ArrayDeque if we had java 6
     private final List<RegStateWrapper> opqueue = new ArrayList<RegStateWrapper>();
 
     private volatile T m_serviceRegistration;
+
     /**
      * 
      * @param desired desired registration state
@@ -154,6 +153,7 @@ abstract class RegistrationManager<T>
                     if ( next.getRegState() == RegState.registered)
                     {
                         m_serviceRegistration = serviceRegistration;
+                        postRegister( m_serviceRegistration );
                     }
                     next.getLatch().countDown();
                 }
@@ -200,6 +200,8 @@ abstract class RegistrationManager<T>
     
     abstract T register(String[] services);
 
+    abstract void postRegister(T t);
+
     abstract void unregister(T serviceRegistration);
     
     abstract void log( int level, String message, Object[] arguments, Throwable ex );

Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java?rev=1704219&r1=1704218&r2=1704219&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java Mon Sep 21 05:18:13 2015
@@ -21,6 +21,7 @@ package org.apache.felix.scr.impl.manage
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Dictionary;
 import java.util.IdentityHashMap;
 
 import org.apache.felix.scr.impl.config.ComponentContainer;
@@ -42,6 +43,19 @@ import org.osgi.service.log.LogService;
 public class ServiceFactoryComponentManager<S> extends SingleComponentManager<S>
 {
 
+    @Override
+    public void setServiceProperties(Dictionary<String, ?> serviceProperties)
+    {
+        throw new IllegalStateException( "Bundle scoped service properties are immutable" );
+    }
+
+
+    @Override
+    void postRegister()
+    {
+        // do nothing
+    }
+
     // maintain the map of ComponentContext objects created for the
     // service instances
     private IdentityHashMap<S, ComponentContextImpl<S>> serviceContexts = new IdentityHashMap<S, ComponentContextImpl<S>>();

Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java?rev=1704219&r1=1704218&r2=1704219&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java Mon Sep 21 05:18:13 2015
@@ -499,6 +499,15 @@ public class SingleComponentManager<S> e
     }
 
     @Override
+    void postRegister()
+    {
+        if (m_serviceProperties != null)
+        {
+            updateServiceRegistration();
+        }
+    }
+
+    @Override
     public Dictionary<String, Object> getServiceProperties()
     {
         if ( m_serviceProperties != null )
@@ -521,6 +530,10 @@ public class SingleComponentManager<S> e
                 {
                     sr.setProperties( regProps );
                 }
+                else
+                {
+                    log( LogService.LOG_DEBUG, "Not updating service registration, no change in properties", null, null );
+                }
             }
             catch ( IllegalStateException ise )
             {
@@ -536,6 +549,10 @@ public class SingleComponentManager<S> e
                 log( LogService.LOG_ERROR, "Unexpected problem when updating service registration", t );
             }
         }
+        else
+        {
+            log( LogService.LOG_DEBUG, "No service registration to update", null, null );
+        }
     }
 
     /**

Modified: felix/trunk/scr/src/test/java/org/apache/felix/scr/impl/manager/RegistrationManagerTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/java/org/apache/felix/scr/impl/manager/RegistrationManagerTest.java?rev=1704219&r1=1704218&r2=1704219&view=diff
==============================================================================
--- felix/trunk/scr/src/test/java/org/apache/felix/scr/impl/manager/RegistrationManagerTest.java (original)
+++ felix/trunk/scr/src/test/java/org/apache/felix/scr/impl/manager/RegistrationManagerTest.java Mon Sep 21 05:18:13 2015
@@ -91,6 +91,12 @@ public class RegistrationManagerTest
         }
 
         @Override
+        void postRegister(Object t)
+        {
+            // TODO Auto-generated method stub
+        }
+
+        @Override
         void unregister(Object serviceRegistration)
         {
             try
@@ -107,7 +113,7 @@ public class RegistrationManagerTest
         @Override
         void log(int level, String message, Object[] arguments, Throwable ex)
         {
-            if ( arguments.length == 1 && (arguments[0] instanceof ArrayList))
+            if ( arguments != null && arguments.length == 1 && (arguments[0] instanceof ArrayList))
             {
                 ArrayList<RegState> opqueue = ( ArrayList<org.apache.felix.scr.impl.manager.RegistrationManager.RegState> ) arguments[0];
 //                System.out.println("opqueue: " + opqueue);
@@ -140,6 +146,6 @@ public class RegistrationManagerTest
             // TODO Auto-generated method stub
             
         }
-        
+
     }
 }

Modified: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/MutablePropertiesTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/MutablePropertiesTest.java?rev=1704219&r1=1704218&r2=1704219&view=diff
==============================================================================
--- felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/MutablePropertiesTest.java (original)
+++ felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/MutablePropertiesTest.java Mon Sep 21 05:18:13 2015
@@ -28,6 +28,7 @@ import junit.framework.Assert;
 import junit.framework.TestCase;
 
 import org.apache.felix.scr.integration.components.MutatingService;
+import org.apache.felix.scr.integration.components.MutatingServiceConsumer;
 import org.apache.felix.scr.integration.components.SimpleServiceImpl;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -35,6 +36,7 @@ import org.ops4j.pax.exam.junit.JUnit4Te
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.component.runtime.dto.ComponentConfigurationDTO;
+import org.osgi.service.component.runtime.dto.ComponentDescriptionDTO;
 
 
 @RunWith(JUnit4TestRunner.class)
@@ -208,4 +210,26 @@ public class MutablePropertiesTest exten
             Assert.assertFalse("Should not contain property " + p, Arrays.asList(serviceReference.getPropertyKeys()).contains(p));
         }
     }
+
+    @Test
+    public void test_mutable_properties_consumer() throws Exception
+    {
+        ServiceReference<MutatingServiceConsumer> mscRef = bundleContext.getServiceReference(MutatingServiceConsumer.class);
+        MutatingServiceConsumer msc = bundleContext.getService(mscRef);
+        assertMsc(msc, null, null, null);
+
+        String componentName = "components.mutable.properties.return2";
+        ComponentDescriptionDTO cd = findComponentDescriptorByName(componentName);
+
+        enableAndCheck(cd);
+
+        assertMsc(msc, false, true, null);
+    }
+
+    private void assertMsc(MutatingServiceConsumer msc, Boolean set, Boolean updated, Boolean unset)
+    {
+        Assert.assertEquals("set ", set, msc.isUpdatedInSet());
+        Assert.assertEquals("updated ", updated, msc.isUpdatedInUpdated());
+        Assert.assertEquals("unset ", unset, msc.isUpdatedInUnset());
+    }
 }
\ No newline at end of file

Modified: felix/trunk/scr/src/test/resources/integration_test_mutable_properties.xml
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/resources/integration_test_mutable_properties.xml?rev=1704219&r1=1704218&r2=1704219&view=diff
==============================================================================
--- felix/trunk/scr/src/test/resources/integration_test_mutable_properties.xml (original)
+++ felix/trunk/scr/src/test/resources/integration_test_mutable_properties.xml Mon Sep 21 05:18:13 2015
@@ -18,6 +18,7 @@
     under the License.
 -->
 <components>
+
     <scr:component name="components.mutable.properties"
             xmlns:scr="http://felix.apache.org/xmlns/scr/v1.2.0-felix"
             enabled="true"
@@ -94,4 +95,37 @@
         <property name="p1" value="p1"/>
         <property name="p2" value="p2"/>
     </scr:component>
+
+   <scr:component name="components.mutable.properties.return2"
+            xmlns:scr="http://felix.apache.org/xmlns/scr/v1.2.0-felix"
+            enabled="false"
+            configuration-policy="optional"
+            activate="activateMutate"
+            modified="modifiedMutate"
+            deactivate="deactivateMutate">
+        <implementation class="org.apache.felix.scr.integration.components.MutatingServiceImpl" />
+        <service>
+            <provide interface="org.apache.felix.scr.integration.components.MutatingService" />
+        </service>
+    </scr:component>
+
+    <scr:component name="components.mutable.properties.consumer"
+            xmlns:scr="http://www.osgi.org/xmlns/scr/v1.2.0"
+            enabled="true">
+        <implementation class="org.apache.felix.scr.integration.components.MutatingServiceConsumer" />
+        <service>
+            <provide interface="org.apache.felix.scr.integration.components.MutatingServiceConsumer" />
+        </service>
+        <reference
+                name="MutatingService"
+                interface="org.apache.felix.scr.integration.components.MutatingService"
+                cardinality="0..1"
+                policy="dynamic"
+                bind="setMutatingService"
+                unbind="unsetMutatingService"
+                updated="updatedMutatingService"
+                target="(component.name=components.mutable.properties.return2)"
+                />
+    </scr:component>
+
 </components>