package org.springmodules.feedxt.domain; import com.sun.syndication.feed.synd.SyndContent; import com.sun.syndication.feed.synd.SyndEntry; import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.io.FeedException; import com.sun.syndication.io.SyndFeedInput; import java.io.IOException; import java.io.InputStream; import java.io.StringReader; import java.io.StringWriter; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.log4j.Logger; import org.jdom.Document; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; import org.jdom.output.DOMOutputter; import org.jdom.output.XMLOutputter; import org.springmodules.feedxt.domain.support.CannotAccessFeedException; /** * {@link FeedSubscription} implementation. * * @author Sergio Bossa */ public class FeedSubscriptionImpl implements FeedSubscription { private static final Logger logger = Logger.getLogger(FeedSubscriptionImpl.class); private String name; private URL url; private Date lastAccess; public FeedSubscriptionImpl(String name, String url) throws MalformedURLException { this.name = name; this.url = new URL(url); } protected FeedSubscriptionImpl() {} public String getName() { return this.name; } public URL getUrl() { return this.url; } public Feed getFeed() throws CannotAccessFeedException { try { InputStream feedStream = this.url.openStream(); SAXBuilder builder = new SAXBuilder(); Document feedDocument = builder.build(feedStream); if (logger.isDebugEnabled()) { XMLOutputter logOutputter = new XMLOutputter(); StringWriter writer = new StringWriter(); logOutputter.output(feedDocument, writer); writer.flush(); writer.close(); logger.debug(writer.toString()); } DOMOutputter outputter = new DOMOutputter(); SyndFeedInput input = new SyndFeedInput(); SyndFeed romeFeed = input.build(outputter.output(feedDocument)); Feed feed = this.makeFeed(romeFeed); this.lastAccess = new Date(); return feed; } catch (IllegalArgumentException ex) { throw new CannotAccessFeedException("Unable to access feed at: " + this.url, ex); } catch (IOException ex) { throw new CannotAccessFeedException("Unable to access feed at: " + this.url, ex); } catch (FeedException ex) { throw new CannotAccessFeedException("Unable to access feed at: " + this.url, ex); } catch (JDOMException ex) { throw new CannotAccessFeedException("Unable to access feed at: " + this.url, ex); } } public Date getLastAccess() { return new Date(this.lastAccess.getTime()); } public boolean equals(Object obj) { if (obj == null) { return false; } else if (!(obj instanceof FeedSubscriptionImpl)) { return false; } else { FeedSubscriptionImpl other = (FeedSubscriptionImpl) obj; return new EqualsBuilder() .append(this.name, other.name) .isEquals(); } } public int hashCode() { return new HashCodeBuilder() .append(this.name) .toHashCode(); } public String toString() { return new StringBuilder(this.name).append("@").append(this.url).toString(); } private Feed makeFeed(SyndFeed romeFeed) { String title = romeFeed.getTitle(); String author = romeFeed.getAuthor(); Date publishedDate = romeFeed.getPublishedDate(); List<SyndEntry> romeEntries = romeFeed.getEntries(); List<Entry> entries = new ArrayList<Entry>(romeEntries.size()); for (SyndEntry current : romeEntries) { Entry entry = this.makeEntry(current); entries.add(entry); } return new Feed(title, author, publishedDate, entries); } private Entry makeEntry(SyndEntry romeEntry) { String title = romeEntry.getTitle(); Date publishedDate = romeEntry.getPublishedDate(); Date updatedDate = romeEntry.getUpdatedDate(); String link = romeEntry.getLink(); List<SyndContent> contents = romeEntry.getContents(); List<String> values = new ArrayList<String>(contents.size()); for (SyndContent current : contents) { String value = new StringBuilder("<div>").append(current.getValue()).append("</div>").toString(); SAXBuilder builder = new SAXBuilder(); try { Document entryTest = builder.build(new StringReader(value)); } catch (Exception ex) { logger.warn(ex.getMessage()); value = null; } values.add(value); } return new Entry(title, publishedDate, updatedDate, link, values); } }