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/07/12 03:14:11 UTC

svn commit: r421067 - in /incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/rendering: WeblogRequestMapper.java servlets/TrackbackServlet.java util/WeblogTrackbackRequest.java

Author: agilliland
Date: Tue Jul 11 18:14:10 2006
New Revision: 421067

URL: http://svn.apache.org/viewvc?rev=421067&view=rev
Log:
adding trackback support under new url structure.

- added parsed WeblogTrackbackRequest object.
- updated TrackbackServlet to use new parsed trackback request class and rip out RollerRequest.
- updated weblog request mapper to map requests to trackbacks.



Added:
    incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/rendering/util/WeblogTrackbackRequest.java
Modified:
    incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/rendering/WeblogRequestMapper.java
    incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/rendering/servlets/TrackbackServlet.java

Modified: incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/rendering/WeblogRequestMapper.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/rendering/WeblogRequestMapper.java?rev=421067&r1=421066&r2=421067&view=diff
==============================================================================
--- incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/rendering/WeblogRequestMapper.java (original)
+++ incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/rendering/WeblogRequestMapper.java Tue Jul 11 18:14:10 2006
@@ -155,8 +155,8 @@
         }
         
         // calculate forward url
-        String forwardUrl = calculateForwardUrl(weblogHandle, weblogLocale,
-                weblogRequestContext, weblogRequestData, request.getMethod());
+        String forwardUrl = calculateForwardUrl(request, weblogHandle, weblogLocale,
+                weblogRequestContext, weblogRequestData);
         
         // if we don't have a forward url then the request was invalid somehow
         if(forwardUrl == null) {
@@ -179,27 +179,45 @@
      *
      * handle is always assumed valid, all other params may be null.
      */
-    private String calculateForwardUrl(String handle, String locale,
-                                       String context, String data,
-                                       String method) {
+    private String calculateForwardUrl(HttpServletRequest request,
+                                       String handle, String locale,
+                                       String context, String data) {
         
-        log.debug(handle+","+locale+","+context+","+data+","+method);
+        log.debug(handle+","+locale+","+context+","+data);
         
         StringBuffer forwardUrl = new StringBuffer();
         
         // POST urls, like comment and trackback servlets
-        if("POST".equals(method)) {
+        if("POST".equals(request.getMethod())) {
+            // posting to permalink, this means comment or trackback
             if(context.equals("entry")) {
-                // TODO 3.0: need to figure out how to route requests to trackback servlet
-                forwardUrl.append(COMMENT_SERVLET);
-                forwardUrl.append("/");
-                forwardUrl.append(handle);
-                forwardUrl.append("/");
-                forwardUrl.append(context);
-                if(data != null) {
+                // trackback requests are required to have an "excerpt" param
+                if(request.getParameter("excerpt") != null) {
+                    
+                    forwardUrl.append(TRACKBACK_SERVLET);
                     forwardUrl.append("/");
-                    forwardUrl.append(data);
+                    forwardUrl.append(handle);
+                    forwardUrl.append("/");
+                    forwardUrl.append(context);
+                    if(data != null) {
+                        forwardUrl.append("/");
+                        forwardUrl.append(data);
+                    }
+                    
+                // comment requests are required to have a "content" param
+                } else if(request.getParameter("content") != null) {
+                    
+                    forwardUrl.append(COMMENT_SERVLET);
+                    forwardUrl.append("/");
+                    forwardUrl.append(handle);
+                    forwardUrl.append("/");
+                    forwardUrl.append(context);
+                    if(data != null) {
+                        forwardUrl.append("/");
+                        forwardUrl.append(data);
+                    }
                 }
+                
             } else {
                 // someone posting data where they aren't supposed to
                 return null;

Modified: incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/rendering/servlets/TrackbackServlet.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/rendering/servlets/TrackbackServlet.java?rev=421067&r1=421066&r2=421067&view=diff
==============================================================================
--- incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/rendering/servlets/TrackbackServlet.java (original)
+++ incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/rendering/servlets/TrackbackServlet.java Tue Jul 11 18:14:10 2006
@@ -20,7 +20,6 @@
 
 import java.io.IOException;
 import java.io.PrintWriter;
-import java.io.UnsupportedEncodingException;
 import java.sql.Timestamp;
 import java.util.Date;
 import javax.servlet.ServletException;
@@ -29,14 +28,16 @@
 import javax.servlet.http.HttpServletResponse;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.roller.RollerException;
 import org.apache.roller.config.RollerRuntimeConfig;
 import org.apache.roller.model.RollerFactory;
+import org.apache.roller.model.UserManager;
 import org.apache.roller.model.WeblogManager;
 import org.apache.roller.pojos.CommentData;
 import org.apache.roller.pojos.WeblogEntryData;
 import org.apache.roller.pojos.WebsiteData;
 import org.apache.roller.ui.core.RollerContext;
-import org.apache.roller.ui.core.RollerRequest;
+import org.apache.roller.ui.rendering.util.WeblogTrackbackRequest;
 import org.apache.roller.util.LinkbackExtractor;
 import org.apache.roller.util.SpamChecker;
 import org.apache.roller.util.cache.CacheManager;
@@ -45,7 +46,7 @@
 
 /**
  * Roller's Trackback server implementation. POSTing to this Servlet will add a
- * Trackback to a Weblog Entrty. For more info on Trackback, read the spec:
+ * Trackback to a Weblog Entry. For more info on Trackback, read the spec:
  * <a href="http://www.movabletype.org/docs/mttrackback.html>MT Trackback</a>.
  *
  * @web.servlet name="TrackbackServlet"
@@ -55,18 +56,6 @@
     
     private static Log logger = LogFactory.getLog(TrackbackServlet.class);
     
-    /** Request parameter for the trackback "title" */
-    private static final String TRACKBACK_TITLE_PARAM = "title";
-    
-    /** Request parameter for the trackback "excerpt" */
-    private static final String TRACKBACK_EXCERPT_PARAM = "excerpt";
-    
-    /** Request parameter for the trackback "url" */
-    private static final String TRACKBACK_URL_PARAM = "url";
-    
-    /** Request parameter for the trackback "blog_name" */
-    private static final String TRACKBACK_BLOG_NAME_PARAM = "blog_name";
-    
     
     /**
      * Handle incoming http GET requests.
@@ -91,29 +80,51 @@
         String error = null;
         PrintWriter pw = response.getWriter();
         
-        String url = request.getParameter(TRACKBACK_URL_PARAM);
-        String title = request.getParameter(TRACKBACK_TITLE_PARAM);
-        String excerpt = request.getParameter(TRACKBACK_EXCERPT_PARAM);
-        String blogName = request.getParameter(TRACKBACK_BLOG_NAME_PARAM);
-        
-        if ((title == null) || "".equals(title)) {
-            title = url;
-        }
-        
-        if (excerpt == null) {
-            excerpt = "";
-        } else {
-            if (excerpt.length() >= 255) {
-                excerpt = excerpt.substring(0, 252);
-                excerpt += "...";
-            }
-        }
-        
+        WebsiteData weblog = null;
+        WeblogEntryData entry = null;
         
+        WeblogTrackbackRequest trackbackRequest = null;
         if(!RollerRuntimeConfig.getBooleanProperty("users.trackbacks.enabled")) {
             error = "Trackbacks are disabled for this site";
-        } else if (title==null || url==null || excerpt==null || blogName==null) {
-            error = "title, url, excerpt, and blog_name not specified.";
+        } else {
+            
+            try {
+                trackbackRequest = new WeblogTrackbackRequest(request);
+                
+                if((trackbackRequest.getTitle() == null) ||
+                        "".equals(trackbackRequest.getTitle())) {
+                    trackbackRequest.setTitle(trackbackRequest.getUrl());
+                }
+                
+                if(trackbackRequest.getExcerpt() == null) {
+                    trackbackRequest.setExcerpt("");
+                } else if(trackbackRequest.getExcerpt().length() >= 255) {
+                    trackbackRequest.setExcerpt(trackbackRequest.getExcerpt().substring(0, 252)+"...");
+                }
+                
+                // lookup weblog specified by comment request
+                UserManager uMgr = RollerFactory.getRoller().getUserManager();
+                weblog = uMgr.getWebsiteByHandle(trackbackRequest.getWeblogHandle());
+                
+                if(weblog == null) {
+                    throw new RollerException("unable to lookup weblog: "+
+                            trackbackRequest.getWeblogHandle());
+                }
+                
+                // lookup entry specified by comment request
+                WeblogManager weblogMgr = RollerFactory.getRoller().getWeblogManager();
+                entry = weblogMgr.getWeblogEntryByAnchor(weblog, trackbackRequest.getWeblogAnchor());
+                
+                if(entry == null) {
+                    throw new RollerException("unable to lookup entry: "+
+                            trackbackRequest.getWeblogAnchor());
+                }
+                
+            } catch (Exception e) {
+                // some kind of error parsing the request or looking up weblog
+                logger.debug("error creating page request", e);
+                error = e.getMessage();
+            }
         }
         
         if(error != null) {
@@ -121,20 +132,17 @@
             return;
         }
         
-        boolean verified = true;
         try {
-            RollerRequest rreq = RollerRequest.getRollerRequest(request);
-            WeblogEntryData entry = rreq.getWeblogEntry();
-            WebsiteData website = entry.getWebsite();
-            boolean siteAllows = website.getAllowComments().booleanValue();
+            boolean siteAllows = weblog.getAllowComments().booleanValue();
+            boolean verified = true;
             
             if (entry!=null && siteAllows && entry.getCommentsStillAllowed()) {
                 
                 // Track trackbacks as comments
                 CommentData comment = new CommentData();
-                comment.setContent("[Trackback] "+excerpt);
-                comment.setName(blogName);
-                comment.setUrl(url);
+                comment.setContent("[Trackback] "+trackbackRequest.getExcerpt());
+                comment.setName(trackbackRequest.getBlogName());
+                comment.setUrl(trackbackRequest.getUrl());
                 comment.setWeblogEntry(entry);
                 comment.setNotify(Boolean.FALSE);
                 comment.setPostTime(new Timestamp(new Date().getTime()));
@@ -167,7 +175,7 @@
                 
                 if (error == null) {
                     // If comment moderation is on, set comment as pending
-                    if (verified && website.getCommentModerationRequired()) {
+                    if (verified && weblog.getCommentModerationRequired()) {
                         comment.setPending(Boolean.TRUE);
                         comment.setApproved(Boolean.FALSE);
                     } else if (verified) {

Added: incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/rendering/util/WeblogTrackbackRequest.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/rendering/util/WeblogTrackbackRequest.java?rev=421067&view=auto
==============================================================================
--- incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/rendering/util/WeblogTrackbackRequest.java (added)
+++ incubator/roller/branches/roller_3.0/src/org/apache/roller/ui/rendering/util/WeblogTrackbackRequest.java Tue Jul 11 18:14:10 2006
@@ -0,0 +1,186 @@
+/*
+ * 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.
+ */
+
+package org.apache.roller.ui.rendering.util;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+
+/**
+ * Represents a request to post a weblog entry trackback.
+ */
+public class WeblogTrackbackRequest extends WeblogRequest {
+    
+    private static Log log = LogFactory.getLog(WeblogTrackbackRequest.class);
+    
+    private static final String TRACKBACK_SERVLET = "/roller-ui/rendering/trackback";
+    
+    private String blogName = null;
+    private String url = null;
+    private String excerpt = null;
+    private String title = null;
+    private String weblogAnchor = null;
+    
+    
+    public WeblogTrackbackRequest() {}
+    
+    
+    public WeblogTrackbackRequest(HttpServletRequest request) 
+            throws InvalidRequestException {
+        
+        // let our parent take care of their business first
+        // parent determines weblog handle and locale if specified
+        super(request);
+        
+        String servlet = request.getServletPath();
+        
+        // we only want the path info left over from after our parents parsing
+        String pathInfo = this.getPathInfo();
+        
+        // was this request bound for the comment servlet?
+        if(servlet == null || !TRACKBACK_SERVLET.equals(servlet)) {
+            throw new InvalidRequestException("not a weblog trackback request, "+
+                    request.getRequestURL());
+        }
+        
+        
+        /*
+         * parse path info.  we expect ...
+         *
+         * /entry/<anchor> - permalink
+         */
+        if(pathInfo != null && pathInfo.trim().length() > 0) {
+            
+            // we should only ever get 2 path elements
+            String[] pathElements = pathInfo.split("/");
+            if(pathElements.length == 2) {
+                
+                String context = pathElements[0];
+                if("entry".equals(context)) {
+                    try {
+                        this.weblogAnchor = 
+                                URLDecoder.decode(pathElements[1], "UTF-8");
+                    } catch (UnsupportedEncodingException ex) {
+                        // should never happen
+                        log.error(ex);
+                    }
+                    
+                } else {
+                    throw new InvalidRequestException("bad path info, "+
+                            request.getRequestURL());
+                }
+                
+            } else {
+                throw new InvalidRequestException("bad path info, "+
+                        request.getRequestURL());
+            }
+            
+        } else {
+            // bad request
+            throw new InvalidRequestException("bad path info, "+
+                    request.getRequestURL());
+        }
+        
+        
+        /*
+         * parse request parameters
+         *
+         * the only params we currently care about are:
+         *   blog_name - comment author
+         *   url - comment referring url
+         *   excerpt - comment contents
+         *   title - comment title
+         */
+        if(request.getParameter("blog_name") != null) {
+            this.blogName = request.getParameter("blog_name");
+        }
+        
+        if(request.getParameter("url") != null) {
+            this.url = request.getParameter("url");
+        }
+        
+        if(request.getParameter("excerpt") != null) {
+            this.excerpt = request.getParameter("excerpt");
+        }
+        
+        if(request.getParameter("title") != null) {
+            this.title = request.getParameter("title");
+        }
+        
+        // a little bit of validation, trackbacks enforce that all params
+        // must have a value, so any nulls equals a bad request
+        if(this.blogName == null || this.url == null || 
+                this.excerpt == null || this.title == null) {
+            throw new InvalidRequestException("bad request data.  did not "+
+                    "receive values for all trackback params (blog_name, url, excerpt, title)");
+        }
+        
+        if(log.isDebugEnabled()) {
+            log.debug("name = "+this.blogName);
+            log.debug("url = "+this.url);
+            log.debug("excerpt = "+this.excerpt);
+            log.debug("title = "+this.title);
+            log.debug("weblogAnchor = "+this.weblogAnchor);
+        }
+    }
+
+    public String getBlogName() {
+        return blogName;
+    }
+
+    public void setBlogName(String blogName) {
+        this.blogName = blogName;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getExcerpt() {
+        return excerpt;
+    }
+
+    public void setExcerpt(String excerpt) {
+        this.excerpt = excerpt;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getWeblogAnchor() {
+        return weblogAnchor;
+    }
+
+    public void setWeblogAnchor(String weblogAnchor) {
+        this.weblogAnchor = weblogAnchor;
+    }
+    
+}