File Source: PreviewServlet.java

     1  /*
     2   * Licensed to the Apache Software Foundation (ASF) under one or more
     3   *  contributor license agreements.  The ASF licenses this file to You
     4   * under the Apache License, Version 2.0 (the "License"); you may not
     5   * use this file except in compliance with the License.
     6   * You may obtain a copy of the License at
     7   *
     8   *     http://www.apache.org/licenses/LICENSE-2.0
     9   *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.  For additional information regarding
    15   * copyright in this work, please see the NOTICE file in the top level
    16   * directory of this distribution.
    17   */
    18  
    19  package org.apache.roller.weblogger.ui.rendering.servlets;
    20  
    21  import java.io.IOException;
    22  import java.util.HashMap;
    23  import java.util.Map;
    24  import javax.servlet.ServletConfig;
    25  import javax.servlet.ServletException;
    26  import javax.servlet.http.HttpServlet;
    27  import javax.servlet.http.HttpServletRequest;
    28  import javax.servlet.http.HttpServletResponse;
    29  import javax.servlet.jsp.JspFactory;
    30  import javax.servlet.jsp.PageContext;
    31  import org.apache.commons.logging.Log;
    32  import org.apache.commons.logging.LogFactory;
    33  import org.apache.roller.weblogger.WebloggerException;
    34  import org.apache.roller.weblogger.business.WebloggerFactory;
    35  import org.apache.roller.weblogger.config.WebloggerConfig;
    36  import org.apache.roller.weblogger.config.WebloggerRuntimeConfig;
    37  import org.apache.roller.weblogger.pojos.Template;
    38  import org.apache.roller.weblogger.pojos.Theme;
    39  import org.apache.roller.weblogger.pojos.ThemeTemplate;
    40  import org.apache.roller.weblogger.pojos.WeblogTheme;
    41  import org.apache.roller.weblogger.pojos.Weblog;
    42  import org.apache.roller.weblogger.ui.core.RollerContext;
    43  import org.apache.roller.weblogger.util.cache.CachedContent;
    44  import org.apache.roller.weblogger.ui.rendering.Renderer;
    45  import org.apache.roller.weblogger.ui.rendering.RendererManager;
    46  import org.apache.roller.weblogger.ui.rendering.model.ModelLoader;
    47  import org.apache.roller.weblogger.ui.rendering.util.WeblogPreviewRequest;
    48  
    49  
    50  /**
    51   * Responsible for rendering weblog page previews.
    52   *
    53   * This servlet is used as part of the authoring interface to provide previews
    54   * of what a weblog will look like with a given theme.  It is not available
    55   * outside of the authoring interface.
    56   */
         /* 
    P/P   *  Method: void org.apache.roller.weblogger.ui.rendering.servlets.PreviewServlet()
          */
    57  public class PreviewServlet extends HttpServlet {
    58      
             /* 
    P/P       *  Method: org.apache.roller.weblogger.ui.rendering.servlets.PreviewServlet__static_init
              * 
              *  Postconditions:
              *    init'ed(log)
              */
    59      private static Log log = LogFactory.getLog(PreviewServlet.class);
    60      
    61      
    62      /**
    63       * Init method for this servlet
    64       */
    65      public void init(ServletConfig servletConfig) throws ServletException {
    66          
                 /* 
    P/P           *  Method: void init(ServletConfig)
                  * 
                  *  Preconditions:
                  *    log != null
                  */
    67          super.init(servletConfig);
    68          
    69          log.info("Initializing PreviewServlet");
    70      }
    71      
    72      
    73      /**
    74       * Handle GET requests for weblog pages.
    75       */
    76      public void doGet(HttpServletRequest request, HttpServletResponse response)
    77              throws ServletException, IOException {
    78          
                 /* 
    P/P           *  Method: void doGet(HttpServletRequest, HttpServletResponse)
                  * 
                  *  Preconditions:
                  *    log != null
                  *    response != null
                  *    (soft) org/apache/roller/weblogger/ui/rendering/util/WeblogPageRequest.log != null
                  *    (soft) org/apache/roller/weblogger/ui/rendering/util/WeblogPreviewRequest.log != null
                  *    (soft) org/apache/roller/weblogger/ui/rendering/util/WeblogRequest.log != null
                  *    (soft) request != null
                  * 
                  *  Presumptions:
                  *    javax.servlet.http.HttpServletResponse:getOutputStream(...)@271 != null
                  *    javax.servlet.jsp.JspFactory:getDefaultFactory(...)@193 != null
                  *    org.apache.roller.weblogger.business.Weblogger:getUrlStrategy(...)@205 != null
                  *    org.apache.roller.weblogger.business.Weblogger:getUrlStrategy(...)@221 != null
                  *    org.apache.roller.weblogger.business.WebloggerFactory:getWeblogger(...)@205 != null
                  *    ...
                  * 
                  *  Test Vectors:
                  *    java.lang.String:equals(...)@116: {0}, {1}
                  *    java.lang.String:equals(...)@131: {0}, {1}
                  *    java.lang.String:equals(...)@135: {0}, {1}
                  *    java.lang.String:equals(...)@185: {0}, {1}
                  *    javax.servlet.http.HttpServletResponse:isCommitted(...)@146: {1}, {0}
                  *    javax.servlet.http.HttpServletResponse:isCommitted(...)@170: {1}, {0}
                  *    org.apache.roller.weblogger.config.WebloggerRuntimeConfig:isSiteWideWeblog(...)@212: {0}, {1}
                  *    org.apache.roller.weblogger.pojos.Theme:isEnabled(...)@114: {0}, {1}
                  *    org.apache.roller.weblogger.pojos.Weblog:isShowAllLangs(...)@126: {1}, {0}
                  *    org.apache.roller.weblogger.ui.rendering.util.WeblogPreviewRequest:getLocale(...)@126: Inverse{null}, Addr_Set{null}
                  *    ...
                  */
    79          log.debug("Entering");
    80          
    81          Weblog weblog = null;
    82          
    83          WeblogPreviewRequest previewRequest = null;
    84          try {
    85              previewRequest = new WeblogPreviewRequest(request);
    86              
    87              // lookup weblog specified by preview request
    88              weblog = previewRequest.getWeblog();
    89              if(weblog == null) {
    90                  throw new WebloggerException("unable to lookup weblog: "+
    91                          previewRequest.getWeblogHandle());
    92              }
    93          } catch (Exception e) {
    94              // some kind of error parsing the request or getting weblog
    95              log.debug("error creating preview request", e);
    96              response.sendError(HttpServletResponse.SC_NOT_FOUND);
    97              return;
    98          }
    99          
   100          Weblog tmpWebsite = weblog;
   101          
   102          if (previewRequest.getThemeName() != null) {
   103              // only create temporary weblog object if theme name was specified
   104              // in request, which indicates we're doing a theme preview
   105  
   106              // try getting the preview theme
   107              log.debug("preview theme = "+previewRequest.getThemeName());
   108              Theme previewTheme = previewRequest.getTheme();
   109  
   110              // construct a temporary Website object for this request
   111              // and set the EditorTheme to our previewTheme
   112              tmpWebsite = new Weblog();
   113              tmpWebsite.setData(weblog);
   114              if(previewTheme != null && previewTheme.isEnabled()) {
   115                  tmpWebsite.setEditorTheme(previewTheme.getId());
   116              } else if(WeblogTheme.CUSTOM.equals(previewRequest.getThemeName())) {
   117                  tmpWebsite.setEditorTheme(WeblogTheme.CUSTOM);
   118              }
   119  
   120              // we've got to set the weblog in our previewRequest because that's
   121              // the object that gets referenced during rendering operations
   122              previewRequest.setWeblog(tmpWebsite);
   123          }
   124          
   125          // do we need to force a specific locale for the request?
   126          if(previewRequest.getLocale() == null && !weblog.isShowAllLangs()) {
   127              previewRequest.setLocale(weblog.getLocale());
   128          }
   129          
   130          Template page = null;
   131          if("page".equals(previewRequest.getContext())) {
   132              page = previewRequest.getWeblogPage();
   133              
   134          // If request specified tags section index, then look for custom template
   135          } else if("tags".equals(previewRequest.getContext()) &&
   136                  previewRequest.getTags() == null) {
   137              try {
   138                  page = weblog.getTheme().getTemplateByAction(ThemeTemplate.ACTION_TAGSINDEX);
   139              } catch(Exception e) {
   140                  log.error("Error getting weblog page for action 'tagsIndex'", e);
   141              }
   142              
   143              // if we don't have a custom tags page then 404, we don't let
   144              // this one fall through to the default template
   145              if(page == null) {
   146                  if(!response.isCommitted()) response.reset();
   147                  response.sendError(HttpServletResponse.SC_NOT_FOUND);
   148                  return;
   149              }
   150              
   151          // If this is a permalink then look for a permalink template
   152          } else if(previewRequest.getWeblogAnchor() != null) {
   153              try {
   154                  page = weblog.getTheme().getTemplateByAction(ThemeTemplate.ACTION_PERMALINK);
   155              } catch(Exception e) {
   156                  log.error("Error getting weblog page for action 'permalink'", e);
   157              }
   158          }
   159          
   160          if(page == null) {
   161              try {
   162                  page = tmpWebsite.getTheme().getDefaultTemplate();
   163              } catch(WebloggerException re) {
   164                  log.error("Error getting default page for preview", re);
   165              }
   166          }
   167          
   168          // Still no page?  Then that is a 404
   169          if (page == null) {
   170              if(!response.isCommitted()) response.reset();
   171              response.sendError(HttpServletResponse.SC_NOT_FOUND);
   172              return;
   173          }
   174          
   175          
   176          log.debug("preview page found, dealing with it");
   177          
   178          // set the content type
   179          String pageLink = previewRequest.getWeblogPageName();
   180          String mimeType = pageLink !=  null ? RollerContext.getServletContext().getMimeType(pageLink) : null;        
   181          String contentType = "text/html; charset=utf-8";
   182          if(mimeType != null) {
   183              // we found a match ... set the content type
   184              contentType = mimeType+"; charset=utf-8";
   185          } else if ("_css".equals(previewRequest.getWeblogPageName())) {
   186              // TODO: store content-type for each page so this hack is unnecessary
   187              contentType = "text/css; charset=utf-8";
   188          }
   189          
   190          // looks like we need to render content
   191          Map model = new HashMap();
   192          try {
   193              PageContext pageContext = JspFactory.getDefaultFactory().getPageContext(
   194                      this, request, response,"", false, 8192, true);
   195              
   196              // special hack for menu tag
   197              request.setAttribute("pageRequest", previewRequest);
   198              
   199              // populate the rendering model
   200              Map initData = new HashMap();
   201              initData.put("parsedRequest", previewRequest);
   202              initData.put("pageContext", pageContext);
   203              
   204              // define url strategy
   205              initData.put("urlStrategy", WebloggerFactory.getWeblogger().getUrlStrategy().getPreviewURLStrategy(previewRequest.getThemeName()));
   206              
   207              // Load models for page previewing
   208              String pageModels = WebloggerConfig.getProperty("rendering.previewModels");
   209              ModelLoader.loadModels(pageModels, model, initData, true);
   210              
   211              // Load special models for site-wide blog
   212              if(WebloggerRuntimeConfig.isSiteWideWeblog(weblog.getHandle())) {
   213                  String siteModels = WebloggerConfig.getProperty("rendering.siteModels");
   214                  ModelLoader.loadModels(siteModels, model, initData, true);
   215              }
   216  
   217              // Load weblog custom models
   218              ModelLoader.loadCustomModels(weblog, model, initData);
   219              
   220              // ick, gotta load pre-3.0 model stuff as well :(
   221              ModelLoader.loadOldModels(model, request, response, pageContext, previewRequest, WebloggerFactory.getWeblogger().getUrlStrategy().getPreviewURLStrategy(previewRequest.getThemeName()));
   222              
   223          } catch (WebloggerException ex) {
   224              log.error("ERROR loading model for page", ex);
   225              
   226              if(!response.isCommitted()) response.reset();
   227              response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
   228              return;
   229          }
   230          
   231          
   232          // lookup Renderer we are going to use
   233          Renderer renderer = null;
   234          try {
   235              log.debug("Looking up renderer");
   236              renderer = RendererManager.getRenderer(page);
   237          } catch(Exception e) {
   238              // nobody wants to render my content :(
   239              log.error("Couldn't find renderer for page "+page.getId(), e);
   240              
   241              if(!response.isCommitted()) response.reset();
   242              response.sendError(HttpServletResponse.SC_NOT_FOUND);
   243              return;
   244          }
   245          
   246          // render content.  use default size of about 24K for a standard page
   247          CachedContent rendererOutput = new CachedContent(24567);
   248          try {
   249              log.debug("Doing rendering");
   250              renderer.render(model, rendererOutput.getCachedWriter());
   251              
   252              // flush rendered output and close
   253              rendererOutput.flush();
   254              rendererOutput.close();
   255          } catch(Exception e) {
   256              // bummer, error during rendering
   257              log.error("Error during rendering for page "+page.getId(), e);
   258              
   259              if(!response.isCommitted()) response.reset();
   260              response.sendError(HttpServletResponse.SC_NOT_FOUND);
   261              return;
   262          }
   263          
   264          
   265          // post rendering process
   266          
   267          // flush rendered content to response
   268          log.debug("Flushing response output");
   269          response.setContentType(contentType);
   270          response.setContentLength(rendererOutput.getContent().length);
   271          response.getOutputStream().write(rendererOutput.getContent());
   272          
   273          log.debug("Exiting");
   274      }
   275      
   276  }








SofCheck Inspector Build Version : 2.18479
PreviewServlet.java 2009-Jan-02 14:24:56
PreviewServlet.class 2009-Sep-04 03:12:45