diff --git a/src/main/java/com/commafeed/backend/cache/CacheService.java b/src/main/java/com/commafeed/backend/cache/CacheService.java index 52353bf6..13c19c00 100644 --- a/src/main/java/com/commafeed/backend/cache/CacheService.java +++ b/src/main/java/com/commafeed/backend/cache/CacheService.java @@ -5,10 +5,10 @@ import java.util.List; import org.apache.commons.codec.digest.DigestUtils; import com.commafeed.backend.model.Feed; -import com.commafeed.backend.model.FeedCategory; import com.commafeed.backend.model.FeedEntry; import com.commafeed.backend.model.FeedSubscription; import com.commafeed.backend.model.User; +import com.commafeed.frontend.model.Category; public abstract class CacheService { @@ -22,18 +22,11 @@ public abstract class CacheService { } // user categories - public abstract List getUserCategories(User user); + public abstract Category getUserRootCategory(User user); - public abstract void setUserCategories(User user, List categories); + public abstract void setUserRootCategory(User user, Category category); - public abstract void invalidateUserCategories(User user); - - // subscriptions - public abstract List getUserSubscriptions(User user); - - public abstract void setUserSubscriptions(User user, List subs); - - public abstract void invalidateUserSubscriptions(User user); + public abstract void invalidateUserRootCategory(User... users); // unread count public abstract Long getUnreadCount(FeedSubscription sub); diff --git a/src/main/java/com/commafeed/backend/cache/NoopCacheService.java b/src/main/java/com/commafeed/backend/cache/NoopCacheService.java index 65286e82..39f7c0de 100644 --- a/src/main/java/com/commafeed/backend/cache/NoopCacheService.java +++ b/src/main/java/com/commafeed/backend/cache/NoopCacheService.java @@ -7,9 +7,9 @@ import javax.enterprise.context.ApplicationScoped; import javax.enterprise.inject.Alternative; import com.commafeed.backend.model.Feed; -import com.commafeed.backend.model.FeedCategory; import com.commafeed.backend.model.FeedSubscription; import com.commafeed.backend.model.User; +import com.commafeed.frontend.model.Category; @Alternative @ApplicationScoped @@ -34,39 +34,24 @@ public class NoopCacheService extends CacheService { } - @Override - public List getUserCategories(User user) { - return null; - } - - @Override - public void setUserCategories(User user, List categories) { - - } - - @Override - public void invalidateUserCategories(User user) { - - } - - @Override - public List getUserSubscriptions(User user) { - return null; - } - - @Override - public void setUserSubscriptions(User user, List subs) { - - } - - @Override - public void invalidateUserSubscriptions(User user) { - - } - @Override public void invalidateUnreadCount(FeedSubscription... subs) { } + @Override + public Category getUserRootCategory(User user) { + return null; + } + + @Override + public void setUserRootCategory(User user, Category category) { + + } + + @Override + public void invalidateUserRootCategory(User... users) { + + } + } diff --git a/src/main/java/com/commafeed/backend/cache/RedisCacheService.java b/src/main/java/com/commafeed/backend/cache/RedisCacheService.java index 749c030f..a7ea2f06 100644 --- a/src/main/java/com/commafeed/backend/cache/RedisCacheService.java +++ b/src/main/java/com/commafeed/backend/cache/RedisCacheService.java @@ -16,13 +16,12 @@ import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.Pipeline; import com.commafeed.backend.model.Feed; -import com.commafeed.backend.model.FeedCategory; import com.commafeed.backend.model.FeedSubscription; import com.commafeed.backend.model.Models; import com.commafeed.backend.model.User; +import com.commafeed.frontend.model.Category; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.type.CollectionType; import com.google.api.client.util.Lists; @Alternative @@ -31,9 +30,6 @@ public class RedisCacheService extends CacheService { private static final Logger log = LoggerFactory.getLogger(RedisCacheService.class); private static ObjectMapper mapper = new ObjectMapper(); - private static CollectionType TYPE_LIST_CATEGORIES = mapper.getTypeFactory().constructCollectionType(List.class, FeedCategory.class); - private static CollectionType TYPE_LIST_SUBSCRIPTIONS = mapper.getTypeFactory().constructCollectionType(List.class, - FeedSubscription.class); private JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost"); @@ -72,68 +68,32 @@ public class RedisCacheService extends CacheService { } @Override - public List getUserCategories(User user) { - List cats = null; + public Category getUserRootCategory(User user) { + Category cat = null; Jedis jedis = pool.getResource(); try { - String key = buildRedisUserCategoriesKey(user); + String key = buildRedisUserRootCategoryKey(user); String json = jedis.get(key); if (json != null) { - cats = mapper.readValue(json, TYPE_LIST_CATEGORIES); + cat = mapper.readValue(json, Category.class); } } catch (Exception e) { log.error(e.getMessage(), e); } finally { pool.returnResource(jedis); } - return cats; + return cat; } @Override - public void setUserCategories(User user, List categories) { + public void setUserRootCategory(User user, Category category) { Jedis jedis = pool.getResource(); try { - String key = buildRedisUserCategoriesKey(user); + String key = buildRedisUserRootCategoryKey(user); Pipeline pipe = jedis.pipelined(); pipe.del(key); - pipe.set(key, mapper.writeValueAsString(categories)); - pipe.expire(key, (int) TimeUnit.MINUTES.toSeconds(30)); - pipe.sync(); - } catch (JsonProcessingException e) { - log.error(e.getMessage(), e); - } finally { - pool.returnResource(jedis); - } - } - - @Override - public List getUserSubscriptions(User user) { - List subs = null; - Jedis jedis = pool.getResource(); - try { - String key = buildRedisUserSubscriptionsKey(user); - String json = jedis.get(key); - if (json != null) { - subs = mapper.readValue(json, TYPE_LIST_SUBSCRIPTIONS); - } - } catch (Exception e) { - log.error(e.getMessage(), e); - } finally { - pool.returnResource(jedis); - } - return subs; - } - - @Override - public void setUserSubscriptions(User user, List subs) { - Jedis jedis = pool.getResource(); - try { - String key = buildRedisUserSubscriptionsKey(user); - - Pipeline pipe = jedis.pipelined(); - pipe.del(key); - pipe.set(key, mapper.writeValueAsString(subs)); + pipe.set(key, mapper.writeValueAsString(category)); pipe.expire(key, (int) TimeUnit.MINUTES.toSeconds(30)); pipe.sync(); } catch (JsonProcessingException e) { @@ -180,22 +140,17 @@ public class RedisCacheService extends CacheService { } @Override - public void invalidateUserCategories(User user) { + public void invalidateUserRootCategory(User... users) { Jedis jedis = pool.getResource(); try { - String key = buildRedisUserCategoriesKey(user); - jedis.del(key); - } finally { - pool.returnResource(jedis); - } - } - - @Override - public void invalidateUserSubscriptions(User user) { - Jedis jedis = pool.getResource(); - try { - String key = buildRedisUserSubscriptionsKey(user); - jedis.del(key); + Pipeline pipe = jedis.pipelined(); + if (users != null) { + for (User user : users) { + String key = buildRedisUserRootCategoryKey(user); + pipe.del(key); + } + } + pipe.sync(); } finally { pool.returnResource(jedis); } @@ -222,14 +177,10 @@ public class RedisCacheService extends CacheService { return "f:" + Models.getId(feed); } - private String buildRedisUserCategoriesKey(User user) { + private String buildRedisUserRootCategoryKey(User user) { return "c:" + Models.getId(user); } - private String buildRedisUserSubscriptionsKey(User user) { - return "s:" + Models.getId(user); - } - private String buildRedisUnreadCountKey(FeedSubscription sub) { return "u:" + Models.getId(sub); } diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryDAO.java b/src/main/java/com/commafeed/backend/dao/FeedEntryDAO.java index 4311201e..8b50dd2e 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryDAO.java @@ -4,7 +4,6 @@ import java.util.Date; import java.util.List; import javax.ejb.Stateless; -import javax.inject.Inject; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; @@ -17,15 +16,11 @@ import org.slf4j.LoggerFactory; import com.commafeed.backend.model.FeedEntry; import com.commafeed.backend.model.FeedEntry_; import com.commafeed.backend.model.Feed_; -import com.commafeed.backend.services.ApplicationSettingsService; import com.google.common.collect.Iterables; @Stateless public class FeedEntryDAO extends GenericDAO { - @Inject - ApplicationSettingsService applicationSettingsService; - protected static final Logger log = LoggerFactory.getLogger(FeedEntryDAO.class); public FeedEntry findExisting(String guid, String url, Long feedId) { diff --git a/src/main/java/com/commafeed/backend/feeds/OPMLImporter.java b/src/main/java/com/commafeed/backend/feeds/OPMLImporter.java index 6733a55d..b41e17bc 100644 --- a/src/main/java/com/commafeed/backend/feeds/OPMLImporter.java +++ b/src/main/java/com/commafeed/backend/feeds/OPMLImporter.java @@ -97,7 +97,6 @@ public class OPMLImporter { log.error("error while importing {}: {}", outline.getXmlUrl(), e.getMessage()); } } - cache.invalidateUserCategories(user); - cache.invalidateUserSubscriptions(user); + cache.invalidateUserRootCategory(user); } } diff --git a/src/main/java/com/commafeed/backend/services/FeedCategoryService.java b/src/main/java/com/commafeed/backend/services/FeedCategoryService.java deleted file mode 100644 index b494bf0b..00000000 --- a/src/main/java/com/commafeed/backend/services/FeedCategoryService.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.commafeed.backend.services; - -import java.util.List; - -import javax.inject.Inject; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.commafeed.backend.cache.CacheService; -import com.commafeed.backend.dao.FeedCategoryDAO; -import com.commafeed.backend.model.FeedCategory; -import com.commafeed.backend.model.Models; -import com.commafeed.backend.model.User; - -public class FeedCategoryService { - private static Logger log = LoggerFactory.getLogger(FeedSubscriptionService.class); - - @Inject - FeedCategoryDAO feedCategoryDAO; - - @Inject - CacheService cache; - - public List getCategories(User user) { - List list = cache.getUserCategories(user); - if (list == null) { - log.debug("cat list miss for {}", Models.getId(user)); - list = feedCategoryDAO.findAll(user); - cache.setUserCategories(user, list); - } - return list; - } - -} diff --git a/src/main/java/com/commafeed/backend/services/FeedEntryService.java b/src/main/java/com/commafeed/backend/services/FeedEntryService.java index 02b4ebab..a47ace05 100644 --- a/src/main/java/com/commafeed/backend/services/FeedEntryService.java +++ b/src/main/java/com/commafeed/backend/services/FeedEntryService.java @@ -47,6 +47,7 @@ public class FeedEntryService { status.setRead(read); feedEntryStatusDAO.saveOrUpdate(status); cache.invalidateUnreadCount(sub); + cache.invalidateUserRootCategory(user); } } @@ -67,10 +68,11 @@ public class FeedEntryService { feedEntryStatusDAO.saveOrUpdate(status); } - public void markSubscriptionEntries(List subscriptions, Date olderThan) { + public void markSubscriptionEntries(User user, List subscriptions, Date olderThan) { List statuses = feedEntryStatusDAO.findBySubscriptions(subscriptions, true, null, null, -1, -1, null, false); markList(statuses, olderThan); cache.invalidateUnreadCount(subscriptions.toArray(new FeedSubscription[0])); + cache.invalidateUserRootCategory(user); } public void markStarredEntries(User user, Date olderThan) { diff --git a/src/main/java/com/commafeed/backend/services/FeedSubscriptionService.java b/src/main/java/com/commafeed/backend/services/FeedSubscriptionService.java index 26b2fbb4..81ebf654 100644 --- a/src/main/java/com/commafeed/backend/services/FeedSubscriptionService.java +++ b/src/main/java/com/commafeed/backend/services/FeedSubscriptionService.java @@ -80,31 +80,21 @@ public class FeedSubscriptionService { feedSubscriptionDAO.saveOrUpdate(sub); taskGiver.add(feed); - cache.invalidateUserSubscriptions(user); + cache.invalidateUserRootCategory(user); return feed; } - - public boolean unsubscribe(User user, Long subId){ + + public boolean unsubscribe(User user, Long subId) { FeedSubscription sub = feedSubscriptionDAO.findById(user, subId); if (sub != null) { feedSubscriptionDAO.delete(sub); - cache.invalidateUserSubscriptions(user); + cache.invalidateUserRootCategory(user); return true; } else { return false; } } - public List getSubscriptions(User user) { - List list = cache.getUserSubscriptions(user); - if (list == null) { - log.debug("sub list miss for {}", Models.getId(user)); - list = feedSubscriptionDAO.findAll(user); - cache.setUserSubscriptions(user, list); - } - return list; - } - public Long getUnreadCount(FeedSubscription sub) { Long count = cache.getUnreadCount(sub); if (count == null) { @@ -117,7 +107,7 @@ public class FeedSubscriptionService { public Map getUnreadCount(User user) { Map map = Maps.newHashMap(); - List subs = getSubscriptions(user); + List subs = feedSubscriptionDAO.findAll(user); for (FeedSubscription sub : subs) { map.put(sub.getId(), getUnreadCount(sub)); } diff --git a/src/main/java/com/commafeed/backend/services/FeedUpdateService.java b/src/main/java/com/commafeed/backend/services/FeedUpdateService.java index 6342d630..d27449fb 100644 --- a/src/main/java/com/commafeed/backend/services/FeedUpdateService.java +++ b/src/main/java/com/commafeed/backend/services/FeedUpdateService.java @@ -70,5 +70,6 @@ public class FeedUpdateService { feedEntryDAO.saveOrUpdate(entry); metricsBean.entryInserted(); cache.invalidateUnreadCount(subscriptions.toArray(new FeedSubscription[0])); + cache.invalidateUserRootCategory(users.toArray(new User[0])); } } 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 89e11292..60b88c50 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/CategoryREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/CategoryREST.java @@ -33,7 +33,6 @@ import com.commafeed.backend.model.FeedSubscription; import com.commafeed.backend.model.User; import com.commafeed.backend.model.UserRole.Role; import com.commafeed.backend.model.UserSettings.ReadingOrder; -import com.commafeed.backend.services.FeedCategoryService; import com.commafeed.backend.services.FeedEntryService; import com.commafeed.backend.services.FeedSubscriptionService; import com.commafeed.frontend.SecurityCheck; @@ -82,9 +81,6 @@ public class CategoryREST extends AbstractResourceREST { @Inject FeedSubscriptionService feedSubscriptionService; - @Inject - FeedCategoryService feedCategoryService; - @Inject CacheService cache; @@ -214,15 +210,15 @@ public class CategoryREST extends AbstractResourceREST { Date olderThan = req.getOlderThan() == null ? null : new Date(req.getOlderThan()); if (ALL.equals(req.getId())) { - List subscriptions = feedSubscriptionService.getSubscriptions(getUser()); - feedEntryService.markSubscriptionEntries(subscriptions, olderThan); + List subscriptions = feedSubscriptionDAO.findAll(getUser()); + feedEntryService.markSubscriptionEntries(getUser(), subscriptions, olderThan); } else if (STARRED.equals(req.getId())) { feedEntryService.markStarredEntries(getUser(), olderThan); } else { FeedCategory parent = feedCategoryDAO.findById(getUser(), Long.valueOf(req.getId())); List categories = feedCategoryDAO.findAllChildrenCategories(getUser(), parent); List subs = feedSubscriptionDAO.findByCategories(getUser(), categories); - feedEntryService.markSubscriptionEntries(subs, olderThan); + feedEntryService.markSubscriptionEntries(getUser(), subs, olderThan); } return Response.ok(Status.OK).build(); } @@ -245,7 +241,7 @@ public class CategoryREST extends AbstractResourceREST { cat.setParent(parent); } feedCategoryDAO.saveOrUpdate(cat); - cache.invalidateUserCategories(getUser()); + cache.invalidateUserRootCategory(getUser()); return Response.ok().build(); } @@ -273,7 +269,7 @@ public class CategoryREST extends AbstractResourceREST { feedCategoryDAO.saveOrUpdate(categories); feedCategoryDAO.delete(cat); - cache.invalidateUserCategories(getUser()); + cache.invalidateUserRootCategory(getUser()); return Response.ok().build(); } else { return Response.status(Status.NOT_FOUND).build(); @@ -329,7 +325,7 @@ public class CategoryREST extends AbstractResourceREST { } feedCategoryDAO.saveOrUpdate(category); - cache.invalidateUserCategories(getUser()); + cache.invalidateUserRootCategory(getUser()); return Response.ok(Status.OK).build(); } @@ -346,7 +342,7 @@ public class CategoryREST extends AbstractResourceREST { } category.setCollapsed(req.isCollapse()); feedCategoryDAO.saveOrUpdate(category); - cache.invalidateUserCategories(getUser()); + cache.invalidateUserRootCategory(getUser()); return Response.ok(Status.OK).build(); } @@ -371,14 +367,18 @@ public class CategoryREST extends AbstractResourceREST { public Response getSubscriptions() { User user = getUser(); - Category root = null; - List categories = feedCategoryService.getCategories(user); - List subscriptions = feedSubscriptionService.getSubscriptions(getUser()); - Map unreadCount = feedSubscriptionService.getUnreadCount(getUser()); + Category root = cache.getUserRootCategory(user); + if (root == null) { + log.debug("cat miss for {}", user.getId()); + List categories = feedCategoryDAO.findAll(user); + List subscriptions = feedSubscriptionDAO.findAll(user); + Map unreadCount = feedSubscriptionService.getUnreadCount(user); - root = buildCategory(null, categories, subscriptions, unreadCount); - root.setId("all"); - root.setName("All"); + root = buildCategory(null, categories, subscriptions, unreadCount); + root.setId("all"); + root.setName("All"); + cache.setUserRootCategory(user, root); + } return Response.ok(root).build(); } 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 c699a85f..3f9ca8cf 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java @@ -278,7 +278,7 @@ public class FeedREST extends AbstractResourceREST { FeedSubscription subscription = feedSubscriptionDAO.findById(getUser(), Long.valueOf(req.getId())); if (subscription != null) { - feedEntryService.markSubscriptionEntries(Arrays.asList(subscription), olderThan); + feedEntryService.markSubscriptionEntries(getUser(), Arrays.asList(subscription), olderThan); } return Response.ok(Status.OK).build(); } @@ -446,7 +446,7 @@ public class FeedREST extends AbstractResourceREST { } else { feedSubscriptionDAO.saveOrUpdate(subscription); } - cache.invalidateUserSubscriptions(getUser()); + cache.invalidateUserRootCategory(getUser()); return Response.ok(Status.OK).build(); }