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








SofCheck Inspector Build Version : 2.18479
ResourceServlet.java 2009-Jan-02 14:25:16
ResourceServlet.class 2009-Sep-04 03:12:45