Skip to content

Commit 6bfc70b

Browse files
committed
Polishing
1 parent 95883b9 commit 6bfc70b

File tree

3 files changed

+47
-86
lines changed

3 files changed

+47
-86
lines changed

spring-expression/src/main/java/org/springframework/expression/ParserContext.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2017 the original author or authors.
2+
* Copyright 2002-2023 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -27,10 +27,11 @@
2727
public interface ParserContext {
2828

2929
/**
30-
* Whether the expression being parsed is a template. A template expression
31-
* consists of literal text that can be mixed with evaluatable blocks. Some examples:
30+
* Whether the expression being parsed is a template.
31+
* <p>A template consists of literal text that can be mixed with expressions.
32+
* Some examples:
3233
* <pre class="code">
33-
* Some literal text
34+
* Some literal text
3435
* Hello #{name.firstName}!
3536
* #{3 + 4}
3637
* </pre>

spring-expression/src/test/java/org/springframework/expression/spel/SpelReproTests.java

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import org.springframework.expression.ParserContext;
5252
import org.springframework.expression.PropertyAccessor;
5353
import org.springframework.expression.TypedValue;
54+
import org.springframework.expression.common.TemplateParserContext;
5455
import org.springframework.expression.spel.standard.SpelExpression;
5556
import org.springframework.expression.spel.standard.SpelExpressionParser;
5657
import org.springframework.expression.spel.support.ReflectiveMethodResolver;
@@ -77,6 +78,9 @@
7778
*/
7879
class SpelReproTests extends AbstractExpressionTests {
7980

81+
private static final ParserContext DOLLARSQUARE_TEMPLATE_PARSER_CONTEXT = new TemplateParserContext("$[", "]");
82+
83+
8084
@Test
8185
void NPE_SPR5661() {
8286
evaluate("joinThreeStrings('a',null,'c')", "anullc", String.class);
@@ -193,8 +197,8 @@ void SPR5847() {
193197

194198
@Test
195199
void NPE_SPR5673() {
196-
ParserContext hashes = TemplateExpressionParsingTests.HASH_DELIMITED_PARSER_CONTEXT;
197-
ParserContext dollars = TemplateExpressionParsingTests.DEFAULT_TEMPLATE_PARSER_CONTEXT;
200+
ParserContext hashes = ParserContext.TEMPLATE_EXPRESSION;
201+
ParserContext dollars = TemplateExpressionParsingTests.DOLLAR_SIGN_TEMPLATE_PARSER_CONTEXT;
198202

199203
checkTemplateParsing("abc${'def'} ghi", "abcdef ghi");
200204

@@ -378,7 +382,7 @@ void dollars2() {
378382
}
379383

380384
private void checkTemplateParsing(String expression, String expectedValue) {
381-
checkTemplateParsing(expression, TemplateExpressionParsingTests.DEFAULT_TEMPLATE_PARSER_CONTEXT, expectedValue);
385+
checkTemplateParsing(expression, TemplateExpressionParsingTests.DOLLAR_SIGN_TEMPLATE_PARSER_CONTEXT, expectedValue);
382386
}
383387

384388
private void checkTemplateParsing(String expression, ParserContext context, String expectedValue) {
@@ -388,7 +392,7 @@ private void checkTemplateParsing(String expression, ParserContext context, Stri
388392
}
389393

390394
private void checkTemplateParsingError(String expression, String expectedMessage) {
391-
checkTemplateParsingError(expression, TemplateExpressionParsingTests.DEFAULT_TEMPLATE_PARSER_CONTEXT, expectedMessage);
395+
checkTemplateParsingError(expression, TemplateExpressionParsingTests.DOLLAR_SIGN_TEMPLATE_PARSER_CONTEXT, expectedMessage);
392396
}
393397

394398
private void checkTemplateParsingError(String expression, ParserContext context, String expectedMessage) {
@@ -404,22 +408,6 @@ private void checkTemplateParsingError(String expression, ParserContext context,
404408
});
405409
}
406410

407-
408-
private static final ParserContext DOLLARSQUARE_TEMPLATE_PARSER_CONTEXT = new ParserContext() {
409-
@Override
410-
public String getExpressionPrefix() {
411-
return "$[";
412-
}
413-
@Override
414-
public String getExpressionSuffix() {
415-
return "]";
416-
}
417-
@Override
418-
public boolean isTemplate() {
419-
return true;
420-
}
421-
};
422-
423411
@Test
424412
void beanResolution() {
425413
StandardEvaluationContext context = new StandardEvaluationContext(new XX());

spring-expression/src/test/java/org/springframework/expression/spel/TemplateExpressionParsingTests.java

Lines changed: 34 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2022 the original author or authors.
2+
* Copyright 2002-2023 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -34,89 +34,62 @@
3434
/**
3535
* @author Andy Clement
3636
* @author Juergen Hoeller
37+
* @author Sam Brannen
3738
*/
38-
public class TemplateExpressionParsingTests extends AbstractExpressionTests {
39-
40-
public static final ParserContext DEFAULT_TEMPLATE_PARSER_CONTEXT = new ParserContext() {
41-
@Override
42-
public String getExpressionPrefix() {
43-
return "${";
44-
}
45-
@Override
46-
public String getExpressionSuffix() {
47-
return "}";
48-
}
49-
@Override
50-
public boolean isTemplate() {
51-
return true;
52-
}
53-
};
54-
55-
public static final ParserContext HASH_DELIMITED_PARSER_CONTEXT = new ParserContext() {
56-
@Override
57-
public String getExpressionPrefix() {
58-
return "#{";
59-
}
60-
@Override
61-
public String getExpressionSuffix() {
62-
return "}";
63-
}
64-
@Override
65-
public boolean isTemplate() {
66-
return true;
67-
}
68-
};
39+
class TemplateExpressionParsingTests extends AbstractExpressionTests {
40+
41+
static final ParserContext DOLLAR_SIGN_TEMPLATE_PARSER_CONTEXT = new TemplateParserContext("${", "}");
6942

7043

7144
@Test
72-
public void testParsingSimpleTemplateExpression01() throws Exception {
45+
void parsingSimpleTemplateExpression01() throws Exception {
7346
SpelExpressionParser parser = new SpelExpressionParser();
74-
Expression expr = parser.parseExpression("hello ${'world'}", DEFAULT_TEMPLATE_PARSER_CONTEXT);
47+
Expression expr = parser.parseExpression("hello ${'world'}", DOLLAR_SIGN_TEMPLATE_PARSER_CONTEXT);
7548
Object o = expr.getValue();
7649
assertThat(o.toString()).isEqualTo("hello world");
7750
}
7851

7952
@Test
80-
public void testParsingSimpleTemplateExpression02() throws Exception {
53+
void parsingSimpleTemplateExpression02() throws Exception {
8154
SpelExpressionParser parser = new SpelExpressionParser();
82-
Expression expr = parser.parseExpression("hello ${'to'} you", DEFAULT_TEMPLATE_PARSER_CONTEXT);
55+
Expression expr = parser.parseExpression("hello ${'to'} you", DOLLAR_SIGN_TEMPLATE_PARSER_CONTEXT);
8356
Object o = expr.getValue();
8457
assertThat(o.toString()).isEqualTo("hello to you");
8558
}
8659

8760
@Test
88-
public void testParsingSimpleTemplateExpression03() throws Exception {
61+
void parsingSimpleTemplateExpression03() throws Exception {
8962
SpelExpressionParser parser = new SpelExpressionParser();
9063
Expression expr = parser.parseExpression("The quick ${'brown'} fox jumped over the ${'lazy'} dog",
91-
DEFAULT_TEMPLATE_PARSER_CONTEXT);
64+
DOLLAR_SIGN_TEMPLATE_PARSER_CONTEXT);
9265
Object o = expr.getValue();
9366
assertThat(o.toString()).isEqualTo("The quick brown fox jumped over the lazy dog");
9467
}
9568

9669
@Test
97-
public void testParsingSimpleTemplateExpression04() throws Exception {
70+
void parsingSimpleTemplateExpression04() throws Exception {
9871
SpelExpressionParser parser = new SpelExpressionParser();
99-
Expression expr = parser.parseExpression("${'hello'} world", DEFAULT_TEMPLATE_PARSER_CONTEXT);
72+
Expression expr = parser.parseExpression("${'hello'} world", DOLLAR_SIGN_TEMPLATE_PARSER_CONTEXT);
10073
Object o = expr.getValue();
10174
assertThat(o.toString()).isEqualTo("hello world");
10275

103-
expr = parser.parseExpression("", DEFAULT_TEMPLATE_PARSER_CONTEXT);
76+
expr = parser.parseExpression("", DOLLAR_SIGN_TEMPLATE_PARSER_CONTEXT);
10477
o = expr.getValue();
10578
assertThat(o.toString()).isEqualTo("");
10679

107-
expr = parser.parseExpression("abc", DEFAULT_TEMPLATE_PARSER_CONTEXT);
80+
expr = parser.parseExpression("abc", DOLLAR_SIGN_TEMPLATE_PARSER_CONTEXT);
10881
o = expr.getValue();
10982
assertThat(o.toString()).isEqualTo("abc");
11083

111-
expr = parser.parseExpression("abc", DEFAULT_TEMPLATE_PARSER_CONTEXT);
84+
expr = parser.parseExpression("abc", DOLLAR_SIGN_TEMPLATE_PARSER_CONTEXT);
11285
o = expr.getValue((Object)null);
11386
assertThat(o.toString()).isEqualTo("abc");
11487
}
11588

11689
@Test
117-
public void testCompositeStringExpression() throws Exception {
90+
void compositeStringExpression() throws Exception {
11891
SpelExpressionParser parser = new SpelExpressionParser();
119-
Expression ex = parser.parseExpression("hello ${'world'}", DEFAULT_TEMPLATE_PARSER_CONTEXT);
92+
Expression ex = parser.parseExpression("hello ${'world'}", DOLLAR_SIGN_TEMPLATE_PARSER_CONTEXT);
12093
assertThat(ex.getValue()).isInstanceOf(String.class).isEqualTo("hello world");
12194
assertThat(ex.getValue(String.class)).isInstanceOf(String.class).isEqualTo("hello world");
12295
assertThat(ex.getValue((Object)null, String.class)).isInstanceOf(String.class).isEqualTo("hello world");
@@ -154,15 +127,15 @@ public void testCompositeStringExpression() throws Exception {
154127
static class Rooty {}
155128

156129
@Test
157-
public void testNestedExpressions() throws Exception {
130+
void nestedExpressions() throws Exception {
158131
SpelExpressionParser parser = new SpelExpressionParser();
159132
// treat the nested ${..} as a part of the expression
160-
Expression ex = parser.parseExpression("hello ${listOfNumbersUpToTen.$[#this<5]} world",DEFAULT_TEMPLATE_PARSER_CONTEXT);
133+
Expression ex = parser.parseExpression("hello ${listOfNumbersUpToTen.$[#this<5]} world",DOLLAR_SIGN_TEMPLATE_PARSER_CONTEXT);
161134
String s = ex.getValue(TestScenarioCreator.getTestEvaluationContext(),String.class);
162135
assertThat(s).isEqualTo("hello 4 world");
163136

164137
// not a useful expression but tests nested expression syntax that clashes with template prefix/suffix
165-
ex = parser.parseExpression("hello ${listOfNumbersUpToTen.$[#root.listOfNumbersUpToTen.$[#this%2==1]==3]} world",DEFAULT_TEMPLATE_PARSER_CONTEXT);
138+
ex = parser.parseExpression("hello ${listOfNumbersUpToTen.$[#root.listOfNumbersUpToTen.$[#this%2==1]==3]} world",DOLLAR_SIGN_TEMPLATE_PARSER_CONTEXT);
166139
assertThat(ex.getClass()).isEqualTo(CompositeStringExpression.class);
167140
CompositeStringExpression cse = (CompositeStringExpression)ex;
168141
Expression[] exprs = cse.getExpressions();
@@ -171,60 +144,59 @@ public void testNestedExpressions() throws Exception {
171144
s = ex.getValue(TestScenarioCreator.getTestEvaluationContext(),String.class);
172145
assertThat(s).isEqualTo("hello world");
173146

174-
ex = parser.parseExpression("hello ${listOfNumbersUpToTen.$[#this<5]} ${listOfNumbersUpToTen.$[#this>5]} world",DEFAULT_TEMPLATE_PARSER_CONTEXT);
147+
ex = parser.parseExpression("hello ${listOfNumbersUpToTen.$[#this<5]} ${listOfNumbersUpToTen.$[#this>5]} world",DOLLAR_SIGN_TEMPLATE_PARSER_CONTEXT);
175148
s = ex.getValue(TestScenarioCreator.getTestEvaluationContext(),String.class);
176149
assertThat(s).isEqualTo("hello 4 10 world");
177150

178151
assertThatExceptionOfType(ParseException.class).isThrownBy(() ->
179-
parser.parseExpression("hello ${listOfNumbersUpToTen.$[#this<5]} ${listOfNumbersUpToTen.$[#this>5] world",DEFAULT_TEMPLATE_PARSER_CONTEXT))
152+
parser.parseExpression("hello ${listOfNumbersUpToTen.$[#this<5]} ${listOfNumbersUpToTen.$[#this>5] world",DOLLAR_SIGN_TEMPLATE_PARSER_CONTEXT))
180153
.satisfies(pex -> assertThat(pex.getSimpleMessage()).isEqualTo("No ending suffix '}' for expression starting at character 41: ${listOfNumbersUpToTen.$[#this>5] world"));
181154

182155
assertThatExceptionOfType(ParseException.class).isThrownBy(() ->
183-
parser.parseExpression("hello ${listOfNumbersUpToTen.$[#root.listOfNumbersUpToTen.$[#this%2==1==3]} world",DEFAULT_TEMPLATE_PARSER_CONTEXT))
156+
parser.parseExpression("hello ${listOfNumbersUpToTen.$[#root.listOfNumbersUpToTen.$[#this%2==1==3]} world",DOLLAR_SIGN_TEMPLATE_PARSER_CONTEXT))
184157
.satisfies(pex -> assertThat(pex.getSimpleMessage()).isEqualTo("Found closing '}' at position 74 but most recent opening is '[' at position 30"));
185158
}
186159

187160
@Test
188-
189-
public void testClashingWithSuffixes() throws Exception {
161+
void clashingWithSuffixes() throws Exception {
190162
// Just wanting to use the prefix or suffix within the template:
191-
Expression ex = parser.parseExpression("hello ${3+4} world",DEFAULT_TEMPLATE_PARSER_CONTEXT);
163+
Expression ex = parser.parseExpression("hello ${3+4} world",DOLLAR_SIGN_TEMPLATE_PARSER_CONTEXT);
192164
String s = ex.getValue(TestScenarioCreator.getTestEvaluationContext(),String.class);
193165
assertThat(s).isEqualTo("hello 7 world");
194166

195-
ex = parser.parseExpression("hello ${3+4} wo${'${'}rld",DEFAULT_TEMPLATE_PARSER_CONTEXT);
167+
ex = parser.parseExpression("hello ${3+4} wo${'${'}rld",DOLLAR_SIGN_TEMPLATE_PARSER_CONTEXT);
196168
s = ex.getValue(TestScenarioCreator.getTestEvaluationContext(),String.class);
197169
assertThat(s).isEqualTo("hello 7 wo${rld");
198170

199-
ex = parser.parseExpression("hello ${3+4} wo}rld",DEFAULT_TEMPLATE_PARSER_CONTEXT);
171+
ex = parser.parseExpression("hello ${3+4} wo}rld",DOLLAR_SIGN_TEMPLATE_PARSER_CONTEXT);
200172
s = ex.getValue(TestScenarioCreator.getTestEvaluationContext(),String.class);
201173
assertThat(s).isEqualTo("hello 7 wo}rld");
202174
}
203175

204176
@Test
205-
public void testParsingNormalExpressionThroughTemplateParser() throws Exception {
177+
void parsingNormalExpressionThroughTemplateParser() throws Exception {
206178
Expression expr = parser.parseExpression("1+2+3");
207179
assertThat(expr.getValue()).isEqualTo(6);
208180
}
209181

210182
@Test
211-
public void testErrorCases() throws Exception {
183+
void errorCases() throws Exception {
212184
assertThatExceptionOfType(ParseException.class).isThrownBy(() ->
213-
parser.parseExpression("hello ${'world'", DEFAULT_TEMPLATE_PARSER_CONTEXT))
185+
parser.parseExpression("hello ${'world'", DOLLAR_SIGN_TEMPLATE_PARSER_CONTEXT))
214186
.satisfies(pex -> {
215187
assertThat(pex.getSimpleMessage()).isEqualTo("No ending suffix '}' for expression starting at character 6: ${'world'");
216188
assertThat(pex.getExpressionString()).isEqualTo("hello ${'world'");
217189
});
218190
assertThatExceptionOfType(ParseException.class).isThrownBy(() ->
219-
parser.parseExpression("hello ${'wibble'${'world'}", DEFAULT_TEMPLATE_PARSER_CONTEXT))
191+
parser.parseExpression("hello ${'wibble'${'world'}", DOLLAR_SIGN_TEMPLATE_PARSER_CONTEXT))
220192
.satisfies(pex -> assertThat(pex.getSimpleMessage()).isEqualTo("No ending suffix '}' for expression starting at character 6: ${'wibble'${'world'}"));
221193
assertThatExceptionOfType(ParseException.class).isThrownBy(() ->
222-
parser.parseExpression("hello ${} world", DEFAULT_TEMPLATE_PARSER_CONTEXT))
194+
parser.parseExpression("hello ${} world", DOLLAR_SIGN_TEMPLATE_PARSER_CONTEXT))
223195
.satisfies(pex -> assertThat(pex.getSimpleMessage()).isEqualTo("No expression defined within delimiter '${}' at character 6"));
224196
}
225197

226198
@Test
227-
public void testTemplateParserContext() {
199+
void templateParserContext() {
228200
TemplateParserContext tpc = new TemplateParserContext("abc","def");
229201
assertThat(tpc.getExpressionPrefix()).isEqualTo("abc");
230202
assertThat(tpc.getExpressionSuffix()).isEqualTo("def");

0 commit comments

Comments
 (0)