File Source: PreviewThemeImageServlet.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.logging.Log;
    31  import org.apache.commons.logging.LogFactory;
    32  import org.apache.roller.weblogger.business.WebloggerFactory;
    33  import org.apache.roller.weblogger.business.themes.SharedTheme;
    34  import org.apache.roller.weblogger.business.themes.ThemeManager;
    35  import org.apache.roller.weblogger.pojos.ThemeResource;
    36  import org.apache.roller.weblogger.ui.rendering.util.ModDateHeaderUtil;
    37  
    38  /**
    39   * Special previewing servlet which serves files uploaded by users as well as 
    40   * static resources in shared themes.  This servlet differs from the normal
    41   * ResourceServlet because it can accept urls parameters which affect how it
    42   * behaves which are used for previewing.
    43   */
         /* 
    P/P   *  Method: void org.apache.roller.weblogger.ui.rendering.servlets.PreviewThemeImageServlet()
          * 
          *  Postconditions:
          *    this.context == null
          */
    44  public class PreviewThemeImageServlet extends HttpServlet {
    45  
             /* 
    P/P       *  Method: org.apache.roller.weblogger.ui.rendering.servlets.PreviewThemeImageServlet__static_init
              * 
              *  Postconditions:
              *    init'ed(log)
              */
    46      private static Log log = LogFactory.getLog(PreviewThemeImageServlet.class);
    47      
    48      private ServletContext context = null;
    49  
    50  
    51      public void init(ServletConfig config) throws ServletException {
    52  
                 /* 
    P/P           *  Method: void init(ServletConfig)
                  * 
                  *  Preconditions:
                  *    config != null
                  *    log != null
                  * 
                  *  Postconditions:
                  *    init'ed(this.context)
                  */
    53          super.init(config);
    54  
    55          log.info("Initializing PreviewThemeImageServlet");
    56          
    57          this.context = config.getServletContext();
    58      }
    59  
    60  
    61      /**
    62       * Handles requests for user uploaded resources.
    63       */
    64      public void doGet(HttpServletRequest request, HttpServletResponse response)
    65              throws ServletException, IOException {
    66          
                 /* 
    P/P           *  Method: void doGet(HttpServletRequest, HttpServletResponse)
                  * 
                  *  Preconditions:
                  *    log != null
                  *    request != null
                  *    (soft) response != null
                  *    (soft) this.context != null
                  * 
                  *  Presumptions:
                  *    javax.servlet.http.HttpServletResponse:getOutputStream(...)@116 != null
                  *    org.apache.roller.weblogger.business.Weblogger:getThemeManager(...)@77 != null
                  *    org.apache.roller.weblogger.business.WebloggerFactory:getWeblogger(...)@77 != null
                  *    org.apache.roller.weblogger.business.themes.ThemeManager:getTheme(...)@78 != null
                  * 
                  *  Test Vectors:
                  *    java.io.InputStream:read(...)@117: {-231..0}, {1..232-1}
                  *    org.apache.roller.weblogger.business.themes.SharedTheme:getPreviewImage(...)@79: Addr_Set{null}, Inverse{null}
                  */
    67          String theme = request.getParameter("theme");
    68          
    69          log.debug("Theme requested ["+theme+"]");
    70          
    71          long resourceLastMod = 0;
    72          InputStream resourceStream = null;
    73          String previewImagePath = null;
    74          
    75          // try looking up selected theme
    76          try {
    77              ThemeManager tmgr = WebloggerFactory.getWeblogger().getThemeManager();
    78              SharedTheme previewTheme = tmgr.getTheme(theme);
    79              ThemeResource previewImage = previewTheme.getPreviewImage();
    80              if(previewImage != null) {
    81                  previewImagePath = previewImage.getPath();
    82                  resourceLastMod = previewImage.getLastModified();
    83                  resourceStream = previewImage.getInputStream();
    84              }
    85          } catch (Exception ex) {
    86              log.debug("error looking up preview image", ex);
    87              response.sendError(HttpServletResponse.SC_NOT_FOUND);
    88              return;
    89          }
    90          
    91          // if we don't have a stream to the file then we can't continue
    92          if(resourceStream == null) {
    93              log.debug("Unable to get theme preview for theme - "+theme);
    94              response.sendError(HttpServletResponse.SC_NOT_FOUND);
    95              return;
    96          }
    97          
    98          // Respond with 304 Not Modified if it is not modified.
    99          if (ModDateHeaderUtil.respondIfNotModified(request, response, resourceLastMod)) {
   100              return;
   101          } else {
   102              // set last-modified date
   103              ModDateHeaderUtil.setLastModifiedHeader(response, resourceLastMod);
   104          }
   105          
   106          log.debug("Everything is cool, sending image");
   107          
   108          // set the content type based on whatever is in our web.xml mime defs
   109          response.setContentType(this.context.getMimeType(previewImagePath));
   110          
   111          OutputStream out = null;
   112          try {
   113              // ok, lets serve up the file
   114              byte[] buf = new byte[8192];
   115              int length = 0;
   116              out = response.getOutputStream();
   117              while((length = resourceStream.read(buf)) > 0) {
   118                  out.write(buf, 0, length);
   119              }
   120              
   121              // cleanup
   122              out.close();
   123              resourceStream.close();
   124              
   125          } catch (Exception ex) {
   126              log.error("Error writing resource file", ex);
   127              if(!response.isCommitted()) {
   128                  response.reset();
   129                  response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
   130              }
   131          }
   132  
   133      }
   134  
   135  }








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