You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@roller.apache.org by ag...@apache.org on 2006/06/21 05:14:42 UTC

svn commit: r415882 - in /incubator/roller/branches/roller_3.0/src/org/apache/roller/ui: core/WeblogFeedRequest.java rendering/servlets/FeedServlet.java

Author: agilliland
Date: Tue Jun 20 20:14:42 2006
New Revision: 415882

URL: http://svn.apache.org/viewvc?rev=415882&view=rev
Log:
updating FeedServlet and WeblogFeedRequest to Roller 3.0.

- updated feed request parsing for new urls
- removed all traces of RollerRequest
- removed support for old user override templates _rss and _atom
- removed old context loading stuff

NOTE: this currently breaks feed renderings until new velocity templates are created for rendering feeds using Roller 3.0 models.


Modified:
    incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/core/WeblogFeedRequest.java
    incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/rendering/servlets/FeedServlet.java

Modified: incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/core/WeblogFeedRequest.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/core/WeblogFeedRequest.java?rev=415882&r1=415881&r2=415882&view=diff
==============================================================================
--- incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/core/WeblogFeedRequest.java (original)
+++ incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/core/WeblogFeedRequest.java Tue Jun 20 20:14:42 2006
@@ -1,69 +1,51 @@
 /*
-* Licensed to the Apache Software Foundation (ASF) under one or more
-*  contributor license agreements.  The ASF licenses this file to You
-* under the Apache License, Version 2.0 (the "License"); you may not
-* use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*     http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.  For additional information regarding
-* copyright in this work, please see the NOTICE file in the top level
-* directory of this distribution.
-*/
-/*
- * WeblogFeedRequest.java
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  The ASF licenses this file to You
+ * under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.
+ * You may obtain a copy of the License at
  *
- * Created on November 7, 2005, 1:59 PM
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
  */
 
 package org.apache.roller.ui.core;
 
-import java.util.HashSet;
-import java.util.Set;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
 import javax.servlet.http.HttpServletRequest;
-import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.roller.RollerException;
-import org.apache.roller.pojos.WeblogTemplate;
 
 
 /**
  * Represents a request for a Roller weblog feed.
  * 
- * any of /rss/*, /atom/*, /flavor/*
+ * /roller-ui/rendering/feeds/*
  *
  * We use this class as a helper to parse an incoming url and sort out the
  * information embedded in the url for later use.
- * 
- * @author Allen Gilliland
  */
 public class WeblogFeedRequest extends ParsedRequest {
     
     private static Log mLogger = LogFactory.getLog(WeblogFeedRequest.class);
     
-    private static Set feedServlets = new HashSet();
+    private static final String FEED_SERVLET = "/feeds";
     
-    private String context = null;
-    private String flavor = null;
+    private String type = null;
+    private String format = null;
     private String weblogHandle = null;
     private String weblogCategory = null;
     private boolean excerpts = false;
     
     
-    static {
-        // initialize our servlet list
-        feedServlets.add("rss");
-        feedServlets.add("flavor");
-        feedServlets.add("atom");
-    }
-    
-    
     /**
      * Construct the WeblogFeedRequest by parsing the incoming url
      */
@@ -77,85 +59,64 @@
         String servlet = request.getServletPath();
         String pathInfo = request.getPathInfo();
         
-        // what servlet is our destination?
-        if(servlet != null) {
-            // strip off the leading slash
-            servlet = servlet.substring(1);
-            
-            if(feedServlets.contains(servlet)) {
-                this.context = "weblog";
-                this.flavor = servlet;
-            } else {
-                // not a request to a feed servlet
-                throw new InvalidRequestException("not a weblog feed request, "+request.getRequestURL());
-            }
-        } else {
+        // was this request bound for the feed servlet?
+        if(servlet == null || !FEED_SERVLET.equals(servlet)) {
             throw new InvalidRequestException("not a weblog feed request, "+request.getRequestURL());
         }
         
-        // parse the path info
+        /* 
+         * parse the path info.  must conform to the format below.
+         *
+         * /<weblog>/<type>/<format>
+         *
+         */
         if(pathInfo != null && pathInfo.trim().length() > 1) {
             // strip off the leading slash
             pathInfo = pathInfo.substring(1);
             String[] pathElements = pathInfo.split("/");
             
-            if(pathElements[0].length() > 0) {
+            if(pathElements.length == 3) {
                 this.weblogHandle = pathElements[0];
+                this.type = pathElements[1];
+                this.format = pathElements[2];
+            } else {
+                throw new InvalidRequestException("invalid feed path info, "+request.getRequestURL());
             }
             
         } else {
-            
-            // no path info means this was a non-weblog request
-            // we handle a few exceptions for this which include
-            //   /rss - main rss feed
-            //   /atom - main atom feed
-            //   /flavor - main flavor feed
-            
-            this.context = "main";
+            throw new InvalidRequestException("invalid feed path info, "+request.getRequestURL());
         }
         
+        
         /* 
          * parse request parameters
          *
          * the only params we currently care about are:
-         *   flavor - defines the feed type
-         *   catname - specifies a weblog category
-         *   path - specifies a weblog category
+         *   cat - specifies a weblog category
          *   excerpts - specifies the feed should only include excerpts
          *
          */
-        if(request.getParameter("flavor") != null) {
-            this.flavor = request.getParameter("flavor");
-        }
-        
-        if(request.getParameter("path") != null) {
-            this.weblogCategory = request.getParameter("path");
-        }
-        
-        if(request.getParameter("catname") != null) {
-            this.weblogCategory = request.getParameter("catname");
+        if(request.getParameter("cat") != null) {
+            try {
+                this.weblogCategory = URLDecoder.decode(request.getParameter("cat"), "UTF-8");
+            } catch (UnsupportedEncodingException ex) {
+                // should never happen, utf-8 is always supported by java
+            }
         }
         
         if(request.getParameter("excerpts") != null) {
             this.excerpts = Boolean.valueOf(request.getParameter("excerpts")).booleanValue();
         }
         
-        // one small final adjustment.
-        // if our flavor is "flavor" then that means someone is just getting
-        // the default flavor, which is rss, so let's set that
-        if(this.flavor.equals("flavor")) {
-            this.flavor = "rss";
-        }
-        
     }
     
 
-    public String getContext() {
-        return context;
+    public String getType() {
+        return type;
     }
 
-    public String getFlavor() {
-        return flavor;
+    public String getFormat() {
+        return format;
     }
 
     public String getWeblogHandle() {

Modified: incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/rendering/servlets/FeedServlet.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/rendering/servlets/FeedServlet.java?rev=415882&r1=415881&r2=415882&view=diff
==============================================================================
--- incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/rendering/servlets/FeedServlet.java (original)
+++ incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/rendering/servlets/FeedServlet.java Tue Jun 20 20:14:42 2006
@@ -19,6 +19,8 @@
 package org.apache.roller.ui.rendering.servlets;
 
 import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
 import java.util.Date;
 import java.util.Enumeration;
 import java.util.HashMap;
@@ -28,26 +30,22 @@
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import javax.servlet.jsp.JspFactory;
-import javax.servlet.jsp.PageContext;
-import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.RollerException;
 import org.apache.roller.config.RollerConfig;
 import org.apache.roller.model.RollerFactory;
-import org.apache.roller.model.WeblogManager;
+import org.apache.roller.model.UserManager;
 import org.apache.roller.pojos.BookmarkData;
 import org.apache.roller.pojos.CommentData;
 import org.apache.roller.pojos.FolderData;
 import org.apache.roller.pojos.RefererData;
-import org.apache.roller.pojos.Template;
 import org.apache.roller.pojos.UserData;
 import org.apache.roller.pojos.WeblogCategoryData;
 import org.apache.roller.pojos.WeblogEntryData;
 import org.apache.roller.pojos.WeblogTemplate;
 import org.apache.roller.pojos.WebsiteData;
-import org.apache.roller.ui.core.RollerRequest;
+import org.apache.roller.ui.core.RollerContext;
 import org.apache.roller.ui.core.WeblogFeedRequest;
 import org.apache.roller.util.cache.CachedContent;
 import org.apache.roller.ui.rendering.Renderer;
@@ -63,9 +61,7 @@
  * Responsible for rendering weblog feeds.
  *
  * @web.servlet name="FeedServlet" load-on-startup="5"
- * @web.servlet-mapping url-pattern="/flavor/*"
- * @web.servlet-mapping url-pattern="/rss/*"
- * @web.servlet-mapping url-pattern="/atom/*"
+ * @web.servlet-mapping url-pattern="/feeds/*"
  */ 
 public class FeedServlet extends HttpServlet implements CacheHandler {
     
@@ -120,117 +116,45 @@
         
         log.debug("Entering");
         
-        // used for rendering
-        HashMap model = new HashMap();
-        
-        RollerRequest rreq = null;
-        
         WeblogFeedRequest feedRequest = null;
+        WebsiteData weblog = null;
         try {
+            // parse the incoming request and extract the relevant data
             feedRequest = new WeblogFeedRequest(request);
+            
+            // lookup weblog specified by feed request
+            UserManager uMgr = RollerFactory.getRoller().getUserManager();
+            weblog = uMgr.getWebsiteByHandle(feedRequest.getWeblogHandle());
+            
+            if(weblog == null) {
+                throw new RollerException("unable to lookup weblog: "+
+                        feedRequest.getWeblogHandle());
+            }
         } catch(Exception e) {
             // some kind of error parsing the request
             log.error("error creating weblog feed request", e);
             response.sendError(HttpServletResponse.SC_NOT_FOUND);
             return;
         }
-        
-        // first off lets parse the incoming request and validate it
-        // TODO: this is old pre 3.0 stuff which should be removed when possible
-        try {
-            PageContext pageContext =
-                    JspFactory.getDefaultFactory().getPageContext(
-                    this, request,  response, "", true, 8192, true);
-            
-            rreq = RollerRequest.getRollerRequest(pageContext);
-            
-            // This is an ugly hack to fix the following bug:
-            // ROL-547: "Site wide RSS feed is your own if you are logged in"
-            String[] pathInfo = StringUtils.split(rreq.getPathInfo(),"/");
-            if (pathInfo.length < 1) {
-                // If weblog not specified in URL, set it to null
-                rreq.setWebsite(null);
-            }
-            
-        } catch (RollerException e) {
-            // An error initializing the request is considered to be a 404
-            response.sendError(HttpServletResponse.SC_NOT_FOUND);
-            log.debug("ERROR initializing RollerRequest", e);
-            return;
-        }
-        
-        
-        String pageId = null;
-        WebsiteData weblog = rreq.getWebsite();
-        if (request.getServletPath().endsWith("rss")) {
-            
-            if (weblog != null) {
-                try {
-                    // if useer has a custom rss template then use it
-                    Template page = weblog.getPageByName("_rss");
-                    if(page != null) {
-                        pageId = page.getId();
-                    }
-                } catch (RollerException ex) {
-                    // consider this a page not found
-                }
-            }
-            
-            if(pageId == null) {
-                pageId = "templates/feeds/rss.vm";
-            }
-        } else if (request.getServletPath().endsWith("atom")) {
-            
-            if (weblog != null) {
-                try {
-                    // if user has a custom atom template then use it
-                    Template page = weblog.getPageByName("_atom");
-                    if(page != null) {
-                        pageId = page.getId();
-                    }
-                } catch (RollerException ex) {
-                    // consider this a page not found
-                }
-            }
-            
-            if(pageId == null) {
-                pageId = "templates/feeds/atom.vm";
-            }
-        } else if (request.getParameter("flavor") != null) {
-            
-            // If request specifies a "flavor" then use that.
-            String flavor = request.getParameter("flavor");
-            pageId = "templates/feeds/" + flavor + ".vm";
-        } else {
-            
-            // Fall through to default RSS page template.
-            pageId = "templates/feeds/rss.vm";
-        }
             
         
         // 304 if-modified-since checking
         long sinceDate = request.getDateHeader("If-Modified-Since");
         log.debug("since date = "+sinceDate);
-        // TODO: need to have way to checking weblog last modified time
-        if(weblog.getDateCreated().getTime() <= sinceDate) {
+        if(weblog.getLastModified().getTime() <= sinceDate) {
             log.debug("NOT MODIFIED "+request.getRequestURL());
             response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
             return;
         }
         
         // set last-modified date
-        // TODO: figure out how to get weblog last modified time
-        response.setDateHeader("Last-Modified", weblog.getDateCreated().getTime());
+        response.setDateHeader("Last-Modified", weblog.getLastModified().getTime());
         
         // cached content checking
         String cacheKey = this.CACHE_ID+":"+this.generateKey(feedRequest);
         
         // we need the last expiration time for the given weblog
-        long lastExpiration = 0;
-        Date lastExpirationDate =
-                (Date) CacheManager.getLastExpiredDate(feedRequest.getWeblogHandle());
-        if(lastExpirationDate != null)
-            lastExpiration = lastExpirationDate.getTime();
+        long lastExpiration = weblog.getLastModified().getTime();
         
         LazyExpiringCacheEntry entry =
                 (LazyExpiringCacheEntry) this.contentCache.get(cacheKey);
@@ -256,28 +180,25 @@
 
         
         // looks like we need to render content
+        HashMap model = new HashMap();
+        String pageId = null;
         try {
-            // get update time before loading context
-            // TODO: this should really be handled elsewhere
-            WeblogManager wmgr = RollerFactory.getRoller().getWeblogManager();
-            String catname = request.getParameter(RollerRequest.WEBLOGCATEGORYNAME_KEY);
-            Date updateTime = wmgr.getWeblogLastPublishTime(rreq.getWebsite(), catname);
-            request.setAttribute("updateTime", updateTime);
+            RollerContext rollerContext = RollerContext.getRollerContext();
             
-            // populate the model
+            // determine what template to render with
+            if (rollerContext.isSiteWideWeblog(weblog.getHandle())) {
+                pageId = "site-"+feedRequest.getType()+"-"+feedRequest.getFormat()+".vm";
+            } else {
+                pageId = "weblog-"+feedRequest.getType()+"-"+feedRequest.getFormat()+".vm";
+            }
             
-            // TODO: remove this for Roller 3.0
-            ModelLoader.loadOldModels(response, request, model);
+            // populate the rendering model
 
             // Feeds get the weblog specific page model
             String modelsString = RollerConfig.getProperty("rendering.weblogPageModels");
-
-            // Unless the weblog is the frontpage weblog w/aggregated feeds
-            String frontPageHandle = 
-                RollerConfig.getProperty("velocity.pagemodel.classname");
-            boolean frontPageAggregated = 
-                RollerConfig.getBooleanProperty("frontpage.weblog.aggregatedFeeds");
-            if (weblog.getHandle().equals(frontPageHandle) && frontPageAggregated) {
+            
+            // special handling for site wide feed
+            if (rollerContext.isSiteWideWeblog(weblog.getHandle())) {
                 modelsString = RollerConfig.getProperty("rendering.weblogPageModels");
             }
             ModelLoader.loadConfiguredPageModels(modelsString, request, model);
@@ -285,9 +206,7 @@
             ModelLoader.loadPluginHelpers(weblog, model);
 
             // Feeds get weblog's additional custom models too
-            if (weblog != null) {
-                ModelLoader.loadAdditionalPageModels(weblog, request, model);
-            }   
+            ModelLoader.loadAdditionalPageModels(weblog, request, model);
             
         } catch (RollerException ex) {
             log.error("ERROR loading model for page", ex);
@@ -362,22 +281,21 @@
     private String generateKey(WeblogFeedRequest feedRequest) {
         
         StringBuffer key = new StringBuffer();
-        key.append(feedRequest.getContext());
         
-        if(feedRequest.getContext().equals("weblog")) {
-            key.append("/").append(feedRequest.getWeblogHandle().toLowerCase());
-            key.append("/").append(feedRequest.getFlavor());
-            
-            if(feedRequest.getWeblogCategory() != null) {
-                String cat = feedRequest.getWeblogCategory();
-                if(cat.startsWith("/"))
-                    cat = cat.substring(1).replaceAll("/","_");
-                
-                // categories may contain spaces, which is not desired
-                key.append("/").append(org.apache.commons.lang.StringUtils.deleteWhitespace(cat));
+        key.append("weblog");
+        key.append("/").append(feedRequest.getWeblogHandle().toLowerCase());
+        key.append("/").append(feedRequest.getType());
+        key.append("/").append(feedRequest.getFormat());
+        
+        if(feedRequest.getWeblogCategory() != null) {
+            String cat = feedRequest.getWeblogCategory();
+            try {
+                cat = URLEncoder.encode(cat, "UTF-8");
+            } catch (UnsupportedEncodingException ex) {
+                // should never happen, utf-8 is always supported
             }
-        } else {
-            key.append("/").append(feedRequest.getFlavor());
+            
+            key.append("/").append(cat);
         }
         
         // add language