From fb7f8724e111ece5dc8262db556edfb93a13b82b Mon Sep 17 00:00:00 2001 From: Martin Kouba Date: Wed, 24 Jun 2020 12:40:36 +0200 Subject: [PATCH] Qute - result mappers may throw an exception - handle this situation correctly - this is related to #10209 --- .../main/java/io/quarkus/qute/Futures.java | 2 +- .../java/io/quarkus/qute/IfSectionHelper.java | 2 +- .../java/io/quarkus/qute/TemplateImpl.java | 8 +++-- .../io/quarkus/qute/UserTagSectionHelper.java | 2 +- .../test/java/io/quarkus/qute/SimpleTest.java | 31 ++++++++++++++----- 5 files changed, 32 insertions(+), 13 deletions(-) diff --git a/independent-projects/qute/core/src/main/java/io/quarkus/qute/Futures.java b/independent-projects/qute/core/src/main/java/io/quarkus/qute/Futures.java index cdf2c1976b3c8..42e0afef36685 100644 --- a/independent-projects/qute/core/src/main/java/io/quarkus/qute/Futures.java +++ b/independent-projects/qute/core/src/main/java/io/quarkus/qute/Futures.java @@ -38,7 +38,7 @@ static CompletionStage> evaluateParams(Map evaluateNext(SectionResolutionContext context, Object va localValue = null; } val = operator.evaluate(localValue, r); - } catch (Exception e) { + } catch (Throwable e) { result.completeExceptionally(e); throw e; } diff --git a/independent-projects/qute/core/src/main/java/io/quarkus/qute/TemplateImpl.java b/independent-projects/qute/core/src/main/java/io/quarkus/qute/TemplateImpl.java index 2ec9ad3b42232..344df8a10c23a 100644 --- a/independent-projects/qute/core/src/main/java/io/quarkus/qute/TemplateImpl.java +++ b/independent-projects/qute/core/src/main/java/io/quarkus/qute/TemplateImpl.java @@ -103,8 +103,12 @@ private CompletionStage renderData(Object data, Consumer consumer) result.completeExceptionally(t); } else { // Sync processing of the result tree - build the output - r.process(consumer); - result.complete(null); + try { + r.process(consumer); + result.complete(null); + } catch (Throwable e) { + result.completeExceptionally(e); + } } }); return result; diff --git a/independent-projects/qute/core/src/main/java/io/quarkus/qute/UserTagSectionHelper.java b/independent-projects/qute/core/src/main/java/io/quarkus/qute/UserTagSectionHelper.java index 736e2b102822e..670c779140be0 100644 --- a/independent-projects/qute/core/src/main/java/io/quarkus/qute/UserTagSectionHelper.java +++ b/independent-projects/qute/core/src/main/java/io/quarkus/qute/UserTagSectionHelper.java @@ -39,7 +39,7 @@ public CompletionStage resolve(SectionResolutionContext context) { result.complete(r2); } }); - } catch (Exception e) { + } catch (Throwable e) { result.completeExceptionally(e); } diff --git a/independent-projects/qute/core/src/test/java/io/quarkus/qute/SimpleTest.java b/independent-projects/qute/core/src/test/java/io/quarkus/qute/SimpleTest.java index 089aab2f5d85c..4f9a932fbd7c4 100644 --- a/independent-projects/qute/core/src/test/java/io/quarkus/qute/SimpleTest.java +++ b/independent-projects/qute/core/src/test/java/io/quarkus/qute/SimpleTest.java @@ -1,6 +1,7 @@ package io.quarkus.qute; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; import io.quarkus.qute.Results.Result; import io.quarkus.qute.TemplateNode.Origin; @@ -161,10 +162,6 @@ public String map(Object result, Expression expression) { } }).addResultMapper(new ResultMapper() { - public int getPriority() { - return 1; - } - public boolean appliesTo(Origin origin, Object val) { return val.equals(Result.NOT_FOUND); } @@ -175,10 +172,6 @@ public String map(Object result, Expression expression) { } }).addResultMapper(new ResultMapper() { - public int getPriority() { - return 1; - } - public boolean appliesTo(Origin origin, Object val) { return val instanceof Collection; } @@ -193,4 +186,26 @@ public String map(Object result, Expression expression) { .render(Collections.emptyList())); } + @Test + public void testNotFoundThrowException() { + try { + Engine.builder().addDefaults() + .addResultMapper(new ResultMapper() { + + public boolean appliesTo(Origin origin, Object val) { + return val.equals(Result.NOT_FOUND); + } + + @Override + public String map(Object result, Expression expression) { + throw new IllegalStateException("Not found: " + expression.toOriginalString()); + } + }).build() + .parse("{foo}") + .render(); + fail(); + } catch (IllegalStateException expected) { + assertEquals("Not found: foo", expected.getMessage()); + } + } }