DATACMNS-533 - Discover declared properties on EvaluationContextExtension.

We new automatically register public static fields declared on classes extending EvaluationContextExtensionSupport as properties to be used within SpEL expressions.

Related pull request: spring-projects/spring-data-jpa#101
Related ticket: DATAJPA-564
This commit is contained in:
Thomas Darimont
2014-07-07 14:57:40 +02:00
committed by Oliver Gierke
parent 9ab9467386
commit 1ff4961cbc
2 changed files with 50 additions and 3 deletions

View File

@@ -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<String, Object> declaredProperties;
private final Map<String, Method> declaredFunctions;
/**
* Creates a new {@link EvaluationContextExtensionSupport}.
*/
public EvaluationContextExtensionSupport() {
this.declaredProperties = discoverDeclaredProperties();
this.declaredFunctions = discoverDeclaredFunctions();
}
private Map<String, Object> discoverDeclaredProperties() {
final Map<String, Object> map = new HashMap<String, Object>();
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.<String, Object> emptyMap() : Collections.unmodifiableMap(map);
}
private Map<String, Method> discoverDeclaredFunctions() {
final Map<String, Method> map = new HashMap<String, Method>();
@@ -64,7 +89,7 @@ public abstract class EvaluationContextExtensionSupport implements EvaluationCon
*/
@Override
public Map<String, Object> getProperties() {
return Collections.emptyMap();
return this.declaredProperties;
}
/*

View File

@@ -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<EvaluationContextExtension> extensions = new ArrayList<EvaluationContextExtension>();
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<String, Object> getProperties() {
return Collections.<String, Object> singletonMap("key", value);
Map<String, Object> properties = new HashMap<String, Object>(super.getProperties());
properties.put("key", value);
return properties;
}
/*