diff --git a/src/main/java/com/commafeed/backend/StartupBean.java b/src/main/java/com/commafeed/backend/StartupBean.java index f501e7cb..fd7c9cff 100644 --- a/src/main/java/com/commafeed/backend/StartupBean.java +++ b/src/main/java/com/commafeed/backend/StartupBean.java @@ -44,6 +44,7 @@ public class StartupBean { if (userService.getCount() == 0) { log.info("Populating database with default values"); + User user = new User(); byte[] salt = encryptionService.generateSalt(); user.setName("admin"); @@ -52,13 +53,21 @@ public class StartupBean { salt)); userService.save(user); + User testUser = new User(); + byte[] saltTest = encryptionService.generateSalt(); + testUser.setName("test"); + testUser.setSalt(saltTest); + testUser.setPassword(encryptionService.getEncryptedPassword("test", + saltTest)); + userService.save(testUser); + Feed dilbert = new Feed( "http://feed.dilbert.com/dilbert/daily_strip"); feedService.save(dilbert); Feed engadget = new Feed("http://www.engadget.com/rss.xml"); feedService.save(engadget); - + Feed frandroid = new Feed("http://feeds.feedburner.com/frandroid"); feedService.save(frandroid); @@ -92,7 +101,7 @@ public class StartupBean { sub2.setTitle("Engadget"); sub2.setUser(user); feedSubscriptionService.save(sub2); - + FeedSubscription sub3 = new FeedSubscription(); sub3.setFeed(frandroid); sub3.setTitle("Frandroid"); diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryService.java b/src/main/java/com/commafeed/backend/dao/FeedEntryService.java index 59a7f333..db3e5065 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryService.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryService.java @@ -65,6 +65,30 @@ public class FeedEntryService extends GenericDAO { return query.getResultList(); } + public List getEntries(User user, boolean unreadOnly) { + return getEntries(user, unreadOnly, -1, -1); + } + + public List getEntries(User user, boolean unreadOnly, + int offset, int limit) { + String queryName = null; + if (unreadOnly) { + queryName = "Entry.unread"; + } else { + queryName = "Entry.all"; + } + Query query = em.createNamedQuery(queryName); + query.setParameter("userId", user.getId()); + query.setParameter("user", user); + if (offset > -1) { + query.setFirstResult(offset); + } + if (limit > -1) { + query.setMaxResults(limit); + } + return buildList(query.getResultList()); + } + public List getEntries(Feed feed, User user, boolean unreadOnly) { return getEntries(feed, user, unreadOnly, -1, -1); @@ -91,13 +115,13 @@ public class FeedEntryService extends GenericDAO { return buildList(query.getResultList()); } - public List getEntries(List categories, User user, - boolean unreadOnly) { + public List getEntries(List categories, + User user, boolean unreadOnly) { return getEntries(categories, user, unreadOnly, -1, -1); } - public List getEntries(List categories, User user, - boolean unreadOnly, int offset, int limit) { + public List getEntries(List categories, + User user, boolean unreadOnly, int offset, int limit) { String queryName = null; if (unreadOnly) { queryName = "Entry.unreadByCategories"; @@ -116,11 +140,11 @@ public class FeedEntryService extends GenericDAO { } return buildList(query.getResultList()); } - + @SuppressWarnings("rawtypes") - private List buildList(List list){ + private List buildList(List list) { List result = Lists.newArrayList(); - for (Object object :list) { + for (Object object : list) { Object[] array = (Object[]) object; FeedEntry entry = (FeedEntry) array[0]; FeedEntryStatus status = (FeedEntryStatus) array[1]; diff --git a/src/main/java/com/commafeed/frontend/pages/LoginPage.java b/src/main/java/com/commafeed/frontend/pages/LoginPage.java index 115a78ba..81fa6c72 100644 --- a/src/main/java/com/commafeed/frontend/pages/LoginPage.java +++ b/src/main/java/com/commafeed/frontend/pages/LoginPage.java @@ -1,11 +1,9 @@ package com.commafeed.frontend.pages; -import org.apache.wicket.markup.html.WebPage; - import com.commafeed.frontend.pages.auth.LoginPanel; @SuppressWarnings("serial") -public class LoginPage extends WebPage { +public class LoginPage extends BasePage { public LoginPage() { add(new LoginPanel("login")); 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 6effa592..c8c26cb2 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/EntriesREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/EntriesREST.java @@ -59,13 +59,6 @@ public class EntriesREST extends AbstractREST { buildEntries(subscription, offset, limit, unreadOnly)); } else { - FeedCategory feedCategory = null; - if (!ALL.equals(id)) { - feedCategory = feedCategoryService.findById(getUser(), - Long.valueOf(id)); - } - List childrenCategories = feedCategoryService - .findAllChildrenCategories(getUser(), feedCategory); List subs = feedSubscriptionService .findAll(getUser()); @@ -76,10 +69,36 @@ public class EntriesREST extends AbstractREST { } }); - entries.setName(ALL.equals(id) ? "All" : feedCategory.getName()); - entries.getEntries().addAll( - buildEntries(childrenCategories, subMapping, offset, limit, - unreadOnly)); + if (ALL.equals(id)) { + entries.setName("All"); + entries.getEntries().addAll( + buildEntries(subMapping, offset, limit, unreadOnly)); + } else { + FeedCategory feedCategory = feedCategoryService.findById( + getUser(), Long.valueOf(id)); + List childrenCategories = feedCategoryService + .findAllChildrenCategories(getUser(), feedCategory); + entries.getEntries().addAll( + buildEntries(childrenCategories, subMapping, offset, + limit, unreadOnly)); + entries.setName(feedCategory.getName()); + + } + + } + + return entries; + } + + private List buildEntries(Map subMapping, + int offset, int limit, boolean unreadOnly) { + List entries = Lists.newArrayList(); + + List unreadEntries = feedEntryService.getEntries( + getUser(), unreadOnly, offset, limit); + for (FeedEntryWithStatus feedEntry : unreadEntries) { + Long id = feedEntry.getEntry().getFeed().getId(); + entries.add(populateEntry(buildEntry(feedEntry), subMapping.get(id))); } return entries; @@ -155,16 +174,20 @@ public class EntriesREST extends AbstractREST { markEntry(entry, read); } } else if (type == Type.category) { - FeedCategory feedCategory = null; - if (!ALL.equals(id)) { - feedCategory = feedCategoryService.findById(getUser(), - Long.valueOf(id)); - } - List childrenCategories = feedCategoryService - .findAllChildrenCategories(getUser(), feedCategory); + List entries = null; + + if (ALL.equals(id)) { + entries = feedEntryService.getEntries(getUser(), false); + } else { + FeedCategory feedCategory = feedCategoryService.findById( + getUser(), Long.valueOf(id)); + List childrenCategories = feedCategoryService + .findAllChildrenCategories(getUser(), feedCategory); + + entries = feedEntryService.getEntries(childrenCategories, + getUser(), false); + } - List entries = feedEntryService.getEntries( - childrenCategories, getUser(), false); for (FeedEntryWithStatus entry : entries) { markEntry(entry, true); } diff --git a/src/main/resources/META-INF/orm.xml b/src/main/resources/META-INF/orm.xml index 2250759b..9eb7e8be 100644 --- a/src/main/resources/META-INF/orm.xml +++ b/src/main/resources/META-INF/orm.xml @@ -8,6 +8,14 @@ select e from FeedEntry e where e.guid in (:guids) order by e.updated desc + + + select e, s from FeedEntry e LEFT JOIN e.statuses s WITH (s.user.id=:userId) where exists (select s2 from FeedSubscription s2 where s2.user=:user and s2.feed = e.feed) and not exists (select s3 from FeedEntryStatus s3 where s3.entry = e and s3.user =:user and s3.read=true) order by e.updated desc + + + select e, s from FeedEntry e LEFT JOIN e.statuses s WITH (s.user.id=:userId) where exists (select s2 from FeedSubscription s2 where s2.user=:user and s2.feed = e.feed) order by e.updated desc + + select e, s from FeedEntry e LEFT JOIN e.statuses s WITH (s.user.id=:userId) where e.feed=:feed and not exists (select s2 from FeedEntryStatus s2 where s2.entry=e and s2.user.id=:userId and s2.read=true) order by e.updated desc