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: [email protected]
For additional commands, e-mail: [email protected]