Author: kwall
Date: Thu Jun 5 13:50:59 2014
New Revision: 1600657
URL: http://svn.apache.org/r1600657
Log:
QPID-5721: [Java Broker] Improve test coverage for default attributes, and
attributes whose values are computed from context variables.
Also fixed defect so that a context attributes are resolved first, so that
other attribute values may be calculated from context variables
set on the same object.
Modified:
qpid/trunk/qpid/java/broker-codegen/src/main/java/org/apache/qpid/server/model/validation/AttributeAnnotationValidator.java
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AttributeValueConverter.java
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/AbstractConfiguredObjectTest.java
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/testmodel/TestRootCategory.java
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/testmodel/TestRootCategoryImpl.java
Modified:
qpid/trunk/qpid/java/broker-codegen/src/main/java/org/apache/qpid/server/model/validation/AttributeAnnotationValidator.java
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-codegen/src/main/java/org/apache/qpid/server/model/validation/AttributeAnnotationValidator.java?rev=1600657&r1=1600656&r2=1600657&view=diff
==============================================================================
---
qpid/trunk/qpid/java/broker-codegen/src/main/java/org/apache/qpid/server/model/validation/AttributeAnnotationValidator.java
(original)
+++
qpid/trunk/qpid/java/broker-codegen/src/main/java/org/apache/qpid/server/model/validation/AttributeAnnotationValidator.java
Thu Jun 5 13:50:59 2014
@@ -310,6 +310,10 @@ public class AttributeAnnotationValidato
if(typeUtils.isSameType(erasedType, getErasure("java.util.Map")))
{
List<? extends TypeMirror> args = ((DeclaredType)
type).getTypeArguments();
+ if (args.size() != 2)
+ {
+ throw new IllegalArgumentException("Map types " + type + "
must have exactly two type arguments");
+ }
return isValidType(args.get(0)) && (isValidType(args.get(1)) ||
typeUtils.isSameType(args.get(1), getErasure("java.lang.Object")));
}
Modified:
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java?rev=1600657&r1=1600656&r2=1600657&view=diff
==============================================================================
---
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
(original)
+++
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
Thu Jun 5 13:50:59 2014
@@ -586,25 +586,36 @@ public abstract class AbstractConfigured
protected void onResolve()
{
+ // If there is a context attribute, resolve it first, so that other
attribute values
+ // may support values containing references to context keys.
+ ConfiguredObjectAttribute<?, ?> contextAttribute =
_attributeTypes.get("context");
+ if (contextAttribute != null && contextAttribute.isAutomated())
+ {
+ resolveAutomatedAttribute((ConfiguredAutomatedAttribute<?, ?>)
contextAttribute);
+ }
+
for (ConfiguredObjectAttribute<?, ?> attr : _attributeTypes.values())
{
- String attrName = attr.getName();
- if (attr.isAutomated())
+ if (attr != contextAttribute && attr.isAutomated())
{
- ConfiguredAutomatedAttribute<?,?> autoAttr =
(ConfiguredAutomatedAttribute<?,?>)attr;
- if (_attributes.containsKey(attrName))
- {
- automatedSetValue(attrName, _attributes.get(attrName));
- }
- else if (!"".equals(autoAttr.defaultValue()))
- {
- automatedSetValue(attrName, autoAttr.defaultValue());
- }
-
+ resolveAutomatedAttribute((ConfiguredAutomatedAttribute<?, ?>)
attr);
}
}
}
+ private void resolveAutomatedAttribute(final
ConfiguredAutomatedAttribute<?, ?> autoAttr)
+ {
+ String attrName = autoAttr.getName();
+ if (_attributes.containsKey(attrName))
+ {
+ automatedSetValue(attrName, _attributes.get(attrName));
+ }
+ else if (!"".equals(autoAttr.defaultValue()))
+ {
+ automatedSetValue(attrName, autoAttr.defaultValue());
+ }
+ }
+
private void attainStateIfResolved()
{
if(_openComplete)
@@ -1316,7 +1327,7 @@ public abstract class AbstractConfigured
public final <T> T getContextValue(Class<T> clazz, String propertyName)
{
AttributeValueConverter<T> converter =
AttributeValueConverter.getConverter(clazz, clazz);
- return converter.convert("${"+propertyName+"}", this);
+ return converter.convert("${" + propertyName + "}", this);
}
private OwnAttributeResolver getOwnAttributeResolver()
Modified:
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AttributeValueConverter.java
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AttributeValueConverter.java?rev=1600657&r1=1600656&r2=1600657&view=diff
==============================================================================
---
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AttributeValueConverter.java
(original)
+++
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AttributeValueConverter.java
Thu Jun 5 13:50:59 2014
@@ -204,7 +204,7 @@ abstract class AttributeValueConverter<T
}
catch (IOException e)
{
- throw new IllegalArgumentException("Cannot convert String
" + value + " to a List");
+ throw new IllegalArgumentException("Cannot convert String
" + interpolated + " to a List");
}
}
else if(value == null)
@@ -241,7 +241,7 @@ abstract class AttributeValueConverter<T
}
catch (IOException e)
{
- throw new IllegalArgumentException("Cannot convert String
" + value + " to a List");
+ throw new IllegalArgumentException("Cannot convert String
" + interpolated + " to a List");
}
}
else if(value == null)
@@ -278,7 +278,7 @@ abstract class AttributeValueConverter<T
}
catch (IOException e)
{
- throw new IllegalArgumentException("Cannot convert String
" + value + " to a Collection");
+ throw new IllegalArgumentException("Cannot convert String
" + interpolated + " to a Collection");
}
}
else if(value == null)
@@ -324,7 +324,7 @@ abstract class AttributeValueConverter<T
}
catch (IOException e)
{
- throw new IllegalArgumentException("Cannot convert String
" + value + " to a Map");
+ throw new IllegalArgumentException("Cannot convert String
" + interpolated + " to a Map");
}
}
else
Modified:
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/AbstractConfiguredObjectTest.java
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/AbstractConfiguredObjectTest.java?rev=1600657&r1=1600656&r2=1600657&view=diff
==============================================================================
---
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/AbstractConfiguredObjectTest.java
(original)
+++
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/AbstractConfiguredObjectTest.java
Thu Jun 5 13:50:59 2014
@@ -32,17 +32,16 @@ import org.apache.qpid.server.store.Conf
public class AbstractConfiguredObjectTest extends TestCase
{
+ private final Model _model = TestModel.getInstance();
-
- public void testNonPersistAttributes()
+ public void testAttributePersistence()
{
- Model model = TestModel.getInstance();
-
final String objectName = "testNonPersistAttributes";
TestRootCategory object =
- model.getObjectFactory().create(TestRootCategory.class,
+ _model.getObjectFactory().create(TestRootCategory.class,
Collections.<String,
Object>singletonMap(ConfiguredObject.NAME,
-
objectName));
+
objectName)
+ );
assertEquals(objectName, object.getName());
assertNull(object.getAutomatedNonPersistedValue());
@@ -56,7 +55,7 @@ public class AbstractConfiguredObjectTes
assertFalse(record.getAttributes().containsKey(TestRootCategory.AUTOMATED_NONPERSISTED_VALUE));
- Map<String,Object> updatedAttributes = new HashMap<>();
+ Map<String, Object> updatedAttributes = new HashMap<>();
final String newValue = "newValue";
@@ -74,4 +73,118 @@ public class AbstractConfiguredObjectTes
assertFalse(record.getAttributes().containsKey(TestRootCategory.AUTOMATED_NONPERSISTED_VALUE));
}
-}
+
+ public void testDefaultedAttributeValue()
+ {
+ final String objectName = "myName";
+
+ Map<String, Object> attributes = Collections.<String,
Object>singletonMap(ConfiguredObject.NAME, objectName);
+
+ TestRootCategory object1 =
_model.getObjectFactory().create(TestRootCategory.class,
+ attributes);
+
+ assertEquals(objectName, object1.getName());
+ assertEquals(TestRootCategory.DEFAULTED_VALUE_DEFAULT,
object1.getDefaultedValue());
+ }
+
+ public void testOverriddenDefaultedAttributeValue()
+ {
+ final String objectName = "myName";
+
+ Map<String, Object> attributes = new HashMap<>();
+ attributes.put(ConfiguredObject.NAME, objectName);
+ attributes.put(TestRootCategory.DEFAULTED_VALUE, "override");
+
+ TestRootCategory object2 =
_model.getObjectFactory().create(TestRootCategory.class,
+ attributes);
+
+ assertEquals(objectName, object2.getName());
+ assertEquals("override", object2.getDefaultedValue());
+ }
+
+ public void
testStringAttributeValueFromContextVariableProvidedBySystemProperty()
+ {
+ String sysPropertyName =
"testStringAttributeValueFromContextVariableProvidedBySystemProperty";
+ String contextToken = "${" + sysPropertyName + "}";
+
+ System.setProperty(sysPropertyName, "myValue");
+
+ final String objectName = "myName";
+
+ Map<String, Object> attributes = new HashMap<>();
+ attributes.put(ConfiguredObject.NAME, objectName);
+ attributes.put(TestRootCategory.STRING_VALUE, contextToken);
+
+ TestRootCategory object1 =
_model.getObjectFactory().create(TestRootCategory.class,
+
attributes);
+
+ assertEquals(objectName, object1.getName());
+ assertEquals("myValue", object1.getStringValue());
+
+ // System property set empty string
+
+ System.setProperty(sysPropertyName, "");
+ TestRootCategory object2 =
_model.getObjectFactory().create(TestRootCategory.class,
+
attributes);
+
+ assertEquals("", object2.getStringValue());
+
+ // System property not set
+ System.clearProperty(sysPropertyName);
+
+ TestRootCategory object3 =
_model.getObjectFactory().create(TestRootCategory.class,
+
attributes);
+
+ // yields the unexpanded token - not sure if this is really useful
behaviour?
+ assertEquals(contextToken, object3.getStringValue());
+ }
+
+ public void
testMapAttributeValueFromContextVariableProvidedBySystemProperty()
+ {
+ String sysPropertyName =
"testMapAttributeValueFromContextVariableProvidedBySystemProperty";
+ String contextToken = "${" + sysPropertyName + "}";
+
+ Map<String,String> expectedMap = new HashMap<>();
+ expectedMap.put("field1", "value1");
+ expectedMap.put("field2", "value2");
+
+ System.setProperty(sysPropertyName, "{ \"field1\" : \"value1\",
\"field2\" : \"value2\"}");
+
+ final String objectName = "myName";
+
+ Map<String, Object> attributes = new HashMap<>();
+ attributes.put(ConfiguredObject.NAME, objectName);
+ attributes.put(TestRootCategory.MAP_VALUE, contextToken);
+
+ TestRootCategory object1 =
_model.getObjectFactory().create(TestRootCategory.class,
+
attributes);
+
+ assertEquals(objectName, object1.getName());
+ assertEquals(expectedMap, object1.getMapValue());
+
+ // System property not set
+ System.clearProperty(sysPropertyName);
+ }
+
+ public void
testStringAttributeValueFromContextVariableProvidedObjectsContext()
+ {
+ String contextToken = "${myReplacement}";
+
+ final String objectName = "myName";
+
+ Map<String, Object> attributes = new HashMap<>();
+ attributes.put(ConfiguredObject.NAME, objectName);
+ attributes.put("context", Collections.singletonMap("myReplacement",
"myValue"));
+ attributes.put(TestRootCategory.STRING_VALUE, contextToken);
+
+ TestRootCategory object1 =
_model.getObjectFactory().create(TestRootCategory.class,
+
attributes);
+ // Check the object's context itself
+ assertTrue(object1.getContext().containsKey("myReplacement"));
+ assertEquals("myValue", object1.getContext().get("myReplacement"));
+
+ assertEquals(objectName, object1.getName());
+ assertEquals("myValue", object1.getStringValue());
+ }
+
+}
\ No newline at end of file
Modified:
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/testmodel/TestRootCategory.java
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/testmodel/TestRootCategory.java?rev=1600657&r1=1600656&r2=1600657&view=diff
==============================================================================
---
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/testmodel/TestRootCategory.java
(original)
+++
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/testmodel/TestRootCategory.java
Thu Jun 5 13:50:59 2014
@@ -20,6 +20,8 @@
*/
package org.apache.qpid.server.model.testmodel;
+import java.util.Map;
+
import org.apache.qpid.server.model.ConfiguredObject;
import org.apache.qpid.server.model.ManagedAttribute;
import org.apache.qpid.server.model.ManagedObject;
@@ -29,10 +31,24 @@ public interface TestRootCategory<X exte
{
String AUTOMATED_PERSISTED_VALUE = "automatedPersistedValue";
String AUTOMATED_NONPERSISTED_VALUE = "automatedNonPersistedValue";
+ String DEFAULTED_VALUE = "defaultedValue";
+ String STRING_VALUE = "stringValue";
+ String MAP_VALUE = "mapValue";
@ManagedAttribute
String getAutomatedPersistedValue();
@ManagedAttribute( persist = false )
String getAutomatedNonPersistedValue();
+
+ String DEFAULTED_VALUE_DEFAULT = "myDefaultVar";
+ @ManagedAttribute( defaultValue = DEFAULTED_VALUE_DEFAULT)
+ String getDefaultedValue();
+
+ @ManagedAttribute
+ String getStringValue();
+
+ @ManagedAttribute
+ Map<String,String> getMapValue();
+
}
Modified:
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/testmodel/TestRootCategoryImpl.java
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/testmodel/TestRootCategoryImpl.java?rev=1600657&r1=1600656&r2=1600657&view=diff
==============================================================================
---
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/testmodel/TestRootCategoryImpl.java
(original)
+++
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/testmodel/TestRootCategoryImpl.java
Thu Jun 5 13:50:59 2014
@@ -40,6 +40,15 @@ public class TestRootCategoryImpl extend
@ManagedAttributeField
private String _automatedNonPersistedValue;
+ @ManagedAttributeField
+ private String _defaultedValue;
+
+ @ManagedAttributeField
+ private String _stringValue;
+
+ @ManagedAttributeField
+ private Map<String,String> _mapValue;
+
@ManagedObjectFactoryConstructor
public TestRootCategoryImpl(final Map<String, Object> attributes)
{
@@ -78,6 +87,24 @@ public class TestRootCategoryImpl extend
}
@Override
+ public String getDefaultedValue()
+ {
+ return _defaultedValue;
+ }
+
+ @Override
+ public String getStringValue()
+ {
+ return _stringValue;
+ }
+
+ @Override
+ public Map<String, String> getMapValue()
+ {
+ return _mapValue;
+ }
+
+ @Override
public State getState()
{
return null;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]