Skip to content

Commit 041e6bc

Browse files
committed
Pass delimiter information to ValueSource
This closes #76
1 parent 1ffe34b commit 041e6bc

8 files changed

+130
-12
lines changed

src/main/java/org/codehaus/plexus/interpolation/AbstractDelegatingValueSource.java

+8
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,22 @@ protected ValueSource getDelegate() {
3434
return delegate;
3535
}
3636

37+
@Override
38+
public Object getValue(String expression, String delimiterStart, String delimiterEnd) {
39+
return getDelegate().getValue(expression, delimiterStart, delimiterEnd);
40+
}
41+
42+
@Override
3743
public Object getValue(String expression) {
3844
return getDelegate().getValue(expression);
3945
}
4046

47+
@Override
4148
public void clearFeedback() {
4249
delegate.clearFeedback();
4350
}
4451

52+
@Override
4553
public List getFeedback() {
4654
return delegate.getFeedback();
4755
}

src/main/java/org/codehaus/plexus/interpolation/RegexBasedInterpolator.java

+33-9
Original file line numberDiff line numberDiff line change
@@ -177,23 +177,36 @@ public String interpolate(String input, String thisPrefixPattern, RecursionInter
177177

178178
int realExprGroup = 2;
179179
Pattern expressionPattern;
180+
final String expressionDelimiterStart;
181+
final String expressionDelimiterEnd;
180182
if (startRegex != null || endRegex != null) {
181183
if (thisPrefixPattern == null) {
182184
expressionPattern = getPattern(startRegex + endRegex);
183185
realExprGroup = 1;
184186
} else {
185187
expressionPattern = getPattern(startRegex + thisPrefixPattern + endRegex);
186188
}
189+
expressionDelimiterStart = startRegex;
190+
expressionDelimiterEnd = endRegex;
187191

188-
} else if (thisPrefixPattern != null) {
189-
expressionPattern = getPattern("\\$\\{(" + thisPrefixPattern + ")?(.+?)\\}");
190192
} else {
191-
expressionPattern = getPattern(DEFAULT_REGEXP);
192-
realExprGroup = 1;
193+
expressionDelimiterStart = "${";
194+
expressionDelimiterEnd = "}";
195+
if (thisPrefixPattern != null) {
196+
expressionPattern = getPattern("\\$\\{(" + thisPrefixPattern + ")?(.+?)\\}");
197+
} else {
198+
expressionPattern = getPattern(DEFAULT_REGEXP);
199+
realExprGroup = 1;
200+
}
193201
}
194-
195202
try {
196-
return interpolate(input, recursionInterceptor, expressionPattern, realExprGroup);
203+
return interpolate(
204+
input,
205+
recursionInterceptor,
206+
expressionPattern,
207+
expressionDelimiterStart,
208+
expressionDelimiterEnd,
209+
realExprGroup);
197210
} finally {
198211
if (!cacheAnswers) {
199212
clearAnswers();
@@ -228,7 +241,12 @@ private Pattern getPattern(String regExp) {
228241
* @todo Ensure unresolvable expressions don't trigger infinite recursion.
229242
*/
230243
private String interpolate(
231-
String input, RecursionInterceptor recursionInterceptor, Pattern expressionPattern, int realExprGroup)
244+
String input,
245+
RecursionInterceptor recursionInterceptor,
246+
Pattern expressionPattern,
247+
String expressionDelimiterStart,
248+
String expressionDelimiterEnd,
249+
int realExprGroup)
232250
throws InterpolationException {
233251
if (input == null) {
234252
// return empty String to prevent NPE too
@@ -256,11 +274,17 @@ private String interpolate(
256274
for (ValueSource vs : valueSources) {
257275
if (value != null) break;
258276

259-
value = vs.getValue(realExpr);
277+
value = vs.getValue(realExpr, expressionDelimiterStart, expressionDelimiterEnd);
260278
}
261279

262280
if (value != null) {
263-
value = interpolate(String.valueOf(value), recursionInterceptor, expressionPattern, realExprGroup);
281+
value = interpolate(
282+
String.valueOf(value),
283+
recursionInterceptor,
284+
expressionPattern,
285+
expressionDelimiterStart,
286+
expressionDelimiterEnd,
287+
realExprGroup);
264288

265289
if (postProcessors != null && !postProcessors.isEmpty()) {
266290
for (InterpolationPostProcessor postProcessor : postProcessors) {

src/main/java/org/codehaus/plexus/interpolation/StringSearchInterpolator.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ private String interpolate(String input, RecursionInterceptor recursionIntercept
163163
if (value != null) {
164164
break;
165165
}
166-
value = valueSource.getValue(realExpr);
166+
value = valueSource.getValue(realExpr, startExpr, endExpr);
167167

168168
if (value != null && value.toString().contains(wholeExpr)) {
169169
bestAnswer = value;

src/main/java/org/codehaus/plexus/interpolation/ValueSource.java

+14-1
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,21 @@
2525
public interface ValueSource {
2626

2727
/**
28+
* Returns a value resolved from an expression. The return value is recursively resolved via {@link Interpolator#interpolate(String)}, i.e. might contain expressions as well.
2829
* @param expression The string expression.
29-
* @return the value related to the expression, or null if not found.
30+
* @param expressionStartDelimiter A valid start delimiter of the expression to be used with the calling {@link Interpolator} (by default <code>${</code>).
31+
* @param expressionEndDelimiter A valid end delimiter of the expression to be used with the calling {@link Interpolator} (by default <code>}</code>).
32+
* @return the value related to the expression, or {@code null} if not found. This value might contain other expressions separated by {@code expressionStartDelimiter} and {@code expressionEndDelimiter}
33+
* @since 1.28
34+
*/
35+
default Object getValue(String expression, String expressionStartDelimiter, String expressionEndDelimiter) {
36+
return getValue(expression);
37+
}
38+
39+
/**
40+
* @param expression The string expression.
41+
* @return the value related to the expression, or {@code null} if not found.
42+
* @see #getValue(String, String, String)
3043
*/
3144
public Object getValue(String expression);
3245

src/main/java/org/codehaus/plexus/interpolation/multi/MultiDelimiterStringSearchInterpolator.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ private String interpolate(String input, RecursionInterceptor recursionIntercept
201201
for (ValueSource vs : valueSources) {
202202
if (value != null) break;
203203

204-
value = vs.getValue(realExpr);
204+
value = vs.getValue(realExpr, startExpr, endExpr);
205205

206206
if (value != null && value.toString().contains(wholeExpr)) {
207207
bestAnswer = value;

src/test/java/org/codehaus/plexus/interpolation/RegexBasedInterpolatorTest.java

+22
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,28 @@ public void testShouldResolveByContextValue() throws InterpolationException {
8080
assertEquals("this is a testVar", result);
8181
}
8282

83+
@Test
84+
public void testDelimitersPassedToValueSource() throws InterpolationException {
85+
RegexBasedInterpolator interpolator = new RegexBasedInterpolator();
86+
interpolator.addValueSource(new AbstractValueSource(false) {
87+
88+
@Override
89+
public Object getValue(String expression, String expressionStartDelimiter, String expressionEndDelimiter) {
90+
assertEquals("${", expressionStartDelimiter);
91+
assertEquals("}", expressionEndDelimiter);
92+
return expression;
93+
}
94+
95+
@Override
96+
public Object getValue(String expression) {
97+
fail("This method is not supposed to be called");
98+
return null;
99+
}
100+
});
101+
102+
assertEquals("test", interpolator.interpolate("${test}"));
103+
}
104+
83105
@Test
84106
public void testShouldResolveByEnvar() throws IOException, InterpolationException {
85107
OperatingSystemUtils.setEnvVarSource(new OperatingSystemUtils.EnvVarSource() {

src/test/java/org/codehaus/plexus/interpolation/StringSearchInterpolatorTest.java

+24
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,30 @@ public void testLongDelimitersWithNoContext() throws InterpolationException {
9494
assertEquals(result, interpolator.interpolate(src));
9595
}
9696

97+
@Test
98+
public void testLongDelimitersPassedToValueSource() throws InterpolationException {
99+
String src = "<expression>test</expression>";
100+
101+
StringSearchInterpolator interpolator = new StringSearchInterpolator("<expression>", "</expression>");
102+
interpolator.addValueSource(new AbstractValueSource(false) {
103+
104+
@Override
105+
public Object getValue(String expression, String expressionStartDelimiter, String expressionEndDelimiter) {
106+
assertEquals("<expression>", expressionStartDelimiter);
107+
assertEquals("</expression>", expressionEndDelimiter);
108+
return expression;
109+
}
110+
111+
@Override
112+
public Object getValue(String expression) {
113+
fail("This method is not supposed to be called");
114+
return null;
115+
}
116+
});
117+
118+
assertEquals("test", interpolator.interpolate(src));
119+
}
120+
97121
@Test
98122
public void testSimpleSubstitution() throws InterpolationException {
99123
Properties p = new Properties();

src/test/java/org/codehaus/plexus/interpolation/multi/MultiDelimiterStringSearchInterpolatorTest.java

+27
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@
1919
import java.util.HashMap;
2020
import java.util.Map;
2121

22+
import org.codehaus.plexus.interpolation.AbstractValueSource;
2223
import org.codehaus.plexus.interpolation.InterpolationException;
2324
import org.codehaus.plexus.interpolation.MapBasedValueSource;
2425
import org.codehaus.plexus.interpolation.ValueSource;
2526
import org.junit.jupiter.api.Test;
2627

2728
import static org.junit.jupiter.api.Assertions.assertEquals;
29+
import static org.junit.jupiter.api.Assertions.fail;
2830

2931
public class MultiDelimiterStringSearchInterpolatorTest {
3032

@@ -119,4 +121,29 @@ public void testInterpolationWithMultipleEscapes3() throws InterpolationExceptio
119121

120122
assertEquals("##${first} and #${second} and beer", result);
121123
}
124+
125+
@Test
126+
public void testDelimitersPassedToValueSource() throws InterpolationException {
127+
ValueSource vs = new AbstractValueSource(false) {
128+
129+
@Override
130+
public Object getValue(String expression, String expressionStartDelimiter, String expressionEndDelimiter) {
131+
assertEquals("#(", expressionStartDelimiter);
132+
assertEquals(")", expressionEndDelimiter);
133+
return expression;
134+
}
135+
136+
@Override
137+
public Object getValue(String expression) {
138+
fail("This method is not supposed to be called");
139+
return null;
140+
}
141+
};
142+
MultiDelimiterStringSearchInterpolator interpolator = new MultiDelimiterStringSearchInterpolator() //
143+
.withValueSource(vs) //
144+
.escapeString("#");
145+
interpolator.addDelimiterSpec("#(*)");
146+
147+
assertEquals("test", interpolator.interpolate("#(test)"));
148+
}
122149
}

0 commit comments

Comments
 (0)