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]

Reply via email to