From 39f028bb6c8aa1770f944156956053ed0277d7bd Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Tue, 8 Jul 2014 13:13:30 +0200 Subject: [PATCH] DATACMNS-533 - Polishing of special parameter handling. Collapsed variable gathering methods into one, make sure we expose all values (also null ones). Renamed unit test for ExtensionAwareEvaluationContextProvider according to the class name. Some further cleanups in the test case. Related pull request: spring-projects/spring-data-jpa#101 Related ticket: DATAJPA-564 --- ...tensionAwareEvaluationContextProvider.java | 51 ++++------ ...reEvaluationContextProviderUnitTests.java} | 95 +++++++++---------- 2 files changed, 65 insertions(+), 81 deletions(-) rename src/test/java/org/springframework/data/repository/query/{ExtensibleEvaluationContextProviderUnitTests.java => ExtensionAwareEvaluationContextProviderUnitTests.java} (57%) 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); }