/projects/roller-5.0.1/weblogger-web/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/EntryCollection.java

https://gitlab.com/essere.lab.public/qualitas.class-corpus · Java · 468 lines · 369 code · 54 blank · 45 comment · 64 complexity · e673541b5d657d066fda599ae2723fc5 MD5 · raw file

  1. /*
  2. * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
  3. * Use is subject to license terms.
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License"); you
  6. * may not use this file except in compliance with the License. You may
  7. * obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. */
  17. package org.apache.roller.weblogger.webservices.atomprotocol;
  18. import com.sun.syndication.feed.atom.Category;
  19. import com.sun.syndication.feed.atom.Content;
  20. import com.sun.syndication.feed.atom.Entry;
  21. import com.sun.syndication.feed.atom.Feed;
  22. import com.sun.syndication.feed.atom.Link;
  23. import com.sun.syndication.feed.atom.Person;
  24. import com.sun.syndication.propono.atom.common.rome.AppModule;
  25. import com.sun.syndication.propono.atom.common.rome.AppModuleImpl;
  26. import com.sun.syndication.propono.atom.server.AtomException;
  27. import com.sun.syndication.propono.atom.server.AtomNotAuthorizedException;
  28. import com.sun.syndication.propono.atom.server.AtomNotFoundException;
  29. import com.sun.syndication.propono.atom.server.AtomRequest;
  30. import java.sql.Timestamp;
  31. import java.util.ArrayList;
  32. import java.util.Collections;
  33. import java.util.Date;
  34. import java.util.Iterator;
  35. import java.util.List;
  36. import org.apache.commons.lang.StringUtils;
  37. import org.apache.commons.logging.Log;
  38. import org.apache.commons.logging.LogFactory;
  39. import org.apache.roller.weblogger.WebloggerException;
  40. import org.apache.roller.weblogger.business.WeblogEntryManager;
  41. import org.apache.roller.weblogger.business.Weblogger;
  42. import org.apache.roller.weblogger.business.WebloggerFactory;
  43. import org.apache.roller.weblogger.business.search.IndexManager;
  44. import org.apache.roller.weblogger.config.WebloggerRuntimeConfig;
  45. import org.apache.roller.weblogger.pojos.User;
  46. import org.apache.roller.weblogger.pojos.Weblog;
  47. import org.apache.roller.weblogger.pojos.WeblogCategory;
  48. import org.apache.roller.weblogger.pojos.WeblogEntry;
  49. import org.apache.roller.weblogger.pojos.WeblogEntryTag;
  50. import org.apache.roller.weblogger.util.Utilities;
  51. import org.apache.roller.weblogger.util.cache.CacheManager;
  52. /**
  53. * Collection of weblog entries.
  54. * @author davidm.johnson@sun.com
  55. */
  56. public class EntryCollection {
  57. private Weblogger roller;
  58. private User user;
  59. private int maxEntries = 20;
  60. private final String atomURL;
  61. private static Log log =
  62. LogFactory.getFactory().getInstance(EntryCollection.class);
  63. public EntryCollection(User user, String atomURL) {
  64. this.user = user;
  65. this.atomURL = atomURL;
  66. this.roller = WebloggerFactory.getWeblogger();
  67. }
  68. public Entry postEntry(AtomRequest areq, Entry entry) throws AtomException {
  69. log.debug("Entering");
  70. String[] pathInfo = StringUtils.split(areq.getPathInfo(),"/");
  71. try {
  72. // authenticated client posted a weblog entry
  73. String handle = pathInfo[0];
  74. Weblog website =
  75. roller.getWeblogManager().getWeblogByHandle(handle);
  76. if (website == null) {
  77. throw new AtomNotFoundException("Cannot find weblog: " + handle);
  78. }
  79. if (!RollerAtomHandler.canEdit(user, website)) {
  80. throw new AtomNotAuthorizedException("Not authorized to access website: " + handle);
  81. }
  82. RollerAtomHandler.oneSecondThrottle();
  83. // Save it and commit it
  84. WeblogEntryManager mgr = roller.getWeblogEntryManager();
  85. WeblogEntry rollerEntry = new WeblogEntry();
  86. rollerEntry.setWebsite(website);
  87. rollerEntry.setCreatorUserName(this.user.getUserName());
  88. rollerEntry.setLocale(website.getLocale());
  89. copyToRollerEntry(entry, rollerEntry);
  90. mgr.saveWeblogEntry(rollerEntry);
  91. roller.flush();
  92. CacheManager.invalidate(website);
  93. if (rollerEntry.isPublished()) {
  94. roller.getIndexManager().addEntryReIndexOperation(rollerEntry);
  95. }
  96. rollerEntry = mgr.getWeblogEntry(rollerEntry.getId());
  97. Entry newEntry = createAtomEntry(rollerEntry);
  98. for (Iterator it = newEntry.getOtherLinks().iterator(); it.hasNext();) {
  99. Link link = (Link)it.next();
  100. if ("edit".equals(link.getRel())) {
  101. log.debug("Exiting");
  102. return createAtomEntry(rollerEntry);
  103. }
  104. }
  105. log.error("ERROR: no edit link found in saved media entry");
  106. log.debug("Exiting via exception");
  107. } catch (WebloggerException re) {
  108. throw new AtomException("Posting entry", re);
  109. }
  110. throw new AtomException("Posting entry");
  111. }
  112. public Entry getEntry(AtomRequest areq) throws AtomException {
  113. try {
  114. String entryid = Utilities.stringToStringArray(areq.getPathInfo(),"/")[2];
  115. WeblogEntry entry = roller.getWeblogEntryManager().getWeblogEntry(entryid);
  116. if (entry == null) {
  117. throw new AtomNotFoundException("Cannot find specified entry/resource");
  118. }
  119. if (!RollerAtomHandler.canView(user, entry)) {
  120. throw new AtomNotAuthorizedException("Not authorized to view entry");
  121. } else {
  122. return createAtomEntry(entry);
  123. }
  124. } catch (WebloggerException ex) {
  125. throw new AtomException("ERROR fetching entry", ex);
  126. }
  127. }
  128. public Feed getCollection(AtomRequest areq) throws AtomException {
  129. log.debug("Entering");
  130. String[] pathInfo = StringUtils.split(areq.getPathInfo(),"/");
  131. try {
  132. int start = 0;
  133. int max = maxEntries;
  134. if (pathInfo.length > 2) {
  135. try {
  136. String s = pathInfo[2].trim();
  137. start = Integer.parseInt(s);
  138. } catch (Throwable t) {
  139. log.warn("Unparsable range: " + pathInfo[2]);
  140. }
  141. }
  142. String handle = pathInfo[0];
  143. String absUrl = WebloggerRuntimeConfig.getAbsoluteContextURL();
  144. Weblog website = roller.getWeblogManager().getWeblogByHandle(handle);
  145. if (website == null) {
  146. throw new AtomNotFoundException("Cannot find specified weblog");
  147. }
  148. if (!RollerAtomHandler.canView(user, website)) {
  149. throw new AtomNotAuthorizedException("Not authorized to access website: " + handle);
  150. }
  151. List entries = roller.getWeblogEntryManager().getWeblogEntries(
  152. website, // website
  153. null, // user
  154. null, // startDate
  155. null, // endDate
  156. null, // catName
  157. null, // tags
  158. null, // status
  159. null, // text
  160. "updateTime", // sortby
  161. null,
  162. null, // locale
  163. start, // offset (for range paging)
  164. max + 1); // maxEntries
  165. Feed feed = new Feed();
  166. feed.setId(atomURL
  167. +"/"+website.getHandle() + "/entries/" + start);
  168. feed.setTitle(website.getName());
  169. Link link = new Link();
  170. link.setHref(absUrl + "/" + website.getHandle());
  171. link.setRel("alternate");
  172. link.setType("text/html");
  173. feed.setAlternateLinks(Collections.singletonList(link));
  174. List atomEntries = new ArrayList();
  175. int count = 0;
  176. for (Iterator iter = entries.iterator(); iter.hasNext() && count < maxEntries; count++) {
  177. WeblogEntry rollerEntry = (WeblogEntry)iter.next();
  178. Entry entry = createAtomEntry(rollerEntry);
  179. atomEntries.add(entry);
  180. if (count == 0) {
  181. // first entry is most recent
  182. feed.setUpdated(entry.getUpdated());
  183. }
  184. }
  185. List links = new ArrayList();
  186. if (entries.size() > max) { // add next link
  187. int nextOffset = start + max;
  188. String url = atomURL+"/"
  189. + website.getHandle() + "/entries/" + nextOffset;
  190. Link nextLink = new Link();
  191. nextLink.setRel("next");
  192. nextLink.setHref(url);
  193. links.add(nextLink);
  194. }
  195. if (start > 0) { // add previous link
  196. int prevOffset = start > max ? start - max : 0;
  197. String url = atomURL+"/"
  198. +website.getHandle() + "/entries/" + prevOffset;
  199. Link prevLink = new Link();
  200. prevLink.setRel("previous");
  201. prevLink.setHref(url);
  202. links.add(prevLink);
  203. }
  204. if (links.size() > 0) feed.setOtherLinks(links);
  205. // Use collection URI as id
  206. feed.setEntries(atomEntries);
  207. log.debug("Exiting");
  208. return feed;
  209. } catch (WebloggerException re) {
  210. throw new AtomException("Getting entry collection");
  211. }
  212. }
  213. public void putEntry(AtomRequest areq, Entry entry) throws AtomException {
  214. log.debug("Entering");
  215. String[] pathInfo = StringUtils.split(areq.getPathInfo(),"/");
  216. try {
  217. if (pathInfo.length == 3) // URI is /blogname/entries/entryid
  218. {
  219. WeblogEntry rollerEntry =
  220. roller.getWeblogEntryManager().getWeblogEntry(pathInfo[2]);
  221. if (rollerEntry == null) {
  222. throw new AtomNotFoundException(
  223. "Cannot find specified entry/resource");
  224. }
  225. if (RollerAtomHandler.canEdit(user, rollerEntry)) {
  226. RollerAtomHandler.oneSecondThrottle();
  227. WeblogEntryManager mgr = roller.getWeblogEntryManager();
  228. copyToRollerEntry(entry, rollerEntry);
  229. rollerEntry.setUpdateTime(new Timestamp(new Date().getTime()));
  230. mgr.saveWeblogEntry(rollerEntry);
  231. roller.flush();
  232. CacheManager.invalidate(rollerEntry.getWebsite());
  233. if (rollerEntry.isPublished()) {
  234. roller.getIndexManager().addEntryReIndexOperation(rollerEntry);
  235. }
  236. log.debug("Exiting");
  237. return;
  238. }
  239. throw new AtomNotAuthorizedException("ERROR not authorized to update entry");
  240. }
  241. throw new AtomNotFoundException("Cannot find specified entry/resource");
  242. } catch (WebloggerException re) {
  243. throw new AtomException("Updating entry");
  244. }
  245. }
  246. public void deleteEntry(AtomRequest areq) throws AtomException {
  247. try {
  248. String[] pathInfo = StringUtils.split(areq.getPathInfo(), "/");
  249. WeblogEntry rollerEntry = roller.getWeblogEntryManager().getWeblogEntry(pathInfo[2]);
  250. if (rollerEntry == null) {
  251. throw new AtomNotFoundException("cannot find specified entry/resource");
  252. }
  253. if (RollerAtomHandler.canEdit(user, rollerEntry)) {
  254. WeblogEntryManager mgr = roller.getWeblogEntryManager();
  255. CacheManager.invalidate(rollerEntry.getWebsite());
  256. reindexEntry(rollerEntry);
  257. mgr.removeWeblogEntry(rollerEntry);
  258. log.debug("Deleted entry:" + rollerEntry.getAnchor());
  259. roller.flush();
  260. return;
  261. }
  262. log.debug("Not authorized to delete entry");
  263. log.debug("Exiting via exception");
  264. } catch (WebloggerException ex) {
  265. throw new AtomException("ERROR deleting entry",ex);
  266. }
  267. throw new AtomNotAuthorizedException("Not authorized to delete entry");
  268. }
  269. /**
  270. * Create a Rome Atom entry based on a Weblogger entry.
  271. * Content is escaped.
  272. * Link is stored as rel=alternate link.
  273. */
  274. private Entry createAtomEntry(WeblogEntry entry) {
  275. Entry atomEntry = new Entry();
  276. String absUrl = WebloggerRuntimeConfig.getAbsoluteContextURL();
  277. atomEntry.setId( entry.getPermalink());
  278. atomEntry.setTitle( entry.getTitle());
  279. atomEntry.setPublished( entry.getPubTime());
  280. atomEntry.setUpdated( entry.getUpdateTime());
  281. Content content = new Content();
  282. content.setType(Content.HTML);
  283. content.setValue(entry.getText());
  284. List contents = new ArrayList();
  285. contents.add(content);
  286. atomEntry.setContents(contents);
  287. if (StringUtils.isNotEmpty(entry.getSummary())) {
  288. Content summary = new Content();
  289. summary.setType(Content.HTML);
  290. summary.setValue(entry.getSummary());
  291. atomEntry.setSummary(summary);
  292. }
  293. User creator = entry.getCreator();
  294. Person author = new Person();
  295. author.setName( creator.getUserName());
  296. author.setEmail( creator.getEmailAddress());
  297. atomEntry.setAuthors( Collections.singletonList(author));
  298. // Add Atom category for Weblogger category, using category scheme
  299. List categories = new ArrayList();
  300. Category atomCat = new Category();
  301. atomCat.setScheme(RollerAtomService.getWeblogCategoryScheme(entry.getWebsite()));
  302. atomCat.setTerm(entry.getCategory().getPath().substring(1));
  303. categories.add(atomCat);
  304. // Add Atom categories for each Weblogger tag with null scheme
  305. for (Iterator tagit = entry.getTags().iterator(); tagit.hasNext();) {
  306. WeblogEntryTag tag = (WeblogEntryTag) tagit.next();
  307. Category newcat = new Category();
  308. newcat.setTerm(tag.getName());
  309. categories.add(newcat);
  310. }
  311. atomEntry.setCategories(categories);
  312. Link altlink = new Link();
  313. altlink.setRel("alternate");
  314. altlink.setHref(entry.getPermalink());
  315. List altlinks = new ArrayList();
  316. altlinks.add(altlink);
  317. atomEntry.setAlternateLinks(altlinks);
  318. Link editlink = new Link();
  319. editlink.setRel("edit");
  320. editlink.setHref(
  321. atomURL
  322. +"/"+entry.getWebsite().getHandle() + "/entry/" + entry.getId());
  323. List otherlinks = new ArrayList();
  324. otherlinks.add(editlink);
  325. atomEntry.setOtherLinks(otherlinks);
  326. List modules = new ArrayList();
  327. AppModule app = new AppModuleImpl();
  328. app.setDraft(!WeblogEntry.PUBLISHED.equals(entry.getStatus()));
  329. app.setEdited(entry.getUpdateTime());
  330. modules.add(app);
  331. atomEntry.setModules(modules);
  332. return atomEntry;
  333. }
  334. /**
  335. * Copy fields from ROME entry to Weblogger entry.
  336. */
  337. private void copyToRollerEntry(Entry entry, WeblogEntry rollerEntry) throws WebloggerException {
  338. Timestamp current = new Timestamp(System.currentTimeMillis());
  339. Timestamp pubTime = current;
  340. Timestamp updateTime = current;
  341. if (entry.getPublished() != null) {
  342. pubTime = new Timestamp( entry.getPublished().getTime() );
  343. }
  344. if (entry.getUpdated() != null) {
  345. updateTime = new Timestamp( entry.getUpdated().getTime() );
  346. }
  347. rollerEntry.setTitle(entry.getTitle());
  348. if (entry.getContents() != null && entry.getContents().size() > 0) {
  349. Content content = (Content)entry.getContents().get(0);
  350. rollerEntry.setText(content.getValue());
  351. }
  352. if (entry.getSummary() != null) {
  353. rollerEntry.setSummary(entry.getSummary().getValue());
  354. }
  355. rollerEntry.setPubTime(pubTime);
  356. rollerEntry.setUpdateTime(updateTime);
  357. AppModule control =
  358. (AppModule)entry.getModule(AppModule.URI);
  359. if (control!=null && control.getDraft()) {
  360. rollerEntry.setStatus(WeblogEntry.DRAFT);
  361. } else {
  362. rollerEntry.setStatus(WeblogEntry.PUBLISHED);
  363. }
  364. // Process incoming categories:
  365. // Atom categories with weblog-level scheme are Weblogger categories.
  366. // Atom supports multiple cats, but Weblogger supports one/entry
  367. // so here we take accept the first category that exists.
  368. List categories = entry.getCategories();
  369. if (categories != null && categories.size() > 0) {
  370. for (int i=0; i<categories.size(); i++) {
  371. Category cat = (Category)categories.get(i);
  372. if (cat.getScheme() != null && cat.getScheme().equals(
  373. RollerAtomService.getWeblogCategoryScheme(rollerEntry.getWebsite()))) {
  374. String catString = cat.getTerm();
  375. if (catString != null) {
  376. WeblogCategory rollerCat =
  377. roller.getWeblogEntryManager().getWeblogCategoryByPath(
  378. rollerEntry.getWebsite(), catString);
  379. if (rollerCat != null) {
  380. // Found a valid category, so break out
  381. rollerEntry.setCategory(rollerCat);
  382. break;
  383. }
  384. }
  385. }
  386. }
  387. }
  388. if (rollerEntry.getCategory() == null) {
  389. // Didn't find a category? Fall back to the default Blogger API category.
  390. rollerEntry.setCategory(rollerEntry.getWebsite().getBloggerCategory());
  391. }
  392. // Now process incoming categories that are tags:
  393. // Atom categories with no scheme are considered tags.
  394. String tags = "";
  395. if (categories != null && categories.size() > 0) {
  396. for (int i=0; i<categories.size(); i++) {
  397. Category cat = (Category)categories.get(i);
  398. if (cat.getScheme() == null) {
  399. tags = tags + " " + cat.getTerm();
  400. }
  401. }
  402. }
  403. rollerEntry.setTagsAsString(tags);
  404. }
  405. private void reindexEntry(WeblogEntry entry) throws WebloggerException {
  406. IndexManager manager = roller.getIndexManager();
  407. // TODO: figure out what's up here and at WeblogEntryFormAction line 696
  408. //manager.removeEntryIndexOperation(entry);
  409. // if published, index the entry
  410. if (entry.isPublished()) {
  411. manager.addEntryReIndexOperation(entry);
  412. }
  413. }
  414. }