package de.neuland.jade4j.exceptions;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import de.neuland.jade4j.Jade4J;
import de.neuland.jade4j.template.TemplateLoader;
public abstract class JadeException extends RuntimeException {
private static final long serialVersionUID = -8189536050437574552L;
private String filename;
private int lineNumber;
private TemplateLoader templateLoader;
public JadeException(String message, String filename, int lineNumber, TemplateLoader templateLoader, Throwable e) {
super(message, e);
this.filename = filename;
this.lineNumber = lineNumber;
this.templateLoader = templateLoader;
}
public JadeException(String message) {
super(message);
}
public String getFilename() {
return filename;
}
public int getLineNumber() {
return lineNumber;
}
public List<String> getTemplateLines() {
try {
List<String> result = new ArrayList<String>();
Reader reader = templateLoader.getReader(filename);
BufferedReader in = new BufferedReader(reader);
String line;
while ((line = in.readLine()) != null) {
result.add(line);
}
return result;
} catch (IOException e) {
return null;
}
}
@Override
public String toString() {
return getClass() + ": " + getMessage();
}
/**
* Returns the detail message string of this throwable.
*
* @return the detail message string of this {@code Throwable} instance
* (which may be {@code null}).
*/
@Override
public String getMessage() {
return super.getMessage() + " in " + getFilename() + ":" + getLineNumber();
}
public String toHtmlString() {
return toHtmlString(null);
}
public String toHtmlString(String generatedHtml) {
Map<String, Object> model = new HashMap<String, Object>();
model.put("filename", filename);
model.put("linenumber", lineNumber);
model.put("message", getMessage());
model.put("lines", getTemplateLines());
model.put("exception", getName());
if (generatedHtml != null) {
model.put("html", generatedHtml);
}
try {
URL url = JadeException.class.getResource("/error.jade");
return Jade4J.render(url, model, true);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private String getName() {
return this.getClass().getSimpleName().replaceAll("([A-Z])", " $1").trim();
}
}