Author: davsclaus Date: Mon Jan 2 07:57:23 2012 New Revision: 1226363 URL: http://svn.apache.org/viewvc?rev=1226363&view=rev Log: CAMEL-4848: Properties component should skip prefix and suffix tokens which are quoted
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/properties/DefaultPropertiesParser.java camel/trunk/camel-core/src/main/java/org/apache/camel/util/StringHelper.java camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentTest.java camel/trunk/camel-core/src/test/java/org/apache/camel/util/StringHelperTest.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/properties/DefaultPropertiesParser.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/properties/DefaultPropertiesParser.java?rev=1226363&r1=1226362&r2=1226363&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/component/properties/DefaultPropertiesParser.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/properties/DefaultPropertiesParser.java Mon Jan 2 07:57:23 2012 @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Properties; +import org.apache.camel.util.StringHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -57,8 +58,8 @@ public class DefaultPropertiesParser imp // okay all okay so add the replaced as visited visited.addAll(replaced); - // are we done yet - done = !answer.contains(prefixToken); + // we are done when we can no longer find any prefix tokens in the answer + done = findTokenPosition(answer, 0, prefixToken) == -1; } return answer; } @@ -74,7 +75,7 @@ public class DefaultPropertiesParser imp int pivot = 0; int size = uri.length(); while (pivot < size) { - int idx = uri.indexOf(prefixToken, pivot); + int idx = findTokenPosition(uri, pivot, prefixToken); if (idx < 0) { sb.append(createConstantPart(uri, pivot, size)); break; @@ -83,7 +84,7 @@ public class DefaultPropertiesParser imp sb.append(createConstantPart(uri, pivot, idx)); } pivot = idx + prefixToken.length(); - int endIdx = uri.indexOf(suffixToken, pivot); + int endIdx = findTokenPosition(uri, pivot, suffixToken); if (endIdx < 0) { throw new IllegalArgumentException("Expecting " + suffixToken + " but found end of string from text: " + uri); } @@ -115,7 +116,6 @@ public class DefaultPropertiesParser imp esb.append("(and original key [").append(key).append("]) "); } esb.append("not found in properties from text: ").append(uri); - throw new IllegalArgumentException(esb.toString()); } sb.append(part); @@ -124,6 +124,28 @@ public class DefaultPropertiesParser imp } return sb.toString(); } + + private int findTokenPosition(String uri, int pivot, String token) { + int idx = uri.indexOf(token, pivot); + while (idx > 0) { + // grab part as the previous char + token + next char, to test if the token is quoted + String part = null; + int len = idx + token.length() + 1; + if (uri.length() >= len) { + part = uri.substring(idx - 1, len); + } + if (StringHelper.isQuoted(part)) { + // the token was quoted, so regard it as a literal + // and then try to find from next position + pivot = idx + token.length() + 1; + idx = uri.indexOf(token, pivot); + } else { + // found token + return idx; + } + } + return idx; + } private String createConstantPart(String uri, int start, int end) { return uri.substring(start, end); Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/util/StringHelper.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/StringHelper.java?rev=1226363&r1=1226362&r2=1226363&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/util/StringHelper.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/util/StringHelper.java Mon Jan 2 07:57:23 2012 @@ -89,6 +89,21 @@ public final class StringHelper { } return s; } + + public static boolean isQuoted(String s) { + if (ObjectHelper.isEmpty(s)) { + return false; + } + + if (s.startsWith("'") && s.endsWith("'")) { + return true; + } + if (s.startsWith("\"") && s.endsWith("\"")) { + return true; + } + + return false; + } /** * Encodes the text into safe XML by replacing < > and & with XML tokens Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentTest.java?rev=1226363&r1=1226362&r2=1226363&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentTest.java Mon Jan 2 07:57:23 2012 @@ -464,6 +464,16 @@ public class PropertiesComponentTest ext assertMockEndpointsSatisfied(); } + + public void testQuotedPrefix() throws Exception { + assertEquals("mock", context.resolvePropertyPlaceholders("{{cool.mock}}")); + assertEquals("'{{' + something + '}}'", context.resolvePropertyPlaceholders("'{{' + something + '}}'")); + assertEquals("\"{{\" + something + \"}}\"", context.resolvePropertyPlaceholders("\"{{\" + something + \"}}\"")); + assertEquals("mock'", context.resolvePropertyPlaceholders("{{cool.mock}}'")); + assertEquals("mock\"", context.resolvePropertyPlaceholders("{{cool.mock}}\"")); + assertEquals("'mock", context.resolvePropertyPlaceholders("'{{cool.mock}}")); + assertEquals("\"mock", context.resolvePropertyPlaceholders("\"{{cool.mock}}")); + } @Override protected CamelContext createCamelContext() throws Exception { Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/util/StringHelperTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/util/StringHelperTest.java?rev=1226363&r1=1226362&r2=1226363&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/util/StringHelperTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/util/StringHelperTest.java Mon Jan 2 07:57:23 2012 @@ -95,5 +95,23 @@ public class StringHelperTest extends Te assertEquals(true, StringHelper.hasStartToken("${body}", "foo")); assertEquals(true, StringHelper.hasStartToken("$foo{body}", "foo")); } + + public void testIsQuoted() throws Exception { + assertEquals(false, StringHelper.isQuoted(null)); + assertEquals(false, StringHelper.isQuoted("")); + assertEquals(false, StringHelper.isQuoted(" ")); + assertEquals(false, StringHelper.isQuoted("abc")); + assertEquals(false, StringHelper.isQuoted("abc'")); + assertEquals(false, StringHelper.isQuoted("\"abc'")); + assertEquals(false, StringHelper.isQuoted("abc\"")); + assertEquals(false, StringHelper.isQuoted("'abc\"")); + assertEquals(false, StringHelper.isQuoted("\"abc'")); + assertEquals(false, StringHelper.isQuoted("abc'def'")); + assertEquals(false, StringHelper.isQuoted("abc'def'ghi")); + assertEquals(false, StringHelper.isQuoted("'def'ghi")); + + assertEquals(true, StringHelper.isQuoted("'abc'")); + assertEquals(true, StringHelper.isQuoted("\"abc\"")); + } }