From e8e43bf91da43977fe350d6c415ead7a81e69a68 Mon Sep 17 00:00:00 2001 From: Francisco Javier Tirado Sarti Date: Mon, 4 Dec 2023 17:13:19 +0100 Subject: [PATCH] Fix #3307 - Easier string interpolation As proposed in the issue description, remove the need for initial quoutes in case of string interpolation --- .../org/kie/kogito/expr/jq/JqExpression.java | 28 ++++++++++++++++++- .../StaticFluentWorkflowApplicationTest.java | 14 ++++++++-- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/kogito-serverless-workflow/kogito-jq-expression/src/main/java/org/kie/kogito/expr/jq/JqExpression.java b/kogito-serverless-workflow/kogito-jq-expression/src/main/java/org/kie/kogito/expr/jq/JqExpression.java index d18b7f39eeb..06001ca4a88 100644 --- a/kogito-serverless-workflow/kogito-jq-expression/src/main/java/org/kie/kogito/expr/jq/JqExpression.java +++ b/kogito-serverless-workflow/kogito-jq-expression/src/main/java/org/kie/kogito/expr/jq/JqExpression.java @@ -46,6 +46,7 @@ import net.thisptr.jackson.jq.exception.JsonQueryException; import net.thisptr.jackson.jq.internal.javacc.ExpressionParser; import net.thisptr.jackson.jq.internal.tree.FunctionCall; +import net.thisptr.jackson.jq.internal.tree.StringInterpolation; import net.thisptr.jackson.jq.internal.tree.binaryop.BinaryOperatorExpression; public class JqExpression implements Expression { @@ -76,13 +77,38 @@ public JqExpression(Supplier scope, String expr, Version version) { this.expr = expr; this.scope = scope; try { - this.internalExpr = ExpressionParser.compile(expr, version); + this.internalExpr = compile(version); checkFunctionCall(internalExpr); } catch (JsonQueryException ex) { validationError = ex; } } + private net.thisptr.jackson.jq.Expression compile(Version version) throws JsonQueryException { + net.thisptr.jackson.jq.Expression expression; + try { + expression = ExpressionParser.compile(expr, version); + } catch (JsonQueryException ex) { + expression = handleStringInterpolation(version, ex); + } + checkFunctionCall(expression); + return expression; + } + + private net.thisptr.jackson.jq.Expression handleStringInterpolation(Version version, JsonQueryException ex) throws JsonQueryException { + if (!expr.startsWith("\"")) { + try { + net.thisptr.jackson.jq.Expression expression = ExpressionParser.compile("\"" + expr + "\"", version); + if (expression instanceof StringInterpolation) { + return expression; + } + } catch (JsonQueryException withQuotes) { + // ignoring it + } + } + throw ex; + } + private interface TypedOutput extends Output { Object getResult(); } diff --git a/kogito-serverless-workflow/kogito-serverless-workflow-executor-core/src/test/java/org/kie/kogito/serverless/workflow/executor/StaticFluentWorkflowApplicationTest.java b/kogito-serverless-workflow/kogito-serverless-workflow-executor-core/src/test/java/org/kie/kogito/serverless/workflow/executor/StaticFluentWorkflowApplicationTest.java index c187dc6f828..d96afcd2c9d 100644 --- a/kogito-serverless-workflow/kogito-serverless-workflow-executor-core/src/test/java/org/kie/kogito/serverless/workflow/executor/StaticFluentWorkflowApplicationTest.java +++ b/kogito-serverless-workflow/kogito-serverless-workflow-executor-core/src/test/java/org/kie/kogito/serverless/workflow/executor/StaticFluentWorkflowApplicationTest.java @@ -189,11 +189,21 @@ void testJava() { @Test void testInterpolation() { + interpolation("\"My name is \\(.name) and my surname is \\(.surname)\""); + } + + @Test + void testAbreviatedInterpolation() { + interpolation("My name is \\(.name) and my surname is \\(.surname)"); + } + + private void interpolation(String text) { final String INTERPOLATION = "interpolation"; try (StaticWorkflowApplication application = StaticWorkflowApplication.create()) { - Workflow workflow = workflow("PlayingWithExpression").function(expr(INTERPOLATION, "\"My name is \\(.name)\"")) + Workflow workflow = workflow("PlayingWithExpression").function(expr(INTERPOLATION, text)) .start(operation().action(call(INTERPOLATION))).end().build(); - assertThat(application.execute(workflow, Collections.singletonMap("name", "Javierito")).getWorkflowdata().get("response").asText()).isEqualTo("My name is Javierito"); + assertThat(application.execute(workflow, Map.of("name", "Javierito", "surname", "unknown")).getWorkflowdata().get("response").asText()) + .isEqualTo("My name is Javierito and my surname is unknown"); } }