File Source: RSDServlet.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 javax.servlet.ServletConfig;
    24  import javax.servlet.ServletException;
    25  import javax.servlet.http.HttpServlet;
    26  import javax.servlet.http.HttpServletRequest;
    27  import javax.servlet.http.HttpServletResponse;
    28  import org.apache.commons.logging.Log;
    29  import org.apache.commons.logging.LogFactory;
    30  import org.apache.roller.weblogger.WebloggerException;
    31  import org.apache.roller.weblogger.config.WebloggerRuntimeConfig;
    32  import org.apache.roller.weblogger.pojos.StaticTemplate;
    33  import org.apache.roller.weblogger.pojos.Template;
    34  import org.apache.roller.weblogger.pojos.Weblog;
    35  import org.apache.roller.weblogger.ui.rendering.util.WeblogRequest;
    36  import org.apache.roller.weblogger.ui.rendering.util.ModDateHeaderUtil;
    37  import org.apache.roller.weblogger.ui.rendering.Renderer;
    38  import org.apache.roller.weblogger.ui.rendering.RendererManager;
    39  import org.apache.roller.weblogger.util.cache.CachedContent;
    40  
    41  
    42  /**
    43   * Generates simple rsd feed for a given weblog.
    44   *
    45   * This servlet supports 304 If-Modified-Since checking, but does not do any
    46   * level of content caching.
    47   *
    48   * @web.servlet name="RSDServlet" load-on-startup="7"
    49   * @web.servlet-mapping url-pattern="/roller-ui/rendering/rsd/*"
    50   */
         /* 
    P/P   *  Method: void org.apache.roller.weblogger.ui.rendering.servlets.RSDServlet()
          */
    51  public class RSDServlet extends HttpServlet {
    52      
             /* 
    P/P       *  Method: org.apache.roller.weblogger.ui.rendering.servlets.RSDServlet__static_init
              * 
              *  Postconditions:
              *    init'ed(log)
              */
    53      private static Log log = LogFactory.getLog(RSDServlet.class);
    54      
    55      
    56      /**
    57       * Init method for this servlet
    58       */
    59      public void init(ServletConfig servletConfig) throws ServletException {
    60          
                 /* 
    P/P           *  Method: void init(ServletConfig)
                  * 
                  *  Preconditions:
                  *    log != null
                  */
    61          super.init(servletConfig);
    62          
    63          log.info("Initializing RSDServlet");
    64      }
    65      
    66      
    67      /**
    68       * Handle GET requests for weblog pages.
    69       */
    70      public void doGet(HttpServletRequest request, HttpServletResponse response) 
    71              throws ServletException, IOException {
    72          
                 /* 
    P/P           *  Method: void doGet(HttpServletRequest, HttpServletResponse)
                  * 
                  *  Preconditions:
                  *    log != null
                  *    (soft) org/apache/roller/weblogger/ui/rendering/util/WeblogRequest.log != null
                  *    (soft) request != null
                  *    (soft) response != null
                  * 
                  *  Presumptions:
                  *    javax.servlet.http.HttpServletResponse:getOutputStream(...)@157 != null
                  *    org.apache.roller.weblogger.pojos.Weblog:getLastModified(...)@100 != null
                  *    org.apache.roller.weblogger.ui.rendering.RendererManager:getRenderer(...)@123 != null
                  *    org.apache.roller.weblogger.util.cache.CachedContent:getContent(...).length@156 <= 232-1
                  *    org.apache.roller.weblogger.util.cache.CachedContent:getContent(...)@156 != null
                  * 
                  *  Test Vectors:
                  *    org.apache.roller.weblogger.pojos.Weblog:getLastModified(...)@99: Addr_Set{null}, Inverse{null}
                  */
    73          log.debug("Entering");
    74          
    75          Weblog weblog = null;
    76          
    77          WeblogRequest weblogRequest = null;
    78          try {
    79              weblogRequest = new WeblogRequest(request);
    80              
    81              // now make sure the specified weblog really exists
    82              weblog = weblogRequest.getWeblog();
    83              if(weblog == null) {
+   84                  throw new WebloggerException("Unable to lookup weblog: "+
    85                          weblogRequest.getWeblogHandle());
    86              }
    87              
    88          } catch(Exception e) {
    89              // invalid rsd request format or weblog doesn't exist
    90              log.debug("error creating weblog request", e);
    91              response.sendError(HttpServletResponse.SC_NOT_FOUND);
    92              return;
    93          }
    94          
    95          
    96  
    97          // Respond with 304 Not Modified if it is not modified.
    98          long lastModified = System.currentTimeMillis();
    99          if (weblog.getLastModified() != null) {
   100              lastModified = weblog.getLastModified().getTime();
   101          }
   102          if (ModDateHeaderUtil.respondIfNotModified(request,response,lastModified)) {
   103              return;
   104          }
   105  
   106          // set last-modified date
   107          ModDateHeaderUtil.setLastModifiedHeader(response,lastModified);
   108  
   109          // set the content type
   110          response.setContentType("application/rsd+xml; charset=utf-8");
   111          
   112          // populate the model
   113          HashMap model = new HashMap();
   114          model.put("website", weblog);
   115          model.put("absBaseURL", WebloggerRuntimeConfig.getAbsoluteContextURL());
   116  
   117          
   118          // lookup Renderer we are going to use
   119          Renderer renderer = null;
   120          try {
   121              log.debug("Looking up renderer");
   122              Template template = new StaticTemplate("templates/weblog/rsd.vm", "velocity");
   123              renderer = RendererManager.getRenderer(template);
   124          } catch(Exception e) {
   125              // nobody wants to render my content :(
   126              log.error("Couldn't find renderer for rsd template", e);
   127              
   128              if(!response.isCommitted()) response.reset();
   129              response.sendError(HttpServletResponse.SC_NOT_FOUND);
   130              return;
   131          }
   132          
   133          // render content
   134          CachedContent rendererOutput = new CachedContent(4096);
   135          try {
   136              log.debug("Doing rendering");
   137              renderer.render(model, rendererOutput.getCachedWriter());
   138              
   139              // flush rendered output and close
   140              rendererOutput.flush();
   141              rendererOutput.close();
   142          } catch(Exception e) {
   143              // bummer, error during rendering
   144              log.error("Error during rendering for rsd template", e);
   145              
   146              if(!response.isCommitted()) response.reset();
   147              response.sendError(HttpServletResponse.SC_NOT_FOUND);
   148              return;
   149          }
   150          
   151          
   152          // post rendering process
   153          
   154          // flush rendered content to response
   155          log.debug("Flushing response output");
   156          response.setContentLength(rendererOutput.getContent().length);
   157          response.getOutputStream().write(rendererOutput.getContent());
   158          
   159          log.debug("Exiting");
   160      }
   161      
   162  }








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