Author: kwall
Date: Tue Feb 24 13:34:32 2015
New Revision: 1661944

URL: http://svn.apache.org/r1661944
Log:
QPID-6406: [Java Broker] ACO generates attribute set events even if the 
attribute value is not changed

Merged from trunk with command:

svn merge -c 1661531  https://svn.apache.org/repos/asf/qpid/trunk


Modified:
    qpid/branches/0.32/   (props changed)
    qpid/branches/0.32/qpid/   (props changed)
    qpid/branches/0.32/qpid/java/   (props changed)
    
qpid/branches/0.32/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
    
qpid/branches/0.32/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/AbstractConfiguredObjectTest.java

Propchange: qpid/branches/0.32/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Feb 24 13:34:32 2015
@@ -3,4 +3,4 @@
 /qpid/branches/java-broker-bdb-ha2:1576683-1583556
 /qpid/branches/java-network-refactor:805429-825319
 /qpid/branches/mcpierce-QPID-4719:1477004-1477093
-/qpid/trunk:1661162,1661165-1661166,1661207,1661530
+/qpid/trunk:1661162,1661165-1661166,1661207,1661530-1661531

Propchange: qpid/branches/0.32/qpid/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Feb 24 13:34:32 2015
@@ -6,4 +6,4 @@
 /qpid/branches/mcpierce-QPID-4719/qpid:1477004-1477093
 /qpid/branches/qpid-2935/qpid:1061302-1072333
 /qpid/branches/qpid-3346/qpid:1144319-1179855
-/qpid/trunk/qpid:1661079,1661142,1661162,1661165-1661166,1661207,1661212,1661364,1661368,1661373,1661530
+/qpid/trunk/qpid:1661079,1661142,1661162,1661165-1661166,1661207,1661212,1661364,1661368,1661373,1661530-1661531

Propchange: qpid/branches/0.32/qpid/java/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Feb 24 13:34:32 2015
@@ -9,4 +9,4 @@
 /qpid/branches/java-network-refactor/qpid/java:805429-821809
 /qpid/branches/qpid-2935/qpid/java:1061302-1072333
 /qpid/trunk/qpid:796646-796653
-/qpid/trunk/qpid/java:1661079,1661142,1661162,1661165-1661166,1661207,1661212,1661364,1661368,1661373,1661530
+/qpid/trunk/qpid/java:1661079,1661142,1661162,1661165-1661166,1661207,1661212,1661364,1661368,1661373,1661530-1661531

Modified: 
qpid/branches/0.32/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
URL: 
http://svn.apache.org/viewvc/qpid/branches/0.32/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java?rev=1661944&r1=1661943&r2=1661944&view=diff
==============================================================================
--- 
qpid/branches/0.32/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
 (original)
+++ 
qpid/branches/0.32/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
 Tue Feb 24 13:34:32 2015
@@ -1536,8 +1536,9 @@ public abstract class AbstractConfigured
             {
                 Object desired = attributes.get(name);
                 Object expected = getAttribute(name);
-                if(((_attributes.get(name) != null && 
!_attributes.get(name).equals(attributes.get(name)))
-                     || attributes.get(name) != null)
+                Object currentValue = _attributes.get(name);
+                if(((currentValue != null && !currentValue.equals(desired))
+                     || (currentValue == null && desired != null))
                     && changeAttribute(name, expected, desired))
                 {
                     attributeSet(name, expected, desired);

Modified: 
qpid/branches/0.32/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/AbstractConfiguredObjectTest.java
URL: 
http://svn.apache.org/viewvc/qpid/branches/0.32/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/AbstractConfiguredObjectTest.java?rev=1661944&r1=1661943&r2=1661944&view=diff
==============================================================================
--- 
qpid/branches/0.32/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/AbstractConfiguredObjectTest.java
 (original)
+++ 
qpid/branches/0.32/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/AbstractConfiguredObjectTest.java
 Tue Feb 24 13:34:32 2015
@@ -22,14 +22,18 @@ import java.security.PrivilegedAction;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import javax.security.auth.Subject;
 
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
 import org.apache.qpid.server.model.AbstractConfiguredObject;
+import org.apache.qpid.server.model.ConfigurationChangeListener;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.Model;
+import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.store.ConfiguredObjectRecord;
 import org.apache.qpid.test.utils.QpidTestCase;
 
@@ -476,4 +480,84 @@ public class AbstractConfiguredObjectTes
 
 
     }
+
+    public void testAttributeSetListenerFiring()
+    {
+        final String objectName = "listenerFiring";
+
+        Map<String, Object> attributes = new HashMap<>();
+        attributes.put(ConfiguredObject.NAME, objectName);
+        attributes.put(TestSingleton.STRING_VALUE, "first");
+
+        final TestSingleton object = 
_model.getObjectFactory().create(TestSingleton.class, attributes);
+
+        final AtomicInteger listenerCount = new AtomicInteger();
+        final LinkedHashMap<String, String> updates = new LinkedHashMap<>();
+        object.addChangeListener(new NoopConfigurationChangeListener()
+        {
+            @Override
+            public void attributeSet(final ConfiguredObject<?> object,
+                                     final String attributeName,
+                                     final Object oldAttributeValue,
+                                     final Object newAttributeValue)
+            {
+                listenerCount.incrementAndGet();
+                String delta = String.valueOf(oldAttributeValue) + "=>" + 
String.valueOf(newAttributeValue);
+                updates.put(attributeName, delta);
+            }
+        });
+
+        // Set updated value (should cause listener to fire)
+        
object.setAttributes(Collections.singletonMap(TestSingleton.STRING_VALUE, 
"second"));
+
+        assertEquals(1, listenerCount.get());
+        String delta = updates.remove(TestSingleton.STRING_VALUE);
+        assertEquals("first=>second", delta);
+
+        // Set unchanged value (should not cause listener to fire)
+        
object.setAttributes(Collections.singletonMap(TestSingleton.STRING_VALUE, 
"second"));
+        assertEquals(1, listenerCount.get());
+
+        // Set value to null (should cause listener to fire)
+        
object.setAttributes(Collections.singletonMap(TestSingleton.STRING_VALUE, 
null));
+        assertEquals(2, listenerCount.get());
+        delta = updates.remove(TestSingleton.STRING_VALUE);
+        assertEquals("second=>null", delta);
+
+        // Set to null again (should not cause listener to fire)
+        
object.setAttributes(Collections.singletonMap(TestSingleton.STRING_VALUE, 
null));
+        assertEquals(2, listenerCount.get());
+
+        // Set updated value (should cause listener to fire)
+        
object.setAttributes(Collections.singletonMap(TestSingleton.STRING_VALUE, 
"third"));
+        assertEquals(3, listenerCount.get());
+        delta = updates.remove(TestSingleton.STRING_VALUE);
+        assertEquals("null=>third", delta);
+    }
+
+    private static class NoopConfigurationChangeListener implements 
ConfigurationChangeListener
+    {
+        @Override
+        public void stateChanged(final ConfiguredObject<?> object, final State 
oldState, final State newState)
+        {
+        }
+
+        @Override
+        public void childAdded(final ConfiguredObject<?> object, final 
ConfiguredObject<?> child)
+        {
+        }
+
+        @Override
+        public void childRemoved(final ConfiguredObject<?> object, final 
ConfiguredObject<?> child)
+        {
+        }
+
+        @Override
+        public void attributeSet(final ConfiguredObject<?> object,
+                                 final String attributeName,
+                                 final Object oldAttributeValue,
+                                 final Object newAttributeValue)
+        {
+        }
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org
For additional commands, e-mail: commits-h...@qpid.apache.org

Reply via email to