From 34f042bc871e596f2e6fe702e989fbe2eb6811af Mon Sep 17 00:00:00 2001 From: rjy7 Date: Fri, 11 Feb 2011 19:17:45 +0000 Subject: [PATCH] NIHVIVO-1461 When template not found, propagate error message up the call stack --- .../freemarker/ContactMailController.java | 22 ++++++++---- .../FreemarkerComponentGenerator.java | 8 ++++- .../freemarker/FreemarkerHttpServlet.java | 32 ++++++++++------- .../freemarker/TemplateProcessingHelper.java | 36 +++++++++++++------ .../controller/login/LoginTemplateHelper.java | 13 +++++-- .../controller/AutocompleteController.java | 22 ++++++++---- .../FreemarkerPagedSearchController.java | 18 ++++++---- 7 files changed, 105 insertions(+), 46 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ContactMailController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ContactMailController.java index b487c08cc..005299d94 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ContactMailController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ContactMailController.java @@ -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, @@ -272,11 +278,15 @@ 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, diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerComponentGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerComponentGenerator.java index a9dee7846..f239366c6 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerComponentGenerator.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerComponentGenerator.java @@ -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 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 root, Configuration config, HttpServletRequest request) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java index 81b9b60d8..272dcdb1c 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java @@ -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; @@ -94,8 +95,10 @@ public class FreemarkerHttpServlet extends VitroHttpServlet { responseValues = processRequest(vreq); } - doResponse(vreq, response, responseValues); - + 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 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 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 root, Configuration config, HttpServletRequest request, HttpServletResponse response) { + protected void writePage(Map root, Configuration config, + HttpServletRequest request, HttpServletResponse response) throws TemplateProcessingException { writeTemplate(getPageTemplateName(), root, config, request, response); } protected void writeTemplate(String templateName, Map map, Configuration config, - HttpServletRequest request, HttpServletResponse response) { + HttpServletRequest request, HttpServletResponse response) throws TemplateProcessingException { StringWriter sw = processTemplate(templateName, map, config, request); write(sw, response); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TemplateProcessingHelper.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TemplateProcessingHelper.java index f93b11f42..39b11a898 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TemplateProcessingHelper.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TemplateProcessingHelper.java @@ -33,21 +33,23 @@ public class TemplateProcessingHelper { this.context = context; } - public StringWriter processTemplate(String templateName, Map map) { + public StringWriter processTemplate(String templateName, Map 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 map, Writer writer) { + private void processTemplate(Template template, Map 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 map) { + public String processTemplateToString(String templateName, Map 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); + } + } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/login/LoginTemplateHelper.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/login/LoginTemplateHelper.java index 5e76da0de..07c957817 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/login/LoginTemplateHelper.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/login/LoginTemplateHelper.java @@ -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); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/AutocompleteController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/AutocompleteController.java index 079f69769..927ade094 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/AutocompleteController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/AutocompleteController.java @@ -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; @@ -141,11 +141,16 @@ public class AutocompleteController extends FreemarkerHttpServlet{ Collections.sort(results); 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 map, Configuration config, HttpServletRequest request, HttpServletResponse response) { + private void doNoQuery(Map map, Configuration config, HttpServletRequest request, + HttpServletResponse response) throws TemplateProcessingException { writeTemplate(TEMPLATE_DEFAULT, map, config, request, response); } - private void doFailedSearch(Map map, Configuration config, HttpServletRequest request, HttpServletResponse response) { + private void doFailedSearch(Map map, Configuration config, HttpServletRequest request, + HttpServletResponse response) throws TemplateProcessingException { writeTemplate(TEMPLATE_DEFAULT, map, config, request, response); } - private void doSearchError(Map map, Configuration config, HttpServletRequest request, HttpServletResponse response) { + private void doSearchError(Map 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); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/FreemarkerPagedSearchController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/FreemarkerPagedSearchController.java index 3ca08ee89..26b3378a6 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/FreemarkerPagedSearchController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/FreemarkerPagedSearchController.java @@ -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); - - response.setCharacterEncoding("UTF-8"); - response.setContentType("text/xml;charset=UTF-8"); - writeTemplate(rvalues.getTemplateName(), rvalues.getMap(), config, request, response); + 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); + } catch (Exception e) { + log.error(e, e); + } } }