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 2015/06/22 00:27:34 UTC

svn commit: r1686759 - in /qpid/java/trunk: broker-core/src/main/java/org/apache/qpid/server/model/ broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/ broker-plugins/management-http/src/main/java/org/apache/qpid/server/managem...

Author: kwall
Date: Sun Jun 21 22:27:33 2015
New Revision: 1686759

URL: http://svn.apache.org/r1686759
Log:
QPID-6603: [Java Broker] Allow model to express attribute immutability.

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/ManagedAttribute.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/AbstractConfiguredObjectTest.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/TestSingleton.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/TestSingletonImpl.java
    qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.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=1686759&r1=1686758&r2=1686759&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 Sun Jun 21 22:27:33 2015
@@ -40,6 +40,7 @@ import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.Callable;
@@ -2236,10 +2237,15 @@ public abstract class AbstractConfigured
             if (attr.isAutomated() && changedAttributes.contains(attr.getName()))
             {
                 ConfiguredAutomatedAttribute autoAttr = (ConfiguredAutomatedAttribute) attr;
+
+                if (autoAttr.isImmutable() && !Objects.equals(autoAttr.getValue(this), autoAttr.getValue(proxyForValidation)))
+                {
+                    throw new IllegalConfigurationException("Attribute '" + autoAttr.getName() + "' cannot be changed.");
+                }
+
                 if (autoAttr.hasValidValues())
                 {
                     Object desiredValue = autoAttr.getValue(proxyForValidation);
-
                     if ((autoAttr.isMandatory() || desiredValue != null)
                         && !checkValidValues(autoAttr, desiredValue))
                     {
@@ -2252,7 +2258,9 @@ public abstract class AbstractConfigured
                     }
                 }
 
+
             }
+
         }
 
     }

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=1686759&r1=1686758&r2=1686759&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 Sun Jun 21 22:27:33 2015
@@ -131,6 +131,11 @@ public class ConfiguredAutomatedAttribut
         return _annotation.mandatory();
     }
 
+    public boolean isImmutable()
+    {
+        return _annotation.immutable();
+    }
+
     public boolean isPersisted()
     {
         return _annotation.persist();

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=1686759&r1=1686758&r2=1686759&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 Sun Jun 21 22:27:33 2015
@@ -38,4 +38,7 @@ public @interface ManagedAttribute
     boolean oversize() default false;
     String oversizedAltText() default "";
     String secureValueFilter() default "";
+    /** If true, the model attribute value cannot be mutated after construction. */
+    boolean immutable() 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=1686759&r1=1686758&r2=1686759&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 Sun Jun 21 22:27:33 2015
@@ -499,6 +499,71 @@ public class AbstractConfiguredObjectTes
 
     }
 
+    public void testImmutableAttribute()
+    {
+        final String value = "myvalue";
+
+        Map<String, Object> attributes = new HashMap<>();
+        attributes.put(ConfiguredObject.NAME, "myName");
+        attributes.put(TestSingleton.IMMUTABLE_VALUE, value);
+
+        final TestSingleton object = _model.getObjectFactory().create(TestSingleton.class, attributes);
+
+        assertEquals(value, object.getImmutableValue());
+
+        // Update to the same value is allowed
+        object.setAttributes(Collections.singletonMap(TestSingleton.IMMUTABLE_VALUE, value));
+
+        try
+        {
+            object.setAttributes(Collections.singletonMap(TestSingleton.IMMUTABLE_VALUE, "newvalue"));
+            fail("Exception not thrown");
+        }
+        catch(IllegalConfigurationException e)
+        {
+            // PASS
+        }
+        assertEquals(value, object.getImmutableValue());
+
+        try
+        {
+            object.setAttributes(Collections.singletonMap(TestSingleton.IMMUTABLE_VALUE, null));
+            fail("Exception not thrown");
+        }
+        catch(IllegalConfigurationException e)
+        {
+            // PASS
+        }
+
+        assertEquals(value, object.getImmutableValue());
+    }
+
+    public void testImmutableAttributeNullValue()
+    {
+
+        Map<String, Object> attributes = new HashMap<>();
+        attributes.put(ConfiguredObject.NAME, "myName");
+        attributes.put(TestSingleton.IMMUTABLE_VALUE, null);
+
+        final TestSingleton object = _model.getObjectFactory().create(TestSingleton.class, attributes);
+
+        assertNull(object.getImmutableValue());
+
+        // Update to the same value is allowed
+        object.setAttributes(Collections.singletonMap(TestSingleton.IMMUTABLE_VALUE, null));
+
+        try
+        {
+            object.setAttributes(Collections.singletonMap(TestSingleton.IMMUTABLE_VALUE, "newvalue"));
+            fail("Exception not thrown");
+        }
+        catch(IllegalConfigurationException e)
+        {
+            // PASS
+        }
+        assertNull(object.getImmutableValue());
+    }
+
     public void testAttributeSetListenerFiring()
     {
         final String objectName = "listenerFiring";

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/TestSingleton.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/TestSingleton.java?rev=1686759&r1=1686758&r2=1686759&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/TestSingleton.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/TestSingleton.java Sun Jun 21 22:27:33 2015
@@ -41,6 +41,7 @@ public interface TestSingleton<X extends
     String VALID_VALUE = "validValue";
     String SECURE_VALUE = "secureValue";
     String ENUMSET_VALUES = "enumSetValues";
+    String IMMUTABLE_VALUE = "immutableValue";
 
     String TEST_CONTEXT_DEFAULT = "TEST_CONTEXT_DEFAULT";
     @ManagedContextDefault(name = TEST_CONTEXT_DEFAULT)
@@ -87,4 +88,7 @@ public interface TestSingleton<X extends
     @ManagedAttribute(secure = true)
     String getSecureValue();
 
+    @ManagedAttribute(immutable = true)
+    String getImmutableValue();
+
 }

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/TestSingletonImpl.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/TestSingletonImpl.java?rev=1686759&r1=1686758&r2=1686759&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/TestSingletonImpl.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/TestSingletonImpl.java Sun Jun 21 22:27:33 2015
@@ -69,6 +69,8 @@ public class TestSingletonImpl extends A
     @ManagedAttributeField
     private String _secureValue;
 
+    @ManagedAttributeField
+    private String _immutableValue;
 
     @ManagedObjectFactoryConstructor
     public TestSingletonImpl(final Map<String, Object> attributes)
@@ -159,6 +161,12 @@ public class TestSingletonImpl extends A
     }
 
     @Override
+    public String getImmutableValue()
+    {
+        return _immutableValue;
+    }
+
+    @Override
     protected SecurityManager getSecurityManager()
     {
         return _securityManager;

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java?rev=1686759&r1=1686758&r2=1686759&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java Sun Jun 21 22:27:33 2015
@@ -165,15 +165,20 @@ public class MetaDataServlet extends Abs
             }
             if(attribute.isAutomated())
             {
-                if(!"".equals(((ConfiguredAutomatedAttribute)attribute).defaultValue()))
+                ConfiguredAutomatedAttribute automatedAttribute = (ConfiguredAutomatedAttribute) attribute;
+                if(!"".equals(automatedAttribute.defaultValue()))
                 {
-                    attrDetails.put("defaultValue",((ConfiguredAutomatedAttribute)attribute).defaultValue());
+                    attrDetails.put("defaultValue", automatedAttribute.defaultValue());
                 }
-                if(((ConfiguredAutomatedAttribute)attribute).isMandatory())
+                if(automatedAttribute.isMandatory())
                 {
-                    attrDetails.put("mandatory",((ConfiguredAutomatedAttribute)attribute).isMandatory());
+                    attrDetails.put("mandatory", automatedAttribute.isMandatory());
                 }
-                if(!(((ConfiguredAutomatedAttribute)attribute).validValues()).isEmpty())
+                if(automatedAttribute.isImmutable())
+                {
+                    attrDetails.put("immutable", automatedAttribute.isImmutable());
+                }
+                if(!(automatedAttribute.validValues()).isEmpty())
                 {
                     Collection<String> validValues = ((ConfiguredAutomatedAttribute<?,?>) attribute).validValues();
 



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