From 384bafa38efb2cdac337488eaf9d3e9dc547b17b Mon Sep 17 00:00:00 2001 From: Athou Date: Tue, 9 Apr 2013 11:10:26 +0200 Subject: [PATCH] fix #20 --- .../backend/dao/FeedEntryService.java | 1 + .../backend/dao/FeedEntryStatusService.java | 25 +++++---- .../commafeed/backend/model/FeedEntry.java | 12 +++++ .../frontend/CommaFeedApplication.java | 5 +- .../com/commafeed/frontend/model/Entries.java | 9 ++++ .../commafeed/frontend/pages/TestRssPage.java | 53 +++++++++++++++++++ .../frontend/rest/resources/EntriesREST.java | 16 ++++-- src/main/webapp/js/controllers.js | 30 ++++++++--- 8 files changed, 130 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/commafeed/frontend/pages/TestRssPage.java diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryService.java b/src/main/java/com/commafeed/backend/dao/FeedEntryService.java index 2767f3f9..33be519a 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryService.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryService.java @@ -48,6 +48,7 @@ public class FeedEntryService extends GenericDAO { } } if (foundEntry == null) { + entry.setInserted(Calendar.getInstance().getTime()); addFeedToEntry(entry, feed); } else { boolean foundFeed = false; diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusService.java b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusService.java index 9279e3bd..64a26898 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusService.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusService.java @@ -1,5 +1,6 @@ package com.commafeed.backend.dao; +import java.util.Date; import java.util.List; import java.util.Map; @@ -152,27 +153,33 @@ public class FeedEntryStatusService extends GenericDAO { return query.getResultList(); } - public void markFeedEntries(User user, Feed feed) { + public void markFeedEntries(User user, Feed feed, Date olderThan) { List statuses = getStatuses(feed, user, true); - update(markList(statuses)); + update(markList(statuses, olderThan)); } - public void markCategoryEntries(User user, List categories) { + public void markCategoryEntries(User user, List categories, + Date olderThan) { List statuses = getStatuses(categories, user, true); - update(markList(statuses)); + update(markList(statuses, olderThan)); } - public void markAllEntries(User user) { + public void markAllEntries(User user, Date olderThan) { List statuses = getStatuses(user, true); - update(markList(statuses)); + update(markList(statuses, olderThan)); } - private List markList(List statuses) { + private List markList(List statuses, + Date olderThan) { List list = Lists.newArrayList(); for (FeedEntryStatus status : statuses) { if (!status.isRead()) { - status.setRead(true); - list.add(status); + Date inserted = status.getEntry().getInserted(); + if (olderThan == null || inserted == null + || olderThan.after(inserted)) { + status.setRead(true); + list.add(status); + } } } return list; diff --git a/src/main/java/com/commafeed/backend/model/FeedEntry.java b/src/main/java/com/commafeed/backend/model/FeedEntry.java index 98a60470..4260f44c 100644 --- a/src/main/java/com/commafeed/backend/model/FeedEntry.java +++ b/src/main/java/com/commafeed/backend/model/FeedEntry.java @@ -40,6 +40,10 @@ public class FeedEntry extends AbstractModel { @Column(length = 2048) private String url; + @Temporal(TemporalType.TIMESTAMP) + @Index(name = "inserted_index") + private Date inserted; + @Temporal(TemporalType.TIMESTAMP) @Index(name = "updated_index") private Date updated; @@ -103,4 +107,12 @@ public class FeedEntry extends AbstractModel { this.statuses = statuses; } + public Date getInserted() { + return inserted; + } + + public void setInserted(Date inserted) { + this.inserted = inserted; + } + } diff --git a/src/main/java/com/commafeed/frontend/CommaFeedApplication.java b/src/main/java/com/commafeed/frontend/CommaFeedApplication.java index a890b6f1..00935cc0 100644 --- a/src/main/java/com/commafeed/frontend/CommaFeedApplication.java +++ b/src/main/java/com/commafeed/frontend/CommaFeedApplication.java @@ -42,8 +42,9 @@ import com.commafeed.frontend.pages.FaviconPage; import com.commafeed.frontend.pages.GoogleImportCallbackPage; import com.commafeed.frontend.pages.GoogleImportRedirectPage; import com.commafeed.frontend.pages.HomePage; -import com.commafeed.frontend.pages.WelcomePage; import com.commafeed.frontend.pages.LogoutPage; +import com.commafeed.frontend.pages.TestRssPage; +import com.commafeed.frontend.pages.WelcomePage; import com.commafeed.frontend.utils.exception.DisplayExceptionPage; import de.agilecoders.wicket.Bootstrap; @@ -64,6 +65,8 @@ public class CommaFeedApplication extends AuthenticatedWebApplication { mountPage("google/import/redirect", GoogleImportRedirectPage.class); mountPage("google/import/callback", GoogleImportCallbackPage.class); + mountPage("testfeed", TestRssPage.class); + setupInjection(); getMarkupSettings().setStripWicketTags(true); diff --git a/src/main/java/com/commafeed/frontend/model/Entries.java b/src/main/java/com/commafeed/frontend/model/Entries.java index 48ac00c7..52eba7d7 100644 --- a/src/main/java/com/commafeed/frontend/model/Entries.java +++ b/src/main/java/com/commafeed/frontend/model/Entries.java @@ -10,6 +10,7 @@ public class Entries implements Serializable { private String name; private String message; private int errorCount; + private long timestamp; private List entries = Lists.newArrayList(); public String getName() { @@ -44,4 +45,12 @@ public class Entries implements Serializable { this.errorCount = errorCount; } + public long getTimestamp() { + return timestamp; + } + + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } + } diff --git a/src/main/java/com/commafeed/frontend/pages/TestRssPage.java b/src/main/java/com/commafeed/frontend/pages/TestRssPage.java new file mode 100644 index 00000000..c3c21dbb --- /dev/null +++ b/src/main/java/com/commafeed/frontend/pages/TestRssPage.java @@ -0,0 +1,53 @@ +package com.commafeed.frontend.pages; + +import java.io.StringWriter; +import java.util.Calendar; +import java.util.List; +import java.util.UUID; + +import org.apache.wicket.markup.html.WebPage; +import org.apache.wicket.request.handler.TextRequestHandler; + +import com.google.common.collect.Lists; +import com.sun.syndication.feed.synd.SyndEntry; +import com.sun.syndication.feed.synd.SyndEntryImpl; +import com.sun.syndication.feed.synd.SyndFeed; +import com.sun.syndication.feed.synd.SyndFeedImpl; +import com.sun.syndication.io.SyndFeedOutput; + +@SuppressWarnings("serial") +public class TestRssPage extends WebPage { + + public TestRssPage() { + SyndFeed feed = new SyndFeedImpl(); + feed.setFeedType("rss_2.0"); + feed.setTitle("Test RSS"); + + feed.setLink(""); + feed.setDescription("New entries everytime it is accessed"); + + List entries = Lists.newArrayList(); + for (int i = 0; i < 5; i++) { + SyndEntry entry = new SyndEntryImpl(); + String uuid = UUID.randomUUID().toString(); + entry.setUri(uuid); + entry.setTitle(uuid); + entry.setLink("http://www.example.com/" + uuid); + entry.setPublishedDate(Calendar.getInstance().getTime()); + entries.add(entry); + } + feed.setEntries(entries); + SyndFeedOutput output = new SyndFeedOutput(); + + StringWriter writer = new StringWriter(); + try { + output.output(feed, writer); + } catch (Exception e) { + writer.write("Could not get feed information"); + } + + getRequestCycle().scheduleRequestHandlerAfterCurrent( + new TextRequestHandler("text/xml", "UTF-8", writer.toString())); + } + +} diff --git a/src/main/java/com/commafeed/frontend/rest/resources/EntriesREST.java b/src/main/java/com/commafeed/frontend/rest/resources/EntriesREST.java index 6c7bceb0..c5f91f0b 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/EntriesREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/EntriesREST.java @@ -1,5 +1,7 @@ package com.commafeed.frontend.rest.resources; +import java.util.Calendar; +import java.util.Date; import java.util.List; import javax.ws.rs.DefaultValue; @@ -92,7 +94,7 @@ public class EntriesREST extends AbstractREST { } } - + entries.setTimestamp(Calendar.getInstance().getTimeInMillis()); return entries; } @@ -117,11 +119,15 @@ public class EntriesREST extends AbstractREST { @Path("mark") @GET public Response mark(@QueryParam("type") Type type, - @QueryParam("id") String id, @QueryParam("read") boolean read) { + @QueryParam("id") String id, @QueryParam("read") boolean read, + @QueryParam("olderThan") Long olderThanTimestamp) { Preconditions.checkNotNull(type); Preconditions.checkNotNull(id); Preconditions.checkNotNull(read); + Date olderThan = olderThanTimestamp == null ? null : new Date( + olderThanTimestamp); + if (type == Type.entry) { FeedEntryStatus status = feedEntryStatusService.findById(getUser(), Long.valueOf(id)); @@ -132,7 +138,7 @@ public class EntriesREST extends AbstractREST { FeedSubscription subscription = feedSubscriptionService .findById(getUser(), Long.valueOf(id)); feedEntryStatusService.markFeedEntries(getUser(), - subscription.getFeed()); + subscription.getFeed(), olderThan); } else { throw new WebApplicationException(Response.status( Status.INTERNAL_SERVER_ERROR).build()); @@ -140,14 +146,14 @@ public class EntriesREST extends AbstractREST { } else if (type == Type.category) { if (read) { if (ALL.equals(id)) { - feedEntryStatusService.markAllEntries(getUser()); + feedEntryStatusService.markAllEntries(getUser(), olderThan); } else { List categories = feedCategoryService .findAllChildrenCategories(getUser(), feedCategoryService.findById(getUser(), Long.valueOf(id))); feedEntryStatusService.markCategoryEntries(getUser(), - categories); + categories, olderThan); } } else { throw new WebApplicationException(Response.status( diff --git a/src/main/webapp/js/controllers.js b/src/main/webapp/js/controllers.js index 948cbac7..0a73457d 100644 --- a/src/main/webapp/js/controllers.js +++ b/src/main/webapp/js/controllers.js @@ -5,6 +5,12 @@ module.run(function($rootScope) { // args.entry - the entry $rootScope.$broadcast('mark', args); }); + $rootScope.$on('emitMarkAll', function(event, args) { + // args.type + // args.id + // args.read + $rootScope.$broadcast('markAll', args); + }); $rootScope.$on('emitReload', function(event, args) { $rootScope.$broadcast('reload'); }); @@ -212,14 +218,10 @@ module.controller('ToolbarCtrl', function($scope, $http, $state, $stateParams, $scope.$emit('emitReload'); }; $scope.markAllAsRead = function() { - EntryService.mark({ + $scope.$emit('emitMarkAll', { type : $stateParams._type, id : $stateParams._id, read : true - }, function() { - SubscriptionService.init(function() { - $scope.$emit('emitReload'); - }); }); }; @@ -246,7 +248,7 @@ module.controller('ToolbarCtrl', function($scope, $http, $state, $stateParams, }); module.controller('FeedListCtrl', function($scope, $stateParams, $http, $route, - $window, EntryService, SettingsService) { + $window, EntryService, SettingsService, SubscriptionService) { $scope.selectedType = $stateParams._type; $scope.selectedId = $stateParams._id; @@ -255,6 +257,7 @@ module.controller('FeedListCtrl', function($scope, $stateParams, $http, $route, $scope.name = null; $scope.message = null; $scope.errorCount = 0; + $scope.timestamp = 0; $scope.entries = []; $scope.settingsService = SettingsService; @@ -290,6 +293,7 @@ module.controller('FeedListCtrl', function($scope, $stateParams, $http, $route, $scope.name = data.name; $scope.message = data.message; $scope.errorCount = data.errorCount; + $scope.timestamp = data.timestamp; $scope.busy = false; $scope.hasMore = data.entries.length == limit; }; @@ -406,12 +410,26 @@ module.controller('FeedListCtrl', function($scope, $stateParams, $http, $route, openPreviousEntry(e); }); }); + + $scope.$on('markAll', function(event, args) { + EntryService.mark({ + type : $scope.selectedType, + id : $scope.selectedId, + olderThan : $scope.timestamp, + read : true + }, function() { + SubscriptionService.init(function() { + $scope.$emit('emitReload'); + }); + }); + }); $scope.$on('reload', function(event, args) { $scope.name = null; $scope.entries = []; $scope.message = null; $scope.errorCount = 0; + $scope.timestamp = 0; $scope.busy = false; $scope.hasMore = true; $scope.loadMoreEntries();