|
18 | 18 | import java.util.ArrayList;
|
19 | 19 | import java.util.List;
|
20 | 20 |
|
| 21 | +import org.springframework.expression.ParseException; |
21 | 22 | import org.springframework.expression.ParserContext;
|
22 | 23 | import org.springframework.util.Assert;
|
23 | 24 | import org.springframework.util.SystemPropertyUtils;
|
@@ -68,48 +69,50 @@ && findPlaceholderEndIndex(expressionString, expressionIndex) != expressionStrin
|
68 | 69 | return parseComposite(expressionString, placerholderIndex, expressionIndex);
|
69 | 70 | }
|
70 | 71 |
|
71 |
| - private CompositeValueExpression parseComposite(String expression, int placerholderIndex, int expressionIndex) { |
| 72 | + private CompositeValueExpression parseComposite(String expressionString, int placerholderIndex, int expressionIndex) { |
72 | 73 |
|
73 | 74 | List<ValueExpression> expressions = new ArrayList<>(PLACEHOLDER_PREFIX_LENGTH);
|
74 | 75 | int startIndex = getStartIndex(placerholderIndex, expressionIndex);
|
75 | 76 |
|
76 | 77 | if (startIndex != 0) {
|
77 |
| - expressions.add(new LiteralValueExpression(expression.substring(0, startIndex))); |
| 78 | + expressions.add(new LiteralValueExpression(expressionString.substring(0, startIndex))); |
78 | 79 | }
|
79 | 80 |
|
80 | 81 | while (startIndex != -1) {
|
81 | 82 |
|
82 |
| - int endIndex = findPlaceholderEndIndex(expression, startIndex); |
83 |
| - if (endIndex != -1) { |
| 83 | + int endIndex = findPlaceholderEndIndex(expressionString, startIndex); |
84 | 84 |
|
85 |
| - int afterClosingParenthesisIndex = endIndex + 1; |
86 |
| - String part = expression.substring(startIndex, afterClosingParenthesisIndex); |
| 85 | + if (endIndex == -1) { |
| 86 | + throw new ParseException(expressionString, startIndex, |
| 87 | + "No ending suffix '}' for expression starting at character %d: %s".formatted(startIndex, |
| 88 | + expressionString.substring(startIndex))); |
| 89 | + } |
87 | 90 |
|
88 |
| - if (part.startsWith(PLACEHOLDER_PREFIX)) { |
89 |
| - expressions.add(createPlaceholder(part)); |
90 |
| - } else { |
91 |
| - expressions.add(createExpression(part)); |
92 |
| - } |
| 91 | + int afterClosingParenthesisIndex = endIndex + 1; |
| 92 | + String part = expressionString.substring(startIndex, afterClosingParenthesisIndex); |
| 93 | + |
| 94 | + if (part.startsWith(PLACEHOLDER_PREFIX)) { |
| 95 | + expressions.add(createPlaceholder(part)); |
| 96 | + } else { |
| 97 | + expressions.add(createExpression(part)); |
| 98 | + } |
93 | 99 |
|
94 |
| - placerholderIndex = expression.indexOf(PLACEHOLDER_PREFIX, endIndex); |
95 |
| - expressionIndex = expression.indexOf(EXPRESSION_PREFIX, endIndex); |
| 100 | + placerholderIndex = expressionString.indexOf(PLACEHOLDER_PREFIX, endIndex); |
| 101 | + expressionIndex = expressionString.indexOf(EXPRESSION_PREFIX, endIndex); |
96 | 102 |
|
97 |
| - startIndex = getStartIndex(placerholderIndex, expressionIndex); |
| 103 | + startIndex = getStartIndex(placerholderIndex, expressionIndex); |
98 | 104 |
|
99 |
| - if (startIndex == -1) { |
100 |
| - // no next expression but we're capturing everything after the expression as literal. |
101 |
| - expressions.add(new LiteralValueExpression(expression.substring(afterClosingParenthesisIndex))); |
102 |
| - } else { |
103 |
| - // capture literal after the expression ends and before the next starts. |
104 |
| - expressions.add(new LiteralValueExpression(expression.substring(afterClosingParenthesisIndex, startIndex))); |
105 |
| - } |
| 105 | + if (startIndex == -1) { |
| 106 | + // no next expression but we're capturing everything after the expression as literal. |
| 107 | + expressions.add(new LiteralValueExpression(expressionString.substring(afterClosingParenthesisIndex))); |
106 | 108 | } else {
|
107 |
| - expressions.add(new LiteralValueExpression(expression.substring(startIndex))); |
108 |
| - startIndex = -1; |
| 109 | + // capture literal after the expression ends and before the next starts. |
| 110 | + expressions |
| 111 | + .add(new LiteralValueExpression(expressionString.substring(afterClosingParenthesisIndex, startIndex))); |
109 | 112 | }
|
110 | 113 | }
|
111 | 114 |
|
112 |
| - return new CompositeValueExpression(expression, expressions); |
| 115 | + return new CompositeValueExpression(expressionString, expressions); |
113 | 116 | }
|
114 | 117 |
|
115 | 118 | private static int getStartIndex(int placerholderIndex, int expressionIndex) {
|
|
0 commit comments