public TemplateError withScopeDepth(int scopeDepth) { return new TemplateError(getSeverity(), getReason(), getItem(), getMessage(), getFieldName(), getLineno(), getStartPosition(), getException(), getCategory(), getCategoryErrors(), scopeDepth); }
@Test public void itShowsFieldNameForSyntaxError() { TemplateError e = TemplateError.fromException(new TemplateSyntaxException("da codez", "{{ lolo lolo }}", 11)); assertThat(e.getFieldName()).isEqualTo("da codez"); }
@Test public void itShowsFriendlyNameOfBaseObjectForPropNotFound() { TemplateError e = TemplateError.fromUnknownProperty(new Object(), "foo", 123, 4); assertThat(e.getMessage()).isEqualTo("Cannot resolve property 'foo' in 'Object'"); }
@Override public Component getComponent() { final StringBuilder message = new StringBuilder(); for (TemplateError error : this.errors) { message.append(error.getSeverity()) .append(": ") .append(error.getMessage()) .append("@") .append(error.getLineno()) .append("\n"); // NMS-8660: Retrieve the full stack trace from the underlying exception if available if (error.getException() != null) { StringWriter stackTraceStringWriter = new StringWriter(); PrintWriter stackTracePrintWriter = new PrintWriter(stackTraceStringWriter); error.getException().printStackTrace(stackTracePrintWriter); message.append(stackTraceStringWriter.toString()); message.append("\n"); } } return new Label(message.toString(), ContentMode.PREFORMATTED); }
@Test public void itBlocksDisabledTags() { Map<Context.Library, Set<String>> disabled = ImmutableMap.of(Context.Library.TAG, ImmutableSet.of("raw")); assertThat(interpreter.render("{% raw %}foo{% endraw %}")).isEqualTo("foo"); try (JinjavaInterpreter.InterpreterScopeClosable c = interpreter.enterScope(disabled)) { interpreter.render("{% raw %} foo {% endraw %}"); } TemplateError e = interpreter.getErrorsCopy().get(0); assertThat(e.getItem()).isEqualTo(ErrorItem.TAG); assertThat(e.getReason()).isEqualTo(ErrorReason.DISABLED); assertThat(e.getMessage()).contains("'raw' is disabled in this context"); }
@Test public void unknownProperty() { interpreter.resolveELExpression("foo", 23); assertThat(interpreter.getErrorsCopy()).isEmpty(); context.put("foo", new Object()); interpreter.resolveELExpression("foo.bar", 23); assertThat(interpreter.getErrorsCopy()).hasSize(1); TemplateError e = interpreter.getErrorsCopy().get(0); assertThat(e.getReason()).isEqualTo(ErrorReason.UNKNOWN); assertThat(e.getLineno()).isEqualTo(23); assertThat(e.getFieldName()).isEqualTo("bar"); assertThat(e.getMessage()).contains("Cannot resolve property 'bar'"); }
private static String generateMessage(Collection<TemplateError> errors) { if (errors.isEmpty()) { throw new IllegalArgumentException("FatalTemplateErrorsException should have at least one error"); } return errors.iterator().next().getMessage(); }
@Test public void itReturnsCorrectSyntaxErrorPositions() { assertThat(interpreter.render("hi {{ missing thing }}{{ missing thing }}\nI am {{ blah blabbity }} too")).isEqualTo("hi \nI am too"); assertThat(interpreter.getErrorsCopy().size()).isEqualTo(3); assertThat(interpreter.getErrorsCopy().get(0).getLineno()).isEqualTo(1); assertThat(interpreter.getErrorsCopy().get(0).getMessage()).contains("position 14"); assertThat(interpreter.getErrorsCopy().get(0).getStartPosition()).isEqualTo(14); assertThat(interpreter.getErrorsCopy().get(0).getFieldName()).isEqualTo("thing"); assertThat(interpreter.getErrorsCopy().get(1).getLineno()).isEqualTo(1); assertThat(interpreter.getErrorsCopy().get(1).getMessage()).contains("position 33"); assertThat(interpreter.getErrorsCopy().get(1).getStartPosition()).isEqualTo(33); assertThat(interpreter.getErrorsCopy().get(1).getFieldName()).isEqualTo("thing"); assertThat(interpreter.getErrorsCopy().get(2).getLineno()).isEqualTo(2); assertThat(interpreter.getErrorsCopy().get(2).getMessage()).contains("position 13"); assertThat(interpreter.getErrorsCopy().get(2).getStartPosition()).isEqualTo(13); assertThat(interpreter.getErrorsCopy().get(2).getFieldName()).isEqualTo("blabbity"); }
@Test public void syntaxError() { interpreter.resolveELExpression("(*&W", 123); assertThat(interpreter.getErrorsCopy()).hasSize(1); TemplateError e = interpreter.getErrorsCopy().get(0); assertThat(e.getReason()).isEqualTo(ErrorReason.SYNTAX_ERROR); assertThat(e.getLineno()).isEqualTo(123); assertThat(e.getMessage()).contains("invalid character"); }
@Test public void blackListedProperties() { context.put("myobj", new MyClass(new Date(0))); interpreter.resolveELExpression("myobj.class.methods[0]", -1); assertThat(interpreter.getErrorsCopy()).isNotEmpty(); TemplateError e = interpreter.getErrorsCopy().get(0); assertThat(e.getReason()).isEqualTo(ErrorReason.UNKNOWN); assertThat(e.getFieldName()).isEqualTo("class"); assertThat(e.getMessage()).contains("Cannot resolve property 'class'"); }
@Test public void invalidIdentifierAssignmentExpr() { assertThat(val("content = 'Custom/Email/Responsive/testing.html'")).isEqualTo(""); assertThat(interpreter.getErrorsCopy()).isNotEmpty(); assertThat(interpreter.getErrorsCopy().get(0).getReason()).isEqualTo(ErrorReason.SYNTAX_ERROR); assertThat(interpreter.getErrorsCopy().get(0).getMessage()).containsIgnoringCase("'='"); }
@Test public void invalidPipeOperatorExpr() { assertThat(val("topics|1")).isEqualTo(""); assertThat(interpreter.getErrorsCopy()).isNotEmpty(); assertThat(interpreter.getErrorsCopy().get(0).getReason()).isEqualTo(ErrorReason.SYNTAX_ERROR); }
@Test public void testAttrNotFound() { Map<String, Object> context = new HashMap<>(); context.put("foo", new MyFoo()); RenderResult renderResult = jinjava.renderForResult("{{ foo|attr(\"barf\") }}", context); assertThat(renderResult.getOutput()).isEmpty(); assertThat(renderResult.getErrors()).hasSize(1); assertThat(renderResult.getErrors().get(0).getReason()).isEqualTo(ErrorReason.UNKNOWN); assertThat(renderResult.getErrors().get(0).getFieldName()).isEqualTo("barf"); }
@Test public void itAvoidsSimpleExtendsCycles() throws IOException { try { jinjava.render(locator.fixture("extends-self.jinja"), new HashMap<String, Object>()); fail("expected extends tag cycle exception"); } catch (FatalTemplateErrorsException e) { TagCycleException cycleException = (TagCycleException) e.getErrors().iterator().next().getException(); assertThat(cycleException.getPath()).isEqualTo("extends-self.jinja"); } }
@Test public void importedCycleDected() { fixture("from-recursion"); assertTrue(interpreter.getErrorsCopy().stream() .anyMatch(e -> e.getCategory() == BasicTemplateErrorCategory.FROM_CYCLE_DETECTED)); }
@Test public void itSetsFieldNameCaseForSyntaxErrorInFor() { RenderResult renderResult = new Jinjava().renderForResult("{% for item inna navigation %}{% endfor %}", ImmutableMap.of()); assertThat(renderResult.getErrors().get(0).getFieldName()).isEqualTo("item inna navigation"); }
/** * Render the given template using the given context bindings. * * @param template * jinja source template * @param bindings * map of objects to put into scope for this rendering action * @return the rendered template * @throws InterpretException * if any syntax errors were encountered during rendering */ public String render(String template, Map<String, ?> bindings) { RenderResult result = renderForResult(template, bindings); List<TemplateError> fatalErrors = result.getErrors().stream() .filter(error -> error.getSeverity() == ErrorType.FATAL) .collect(Collectors.toList()); if (!fatalErrors.isEmpty()) { throw new FatalTemplateErrorsException(template, fatalErrors); } return result.getOutput(); }
interpreter.addError(new TemplateError(ErrorType.WARNING, ErrorReason.UNKNOWN, ErrorItem.PROPERTY, e.getMessage(), "", interpreter.getLineNumber(), interpreter.getPosition(), e, BasicTemplateErrorCategory.UNKNOWN, ImmutableMap.of("exception", e.getMessage()))); } catch (TreeBuilderException e) { interpreter.addError(TemplateError.fromException(new TemplateSyntaxException(expression.substring(e.getPosition() - EXPRESSION_START_TOKEN.length()), "Error parsing '" + expression + "': " + errorMessage, interpreter.getLineNumber(), position, e))); } catch (ELException e) { interpreter.addError(TemplateError.fromException(new TemplateSyntaxException(expression, e.getMessage(), interpreter.getLineNumber(), e))); } catch (DisabledException e) { interpreter.addError(new TemplateError(ErrorType.FATAL, ErrorReason.DISABLED, ErrorItem.FUNCTION, e.getMessage(), expression, interpreter.getLineNumber(), interpreter.getPosition(), e)); } catch (UnknownTokenException e) { interpreter.addError(TemplateError.fromException(new InterpretException( String.format("Error resolving expression [%s]: " + getRootCauseMessage(e), expression), e, interpreter.getLineNumber(), interpreter.getPosition())));
public Node buildTree() { Node root = new RootNode(); parent = root; while (scanner.hasNext()) { Node node = nextNode(); if (node != null) { parent.getChildren().add(node); } } if (parent != root) { interpreter.addError(TemplateError.fromException( new MissingEndTagException(((TagNode) parent).getEndName(), parent.getMaster().getImage(), parent.getLineNumber(), parent.getStartPosition()))); } return root; }
interpreter.addError(TemplateError.fromUnknownProperty(base, propertyName, interpreter.getLineNumber(), -1)); interpreter.addError(new TemplateError(ErrorType.FATAL, ErrorReason.DISABLED, item, e.getMessage(), propertyName, interpreter.getLineNumber(), -1, e));