From ebae99fbf610c8802ee59c82dcf0bcf30588f6ad Mon Sep 17 00:00:00 2001 From: Jean-Charles Manoury Date: Thu, 3 Jan 2019 19:31:22 +0100 Subject: [PATCH] Manage default value in filters --- ...terInterpolatorFilterReaderLineEnding.java | 29 +++++++++++++++++-- ...nterpolatorFilterReaderLineEndingTest.java | 23 +++++++++++++++ 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEnding.java b/src/main/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEnding.java index 9cabefc..f514c02 100644 --- a/src/main/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEnding.java +++ b/src/main/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEnding.java @@ -69,6 +69,8 @@ public class MultiDelimiterInterpolatorFilterReaderLineEnding */ public static final String DEFAULT_END_TOKEN = "}"; + public static final char DEFAULT_DEFAULT_VALUE_TOKEN = ':'; + /** * true by default to preserve backward comp */ @@ -238,6 +240,7 @@ public int read() boolean inEscape = useEscape && ch == getEscapeString().charAt( 0 ); StringBuilder key = new StringBuilder(); + StringBuilder defaultValue = new StringBuilder(); // have we found an escape string? if ( inEscape ) @@ -341,6 +344,7 @@ public int read() int endTokenSize = endToken.length(); int end = endTokenSize; + boolean hasDefaultValue = false; do { if ( ch == -1 ) @@ -353,9 +357,24 @@ else if ( ch == '\n' && !supportMultiLineFiltering ) key.append( (char) ch ); break; } - - key.append( (char) ch ); - + + if (ch == DEFAULT_DEFAULT_VALUE_TOKEN) + { + // just ignore default value token + hasDefaultValue = true; + ch = in.read(); + continue; + } + + if (hasDefaultValue && ch != this.endToken.charAt( endTokenSize - end )) + { + defaultValue.append( (char) ch ); + } + else + { + key.append( (char) ch ); + } + if ( ch == this.endToken.charAt( endTokenSize - end ) ) { end--; @@ -386,10 +405,14 @@ else if ( ch == '\n' && !supportMultiLineFiltering ) if ( interpolateWithPrefixPattern ) { value = interpolator.interpolate( key.toString(), "", recursionInterceptor ); + if (value == null && hasDefaultValue) + value = defaultValue.toString(); } else { value = interpolator.interpolate( key.toString(), recursionInterceptor ); + if (value == null && hasDefaultValue) + value = defaultValue.toString(); } } catch ( InterpolationException e ) diff --git a/src/test/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEndingTest.java b/src/test/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEndingTest.java index 60ba6a2..2cccf4b 100644 --- a/src/test/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEndingTest.java +++ b/src/test/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEndingTest.java @@ -102,6 +102,8 @@ public void testLineWithSingleAtAndExpression() reader.setDelimiterSpecs( new HashSet( Arrays.asList( "${*}", "@" ) ) ); assertEquals( "toto@titi.com bar", IOUtil.toString( reader ) ); + + } // http://stackoverflow.com/questions/21786805/maven-war-plugin-customize-filter-delimitters-in-webresources/ @@ -121,4 +123,25 @@ public void testAtDollarExpression() assertEquals( " url=\"jdbc:oracle:thin:@DB_SERVER:DB_PORT:DB_NAME\"", IOUtil.toString( reader ) ); } + + @Test + public void testDefaultValue() + throws Exception + { + + Reader in = new StringReader( "toto@titi.com ${noValue:defaultValue}" ); + MultiDelimiterInterpolatorFilterReaderLineEnding reader = new MultiDelimiterInterpolatorFilterReaderLineEnding( in, interpolator, true ); + reader.setDelimiterSpecs( new HashSet( Arrays.asList( "${*}", "@" ) ) ); + + assertEquals( "defaultValue", IOUtil.toString( reader ) ); + + + when( interpolator.interpolate( eq( "${hasAValue}" ), eq( "" ), isA( RecursionInterceptor.class ) ) ).thenReturn( "42" ); + + in = new StringReader( "toto@titi.com ${hasAValue:defaultvalue}" ); + reader = new MultiDelimiterInterpolatorFilterReaderLineEnding( in, interpolator, true ); + reader.setDelimiterSpecs( new HashSet( Arrays.asList( "${*}", "@" ) ) ); + + assertEquals( "toto@titi.com 42", IOUtil.toString( reader ) ); + } }