File Source: PreviewResourceServlet.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.io.InputStream;
    23  import java.io.OutputStream;
    24  import javax.servlet.ServletConfig;
    25  import javax.servlet.ServletContext;
    26  import javax.servlet.ServletException;
    27  import javax.servlet.http.HttpServlet;
    28  import javax.servlet.http.HttpServletRequest;
    29  import javax.servlet.http.HttpServletResponse;
    30  import org.apache.commons.lang.StringUtils;
    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.FileManager;
    35  import org.apache.roller.weblogger.business.WebloggerFactory;
    36  import org.apache.roller.weblogger.pojos.Theme;
    37  import org.apache.roller.weblogger.pojos.ThemeResource;
    38  import org.apache.roller.weblogger.pojos.WeblogTheme;
    39  import org.apache.roller.weblogger.pojos.Weblog;
    40  import org.apache.roller.weblogger.ui.rendering.util.ModDateHeaderUtil;
    41  import org.apache.roller.weblogger.ui.rendering.util.WeblogPreviewResourceRequest;
    42  
    43  
    44  /**
    45   * Special previewing servlet which serves files uploaded by users as well as 
    46   * static resources in shared themes.  This servlet differs from the normal
    47   * ResourceServlet because it can accept urls parameters which affect how it
    48   * behaves which are used for previewing.
    49   *
    50   * @web.servlet name="PreviewResourceServlet" load-on-startup="9"
    51   * @web.servlet-mapping url-pattern="/roller-ui/authoring/previewresource/*"
    52   */
         /* 
    P/P   *  Method: void org.apache.roller.weblogger.ui.rendering.servlets.PreviewResourceServlet()
          * 
          *  Postconditions:
          *    this.context == null
          */
    53  public class PreviewResourceServlet extends HttpServlet {
    54  
             /* 
    P/P       *  Method: org.apache.roller.weblogger.ui.rendering.servlets.PreviewResourceServlet__static_init
              * 
              *  Postconditions:
              *    init'ed(log)
              */
    55      private static Log log = LogFactory.getLog(PreviewResourceServlet.class);
    56      
    57      private ServletContext context = null;
    58  
    59  
    60      public void init(ServletConfig config) throws ServletException {
    61  
                 /* 
    P/P           *  Method: void init(ServletConfig)
                  * 
                  *  Preconditions:
                  *    config != null
                  *    log != null
                  * 
                  *  Postconditions:
                  *    init'ed(this.context)
                  */
    62          super.init(config);
    63  
    64          log.info("Initializing PreviewResourceServlet");
    65          
    66          this.context = config.getServletContext();
    67      }
    68  
    69  
    70      /**
    71       * Handles requests for user uploaded resources.
    72       */
    73      public void doGet(HttpServletRequest request, HttpServletResponse response)
    74              throws ServletException, IOException {
    75          
                 /* 
    P/P           *  Method: void doGet(HttpServletRequest, HttpServletResponse)
                  * 
                  *  Preconditions:
                  *    log != null
                  *    request != null
                  *    (soft) org/apache/roller/weblogger/ui/rendering/util/WeblogPreviewResourceRequest.log != null
                  *    (soft) org/apache/roller/weblogger/ui/rendering/util/WeblogRequest.log != null
                  *    (soft) org/apache/roller/weblogger/ui/rendering/util/WeblogResourceRequest.log != null
                  *    (soft) response != null
                  *    (soft) this.context != null
                  * 
                  *  Presumptions:
                  *    javax.servlet.http.HttpServletResponse:getOutputStream(...)@165 != null
                  *    org.apache.roller.weblogger.business.FileManager:getFile(...)@136 != null
                  *    org.apache.roller.weblogger.business.Weblogger:getFileManager(...)@135 != null
                  *    org.apache.roller.weblogger.business.WebloggerFactory:getWeblogger(...)@135 != null
                  *    org.apache.roller.weblogger.pojos.ThemeResource:getInputStream(...)@139 != null
                  *    ...
                  * 
                  *  Test Vectors:
                  *    java.io.InputStream:read(...)@166: {-231..0}, {1..232-1}
                  *    org.apache.commons.lang.StringUtils:isEmpty(...)@105: {1}, {0}
                  *    org.apache.roller.weblogger.pojos.Theme:getResource(...)@107: Addr_Set{null}, Inverse{null}
                  *    org.apache.roller.weblogger.pojos.Weblog:getTheme(...)@117: Addr_Set{null}, Inverse{null}
                  *    org.apache.roller.weblogger.pojos.WeblogTheme:getResource(...)@119: Addr_Set{null}, Inverse{null}
                  */
    76          Weblog weblog = null;
+   77          String context = request.getContextPath();
+   78          String servlet = request.getServletPath();
+   79          String reqURI = request.getRequestURI();
    80          
    81          WeblogPreviewResourceRequest resourceRequest = null;
    82          try {
    83              // parse the incoming request and extract the relevant data
    84              resourceRequest = new WeblogPreviewResourceRequest(request);
    85  
    86              weblog = resourceRequest.getWeblog();
    87              if(weblog == null) {
    88                  throw new WebloggerException("unable to lookup weblog: "+
    89                          resourceRequest.getWeblogHandle());
    90              }
    91  
    92          } catch(Exception e) {
    93              // invalid resource request or weblog doesn't exist
    94              log.debug("error creating weblog resource request", e);
    95              response.sendError(HttpServletResponse.SC_NOT_FOUND);
    96              return;
    97          }
    98          
    99          log.debug("Resource requested ["+resourceRequest.getResourcePath()+"]");
   100          
   101          long resourceLastMod = 0;
   102          InputStream resourceStream = null;
   103          
   104          // first, see if we have a preview theme to operate from
   105          if(!StringUtils.isEmpty(resourceRequest.getThemeName())) {
   106              Theme theme = resourceRequest.getTheme();
+  107              ThemeResource resource = theme.getResource(resourceRequest.getResourcePath());
   108              if(resource != null) {
   109                  resourceLastMod = resource.getLastModified();
   110                  resourceStream = resource.getInputStream();
   111              }
   112          }
   113          
   114          // second, see if resource comes from weblog's configured shared theme
   115          if(resourceStream == null) {
   116              try {
   117                  WeblogTheme weblogTheme = weblog.getTheme();
   118                  if(weblogTheme != null) {
   119                      ThemeResource resource = weblogTheme.getResource(resourceRequest.getResourcePath());
   120                      if(resource != null) {
   121                          resourceLastMod = resource.getLastModified();
   122                          resourceStream = resource.getInputStream();
   123                      }
   124                  }
   125              } catch (Exception ex) {
   126                  // hmmm, some kind of error getting theme.  that's an error.
   127                  response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
   128                  return;
   129              }
   130          }
   131          
   132          // if not from theme then see if resource is in weblog's upload dir
   133          if(resourceStream == null) {
   134              try {
   135                  FileManager fileMgr = WebloggerFactory.getWeblogger().getFileManager();
   136                  ThemeResource resource = fileMgr.getFile(weblog, 
   137                          resourceRequest.getResourcePath());
   138                  resourceLastMod = resource.getLastModified();
   139                  resourceStream = resource.getInputStream();
   140              } catch (Exception ex) {
   141                  // still not found? then we don't have it, 404.
   142                  log.debug("Unable to get resource", ex);
   143                  response.sendError(HttpServletResponse.SC_NOT_FOUND);
   144                  return;
   145              }
   146          }
   147          
   148          // Respond with 304 Not Modified if it is not modified.
   149          if (ModDateHeaderUtil.respondIfNotModified(request, response, resourceLastMod)) {
   150              return;
   151          } else {
   152              // set last-modified date
   153              ModDateHeaderUtil.setLastModifiedHeader(response, resourceLastMod);
   154          }
   155          
   156  
   157          // set the content type based on whatever is in our web.xml mime defs
   158          response.setContentType(this.context.getMimeType(resourceRequest.getResourcePath()));
   159          
   160          OutputStream out = null;
   161          try {
   162              // ok, lets serve up the file
   163              byte[] buf = new byte[8192];
   164              int length = 0;
   165              out = response.getOutputStream();
   166              while((length = resourceStream.read(buf)) > 0) {
   167                  out.write(buf, 0, length);
   168              }
   169              
   170              // cleanup
   171              out.close();
   172              resourceStream.close();
   173              
   174          } catch (Exception ex) {
   175              log.error("Error writing resource file", ex);
   176              if(!response.isCommitted()) {
   177                  response.reset();
   178                  response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
   179              }
   180          }
   181  
   182      }
   183  
   184  }








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