From 8547665029660cf16d3ca767b4d75d92410c1d63 Mon Sep 17 00:00:00 2001 From: rjy7 Date: Wed, 15 Sep 2010 21:32:32 +0000 Subject: [PATCH] NIHVIVO-1149 Reintegrate dev-fmservlet branch after finishing restructuring of FreemarkerHttpServlet and subclasses. Two files had to be copied manually. --- .../controller/edit/PrimitiveDelete.java | 1 + .../controller/edit/PrimitiveRdfEdit.java | 31 +- .../controller/edit/ReorderController.java | 1 + .../freemarker/AboutController.java | 27 +- .../freemarker/BrowseController.java | 12 +- .../freemarker/ContactFormController.java | 17 +- .../freemarker/ContactMailController.java | 26 +- .../freemarker/FreemarkerHelper.java | 1 + .../freemarker/FreemarkerHttpServlet.java | 362 ++++++++++++++++-- .../freemarker/FreemarkerSetup.java | 2 + .../freemarker/ImageUploadController.java | 247 ++---------- .../freemarker/IndividualController.java | 27 +- .../freemarker/IndividualListController.java | 13 +- .../freemarker/NavigationController.java | 7 +- .../freemarker/SiteAdminController.java | 29 +- .../freemarker/TermsOfUseController.java | 34 +- .../controller/freemarker/TestController.java | 26 +- .../controller/login/LoginTemplateHelper.java | 55 +-- .../FreemarkerPagedSearchController.java | 45 ++- .../search/controller/IndexController.java | 140 ++++--- .../freemarker/body/login/login-main.ftl | 4 +- 21 files changed, 625 insertions(+), 482 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PrimitiveDelete.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PrimitiveDelete.java index 685349823..a7cbd4cda 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PrimitiveDelete.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PrimitiveDelete.java @@ -18,6 +18,7 @@ public class PrimitiveDelete extends PrimitiveRdfEdit { private static final long serialVersionUID = 1L; private static final Log log = LogFactory.getLog(PrimitiveDelete.class); + @Override protected void processRequest(VitroRequest vreq, HttpServletResponse response) { String uriToDelete = vreq.getParameter("deletion"); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PrimitiveRdfEdit.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PrimitiveRdfEdit.java index 070b16425..81fb60104 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PrimitiveRdfEdit.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PrimitiveRdfEdit.java @@ -4,10 +4,8 @@ package edu.cornell.mannlib.vitro.webapp.controller.edit; import java.io.IOException; import java.io.StringReader; -import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Set; @@ -28,38 +26,37 @@ import com.hp.hpl.jena.shared.Lock; import edu.cornell.mannlib.vedit.beans.LoginFormBean; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet; -import edu.cornell.mannlib.vitro.webapp.dao.IndividualDao; -import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.Route; import edu.cornell.mannlib.vitro.webapp.dao.jena.DependentResourceDeleteJena; import edu.cornell.mannlib.vitro.webapp.dao.jena.event.EditEvent; import edu.cornell.mannlib.vitro.webapp.edit.n3editing.EditN3Utils; -import freemarker.template.Configuration; public class PrimitiveRdfEdit extends FreemarkerHttpServlet{ private static final long serialVersionUID = 1L; - @Override - protected String getBody(VitroRequest vreq, Map body, Configuration config) { -// boolean loggedIn = checkLoginStatus(request, response); -// if( !loggedIn){ -// doError(response,"You must be logged in to use this servlet.",HttpStatus.SC_UNAUTHORIZED); -// return; -// } - return mergeBodyToTemplate("primitiveRdfEdit.ftl",new HashMap(), config); - } - @Override protected String getTitle(String siteName) { return "RDF edit"; } + @Override + protected ResponseValues processRequest(VitroRequest vreq) { + boolean loggedIn = checkLoginStatus(vreq); + if( !loggedIn){ + return new RedirectResponseValues(UrlBuilder.getUrl(Route.LOGIN)); + } + + return new TemplateResponseValues("primitiveRdfEdit.ftl"); + } + @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { VitroRequest vreq = new VitroRequest(request); - boolean loggedIn = checkLoginStatus(request, response); + boolean loggedIn = checkLoginStatus(request); if( !loggedIn){ doError(response,"You must be logged in to use this servlet.",HttpStatus.SC_UNAUTHORIZED); return; @@ -238,7 +235,7 @@ public class PrimitiveRdfEdit extends FreemarkerHttpServlet{ Log log = LogFactory.getLog(PrimitiveRdfEdit.class.getName()); - static public boolean checkLoginStatus(HttpServletRequest request, HttpServletResponse response){ + static public boolean checkLoginStatus(HttpServletRequest request){ LoginFormBean loginBean = (LoginFormBean) request.getSession().getAttribute("loginHandler"); if (loginBean == null){ return false; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/ReorderController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/ReorderController.java index de4bb3df9..0e7d8b5b1 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/ReorderController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/ReorderController.java @@ -29,6 +29,7 @@ public class ReorderController extends PrimitiveRdfEdit { private static String RANK_PREDICATE_PARAMETER_NAME = "predicate"; private static String INDIVIDUAL_PREDICATE_PARAMETER_NAME = "individuals"; + @Override protected void processRequest(VitroRequest vreq, HttpServletResponse response) { //String templateName = "autocompleteResults.ftl"; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/AboutController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/AboutController.java index 2365975c1..2d8d414ea 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/AboutController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/AboutController.java @@ -2,6 +2,7 @@ package edu.cornell.mannlib.vitro.webapp.controller.freemarker; +import java.util.HashMap; import java.util.Map; import org.apache.commons.logging.Log; @@ -14,22 +15,22 @@ import freemarker.template.Configuration; public class AboutController extends FreemarkerHttpServlet { private static final long serialVersionUID = 1L; - private static final Log log = LogFactory.getLog(AboutController.class.getName()); + private static final Log log = LogFactory.getLog(AboutController.class); + @Override + protected ResponseValues processRequest(VitroRequest vreq) { + Portal portal = vreq.getPortal(); + + Map body = new HashMap(); + body.put("aboutText", portal.getAboutText()); + body.put("acknowledgeText", portal.getAcknowledgeText()); + + return new TemplateResponseValues("about.ftl", body); + } + + @Override protected String getTitle(String siteName) { return "About " + siteName; } - - protected String getBody(VitroRequest vreq, Map body, Configuration config) { - - Portal portal = vreq.getPortal(); - - body.put("aboutText", portal.getAboutText()); - body.put("acknowledgeText", portal.getAcknowledgeText()); - - String bodyTemplate = "about.ftl"; - return mergeBodyToTemplate(bodyTemplate, body, config); - - } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/BrowseController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/BrowseController.java index 4a85c391e..97efae5d8 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/BrowseController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/BrowseController.java @@ -13,6 +13,8 @@ import edu.cornell.mannlib.vitro.webapp.beans.VClass; import edu.cornell.mannlib.vitro.webapp.beans.VClassGroup; import edu.cornell.mannlib.vitro.webapp.beans.BaseResourceBean.RoleLevel; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet.ResponseValues; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet.TemplateResponseValues; import edu.cornell.mannlib.vitro.webapp.dao.VClassGroupDao; import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; @@ -68,14 +70,16 @@ public class BrowseController extends FreemarkerHttpServlet { _cacheRebuildThread.start(); _cacheRebuildThread.informOfQueueChange(); } - + + @Override protected String getTitle(String siteName) { return "Index to " + siteName + " Contents"; } - protected String getBody(VitroRequest vreq, Map body, Configuration config) { + @Override + protected ResponseValues processRequest(VitroRequest vreq) { - String bodyTemplate = "classGroups.ftl"; + Map body = new HashMap(); String message = null; if( vreq.getParameter("clearcache") != null ) //mainly for debugging @@ -103,7 +107,7 @@ public class BrowseController extends FreemarkerHttpServlet { body.put("message", message); } - return mergeBodyToTemplate(bodyTemplate, body, config); + return new TemplateResponseValues("classGroups.ftl", body); } public void destroy(){ diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ContactFormController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ContactFormController.java index e269c6543..ad858e250 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ContactFormController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ContactFormController.java @@ -19,6 +19,8 @@ import edu.cornell.mannlib.vitro.webapp.beans.Portal; import edu.cornell.mannlib.vitro.webapp.controller.ContactMailServlet; import edu.cornell.mannlib.vitro.webapp.controller.Controllers; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet.ResponseValues; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet.TemplateResponseValues; import edu.cornell.mannlib.vitro.webapp.utils.StringUtils; import freemarker.template.Configuration; @@ -31,27 +33,30 @@ public class ContactFormController extends FreemarkerHttpServlet { private static final long serialVersionUID = 1L; private static final Log log = LogFactory.getLog(ContactFormController.class.getName()); + @Override protected String getTitle(String siteName) { return siteName + " Feedback Form"; } - protected String getBody(VitroRequest vreq, Map body, Configuration config) { + @Override + protected ResponseValues processRequest(VitroRequest vreq) { - String bodyTemplate; + String templateName; Portal portal = vreq.getPortal(); + Map body = new HashMap(); if (!ContactMailServlet.isSmtpHostConfigured()) { body.put("errorMessage", "This application has not yet been configured to send mail. " + "An smtp host has not been specified in the configuration properties file."); - bodyTemplate = "contactForm-error.ftl"; + templateName = "contactForm-error.ftl"; } else if (StringUtils.isEmpty(portal.getContactMail())) { body.put("errorMessage", "The feedback form is currently disabled. In order to activate the form, a site administrator must provide a contact email address in the Site Configuration"); - bodyTemplate = "contactForm-error.ftl"; + templateName = "contactForm-error.ftl"; } else { @@ -84,9 +89,9 @@ public class ContactFormController extends FreemarkerHttpServlet { vreq.getSession().setAttribute("contactFormReferer",vreq.getHeader("Referer")); } - bodyTemplate = "contactForm-form.ftl"; + templateName = "contactForm-form.ftl"; } - return mergeBodyToTemplate(bodyTemplate, body, config); + return new TemplateResponseValues(templateName, body); } } 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 a408c7a0f..42b0678e2 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 @@ -28,6 +28,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.FreemarkerHttpServlet.ResponseValues; import freemarker.template.Configuration; public class ContactMailController extends FreemarkerHttpServlet { @@ -66,14 +67,18 @@ public class ContactMailController extends FreemarkerHttpServlet { return (host != null && host.length() > 0) ? host : null; } + @Override protected String getTitle(String siteName) { return siteName + " Feedback Form"; } - protected String getBody(VitroRequest vreq, Map body, Configuration config) { + + @Override + protected ResponseValues processRequest(VitroRequest vreq) { Portal portal = vreq.getPortal(); - String bodyTemplate = null; + String templateName = null; + Map body = new HashMap(); String statusMsg = null; // holds the error status @@ -81,7 +86,7 @@ public class ContactMailController extends FreemarkerHttpServlet { body.put("errorMessage", "This application has not yet been configured to send mail. " + "An smtp host has not been specified in the configuration properties file."); - bodyTemplate = "contactForm-error.ftl"; + templateName = "contactForm-error.ftl"; } else { @@ -97,7 +102,7 @@ public class ContactMailController extends FreemarkerHttpServlet { // rjy7 We should reload the form, not go to the error page! body.put("errorMessage", "Invalid submission"); - bodyTemplate = "contactForm-error.ftl"; + templateName = "contactForm-error.ftl"; } else { @@ -158,7 +163,8 @@ public class ContactMailController extends FreemarkerHttpServlet { "To establish the Contact Us mail capability the system administrators must " + "specify at least one email address in the current portal."); } - + + Configuration config = (Configuration) vreq.getAttribute("freemarkerConfig"); String msgText = composeEmail(webusername, webuseremail, comments, deliveryfrom, originalReferer, vreq.getRemoteAddr(), config); @@ -204,15 +210,15 @@ public class ContactMailController extends FreemarkerHttpServlet { // Message was sent successfully if (statusMsg == null && spamReason == null) { - bodyTemplate = "contactForm-confirmation.ftl"; + templateName = "contactForm-confirmation.ftl"; } else { body.put("errorMessage", statusMsg); - bodyTemplate = "contactForm-error.ftl"; + templateName = "contactForm-error.ftl"; } } } - return mergeBodyToTemplate(bodyTemplate, body, config); + return new TemplateResponseValues(templateName, body); } @@ -241,7 +247,7 @@ public class ContactMailController extends FreemarkerHttpServlet { email.put("referrer", UrlBuilder.urlDecode(originalReferer)); } - return mergeBodyToTemplate(template, email, config); + return mergeMapToTemplate(template, email, config); } private void writeBackupCopy(PrintWriter outFile, String msgText, @@ -259,7 +265,7 @@ public class ContactMailController extends FreemarkerHttpServlet { backup.put("msgText", msgText); - String backupText = mergeBodyToTemplate(template, backup, config); + String backupText = mergeMapToTemplate(template, backup, config); outFile.print(backupText); outFile.flush(); //outFile.close(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHelper.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHelper.java index a91d1949c..c8d881611 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHelper.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHelper.java @@ -45,6 +45,7 @@ public class FreemarkerHelper { } return sw; } + public String mergeMapToTemplate(String templateName, Map map) { return mergeToTemplate(templateName, map).toString(); 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 0701b6eb1..94c79da2e 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 @@ -7,6 +7,7 @@ import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Calendar; +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -63,25 +64,8 @@ public class FreemarkerHttpServlet extends VitroHttpServlet { Configuration config = getConfig(vreq); vreq.setAttribute("freemarkerConfig", config); - // We can't use shared variables in the Freemarker configuration to store anything - // except theme-specific data, because multiple portals or apps might share the same theme. So instead - // just put the shared variables in both root and body. - Map sharedVariables = getSharedVariables(vreq); // start by getting the title here - - // root is the map used to create the page shell - header, footer, menus, etc. - Map root = new HashMap(sharedVariables); - - // body is the map used to create the page body - Map body = new HashMap(sharedVariables); - - setUpRoot(vreq, root); - root.put("body", getBody(vreq, body, config)); // need config to get and process template - - // getBody() may have changed the title, so put the new value in the root map. (E.g., the title may - // include an individual's name, which is only discovered when processing the body.) - root.put("title", body.get("title")); - - writePage(root, config, response); + ResponseValues responseValues = processRequest(vreq); + doResponse(vreq, response, responseValues); } catch (Throwable e) { log.error("FreeMarkerHttpServlet could not forward to view.", e); @@ -93,8 +77,7 @@ public class FreemarkerHttpServlet extends VitroHttpServlet { doGet(request, response); } - protected Configuration getConfig(VitroRequest vreq) { - + protected Configuration getConfig(VitroRequest vreq) { String themeDir = getThemeDir(vreq.getPortal()); return getConfigForTheme(themeDir); } @@ -106,9 +89,10 @@ public class FreemarkerHttpServlet extends VitroHttpServlet { // load templates from. Thus configurations are associated with themes rather than portals. Map themeToConfigMap = (Map) (getServletContext().getAttribute("themeToConfigMap")); - if( themeToConfigMap == null ) - log.error("The templating system is not configured correctly. Make sure that you have the FreemarkerSetup context listener in your web.xml"); - if (themeToConfigMap.containsKey(themeDir)) { + if( themeToConfigMap == null ) { + log.error("The templating system is not configured correctly. Make sure that you have the FreemarkerSetup context listener in your web.xml."); + return null; // RY should we throw an error here instead? + } else if (themeToConfigMap.containsKey(themeDir)) { return themeToConfigMap.get(themeDir); } else { Configuration config = getNewConfig(themeDir); @@ -191,6 +175,105 @@ public class FreemarkerHttpServlet extends VitroHttpServlet { } } + + // Subclasses will override + protected ResponseValues processRequest(VitroRequest vreq) { + return null; + } + + protected void doResponse(VitroRequest vreq, HttpServletResponse response, ResponseValues values) { + try { +// switch (values.getType()) { +// case TEMPLATE: +// doTemplate(vreq, response, values); +// break; +// case REDIRECT: +// doRedirect(vreq, response, values); +// break; +// case FORWARD: +// doForward(vreq, response, values); +// break; +// case EXCEPTION: +// doException(vreq, response, values); +// break; +// } + + // RY Discuss with Jim - doing this instead of the switch allows us to get rid of the + // type field. We could also cast the values to the appropriate type: e.g., + // doException(vreq, response, (ExceptionResponseValues) values + // then method signature is doException(VitroRequest vreq, HttpServletResponse response, ExceptionResponseValues values) + // which seems to make more sense + if (values instanceof ExceptionResponseValues) { + doException(vreq, response, values); + } else if (values instanceof TemplateResponseValues) { + doTemplate(vreq, response, values); + } else if (values instanceof RedirectResponseValues) { + doRedirect(vreq, response, values); + } else if (values instanceof ForwardResponseValues) { + doForward(vreq, response, values); + } + } catch (ServletException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + + // RY *** A lot of this is shared with doException(). Factor out shared parts. + protected void doTemplate(VitroRequest vreq, HttpServletResponse response, ResponseValues values) { + + Configuration config = getConfig(vreq); + + // We can't use shared variables in the Freemarker configuration to store anything + // except theme-specific data, because multiple portals or apps might share the same theme. So instead + // just put the shared variables in both root and body. + Map sharedVariables = getSharedVariables(vreq); + + // root is the map used to create the page shell - header, footer, menus, etc. + Map root = new HashMap(sharedVariables); + + // body is the map used to create the page body + Map body = new HashMap(sharedVariables); + setUpRoot(vreq, root); + + // Add the values that we got, and merge to the template. + body.putAll(values.getMap()); + root.put("body", mergeMapToTemplate(values.getTemplateName(), body, config)); + + // Subclass processing may have changed the title, so put the new value in the root map. (E.g., the title may + // include an individual's name, which is only discovered when processing the body.) + root.put("title", body.get("title")); + + writePage(root, config, response); + } + + protected void doRedirect(HttpServletRequest request, HttpServletResponse response, ResponseValues values) + throws ServletException, IOException { + String redirectUrl = values.getRedirectUrl(); + response.sendRedirect(redirectUrl); + } + + protected void doForward(HttpServletRequest request, HttpServletResponse response, ResponseValues values) + throws ServletException, IOException { + String forwardUrl = values.getForwardUrl(); + if (forwardUrl.contains("://")) { + // It's a full URL, so redirect. + response.sendRedirect(forwardUrl); + } else { + // It's a relative URL, so forward within the application. + request.getRequestDispatcher(forwardUrl).forward(request, response); + } + } + + protected void doException(VitroRequest vreq, HttpServletResponse response, ResponseValues values) { + // Log the error, and display an error message on the page. + log.error(values.getException(), values.getException()); + TemplateResponseValues trv = new TemplateResponseValues(values.getTemplateName(), values.getMap()); + doTemplate(vreq, response, trv); + } // We can't use shared variables in the Freemarker configuration to store anything // except theme-specific data, because multiple portals or apps might share the same theme. So instead @@ -376,24 +459,26 @@ public class FreemarkerHttpServlet extends VitroHttpServlet { protected String getTitle(String siteName) { return siteName; } - - // Most subclasses will override. Some (e.g., ajax controllers) don't need to define a page body. - protected String getBody(VitroRequest vreq, Map body, Configuration config) { - return ""; - } protected StringWriter mergeToTemplate(String templateName, Map map, Configuration config) { FreemarkerHelper helper = new FreemarkerHelper(config); return helper.mergeToTemplate(templateName, map); } + + protected StringWriter mergeToTemplate(ResponseValues values, Configuration config) { + return mergeToTemplate(values.getTemplateName(), values.getMap(), config); + } - protected String mergeBodyToTemplate(String templateName, Map map, Configuration config) { + protected String mergeMapToTemplate(String templateName, Map map, Configuration config) { return mergeToTemplate(templateName, map, config).toString(); } - protected void writePage(Map root, Configuration config, HttpServletResponse response) { - String templateName = getPageTemplateName(); - writeTemplate(templateName, root, config, response); + protected String mergeResponseValuesToTemplate(ResponseValues values, Configuration config) { + return mergeMapToTemplate(values.getTemplateName(), values.getMap(), config); + } + + protected void writePage(Map root, Configuration config, HttpServletResponse response) { + writeTemplate(getPageTemplateName(), root, config, response); } protected void writeTemplate(String templateName, Map map, Configuration config, HttpServletResponse response) { @@ -424,4 +509,215 @@ public class FreemarkerHttpServlet extends VitroHttpServlet { new FreemarkerComponentGenerator(request); } + public static interface ResponseValues { +// enum ResponseType { +// TEMPLATE, REDIRECT, FORWARD, EXCEPTION +// } +// +// ResponseType getType(); + + String getTemplateName(); + + Map getMap(); + + String getRedirectUrl(); + + String getForwardUrl(); + + Throwable getException(); + } + + protected static class TemplateResponseValues implements ResponseValues { + private final String templateName; + private final Map map; + + public TemplateResponseValues(String templateName) { + this.templateName = templateName; + this.map = new HashMap(); + } + + public TemplateResponseValues(String templateName, Map map) { + this.templateName = templateName; + this.map = map; + } + + public TemplateResponseValues put(String key, Object value) { + this.map.put(key, value); + return this; + } + +// @Override +// public ResponseType getType() { +// return ResponseType.TEMPLATE; +// } + + @Override + public Map getMap() { + return Collections.unmodifiableMap(this.map); + } + + @Override + public String getTemplateName() { + return this.templateName; + } + + @Override + public String getRedirectUrl() { + throw new UnsupportedOperationException( + "This is not a redirect response."); + } + + @Override + public String getForwardUrl() { + throw new UnsupportedOperationException( + "This is not a forwarding response."); + } + + @Override + public Throwable getException() { + throw new UnsupportedOperationException( + "This is not an exception response."); + } + + } + + protected static class RedirectResponseValues implements ResponseValues { + private final String redirectUrl; + + public RedirectResponseValues(String redirectUrl) { + this.redirectUrl = redirectUrl; + } + +// @Override +// public ResponseType getType() { +// return ResponseType.REDIRECT; +// } + + @Override + public String getRedirectUrl() { + return this.redirectUrl; + } + + @Override + public String getTemplateName() { + throw new UnsupportedOperationException( + "This is not a template response."); + } + + @Override + public Map getMap() { + throw new UnsupportedOperationException( + "This is not a template response."); + } + + @Override + public String getForwardUrl() { + throw new UnsupportedOperationException( + "This is not a forwarding response."); + } + + @Override + public Throwable getException() { + throw new UnsupportedOperationException( + "This is not an exception response."); + } + + } + + protected static class ForwardResponseValues implements ResponseValues { + private final String forwardUrl; + + public ForwardResponseValues(String forwardUrl) { + this.forwardUrl = forwardUrl; + } + +// @Override +// public ResponseType getType() { +// return ResponseType.FORWARD; +// } + + @Override + public String getForwardUrl() { + return this.forwardUrl; + } + + @Override + public String getTemplateName() { + throw new UnsupportedOperationException( + "This is not a template response."); + } + + @Override + public Map getMap() { + throw new UnsupportedOperationException( + "This is not a template response."); + } + + @Override + public String getRedirectUrl() { + throw new UnsupportedOperationException( + "This is not a redirect response."); + } + + @Override + public Throwable getException() { + throw new UnsupportedOperationException( + "This is not an exception response."); + } + + } + + protected static class ExceptionResponseValues extends TemplateResponseValues { + private final static String DEFAULT_TEMPLATE_NAME = "error.ftl"; + private final Throwable cause; + + public ExceptionResponseValues(Throwable cause) { + super(DEFAULT_TEMPLATE_NAME); + this.cause = cause; + } + + public ExceptionResponseValues(String templateName, Throwable cause) { + super(templateName); + this.cause = cause; + } + + public ExceptionResponseValues(String templateName, Map map, Throwable cause) { + super(templateName, map); + this.cause = cause; + } + +// @Override +// public ResponseType getType() { +// return ResponseType.EXCEPTION; +// } + + @Override + public Throwable getException() { + return cause; + } + + @Override + public String getTemplateName() { + throw new UnsupportedOperationException( + "This is not a template response."); + } + + @Override + public Map getMap() { + throw new IllegalStateException("This is not a template response."); + } + + @Override + public String getRedirectUrl() { + throw new UnsupportedOperationException( + "This is not a redirect response."); + } + + @Override + public String getForwardUrl() { + throw new UnsupportedOperationException( + "This is not a forwarding response."); + } + + } } \ No newline at end of file diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerSetup.java index 1f203b594..5843a25b8 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerSetup.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerSetup.java @@ -25,6 +25,8 @@ public class FreemarkerSetup implements ServletContextListener { BaseTemplateModel.setServletContext(sc); FreemarkerComponentGenerator.setServletContext(sc); UrlBuilder.contextPath = sc.getContextPath(); + + log.info("Freemarker templating system initialized."); } public void contextDestroyed(ServletContextEvent event) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ImageUploadController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ImageUploadController.java index 07262a00f..d2cf38eb2 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ImageUploadController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ImageUploadController.java @@ -4,7 +4,6 @@ package edu.cornell.mannlib.vitro.webapp.controller.freemarker; import java.io.IOException; import java.util.Arrays; -import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; @@ -41,6 +40,10 @@ import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestedAct import edu.cornell.mannlib.vitro.webapp.beans.Individual; import edu.cornell.mannlib.vitro.webapp.controller.Controllers; 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.ImageUploadHelper; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet.ResponseValues; import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; import edu.cornell.mannlib.vitro.webapp.filestorage.backend.FileStorage; import edu.cornell.mannlib.vitro.webapp.filestorage.backend.FileStorageSetup; @@ -160,94 +163,31 @@ public class ImageUploadController extends FreemarkerHttpServlet { * *

*/ - @Override - public void doGet(HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { - - try { - // Parse the multi-part request. - request = FileUploadServletRequest.parseRequest(request, - MAXIMUM_FILE_SIZE); - if (log.isTraceEnabled()) { - dumpRequestDetails(request); - } - - // Do setup defined in VitroHttpServlet - setup(request); - - VitroRequest vreq = new VitroRequest(request); - - // If they aren't authorized to do this, send them to login. - if (!checkAuthorized(vreq)) { - String loginPage = request.getContextPath() + Controllers.LOGIN; - response.sendRedirect(loginPage); - return; - } - - ResponseValues values = buildTheResponse(vreq); - - switch (values.getType()) { - case FORWARD: - doForward(vreq, response, values); - break; - case TEMPLATE: - doTemplate(vreq, response, values); - break; - case EXCEPTION: - doException(vreq, response, values); - break; - } - } catch (Exception e) { - log.error("Could not produce response page", e); - } - } - - /** - * We processed a response, and want to show a template. - */ - private void doTemplate(VitroRequest vreq, HttpServletResponse response, - ResponseValues values) { - // Set it up like FreeMarkerHttpServlet.doGet() would do. - Configuration config = getConfig(vreq); - Map sharedVariables = getSharedVariables(vreq); - Map root = new HashMap(sharedVariables); - Map body = new HashMap(sharedVariables); - setUpRoot(vreq, root); - - // Add the values that we got, and merge to the template. - body.putAll(values.getBodyMap()); - root.put("body", - mergeBodyToTemplate(values.getTemplateName(), body, config)); - - // Continue to simulate FreeMarkerHttpServlet.doGet() - root.put("title", body.get("title")); - writePage(root, config, response); - } - - /** - * We processsed a response, and want to forward to another page. - */ - private void doForward(HttpServletRequest req, HttpServletResponse resp, - ResponseValues values) throws ServletException, IOException { - String forwardUrl = values.getForwardUrl(); - if (forwardUrl.contains("://")) { - // It's a full URL, so redirect. - resp.sendRedirect(forwardUrl); - } else { - // It's a relative URL, so forward within the application. - req.getRequestDispatcher(forwardUrl).forward(req, resp); - } - } - - /** - * We processed a response, and need to display an internal exception. - */ - private void doException(VitroRequest vreq, HttpServletResponse resp, - ResponseValues values) { - log.error(values.getException(), values.getException()); - doTemplate(vreq, resp, new TemplateResponseValues(TEMPLATE_ERROR)); - } - + + @Override + protected ResponseValues processRequest(VitroRequest vreq) { + try { + // Parse the multi-part request. + FileUploadServletRequest request = FileUploadServletRequest.parseRequest(vreq, + MAXIMUM_FILE_SIZE); + if (log.isTraceEnabled()) { + dumpRequestDetails(vreq); + } + + // If they aren't authorized to do this, send them to login. + if (!checkAuthorized(vreq)) { + String loginPage = request.getContextPath() + Controllers.LOGIN; + return new RedirectResponseValues(loginPage); + } + + return buildTheResponse(vreq); + + } catch (Exception e) { + //log.error("Could not produce response page", e); + return new ExceptionResponseValues(e); + } + } + /** * Handle the different actions. If not specified, the default action is to * show the intro screen. @@ -658,136 +598,7 @@ public class ImageUploadController extends FreemarkerHttpServlet { } } - private static interface ResponseValues { - enum ResponseType { - TEMPLATE, FORWARD, EXCEPTION - } - ResponseType getType(); - - String getTemplateName(); - - Map getBodyMap(); - - String getForwardUrl(); - - Throwable getException(); - } - - private static class TemplateResponseValues implements ResponseValues { - private final String templateName; - private final Map bodyMap = new HashMap(); - - public TemplateResponseValues(String templateName) { - this.templateName = templateName; - } - - public TemplateResponseValues put(String key, Object value) { - this.bodyMap.put(key, value); - return this; - } - - @Override - public ResponseType getType() { - return ResponseType.TEMPLATE; - } - - @Override - public Map getBodyMap() { - return Collections.unmodifiableMap(this.bodyMap); - } - - @Override - public String getTemplateName() { - return this.templateName; - } - - @Override - public Throwable getException() { - throw new UnsupportedOperationException( - "This is not an exception response."); - } - - @Override - public String getForwardUrl() { - throw new UnsupportedOperationException( - "This is not a forwarding response."); - } - - } - - private static class ForwardResponseValues implements ResponseValues { - private final String forwardUrl; - - public ForwardResponseValues(String forwardUrl) { - this.forwardUrl = forwardUrl; - } - - @Override - public ResponseType getType() { - return ResponseType.FORWARD; - } - - @Override - public String getForwardUrl() { - return this.forwardUrl; - } - - @Override - public String getTemplateName() { - throw new UnsupportedOperationException( - "This is not a template response."); - } - - @Override - public Map getBodyMap() { - throw new UnsupportedOperationException( - "This is not a template response."); - } - - @Override - public Throwable getException() { - throw new UnsupportedOperationException( - "This is not an exception response."); - } - - } - - private static class ExceptionResponseValues implements ResponseValues { - private final Throwable cause; - - public ExceptionResponseValues(Throwable cause) { - this.cause = cause; - } - - @Override - public ResponseType getType() { - return ResponseType.EXCEPTION; - } - - @Override - public Throwable getException() { - return cause; - } - - @Override - public String getTemplateName() { - throw new UnsupportedOperationException( - "This is not a template response."); - } - - @Override - public Map getBodyMap() { - throw new IllegalStateException("This is not a template response."); - } - - @Override - public String getForwardUrl() { - throw new UnsupportedOperationException( - "This is not a forwarding response."); - } - - } /** * If they are logged in as an Editor or better, they can do whatever they diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualController.java index 031732e4d..2144f3959 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualController.java @@ -44,6 +44,7 @@ import edu.cornell.mannlib.vitro.webapp.beans.Portal; import edu.cornell.mannlib.vitro.webapp.beans.VClass; import edu.cornell.mannlib.vitro.webapp.controller.Controllers; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet.ResponseValues; import edu.cornell.mannlib.vitro.webapp.dao.IndividualDao; import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyDao; import edu.cornell.mannlib.vitro.webapp.edit.n3editing.EditConfiguration; @@ -74,7 +75,8 @@ public class IndividualController extends FreemarkerHttpServlet { private ApplicationBean appBean; - protected String getBody(VitroRequest vreq, Map body, Configuration config) { + @Override + protected ResponseValues processRequest(VitroRequest vreq) { try { HttpSession session = vreq.getSession(); @@ -92,13 +94,13 @@ public class IndividualController extends FreemarkerHttpServlet { String redirectURL = checkForRedirect ( url, vreq.getHeader("accept") ); if( redirectURL != null ){ //doRedirect( vreq, res, redirectURL ); - return ""; + return null; } ContentType rdfFormat = checkForLinkedDataRequest(url,vreq.getHeader("accept")); if( rdfFormat != null ){ //doRdf( vreq, res, rdfFormat ); - return ""; + return null; } Individual individual = null; @@ -106,37 +108,34 @@ public class IndividualController extends FreemarkerHttpServlet { individual = getEntityFromRequest( vreq); }catch(Throwable th){ //doHelp(res); - return ""; + return null; } if( individual == null || checkForHidden(vreq, individual) || checkForSunset(vreq, individual)){ //doNotFound(vreq, res); - return ""; + return null; } // If this is an uploaded file, redirect to its "alias URL". String aliasUrl = getAliasUrlForBytestreamIndividual(vreq, individual); if (aliasUrl != null) { //res.sendRedirect(vreq.getContextPath() + aliasUrl); - return ""; + return null; } - + Map body = new HashMap(); + int securityLevel = getSecurityLevel(session); UrlBuilder urlBuilder = new UrlBuilder(vreq.getPortal()); body.put("editStatus", getEditingData(vreq, securityLevel, individual, urlBuilder)); body.putAll(getIndividualData(vreq, individual)); body.put("title", individual.getName()); - - String bodyTemplate = "individual.ftl"; - return mergeBodyToTemplate(bodyTemplate, body, config); + + return new TemplateResponseValues("individual.ftl", body); } catch (Throwable e) { log.error(e); - //vreq.setAttribute("javax.servlet.jsp.jspException",e); - // RequestDispatcher rd = vreq.getRequestDispatcher("/error.jsp"); - //rd.forward(vreq, res); - return ""; + return new ExceptionResponseValues(e); } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualListController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualListController.java index bfacd7cf5..84a184023 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualListController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualListController.java @@ -14,6 +14,7 @@ import edu.cornell.mannlib.vitro.webapp.beans.Individual; import edu.cornell.mannlib.vitro.webapp.beans.VClass; import edu.cornell.mannlib.vitro.webapp.beans.VClassGroup; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet.ResponseValues; import edu.cornell.mannlib.vitro.webapp.utils.StringUtils; import edu.cornell.mannlib.vitro.webapp.web.templatemodels.IndividualTemplateModel; import freemarker.template.Configuration; @@ -28,9 +29,11 @@ public class IndividualListController extends FreemarkerHttpServlet { // private VClass vclass = null; // private String title = null; - protected String getBody(VitroRequest vreq, Map body, Configuration config) { + @Override + protected ResponseValues processRequest(VitroRequest vreq) { - String bodyTemplate = "individualList.ftl"; + String templateName = "individualList.ftl"; + Map body = new HashMap(); String errorMessage = null; String message = null; @@ -90,17 +93,17 @@ public class IndividualListController extends FreemarkerHttpServlet { } catch (HelpException help){ errorMessage = "Request attribute 'vclass' or request parameter 'vclassId' must be set before calling. Its value must be a class uri."; } catch (Throwable e) { - bodyTemplate = "error.ftl"; + return new ExceptionResponseValues(e); } if (errorMessage != null) { - bodyTemplate = "errorMessage.ftl"; + templateName = "errorMessage.ftl"; body.put("errorMessage", errorMessage); } else if (message != null) { body.put("message", message); } - return mergeBodyToTemplate(bodyTemplate, body, config); + return new TemplateResponseValues(templateName, body); } private class HelpException extends Throwable { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/NavigationController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/NavigationController.java index 09b01c68e..fb4d405f1 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/NavigationController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/NavigationController.java @@ -28,6 +28,7 @@ import com.hp.hpl.jena.rdf.model.Statement; import com.hp.hpl.jena.rdf.model.StmtIterator; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet.ResponseValues; import edu.cornell.mannlib.vitro.webapp.web.DisplayVocabulary; import freemarker.template.Configuration; @@ -46,8 +47,8 @@ public class NavigationController extends FreemarkerHttpServlet { displayOntModel.getBaseModel().register( urlPatterns ); } - @Override - protected String getBody(VitroRequest vreq, Map body, Configuration config) { + @Override + protected ResponseValues processRequest(VitroRequest vreq) { OntModel displayOntModel = (OntModel)getServletContext().getAttribute("displayOntModel"); OntModel jenaOntModel = (OntModel)getServletContext().getAttribute("jenaOntModel"); @@ -56,7 +57,7 @@ public class NavigationController extends FreemarkerHttpServlet { Map values = getValues(ind, displayOntModel,jenaOntModel, getValuesFromRequest(/*?*/) ); String template = getTemplate(ind, displayOntModel); - return mergeBodyToTemplate(template, values, config); + return new TemplateResponseValues(template, values); } private MapgetValuesFromRequest(){ diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/SiteAdminController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/SiteAdminController.java index d2a152431..9405b6b29 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/SiteAdminController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/SiteAdminController.java @@ -15,6 +15,7 @@ import edu.cornell.mannlib.vedit.beans.LoginFormBean; import edu.cornell.mannlib.vedit.util.FormUtils; import edu.cornell.mannlib.vitro.webapp.beans.VClassGroup; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet.ResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.ParamMap; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.Route; import edu.cornell.mannlib.vitro.webapp.controller.login.LoginTemplateHelper; @@ -27,11 +28,13 @@ public class SiteAdminController extends FreemarkerHttpServlet { private static final long serialVersionUID = 1L; private static final Log log = LogFactory.getLog(SiteAdminController.class); + @Override public String getTitle(String siteName) { return siteName + " Site Administration"; } - public String getBody(VitroRequest vreq, Map body, Configuration config) { + @Override + protected ResponseValues processRequest(VitroRequest vreq) { String loginStatus = null; @@ -40,10 +43,14 @@ public class SiteAdminController extends FreemarkerHttpServlet { loginStatus = loginHandler.getLoginStatus(); } + Map body = new HashMap(); + // NOT LOGGED IN: just show login form if (loginHandler == null || !"authenticated".equals(loginStatus)) { - body.put("loginPanel", new LoginTemplateHelper(vreq).showLoginPage(vreq, body, config)); - + // Unlike the other panels on this page, we put the data directly in the body, because the templates are also used + // by the JSP version, where the data is placed directly in the body map. + body.putAll(getLoginPanelData(vreq)); + // LOGGED IN: show editing options based on user role } else { @@ -79,10 +86,24 @@ public class SiteAdminController extends FreemarkerHttpServlet { // } // body.put("languageModeStr", languageMode); - return mergeBodyToTemplate("siteAdmin-main.ftl", body, config); + return new TemplateResponseValues("siteAdmin-main.ftl", body); } + private Map getLoginPanelData(VitroRequest vreq) { + Map map = null; + // This is somewhat awkward, because we are trying to use the login code with as few modifications as possible + // as it was set up for the JSP version as well. We have to unpack the TemplateResponseValues + // object and put everything in a map. + TemplateResponseValues trv = new LoginTemplateHelper(vreq).showLoginPanel(vreq); + if (trv != null) { + map = new HashMap(); + map.putAll(trv.getMap()); + map.put("loginTemplate", trv.getTemplateName()); + } + return map; + } + private Map getDataInputData(VitroRequest vreq) { Map map = new HashMap(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TermsOfUseController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TermsOfUseController.java index db99bf462..b0247c426 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TermsOfUseController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TermsOfUseController.java @@ -10,29 +10,33 @@ import org.apache.commons.logging.LogFactory; import edu.cornell.mannlib.vitro.webapp.beans.Portal; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet.ResponseValues; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet.TemplateResponseValues; import edu.cornell.mannlib.vitro.webapp.utils.StringUtils; import freemarker.template.Configuration; public class TermsOfUseController extends FreemarkerHttpServlet { private static final long serialVersionUID = 1L; - private static final Log log = LogFactory.getLog(TermsOfUseController.class.getName()); + private static final Log log = LogFactory.getLog(TermsOfUseController.class); + + @Override + protected ResponseValues processRequest(VitroRequest vreq) { + Portal portal = vreq.getPortal(); + + Map body = new HashMap(); + + String rootBreadCrumbAnchor = portal.getRootBreadCrumbAnchor(); + String websiteName = StringUtils.isEmpty(rootBreadCrumbAnchor) ? portal.getAppName() : rootBreadCrumbAnchor; + body.put("websiteName", websiteName); + + body.put("copyrightAnchor", portal.getCopyrightAnchor()); + + return new TemplateResponseValues("termsOfUse.ftl", body); + } + @Override protected String getTitle(String siteName) { return siteName + " Terms of Use"; } - - protected String getBody(VitroRequest vreq, Map body, Configuration config) { - - Portal portal = vreq.getPortal(); - - String rootBreadCrumbAnchor = portal.getRootBreadCrumbAnchor(); - String websiteName = StringUtils.isEmpty(rootBreadCrumbAnchor) ? portal.getAppName() : rootBreadCrumbAnchor; - - body.put("websiteName", websiteName); - body.put("copyrightAnchor", portal.getCopyrightAnchor()); - - String bodyTemplate = "termsOfUse.ftl"; - return mergeBodyToTemplate(bodyTemplate, body, config); - } } \ No newline at end of file diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TestController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TestController.java index d6bd41130..d5d468dd5 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TestController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TestController.java @@ -12,7 +12,10 @@ import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import edu.cornell.mannlib.vitro.webapp.beans.Portal; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet.ResponseValues; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet.TemplateResponseValues; import freemarker.template.Configuration; /** @@ -25,12 +28,11 @@ public class TestController extends FreemarkerHttpServlet { private static final long serialVersionUID = 1L; private static final Log log = LogFactory.getLog(TestController.class); - protected String getTitle() { - return "Test"; - } - - protected String getBody(VitroRequest vreq, Map body, Configuration config) { + @Override + protected ResponseValues processRequest(VitroRequest vreq) { + Portal portal = vreq.getPortal(); + Map body = new HashMap(); // Test of #list directive in template on undefined, null, and empty values. // Basic idea: empty list okay, null or undefined value not okay. List apples = new ArrayList(); // no error @@ -85,10 +87,22 @@ public class TestController extends FreemarkerHttpServlet { body.put("bookTitle", "Persuasion"); body.put("title", "VIVO Test"); + + return new TemplateResponseValues("test.ftl", body); + } + + @Override + protected String getTitle(String siteName) { + return "Test"; + } + + protected String getBody(VitroRequest vreq, Map body, Configuration config) { + + // Create the template to see the examples live. String bodyTemplate = "test.ftl"; - return mergeBodyToTemplate(bodyTemplate, body, config); + return mergeMapToTemplate(bodyTemplate, body, config); } 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 8885eb597..1f1836a95 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 @@ -77,23 +77,26 @@ public class LoginTemplateHelper extends LoginTemplateHelperBase { } /** Version for Freemarker page */ - public String showLoginPage(VitroRequest vreq, Map body, Configuration config) { + public TemplateResponseValues showLoginPanel(VitroRequest vreq) { try { State state = getCurrentLoginState(vreq); log.debug("State on exit: " + state); - + switch (state) { + // RY Why does this case exist? We don't call this method if a user is logged in. case LOGGED_IN: - return ""; + return null; case FORCED_PASSWORD_CHANGE: - return doTemplate(vreq, showPasswordChangeScreen(vreq), body, config); + //return doTemplate(vreq, showPasswordChangeScreen(vreq), body, config); + return showPasswordChangeScreen(vreq); default: - return doTemplate(vreq, showLoginScreen(vreq), body, config); + //return doTemplate(vreq, showLoginScreen(vreq), body, config); + return showLoginScreen(vreq); } } catch (Exception e) { log.error(e); - return doTemplate(vreq, showError(vreq, e), body, config); + return showError(vreq, e); } } @@ -121,6 +124,7 @@ public class LoginTemplateHelper extends LoginTemplateHelperBase { if (!errorMessage.isEmpty()) { trv.put(BODY_ERROR_MESSAGE, errorMessage); } + return trv; } @@ -165,20 +169,10 @@ public class LoginTemplateHelper extends LoginTemplateHelperBase { setUpRoot(vreq, root); // Add the values that we got, and merge to the template. - body.putAll(values.getBodyMap()); - return mergeBodyToTemplate(values.getTemplateName(), body, config); + body.putAll(values.getMap()); + return mergeMapToTemplate(values.getTemplateName(), body, config); } - - /** - * We processed a response, and want to show a template. - * Version for Freemarker page. - */ - private String doTemplate(VitroRequest vreq, TemplateResponseValues values, Map body, Configuration config) { - // Add the values that we got, and merge to the template. - body.putAll(values.getBodyMap()); - return mergeBodyToTemplate(values.getTemplateName(), body, config); - } /** * Where are we in the process? Logged in? Not? Somewhere in between? @@ -240,29 +234,4 @@ public class LoginTemplateHelper extends LoginTemplateHelperBase { return portalIdParameter; } } - - /** - * Holds the name of the template and the map of values. - */ - private static class TemplateResponseValues { - private final String templateName; - private final Map bodyMap = new HashMap(); - - public TemplateResponseValues(String templateName) { - this.templateName = templateName; - } - - public TemplateResponseValues put(String key, Object value) { - this.bodyMap.put(key, value); - return this; - } - - public Map getBodyMap() { - return Collections.unmodifiableMap(this.bodyMap); - } - - public String getTemplateName() { - return this.templateName; - } - } } 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 3993806f7..a5fe95d94 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 @@ -106,7 +106,11 @@ public class FreemarkerPagedSearchController extends FreemarkerHttpServlet imple } } - protected String getBody(VitroRequest vreq, Map body, Configuration config) { + @Override + protected ResponseValues processRequest(VitroRequest vreq) { + + Map body = new HashMap(); + try { Portal portal = vreq.getPortal(); @@ -116,7 +120,7 @@ public class FreemarkerPagedSearchController extends FreemarkerHttpServlet imple if( vreq.getWebappDaoFactory() == null || vreq.getWebappDaoFactory().getIndividualDao() == null ){ log.error("makeUsableBeans() could not get IndividualDao "); - return doSearchError("Could not access Model.", config); + return doSearchError("Could not access Model."); } IndividualDao iDao = vreq.getWebappDaoFactory().getIndividualDao(); VClassGroupDao grpDao = vreq.getWebappDaoFactory().getVClassGroupDao(); @@ -153,7 +157,7 @@ public class FreemarkerPagedSearchController extends FreemarkerHttpServlet imple log.debug("query for '" + qtxt +"' is " + query.toString()); if (query == null ) { - return doNoQuery(config, portal); + return doNoQuery(portal); } IndexSearcher searcherForRequest = getIndexSearcher(indexDir); @@ -173,19 +177,19 @@ public class FreemarkerPagedSearchController extends FreemarkerHttpServlet imple if (msg == null) { msg = "The search request contained errors."; } - return doFailedSearch(msg, qtxt, config); + return doFailedSearch(msg, qtxt); } } if( topDocs == null || topDocs.scoreDocs == null){ log.error("topDocs for a search was null"); String msg = "The search request contained errors."; - return doFailedSearch(msg, qtxt, config); + return doFailedSearch(msg, qtxt); } int hitsLength = topDocs.scoreDocs.length; if ( hitsLength < 1 ){ - return doNoHits(qtxt, config); + return doNoHits(qtxt); } log.debug("found "+hitsLength+" hits"); @@ -286,12 +290,11 @@ public class FreemarkerPagedSearchController extends FreemarkerHttpServlet imple body.put("nextPage", getNextPageLink(startIndex, hitsPerPage, vreq.getServletPath(), pagingLinkParams)); } - } catch (Throwable e) { - log.error(e, e); - return doSearchError(e.getMessage(), config); + } catch (Throwable e) { + return doSearchError(e); } - return mergeBodyToTemplate("search-pagedResults.ftl", body, config); + return new TemplateResponseValues("search-pagedResults.ftl", body); } private void alphaSortIndividuals(List beans) { @@ -749,34 +752,40 @@ public class FreemarkerPagedSearchController extends FreemarkerHttpServlet imple } } - private String doSearchError(String message, Configuration config) { + private TemplateResponseValues doSearchError(String message) { Map body = new HashMap(); body.put("message", "Search failed: " + message); - return mergeBodyToTemplate("search-error.ftl", body, config); + return new TemplateResponseValues("search-error.ftl", body); } - private String doNoQuery(Configuration config, Portal portal) { + private ExceptionResponseValues doSearchError(Throwable e) { + Map body = new HashMap(); + body.put("message", "Search failed: " + e.getMessage()); + return new ExceptionResponseValues("search-error.ftl", body, e); + } + + private TemplateResponseValues doNoQuery(Portal portal) { Map body = new HashMap(); body.put("title", "Search " + portal.getAppName()); body.put("message", "No query entered."); - return mergeBodyToTemplate("search-error.ftl", body, config); + return new TemplateResponseValues("search-error.ftl", body); } - private String doFailedSearch(String message, String querytext, Configuration config) { + private TemplateResponseValues doFailedSearch(String message, String querytext) { Map body = new HashMap(); body.put("title", "Search for '" + querytext + "'"); if ( StringUtils.isEmpty(message) ) { message = "Search failed."; } body.put("message", message); - return mergeBodyToTemplate("search-error.ftl", body, config); + return new TemplateResponseValues("search-error.ftl", body); } - private String doNoHits(String querytext, Configuration config) { + private TemplateResponseValues doNoHits(String querytext) { Map body = new HashMap(); body.put("title", "Search for '" + querytext + "'"); body.put("message", "No matching results."); - return mergeBodyToTemplate("search-error.ftl", body, config); + return new TemplateResponseValues("search-error.ftl", body); } /** diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/IndexController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/IndexController.java index dfda2ea57..d2062edf5 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/IndexController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/IndexController.java @@ -1,102 +1,100 @@ /* $This file is distributed under the terms of the license in /doc/license.txt$ */ -package edu.cornell.mannlib.vitro.webapp.search.controller; - -import java.io.IOException; -import java.util.Map; +package edu.cornell.mannlib.vitro.webapp.search.controller; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import edu.cornell.mannlib.vedit.beans.LoginFormBean; -import edu.cornell.mannlib.vitro.webapp.controller.Controllers; 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.UrlBuilder; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.Route; import edu.cornell.mannlib.vitro.webapp.search.IndexingException; import edu.cornell.mannlib.vitro.webapp.search.indexing.IndexBuilder; -import freemarker.template.Configuration; - -/** - * Accepts requests to rebuild or update the search index. It uses - * an IndexBuilder and finds that IndexBuilder from the servletContext using - * the key "edu.cornel.mannlib.vitro.search.indexing.IndexBuilder" - * - * That IndexBuilder will be associated with a object that implements the IndexerIface. - * - * An example of the IndexerIface is LuceneIndexer. - * An example of the IndexBuilder and LuceneIndexer getting setup is in LuceneSetup. - * - * @author bdc34 - * - */ -public class IndexController extends FreemarkerHttpServlet { - - private static final Log log = LogFactory.getLog(IndexController.class.getName()); - -// public void doPost(HttpServletRequest request, HttpServletResponse response) -// throws ServletException,IOException { -// doGet(request, response); -// } -// -// public void doGet( HttpServletRequest request, HttpServletResponse response ) -// throws IOException, ServletException { -// -// Object obj = request.getSession().getAttribute("loginHandler"); -// LoginFormBean loginHandler = null; -// if( obj != null && obj instanceof LoginFormBean ) -// loginHandler = ((LoginFormBean)obj); -// if( loginHandler == null || -// ! "authenticated".equalsIgnoreCase(loginHandler.getLoginStatus()) || -// Integer.parseInt(loginHandler.getLoginRole()) <= 5 ){ -// -// String redirectURL=request.getContextPath() + Controllers.SITE_ADMIN + "?login=block"; -// response.sendRedirect(redirectURL); -// return; -// } + +/** + * Accepts requests to rebuild or update the search index. It uses + * an IndexBuilder and finds that IndexBuilder from the servletContext using + * the key "edu.cornel.mannlib.vitro.search.indexing.IndexBuilder" + * + * That IndexBuilder will be associated with a object that implements the IndexerIface. + * + * An example of the IndexerIface is LuceneIndexer. + * An example of the IndexBuilder and LuceneIndexer getting setup is in LuceneSetup. + * + * @author bdc34 + * + */ +public class IndexController extends FreemarkerHttpServlet { + + private static final Log log = LogFactory.getLog(IndexController.class.getName()); + +// public void doPost(HttpServletRequest request, HttpServletResponse response) +// throws ServletException,IOException { +// doGet(request, response); +// } +// +// public void doGet( HttpServletRequest request, HttpServletResponse response ) +// throws IOException, ServletException { // -// long start = System.currentTimeMillis(); -// try { -// IndexBuilder builder = (IndexBuilder)getServletContext().getAttribute(IndexBuilder.class.getName()); -// if( request.getParameter("update") != null ){ -// builder.doUpdateIndex(); -// }else{ -// builder.doIndexRebuild(); -// } -// -// } catch (IndexingException e) { -// log.error("IndexController -- Error building index: " + e); +// Object obj = request.getSession().getAttribute("loginHandler"); +// LoginFormBean loginHandler = null; +// if( obj != null && obj instanceof LoginFormBean ) +// loginHandler = ((LoginFormBean)obj); +// if( loginHandler == null || +// ! "authenticated".equalsIgnoreCase(loginHandler.getLoginStatus()) || +// Integer.parseInt(loginHandler.getLoginRole()) <= 5 ){ +// +// String redirectURL=request.getContextPath() + Controllers.SITE_ADMIN + "?login=block"; +// response.sendRedirect(redirectURL); +// return; +// } +// +// long start = System.currentTimeMillis(); +// try { +// IndexBuilder builder = (IndexBuilder)getServletContext().getAttribute(IndexBuilder.class.getName()); +// if( request.getParameter("update") != null ){ +// builder.doUpdateIndex(); +// }else{ +// builder.doIndexRebuild(); +// } +// +// } catch (IndexingException e) { +// log.error("IndexController -- Error building index: " + e); // } // long delta = System.currentTimeMillis() - start; -// String msg = "Search index complete. Elapsed time " + delta + " msec."; +// String msg = "Search index complete. Elapsed time " + delta + " msec."; // } - + @Override protected String getTitle(String siteName) { return "Full Search Index Rebuild"; } - protected String getBody(VitroRequest request, Map body, Configuration config) { + @Override + protected ResponseValues processRequest(VitroRequest vreq) { + + Object obj = vreq.getSession().getAttribute("loginHandler"); + Map body = new HashMap(); - Object obj = request.getSession().getAttribute("loginHandler"); LoginFormBean loginHandler = null; if( obj != null && obj instanceof LoginFormBean ) loginHandler = ((LoginFormBean)obj); if( loginHandler == null || ! "authenticated".equalsIgnoreCase(loginHandler.getLoginStatus()) || - Integer.parseInt(loginHandler.getLoginRole()) <= 5 ){ + Integer.parseInt(loginHandler.getLoginRole()) <= LoginFormBean.CURATOR ){ - body.put("message","You must log in to rebuild the search index."); - return mergeBodyToTemplate("message.ftl", body, config); + return new RedirectResponseValues(UrlBuilder.getUrl(Route.LOGIN)); } - long start = System.currentTimeMillis(); + // long start = System.currentTimeMillis(); try { IndexBuilder builder = (IndexBuilder)getServletContext().getAttribute(IndexBuilder.class.getName()); - if( request.getParameter("update") != null ){ + if( vreq.getParameter("update") != null ){ builder.doUpdateIndex(); }else{ builder.doIndexRebuild(); @@ -105,10 +103,10 @@ public class IndexController extends FreemarkerHttpServlet { } catch (IndexingException e) { log.error("Error rebuilding search index",e); body.put("errorMessage", "There was an error while rebuilding the search index. " + e.getMessage()); - return mergeBodyToTemplate("errorMessage.ftl", body, config); + return new ExceptionResponseValues("errorMessage.ftl", body, e); } body.put("message","Rebuilding of index started."); - return mergeBodyToTemplate("message.ftl", body, config); - } -} + return new TemplateResponseValues("message.ftl", body); + } +} diff --git a/webapp/web/templates/freemarker/body/login/login-main.ftl b/webapp/web/templates/freemarker/body/login/login-main.ftl index 75d02353d..a4caf2968 100644 --- a/webapp/web/templates/freemarker/body/login/login-main.ftl +++ b/webapp/web/templates/freemarker/body/login/login-main.ftl @@ -2,8 +2,8 @@ <#-- Main template for the login panel --> -<#if loginPanel??> - ${loginPanel} +<#if loginTemplate??> + <#include loginTemplate> ${stylesheets.add("/css/login.css")} ${stylesheets.addFromTheme("/css/formedit.css")}