diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/FeedFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/FeedFragment.java index 82a4320918fa1e80ce1bc2c80742b71ec4322b96..c7a64659a68367487f6f630bce75e24b34e28f8b 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/blog/FeedFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/FeedFragment.java @@ -179,7 +179,6 @@ public class FeedFragment extends BaseFragment implements case R.id.action_rss_feeds_import: Intent i2 = new Intent(getActivity(), RssFeedImportActivity.class); - i2.putExtra(GROUP_ID, personalBlog.getId().getBytes()); startActivity(i2); return true; case R.id.action_rss_feeds_manage: diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/RssFeedImportActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/RssFeedImportActivity.java index 7e2085818265acdf4dd09b2d556e726828438f3b..1d09ad2c428def1e37980d472cc8c587330bfd36 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/blog/RssFeedImportActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/RssFeedImportActivity.java @@ -1,7 +1,6 @@ package org.briarproject.briar.android.blog; import android.content.DialogInterface; -import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.text.Editable; @@ -15,7 +14,6 @@ import android.widget.ProgressBar; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.lifecycle.IoExecutor; -import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.briar.R; import org.briarproject.briar.android.activity.ActivityComponent; import org.briarproject.briar.android.activity.BriarActivity; @@ -44,9 +42,6 @@ public class RssFeedImportActivity extends BriarActivity { @IoExecutor Executor ioExecutor; - // Fields that are accessed from background threads must be volatile - private volatile GroupId groupId = null; - @Inject @SuppressWarnings("WeakerAccess") volatile FeedManager feedManager; @@ -55,12 +50,6 @@ public class RssFeedImportActivity extends BriarActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - // GroupId from Intent - Intent i = getIntent(); - byte[] b = i.getByteArrayExtra(GROUP_ID); - if (b == null) throw new IllegalStateException("No Group in intent."); - groupId = new GroupId(b); - setContentView(R.layout.activity_rss_feed_import); urlInput = (EditText) findViewById(R.id.urlInput); @@ -128,7 +117,7 @@ public class RssFeedImportActivity extends BriarActivity { @Override public void run() { try { - feedManager.addFeed(url, groupId); + feedManager.addFeed(url); feedImported(); } catch (DbException | IOException e) { if (LOG.isLoggable(WARNING)) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/RssFeedManageActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/RssFeedManageActivity.java index 10e37d6f27d204d2756fd7438a854f7c4e033f7a..8e60677299498170a6da23c93be30f0042ce5547 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/blog/RssFeedManageActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/RssFeedManageActivity.java @@ -87,7 +87,6 @@ public class RssFeedManageActivity extends BriarActivity return true; case R.id.action_rss_feeds_import: Intent i = new Intent(this, RssFeedImportActivity.class); - i.putExtra(GROUP_ID, groupId.getBytes()); startActivity(i); return true; default: diff --git a/briar-api/src/main/java/org/briarproject/briar/api/feed/Feed.java b/briar-api/src/main/java/org/briarproject/briar/api/feed/Feed.java index b36a8a70b113a395aa58f213e3214b840c194a7c..51f53f10cde72093129db6cf37bbd1a8b61eb4fe 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/feed/Feed.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/feed/Feed.java @@ -1,39 +1,32 @@ package org.briarproject.briar.api.feed; -import org.briarproject.bramble.api.FormatException; -import org.briarproject.bramble.api.data.BdfDictionary; -import org.briarproject.bramble.api.data.BdfEntry; +import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.GroupId; +import org.briarproject.briar.api.blog.Blog; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; -import static org.briarproject.briar.api.feed.FeedConstants.KEY_BLOG_GROUP_ID; -import static org.briarproject.briar.api.feed.FeedConstants.KEY_FEED_ADDED; -import static org.briarproject.briar.api.feed.FeedConstants.KEY_FEED_AUTHOR; -import static org.briarproject.briar.api.feed.FeedConstants.KEY_FEED_DESC; -import static org.briarproject.briar.api.feed.FeedConstants.KEY_FEED_LAST_ENTRY; -import static org.briarproject.briar.api.feed.FeedConstants.KEY_FEED_TITLE; -import static org.briarproject.briar.api.feed.FeedConstants.KEY_FEED_UPDATED; -import static org.briarproject.briar.api.feed.FeedConstants.KEY_FEED_URL; - @Immutable @NotNullByDefault public class Feed { private final String url; - private final GroupId blogId; + private final Blog blog; + private final LocalAuthor localAuthor; @Nullable private final String title, description, author; private final long added, updated, lastEntryTime; - public Feed(String url, GroupId blogId, @Nullable String title, - @Nullable String description, @Nullable String author, - long added, long updated, long lastEntryTime) { + public Feed(String url, Blog blog, LocalAuthor localAuthor, + @Nullable String title, @Nullable String description, + @Nullable String author, long added, long updated, + long lastEntryTime) { this.url = url; - this.blogId = blogId; + this.blog = blog; + this.localAuthor = localAuthor; this.title = title; this.description = description; this.author = author; @@ -42,13 +35,14 @@ public class Feed { 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 Feed(String url, Blog blog, LocalAuthor localAuthor, + @Nullable String title, @Nullable String description, + @Nullable String author, long added) { + this(url, blog, localAuthor, title, description, author, added, 0L, 0L); } - public Feed(String url, GroupId blogId, long added) { - this(url, blogId, null, null, null, added, 0L, 0L); + public Feed(String url, Blog blog, LocalAuthor localAuthor, long added) { + this(url, blog, localAuthor, null, null, null, added, 0L, 0L); } public String getUrl() { @@ -56,34 +50,15 @@ public class Feed { } public GroupId getBlogId() { - return blogId; + return blog.getId(); } - public BdfDictionary toBdfDictionary() { - BdfDictionary d = BdfDictionary.of( - 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_LAST_ENTRY, lastEntryTime) - ); - if (title != null) d.put(KEY_FEED_TITLE, title); - if (description != null) d.put(KEY_FEED_DESC, description); - if (author != null) d.put(KEY_FEED_AUTHOR, author); - return d; + public Blog getBlog() { + return blog; } - public static Feed from(BdfDictionary d) throws FormatException { - String url = d.getString(KEY_FEED_URL); - GroupId blogId = new GroupId(d.getRaw(KEY_BLOG_GROUP_ID)); - String title = d.getOptionalString(KEY_FEED_TITLE); - String desc = d.getOptionalString(KEY_FEED_DESC); - String author = d.getOptionalString(KEY_FEED_AUTHOR); - long added = d.getLong(KEY_FEED_ADDED, 0L); - long updated = d.getLong(KEY_FEED_UPDATED, 0L); - long lastEntryTime = d.getLong(KEY_FEED_LAST_ENTRY, 0L); - return new Feed(url, blogId, title, desc, author, added, updated, - lastEntryTime); + public LocalAuthor getLocalAuthor() { + return localAuthor; } @Nullable @@ -118,13 +93,13 @@ public class Feed { if (this == o) return true; if (o instanceof Feed) { Feed f = (Feed) o; - return url.equals(f.url) && blogId.equals(f.getBlogId()) && - equalsWithNull(title, f.getTitle()) && - equalsWithNull(description, f.getDescription()) && - equalsWithNull(author, f.getAuthor()) && - added == f.getAdded() && - updated == f.getUpdated() && - lastEntryTime == f.getLastEntryTime(); + return url.equals(f.url) && blog.equals(f.blog) && + equalsWithNull(title, f.title) && + equalsWithNull(description, f.description) && + equalsWithNull(author, f.author) && + added == f.added && + updated == f.updated && + lastEntryTime == f.lastEntryTime; } return false; } @@ -134,4 +109,5 @@ public class Feed { if (a == null || b == null) return false; return a.equals(b); } + } diff --git a/briar-api/src/main/java/org/briarproject/briar/api/feed/FeedConstants.java b/briar-api/src/main/java/org/briarproject/briar/api/feed/FeedConstants.java index 8be05d5681fb7b1db2c26d71a484b4d5d69f2515..9dc944585bd9878b88ec188b2485293d3728a327 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/feed/FeedConstants.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/feed/FeedConstants.java @@ -18,7 +18,9 @@ public interface FeedConstants { // group metadata keys String KEY_FEEDS = "feeds"; String KEY_FEED_URL = "feedURL"; - String KEY_BLOG_GROUP_ID = "blogGroupId"; + String KEY_BLOG_TITLE = "blogTitle"; + String KEY_PUBLIC_KEY = "publicKey"; + String KEY_PRIVATE_KEY = "privateKey"; String KEY_FEED_TITLE = "feedTitle"; String KEY_FEED_DESC = "feedDesc"; String KEY_FEED_AUTHOR = "feedAuthor"; diff --git a/briar-api/src/main/java/org/briarproject/briar/api/feed/FeedManager.java b/briar-api/src/main/java/org/briarproject/briar/api/feed/FeedManager.java index 5d31b448a04295a369317b3601af005132dce707..74a762eaf96bc9cdb75aaaa5314d39bffee5b934 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/feed/FeedManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/feed/FeedManager.java @@ -3,7 +3,6 @@ package org.briarproject.briar.api.feed; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.ClientId; -import org.briarproject.bramble.api.sync.GroupId; import java.io.IOException; import java.util.List; @@ -17,9 +16,9 @@ public interface FeedManager { ClientId CLIENT_ID = new ClientId("org.briarproject.briar.feed"); /** - * Adds an RSS feed. + * Adds an RSS feed as a new dedicated blog. */ - void addFeed(String url, GroupId g) throws DbException, IOException; + void addFeed(String url) throws DbException, IOException; /** * Removes an RSS feed. diff --git a/briar-core/src/main/java/org/briarproject/briar/feed/FeedFactory.java b/briar-core/src/main/java/org/briarproject/briar/feed/FeedFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..192c4855eb47eccc8c21ae0275a4f94ca27cc6ea --- /dev/null +++ b/briar-core/src/main/java/org/briarproject/briar/feed/FeedFactory.java @@ -0,0 +1,34 @@ +package org.briarproject.briar.feed; + +import com.rometools.rome.feed.synd.SyndFeed; + +import org.briarproject.bramble.api.FormatException; +import org.briarproject.bramble.api.data.BdfDictionary; +import org.briarproject.briar.api.feed.Feed; + +interface FeedFactory { + + /** + * Create a new feed based on the feed url + * and the metadata of an existing {@link SyndFeed}. + */ + Feed createFeed(String url, SyndFeed feed); + + /** + * Creates a new updated feed, based on the given existing feed, + * new metadata from the given {@link SyndFeed} + * and the time of the last feed entry. + */ + Feed createFeed(Feed feed, SyndFeed f, long lastEntryTime); + + /** + * De-serializes a {@link BdfDictionary} into a {@link Feed}. + */ + Feed createFeed(BdfDictionary d) throws FormatException; + + /** + * Serializes a {@link Feed} into a {@link BdfDictionary}. + */ + BdfDictionary feedToBdfDictionary(Feed feed); + +} diff --git a/briar-core/src/main/java/org/briarproject/briar/feed/FeedFactoryImpl.java b/briar-core/src/main/java/org/briarproject/briar/feed/FeedFactoryImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..531f169ef57691c00312ea0e1d6e19b4f14df59c --- /dev/null +++ b/briar-core/src/main/java/org/briarproject/briar/feed/FeedFactoryImpl.java @@ -0,0 +1,111 @@ +package org.briarproject.briar.feed; + +import com.rometools.rome.feed.synd.SyndFeed; + +import org.briarproject.bramble.api.FormatException; +import org.briarproject.bramble.api.crypto.CryptoComponent; +import org.briarproject.bramble.api.crypto.KeyPair; +import org.briarproject.bramble.api.data.BdfDictionary; +import org.briarproject.bramble.api.data.BdfEntry; +import org.briarproject.bramble.api.identity.AuthorFactory; +import org.briarproject.bramble.api.identity.LocalAuthor; +import org.briarproject.bramble.api.system.Clock; +import org.briarproject.briar.api.blog.Blog; +import org.briarproject.briar.api.blog.BlogFactory; +import org.briarproject.briar.api.feed.Feed; + +import javax.inject.Inject; + +import static org.briarproject.briar.api.feed.FeedConstants.KEY_BLOG_TITLE; +import static org.briarproject.briar.api.feed.FeedConstants.KEY_FEED_ADDED; +import static org.briarproject.briar.api.feed.FeedConstants.KEY_FEED_AUTHOR; +import static org.briarproject.briar.api.feed.FeedConstants.KEY_FEED_DESC; +import static org.briarproject.briar.api.feed.FeedConstants.KEY_FEED_LAST_ENTRY; +import static org.briarproject.briar.api.feed.FeedConstants.KEY_FEED_TITLE; +import static org.briarproject.briar.api.feed.FeedConstants.KEY_FEED_UPDATED; +import static org.briarproject.briar.api.feed.FeedConstants.KEY_FEED_URL; +import static org.briarproject.briar.api.feed.FeedConstants.KEY_PRIVATE_KEY; +import static org.briarproject.briar.api.feed.FeedConstants.KEY_PUBLIC_KEY; + +class FeedFactoryImpl implements FeedFactory { + + private final CryptoComponent cryptoComponent; + private final AuthorFactory authorFactory; + private final BlogFactory blogFactory; + private final Clock clock; + + @Inject + FeedFactoryImpl(CryptoComponent cryptoComponent, + AuthorFactory authorFactory, BlogFactory blogFactory, Clock clock) { + this.cryptoComponent = cryptoComponent; + this.authorFactory = authorFactory; + this.blogFactory = blogFactory; + this.clock = clock; + } + + @Override + public Feed createFeed(String url, SyndFeed syndFeed) { + if (syndFeed.getTitle() == null) syndFeed.setTitle("RSS feed"); + + KeyPair keyPair = cryptoComponent.generateSignatureKeyPair(); + LocalAuthor localAuthor = authorFactory + .createLocalAuthor(syndFeed.getTitle(), + keyPair.getPublic().getEncoded(), + keyPair.getPrivate().getEncoded()); + Blog blog = blogFactory.createBlog(localAuthor); + long added = clock.currentTimeMillis(); + + return new Feed(url, blog, localAuthor, added); + } + + @Override + public Feed createFeed(Feed feed, SyndFeed f, long lastEntryTime) { + long updated = clock.currentTimeMillis(); + return new Feed(feed.getUrl(), feed.getBlog(), feed.getLocalAuthor(), + f.getTitle(), f.getDescription(), f.getAuthor(), + feed.getAdded(), updated, lastEntryTime); + } + + @Override + public Feed createFeed(BdfDictionary d) throws FormatException { + String url = d.getString(KEY_FEED_URL); + + String blogTitle = d.getString(KEY_BLOG_TITLE); + byte[] publicKey = d.getRaw(KEY_PUBLIC_KEY); + byte[] privateKey = d.getRaw(KEY_PRIVATE_KEY); + LocalAuthor localAuthor = authorFactory + .createLocalAuthor(blogTitle, publicKey, privateKey); + Blog blog = blogFactory.createBlog(localAuthor); + + String title = d.getOptionalString(KEY_FEED_TITLE); + String desc = d.getOptionalString(KEY_FEED_DESC); + String author = d.getOptionalString(KEY_FEED_AUTHOR); + long added = d.getLong(KEY_FEED_ADDED, 0L); + long updated = d.getLong(KEY_FEED_UPDATED, 0L); + long lastEntryTime = d.getLong(KEY_FEED_LAST_ENTRY, 0L); + + return new Feed(url, blog, localAuthor, title, desc, author, added, + updated, lastEntryTime); + } + + @Override + public BdfDictionary feedToBdfDictionary(Feed feed) { + BdfDictionary d = BdfDictionary.of( + new BdfEntry(KEY_FEED_URL, feed.getUrl()), + new BdfEntry(KEY_BLOG_TITLE, feed.getLocalAuthor().getName()), + new BdfEntry(KEY_PUBLIC_KEY, + feed.getLocalAuthor().getPublicKey()), + new BdfEntry(KEY_PRIVATE_KEY, + feed.getLocalAuthor().getPrivateKey()), + new BdfEntry(KEY_FEED_ADDED, feed.getAdded()), + new BdfEntry(KEY_FEED_UPDATED, feed.getUpdated()), + new BdfEntry(KEY_FEED_LAST_ENTRY, feed.getLastEntryTime()) + ); + if (feed.getTitle() != null) d.put(KEY_FEED_TITLE, feed.getTitle()); + if (feed.getDescription() != null) + d.put(KEY_FEED_DESC, feed.getDescription()); + if (feed.getAuthor() != null) d.put(KEY_FEED_AUTHOR, feed.getAuthor()); + return d; + } + +} diff --git a/briar-core/src/main/java/org/briarproject/briar/feed/FeedManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/feed/FeedManagerImpl.java index d92df5001d023cdd18777d355fffb687dc2ff90b..8168d58b19228ac048793a5aa8841e92afa66ef5 100644 --- a/briar-core/src/main/java/org/briarproject/briar/feed/FeedManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/feed/FeedManagerImpl.java @@ -18,7 +18,6 @@ import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.EventListener; -import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.lifecycle.IoExecutor; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; @@ -88,9 +87,9 @@ class FeedManagerImpl implements FeedManager, Client, EventListener { private final DatabaseComponent db; private final ContactGroupFactory contactGroupFactory; private final ClientHelper clientHelper; - private final IdentityManager identityManager; private final BlogManager blogManager; private final BlogPostFactory blogPostFactory; + private final FeedFactory feedFactory; private final SocketFactory torSocketFactory; private final Clock clock; private final AtomicBoolean fetcherStarted = new AtomicBoolean(false); @@ -99,8 +98,8 @@ class FeedManagerImpl implements FeedManager, Client, EventListener { FeedManagerImpl(@Scheduler ScheduledExecutorService scheduler, @IoExecutor Executor ioExecutor, DatabaseComponent db, ContactGroupFactory contactGroupFactory, ClientHelper clientHelper, - IdentityManager identityManager, BlogManager blogManager, - BlogPostFactory blogPostFactory, SocketFactory torSocketFactory, + BlogManager blogManager, BlogPostFactory blogPostFactory, + FeedFactory feedFactory, SocketFactory torSocketFactory, Clock clock) { this.scheduler = scheduler; @@ -108,9 +107,9 @@ class FeedManagerImpl implements FeedManager, Client, EventListener { this.db = db; this.contactGroupFactory = contactGroupFactory; this.clientHelper = clientHelper; - this.identityManager = identityManager; this.blogManager = blogManager; this.blogPostFactory = blogPostFactory; + this.feedFactory = feedFactory; this.torSocketFactory = torSocketFactory; this.clock = clock; } @@ -158,21 +157,22 @@ class FeedManagerImpl implements FeedManager, Client, EventListener { } @Override - public void addFeed(String url, GroupId g) throws DbException, IOException { - LOG.info("Adding new RSS feed..."); - + public void addFeed(String url) throws DbException, IOException { // TODO check for existing feed? - // fetch feed to get its metadata - Feed feed = new Feed(url, g, clock.currentTimeMillis()); + // fetch syndication feed to get its metadata + SyndFeed f; try { - feed = fetchFeed(feed, false); + f = fetchSyndFeed(url); } catch (FeedException e) { throw new IOException(e); } - // store feed + Feed feed = feedFactory.createFeed(url, f); + + // store feed and new blog Transaction txn = db.startTransaction(false); try { + blogManager.addBlog(txn, feed.getBlog()); List<Feed> feeds = getFeeds(txn); feeds.add(feed); storeFeeds(txn, feeds); @@ -181,10 +181,10 @@ class FeedManagerImpl implements FeedManager, Client, EventListener { db.endTransaction(txn); } - // fetch feed again, post entries this time + // fetch feed again and post entries Feed updatedFeed; try { - updatedFeed = fetchFeed(feed, true); + updatedFeed = fetchFeed(feed); } catch (FeedException e) { throw new IOException(e); } @@ -208,16 +208,17 @@ class FeedManagerImpl implements FeedManager, Client, EventListener { Transaction txn = db.startTransaction(false); try { List<Feed> feeds = getFeeds(txn); - boolean found = false; - for (Feed feed : feeds) { - if (feed.getUrl().equals(url)) { - found = true; - feeds.remove(feed); + Feed feed = null; + for (Feed f : feeds) { + if (f.getUrl().equals(url)) { + feed = f; + feeds.remove(f); break; } } - if (!found) throw new DbException(); + if (feed == null) throw new DbException(); storeFeeds(txn, feeds); + // TODO blogManager.removeBlog(txn, feed.getBlog()); db.commitTransaction(txn); } finally { db.endTransaction(txn); @@ -246,7 +247,7 @@ class FeedManagerImpl implements FeedManager, Client, EventListener { for (Object object : d.getList(KEY_FEEDS)) { if (!(object instanceof BdfDictionary)) throw new FormatException(); - feeds.add(Feed.from((BdfDictionary) object)); + feeds.add(feedFactory.createFeed((BdfDictionary) object)); } } catch (FormatException e) { throw new DbException(e); @@ -259,7 +260,7 @@ class FeedManagerImpl implements FeedManager, Client, EventListener { BdfList feedList = new BdfList(); for (Feed feed : feeds) { - feedList.add(feed.toBdfDictionary()); + feedList.add(feedFactory.feedToBdfDictionary(feed)); } BdfDictionary gm = BdfDictionary.of(new BdfEntry(KEY_FEEDS, feedList)); try { @@ -300,7 +301,7 @@ class FeedManagerImpl implements FeedManager, Client, EventListener { List<Feed> newFeeds = new ArrayList<Feed>(feeds.size()); for (Feed feed : feeds) { try { - newFeeds.add(fetchFeed(feed, true)); + newFeeds.add(fetchFeed(feed)); } catch (FeedException e) { if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); @@ -323,31 +324,45 @@ class FeedManagerImpl implements FeedManager, Client, EventListener { LOG.info("Done updating RSS feeds"); } - private Feed fetchFeed(Feed feed, boolean post) - throws FeedException, IOException, DbException { - String title, description, author; - long updated = clock.currentTimeMillis(); - long lastEntryTime = feed.getLastEntryTime(); + private SyndFeed fetchSyndFeed(String url) + throws FeedException, IOException { + // fetch feed + SyndFeed f = getSyndFeed(getFeedInputStream(url)); - SyndFeed f = getSyndFeed(getFeedInputStream(feed.getUrl())); - title = StringUtils.isNullOrEmpty(f.getTitle()) ? null : f.getTitle(); + if (f.getEntries().size() == 0) + throw new FeedException("Feed has no entries"); + + // clean title + String title = + StringUtils.isNullOrEmpty(f.getTitle()) ? null : f.getTitle(); if (title != null) title = clean(title, STRIP_ALL); - description = StringUtils.isNullOrEmpty(f.getDescription()) ? null : - f.getDescription(); + f.setTitle(title); + + // clean description + String description = + StringUtils.isNullOrEmpty(f.getDescription()) ? null : + f.getDescription(); if (description != null) description = clean(description, STRIP_ALL); - author = + f.setDescription(description); + + // clean author + String author = StringUtils.isNullOrEmpty(f.getAuthor()) ? null : f.getAuthor(); if (author != null) author = clean(author, STRIP_ALL); + f.setAuthor(author); - if (f.getEntries().size() == 0) - throw new FeedException("Feed has no entries"); + return f; + } + + private Feed fetchFeed(Feed feed) + throws FeedException, IOException, DbException { + // fetch and clean feed + SyndFeed f = fetchSyndFeed(feed.getUrl()); // sort and add new entries - if (post) { - lastEntryTime = postFeedEntries(feed, f.getEntries()); - } - return new Feed(feed.getUrl(), feed.getBlogId(), title, description, - author, feed.getAdded(), updated, lastEntryTime); + long lastEntryTime = postFeedEntries(feed, f.getEntries()); + + return feedFactory.createFeed(feed, f, lastEntryTime); } private InputStream getFeedInputStream(String url) throws IOException { @@ -461,9 +476,9 @@ class FeedManagerImpl implements FeedManager, Client, EventListener { String body = getPostBody(b.toString()); try { // create and store post - LocalAuthor author = identityManager.getLocalAuthor(txn); + LocalAuthor localAuthor = feed.getLocalAuthor(); BlogPost post = blogPostFactory - .createBlogPost(groupId, time, null, author, body); + .createBlogPost(groupId, time, null, localAuthor, body); blogManager.addLocalPost(txn, post); } catch (DbException e) { if (LOG.isLoggable(WARNING)) diff --git a/briar-core/src/main/java/org/briarproject/briar/feed/FeedModule.java b/briar-core/src/main/java/org/briarproject/briar/feed/FeedModule.java index d47a088b88000a74ee1974c7ab22c6d3e486c472..ab8dfbc29322ba6090ec4bcf6f9530e43c2d6980 100644 --- a/briar-core/src/main/java/org/briarproject/briar/feed/FeedModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/feed/FeedModule.java @@ -28,4 +28,9 @@ public class FeedModule { return feedManager; } + @Provides + FeedFactory provideFeedFactory(FeedFactoryImpl feedFactory) { + return feedFactory; + } + }