You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by or...@apache.org on 2015/06/17 15:37:11 UTC

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

Author: orudyy
Date: Wed Jun 17 13:37:10 2015
New Revision: 1686010

URL: http://svn.apache.org/r1686010
Log:
QPID-6595: [Java Broker] Add ability to access ancsestor attributes in context variable expressions

Added:
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AncestorAttributeResolver.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/OwnAttributeResolver.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/AncestorAttributeResolverTest.java
Modified:
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/AbstractConfiguredObjectTest.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestCar.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestKitCar.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestKitCarImpl.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

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=1686010&r1=1686009&r2=1686010&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 Wed Jun 17 13:37:10 2015
@@ -165,7 +165,9 @@ public abstract class AbstractConfigured
     @ManagedAttributeField
     private String _type;
 
-    private final OwnAttributeResolver _attributeResolver = new OwnAttributeResolver(this);
+    private final OwnAttributeResolver _ownAttributeResolver = new OwnAttributeResolver(this);
+    private final AncestorAttributeResolver _ancestorAttributeResolver = new AncestorAttributeResolver(this);
+
 
     @ManagedAttributeField
     private State _desiredState;
@@ -2049,7 +2051,7 @@ public abstract class AbstractConfigured
                     }, executor);
 
                 }
-                catch(Throwable e)
+                catch (Throwable e)
                 {
                     returnVal.setException(e);
                 }
@@ -2337,17 +2339,12 @@ public abstract class AbstractConfigured
 
     private OwnAttributeResolver getOwnAttributeResolver()
     {
-        return _attributeResolver;
+        return _ownAttributeResolver;
     }
 
-    protected boolean isAttributePersisted(String name)
+    private AncestorAttributeResolver getAncestorAttributeResolver()
     {
-        ConfiguredObjectAttribute<X,?> attr = (ConfiguredObjectAttribute<X, ?>) _attributeTypes.get(name);
-        if(attr != null)
-        {
-            return attr.isPersisted();
-        }
-        return false;
+        return _ancestorAttributeResolver;
     }
 
     @Override
@@ -2386,6 +2383,7 @@ public abstract class AbstractConfigured
             return Strings.expand(value, false,
                                   JSON_SUBSTITUTION_RESOLVER,
                                   getOwnAttributeResolver(object),
+                                  getAncestorAttributeResolver(object),
                                   new Strings.MapResolver(inheritedContext),
                                   Strings.JAVA_SYS_PROPS_RESOLVER,
                                   Strings.ENV_VARS_RESOLVER,
@@ -2400,6 +2398,15 @@ public abstract class AbstractConfigured
                 : new OwnAttributeResolver(object);
     }
 
+    private static AncestorAttributeResolver getAncestorAttributeResolver(final ConfiguredObject<?> object)
+    {
+        return object instanceof AbstractConfiguredObject
+                ? ((AbstractConfiguredObject)object).getAncestorAttributeResolver()
+                : new AncestorAttributeResolver(object);
+    }
+
+
+
     static void generateInheritedContext(final Model model, final ConfiguredObject<?> object,
                                          final Map<String, String> inheritedContext)
     {
@@ -2430,93 +2437,6 @@ public abstract class AbstractConfigured
                                                    }
                                                });
 
-    private static class OwnAttributeResolver implements Strings.Resolver
-    {
-
-        public static final String PREFIX = "this:";
-        private final ThreadLocal<Set<String>> _stack = new ThreadLocal<>();
-        private final ConfiguredObject<?> _object;
-        private final ObjectMapper _objectMapper;
-
-        public OwnAttributeResolver(final ConfiguredObject<?> object)
-        {
-            _object = object;
-            _objectMapper = ConfiguredObjectJacksonModule.newObjectMapper();
-        }
-
-        @Override
-        public String resolve(final String variable, final Strings.Resolver resolver)
-        {
-            boolean clearStack = false;
-            Set<String> currentStack = _stack.get();
-            if(currentStack == null)
-            {
-                currentStack = new HashSet<>();
-                _stack.set(currentStack);
-                clearStack = true;
-            }
-
-            try
-            {
-                if(variable.startsWith(PREFIX))
-                {
-                    String attrName = variable.substring(PREFIX.length());
-                    if(currentStack.contains(attrName))
-                    {
-                        throw new IllegalArgumentException("The value of attribute " + attrName + " is defined recursively");
-                    }
-                    else
-                    {
-                        currentStack.add(attrName);
-                        Object returnVal = _object.getAttribute(attrName);
-                        String returnString;
-                        if(returnVal == null)
-                        {
-                            returnString =  null;
-                        }
-                        else if(returnVal instanceof Map || returnVal instanceof Collection)
-                        {
-                            try
-                            {
-                                StringWriter writer = new StringWriter();
-
-                                _objectMapper.writeValue(writer, returnVal);
-
-                                returnString = writer.toString();
-                            }
-                            catch (IOException e)
-                            {
-                                throw new IllegalArgumentException(e);
-                            }
-                        }
-                        else if(returnVal instanceof ConfiguredObject)
-                        {
-                            returnString = ((ConfiguredObject)returnVal).getId().toString();
-                        }
-                        else
-                        {
-                            returnString = returnVal.toString();
-                        }
-
-                        return returnString;
-                    }
-                }
-                else
-                {
-                    return null;
-                }
-            }
-            finally
-            {
-                if(clearStack)
-                {
-                    _stack.remove();
-                }
-
-            }
-        }
-    }
-
 
     private static class AttributeGettingHandler implements InvocationHandler
     {

Added: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AncestorAttributeResolver.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AncestorAttributeResolver.java?rev=1686010&view=auto
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AncestorAttributeResolver.java (added)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AncestorAttributeResolver.java Wed Jun 17 13:37:10 2015
@@ -0,0 +1,168 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.server.model;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.codehaus.jackson.map.ObjectMapper;
+
+import org.apache.qpid.util.Strings;
+
+public class AncestorAttributeResolver implements Strings.Resolver
+{
+
+    public static final String PREFIX = "ancestor:";
+    private final ThreadLocal<Set<String>> _stack = new ThreadLocal<>();
+    private final ConfiguredObject<?> _object;
+    private final ObjectMapper _objectMapper;
+
+    public AncestorAttributeResolver(final ConfiguredObject<?> object)
+    {
+        _object = object;
+        _objectMapper = ConfiguredObjectJacksonModule.newObjectMapper();
+    }
+
+    @Override
+    public String resolve(final String variable, final Strings.Resolver resolver)
+    {
+        boolean clearStack = false;
+        Set<String> currentStack = _stack.get();
+        if (currentStack == null)
+        {
+            currentStack = new HashSet<>();
+            _stack.set(currentStack);
+            clearStack = true;
+        }
+
+        try
+        {
+            if (variable.startsWith(PREFIX))
+            {
+                String classQualifiedAttrName = variable.substring(PREFIX.length());
+
+                if (currentStack.contains(classQualifiedAttrName))
+                {
+                    throw new IllegalArgumentException("The value of attribute "
+                                                       + classQualifiedAttrName
+                                                       + " is defined recursively");
+                }
+                else
+                {
+                    currentStack.add(classQualifiedAttrName);
+
+                    int colonIndex = classQualifiedAttrName.indexOf(":");
+                    if (colonIndex == -1)
+                    {
+                        return null;
+                    }
+
+                    String categorySimpleClassName = classQualifiedAttrName.substring(0, colonIndex);
+                    String attributeName = classQualifiedAttrName.substring(colonIndex + 1);
+
+                    final Class<? extends ConfiguredObject> ancestorCategory = findAncestorCategoryBySimpleClassName(categorySimpleClassName, _object.getCategoryClass());
+                    if (ancestorCategory == null)
+                    {
+                        return null;
+                    }
+
+                    final ConfiguredObject ancestorOrSelf = _object.getModel().getAncestor(ancestorCategory, _object);
+
+                    if (ancestorOrSelf == null)
+                    {
+                        return null;
+                    }
+
+
+                    Object returnVal = ancestorOrSelf.getAttribute(attributeName);
+                    String returnString;
+                    if (returnVal == null)
+                    {
+                        returnString = null;
+                    }
+                    else if (returnVal instanceof Map || returnVal instanceof Collection)
+                    {
+                        try
+                        {
+                            StringWriter writer = new StringWriter();
+
+                            _objectMapper.writeValue(writer, returnVal);
+
+                            returnString = writer.toString();
+                        }
+                        catch (IOException e)
+                        {
+                            throw new IllegalArgumentException(e);
+                        }
+                    }
+                    else if (returnVal instanceof ConfiguredObject)
+                    {
+                        returnString = ((ConfiguredObject) returnVal).getId().toString();
+                    }
+                    else
+                    {
+                        returnString = returnVal.toString();
+                    }
+
+                    return returnString;
+                }
+            }
+            else
+            {
+                return null;
+            }
+        }
+        finally
+        {
+            if (clearStack)
+            {
+                _stack.remove();
+            }
+
+        }
+    }
+
+    private Class<? extends ConfiguredObject> findAncestorCategoryBySimpleClassName(String targetCategorySimpleClassName, Class<? extends ConfiguredObject> objectCategory)
+    {
+        if (targetCategorySimpleClassName.equals(objectCategory.getSimpleName().toLowerCase()))
+        {
+            return objectCategory;
+        }
+
+
+        Collection<Class<? extends ConfiguredObject>> parentCategories = _object.getModel().getParentTypes(objectCategory);
+        for (Class<? extends ConfiguredObject> parentCategory: parentCategories)
+        {
+            Class<? extends ConfiguredObject> targetCategoryClass = findAncestorCategoryBySimpleClassName(targetCategorySimpleClassName,parentCategory );
+            if (targetCategoryClass != null)
+            {
+                return targetCategoryClass;
+            }
+
+        }
+
+        return null;
+    }
+}

Added: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/OwnAttributeResolver.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/OwnAttributeResolver.java?rev=1686010&view=auto
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/OwnAttributeResolver.java (added)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/OwnAttributeResolver.java Wed Jun 17 13:37:10 2015
@@ -0,0 +1,121 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.server.model;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.codehaus.jackson.map.ObjectMapper;
+
+import org.apache.qpid.util.Strings;
+
+public class OwnAttributeResolver implements Strings.Resolver
+{
+
+    public static final String PREFIX = "this:";
+    private final ThreadLocal<Set<String>> _stack = new ThreadLocal<>();
+    private final ConfiguredObject<?> _object;
+    private final ObjectMapper _objectMapper;
+
+    public OwnAttributeResolver(final ConfiguredObject<?> object)
+    {
+        _object = object;
+        _objectMapper = ConfiguredObjectJacksonModule.newObjectMapper();
+    }
+
+    @Override
+    public String resolve(final String variable, final Strings.Resolver resolver)
+    {
+        boolean clearStack = false;
+        Set<String> currentStack = _stack.get();
+        if (currentStack == null)
+        {
+            currentStack = new HashSet<>();
+            _stack.set(currentStack);
+            clearStack = true;
+        }
+
+        try
+        {
+            if (variable.startsWith(PREFIX))
+            {
+                String attrName = variable.substring(PREFIX.length());
+                if (currentStack.contains(attrName))
+                {
+                    throw new IllegalArgumentException("The value of attribute "
+                                                       + attrName
+                                                       + " is defined recursively");
+                }
+                else
+                {
+                    currentStack.add(attrName);
+                    Object returnVal = _object.getAttribute(attrName);
+                    String returnString;
+                    if (returnVal == null)
+                    {
+                        returnString = null;
+                    }
+                    else if (returnVal instanceof Map || returnVal instanceof Collection)
+                    {
+                        try
+                        {
+                            StringWriter writer = new StringWriter();
+
+                            _objectMapper.writeValue(writer, returnVal);
+
+                            returnString = writer.toString();
+                        }
+                        catch (IOException e)
+                        {
+                            throw new IllegalArgumentException(e);
+                        }
+                    }
+                    else if (returnVal instanceof ConfiguredObject)
+                    {
+                        returnString = ((ConfiguredObject) returnVal).getId().toString();
+                    }
+                    else
+                    {
+                        returnString = returnVal.toString();
+                    }
+
+                    return returnString;
+                }
+            }
+            else
+            {
+                return null;
+            }
+        }
+        finally
+        {
+            if (clearStack)
+            {
+                _stack.remove();
+            }
+
+        }
+    }
+}

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/AbstractConfiguredObjectTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/AbstractConfiguredObjectTest.java?rev=1686010&r1=1686009&r2=1686010&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/AbstractConfiguredObjectTest.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/AbstractConfiguredObjectTest.java Wed Jun 17 13:37:10 2015
@@ -94,4 +94,39 @@ public class AbstractConfiguredObjectTes
 
     }
 
+    public void testDefaultContextVariableWhichRefersToAncestor()
+    {
+        final String carName = "myCar";
+        Map<String, Object> carAttributes = new HashMap<>();
+        carAttributes.put(ConfiguredObject.NAME, carName);
+        carAttributes.put(ConfiguredObject.TYPE, TestKitCarImpl.TEST_KITCAR_TYPE);
+
+        TestCar car = _model.getObjectFactory().create(TestCar.class, carAttributes);
+
+        assertEquals(carName, car.getName());
+
+        assertEquals(0, car.getChildren(TestEngine.class).size());
+
+        String engineName = "myEngine";
+
+        Map<String, Object> engineAttributes = new HashMap<>();
+        engineAttributes.put(ConfiguredObject.NAME, engineName);
+        engineAttributes.put(ConfiguredObject.TYPE, TestElecEngineImpl.TEST_ELEC_ENGINE_TYPE);
+
+
+        TestEngine engine = (TestEngine) car.createChild(TestEngine.class, engineAttributes);
+
+        assertTrue("context var not in contextKeys",
+                   car.getContextKeys(true).contains(TestCar.TEST_CONTEXT_VAR));
+
+        String expected = "a value " + carName;
+        assertEquals(expected, car.getContextValue(String.class, TestCar.TEST_CONTEXT_VAR));
+
+        assertTrue("context var not in contextKeys",
+                   engine.getContextKeys(true).contains(TestCar.TEST_CONTEXT_VAR));
+        assertEquals(expected, engine.getContextValue(String.class, TestCar.TEST_CONTEXT_VAR));
+
+    }
+
+
 }

Added: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/AncestorAttributeResolverTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/AncestorAttributeResolverTest.java?rev=1686010&view=auto
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/AncestorAttributeResolverTest.java (added)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/AncestorAttributeResolverTest.java Wed Jun 17 13:37:10 2015
@@ -0,0 +1,138 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.server.model.testmodels.hierarchy;
+
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.qpid.server.model.AncestorAttributeResolver;
+import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.Model;
+import org.apache.qpid.test.utils.QpidTestCase;
+import org.codehaus.jackson.map.ObjectMapper;
+
+public class AncestorAttributeResolverTest extends QpidTestCase
+{
+
+    public static final String CAR_NAME = "myCar";
+    private final Model _model = TestModel.getInstance();
+
+    private AncestorAttributeResolver _ancestorAttributeResolver;
+    private TestCar _car;
+    private TestEngine _engine;
+
+    @Override
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+
+        Map<String, Object> carAttributes = new HashMap<>();
+        carAttributes.put(ConfiguredObject.NAME, CAR_NAME);
+        carAttributes.put(ConfiguredObject.TYPE, TestKitCarImpl.TEST_KITCAR_TYPE);
+
+        _car = _model.getObjectFactory().create(TestCar.class, carAttributes);
+
+        assertEquals(CAR_NAME, _car.getName());
+
+        String engineName = "myEngine";
+
+        Map<String, Object> engineAttributes = new HashMap<>();
+        engineAttributes.put(ConfiguredObject.NAME, engineName);
+        engineAttributes.put(ConfiguredObject.TYPE, TestElecEngineImpl.TEST_ELEC_ENGINE_TYPE);
+
+
+        _engine = (TestEngine) _car.createChild(TestEngine.class, engineAttributes);
+
+
+    }
+
+    public void testResolveToParent() throws Exception
+    {
+        _ancestorAttributeResolver = new AncestorAttributeResolver(_engine);
+        String actual = _ancestorAttributeResolver.resolve("ancestor:testcar:name", null);
+        assertEquals(CAR_NAME, actual);
+    }
+
+    public void testResolveToSelf() throws Exception
+    {
+        _ancestorAttributeResolver = new AncestorAttributeResolver(_car);
+        String actual = _ancestorAttributeResolver.resolve("ancestor:testcar:name", null);
+        assertEquals(CAR_NAME, actual);
+    }
+
+    public void testUnrecognisedCategoryName() throws Exception
+    {
+        _ancestorAttributeResolver = new AncestorAttributeResolver(_car);
+        String actual = _ancestorAttributeResolver.resolve("ancestor:notacategoty:name", null);
+        assertNull(actual);
+    }
+
+    public void testUnrecognisedAttributeName() throws Exception
+    {
+        _ancestorAttributeResolver = new AncestorAttributeResolver(_car);
+        String actual = _ancestorAttributeResolver.resolve("ancestor:notacategoty:nonexisting", null);
+        assertNull(actual);
+    }
+
+    public void testBadAncestorRef() throws Exception
+    {
+        _ancestorAttributeResolver = new AncestorAttributeResolver(_car);
+        String actual = _ancestorAttributeResolver.resolve("ancestor:name", null);
+        assertNull(actual);
+    }
+
+    public void testResolveAncestorAttributeOfTypeMap() throws Exception
+    {
+        Map<String, Object> carAttributes = new HashMap<>();
+        carAttributes.put(ConfiguredObject.NAME, CAR_NAME);
+        carAttributes.put(ConfiguredObject.TYPE, TestKitCarImpl.TEST_KITCAR_TYPE);
+        Map<String,Object> parameters = new HashMap<>();
+        parameters.put("int", 1);
+        parameters.put("string", "value");
+        carAttributes.put("parameters", parameters);
+
+        _car = _model.getObjectFactory().create(TestCar.class, carAttributes);
+
+        _ancestorAttributeResolver = new AncestorAttributeResolver(_car);
+        String actual = _ancestorAttributeResolver.resolve("ancestor:testcar:parameters", null);
+
+        ObjectMapper objectMapper = new ObjectMapper();
+        Map<Object,Object> data = objectMapper.readValue(actual, HashMap.class);
+        assertEquals("Unexpected resolved ancestor attribute of type Map", parameters, data);
+    }
+
+    public void testResolveAncestorAttributeOfTypeConfiguredObject() throws Exception
+    {
+        Map<String, Object> carAttributes = new HashMap<>();
+        carAttributes.put(ConfiguredObject.NAME, CAR_NAME);
+        carAttributes.put(ConfiguredObject.TYPE, TestKitCarImpl.TEST_KITCAR_TYPE);
+        carAttributes.put("alternateEngine", _engine);
+
+        _car = _model.getObjectFactory().create(TestCar.class, carAttributes);
+
+        _ancestorAttributeResolver = new AncestorAttributeResolver(_car);
+        String actual = _ancestorAttributeResolver.resolve("ancestor:testcar:alternateEngine", null);
+
+        assertEquals("Unexpected resolved ancestor attribute of type ConfiguredObject" , _engine.getId().toString(), actual);
+    }
+
+}
\ No newline at end of file

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestCar.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestCar.java?rev=1686010&r1=1686009&r2=1686010&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestCar.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestCar.java Wed Jun 17 13:37:10 2015
@@ -21,6 +21,7 @@
 package org.apache.qpid.server.model.testmodels.hierarchy;
 
 import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.ManagedContextDefault;
 import org.apache.qpid.server.model.ManagedObject;
 import org.apache.qpid.server.model.ManagedOperation;
 import org.apache.qpid.server.model.Param;
@@ -28,6 +29,10 @@ import org.apache.qpid.server.model.Para
 @ManagedObject( defaultType = TestStandardCarImpl.TEST_STANDARD_CAR_TYPE)
 public interface TestCar<X extends TestCar<X>> extends ConfiguredObject<X>
 {
+    String TEST_CONTEXT_VAR = "TEST_CONTEXT_VAR";
+    @ManagedContextDefault(name = TEST_CONTEXT_VAR)
+    String testGlobalDefault = "a value ${ancestor:testcar:name}";
+
     enum Door { DRIVER, PASSENGER }
 
     @ManagedOperation

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestKitCar.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestKitCar.java?rev=1686010&r1=1686009&r2=1686010&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestKitCar.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestKitCar.java Wed Jun 17 13:37:10 2015
@@ -18,6 +18,9 @@
  */
 package org.apache.qpid.server.model.testmodels.hierarchy;
 
+import java.util.Map;
+
+import org.apache.qpid.server.model.ManagedAttribute;
 import org.apache.qpid.server.model.ManagedObject;
 import org.apache.qpid.server.model.ManagedOperation;
 import org.apache.qpid.server.model.Param;
@@ -27,4 +30,10 @@ public interface TestKitCar<X extends Te
 {
     @ManagedOperation
     Door openDoor(@Param(name = "door", defaultValue = "PASSENGER") Door door);
+
+    @ManagedAttribute
+    Map<String,Object> getParameters();
+
+    @ManagedAttribute
+    TestEngine getAlternateEngine();
 }

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestKitCarImpl.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestKitCarImpl.java?rev=1686010&r1=1686009&r2=1686010&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestKitCarImpl.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestKitCarImpl.java Wed Jun 17 13:37:10 2015
@@ -23,6 +23,7 @@ import java.util.Map;
 import org.apache.qpid.server.configuration.updater.CurrentThreadTaskExecutor;
 import org.apache.qpid.server.model.AbstractConfiguredObject;
 import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.ManagedAttributeField;
 import org.apache.qpid.server.model.ManagedObject;
 import org.apache.qpid.server.model.ManagedObjectFactoryConstructor;
 import org.apache.qpid.server.model.testmodels.TestSecurityManager;
@@ -36,6 +37,12 @@ public class TestKitCarImpl extends Abst
     public static final String TEST_KITCAR_TYPE = "testkitcar";
     private final SecurityManager _securityManager;
 
+    @ManagedAttributeField
+    private Map<String,Object> _parameters;
+
+    @ManagedAttributeField
+    private TestEngine _alternateEngine;
+
     @ManagedObjectFactoryConstructor
     public TestKitCarImpl(final Map<String, Object> attributes)
     {
@@ -69,4 +76,16 @@ public class TestKitCarImpl extends Abst
     {
         return door;
     }
+
+    @Override
+    public Map<String, Object> getParameters()
+    {
+        return _parameters;
+    }
+
+    @Override
+    public TestEngine getAlternateEngine()
+    {
+        return _alternateEngine;
+    }
 }

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=1686010&r1=1686009&r2=1686010&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 Wed Jun 17 13:37:10 2015
@@ -371,7 +371,7 @@ public class AbstractConfiguredObjectTes
 
         assertEquals(TestSingleton.VALID_VALUE2, object.getValidValue());
 
-        object.setAttributes(Collections.singletonMap(TestSingleton.VALID_VALUE,null));
+        object.setAttributes(Collections.singletonMap(TestSingleton.VALID_VALUE, null));
         assertNull(object.getValidValue());
 
     }
@@ -427,12 +427,30 @@ public class AbstractConfiguredObjectTes
 
         assertTrue("context default not in contextKeys",
                    object.getContextKeys(true).contains(TestSingleton.TEST_CONTEXT_DEFAULT));
-        assertEquals(object.getContextValue(String.class, TestSingleton.TEST_CONTEXT_DEFAULT), "default");
+        assertEquals("default",
+                     object.getContextValue(String.class, TestSingleton.TEST_CONTEXT_DEFAULT));
 
         setTestSystemProperty(TestSingleton.TEST_CONTEXT_DEFAULT, "notdefault");
         assertTrue("context default not in contextKeys",
                    object.getContextKeys(true).contains(TestSingleton.TEST_CONTEXT_DEFAULT));
-        assertEquals(object.getContextValue(String.class, TestSingleton.TEST_CONTEXT_DEFAULT), "notdefault");
+        assertEquals("notdefault", object.getContextValue(String.class, TestSingleton.TEST_CONTEXT_DEFAULT));
+    }
+
+    public void testDefaultContextVariableWhichRefersToThis()
+    {
+        final String objectName = "myName";
+
+        Map<String, Object> attributes = new HashMap<>();
+        attributes.put(ConfiguredObject.NAME, objectName);
+
+        TestSingleton object = _model.getObjectFactory().create(TestSingleton.class,
+                                                                attributes);
+
+        assertTrue("context default not in contextKeys",
+                   object.getContextKeys(true).contains(TestSingleton.TEST_CONTEXT_DEFAULT_WITH_THISREF));
+
+        String expected = "a context var that refers to an attribute " + objectName;
+        assertEquals(expected, object.getContextValue(String.class, TestSingleton.TEST_CONTEXT_DEFAULT_WITH_THISREF));
     }
 
     public void testDerivedAttributeValue()

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=1686010&r1=1686009&r2=1686010&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 Wed Jun 17 13:37:10 2015
@@ -43,10 +43,13 @@ public interface TestSingleton<X extends
     String ENUMSET_VALUES = "enumSetValues";
 
     String TEST_CONTEXT_DEFAULT = "TEST_CONTEXT_DEFAULT";
-
     @ManagedContextDefault(name = TEST_CONTEXT_DEFAULT)
     String testGlobalDefault = "default";
 
+    String TEST_CONTEXT_DEFAULT_WITH_THISREF = "TEST_CONTEXT_DEFAULT_WITH_THISREF";
+    @ManagedContextDefault(name = TEST_CONTEXT_DEFAULT_WITH_THISREF)
+    String testGlobalDefaultWithThisRef = "a context var that refers to an attribute ${this:name}";
+
     @ManagedAttribute
     String getAutomatedPersistedValue();
 



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