diff --git a/src/main/java/org/springframework/data/repository/query/ExtensionAwareEvaluationContextProvider.java b/src/main/java/org/springframework/data/repository/query/ExtensionAwareEvaluationContextProvider.java index 9b6be4f15..48284a5ca 100644 --- a/src/main/java/org/springframework/data/repository/query/ExtensionAwareEvaluationContextProvider.java +++ b/src/main/java/org/springframework/data/repository/query/ExtensionAwareEvaluationContextProvider.java @@ -109,52 +109,41 @@ public class ExtensionAwareEvaluationContextProvider implements EvaluationContex // Add parameters for indexed access ec.setRootObject(parameterValues); - - Map variables = collectVariables(parameters, parameterValues); - - ec.setVariables(variables); + ec.setVariables(collectVariables(parameters, parameterValues)); return ec; } - protected > Map collectVariables(T parameters, - Object[] parameterValues) { + /** + * Exposes variables for all named parameters for the given arguments. Also exposes non-bindable parameters under the + * names of their types. + * + * @param parameters must not be {@literal null}. + * @param arguments must not be {@literal null}. + * @return + */ + private > Map collectVariables(T parameters, + Object[] arguments) { Map variables = new HashMap(); - registerSpecialParameterVariablesIfPresent(parameters, parameterValues, variables); - registerNamedMethodParameterVariables(parameters, parameterValues, variables); + for (Parameter param : parameters) { + if (param.isSpecialParameter()) { - return variables; - } + String key = StringUtils.uncapitalize(param.getType().getSimpleName()); + Object value = arguments[param.getIndex()]; - protected > void registerNamedMethodParameterVariables(T parameters, - Object[] parameterValues, Map variables) { + variables.put(key, value); + } + } for (Parameter param : parameters) { if (param.isNamedParameter()) { - variables.put(param.getName(), parameterValues[param.getIndex()]); + variables.put(param.getName(), arguments[param.getIndex()]); } } - } - protected > void registerSpecialParameterVariablesIfPresent( - T parameters, Object[] parameterValues, Map variables) { - - if (parameters.hasSpecialParameter()) { - - for (Parameter param : parameters) { - if (param.isSpecialParameter()) { - - Object paramValue = parameterValues[param.getIndex()]; - if (paramValue == null) { - continue; - } - - variables.put(StringUtils.uncapitalize(param.getType().getSimpleName()), paramValue); - } - } - } + return variables; } /** diff --git a/src/test/java/org/springframework/data/repository/query/ExtensibleEvaluationContextProviderUnitTests.java b/src/test/java/org/springframework/data/repository/query/ExtensionAwareEvaluationContextProviderUnitTests.java similarity index 57% rename from src/test/java/org/springframework/data/repository/query/ExtensibleEvaluationContextProviderUnitTests.java rename to src/test/java/org/springframework/data/repository/query/ExtensionAwareEvaluationContextProviderUnitTests.java index 7026ad850..cef4bd418 100644 --- a/src/test/java/org/springframework/data/repository/query/ExtensibleEvaluationContextProviderUnitTests.java +++ b/src/test/java/org/springframework/data/repository/query/ExtensionAwareEvaluationContextProviderUnitTests.java @@ -42,15 +42,16 @@ import org.springframework.expression.spel.standard.SpelExpressionParser; * @author Oliver Gierke * @author Thomas Darimont. */ -public class ExtensibleEvaluationContextProviderUnitTests { +public class ExtensionAwareEvaluationContextProviderUnitTests { - DefaultParameters parameters; + Method method; + EvaluationContextProvider provider; @Before public void setUp() throws Exception { - Method method = SampleRepo.class.getMethod("findByFirstname", String.class); - this.parameters = new DefaultParameters(method); + this.method = SampleRepo.class.getMethod("findByFirstname", String.class); + this.provider = new ExtensionAwareEvaluationContextProvider(Collections. emptyList()); } /** @@ -59,11 +60,10 @@ public class ExtensibleEvaluationContextProviderUnitTests { @Test public void usesPropertyDefinedByExtension() { - List extensions = new ArrayList(); - extensions.add(new DummyExtension("_first", "first")); + this.provider = new ExtensionAwareEvaluationContextProvider(Collections.singletonList(new DummyExtension("_first", + "first"))); - ExtensionAwareEvaluationContextProvider provider = new ExtensionAwareEvaluationContextProvider(extensions); - assertThat(evaluateExpression("key", provider), is((Object) "first")); + assertThat(evaluateExpression("key"), is((Object) "first")); } /** @@ -76,8 +76,9 @@ public class ExtensibleEvaluationContextProviderUnitTests { extensions.add(new DummyExtension("_first", "first")); extensions.add(new DummyExtension("_second", "second")); - ExtensionAwareEvaluationContextProvider provider = new ExtensionAwareEvaluationContextProvider(extensions); - assertThat(evaluateExpression("key", provider), is((Object) "second")); + this.provider = new ExtensionAwareEvaluationContextProvider(extensions); + + assertThat(evaluateExpression("key"), is((Object) "second")); } /** @@ -90,8 +91,8 @@ public class ExtensibleEvaluationContextProviderUnitTests { extensions.add(new DummyExtension("_first", "first")); extensions.add(new DummyExtension("_second", "second")); - EvaluationContextProvider provider = new ExtensionAwareEvaluationContextProvider(extensions); - assertThat(evaluateExpression("_first.key", provider), is((Object) "first")); + this.provider = new ExtensionAwareEvaluationContextProvider(extensions); + assertThat(evaluateExpression("_first.key"), is((Object) "first")); } /** @@ -99,11 +100,7 @@ public class ExtensibleEvaluationContextProviderUnitTests { */ @Test public void exposesParametersAsVariables() { - - ExtensionAwareEvaluationContextProvider provider = new ExtensionAwareEvaluationContextProvider( - Collections. emptyList()); - - assertThat(evaluateExpression("#firstname", provider), is((Object) "parameterValue")); + assertThat(evaluateExpression("#firstname"), is((Object) "parameterValue")); } /** @@ -112,15 +109,13 @@ public class ExtensibleEvaluationContextProviderUnitTests { @Test public void exposesMethodDefinedByExtension() { - List extensions = new ArrayList(); - extensions.add(new DummyExtension("_first", "first")); + this.provider = new ExtensionAwareEvaluationContextProvider(Collections.singletonList(new DummyExtension("_first", + "first"))); - EvaluationContextProvider provider = new ExtensionAwareEvaluationContextProvider(extensions); - - assertThat(evaluateExpression("aliasedMethod()", provider), is((Object) "methodResult")); - assertThat(evaluateExpression("extensionMethod()", provider), is((Object) "methodResult")); - assertThat(evaluateExpression("_first.extensionMethod()", provider), is((Object) "methodResult")); - assertThat(evaluateExpression("_first.aliasedMethod()", provider), is((Object) "methodResult")); + assertThat(evaluateExpression("aliasedMethod()"), is((Object) "methodResult")); + assertThat(evaluateExpression("extensionMethod()"), is((Object) "methodResult")); + assertThat(evaluateExpression("_first.extensionMethod()"), is((Object) "methodResult")); + assertThat(evaluateExpression("_first.aliasedMethod()"), is((Object) "methodResult")); } /** @@ -129,13 +124,11 @@ public class ExtensibleEvaluationContextProviderUnitTests { @Test public void exposesPropertiesDefinedByExtension() { - List extensions = new ArrayList(); - extensions.add(new DummyExtension("_first", "first")); + this.provider = new ExtensionAwareEvaluationContextProvider(Collections.singletonList(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")); + assertThat(evaluateExpression("DUMMY_KEY"), is((Object) "dummy")); + assertThat(evaluateExpression("_first.DUMMY_KEY"), is((Object) "dummy")); } /** @@ -144,15 +137,12 @@ public class ExtensibleEvaluationContextProviderUnitTests { @Test public void exposesPageableParameter() throws Exception { - this.parameters = new DefaultParameters(SampleRepo.class.getMethod("findByFirstname", String.class, Pageable.class)); - ExtensionAwareEvaluationContextProvider provider = new ExtensionAwareEvaluationContextProvider( - Collections. emptyList()); - + this.method = SampleRepo.class.getMethod("findByFirstname", String.class, Pageable.class); PageRequest pageable = new PageRequest(2, 3, new Sort(Direction.DESC, "lastname")); - assertThat(evaluateExpression("#pageable.offset", provider, new Object[] { "test", pageable }), is((Object) 6)); - assertThat(evaluateExpression("#pageable.pageSize", provider, new Object[] { "test", pageable }), is((Object) 3)); - assertThat(evaluateExpression("#pageable.sort.toString()", provider, new Object[] { "test", pageable }), + assertThat(evaluateExpression("#pageable.offset", new Object[] { "test", pageable }), is((Object) 6)); + assertThat(evaluateExpression("#pageable.pageSize", new Object[] { "test", pageable }), is((Object) 3)); + assertThat(evaluateExpression("#pageable.sort.toString()", new Object[] { "test", pageable }), is((Object) "lastname: DESC")); } @@ -162,14 +152,21 @@ public class ExtensibleEvaluationContextProviderUnitTests { @Test public void exposesSortParameter() throws Exception { - this.parameters = new DefaultParameters(SampleRepo.class.getMethod("findByFirstname", String.class, Sort.class)); - ExtensionAwareEvaluationContextProvider provider = new ExtensionAwareEvaluationContextProvider( - Collections. emptyList()); - + this.method = SampleRepo.class.getMethod("findByFirstname", String.class, Sort.class); Sort sort = new Sort(Direction.DESC, "lastname"); - assertThat(evaluateExpression("#sort.toString()", provider, new Object[] { "test", sort }), - is((Object) "lastname: DESC")); + assertThat(evaluateExpression("#sort.toString()", new Object[] { "test", sort }), is((Object) "lastname: DESC")); + } + + /** + * @see DATACMNS-533 + */ + @Test + public void exposesSpecialParameterEvenIfItsNull() throws Exception { + + this.method = SampleRepo.class.getMethod("findByFirstname", String.class, Sort.class); + + assertThat(evaluateExpression("#sort?.toString()", new Object[] { "test", null }), is(nullValue())); } public static class DummyExtension extends EvaluationContextExtensionSupport { @@ -179,9 +176,6 @@ public class ExtensibleEvaluationContextProviderUnitTests { private final String key; private final String value; - /** - * @param value - */ public DummyExtension(String key, String value) { this.key = key; @@ -233,12 +227,13 @@ public class ExtensibleEvaluationContextProviderUnitTests { } } - private Object evaluateExpression(String expression, EvaluationContextProvider provider) { - return evaluateExpression(expression, provider, new Object[] { "parameterValue" }); + private Object evaluateExpression(String expression) { + return evaluateExpression(expression, new Object[] { "parameterValue" }); } - private Object evaluateExpression(String expression, EvaluationContextProvider provider, Object[] args) { + private Object evaluateExpression(String expression, Object[] args) { + DefaultParameters parameters = new DefaultParameters(method); EvaluationContext evaluationContext = provider.getEvaluationContext(parameters, args); return new SpelExpressionParser().parseExpression(expression).getValue(evaluationContext); }