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