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);