From 3105e29bca7a39011ab83d04ce85d4ae5fd126fe Mon Sep 17 00:00:00 2001 From: rjy7 Date: Fri, 14 May 2010 20:01:12 +0000 Subject: [PATCH] Use FreeMarker templates to generate page identity, menu, search, and footer in JSP pages. This will allow theme authors to work just with the ftls rather than having to maintain both jsp and ftl versions of these templates, during the transition from JSP to FreeMarker. --- .../FreeMarkerComponentGenerator.java | 50 +++++++++++++++++++ .../controller/FreeMarkerHttpServlet.java | 31 +++++++++--- .../webapp/controller/VitroHttpServlet.java | 9 ++++ .../webapp/servlet/setup/FreeMarkerSetup.java | 3 ++ .../vitro/webapp/utils/StringUtils.java | 3 +- .../web/templates/freemarker/page/default.ftl | 1 + webapp/web/themes/enhanced/jsp/identity.jsp | 2 +- 7 files changed, 89 insertions(+), 10 deletions(-) create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/controller/FreeMarkerComponentGenerator.java diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/FreeMarkerComponentGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/FreeMarkerComponentGenerator.java new file mode 100644 index 000000000..fa6b0f583 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/FreeMarkerComponentGenerator.java @@ -0,0 +1,50 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.controller; + +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * TEMPORARY for transition from JSP to FreeMarker. Once transition + * is complete and no more pages are generated in JSP, this can be removed. + * + * @author rjy7 + * + */ +public class FreeMarkerComponentGenerator extends FreeMarkerHttpServlet { + + private static final long serialVersionUID = 1L; + private static final Log log = LogFactory.getLog(FreeMarkerHttpServlet.class.getName()); + + FreeMarkerComponentGenerator(HttpServletRequest request, HttpServletResponse response) { + doSetup(request, response); + } + + public String getIdentity() { + return get("identity"); + } + + public String getMenu() { + return get("menu"); + } + + public String getSearch() { + return get("search"); + } + + public String getFooter() { + return get("footer"); + } + + private String get(String templateName) { + String template = "components/" + templateName + ".ftl"; + return mergeToTemplate(template, root).toString(); + } + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/FreeMarkerHttpServlet.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/FreeMarkerHttpServlet.java index f4fd9efff..7ec482dd4 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/FreeMarkerHttpServlet.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/FreeMarkerHttpServlet.java @@ -47,6 +47,7 @@ public class FreeMarkerHttpServlet extends VitroHttpServlet { public static Configuration config = null; public static String contextPath = null; + public static ServletContext context = null; protected VitroRequest vreq; protected HttpServletResponse response; @@ -60,6 +61,7 @@ public class FreeMarkerHttpServlet extends VitroHttpServlet { throws IOException, ServletException { try { + callSuperGet(request, response); // RY Yuck...redo doSetup(request, response); setTitle(); setBody(); @@ -167,8 +169,7 @@ public class FreeMarkerHttpServlet extends VitroHttpServlet { } } - protected void doSetup(HttpServletRequest request, HttpServletResponse response) { - + protected void callSuperGet(HttpServletRequest request, HttpServletResponse response) { try { super.doGet(request,response); } catch (ServletException e) { @@ -177,7 +178,12 @@ public class FreeMarkerHttpServlet extends VitroHttpServlet { } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); - } + } + } + + // RY This needs to be broken out as is for FreeMarkerComponentGenerator, which should not + // include callSuperGet(). So it's only temporary. + protected void doSetup(HttpServletRequest request, HttpServletResponse response) { vreq = new VitroRequest(request); this.response = response; @@ -294,10 +300,8 @@ public class FreeMarkerHttpServlet extends VitroHttpServlet { // and we have multi-portal installations, and (b) we need to support theme-switching on the fly. // To make more efficient, we could do this once, and then have a listener that does it again // when theme is switched.BUT this doesn't support (a), only (b), so we have to do it on every request. - private final void setTemplateLoader() { + protected final void setTemplateLoader() { - // RY If this is needed in other methods, put in instance var - ServletContext context = getServletContext(); String themeTemplateDir = context.getRealPath(portal.getThemeDir()) + "/ftl"; String vitroTemplateDir = context.getRealPath("/templates/freemarker"); @@ -324,5 +328,18 @@ public class FreeMarkerHttpServlet extends VitroHttpServlet { private TabMenu getTabMenu(int portalId) { return new TabMenu(vreq, portalId); } - + + // TEMPORARY for transition from JSP to FreeMarker. Once transition + // is complete and no more pages are generated in JSP, this can be removed. + // Do this if FreeMarker is configured (i.e., not Datastar) and if we are not in + // a FreeMarkerHttpServlet, which will generate identity, menu, and footer from the page template. + // It's a static method because it needs to be called from JSPs that don't go through a servlet. + public static void getFreeMarkerComponentsForJsp(HttpServletRequest request, HttpServletResponse response) { + FreeMarkerComponentGenerator fcg = new FreeMarkerComponentGenerator(request, response); + request.setAttribute("ftl_identity", fcg.getIdentity()); + request.setAttribute("ftl_menu", fcg.getMenu()); + request.setAttribute("ftl_search", fcg.getSearch()); + request.setAttribute("ftl_footer", fcg.getFooter()); + } + } \ No newline at end of file diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/VitroHttpServlet.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/VitroHttpServlet.java index bcccac4a5..acc375490 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/VitroHttpServlet.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/VitroHttpServlet.java @@ -63,7 +63,16 @@ public class VitroHttpServlet extends HttpServlet request.getAttribute("webappDaoFactory") == null ){ log.warn("request scope was not prepared by VitroRequestPrep"); } + + // TEMPORARY for transition from JSP to FreeMarker. Once transition + // is complete and no more pages are generated in JSP, this can be removed. + // Do this if FreeMarker is configured (i.e., not Datastar) and if we are not in + // a FreeMarkerHttpServlet, which will generate identity, menu, and footer from the page template. + if ( FreeMarkerHttpServlet.config != null && !(this instanceof FreeMarkerHttpServlet) ) { + FreeMarkerHttpServlet.getFreeMarkerComponentsForJsp(request, response); + } } + /** * doPost does the same thing as the doGet method diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/FreeMarkerSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/FreeMarkerSetup.java index aa7b3566b..f3e771e7d 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/FreeMarkerSetup.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/FreeMarkerSetup.java @@ -59,8 +59,11 @@ public class FreeMarkerSetup implements ServletContextListener { String contextPath = sc.getContextPath(); FreeMarkerHttpServlet.contextPath = contextPath; + FreeMarkerHttpServlet.context = sc; ViewObject.contextPath = contextPath; + // For JSP => FreeMarker transition. + } public void contextDestroyed(ServletContextEvent event) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/StringUtils.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/StringUtils.java index c37e37a02..9dfd13e69 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/StringUtils.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/StringUtils.java @@ -76,9 +76,8 @@ public class StringUtils { return quotedList(Arrays.asList(stringArray), glue); } - // Because we can't use Java 1.6 String.isEmpty() public static boolean isEmpty(String s) { - return s == null || s.length() <= 0; + return s == null || s.isEmpty(); } public static boolean equalsOneOf(String s, String... strings) { diff --git a/webapp/web/templates/freemarker/page/default.ftl b/webapp/web/templates/freemarker/page/default.ftl index 9439704d3..b829896be 100644 --- a/webapp/web/templates/freemarker/page/default.ftl +++ b/webapp/web/templates/freemarker/page/default.ftl @@ -10,6 +10,7 @@ <#include "/components/identity.ftl"> + <#-- Note to UI team: do not change this div without also making the change in menu.jsp -->