You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@roller.apache.org by ag...@apache.org on 2006/01/13 20:11:23 UTC
svn commit: r368825 - in
/incubator/roller/trunk/src/org/roller/presentation/velocity:
BasePageServlet.java LanguageServlet.java PageServlet.java
PreviewServlet.java
Author: agilliland
Date: Fri Jan 13 11:11:18 2006
New Revision: 368825
URL: http://svn.apache.org/viewcvs?rev=368825&view=rev
Log:
moving BasePageServlet logic into PageServlet.
preview and language servlets now extend PageServlet.
Removed:
incubator/roller/trunk/src/org/roller/presentation/velocity/BasePageServlet.java
Modified:
incubator/roller/trunk/src/org/roller/presentation/velocity/LanguageServlet.java
incubator/roller/trunk/src/org/roller/presentation/velocity/PageServlet.java
incubator/roller/trunk/src/org/roller/presentation/velocity/PreviewServlet.java
Modified: incubator/roller/trunk/src/org/roller/presentation/velocity/LanguageServlet.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/velocity/LanguageServlet.java?rev=368825&r1=368824&r2=368825&view=diff
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/velocity/LanguageServlet.java (original)
+++ incubator/roller/trunk/src/org/roller/presentation/velocity/LanguageServlet.java Fri Jan 13 11:11:18 2006
@@ -39,7 +39,7 @@
* @author <a href="mailto:molen@mail.com">Jaap van der Molen</a>
* @version $Revision: 1.8 $
*/
-public class LanguageServlet extends BasePageServlet {
+public class LanguageServlet extends PageServlet {
static final long serialVersionUID = -6548723098429557183L;
Modified: incubator/roller/trunk/src/org/roller/presentation/velocity/PageServlet.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/velocity/PageServlet.java?rev=368825&r1=368824&r2=368825&view=diff
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/velocity/PageServlet.java (original)
+++ incubator/roller/trunk/src/org/roller/presentation/velocity/PageServlet.java Fri Jan 13 11:11:18 2006
@@ -1,39 +1,291 @@
package org.roller.presentation.velocity;
-import java.util.Properties;
-
+import java.io.IOException;
+import java.io.StringWriter;
+import java.net.SocketException;
+import java.util.Date;
+import java.util.Map;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-
+import javax.servlet.jsp.JspFactory;
+import javax.servlet.jsp.PageContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.velocity.Template;
-import org.apache.velocity.app.VelocityEngine;
+import org.apache.velocity.VelocityContext;
import org.apache.velocity.context.Context;
-import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
+import org.apache.velocity.servlet.VelocityServlet;
+import org.roller.RollerException;
+import org.roller.model.RollerFactory;
+import org.roller.model.UserManager;
+import org.roller.pojos.WeblogTemplate;
+import org.roller.pojos.WebsiteData;
+import org.roller.presentation.RollerRequest;
+
/**
* The PageServlet handles all requests for weblog pages at /page/*
- *
- * All the real work is handled by the BasePageServlet though.
- *
- * @see org.roller.presentation.velocity.BasePageServlet
*
* @web.servlet name="PageServlet" load-on-startup="0"
* @web.servlet-init-param name="org.apache.velocity.properties"
* value="/WEB-INF/velocity.properties"
*
- * @web.servlet-mapping url-pattern="/page/*"
+ * //web.servlet-mapping url-pattern="/page/*"
+ *
+ * NOTE: the webdoclet task allows some elements to be inherited when generating
+ * the web.xml file. for this reason we can't put the servlet mapping here
+ * because it will be inherited by PreviewServlet. instead we manually do
+ * the servlet mapping for PageServlet in the servlet-mappings.xml
+ * file under metadata/xdoclet.
+ *
*/
-public class PageServlet extends BasePageServlet {
+public class PageServlet extends VelocityServlet {
+
+ private static Log mLogger = LogFactory.getLog(PageServlet.class);
+
/**
- * This class used to have some special velocity init code that was
- * related to how previewing worked, but it became obsolete when we
- * redid the theme management stuff, so now this class does nothing.
+ * Sets servletContext for WebappResourceLoader.
*/
-}
+ public void init( ServletConfig config )
+ throws ServletException {
+
+ super.init( config );
+ WebappResourceLoader.setServletContext( getServletContext() );
+ }
+
+
+ /**
+ * Process a request for a Weblog page.
+ */
+ public Template handleRequest(HttpServletRequest request,
+ HttpServletResponse response,
+ Context ctx)
+ throws IOException {
+
+ Template outty = null;
+ RollerRequest rreq = null;
+
+ // first off lets parse the incoming request and validate it
+ try {
+ PageContext pageContext =
+ JspFactory.getDefaultFactory().getPageContext(
+ this, request, response,"", true, 8192, true);
+ rreq = RollerRequest.getRollerRequest(pageContext);
+ } catch (Throwable e) {
+ // An error initializing the request is considered to be a 404
+ response.sendError(HttpServletResponse.SC_NOT_FOUND);
+ request.setAttribute("DisplayException", e);
+ mLogger.debug("ERROR initializing RollerRequest",e);
+ return null;
+ }
+
+ // request appears to be valid, lets render
+ try {
+ UserManager userMgr = RollerFactory.getRoller().getUserManager();
+
+ WebsiteData website = null;
+ if (request.getAttribute(RollerRequest.OWNING_WEBSITE) != null) {
+ website = (WebsiteData)
+ request.getAttribute(RollerRequest.OWNING_WEBSITE);
+ } else {
+ website = rreq.getWebsite();
+ }
+
+ org.roller.pojos.Template page = null;
+
+ // If this is a popup request, then deal with it specially
+ if (request.getParameter("popup") != null) {
+ try {
+ // Does user have a popupcomments page?
+ page = website.getPageByName("_popupcomments");
+ } catch(Exception e ) {
+ // ignored ... considered page not found
+ }
+
+ // User doesn't have one so return the default
+ if (page == null) {
+ page = new WeblogTemplate("/popupcomments.vm", website,
+ "Comments", "Comments", "dummy_link",
+ "dummy_template", new Date());
+ }
+ rreq.setPage(page);
+
+ // If request specified the page, then go with that
+ } else if (rreq.getPage() != null &&
+ rreq.getRequest().getAttribute(RollerRequest.OWNING_WEBSITE) == null) {
+ page = rreq.getPage();
+
+ // If page not available from request, then use website's default
+ } else if (website != null) {
+ page = website.getDefaultPage();
+ rreq.setPage(page);
+ }
+
+ // Still no page ID, then we have a problem
+ if ( page == null ) {
+ throw new ResourceNotFoundException("Page not found");
+ }
+ // this sets up the page we want to render
+ outty = prepareForPageExecution(ctx, rreq, response, page);
+
+ // if there is a decorator template then apply it
+ if (website != null) {
+ // parse/merge Page template
+ StringWriter sw = new StringWriter();
+ outty.merge(ctx, sw);
+ ctx.put("decorator_body", sw.toString());
+
+ // replace outty with decorator Template
+ outty = findDecorator(website, (String) ctx.get("decorator"));
+ }
+
+ } catch (ResourceNotFoundException rnfe ) {
+ response.sendError(HttpServletResponse.SC_NOT_FOUND);
+ request.setAttribute("DisplayException", rnfe);
+ mLogger.warn("ResourceNotFound: "+ request.getRequestURL());
+ mLogger.debug(rnfe);
+
+ } catch (Throwable e) {
+ response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ request.setAttribute("DisplayException", e);
+ mLogger.error("ERROR preparing for page execution", e);
+ }
+
+ return outty;
+ }
+
+
+ /**
+ * Prepare the requested page for execution by setting content type
+ * and populating velocity context.
+ */
+ protected Template prepareForPageExecution(Context ctx,
+ RollerRequest rreq,
+ HttpServletResponse response,
+ org.roller.pojos.Template page)
+
+ throws ResourceNotFoundException, RollerException {
+
+ Template outty = null;
+
+ // if page has an extension - use that to set the contentType
+ String pageLink = page.getLink();
+ String mimeType = getServletConfig().getServletContext().getMimeType(pageLink);
+ if(mimeType != null) {
+ // we found a match ... set the content type
+ response.setContentType(mimeType);
+ }
+
+ // Made it this far, populate the Context
+ ContextLoader.setupContext( ctx, rreq, response );
+
+ try {
+ outty = getTemplate( page.getId(), "UTF-8" );
+ } catch (ResourceNotFoundException ex) {
+ // just rethrow
+ throw ex;
+ } catch (Exception ex) {
+ // wrap this as a roller exception
+ throw new RollerException("Error getting velocity template", ex);
+ }
+
+ return outty;
+ }
+
+
+ /**
+ * Load the decorator template and apply it. If there is no user specified
+ * decorator then the default decorator is applied.
+ */
+ protected Template findDecorator(WebsiteData website, String decorator_name)
+ throws ResourceNotFoundException, RollerException {
+
+ Template decorator = null;
+ org.roller.pojos.Template decorator_template = null;
+
+ // check for user-specified decorator
+ if (decorator_name != null) {
+ decorator_template = website.getPageByName(decorator_name);
+ }
+
+ // if no user-specified decorator try default page-name
+ if (decorator_template == null) {
+ decorator_template = website.getPageByName("_decorator");
+ }
+
+ // try loading Template
+ if (decorator_template != null) {
+ try {
+ decorator = getTemplate(decorator_template.getId(), "UTF-8");
+ } catch (Exception e) {
+ // it may not exist, so this is okay
+ }
+ }
+
+ // couldn't find Template, load default "no-op" decorator
+ if (decorator == null) {
+ try {
+ decorator = getTemplate("/themes/noop_decorator.vm", "UTF-8");
+ } catch (ResourceNotFoundException ex) {
+ // just rethrow
+ throw ex;
+ } catch (Exception ex) {
+ // wrap as a RollerException
+ throw new RollerException("error getting no-op decorator", ex);
+ }
+ }
+
+ return decorator;
+ }
+
+
+ /**
+ * Handle error in Velocity processing.
+ */
+ protected void error( HttpServletRequest req, HttpServletResponse res,
+ Exception e) throws ServletException, IOException {
+
+ if(e instanceof SocketException) {
+ // ignore socket exceptions
+ mLogger.debug("Some kind of SocketException", e);
+ } else {
+ mLogger.warn("ERROR in VelocityServlet " + e.getClass().getName());
+ }
+ }
+
+ /**
+ * Override to prevent Velocity from putting "req" and "res" into the context.
+ * Allowing users access to the underlying Servlet objects is a security risk.
+ * If need access to request parameters, use $requestParameters.
+ */
+ protected Context createContext(
+ HttpServletRequest req,
+ HttpServletResponse res) {
+
+ VelocityContext context = new VelocityContext();
+ context.put(REQUEST, new RequestWrapper(req.getParameterMap()));
+ return context;
+
+ }
+
+ /** Provide access to request params only, not actual request */
+ public static class RequestWrapper {
+ Map params = null;
+ public RequestWrapper(Map params) {
+ this.params = params;
+ }
+ public String getParameter(String key) {
+ String ret = null;
+ String[] array = (String[])params.get(key);
+ if (array != null && array.length > 0) {
+ ret = array[0];
+ }
+ return ret;
+ }
+ }
+}
Modified: incubator/roller/trunk/src/org/roller/presentation/velocity/PreviewServlet.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/velocity/PreviewServlet.java?rev=368825&r1=368824&r2=368825&view=diff
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/velocity/PreviewServlet.java (original)
+++ incubator/roller/trunk/src/org/roller/presentation/velocity/PreviewServlet.java Fri Jan 13 11:11:18 2006
@@ -27,10 +27,9 @@
* Allow users to preview what their blog would look like in a given theme.
*
* @web.servlet name="PreviewServlet" load-on-startup="1"
- * @web.servlet-init-param name="properties" value="/WEB-INF/velocity.properties"
* @web.servlet-mapping url-pattern="/preview/*"
*/
-public class PreviewServlet extends BasePageServlet {
+public class PreviewServlet extends PageServlet {
private static Log mLogger = LogFactory.getLog(PreviewServlet.class);