Add feed title to imported entries

Also fixes one bug where a new feed was not saved and
improved HTML stripping a bit.
This commit is contained in:
Torsten Grote
2016-08-22 12:04:20 -03:00
parent 22e7ec5b27
commit e10f68b496
4 changed files with 69 additions and 21 deletions

View File

@@ -83,14 +83,17 @@ public class Feed {
lastEntryTime); lastEntryTime);
} }
@Nullable
public String getTitle() { public String getTitle() {
return title; return title;
} }
@Nullable
public String getDescription() { public String getDescription() {
return description; return description;
} }
@Nullable
public String getAuthor() { public String getAuthor() {
return author; return author;
} }

View File

@@ -20,6 +20,9 @@ public interface IdentityManager {
/** Returns the local pseudonym with the given ID. */ /** Returns the local pseudonym with the given ID. */
LocalAuthor getLocalAuthor(AuthorId a) throws DbException; LocalAuthor getLocalAuthor(AuthorId a) throws DbException;
/** Returns the local pseudonym with the given ID. */
LocalAuthor getLocalAuthor(Transaction txn, AuthorId a) throws DbException;
/** Returns the main local identity. */ /** Returns the main local identity. */
LocalAuthor getLocalAuthor() throws DbException; LocalAuthor getLocalAuthor() throws DbException;

View File

@@ -149,19 +149,42 @@ class FeedManagerImpl implements FeedManager, Service, Client {
LOG.info("Adding new RSS feed..."); LOG.info("Adding new RSS feed...");
// TODO check for existing feed? // TODO check for existing feed?
// fetch feed to get its metadata
Feed feed = new Feed(url, g, clock.currentTimeMillis()); Feed feed = new Feed(url, g, clock.currentTimeMillis());
try { try {
feed = fetchFeed(feed); feed = fetchFeed(feed, false);
} catch (FeedException e) { } catch (FeedException e) {
throw new IOException(e); throw new IOException(e);
} }
// store feed
Transaction txn = db.startTransaction(false); Transaction txn = db.startTransaction(false);
try { try {
List<Feed> feeds = getFeeds(txn); List<Feed> feeds = getFeeds(txn);
feeds.add(feed); feeds.add(feed);
storeFeeds(txn, feeds); storeFeeds(txn, feeds);
txn.setComplete();
} finally { } finally {
//noinspection ThrowFromFinallyBlock
db.endTransaction(txn);
}
// fetch feed again, post entries this time
try {
feed = fetchFeed(feed, true);
} catch (FeedException e) {
throw new IOException(e);
}
// store feed again to also store last added entry
txn = db.startTransaction(false);
try {
List<Feed> feeds = getFeeds(txn);
feeds.add(feed);
storeFeeds(txn, feeds);
txn.setComplete();
} finally {
//noinspection ThrowFromFinallyBlock
db.endTransaction(txn); db.endTransaction(txn);
} }
} }
@@ -182,6 +205,7 @@ class FeedManagerImpl implements FeedManager, Service, Client {
} }
if (!found) throw new DbException(); if (!found) throw new DbException();
storeFeeds(txn, feeds); storeFeeds(txn, feeds);
txn.setComplete();
} finally { } finally {
db.endTransaction(txn); db.endTransaction(txn);
} }
@@ -263,7 +287,7 @@ class FeedManagerImpl implements FeedManager, Service, Client {
List<Feed> newFeeds = new ArrayList<Feed>(feeds.size()); List<Feed> newFeeds = new ArrayList<Feed>(feeds.size());
for (Feed feed : feeds) { for (Feed feed : feeds) {
try { try {
newFeeds.add(fetchFeed(feed)); newFeeds.add(fetchFeed(feed, true));
} catch (FeedException e) { } catch (FeedException e) {
if (LOG.isLoggable(WARNING)) if (LOG.isLoggable(WARNING))
LOG.log(WARNING, e.toString(), e); LOG.log(WARNING, e.toString(), e);
@@ -283,7 +307,8 @@ class FeedManagerImpl implements FeedManager, Service, Client {
LOG.info("Done updating RSS feeds"); LOG.info("Done updating RSS feeds");
} }
private Feed fetchFeed(Feed feed) throws FeedException, IOException { private Feed fetchFeed(Feed feed, boolean post)
throws FeedException, IOException {
if (LOG.isLoggable(INFO)) if (LOG.isLoggable(INFO))
LOG.info("Fetching feed from " + feed.getUrl()); LOG.info("Fetching feed from " + feed.getUrl());
@@ -301,23 +326,28 @@ class FeedManagerImpl implements FeedManager, Service, Client {
StringUtils.isNullOrEmpty(f.getAuthor()) ? null : f.getAuthor(); StringUtils.isNullOrEmpty(f.getAuthor()) ? null : f.getAuthor();
if (author != null) author = stripHTML(author); if (author != null) author = stripHTML(author);
if (f.getEntries().size() == 0)
throw new FeedException("Feed has no entries");
// sort and add new entries // sort and add new entries
Collections.sort(f.getEntries(), getEntryComparator()); if (post) {
for (SyndEntry entry : f.getEntries()) { Collections.sort(f.getEntries(), getEntryComparator());
long entryTime; for (SyndEntry entry : f.getEntries()) {
if (entry.getPublishedDate() != null) { long entryTime;
entryTime = entry.getPublishedDate().getTime(); if (entry.getPublishedDate() != null) {
} else if (entry.getUpdatedDate() != null) { entryTime = entry.getPublishedDate().getTime();
entryTime = entry.getUpdatedDate().getTime(); } else if (entry.getUpdatedDate() != null) {
} else { entryTime = entry.getUpdatedDate().getTime();
// no time information available, ignore this entry } else {
if (LOG.isLoggable(WARNING)) // no time information available, ignore this entry
LOG.warning("Entry has no date: " + entry.getTitle()); if (LOG.isLoggable(WARNING))
continue; LOG.warning("Entry has no date: " + entry.getTitle());
} continue;
if (entryTime > feed.getLastEntryTime()) { }
postEntry(feed, entry); if (entryTime > feed.getLastEntryTime()) {
if (entryTime > lastEntryTime) lastEntryTime = entryTime; postEntry(feed, entry);
if (entryTime > lastEntryTime) lastEntryTime = entryTime;
}
} }
} }
return new Feed(feed.getUrl(), feed.getBlogId(), title, description, return new Feed(feed.getUrl(), feed.getBlogId(), title, description,
@@ -356,9 +386,14 @@ class FeedManagerImpl implements FeedManager, Service, Client {
private void postEntry(Feed feed, SyndEntry entry) { private void postEntry(Feed feed, SyndEntry entry) {
LOG.info("Adding new entry..."); LOG.info("Adding new entry...");
// TODO do this within one database transaction?
// build post body // build post body
StringBuilder b = new StringBuilder(); StringBuilder b = new StringBuilder();
if (feed.getTitle() != null) {
// HTML in feed title was already stripped
b.append(feed.getTitle()).append("\n\n");
}
if (!StringUtils.isNullOrEmpty(entry.getTitle())) { if (!StringUtils.isNullOrEmpty(entry.getTitle())) {
b.append(stripHTML(entry.getTitle())).append("\n\n"); b.append(stripHTML(entry.getTitle())).append("\n\n");
} }
@@ -416,7 +451,8 @@ class FeedManagerImpl implements FeedManager, Service, Client {
} }
private String stripHTML(String s) { private String stripHTML(String s) {
return StringUtils.trim(s.replaceAll("<.*?>", "")); s = s.replaceAll("<script.*?>(?s).*?</script>", "");
return StringUtils.trim(s.replaceAll("<(?s).*?>", ""));
} }
private byte[] getPostBody(String text) { private byte[] getPostBody(String text) {

View File

@@ -60,7 +60,7 @@ class IdentityManagerImpl implements IdentityManager {
LocalAuthor author; LocalAuthor author;
Transaction txn = db.startTransaction(true); Transaction txn = db.startTransaction(true);
try { try {
author = db.getLocalAuthor(txn, a); author = getLocalAuthor(txn, a);
txn.setComplete(); txn.setComplete();
} finally { } finally {
db.endTransaction(txn); db.endTransaction(txn);
@@ -68,6 +68,12 @@ class IdentityManagerImpl implements IdentityManager {
return author; return author;
} }
@Override
public LocalAuthor getLocalAuthor(Transaction txn, AuthorId a)
throws DbException {
return db.getLocalAuthor(txn, a);
}
@Override @Override
public LocalAuthor getLocalAuthor() throws DbException { public LocalAuthor getLocalAuthor() throws DbException {
return getLocalAuthors().iterator().next(); return getLocalAuthors().iterator().next();