final VelocityContext velocityContext = new VelocityContext(model);
// May throw parsing error if template could not be obtained
Template template = null;
VelocityWriter velocityWriter = null;
try {
String charset = configService.getCharset();
if (charset != null) {
template = velocityEngine.getTemplate(templatePath, charset);
} else {
template = velocityEngine.getTemplate(templatePath);
}
velocityWriter = (VelocityWriter) writerPool.get();
if (velocityWriter == null) {
velocityWriter =
new VelocityWriter(writer, WRITER_BUFFER_SIZE, true);
} else {
velocityWriter.recycle(writer);
}
template.merge(velocityContext, velocityWriter);
} catch (IOException ioe) {
throw ioe;
} catch (ParseErrorException pee) {
TemplateException te = new TemplateException(pee,
pee.getTemplateName(),
pee.getLineNumber(),
pee.getColumnNumber());
// Exception occurred merging template and model. It is possible
// that some output has already been written, so we will append the
// error report to the previous output.
ErrorReport errorReport =
new ErrorReport(te,
((page != null) ? page.getClass() : null),
configService.isProductionMode(),
Context.getThreadLocalContext().getRequest(),
configService.getServletContext());
if (velocityWriter == null) {
velocityWriter =
new VelocityWriter(writer, WRITER_BUFFER_SIZE, true);
}
velocityWriter.write(errorReport.toString());
throw te;
} catch (TemplateInitException tie) {
TemplateException te = new TemplateException(tie,
tie.getTemplateName(),
tie.getLineNumber(),
tie.getColumnNumber());
// Exception occurred merging template and model. It is possible
// that some output has already been written, so we will append the
// error report to the previous output.
ErrorReport errorReport =
new ErrorReport(te,
((page != null) ? page.getClass() : null),
configService.isProductionMode(),
Context.getThreadLocalContext().getRequest(),
configService.getServletContext());
if (velocityWriter == null) {
velocityWriter =
new VelocityWriter(writer, WRITER_BUFFER_SIZE, true);
}
velocityWriter.write(errorReport.toString());
throw te;
} catch (TemplateParseException tpe) {
TemplateException te = new TemplateException(tpe,
tpe.getTemplateName(),
tpe.getLineNumber(),
tpe.getColumnNumber());
// Exception occurred merging template and model. It is possible
// that some output has already been written, so we will append the
// error report to the previous output.
ErrorReport errorReport =
new ErrorReport(te,
((page != null) ? page.getClass() : null),
configService.isProductionMode(),
Context.getThreadLocalContext().getRequest(),
configService.getServletContext());
if (velocityWriter == null) {
velocityWriter =
new VelocityWriter(writer, WRITER_BUFFER_SIZE, true);
}
velocityWriter.write(errorReport.toString());
throw te;
} catch (Exception error) {
TemplateException te = new TemplateException(error);
// Exception occurred merging template and model. It is possible
// that some output has already been written, so we will append the
// error report to the previous output.
ErrorReport errorReport =
new ErrorReport(te,
((page != null) ? page.getClass() : null),
configService.isProductionMode(),
Context.getThreadLocalContext().getRequest() ,
configService.getServletContext());
if (velocityWriter == null) {
velocityWriter =
new VelocityWriter(writer, WRITER_BUFFER_SIZE, true);
}
velocityWriter.write(errorReport.toString());
throw te;
} finally {
if (velocityWriter != null) {
// flush and put back into the pool don't close to allow
// us to play nicely with others.
velocityWriter.flush();
// Clear the VelocityWriter's reference to its
// internal Writer to allow the latter
// to be GC'd while vw is pooled.
velocityWriter.recycle(null);
writerPool.put(velocityWriter);
}
writer.flush();