diff --git a/src/main/java/org/springframework/data/repository/query/spi/EvaluationContextExtensionSupport.java b/src/main/java/org/springframework/data/repository/query/spi/EvaluationContextExtensionSupport.java index c80620a64..6afdd6d09 100644 --- a/src/main/java/org/springframework/data/repository/query/spi/EvaluationContextExtensionSupport.java +++ b/src/main/java/org/springframework/data/repository/query/spi/EvaluationContextExtensionSupport.java @@ -15,6 +15,7 @@ */ package org.springframework.data.repository.query.spi; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.Collections; @@ -22,6 +23,7 @@ import java.util.HashMap; import java.util.Map; import org.springframework.util.ReflectionUtils; +import org.springframework.util.ReflectionUtils.FieldCallback; import org.springframework.util.ReflectionUtils.MethodCallback; /** @@ -33,13 +35,36 @@ import org.springframework.util.ReflectionUtils.MethodCallback; */ public abstract class EvaluationContextExtensionSupport implements EvaluationContextExtension { + private final Map declaredProperties; private final Map declaredFunctions; + /** + * Creates a new {@link EvaluationContextExtensionSupport}. + */ public EvaluationContextExtensionSupport() { + this.declaredProperties = discoverDeclaredProperties(); this.declaredFunctions = discoverDeclaredFunctions(); } + private Map discoverDeclaredProperties() { + + final Map map = new HashMap(); + + ReflectionUtils.doWithFields(getClass(), new FieldCallback() { + + @Override + public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException { + + if (Modifier.isPublic(field.getModifiers()) && Modifier.isStatic(field.getModifiers())) { + map.put(field.getName(), field.get(null)); + } + } + }); + + return map.isEmpty() ? Collections. emptyMap() : Collections.unmodifiableMap(map); + } + private Map discoverDeclaredFunctions() { final Map map = new HashMap(); @@ -64,7 +89,7 @@ public abstract class EvaluationContextExtensionSupport implements EvaluationCon */ @Override public Map getProperties() { - return Collections.emptyMap(); + return this.declaredProperties; } /* diff --git a/src/test/java/org/springframework/data/repository/query/ExtensibleEvaluationContextProviderUnitTests.java b/src/test/java/org/springframework/data/repository/query/ExtensibleEvaluationContextProviderUnitTests.java index 47dc537fb..55886456a 100644 --- a/src/test/java/org/springframework/data/repository/query/ExtensibleEvaluationContextProviderUnitTests.java +++ b/src/test/java/org/springframework/data/repository/query/ExtensibleEvaluationContextProviderUnitTests.java @@ -116,7 +116,24 @@ public class ExtensibleEvaluationContextProviderUnitTests { assertThat(evaluateExpression("extensionMethod()", provider), is((Object) "methodResult")); } - static class DummyExtension extends EvaluationContextExtensionSupport { + /** + * @see DATACMNS-533 + */ + @Test + public void exposesPropertiesDefinedByExtension() { + + List extensions = new ArrayList(); + extensions.add(new DummyExtension("_first", "first")); + + EvaluationContextProvider provider = new ExtensionAwareEvaluationContextProvider(extensions); + + assertThat(evaluateExpression("DUMMY_KEY", provider), is((Object) "dummy")); + assertThat(evaluateExpression("_first.DUMMY_KEY", provider), is((Object) "dummy")); + } + + public static class DummyExtension extends EvaluationContextExtensionSupport { + + public static String DUMMY_KEY = "dummy"; private final String key; private final String value; @@ -145,7 +162,12 @@ public class ExtensibleEvaluationContextProviderUnitTests { */ @Override public Map getProperties() { - return Collections. singletonMap("key", value); + + Map properties = new HashMap(super.getProperties()); + + properties.put("key", value); + + return properties; } /*