mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-18 05:39:53 +01:00
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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user