NIHVIVO-1461 When template not found, propagate error message up the call stack

This commit is contained in:
rjy7 2011-02-11 19:17:45 +00:00
parent 16a9c32872
commit 34f042bc87
7 changed files with 105 additions and 46 deletions

View file

@ -29,6 +29,7 @@ import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.ConfigurationProperties;
import edu.cornell.mannlib.vitro.webapp.beans.Portal;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.TemplateProcessingHelper.TemplateProcessingException;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
import freemarker.template.Configuration;
@ -255,7 +256,12 @@ public class ContactMailController extends FreemarkerHttpServlet {
email.put("referrer", UrlBuilder.urlDecode(originalReferer));
}
return processTemplateToString(template, email, config, request);
try {
return processTemplateToString(template, email, config, request);
} catch (TemplateProcessingException e) {
log.error("Error processing email text through template: " + e.getMessage(), e);
return null;
}
}
private void writeBackupCopy(PrintWriter outFile, String msgText,
@ -273,10 +279,14 @@ public class ContactMailController extends FreemarkerHttpServlet {
backup.put("msgText", msgText);
String backupText = processTemplateToString(template, backup, config, request);
outFile.print(backupText);
outFile.flush();
//outFile.close();
try {
String backupText = processTemplateToString(template, backup, config, request);
outFile.print(backupText);
outFile.flush();
//outFile.close();
} catch (TemplateProcessingException e) {
log.error("Error processing backup text throug template: " + e.getMessage(), e);
}
}
private void sendMessage(Session s, String webuseremail, String webusername,

View file

@ -13,6 +13,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.TemplateProcessingHelper.TemplateProcessingException;
import freemarker.template.Configuration;
/**
@ -45,7 +46,12 @@ public class FreemarkerComponentGenerator extends FreemarkerHttpServlet {
private String get(String templateName, Map<String, Object> root, Configuration config, HttpServletRequest request) {
templateName += ".ftl";
return processTemplate(templateName, root, config, request).toString();
try {
return processTemplate(templateName, root, config, request).toString();
} catch (TemplateProcessingException e) {
log.error("Error processing template " + templateName + ": " + e.getMessage(), e);
return null;
}
}
private String getHead(String templateName, Map<String, Object> root, Configuration config, HttpServletRequest request) {

View file

@ -25,6 +25,7 @@ import edu.cornell.mannlib.vitro.webapp.config.RevisionInfoBean;
import edu.cornell.mannlib.vitro.webapp.controller.ContactMailServlet;
import edu.cornell.mannlib.vitro.webapp.controller.VitroHttpServlet;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.TemplateProcessingHelper.TemplateProcessingException;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.Route;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ExceptionResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ForwardResponseValues;
@ -96,6 +97,8 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
doResponse(vreq, response, responseValues);
} catch (TemplateProcessingException e) {
log.error(e.getMessage(), e);
} catch (Throwable e) {
log.error("FreeMarkerHttpServlet could not forward to view.", e);
}
@ -135,7 +138,8 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
return null;
}
protected void doResponse(VitroRequest vreq, HttpServletResponse response, ResponseValues values) {
protected void doResponse(VitroRequest vreq, HttpServletResponse response,
ResponseValues values) throws TemplateProcessingException {
try {
int statusCode = values.getStatusCode();
@ -159,10 +163,10 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
} catch (IOException e) {
log.error("IOException in doResponse()", e);
}
}
protected void doTemplate(VitroRequest vreq, HttpServletResponse response, ResponseValues values) {
protected void doTemplate(VitroRequest vreq, HttpServletResponse response,
ResponseValues values) throws TemplateProcessingException {
Configuration config = getConfig(vreq);
@ -229,7 +233,8 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
values.getModel().write( response.getOutputStream(), format );
}
protected void doException(VitroRequest vreq, HttpServletResponse response, ResponseValues values) {
protected void doException(VitroRequest vreq, HttpServletResponse response,
ResponseValues values) throws TemplateProcessingException {
// Log the error, and display an error message on the page.
log.error(values.getException(), values.getException());
TemplateResponseValues trv = TemplateResponseValues.getTemplateResponseValuesFromException((ExceptionResponseValues)values);
@ -459,31 +464,34 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
}
protected StringWriter processTemplate(String templateName, Map<String, Object> map, Configuration config,
HttpServletRequest request) {
HttpServletRequest request) throws TemplateProcessingException {
TemplateProcessingHelper helper = new TemplateProcessingHelper(config, request, getServletContext());
return helper.processTemplate(templateName, map);
}
protected StringWriter processTemplate(ResponseValues values, Configuration config, HttpServletRequest request) {
protected StringWriter processTemplate(ResponseValues values, Configuration config,
HttpServletRequest request) throws TemplateProcessingException {
return processTemplate(values.getTemplateName(), values.getMap(), config, request);
}
// In fact, we can put StringWriter objects directly into the data model, so perhaps we should eliminate the processTemplateToString() methods.
protected String processTemplateToString(String templateName, Map<String, Object> map, Configuration config,
HttpServletRequest request) {
HttpServletRequest request) throws TemplateProcessingException {
return processTemplate(templateName, map, config, request).toString();
}
protected String processTemplateToString(ResponseValues values, Configuration config, HttpServletRequest request) {
protected String processTemplateToString(ResponseValues values, Configuration config,
HttpServletRequest request) throws TemplateProcessingException {
return processTemplate(values, config, request).toString();
}
protected void writePage(Map<String, Object> root, Configuration config, HttpServletRequest request, HttpServletResponse response) {
protected void writePage(Map<String, Object> root, Configuration config,
HttpServletRequest request, HttpServletResponse response) throws TemplateProcessingException {
writeTemplate(getPageTemplateName(), root, config, request, response);
}
protected void writeTemplate(String templateName, Map<String, Object> map, Configuration config,
HttpServletRequest request, HttpServletResponse response) {
HttpServletRequest request, HttpServletResponse response) throws TemplateProcessingException {
StringWriter sw = processTemplate(templateName, map, config, request);
write(sw, response);
}

View file

@ -33,21 +33,23 @@ public class TemplateProcessingHelper {
this.context = context;
}
public StringWriter processTemplate(String templateName, Map<String, Object> map) {
public StringWriter processTemplate(String templateName, Map<String, Object> map)
throws TemplateProcessingException {
Template template = getTemplate(templateName);
StringWriter sw = new StringWriter();
processTemplate(template, map, sw);
return sw;
}
protected StringWriter processTemplate(ResponseValues values) {
protected StringWriter processTemplate(ResponseValues values) throws TemplateProcessingException {
if (values == null) {
return null;
}
return processTemplate(values.getTemplateName(), values.getMap());
}
private void processTemplate(Template template, Map<String, Object> map, Writer writer) {
private void processTemplate(Template template, Map<String, Object> map, Writer writer)
throws TemplateProcessingException {
try {
Environment env = template.createProcessingEnvironment(map, writer);
@ -64,31 +66,43 @@ public class TemplateProcessingHelper {
env.process();
} catch (TemplateException e) {
log.error("Template Exception creating processing environment", e);
throw new TemplateProcessingException("TemplateException creating processing environment", e);
} catch (IOException e) {
log.error("IOException creating processing environment", e);
throw new TemplateProcessingException("IOException creating processing environment", e);
}
}
// For cases where we need a String instead of a StringWriter. StringWriter objects can be put in the template data model,
// but we can use this method from a jsp, for example.
public String processTemplateToString(String templateName, Map<String, Object> map) {
public String processTemplateToString(String templateName, Map<String, Object> map)
throws TemplateProcessingException {
return processTemplate(templateName, map).toString();
}
protected String processTemplateToString(ResponseValues values) {
protected String processTemplateToString(ResponseValues values)
throws TemplateProcessingException {
return processTemplate(values).toString();
}
private Template getTemplate(String templateName) {
private Template getTemplate(String templateName) throws TemplateProcessingException {
Template template = null;
try {
template = config.getTemplate(templateName);
} catch (IOException e) {
// RY Should probably throw this error instead.
log.error("Cannot get template " + templateName, e);
throw new TemplateProcessingException("Cannot find template " + templateName, e);
}
return template;
}
@SuppressWarnings("serial")
public class TemplateProcessingException extends Exception {
public TemplateProcessingException(String message) {
super(message);
}
public TemplateProcessingException(String message, Throwable cause) {
super(message, cause);
}
}
}

View file

@ -15,6 +15,7 @@ import edu.cornell.mannlib.vedit.beans.LoginStatusBean;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.edit.Authenticate;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.TemplateProcessingHelper.TemplateProcessingException;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.login.LoginProcessBean.State;
import freemarker.template.Configuration;
@ -64,9 +65,17 @@ public class LoginTemplateHelper extends LoginTemplateHelperBase {
default:
return doTemplate(vreq, showLoginScreen(vreq));
}
} catch (TemplateProcessingException e) {
log.error(e.getMessage(), e);
return null;
} catch (Exception e) {
log.error(e, e);
return doTemplate(vreq, showError(e));
try {
return doTemplate(vreq, showError(e));
} catch (TemplateProcessingException e1) {
log.error(e1.getMessage(), e1);
return null;
}
}
}
@ -153,7 +162,7 @@ public class LoginTemplateHelper extends LoginTemplateHelperBase {
* We processed a response, and want to show a template. Version for JSP
* page.
*/
private String doTemplate(VitroRequest vreq, TemplateResponseValues values) {
private String doTemplate(VitroRequest vreq, TemplateResponseValues values) throws TemplateProcessingException {
// Set it up like FreeMarkerHttpServlet.doGet() would do.
Configuration config = getConfig(vreq);

View file

@ -31,9 +31,9 @@ import org.apache.lucene.search.WildcardQuery;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.TemplateProcessingHelper.TemplateProcessingException;
import edu.cornell.mannlib.vitro.webapp.flags.PortalFlag;
import edu.cornell.mannlib.vitro.webapp.search.SearchException;
import edu.cornell.mannlib.vitro.webapp.search.lucene.Entity2LuceneDoc;
import edu.cornell.mannlib.vitro.webapp.search.lucene.Entity2LuceneDoc.VitroLuceneTermNames;
import edu.cornell.mannlib.vitro.webapp.search.lucene.LuceneIndexFactory;
import edu.cornell.mannlib.vitro.webapp.search.lucene.LuceneSetup;
@ -142,10 +142,15 @@ public class AutocompleteController extends FreemarkerHttpServlet{
map.put("results", results);
writeTemplate(TEMPLATE_DEFAULT, map, config, request, response);
} catch (TemplateProcessingException e) {
log.error(e, e);
} catch (Throwable e) {
log.error("AutocompleteController(): " + e);
doSearchError(map, config, request, response);
return;
try {
doSearchError(map, config, request, response);
} catch (TemplateProcessingException e1) {
log.error(e1.getMessage(), e1);
}
}
}
@ -340,15 +345,18 @@ public class AutocompleteController extends FreemarkerHttpServlet{
return qp;
}
private void doNoQuery(Map<String, Object> map, Configuration config, HttpServletRequest request, HttpServletResponse response) {
private void doNoQuery(Map<String, Object> map, Configuration config, HttpServletRequest request,
HttpServletResponse response) throws TemplateProcessingException {
writeTemplate(TEMPLATE_DEFAULT, map, config, request, response);
}
private void doFailedSearch(Map<String, Object> map, Configuration config, HttpServletRequest request, HttpServletResponse response) {
private void doFailedSearch(Map<String, Object> map, Configuration config, HttpServletRequest request,
HttpServletResponse response) throws TemplateProcessingException {
writeTemplate(TEMPLATE_DEFAULT, map, config, request, response);
}
private void doSearchError(Map<String, Object> map, Configuration config, HttpServletRequest request, HttpServletResponse response) {
private void doSearchError(Map<String, Object> map, Configuration config, HttpServletRequest request,
HttpServletResponse response) throws TemplateProcessingException {
// For now, we are not sending an error message back to the client because with the default autocomplete configuration it
// chokes.
writeTemplate(TEMPLATE_DEFAULT, map, config, request, response);

View file

@ -141,13 +141,17 @@ public class FreemarkerPagedSearchController extends FreemarkerHttpServlet imple
if( ! wasXmlRequested ){
super.doGet(request,response);
}else{
VitroRequest vreq = new VitroRequest(request);
Configuration config = getConfig(vreq);
ResponseValues rvalues = processRequest(vreq);
try {
VitroRequest vreq = new VitroRequest(request);
Configuration config = getConfig(vreq);
ResponseValues rvalues = processRequest(vreq);
response.setCharacterEncoding("UTF-8");
response.setContentType("text/xml;charset=UTF-8");
writeTemplate(rvalues.getTemplateName(), rvalues.getMap(), config, request, response);
response.setCharacterEncoding("UTF-8");
response.setContentType("text/xml;charset=UTF-8");
writeTemplate(rvalues.getTemplateName(), rvalues.getMap(), config, request, response);
} catch (Exception e) {
log.error(e, e);
}
}
}