KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > roller > presentation > xmlrpc > MetaWeblogAPIHandler


1
2 package org.roller.presentation.xmlrpc;
3
4 import java.io.ByteArrayInputStream JavaDoc;
5 import java.sql.Timestamp JavaDoc;
6 import java.util.ArrayList JavaDoc;
7 import java.util.Date JavaDoc;
8 import java.util.Hashtable JavaDoc;
9 import java.util.Iterator JavaDoc;
10 import java.util.List JavaDoc;
11 import java.util.Map JavaDoc;
12 import java.util.Vector JavaDoc;
13
14 import javax.servlet.http.HttpServletRequest JavaDoc;
15
16 import org.apache.commons.logging.Log;
17 import org.apache.commons.logging.LogFactory;
18 import org.apache.struts.util.RequestUtils;
19 import org.apache.xmlrpc.XmlRpcException;
20 import org.roller.RollerException;
21 import org.roller.model.FileManager;
22 import org.roller.model.Roller;
23 import org.roller.model.WeblogManager;
24 import org.roller.pojos.WeblogCategoryData;
25 import org.roller.pojos.WeblogEntryData;
26 import org.roller.pojos.WebsiteData;
27 import org.roller.presentation.RollerContext;
28 import org.roller.presentation.RollerRequest;
29 import org.roller.util.RollerMessages;
30 import org.roller.util.Utilities;
31
32
33 /**
34  * Roller XML-RPC Handler for the MetaWeblog API.
35  *
36  * MetaWeblog API spec can be found at http://www.xmlrpc.com/metaWeblogApi
37  *
38  * @author David M Johnson
39  */

40 public class MetaWeblogAPIHandler extends BloggerAPIHandler
41 {
42     static final long serialVersionUID = -1364456614935668629L;
43     
44     private static Log mLogger =
45         LogFactory.getFactory().getInstance(MetaWeblogAPIHandler.class);
46
47     public MetaWeblogAPIHandler()
48     {
49         super();
50     }
51
52     //------------------------------------------------------------------------
53

54     /**
55      * Authenticates a user and returns the categories available in the website
56      *
57      * @param blogid Dummy Value for Roller
58      * @param userid Login for a MetaWeblog user who has permission to post to the blog
59      * @param password Password for said username
60      * @throws Exception
61      * @return
62      */

63     public Object JavaDoc getCategories(String JavaDoc blogid, String JavaDoc userid, String JavaDoc password)
64                          throws Exception JavaDoc
65     {
66         mLogger.info("getCategories() Called =====[ SUPPORTED ]=====");
67         mLogger.info(" BlogId: " + blogid);
68         mLogger.info(" UserId: " + userid);
69
70         WebsiteData website = validate(userid,password);
71         RollerRequest rreq = RollerRequest.getRollerRequest();
72         Roller roller = rreq.getRoller();
73         try
74         {
75             Hashtable JavaDoc result = new Hashtable JavaDoc();
76             WeblogManager weblogMgr = roller.getWeblogManager();
77             List JavaDoc cats = weblogMgr.getWeblogCategories(website, false);
78             for (Iterator JavaDoc wbcItr = cats.iterator(); wbcItr.hasNext();) {
79                 WeblogCategoryData category = (WeblogCategoryData) wbcItr.next();
80                 result.put(category.getPath(), createCategoryStruct(category));
81             }
82             return result;
83         }
84         catch (Exception JavaDoc e)
85         {
86             String JavaDoc msg = "ERROR in MetaWeblogAPIHandler.getCategories";
87             mLogger.error(msg,e);
88             throw new XmlRpcException(UNKNOWN_EXCEPTION, msg);
89         }
90     }
91
92     //------------------------------------------------------------------------
93

94     /**
95      * Edits a given post. Optionally, will publish the blog after making the edit
96      *
97      * @param postid Unique identifier of the post to be changed
98      * @param userid Login for a MetaWeblog user who has permission to post to the blog
99      * @param password Password for said username
100      * @param struct Contents of the post
101      * @param publish If true, the blog will be published immediately after the post is made
102      * @throws org.apache.xmlrpc.XmlRpcException
103      * @return
104      */

105     public boolean editPost(String JavaDoc postid, String JavaDoc userid, String JavaDoc password,
106                             Hashtable JavaDoc struct, boolean publish)
107                      throws Exception JavaDoc
108     {
109         mLogger.info("editPost() Called ========[ SUPPORTED ]=====");
110         mLogger.info(" PostId: " + postid);
111         mLogger.info(" UserId: " + userid);
112         mLogger.info(" Publish: " + publish);
113
114         validate(userid,password);
115
116         Roller roller = RollerRequest.getRollerRequest().getRoller();
117
118         Hashtable JavaDoc postcontent = struct;
119         String JavaDoc description = (String JavaDoc)postcontent.get("description");
120         String JavaDoc title = (String JavaDoc)postcontent.get("title");
121         if (title == null) title = "";
122
123         Date JavaDoc dateCreated = (Date JavaDoc)postcontent.get("dateCreated");
124         if (dateCreated == null) dateCreated = (Date JavaDoc)postcontent.get("pubDate");
125
126         String JavaDoc cat = null;
127         if ( postcontent.get("categories") != null )
128         {
129             Vector JavaDoc cats = (Vector JavaDoc)postcontent.get("categories");
130             cat = (String JavaDoc)cats.elementAt(0);
131         }
132         mLogger.info(" Title: " + title);
133         mLogger.info(" Category: " + cat);
134
135         try
136         {
137             WeblogManager weblogMgr = roller.getWeblogManager();
138
139             Timestamp JavaDoc current =
140                 new Timestamp JavaDoc(System.currentTimeMillis());
141
142             WeblogEntryData entry =
143                 weblogMgr.retrieveWeblogEntry(postid);
144
145             if ( !title.equals("") ) entry.setTitle(title);
146             entry.setText(description);
147             entry.setUpdateTime(current);
148             if (dateCreated != null)
149             {
150                 entry.setPubTime(new Timestamp JavaDoc(dateCreated.getTime()));
151             }
152             entry.setPublishEntry(Boolean.valueOf(publish));
153
154             if ( cat != null )
155             {
156                 // Use first category specified by request
157
WeblogCategoryData cd =
158                     weblogMgr.getWeblogCategoryByPath(entry.getWebsite(), cat);
159                 entry.setCategory(cd);
160             }
161
162             entry.save();
163             roller.commit();
164             flushPageCache(userid);
165
166             // TODO: Roller timestamps need better than 1 second accuracy
167
// Until then, we can't allow more than one post per second
168
Thread.sleep(1000);
169             
170             return true;
171         }
172         catch (Exception JavaDoc e)
173         {
174             String JavaDoc msg = "ERROR in MetaWeblogAPIHandler.editPost";
175             mLogger.error(msg,e);
176             throw new XmlRpcException(UNKNOWN_EXCEPTION, msg);
177         }
178     }
179
180     //------------------------------------------------------------------------
181

182     /**
183      * Makes a new post to a designated blog. Optionally, will publish the blog after making the post
184      *
185      * @param blogid Unique identifier of the blog the post will be added to
186      * @param userid Login for a MetaWeblog user who has permission to post to the blog
187      * @param password Password for said username
188      * @param struct Contents of the post
189      * @param publish If true, the blog will be published immediately after the post is made
190      * @throws org.apache.xmlrpc.XmlRpcException
191      * @return
192      */

193     public String JavaDoc newPost(
194         String JavaDoc blogid, String JavaDoc userid, String JavaDoc password, Hashtable JavaDoc struct, boolean publish)
195         throws Exception JavaDoc
196     {
197         mLogger.info("newPost() Called ===========[ SUPPORTED ]=====");
198         mLogger.info(" BlogId: " + blogid);
199         mLogger.info(" UserId: " + userid);
200         mLogger.info(" Publish: " + publish);
201
202         WebsiteData website = validate(userid,password);
203
204         Hashtable JavaDoc postcontent = struct;
205         String JavaDoc description = (String JavaDoc)postcontent.get("description");
206         String JavaDoc title = (String JavaDoc)postcontent.get("title");
207         if (title == null) title = "";
208
209         Date JavaDoc dateCreated = (Date JavaDoc)postcontent.get("dateCreated");
210         if (dateCreated == null) dateCreated = (Date JavaDoc)postcontent.get("pubDate");
211         if (dateCreated == null) dateCreated = new Date JavaDoc();
212
213         String JavaDoc cat = null;
214         if ( postcontent.get("categories") != null )
215         {
216             Vector JavaDoc cats = (Vector JavaDoc)postcontent.get("categories");
217             if (cats.size() > 0)
218             {
219                 // only use the first category passed in
220
cat = (String JavaDoc)cats.elementAt(0);
221             }
222         }
223         mLogger.info(" Title: " + title);
224         mLogger.info(" Category: " + cat);
225
226         try
227         {
228             Roller roller = RollerRequest.getRollerRequest().getRoller();
229             WeblogManager weblogMgr = roller.getWeblogManager();
230
231             Timestamp JavaDoc current =
232                 new Timestamp JavaDoc(System.currentTimeMillis());
233
234             WeblogEntryData entry = new WeblogEntryData();
235             entry.setTitle(title);
236             entry.setText(description);
237             entry.setPubTime(new Timestamp JavaDoc(dateCreated.getTime()));
238             entry.setUpdateTime(current);
239             entry.setWebsite(website);
240             entry.setPublishEntry(Boolean.valueOf(publish));
241
242             if ( cat != null )
243             {
244                 // Use first category specified by request
245
WeblogCategoryData cd =
246                     weblogMgr.getWeblogCategoryByPath(website, cat);
247                 entry.setCategory(cd);
248             }
249             else
250             {
251                 // Use Blogger API category from user's weblog config
252
entry.setCategory(website.getBloggerCategory());
253             }
254
255             entry.save();
256             roller.commit();
257             flushPageCache(userid);
258
259             // TODO: Roller timestamps need better than 1 second accuracy
260
// Until then, we can't allow more than one post per second
261
Thread.sleep(1000);
262
263             return entry.getId();
264         }
265         catch (Exception JavaDoc e)
266         {
267             String JavaDoc msg = "ERROR in MetaWeblogAPIHandler.newPost";
268             mLogger.error(msg,e);
269             throw new XmlRpcException(UNKNOWN_EXCEPTION, msg);
270         }
271     }
272
273     //------------------------------------------------------------------------
274

275     /**
276      *
277      * @param postid
278      * @param userid
279      * @param password
280      * @return
281      * @throws Exception
282      */

283     public Object JavaDoc getPost(String JavaDoc postid, String JavaDoc userid, String JavaDoc password)
284                    throws Exception JavaDoc
285     {
286         mLogger.info("getPost() Called =========[ SUPPORTED ]=====");
287         mLogger.info(" PostId: " + postid);
288         mLogger.info(" UserId: " + userid);
289
290         validate(userid,password);
291
292         try
293         {
294             Roller roller = RollerRequest.getRollerRequest().getRoller();
295             WeblogManager weblogMgr = roller.getWeblogManager();
296             WeblogEntryData entry = weblogMgr.retrieveWeblogEntry(postid);
297             return createPostStruct(entry);
298         }
299         catch (Exception JavaDoc e)
300         {
301             String JavaDoc msg = "ERROR in MetaWeblogAPIHandler.getPost";
302             mLogger.error(msg,e);
303             throw new XmlRpcException(UNKNOWN_EXCEPTION, msg);
304         }
305     }
306
307     //------------------------------------------------------------------------
308

309     /**
310      * Allows user to post a binary object, a file, to Roller. If the file is
311      * allowed by the RollerConfig file-upload settings, then the file will be
312      * placed in the user's upload diretory.
313      */

314     public Object JavaDoc newMediaObject(
315             String JavaDoc blogid, String JavaDoc userid, String JavaDoc password, Hashtable JavaDoc struct)
316         throws Exception JavaDoc
317     {
318         mLogger.debug("newMediaObject() Called =[ SUPPORTED ]=====");
319         mLogger.debug(" BlogId: " + blogid);
320         mLogger.debug(" UserId: " + userid);
321         mLogger.debug(" Password: *********");
322
323         WebsiteData website = validate(userid, password);
324         try
325         {
326             String JavaDoc name = (String JavaDoc) struct.get("name");
327             name = name.replaceAll("/","_");
328             String JavaDoc type = (String JavaDoc) struct.get("type");
329             mLogger.debug("newMediaObject name: " + name);
330             mLogger.debug("newMediaObject type: " + type);
331             
332             byte[] bits = (byte[]) struct.get("bits");
333
334             Roller roller = RollerRequest.getRollerRequest().getRoller();
335             FileManager fmgr = roller.getFileManager();
336             RollerMessages msgs = new RollerMessages();
337             
338             // If save is allowed by Roller system-wide policies
339
if (fmgr.canSave(website, name, bits.length, msgs))
340             {
341                 // Then save the file
342
fmgr.saveFile(
343                     website, name, bits.length, new ByteArrayInputStream JavaDoc(bits));
344                 
345                 RollerRequest rreq = RollerRequest.getRollerRequest();
346                 HttpServletRequest JavaDoc request = rreq.getRequest();
347                 
348                 // TODO: build URL to uploaded file should be done in FileManager
349
String JavaDoc uploadPath = RollerContext.getUploadPath(
350                         request.getSession(true).getServletContext());
351                 uploadPath += "/" + website.getUser().getUserName() + "/" + name;
352                 String JavaDoc fileLink = RequestUtils.printableURL(
353                         RequestUtils.absoluteURL(request, uploadPath));
354                 
355                 Hashtable JavaDoc returnStruct = new Hashtable JavaDoc(1);
356                 returnStruct.put("url", fileLink);
357                 return returnStruct;
358             }
359             throw new XmlRpcException(UPLOAD_DENIED_EXCEPTION,
360                 "File upload denied because:" + msgs.toString());
361         }
362         catch (RollerException e)
363         {
364             String JavaDoc msg = "ERROR in BlooggerAPIHander.newMediaObject";
365             mLogger.error(msg,e);
366             throw new XmlRpcException(UNKNOWN_EXCEPTION, msg);
367         }
368     }
369
370     /**
371      * Get a list of recent posts for a category
372      *
373      * @param blogid Unique identifier of the blog the post will be added to
374      * @param userid Login for a Blogger user who has permission to post to the blog
375      * @param password Password for said username
376      * @param numposts Number of Posts to Retrieve
377      * @throws XmlRpcException
378      * @return
379      */

380     public Object JavaDoc getRecentPosts(
381         String JavaDoc blogid, String JavaDoc userid, String JavaDoc password, int numposts)
382         throws Exception JavaDoc
383     {
384         mLogger.info("getRecentPosts() Called ===========[ SUPPORTED ]=====");
385         mLogger.info(" BlogId: " + blogid);
386         mLogger.info(" UserId: " + userid);
387         mLogger.info(" Number: " + numposts);
388
389         WebsiteData website = validate(userid,password);
390
391         try
392         {
393             Vector JavaDoc results = new Vector JavaDoc();
394
395             Roller roller = RollerRequest.getRollerRequest().getRoller();
396             WeblogManager weblogMgr = roller.getWeblogManager();
397             if (website != null)
398             {
399                 Map JavaDoc entries = weblogMgr.getWeblogEntryObjectMap(
400                                 website, // userName
401
null, // startDate
402
new Date JavaDoc(), // endDate
403
null, // catName
404
WeblogManager.ALL, // status
405
new Integer JavaDoc(numposts)); // maxEntries
406

407                 Iterator JavaDoc iter = entries.values().iterator();
408                 while (iter.hasNext())
409                 {
410                     ArrayList JavaDoc list = (ArrayList JavaDoc) iter.next();
411                     Iterator JavaDoc entryIter = list.iterator();
412                     while (entryIter.hasNext())
413                     {
414                         WeblogEntryData entry = (WeblogEntryData)entryIter.next();
415                         results.addElement(createPostStruct(entry));
416                     }
417                 }
418             }
419             return results;
420         }
421         catch (Exception JavaDoc e)
422         {
423             String JavaDoc msg = "ERROR in BlooggerAPIHander.getRecentPosts";
424             mLogger.error(msg,e);
425             throw new XmlRpcException(UNKNOWN_EXCEPTION, msg);
426         }
427     }
428     
429     private Hashtable JavaDoc createPostStruct(WeblogEntryData entry)
430     {
431         RollerRequest rreq = RollerRequest.getRollerRequest();
432         HttpServletRequest JavaDoc request = rreq.getRequest();
433         RollerContext rollerCtx = RollerContext.getRollerContext(request);
434         String JavaDoc permalink =
435             rollerCtx.getAbsoluteContextUrl(request) + entry.getPermaLink();
436         
437         Hashtable JavaDoc struct = new Hashtable JavaDoc();
438         struct.put("title", entry.getTitle());
439         if (entry.getLink() != null)
440         {
441             struct.put("link", Utilities.escapeHTML(entry.getLink()));
442         }
443         
444         struct.put("description", entry.getText());
445         struct.put("pubDate", entry.getPubTime());
446         struct.put("dateCreated", entry.getPubTime());
447         struct.put("guid", Utilities.escapeHTML(permalink));
448         struct.put("permaLink", Utilities.escapeHTML(permalink));
449         struct.put("postid", entry.getId());
450         struct.put("userid", entry.getWebsite().getUser().getId());
451
452         Vector JavaDoc catArray = new Vector JavaDoc();
453         catArray.addElement(entry.getCategory().getPath());
454         struct.put("categories", catArray);
455         
456         return struct;
457     }
458     
459     private Hashtable JavaDoc createCategoryStruct(WeblogCategoryData category)
460     {
461         RollerRequest rreq = RollerRequest.getRollerRequest();
462         HttpServletRequest JavaDoc req = rreq.getRequest();
463         String JavaDoc contextUrl = RollerContext.getRollerContext(req).getAbsoluteContextUrl(req);
464         String JavaDoc userid = category.getWebsite().getUser().getId();
465
466         Hashtable JavaDoc struct = new Hashtable JavaDoc();
467         struct.put("description", category.getPath());
468         
469         String JavaDoc catUrl = contextUrl+"/page/"+userid+"?catname="+category.getPath();
470         catUrl = Utilities.stringReplace(catUrl," ","%20");
471         struct.put("htmlUrl", catUrl);
472
473         String JavaDoc rssUrl = contextUrl+"/rss/"+userid+"?catname="+category.getPath();
474         rssUrl = Utilities.stringReplace(catUrl," ","%20");
475         struct.put("rssUrl",rssUrl);
476         
477         return struct;
478     }
479 }
480
Popular Tags