Skip to content

Commit babd661

Browse files
committed
throw container exception to support recording multiple errors during template rendering
1 parent cde5c78 commit babd661

File tree

3 files changed

+60
-9
lines changed

3 files changed

+60
-9
lines changed

src/main/java/com/hubspot/jinjava/Jinjava.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,23 @@
1515
**********************************************************************/
1616
package com.hubspot.jinjava;
1717

18+
import java.util.Collection;
1819
import java.util.Map;
1920
import java.util.Properties;
2021

2122
import javax.el.ExpressionFactory;
2223

24+
import com.google.common.base.Predicate;
25+
import com.google.common.collect.Collections2;
2326
import com.hubspot.jinjava.el.ExtendedSyntaxBuilder;
2427
import com.hubspot.jinjava.el.TruthyTypeConverter;
2528
import com.hubspot.jinjava.interpret.Context;
29+
import com.hubspot.jinjava.interpret.FatalTemplateErrorsException;
2630
import com.hubspot.jinjava.interpret.InterpretException;
2731
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
2832
import com.hubspot.jinjava.interpret.RenderResult;
2933
import com.hubspot.jinjava.interpret.TemplateError;
30-
import com.hubspot.jinjava.interpret.TemplateError.ErrorReason;
34+
import com.hubspot.jinjava.interpret.TemplateError.ErrorType;
3135
import com.hubspot.jinjava.loader.CascadingResourceLocator;
3236
import com.hubspot.jinjava.loader.ClasspathResourceLocator;
3337
import com.hubspot.jinjava.loader.FileLocator;
@@ -136,12 +140,15 @@ public ResourceLocator getResourceLocator() {
136140
public String render(String template, Map<String, ?> bindings) {
137141
RenderResult result = renderForResult(template, bindings);
138142

139-
if(!result.getErrors().isEmpty()) {
140-
for(TemplateError err : result.getErrors()) {
141-
if(err.getReason() == ErrorReason.SYNTAX_ERROR) {
142-
throw new InterpretException(err.getMessage(), err.getException(), err.getLineno());
143-
}
143+
Collection<TemplateError> fatalErrors = Collections2.filter(result.getErrors(), new Predicate<TemplateError>() {
144+
@Override
145+
public boolean apply(TemplateError input) {
146+
return input.getSeverity() == ErrorType.FATAL;
144147
}
148+
});
149+
150+
if(!fatalErrors.isEmpty()) {
151+
throw new FatalTemplateErrorsException(template, fatalErrors);
145152
}
146153

147154
return result.getOutput();
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.hubspot.jinjava.interpret;
2+
3+
/**
4+
* Container exception thrown when fatal errors are encountered while rendering a template.
5+
*
6+
* @author jstehler
7+
*/
8+
public class FatalTemplateErrorsException extends InterpretException {
9+
private static final long serialVersionUID = 1L;
10+
11+
private final String template;
12+
private final Iterable<TemplateError> errors;
13+
14+
public FatalTemplateErrorsException(String template, Iterable<TemplateError> errors) {
15+
super(generateMessage(errors));
16+
this.template = template;
17+
this.errors = errors;
18+
}
19+
20+
private static String generateMessage(Iterable<TemplateError> errors) {
21+
StringBuilder msg = new StringBuilder();
22+
23+
for(TemplateError error : errors) {
24+
msg.append(error.toString()).append('\n');
25+
}
26+
27+
return msg.toString();
28+
}
29+
30+
public String getTemplate() {
31+
return template;
32+
}
33+
34+
public Iterable<TemplateError> getErrors() {
35+
return errors;
36+
}
37+
38+
}

src/main/java/com/hubspot/jinjava/interpret/TemplateError.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,21 @@ public enum ErrorReason { SYNTAX_ERROR, UNKNOWN, BAD_URL, EXCEPTION, MISSING, OT
1919
private final Exception exception;
2020

2121
public static TemplateError fromSyntaxError(InterpretException ex) {
22-
return new TemplateError(ErrorType.FATAL, ErrorReason.SYNTAX_ERROR, ExceptionUtils.getRootCauseMessage(ex), null, ex.getLineNumber(), ex);
22+
return new TemplateError(ErrorType.FATAL, ErrorReason.SYNTAX_ERROR, ExceptionUtils.getMessage(ex), null, ex.getLineNumber(), ex);
2323
}
2424

2525
public static TemplateError fromException(Exception ex) {
26-
return new TemplateError(ErrorType.FATAL, ErrorReason.EXCEPTION, ExceptionUtils.getRootCauseMessage(ex), null, null, ex);
26+
int lineNumber = -1;
27+
28+
if(ex instanceof InterpretException) {
29+
lineNumber = ((InterpretException) ex).getLineNumber();
30+
}
31+
32+
return new TemplateError(ErrorType.FATAL, ErrorReason.EXCEPTION, ExceptionUtils.getMessage(ex), null, lineNumber, ex);
2733
}
2834

2935
public static TemplateError fromException(Exception ex, int lineNumber) {
30-
return new TemplateError(ErrorType.FATAL, ErrorReason.EXCEPTION, ExceptionUtils.getRootCauseMessage(ex), null, lineNumber, ex);
36+
return new TemplateError(ErrorType.FATAL, ErrorReason.EXCEPTION, ExceptionUtils.getMessage(ex), null, lineNumber, ex);
3137
}
3238

3339
public static TemplateError fromUnknownProperty(Object base, String variable, int lineNumber) {

0 commit comments

Comments
 (0)