You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kw...@apache.org on 2016/01/15 16:46:55 UTC

svn commit: r1724843 - in /qpid/java/trunk/broker-core/src: main/java/org/apache/qpid/server/model/ test/java/org/apache/qpid/server/model/testmodels/singleton/

Author: kwall
Date: Fri Jan 15 15:46:55 2016
New Revision: 1724843

URL: http://svn.apache.org/viewvc?rev=1724843&view=rev
Log:
QPID-6996: Add tmp model feature that allows a attribute update to proceed even if its value is unchanged

The role attribute is special in that its local view get update sponantenously when an election occurs
in the group.  We need a special model feature to allow an attribute update to proceed even if the model
believes the value already has the desired value.

Modified:
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredAutomatedAttribute.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredDerivedAttribute.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectAttribute.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/AbstractConfiguredObjectTest.java

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java?rev=1724843&r1=1724842&r2=1724843&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java Fri Jan 15 15:46:55 2016
@@ -1685,18 +1685,21 @@ public abstract class AbstractConfigured
         });
     }
 
-
     protected boolean changeAttribute(final String name, final Object expected, final Object desired)
     {
         synchronized (_attributes)
         {
             Object currentValue = getAttribute(name);
-            if((currentValue == null && expected == null)
-               || (currentValue != null && currentValue.equals(expected)))
+            Object actualValue = _attributes.get(name);
+
+            ConfiguredObjectAttribute<?,?> attr = _attributeTypes.get(name);
+
+            if(attr.updateAttributeDespiteUnchangedValue() ||
+               (((currentValue == null && expected == null) || (currentValue != null && currentValue.equals(expected))) &&
+                ((actualValue != null && !actualValue.equals(desired)) || (actualValue == null && desired != null))))
             {
                 //TODO: don't put nulls
                 _attributes.put(name, desired);
-                ConfiguredObjectAttribute<?,?> attr = _attributeTypes.get(name);
                 if(attr != null && attr.isAutomated())
                 {
                     automatedSetValue(name, desired);
@@ -2504,10 +2507,7 @@ public abstract class AbstractConfigured
                 {
                     Object desired = entry.getValue();
                     Object expected = getAttribute(attributeName);
-                    Object currentValue = _attributes.get(attributeName);
-                    if (((currentValue != null && !currentValue.equals(desired))
-                         || (currentValue == null && desired != null))
-                        && changeAttribute(attributeName, expected, desired))
+                    if (changeAttribute(attributeName, expected, desired))
                     {
                         attributeSet(attributeName, expected, desired);
                     }

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredAutomatedAttribute.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredAutomatedAttribute.java?rev=1724843&r1=1724842&r2=1724843&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredAutomatedAttribute.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredAutomatedAttribute.java Fri Jan 15 15:46:55 2016
@@ -148,6 +148,12 @@ public class ConfiguredAutomatedAttribut
     }
 
     @Override
+    public boolean updateAttributeDespiteUnchangedValue()
+    {
+        return _annotation.updateAttributeDespiteUnchangedValue();
+    }
+
+    @Override
     public String getOversizedAltText()
     {
         return _annotation.oversizedAltText();

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredDerivedAttribute.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredDerivedAttribute.java?rev=1724843&r1=1724842&r2=1724843&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredDerivedAttribute.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredDerivedAttribute.java Fri Jan 15 15:46:55 2016
@@ -73,6 +73,12 @@ public class ConfiguredDerivedAttribute<
     }
 
     @Override
+    public boolean updateAttributeDespiteUnchangedValue()
+    {
+        return false;
+    }
+
+    @Override
     public String getOversizedAltText()
     {
         return "";

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectAttribute.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectAttribute.java?rev=1724843&r1=1724842&r2=1724843&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectAttribute.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectAttribute.java Fri Jan 15 15:46:55 2016
@@ -46,6 +46,8 @@ public abstract class ConfiguredObjectAt
 
     public abstract boolean isOversized();
 
+    public abstract boolean updateAttributeDespiteUnchangedValue();
+
     public abstract String getOversizedAltText();
 
     public abstract String getDescription();

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java?rev=1724843&r1=1724842&r2=1724843&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java Fri Jan 15 15:46:55 2016
@@ -41,4 +41,5 @@ public @interface ManagedAttribute
     /** If true, the model attribute value cannot be mutated after construction. */
     boolean immutable() default false;
 
+    boolean updateAttributeDespiteUnchangedValue() default false;
 }

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/AbstractConfiguredObjectTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/AbstractConfiguredObjectTest.java?rev=1724843&r1=1724842&r2=1724843&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/AbstractConfiguredObjectTest.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/AbstractConfiguredObjectTest.java Fri Jan 15 15:46:55 2016
@@ -597,7 +597,7 @@ public class AbstractConfiguredObjectTes
         assertEquals(originalType, object.getType());
     }
 
-    public void testAttributeSetListenerFiring()
+    public void testSetAttributesFiresListener()
     {
         final String objectName = "listenerFiring";
 
@@ -651,6 +651,55 @@ public class AbstractConfiguredObjectTes
         assertEquals("null=>third", delta);
     }
 
+    public void testSetAttributesInterpolateValues()
+    {
+        setTestSystemProperty("foo1", "myValue1");
+        setTestSystemProperty("foo2", "myValue2");
+        setTestSystemProperty("foo3", null);
+
+        Map<String, Object> attributes = new HashMap<>();
+        attributes.put(ConfiguredObject.NAME, getTestName());
+        attributes.put(TestSingleton.STRING_VALUE, "${foo1}");
+
+        final TestSingleton object = _model.getObjectFactory().create(TestSingleton.class, attributes);
+
+        final AtomicInteger listenerCount = new AtomicInteger();
+        object.addChangeListener(new NoopConfigurationChangeListener()
+        {
+            @Override
+            public void attributeSet(final ConfiguredObject<?> object,
+                                     final String attributeName,
+                                     final Object oldAttributeValue,
+                                     final Object newAttributeValue)
+            {
+                listenerCount.incrementAndGet();
+            }
+        });
+
+        assertEquals("myValue1", object.getStringValue());
+        assertEquals("${foo1}", object.getActualAttributes().get(TestSingleton.STRING_VALUE));
+
+        // Update the actual value ${foo1} => ${foo2}
+        object.setAttributes(Collections.singletonMap(TestSingleton.STRING_VALUE, "${foo2}"));
+        assertEquals(1, listenerCount.get());
+
+        assertEquals("myValue2", object.getStringValue());
+        assertEquals("${foo2}", object.getActualAttributes().get(TestSingleton.STRING_VALUE));
+
+        // No change
+        object.setAttributes(Collections.singletonMap(TestSingleton.STRING_VALUE, "${foo2}"));
+        assertEquals(1, listenerCount.get());
+
+        // Update the actual value ${foo2} => ${foo3} (which doesn't have a value)
+        object.setAttributes(Collections.singletonMap(TestSingleton.STRING_VALUE, "${foo3}"));
+        // TODO KW - I would expect this to be equivilent to the above, but it is not because setAttribute wants the
+        // effective value as the expected.
+        //object.setAttribute(TestSingleton.STRING_VALUE, "${foo2}", "${foo3}");
+        assertEquals(2, listenerCount.get());
+        assertEquals("${foo3}", object.getStringValue());
+        assertEquals("${foo3}", object.getActualAttributes().get(TestSingleton.STRING_VALUE));
+    }
+
     private static class NoopConfigurationChangeListener implements ConfigurationChangeListener
     {
         @Override



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