From 00172f185b4df3ca0106bcca58f1275f9ca5a41a Mon Sep 17 00:00:00 2001 From: Florian Hussonnois Date: Thu, 18 Apr 2024 15:03:29 +0200 Subject: [PATCH] fix(core): VariableRenderer should expose alternativeRender --- .../kestra/core/runners/VariableRenderer.java | 26 +++++++++-- .../core/runners/VariableRendererTest.java | 43 +++++++++++++++++++ 2 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 core/src/test/java/io/kestra/core/runners/VariableRendererTest.java diff --git a/core/src/main/java/io/kestra/core/runners/VariableRenderer.java b/core/src/main/java/io/kestra/core/runners/VariableRenderer.java index 9c53af4787..2bea8e7609 100644 --- a/core/src/main/java/io/kestra/core/runners/VariableRenderer.java +++ b/core/src/main/java/io/kestra/core/runners/VariableRenderer.java @@ -99,10 +99,16 @@ public String renderOnce(String inline, Map variables) throws Il Writer writer = new JsonWriter(new StringWriter()); compiledTemplate.evaluate(writer, variables); result = writer.toString(); - } catch (IOException e) { - throw new IllegalVariableEvaluationException(e); - } catch (PebbleException e) { - throw properPebbleException(e); + } catch (IOException | PebbleException e) { + String alternativeRender = this.alternativeRender(e, inline, variables); + if (alternativeRender == null) { + if (e instanceof PebbleException) { + throw properPebbleException((PebbleException) e); + } + throw new IllegalVariableEvaluationException(e); + } else { + result = alternativeRender; + } } // post-process raw tags @@ -111,6 +117,18 @@ public String renderOnce(String inline, Map variables) throws Il return result; } + /** + * This method can be used in fallback for rendering an input string. + * + * @param e The exception that was throw by the default variable renderer. + * @param inline The expression to be rendered. + * @param variables The context variables. + * @return The rendered string. + */ + protected String alternativeRender(Exception e, String inline, Map variables) throws IllegalVariableEvaluationException { + return null; + } + private static String putBackRawTags(Map replacers, String result) { for (var entry : replacers.entrySet()) { result = result.replace(entry.getKey(), entry.getValue()); diff --git a/core/src/test/java/io/kestra/core/runners/VariableRendererTest.java b/core/src/test/java/io/kestra/core/runners/VariableRendererTest.java new file mode 100644 index 0000000000..539d62c2ee --- /dev/null +++ b/core/src/test/java/io/kestra/core/runners/VariableRendererTest.java @@ -0,0 +1,43 @@ +package io.kestra.core.runners; + +import io.kestra.core.exceptions.IllegalVariableEvaluationException; +import io.micronaut.context.ApplicationContext; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; +import jakarta.inject.Inject; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.Map; + +@MicronautTest +class VariableRendererTest { + + @Inject + ApplicationContext applicationContext; + + @Inject + VariableRenderer.VariableConfiguration variableConfiguration; + + @Test + void shouldRenderUsingAlternativeRendering() throws IllegalVariableEvaluationException { + TestVariableRenderer renderer = new TestVariableRenderer(applicationContext, variableConfiguration); + String render = renderer.render("{{ dummy }}", Map.of()); + Assertions.assertEquals("result", render); + } + + + public static class TestVariableRenderer extends VariableRenderer { + + public TestVariableRenderer(ApplicationContext applicationContext, + VariableConfiguration variableConfiguration) { + super(applicationContext, variableConfiguration); + } + + @Override + protected String alternativeRender(Exception e, String inline, Map variables) throws IllegalVariableEvaluationException { + return "result"; + } + } + + +} \ No newline at end of file