From e87e4db645b34cd3794ba553a0ab14862d4ca808 Mon Sep 17 00:00:00 2001 From: bulkazmaslem Date: Fri, 7 Jun 2013 18:24:27 +0200 Subject: [PATCH 1/7] Update pl.properties --- src/main/resources/i18n/pl.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/i18n/pl.properties b/src/main/resources/i18n/pl.properties index b391258e..a1364b67 100644 --- a/src/main/resources/i18n/pl.properties +++ b/src/main/resources/i18n/pl.properties @@ -68,7 +68,7 @@ details.feed_details=Szczegóły kanału details.url=URL details.name=Nazwa details.category=Kategoria -details.position=Position ####### Needs translation +details.position=Pozycja details.last_refresh=Ostatnio odświeżony details.next_refresh=Następne odświeżenie details.queued_for_refresh=W kolejce do odświeżenia From 84db458fd1e3f25349859b47262cf44273206ffd Mon Sep 17 00:00:00 2001 From: Athou Date: Sat, 8 Jun 2013 07:52:04 +0200 Subject: [PATCH 2/7] mark the entry as read when using 'b' or 'v' --- src/main/webapp/js/controllers.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/webapp/js/controllers.js b/src/main/webapp/js/controllers.js index e0dbb866..35c63419 100644 --- a/src/main/webapp/js/controllers.js +++ b/src/main/webapp/js/controllers.js @@ -933,11 +933,14 @@ function($scope, $stateParams, $http, $route, $window, EntryService, SettingsSer }); Mousetrap.bind('v', function(e) { if ($scope.current) { + $scope.mark($scope.current, true); window.open($scope.current.url); } }); Mousetrap.bind('b', function(e) { if ($scope.current) { + $scope.mark($scope.current, true); + var url = $scope.current.url; var a = document.createElement('a'); a.href = url; From feda8ca8345547a44cd26494dc155ed7086d6f28 Mon Sep 17 00:00:00 2001 From: Athou Date: Sat, 8 Jun 2013 14:09:46 +0200 Subject: [PATCH 3/7] optional query parameter to filter out old entries from results --- .../backend/dao/FeedEntryStatusDAO.java | 45 ++++++++++++++----- .../com/commafeed/frontend/model/Entries.java | 13 +++++- .../com/commafeed/frontend/model/Entry.java | 12 +++++ .../pages/NextUnreadRedirectPage.java | 4 +- .../frontend/rest/resources/CategoryREST.java | 23 +++++++--- .../frontend/rest/resources/FeedREST.java | 17 +++++-- src/main/resources/log4j.properties | 1 + src/main/webapp/js/controllers.js | 2 +- 8 files changed, 94 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java index e7c36be3..64300b29 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java @@ -96,11 +96,11 @@ public class FeedEntryStatusDAO extends GenericDAO { public List findStarred(User user, ReadingOrder order, boolean includeContent) { - return findStarred(user, -1, -1, order, includeContent); + return findStarred(user, null, -1, -1, order, includeContent); } - public List findStarred(User user, int offset, int limit, - ReadingOrder order, boolean includeContent) { + public List findStarred(User user, Date newerThan, + int offset, int limit, ReadingOrder order, boolean includeContent) { CriteriaQuery query = builder.createQuery(getType()); Root root = query.from(getType()); @@ -118,6 +118,11 @@ public class FeedEntryStatusDAO extends GenericDAO { predicates.add(builder.equal(root.get(FeedEntryStatus_.starred), true)); query.where(predicates.toArray(new Predicate[0])); + if (newerThan != null) { + predicates.add(builder.greaterThanOrEqualTo( + entryJoin.get(FeedEntry_.inserted), newerThan)); + } + orderBy(query, entryJoin, order); TypedQuery q = em.createQuery(query); @@ -127,11 +132,12 @@ public class FeedEntryStatusDAO extends GenericDAO { public List findAll(User user, boolean unreadOnly, ReadingOrder order, boolean includeContent) { - return findAll(user, unreadOnly, -1, -1, order, includeContent); + return findAll(user, unreadOnly, null, -1, -1, order, includeContent); } public List findAll(User user, boolean unreadOnly, - int offset, int limit, ReadingOrder order, boolean includeContent) { + Date newerThan, int offset, int limit, ReadingOrder order, + boolean includeContent) { CriteriaQuery query = builder.createQuery(getType()); Root root = query.from(getType()); @@ -148,6 +154,11 @@ public class FeedEntryStatusDAO extends GenericDAO { predicates.add(builder.isFalse(root.get(FeedEntryStatus_.read))); } + if (newerThan != null) { + predicates.add(builder.greaterThanOrEqualTo( + entryJoin.get(FeedEntry_.inserted), newerThan)); + } + query.where(predicates.toArray(new Predicate[0])); orderBy(query, entryJoin, order); @@ -158,12 +169,13 @@ public class FeedEntryStatusDAO extends GenericDAO { public List findByFeed(Feed feed, User user, boolean unreadOnly, ReadingOrder order, boolean includeContent) { - return findByFeed(feed, user, unreadOnly, -1, -1, order, includeContent); + return findByFeed(feed, user, unreadOnly, null, -1, -1, order, + includeContent); } public List findByFeed(Feed feed, User user, - boolean unreadOnly, int offset, int limit, ReadingOrder order, - boolean includeContent) { + boolean unreadOnly, Date newerThan, int offset, int limit, + ReadingOrder order, boolean includeContent) { CriteriaQuery query = builder.createQuery(getType()); Root root = query.from(getType()); @@ -183,6 +195,11 @@ public class FeedEntryStatusDAO extends GenericDAO { predicates.add(builder.isFalse(root.get(FeedEntryStatus_.read))); } + if (newerThan != null) { + predicates.add(builder.greaterThanOrEqualTo( + entryJoin.get(FeedEntry_.inserted), newerThan)); + } + query.where(predicates.toArray(new Predicate[0])); orderBy(query, entryJoin, order); @@ -195,13 +212,14 @@ public class FeedEntryStatusDAO extends GenericDAO { public List findByCategories( List categories, User user, boolean unreadOnly, ReadingOrder order, boolean includeContent) { - return findByCategories(categories, user, unreadOnly, -1, -1, order, - includeContent); + return findByCategories(categories, user, unreadOnly, null, -1, -1, + order, includeContent); } public List findByCategories( List categories, User user, boolean unreadOnly, - int offset, int limit, ReadingOrder order, boolean includeContent) { + Date newerThan, int offset, int limit, ReadingOrder order, + boolean includeContent) { CriteriaQuery query = builder.createQuery(getType()); Root root = query.from(getType()); @@ -220,6 +238,11 @@ public class FeedEntryStatusDAO extends GenericDAO { predicates.add(builder.isFalse(root.get(FeedEntryStatus_.read))); } + if (newerThan != null) { + predicates.add(builder.greaterThanOrEqualTo( + entryJoin.get(FeedEntry_.inserted), newerThan)); + } + query.where(predicates.toArray(new Predicate[0])); orderBy(query, entryJoin, order); diff --git a/src/main/java/com/commafeed/frontend/model/Entries.java b/src/main/java/com/commafeed/frontend/model/Entries.java index 709e25d1..83820925 100644 --- a/src/main/java/com/commafeed/frontend/model/Entries.java +++ b/src/main/java/com/commafeed/frontend/model/Entries.java @@ -26,9 +26,12 @@ public class Entries implements Serializable { @ApiProperty("times the server tried to refresh the feed and failed") private int errorCount; - @ApiProperty("list generation Timestamp") + @ApiProperty("list generation timestamp") private long timestamp; + @ApiProperty("if the query has more elements") + private boolean hasMore; + @ApiProperty("list of entries") private List entries = Lists.newArrayList(); @@ -72,4 +75,12 @@ public class Entries implements Serializable { this.timestamp = timestamp; } + public boolean isHasMore() { + return hasMore; + } + + public void setHasMore(boolean hasMore) { + this.hasMore = hasMore; + } + } diff --git a/src/main/java/com/commafeed/frontend/model/Entry.java b/src/main/java/com/commafeed/frontend/model/Entry.java index 9a5598bf..d83d1ddd 100644 --- a/src/main/java/com/commafeed/frontend/model/Entry.java +++ b/src/main/java/com/commafeed/frontend/model/Entry.java @@ -37,6 +37,7 @@ public class Entry implements Serializable { entry.setEnclosureType(status.getEntry().getContent() .getEnclosureType()); entry.setDate(feedEntry.getUpdated()); + entry.setInsertedDate(feedEntry.getInserted()); entry.setUrl(feedEntry.getUrl()); entry.setRead(status.isRead()); @@ -93,6 +94,9 @@ public class Entry implements Serializable { @ApiProperty("entry publication date") private Date date; + @ApiProperty("entry insertion date in the database") + private Date insertedDate; + @ApiProperty("feed id") private String feedId; @@ -253,4 +257,12 @@ public class Entry implements Serializable { this.rtl = rtl; } + public Date getInsertedDate() { + return insertedDate; + } + + public void setInsertedDate(Date insertedDate) { + this.insertedDate = insertedDate; + } + } diff --git a/src/main/java/com/commafeed/frontend/pages/NextUnreadRedirectPage.java b/src/main/java/com/commafeed/frontend/pages/NextUnreadRedirectPage.java index aa2b9846..473a7e71 100644 --- a/src/main/java/com/commafeed/frontend/pages/NextUnreadRedirectPage.java +++ b/src/main/java/com/commafeed/frontend/pages/NextUnreadRedirectPage.java @@ -41,7 +41,7 @@ public class NextUnreadRedirectPage extends WebPage { List statuses = null; if (StringUtils.isBlank(categoryId) || CategoryREST.ALL.equals(categoryId)) { - statuses = feedEntryStatusDAO.findAll(user, true, 0, 1, + statuses = feedEntryStatusDAO.findAll(user, true, null, 0, 1, ReadingOrder.desc, true); } else { FeedCategory category = feedCategoryDAO.findById(user, @@ -50,7 +50,7 @@ public class NextUnreadRedirectPage extends WebPage { List children = feedCategoryDAO .findAllChildrenCategories(user, category); statuses = feedEntryStatusDAO.findByCategories(children, user, - true, 0, 1, ReadingOrder.desc, false); + true, null, 0, 1, ReadingOrder.desc, false); } } diff --git a/src/main/java/com/commafeed/frontend/rest/resources/CategoryREST.java b/src/main/java/com/commafeed/frontend/rest/resources/CategoryREST.java index d30340b0..c268611d 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/CategoryREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/CategoryREST.java @@ -65,6 +65,7 @@ public class CategoryREST extends AbstractResourceREST { public Response getCategoryEntries( @ApiParam(value = "id of the category, 'all' or 'starred'", required = true) @QueryParam("id") String id, @ApiParam(value = "all entries or only unread ones", allowableValues = "all,unread", required = true) @QueryParam("readType") ReadType readType, + @ApiParam(value = "only entries newer than this") @QueryParam("newerThan") Long newerThan, @ApiParam(value = "offset for paging") @DefaultValue("0") @QueryParam("offset") int offset, @ApiParam(value = "limit for paging, default 20, maximum 50") @DefaultValue("20") @QueryParam("limit") int limit, @ApiParam(value = "date ordering", allowableValues = "asc,desc") @QueryParam("order") @DefaultValue("desc") ReadingOrder order) { @@ -78,11 +79,15 @@ public class CategoryREST extends AbstractResourceREST { if (StringUtils.isBlank(id)) { id = ALL; } + + Date newerThanDate = newerThan == null ? null : new Date( + Long.valueOf(newerThan)); if (ALL.equals(id)) { entries.setName("All"); List unreadEntries = feedEntryStatusDAO.findAll( - getUser(), unreadOnly, offset, limit, order, true); + getUser(), unreadOnly, newerThanDate, offset, limit + 1, order, + true); for (FeedEntryStatus status : unreadEntries) { entries.getEntries().add( Entry.build(status, applicationSettingsService.get() @@ -92,7 +97,7 @@ public class CategoryREST extends AbstractResourceREST { } else if (STARRED.equals(id)) { entries.setName("Starred"); List starred = feedEntryStatusDAO.findStarred( - getUser(), offset, limit, order, true); + getUser(), newerThanDate, offset, limit + 1, order, true); for (FeedEntryStatus status : starred) { entries.getEntries().add( Entry.build(status, applicationSettingsService.get() @@ -106,7 +111,8 @@ public class CategoryREST extends AbstractResourceREST { .findAllChildrenCategories(getUser(), feedCategory); List unreadEntries = feedEntryStatusDAO .findByCategories(childrenCategories, getUser(), - unreadOnly, offset, limit, order, true); + unreadOnly, newerThanDate, offset, limit + 1, + order, true); for (FeedEntryStatus status : unreadEntries) { entries.getEntries().add( Entry.build(status, applicationSettingsService @@ -116,6 +122,13 @@ public class CategoryREST extends AbstractResourceREST { } } + + boolean hasMore = entries.getEntries().size() > limit; + if (hasMore) { + entries.setHasMore(true); + entries.getEntries().remove(entries.getEntries().size() - 1); + } + entries.setTimestamp(Calendar.getInstance().getTimeInMillis()); return Response.ok(entries).build(); } @@ -135,8 +148,8 @@ public class CategoryREST extends AbstractResourceREST { int offset = 0; int limit = 20; - Entries entries = (Entries) getCategoryEntries(id, readType, offset, - limit, order).getEntity(); + Entries entries = (Entries) getCategoryEntries(id, readType, null, + offset, limit, order).getEntity(); SyndFeed feed = new SyndFeedImpl(); feed.setFeedType("rss_2.0"); diff --git a/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java b/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java index 28fc8030..58d932ea 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java @@ -72,6 +72,7 @@ public class FeedREST extends AbstractResourceREST { public Response getFeedEntries( @ApiParam(value = "id of the feed", required = true) @QueryParam("id") String id, @ApiParam(value = "all entries or only unread ones", allowableValues = "all,unread", required = true) @QueryParam("readType") ReadType readType, + @ApiParam(value = "only entries newer than this") @QueryParam("newerThan") Long newerThan, @ApiParam(value = "offset for paging") @DefaultValue("0") @QueryParam("offset") int offset, @ApiParam(value = "limit for paging, default 20, maximum 50") @DefaultValue("20") @QueryParam("limit") int limit, @ApiParam(value = "date ordering", allowableValues = "asc,desc") @QueryParam("order") @DefaultValue("desc") ReadingOrder order) { @@ -85,6 +86,10 @@ public class FeedREST extends AbstractResourceREST { Entries entries = new Entries(); boolean unreadOnly = readType == ReadType.unread; + Date newerThanDate = newerThan == null ? null : new Date( + Long.valueOf(newerThan)); + System.out.println(newerThanDate); + FeedSubscription subscription = feedSubscriptionDAO.findById(getUser(), Long.valueOf(id)); if (subscription != null) { @@ -94,12 +99,18 @@ public class FeedREST extends AbstractResourceREST { List unreadEntries = feedEntryStatusDAO .findByFeed(subscription.getFeed(), getUser(), unreadOnly, - offset, limit, order, true); + newerThanDate, offset, limit + 1, order, true); for (FeedEntryStatus status : unreadEntries) { entries.getEntries().add( Entry.build(status, applicationSettingsService.get() .getPublicUrl())); } + + boolean hasMore = entries.getEntries().size() > limit; + if (hasMore) { + entries.setHasMore(true); + entries.getEntries().remove(entries.getEntries().size() - 1); + } } entries.setTimestamp(Calendar.getInstance().getTimeInMillis()); @@ -121,8 +132,8 @@ public class FeedREST extends AbstractResourceREST { int offset = 0; int limit = 20; - Entries entries = (Entries) getFeedEntries(id, readType, offset, limit, - order).getEntity(); + Entries entries = (Entries) getFeedEntries(id, readType, null, offset, + limit, order).getEntity(); SyndFeed feed = new SyndFeedImpl(); feed.setFeedType("rss_2.0"); diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties index 800d73b4..f54e01c5 100644 --- a/src/main/resources/log4j.properties +++ b/src/main/resources/log4j.properties @@ -1,5 +1,6 @@ log4j.logger.com.commafeed=INFO, CONSOLE log4j.logger.org=WARN, CONSOLE +log4j.logger.com=WARN, CONSOLE log4j.logger.ro=WARN, CONSOLE log4j.logger.net.sf.ehcache=ALL, CONSOLE log4j.logger.org.hibernate.cache=ALL, CONSOLE diff --git a/src/main/webapp/js/controllers.js b/src/main/webapp/js/controllers.js index 35c63419..94968ec8 100644 --- a/src/main/webapp/js/controllers.js +++ b/src/main/webapp/js/controllers.js @@ -707,7 +707,7 @@ function($scope, $stateParams, $http, $route, $window, EntryService, SettingsSer $scope.errorCount = data.errorCount; $scope.timestamp = data.timestamp; $scope.busy = false; - $scope.hasMore = data.entries.length == limit; + $scope.hasMore = data.hasMore; }; if (!$scope.keywords) { var service = $scope.selectedType == 'feed' ? FeedService From 2d880c92d087b3b51597a5c61caa11731393b3c6 Mon Sep 17 00:00:00 2001 From: Athou Date: Sat, 8 Jun 2013 15:26:04 +0200 Subject: [PATCH 4/7] remove debug line --- .../java/com/commafeed/frontend/rest/resources/FeedREST.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java b/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java index 58d932ea..60bdf168 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java @@ -88,7 +88,6 @@ public class FeedREST extends AbstractResourceREST { Date newerThanDate = newerThan == null ? null : new Date( Long.valueOf(newerThan)); - System.out.println(newerThanDate); FeedSubscription subscription = feedSubscriptionDAO.findById(getUser(), Long.valueOf(id)); From ec163da9dbca9e176f15db35e4570b3efa56928a Mon Sep 17 00:00:00 2001 From: Athou Date: Sat, 8 Jun 2013 16:15:11 +0200 Subject: [PATCH 5/7] removed easycriteria --- pom.xml | 6 -- .../backend/dao/FeedCategoryDAO.java | 65 +++++++++----- .../com/commafeed/backend/dao/FeedDAO.java | 16 ++-- .../backend/dao/FeedEntryStatusDAO.java | 18 ++-- .../backend/dao/FeedSubscriptionDAO.java | 88 ++++++++++++------- .../com/commafeed/backend/dao/GenericDAO.java | 50 ++++++----- .../commafeed/backend/dao/UserRoleDAO.java | 17 ++-- .../backend/dao/UserSettingsDAO.java | 13 +-- 8 files changed, 166 insertions(+), 107 deletions(-) diff --git a/pom.xml b/pom.xml index 85729379..b8de943f 100644 --- a/pom.xml +++ b/pom.xml @@ -162,12 +162,6 @@ - - uaihebert.com - EasyCriteria - 2.1.0 - - com.google.guava guava diff --git a/src/main/java/com/commafeed/backend/dao/FeedCategoryDAO.java b/src/main/java/com/commafeed/backend/dao/FeedCategoryDAO.java index 12f519e6..4731af7c 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedCategoryDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedCategoryDAO.java @@ -4,6 +4,9 @@ import java.util.List; import javax.ejb.Stateless; import javax.persistence.NoResultException; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; import org.apache.commons.lang.ObjectUtils; @@ -12,39 +15,54 @@ import com.commafeed.backend.model.FeedCategory_; import com.commafeed.backend.model.User; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; -import com.uaihebert.model.EasyCriteria; @Stateless public class FeedCategoryDAO extends GenericDAO { public List findAll(User user) { - EasyCriteria criteria = createCriteria(); - criteria.andEquals(FeedCategory_.user.getName(), user); - criteria.innerJoinFetch(FeedCategory_.user.getName()); - return criteria.getResultList(); + CriteriaQuery query = builder.createQuery(getType()); + Root root = query.from(getType()); + + query.where(builder.equal(root.get(FeedCategory_.user), user)); + root.fetch(FeedCategory_.user.getName()); + + return em.createQuery(query).getResultList(); } public FeedCategory findById(User user, Long id) { - EasyCriteria criteria = createCriteria(); - criteria.andEquals(FeedCategory_.user.getName(), user); - criteria.andEquals(FeedCategory_.id.getName(), id); - return Iterables.getFirst(criteria.getResultList(), null); + CriteriaQuery query = builder.createQuery(getType()); + Root root = query.from(getType()); + + Predicate p1 = builder.equal(root.get(FeedCategory_.user), user); + Predicate p2 = builder.equal(root.get(FeedCategory_.id), id); + + query.where(p1, p2); + + return Iterables.getFirst(em.createQuery(query).getResultList(), null); } public FeedCategory findByName(User user, String name, FeedCategory parent) { - EasyCriteria criteria = createCriteria(); - criteria.andEquals(FeedCategory_.user.getName(), user); - criteria.andEquals(FeedCategory_.name.getName(), name); + CriteriaQuery query = builder.createQuery(getType()); + Root root = query.from(getType()); + + List predicates = Lists.newArrayList(); + + predicates.add(builder.equal(root.get(FeedCategory_.user), user)); + predicates.add(builder.equal(root.get(FeedCategory_.name), name)); + if (parent == null) { - criteria.andIsNull(FeedCategory_.parent.getName()); + predicates.add(builder.isNull(root.get(FeedCategory_.parent))); } else { - criteria.andEquals(FeedCategory_.parent.getName(), parent); + predicates + .add(builder.equal(root.get(FeedCategory_.parent), parent)); } + query.where(predicates.toArray(new Predicate[0])); + FeedCategory category = null; try { - category = criteria.getSingleResult(); + category = em.createQuery(query).getSingleResult(); } catch (NoResultException e) { category = null; } @@ -52,15 +70,22 @@ public class FeedCategoryDAO extends GenericDAO { } public List findByParent(User user, FeedCategory parent) { - EasyCriteria criteria = createCriteria(); - criteria.andEquals(FeedCategory_.user.getName(), user); + CriteriaQuery query = builder.createQuery(getType()); + Root root = query.from(getType()); + + List predicates = Lists.newArrayList(); + + predicates.add(builder.equal(root.get(FeedCategory_.user), user)); if (parent == null) { - criteria.andIsNull(FeedCategory_.parent.getName()); + predicates.add(builder.isNull(root.get(FeedCategory_.parent))); } else { - criteria.andEquals(FeedCategory_.parent.getName(), parent); + predicates + .add(builder.equal(root.get(FeedCategory_.parent), parent)); } - return criteria.getResultList(); + query.where(predicates.toArray(new Predicate[0])); + + return em.createQuery(query).getResultList(); } public List findAllChildrenCategories(User user, diff --git a/src/main/java/com/commafeed/backend/dao/FeedDAO.java b/src/main/java/com/commafeed/backend/dao/FeedDAO.java index 1b9bc07d..13e5e2f6 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedDAO.java @@ -7,6 +7,7 @@ import java.util.List; import javax.ejb.Stateless; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.JoinType; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; @@ -18,7 +19,6 @@ import com.commafeed.backend.model.Feed; import com.commafeed.backend.model.Feed_; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; -import com.uaihebert.model.EasyCriteria; @Stateless public class FeedDAO extends GenericDAO { @@ -78,13 +78,15 @@ public class FeedDAO extends GenericDAO { } public Feed findByIdWithEntries(Long feedId, int offset, int limit) { - EasyCriteria criteria = createCriteria(); - criteria.andEquals(Feed_.id.getName(), feedId); - criteria.leftJoinFetch(Feed_.entries.getName()); + CriteriaQuery query = builder.createQuery(getType()); + Root root = query.from(getType()); - criteria.setFirstResult(offset); - criteria.setMaxResults(limit); - return criteria.getSingleResult(); + query.where(builder.equal(root.get(Feed_.id), feedId)); + root.fetch(Feed_.entries, JoinType.LEFT); + + TypedQuery q = em.createQuery(query); + limit(q, offset, limit); + return q.getSingleResult(); } public List findByTopic(String topic) { diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java index 64300b29..51860a5c 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java @@ -31,23 +31,27 @@ import com.commafeed.backend.model.User; import com.commafeed.backend.model.UserSettings.ReadingOrder; import com.google.api.client.util.Lists; import com.google.api.client.util.Maps; -import com.uaihebert.model.EasyCriteria; @Stateless public class FeedEntryStatusDAO extends GenericDAO { + @SuppressWarnings("unchecked") public FeedEntryStatus findById(User user, Long id) { - EasyCriteria criteria = createCriteria(); - criteria.andEquals(FeedEntryStatus_.id.getName(), id); + CriteriaQuery query = builder.createQuery(getType()); + Root root = query.from(getType()); - criteria.innerJoinFetch(FeedEntryStatus_.subscription.getName()); - criteria.andJoinEquals(FeedEntryStatus_.subscription.getName(), - FeedSubscription_.user.getName(), user); + Join join = (Join) root + .fetch(FeedEntryStatus_.subscription); + + Predicate p1 = builder.equal(root.get(FeedEntryStatus_.id), id); + Predicate p2 = builder.equal(join.get(FeedSubscription_.user), user); + + query.where(p1, p2); FeedEntryStatus status = null; try { - status = criteria.getSingleResult(); + status = em.createQuery(query).getSingleResult(); } catch (NoResultException e) { status = null; } diff --git a/src/main/java/com/commafeed/backend/dao/FeedSubscriptionDAO.java b/src/main/java/com/commafeed/backend/dao/FeedSubscriptionDAO.java index 21f98a4a..acf088b1 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedSubscriptionDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedSubscriptionDAO.java @@ -3,6 +3,10 @@ package com.commafeed.backend.dao; import java.util.List; import javax.ejb.Stateless; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.JoinType; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; import com.commafeed.backend.model.Feed; import com.commafeed.backend.model.FeedCategory; @@ -10,59 +14,83 @@ import com.commafeed.backend.model.FeedSubscription; import com.commafeed.backend.model.FeedSubscription_; import com.commafeed.backend.model.User; import com.google.common.collect.Iterables; -import com.uaihebert.factory.EasyCriteriaFactory; -import com.uaihebert.model.EasyCriteria; @Stateless public class FeedSubscriptionDAO extends GenericDAO { public FeedSubscription findById(User user, Long id) { - EasyCriteria criteria = createCriteria(); - criteria.andEquals(FeedSubscription_.user.getName(), user); - criteria.andEquals(FeedSubscription_.id.getName(), id); - criteria.leftJoinFetch(FeedSubscription_.feed.getName()); - criteria.leftJoinFetch(FeedSubscription_.category.getName()); - return Iterables.getFirst(criteria.getResultList(), null); + CriteriaQuery query = builder.createQuery(getType()); + Root root = query.from(getType()); + + Predicate p1 = builder.equal(root.get(FeedSubscription_.user), user); + Predicate p2 = builder.equal(root.get(FeedSubscription_.id), id); + + root.fetch(FeedSubscription_.feed, JoinType.LEFT); + root.fetch(FeedSubscription_.category, JoinType.LEFT); + + query.where(p1, p2); + + return Iterables.getFirst(em.createQuery(query).getResultList(), null); } public List findByFeed(Feed feed) { - EasyCriteria criteria = createCriteria(); - criteria.andEquals(FeedSubscription_.feed.getName(), feed); - return criteria.getResultList(); + return findByField(FeedSubscription_.feed, feed); } public FeedSubscription findByFeed(User user, Feed feed) { - EasyCriteria criteria = createCriteria(); - criteria.andEquals(FeedSubscription_.user.getName(), user); - criteria.andEquals(FeedSubscription_.feed.getName(), feed); - return Iterables.getFirst(criteria.getResultList(), null); + + CriteriaQuery query = builder.createQuery(getType()); + Root root = query.from(getType()); + + Predicate p1 = builder.equal(root.get(FeedSubscription_.user), user); + Predicate p2 = builder.equal(root.get(FeedSubscription_.feed), feed); + + root.fetch(FeedSubscription_.feed, JoinType.LEFT); + root.fetch(FeedSubscription_.category, JoinType.LEFT); + + query.where(p1, p2); + + return Iterables.getFirst(em.createQuery(query).getResultList(), null); } public List findAll(User user) { - EasyCriteria criteria = createCriteria(); - criteria.andEquals(FeedSubscription_.user.getName(), user); - criteria.innerJoinFetch(FeedSubscription_.feed.getName()); - criteria.leftJoinFetch(FeedSubscription_.category.getName()); - return criteria.getResultList(); + CriteriaQuery query = builder.createQuery(getType()); + Root root = query.from(getType()); + + root.fetch(FeedSubscription_.feed, JoinType.LEFT); + root.fetch(FeedSubscription_.category, JoinType.LEFT); + + query.where(builder.equal(root.get(FeedSubscription_.user), user)); + + return em.createQuery(query).getResultList(); } public List findByCategory(User user, FeedCategory category) { - EasyCriteria criteria = EasyCriteriaFactory - .createQueryCriteria(em, getType()); - criteria.andEquals(FeedSubscription_.user.getName(), user); - criteria.andEquals(FeedSubscription_.category.getName(), category); - return criteria.getResultList(); + CriteriaQuery query = builder.createQuery(getType()); + Root root = query.from(getType()); + + Predicate p1 = builder.equal(root.get(FeedSubscription_.user), user); + Predicate p2 = builder.equal(root.get(FeedSubscription_.category), + category); + + query.where(p1, p2); + + return em.createQuery(query).getResultList(); } public List findWithoutCategories(User user) { - EasyCriteria criteria = EasyCriteriaFactory - .createQueryCriteria(em, getType()); - criteria.andEquals(FeedSubscription_.user.getName(), user); - criteria.andIsNull(FeedSubscription_.category.getName()); - return criteria.getResultList(); + CriteriaQuery query = builder.createQuery(getType()); + Root root = query.from(getType()); + + Predicate p1 = builder.equal(root.get(FeedSubscription_.user), user); + Predicate p2 = builder.isNull(root.get(FeedSubscription_.category)); + + query.where(p1, p2); + + return em.createQuery(query).getResultList(); } } diff --git a/src/main/java/com/commafeed/backend/dao/GenericDAO.java b/src/main/java/com/commafeed/backend/dao/GenericDAO.java index 7671d1ca..d545b2c3 100644 --- a/src/main/java/com/commafeed/backend/dao/GenericDAO.java +++ b/src/main/java/com/commafeed/backend/dao/GenericDAO.java @@ -17,8 +17,6 @@ import org.hibernate.Session; import com.commafeed.backend.model.AbstractModel; import com.google.common.reflect.TypeToken; -import com.uaihebert.factory.EasyCriteriaFactory; -import com.uaihebert.model.EasyCriteria; @SuppressWarnings("serial") public abstract class GenericDAO { @@ -73,30 +71,36 @@ public abstract class GenericDAO { } public List findAll() { - return EasyCriteriaFactory.createQueryCriteria(em, getType()) - .getResultList(); + CriteriaQuery query = builder.createQuery(getType()); + query.from(getType()); + return em.createQuery(query).getResultList(); } public List findAll(int startIndex, int count) { - EasyCriteria criteria = EasyCriteriaFactory.createQueryCriteria(em, - getType()); - criteria.setMaxResults(count); - criteria.setFirstResult(startIndex); - return criteria.getResultList(); + CriteriaQuery query = builder.createQuery(getType()); + query.from(getType()); + TypedQuery q = em.createQuery(query); + q.setMaxResults(count); + q.setFirstResult(startIndex); + return q.getResultList(); } public List findAll(int startIndex, int count, String orderBy, boolean asc) { - EasyCriteria criteria = EasyCriteriaFactory.createQueryCriteria(em, - getType()); - criteria.setMaxResults(count); - criteria.setFirstResult(startIndex); + + CriteriaQuery query = builder.createQuery(getType()); + Root root = query.from(getType()); + if (asc) { - criteria.orderByAsc(orderBy); + query.orderBy(builder.asc(root.get(orderBy))); } else { - criteria.orderByDesc(orderBy); + query.orderBy(builder.desc(root.get(orderBy))); } - return criteria.getResultList(); + + TypedQuery q = em.createQuery(query); + q.setMaxResults(count); + q.setFirstResult(startIndex); + return q.getResultList(); } public long getCount() { @@ -107,10 +111,12 @@ public abstract class GenericDAO { return em.createQuery(query).getSingleResult(); } - public List findByField(Attribute field, V value) { - EasyCriteria criteria = createCriteria(); - criteria.andEquals(field.getName(), value); - return criteria.getResultList(); + protected List findByField(Attribute field, V value) { + CriteriaQuery query = builder.createQuery(getType()); + Root root = query.from(getType()); + + query.where(builder.equal(root.get(field.getName()), value)); + return em.createQuery(query).getResultList(); } protected void limit(TypedQuery query, int offset, int limit) { @@ -126,8 +132,4 @@ public abstract class GenericDAO { protected Class getType() { return (Class) type.getRawType(); } - - public EasyCriteria createCriteria() { - return EasyCriteriaFactory.createQueryCriteria(em, getType()); - } } diff --git a/src/main/java/com/commafeed/backend/dao/UserRoleDAO.java b/src/main/java/com/commafeed/backend/dao/UserRoleDAO.java index 38639372..d12ee8c6 100644 --- a/src/main/java/com/commafeed/backend/dao/UserRoleDAO.java +++ b/src/main/java/com/commafeed/backend/dao/UserRoleDAO.java @@ -4,25 +4,28 @@ import java.util.List; import java.util.Set; import javax.ejb.Stateless; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.JoinType; +import javax.persistence.criteria.Root; import com.commafeed.backend.model.User; import com.commafeed.backend.model.UserRole; import com.commafeed.backend.model.UserRole.Role; import com.commafeed.backend.model.UserRole_; import com.google.common.collect.Sets; -import com.uaihebert.factory.EasyCriteriaFactory; -import com.uaihebert.model.EasyCriteria; @Stateless public class UserRoleDAO extends GenericDAO { @Override public List findAll() { - EasyCriteria criteria = EasyCriteriaFactory - .createQueryCriteria(em, getType()); - criteria.setDistinctTrue(); - criteria.leftJoinFetch(UserRole_.user.getName()); - return criteria.getResultList(); + CriteriaQuery query = builder.createQuery(getType()); + Root root = query.from(getType()); + query.distinct(true); + + root.fetch(UserRole_.user, JoinType.LEFT); + + return em.createQuery(query).getResultList(); } public List findAll(User user) { diff --git a/src/main/java/com/commafeed/backend/dao/UserSettingsDAO.java b/src/main/java/com/commafeed/backend/dao/UserSettingsDAO.java index aaee4ed9..b22d806a 100644 --- a/src/main/java/com/commafeed/backend/dao/UserSettingsDAO.java +++ b/src/main/java/com/commafeed/backend/dao/UserSettingsDAO.java @@ -2,25 +2,26 @@ package com.commafeed.backend.dao; import javax.ejb.Stateless; import javax.persistence.NoResultException; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; import com.commafeed.backend.model.User; import com.commafeed.backend.model.UserSettings; import com.commafeed.backend.model.UserSettings_; -import com.uaihebert.factory.EasyCriteriaFactory; -import com.uaihebert.model.EasyCriteria; @Stateless public class UserSettingsDAO extends GenericDAO { public UserSettings findByUser(User user) { - EasyCriteria criteria = EasyCriteriaFactory - .createQueryCriteria(em, getType()); - criteria.andEquals(UserSettings_.user.getName(), user); + CriteriaQuery query = builder.createQuery(getType()); + Root root = query.from(getType()); + + query.where(builder.equal(root.get(UserSettings_.user), user)); UserSettings settings = null; try { - settings = criteria.getSingleResult(); + settings = em.createQuery(query).getSingleResult(); } catch (NoResultException e) { settings = null; } From d639f944bfcb0ccf5d2c6627531f86441a709a17 Mon Sep 17 00:00:00 2001 From: Athou Date: Sat, 8 Jun 2013 16:55:22 +0200 Subject: [PATCH 6/7] make sure the feed has been updated in the database so that the callback works --- .../backend/pubsubhubbub/SubscriptionHandler.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/com/commafeed/backend/pubsubhubbub/SubscriptionHandler.java b/src/main/java/com/commafeed/backend/pubsubhubbub/SubscriptionHandler.java index 263ee5e7..b8eaf8fe 100644 --- a/src/main/java/com/commafeed/backend/pubsubhubbub/SubscriptionHandler.java +++ b/src/main/java/com/commafeed/backend/pubsubhubbub/SubscriptionHandler.java @@ -36,6 +36,15 @@ public class SubscriptionHandler { FeedDAO feedDAO; public void subscribe(Feed feed) { + + try { + // make sure the feed has been updated in the database so that the + // callback works + Thread.sleep(30000); + } catch (InterruptedException e1) { + // do nothing + } + String hub = feed.getPushHub(); String topic = feed.getPushTopic(); String publicUrl = FeedUtils From 23dd016f428660aab9bcf47438e318eb7f7a76b7 Mon Sep 17 00:00:00 2001 From: Athou Date: Sat, 8 Jun 2013 17:00:36 +0200 Subject: [PATCH 7/7] lazy load feeds from entries --- .../commafeed/backend/dao/FeedEntryDAO.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryDAO.java b/src/main/java/com/commafeed/backend/dao/FeedEntryDAO.java index 2b5586d0..b84b9301 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryDAO.java @@ -10,6 +10,7 @@ import javax.persistence.criteria.Root; import javax.persistence.criteria.SetJoin; import org.apache.commons.codec.digest.DigestUtils; +import org.hibernate.Hibernate; import com.commafeed.backend.model.Feed; import com.commafeed.backend.model.FeedEntry; @@ -25,12 +26,16 @@ public class FeedEntryDAO extends GenericDAO { CriteriaQuery query = builder.createQuery(getType()); Root root = query.from(getType()); - + query.distinct(true); query.where(builder.equal(root.get(FeedEntry_.guidHash), hash)); - root.fetch(FeedEntry_.feeds, JoinType.LEFT); + TypedQuery q = em.createQuery(query); - return q.getResultList(); + List list = q.getResultList(); + for (FeedEntry entry : list) { + Hibernate.initialize(entry.getFeeds()); + } + return list; } public List findByGuids(List guids) { @@ -41,19 +46,24 @@ public class FeedEntryDAO extends GenericDAO { CriteriaQuery query = builder.createQuery(getType()); Root root = query.from(getType()); - + query.distinct(true); query.where(root.get(FeedEntry_.guidHash).in(hashes)); root.fetch(FeedEntry_.feeds, JoinType.LEFT); + TypedQuery q = em.createQuery(query); - return q.getResultList(); + List list = q.getResultList(); + for (FeedEntry entry : list) { + Hibernate.initialize(entry.getFeeds()); + } + return list; } public List findByFeed(Feed feed, int offset, int limit) { CriteriaQuery query = builder.createQuery(getType()); Root root = query.from(getType()); SetJoin feedsJoin = root.join(FeedEntry_.feeds); - + query.distinct(true); query.where(builder.equal(feedsJoin.get(Feed_.id), feed.getId())); query.orderBy(builder.desc(root.get(FeedEntry_.updated)));