Return-Path: Delivered-To: apmail-incubator-roller-commits-archive@www.apache.org Received: (qmail 7321 invoked from network); 21 Jun 2006 03:15:05 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 21 Jun 2006 03:15:05 -0000 Received: (qmail 83626 invoked by uid 500); 21 Jun 2006 03:15:04 -0000 Delivered-To: apmail-incubator-roller-commits-archive@incubator.apache.org Received: (qmail 83592 invoked by uid 500); 21 Jun 2006 03:15:04 -0000 Mailing-List: contact roller-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: roller-dev@incubator.apache.org Delivered-To: mailing list roller-commits@incubator.apache.org Received: (qmail 83581 invoked by uid 99); 21 Jun 2006 03:15:04 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 20 Jun 2006 20:15:04 -0700 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received-SPF: pass (asf.osuosl.org: local policy) Received: from [140.211.166.113] (HELO eris.apache.org) (140.211.166.113) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 20 Jun 2006 20:15:03 -0700 Received: by eris.apache.org (Postfix, from userid 65534) id 4FBAF1A983A; Tue, 20 Jun 2006 20:14:43 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r415882 - in /incubator/roller/branches/roller_3.0/src/org/apache/roller/ui: core/WeblogFeedRequest.java rendering/servlets/FeedServlet.java Date: Wed, 21 Jun 2006 03:14:42 -0000 To: roller-commits@incubator.apache.org From: agilliland@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20060621031443.4FBAF1A983A@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N 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. + * + * /// + * + */ 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