This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch camel-3.7.x in repository https://gitbox.apache.org/repos/asf/camel.git
commit aa54cad66a636e207452e503526feaba2d8d8ac6 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Wed Oct 13 14:33:45 2021 +0200 CAMEL-17073: Fixed simple language caching bug. --- .../modules/languages/pages/simple-language.adoc | 8 +--- .../camel/language/simple/SimpleLanguage.java | 43 +++++++++++++++++----- .../camel/language/simple/SimpleTokenizer.java | 14 +++++++ .../language/simple/SimpleCacheExpressionTest.java | 5 +-- 4 files changed, 50 insertions(+), 20 deletions(-) diff --git a/core/camel-core-languages/src/main/docs/modules/languages/pages/simple-language.adoc b/core/camel-core-languages/src/main/docs/modules/languages/pages/simple-language.adoc index 6e98a0b..e28a7fb 100644 --- a/core/camel-core-languages/src/main/docs/modules/languages/pages/simple-language.adoc +++ b/core/camel-core-languages/src/main/docs/modules/languages/pages/simple-language.adoc @@ -471,19 +471,13 @@ function, otherwise parsed as literal. |-- |To decrement a number by one. The left hand side must be a function, otherwise parsed as literal. -|\ |To escape a value, eg \$, to indicate a $ sign. -Special: Use \n for new line, \t for tab, and \r for carriage return. -*Notice:* Escaping is *not* supported using the -xref:file-language.adoc[File Language]. *Notice:* The escape character is not supported, use the -following three special escaping instead. - |\n |To use newline character. |\t |To use tab character. |\r |To use carriage return character. -|\} |To use the } character as text +|\} |To use the } character as text. This may be needed when building a JSon structure with the simple language. |=== And the following logical operators can be used to group expressions: diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java index 4e67a11..6f910d0 100644 --- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java +++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java @@ -166,13 +166,18 @@ public class SimpleLanguage extends LanguageSupport implements StaticService { public Expression createExpression(String expression) { ObjectHelper.notNull(expression, "expression"); - Expression answer = cacheExpression != null ? cacheExpression.get(expression) : null; - if (answer == null) { + Expression answer = null; + + // only lookup in cache if there are functions or special escape tokens + boolean function = hasSimpleFunction(expression) || hasEscapeToken(expression); + if (function && cacheExpression != null) { + answer = cacheExpression.get(expression); + } + if (answer == null) { if (isDynamicResource(expression)) { // we need to load the resource dynamic based on evaluating the expression via the exchange - // so create an embedded expression as result - // need to lazy eval as its a dynamic resource + // so create an embedded expression as result need to lazy eval due to dynamic resource final String text = expression; return new Expression() { @Override @@ -191,18 +196,28 @@ public class SimpleLanguage extends LanguageSupport implements StaticService { } if (isStaticResource(expression)) { + // load static resource and re-eval if there are functions expression = loadResource(expression); + function = hasSimpleFunction(expression) || hasEscapeToken(expression); } - SimpleExpressionParser parser - = new SimpleExpressionParser(getCamelContext(), expression, allowEscape, cacheExpression); - answer = parser.parseExpression(); + // only parse if there are simple functions + if (function) { + SimpleExpressionParser parser + = new SimpleExpressionParser(getCamelContext(), expression, allowEscape, cacheExpression); + answer = parser.parseExpression(); - if (cacheExpression != null && answer != null) { - cacheExpression.put(expression, answer); + if (cacheExpression != null && answer != null) { + cacheExpression.put(expression, answer); + } } } + if (answer == null) { + // it has no functions so its static text + answer = ExpressionBuilder.constantExpression(expression); + } + return answer; } @@ -269,4 +284,14 @@ public class SimpleLanguage extends LanguageSupport implements StaticService { return SimpleTokenizer.hasFunctionStartToken(expression); } + /** + * Does the expression include an escape tokens. + * + * @param expression the expression + * @return <tt>true</tt> if one or more escape tokens is included in the expression + */ + public static boolean hasEscapeToken(String expression) { + return SimpleTokenizer.hasEscapeToken(expression); + } + } diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleTokenizer.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleTokenizer.java index 55a0c21..8900de0 100644 --- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleTokenizer.java +++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleTokenizer.java @@ -113,6 +113,20 @@ public final class SimpleTokenizer { } /** + * Does the expression include an escape tokens. + * + * @param expression the expression + * @return <tt>true</tt> if one or more escape tokens is included in the expression + */ + public static boolean hasEscapeToken(String expression) { + if (expression != null) { + return expression.contains("\\n") || expression.contains("\\t") || expression.contains("\\r") + || expression.contains("\\}"); + } + return false; + } + + /** * Create the next token * * @param expression the input expression diff --git a/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleCacheExpressionTest.java b/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleCacheExpressionTest.java index 898aab9..c8d84ab 100644 --- a/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleCacheExpressionTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleCacheExpressionTest.java @@ -19,10 +19,7 @@ package org.apache.camel.language.simple; import org.apache.camel.LanguageTestSupport; import org.junit.jupiter.api.Test; -/** - * - */ -public class SimpleCacheExpressionTest extends LanguageTestSupport { +public class SimpleCacheExpressionTest extends LanguageTestSupport { @Override protected String getLanguageName() {