KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > roller > ui > rendering > servlets > TrackbackServlet


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.ui.rendering.servlets;
20
21 import java.io.IOException JavaDoc;
22 import java.io.PrintWriter JavaDoc;
23 import java.sql.Timestamp JavaDoc;
24 import java.util.Date JavaDoc;
25 import javax.servlet.ServletException JavaDoc;
26 import javax.servlet.http.HttpServlet JavaDoc;
27 import javax.servlet.http.HttpServletRequest JavaDoc;
28 import javax.servlet.http.HttpServletResponse JavaDoc;
29 import org.apache.commons.logging.Log;
30 import org.apache.commons.logging.LogFactory;
31 import org.apache.roller.RollerException;
32 import org.apache.roller.config.RollerRuntimeConfig;
33 import org.apache.roller.model.RollerFactory;
34 import org.apache.roller.model.UserManager;
35 import org.apache.roller.model.WeblogManager;
36 import org.apache.roller.pojos.CommentData;
37 import org.apache.roller.pojos.WeblogEntryData;
38 import org.apache.roller.pojos.WebsiteData;
39 import org.apache.roller.ui.rendering.util.WeblogTrackbackRequest;
40 import org.apache.roller.util.LinkbackExtractor;
41 import org.apache.roller.util.SpamChecker;
42 import org.apache.roller.util.URLUtilities;
43 import org.apache.roller.util.cache.CacheManager;
44 import org.apache.struts.util.RequestUtils;
45
46
47 /**
48  * Roller's Trackback server implementation. POSTing to this Servlet will add a
49  * Trackback to a Weblog Entry. For more info on Trackback, read the spec:
50  * <a HREF="http://www.movabletype.org/docs/mttrackback.html>MT Trackback</a>.
51  *
52  * @web.servlet name="TrackbackServlet"
53  * @web.servlet-mapping url-pattern="/roller-ui/rendering/trackback/*"
54  */

55 public class TrackbackServlet extends HttpServlet JavaDoc {
56     
57     private static Log logger = LogFactory.getLog(TrackbackServlet.class);
58     
59     
60     /**
61      * Handle incoming http GET requests.
62      *
63      * The TrackbackServlet does not support GET requests, it's a 404.
64      */

65     public void doGet(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
66             throws IOException JavaDoc, ServletException JavaDoc {
67         
68         response.sendError(HttpServletResponse.SC_NOT_FOUND);
69     }
70     
71     
72     /**
73      * Service incoming POST requests.
74      *
75      * Here we handle incoming trackback posts.
76      */

77     public void doPost(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
78             throws ServletException JavaDoc, IOException JavaDoc {
79         
80         String JavaDoc error = null;
81         PrintWriter JavaDoc pw = response.getWriter();
82         
83         WebsiteData weblog = null;
84         WeblogEntryData entry = null;
85         
86         WeblogTrackbackRequest trackbackRequest = null;
87         if(!RollerRuntimeConfig.getBooleanProperty("users.trackbacks.enabled")) {
88             error = "Trackbacks are disabled for this site";
89         } else {
90             
91             try {
92                 trackbackRequest = new WeblogTrackbackRequest(request);
93                 
94                 if((trackbackRequest.getTitle() == null) ||
95                         "".equals(trackbackRequest.getTitle())) {
96                     trackbackRequest.setTitle(trackbackRequest.getUrl());
97                 }
98                 
99                 if(trackbackRequest.getExcerpt() == null) {
100                     trackbackRequest.setExcerpt("");
101                 } else if(trackbackRequest.getExcerpt().length() >= 255) {
102                     trackbackRequest.setExcerpt(trackbackRequest.getExcerpt().substring(0, 252)+"...");
103                 }
104                 
105                 // lookup weblog specified by comment request
106
UserManager uMgr = RollerFactory.getRoller().getUserManager();
107                 weblog = uMgr.getWebsiteByHandle(trackbackRequest.getWeblogHandle());
108                 
109                 if(weblog == null) {
110                     throw new RollerException("unable to lookup weblog: "+
111                             trackbackRequest.getWeblogHandle());
112                 }
113                 
114                 // lookup entry specified by comment request
115
WeblogManager weblogMgr = RollerFactory.getRoller().getWeblogManager();
116                 entry = weblogMgr.getWeblogEntryByAnchor(weblog, trackbackRequest.getWeblogAnchor());
117                 
118                 if(entry == null) {
119                     throw new RollerException("unable to lookup entry: "+
120                             trackbackRequest.getWeblogAnchor());
121                 }
122                 
123             } catch (Exception JavaDoc e) {
124                 // some kind of error parsing the request or looking up weblog
125
logger.debug("error creating page request", e);
126                 error = e.getMessage();
127             }
128         }
129         
130         if(error != null) {
131             pw.println(this.getErrorResponse(error));
132             return;
133         }
134         
135         try {
136             boolean siteAllows = weblog.getAllowComments().booleanValue();
137             boolean verified = true;
138             
139             if (entry!=null && siteAllows && entry.getCommentsStillAllowed()) {
140                 
141                 // Track trackbacks as comments
142
CommentData comment = new CommentData();
143                 comment.setContent("[Trackback] "+trackbackRequest.getExcerpt());
144                 comment.setName(trackbackRequest.getBlogName());
145                 comment.setUrl(trackbackRequest.getUrl());
146                 comment.setWeblogEntry(entry);
147                 comment.setNotify(Boolean.FALSE);
148                 comment.setPostTime(new Timestamp JavaDoc(new Date JavaDoc().getTime()));
149                 
150                 // If comment contains blacklisted text, mark as spam
151
SpamChecker checker = new SpamChecker();
152                 if (checker.checkTrackback(comment)) {
153                     comment.setSpam(Boolean.TRUE);
154                     logger.debug("Trackback blacklisted: "+comment.getUrl());
155                     error = "REJECTED: trackback contains spam words";
156                 }
157                 // Else, if trackback verification is on...
158
else if (RollerRuntimeConfig.getBooleanProperty(
159                         "site.trackbackVerification.enabled")) {
160                     
161                     // ...ensure trackbacker actually links to us
162
LinkbackExtractor linkback = new LinkbackExtractor(
163                             comment.getUrl(), URLUtilities.getWeblogEntryURL(weblog, null, entry.getAnchor(), true));
164                     if (linkback.getExcerpt() == null) {
165                         comment.setPending(Boolean.TRUE);
166                         comment.setApproved(Boolean.FALSE);
167                         verified = false;
168                         // if we can't verify trackback, then reject it
169
error = "REJECTED: trackback failed verification";
170                         logger.debug("Trackback failed verification: "+comment.getUrl());
171                     }
172                 }
173                 
174                 if (error == null) {
175                     // If comment moderation is on, set comment as pending
176
if (verified && weblog.getCommentModerationRequired()) {
177                         comment.setPending(Boolean.TRUE);
178                         comment.setApproved(Boolean.FALSE);
179                     } else if (verified) {
180                         comment.setPending(Boolean.FALSE);
181                         comment.setApproved(Boolean.TRUE);
182                     }
183                     
184                     // save, commit, send response
185
WeblogManager mgr = RollerFactory.getRoller().getWeblogManager();
186                     mgr.saveComment(comment);
187                     RollerFactory.getRoller().flush();
188                     
189                     // Clear all caches associated with comment
190
CacheManager.invalidate(comment);
191                     
192                     // Send email notifications
193
String JavaDoc rootURL = RollerRuntimeConfig.getAbsoluteContextURL();
194                     if (rootURL == null || rootURL.trim().length()==0) {
195                         rootURL = RequestUtils.serverURL(request) + request.getContextPath();
196                     }
197                     CommentServlet.sendEmailNotification(comment, rootURL);
198                     
199                     if(comment.getPending().booleanValue()) {
200                         pw.println(this.getSuccessResponse("Trackback submitted to moderator"));
201                     } else {
202                         pw.println(this.getSuccessResponse("Trackback accepted"));
203                     }
204                 }
205                 
206             } else if (entry!=null) {
207                 error = "Comments and Trackbacks are disabled for the entry you specified.";
208             } else {
209                 error = "Entry not specified.";
210             }
211             
212         } catch (Exception JavaDoc e) {
213             error = e.getMessage();
214             if ( error == null ) {
215                 error = e.getClass().getName();
216             }
217         }
218         
219         if(error!= null) {
220             pw.println(this.getErrorResponse(error));
221         }
222         
223     }
224     
225     
226     private String JavaDoc getSuccessResponse(String JavaDoc message) {
227         
228         StringBuffer JavaDoc output = new StringBuffer JavaDoc();
229         
230         output.append("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>");
231         output.append("<response>");
232         output.append("<error>0</error>");
233         output.append("<message>");
234         output.append(message);
235         output.append("</message>");
236         output.append("</response>");
237             
238         return output.toString();
239     }
240     
241     
242     private String JavaDoc getErrorResponse(String JavaDoc message) {
243         
244         StringBuffer JavaDoc output = new StringBuffer JavaDoc();
245         
246         output.append("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>");
247         output.append("<response>");
248         output.append("<error>1</error>");
249         output.append("<message>ERROR: ");
250         output.append(message);
251         output.append("</message>");
252         output.append("</response>");
253             
254         return output.toString();
255     }
256     
257 }
Popular Tags