diff --git a/briar-api/src/org/briarproject/api/feed/Feed.java b/briar-api/src/org/briarproject/api/feed/Feed.java index 0f6af8a2d1a36b1e8ad64f148018040472ca67ef..7b394866989253bddaf2412359ce96330a4a489a 100644 --- a/briar-api/src/org/briarproject/api/feed/Feed.java +++ b/briar-api/src/org/briarproject/api/feed/Feed.java @@ -10,6 +10,7 @@ import static org.briarproject.api.feed.FeedConstants.KEY_BLOG_GROUP_ID; import static org.briarproject.api.feed.FeedConstants.KEY_FEED_ADDED; import static org.briarproject.api.feed.FeedConstants.KEY_FEED_AUTHOR; import static org.briarproject.api.feed.FeedConstants.KEY_FEED_DESC; +import static org.briarproject.api.feed.FeedConstants.KEY_FEED_LAST_ENTRY; import static org.briarproject.api.feed.FeedConstants.KEY_FEED_TITLE; import static org.briarproject.api.feed.FeedConstants.KEY_FEED_UPDATED; import static org.briarproject.api.feed.FeedConstants.KEY_FEED_URL; @@ -19,11 +20,11 @@ public class Feed { final private String url; final private GroupId blogId; final private String title, description, author; - final private long added, updated; + final private long added, updated, lastEntryTime; public Feed(String url, GroupId blogId, @Nullable String title, @Nullable String description, @Nullable String author, - long added, long updated) { + long added, long updated, long lastEntryTime) { this.url = url; this.blogId = blogId; @@ -32,6 +33,14 @@ public class Feed { this.author = author; this.added = added; this.updated = updated; + this.lastEntryTime = lastEntryTime; + } + + public Feed(String url, GroupId blogId, @Nullable String title, + @Nullable String description, @Nullable String author, + long added) { + + this(url, blogId, title, description, author, added, 0L, 0L); } public String getUrl() { @@ -47,7 +56,8 @@ public class Feed { new BdfEntry(KEY_FEED_URL, url), new BdfEntry(KEY_BLOG_GROUP_ID, blogId.getBytes()), new BdfEntry(KEY_FEED_ADDED, added), - new BdfEntry(KEY_FEED_UPDATED, updated) + new BdfEntry(KEY_FEED_UPDATED, updated), + new BdfEntry(KEY_FEED_LAST_ENTRY, lastEntryTime) ); if (title != null) d.put(KEY_FEED_TITLE, title); if (description != null) d.put(KEY_FEED_DESC, description); @@ -63,7 +73,9 @@ public class Feed { String author = d.getOptionalString(KEY_FEED_AUTHOR); long added = d.getLong(KEY_FEED_ADDED, 0L); long updated = d.getLong(KEY_FEED_UPDATED, 0L); - return new Feed(url, blogId, title, desc, author, added, updated); + long lastEntryTime = d.getLong(KEY_FEED_LAST_ENTRY, 0L); + return new Feed(url, blogId, title, desc, author, added, updated, + lastEntryTime); } public String getTitle() { @@ -86,4 +98,8 @@ public class Feed { return updated; } + public long getLastEntryTime() { + return lastEntryTime; + } + } diff --git a/briar-api/src/org/briarproject/api/feed/FeedConstants.java b/briar-api/src/org/briarproject/api/feed/FeedConstants.java index 5a38c979f62b02535dbb77bf0002f75c6937afcb..68117a2f44bd31bd3bfff6e81341d54551161e1b 100644 --- a/briar-api/src/org/briarproject/api/feed/FeedConstants.java +++ b/briar-api/src/org/briarproject/api/feed/FeedConstants.java @@ -17,5 +17,6 @@ public interface FeedConstants { String KEY_FEED_AUTHOR = "feedAuthor"; String KEY_FEED_ADDED = "feedAdded"; String KEY_FEED_UPDATED = "feedUpdated"; + String KEY_FEED_LAST_ENTRY = "feedLastEntryTime"; } diff --git a/briar-core/src/org/briarproject/feed/FeedManagerImpl.java b/briar-core/src/org/briarproject/feed/FeedManagerImpl.java index 40a7a5a2f2ffca596019d9922e7a88b604543a96..f0ea3eed6c24e1b419448c1aa5446ff34da88d6d 100644 --- a/briar-core/src/org/briarproject/feed/FeedManagerImpl.java +++ b/briar-core/src/org/briarproject/feed/FeedManagerImpl.java @@ -1,5 +1,7 @@ package org.briarproject.feed; +import com.rometools.rome.feed.synd.SyndContent; +import com.rometools.rome.feed.synd.SyndEntry; import com.rometools.rome.feed.synd.SyndFeed; import com.rometools.rome.io.FeedException; import com.rometools.rome.io.SyndFeedInput; @@ -121,14 +123,17 @@ class FeedManagerImpl implements FeedManager, Service, Client { @Override public void addFeed(String url, GroupId g) throws DbException, IOException { + LOG.info("Adding new RSS feed..."); Feed feed; + // TODO check for existing feed? try { SyndFeed f = getSyndFeed(getFeedInputStream(url)); - String title = f.getTitle(); + String title = StringUtils.isNullOrEmpty(f.getTitle()) ? null : + f.getTitle(); String description = f.getDescription(); String author = f.getAuthor(); long added = System.currentTimeMillis(); - feed = new Feed(url, g, title, description, author, added, added); + feed = new Feed(url, g, title, description, author, added); } catch (FeedException e) { throw new IOException(e); } @@ -153,6 +158,7 @@ class FeedManagerImpl implements FeedManager, Service, Client { if (feed.getUrl().equals(url)) { found = true; feeds.remove(feed); + break; } } if (!found) throw new DbException(); @@ -217,6 +223,8 @@ class FeedManagerImpl implements FeedManager, Service, Client { } private void fetchFeeds() { + LOG.info("Updating RSS feeds..."); + // Get current feeds List<Feed> feeds; try { @@ -243,17 +251,50 @@ class FeedManagerImpl implements FeedManager, Service, Client { } private Feed fetchFeed(Feed feed) { - LOG.info("Updating RSS feeds..."); String title, description, author; long updated = System.currentTimeMillis(); + long lastEntryTime = feed.getLastEntryTime(); try { SyndFeed f = getSyndFeed(getFeedInputStream(feed.getUrl())); title = f.getTitle(); description = f.getDescription(); author = f.getAuthor(); - // TODO keep track of which entries have been seen (#485) - // TODO Pass any new entries down the pipeline to be posted (#486) + LOG.info("Title: " + f.getTitle()); + LOG.info("Description: " + f.getDescription()); + LOG.info("Author: " + f.getAuthor()); + LOG.info("Number of Entries: " + f.getEntries().size()); + LOG.info("------------------------------"); + + for (SyndEntry entry : f.getEntries()) { + LOG.info("Entry Title: " + entry.getTitle()); + LOG.info("Entry Author: " + entry.getAuthor()); + LOG.info("Entry Published Date: " + entry.getPublishedDate()); + LOG.info("Entry Updated Date: " + entry.getUpdatedDate()); + LOG.info("Entry Link: " + entry.getLink()); + LOG.info("Entry URI: " + entry.getUri()); + //LOG.info("Entry Description: " + entry.getDescription()); + long entryTime; + if (entry.getPublishedDate() != null) { + entryTime = entry.getPublishedDate().getTime(); + } else if (entry.getUpdatedDate() != null) { + entryTime = entry.getUpdatedDate().getTime(); + } else { + // no time information available, ignore this entry + if (LOG.isLoggable(WARNING)) + LOG.warning("Entry has no date: " + entry.getTitle()); + continue; + } + if (entryTime > feed.getLastEntryTime()) { + LOG.info("Adding new entry..."); + // TODO Pass any new entries down the pipeline to be posted (#486) + for (SyndContent content : entry.getContents()) { + LOG.info("Content: " + content.getValue()); + } + if (entryTime > lastEntryTime) lastEntryTime = entryTime; + } + LOG.info("------------------------------"); + } } catch (FeedException e) { if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); @@ -264,7 +305,7 @@ class FeedManagerImpl implements FeedManager, Service, Client { return feed; } return new Feed(feed.getUrl(), feed.getBlogId(), title, description, - author, feed.getAdded(), updated); + author, feed.getAdded(), updated, lastEntryTime); } private InputStream getFeedInputStream(String url) throws IOException {