[jboss-cvs] JBossBlog SVN: r175 - in trunk/src/action/org/jboss/blog/session: converter/cached and 1 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Fri Jan 18 14:09:09 EST 2008
Author: adamw
Date: 2008-01-18 14:09:09 -0500 (Fri, 18 Jan 2008)
New Revision: 175
Added:
trunk/src/action/org/jboss/blog/session/cache/CacheManager.java
trunk/src/action/org/jboss/blog/session/cache/FeedsServiceGetFeedInterceptor.java
trunk/src/action/org/jboss/blog/session/cache/FeedsServiceGetPostsInterceptor.java
Modified:
trunk/src/action/org/jboss/blog/session/cache/FeedsChangesObserver.java
trunk/src/action/org/jboss/blog/session/converter/cached/CachedFeedConverter.java
trunk/src/action/org/jboss/blog/session/converter/cached/CachedPostConverter.java
trunk/src/action/org/jboss/blog/session/feed/FeedsServiceImpl.java
Log:
Added: trunk/src/action/org/jboss/blog/session/cache/CacheManager.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/cache/CacheManager.java (rev 0)
+++ trunk/src/action/org/jboss/blog/session/cache/CacheManager.java 2008-01-18 19:09:09 UTC (rev 175)
@@ -0,0 +1,137 @@
+package org.jboss.blog.session.cache;
+
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Logger;
+import org.jboss.seam.log.Log;
+import org.jboss.cache.aop.PojoCache;
+import org.jboss.cache.Fqn;
+import org.jboss.cache.CacheException;
+import org.jboss.blog.model.feed.Feed;
+import org.jboss.blog.model.Post;
+
+import java.lang.ref.SoftReference;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:adam at warski.org">Adam Warski</a>
+ */
+ at Name("cacheManager")
+public class CacheManager {
+ @In
+ private PojoCache pojoCache;
+
+ @Logger
+ private Log log;
+
+ private final static Fqn BASE_FQN = new Fqn("blog");
+ private final static Object CACHE_MAP_KEY = new Object();
+
+ //
+
+ public void evictAll() {
+ try {
+ log.debug("Evicting all feeds from the cache.");
+ pojoCache.remove(BASE_FQN);
+ } catch (CacheException e) {
+ log.error(e);
+ }
+ }
+
+ //
+
+ private Fqn getFeedFqn(String feedName) {
+ return new Fqn(BASE_FQN, feedName);
+ }
+
+ public void putFeed(Feed feed) {
+ try {
+ log.debug("Putting feed '#0' into the cache.", feed.getName());
+ pojoCache.put(getFeedFqn(feed.getName()), CACHE_MAP_KEY, new SoftReference<Feed>(feed));
+ } catch (CacheException e) {
+ log.error(e);
+ }
+ }
+
+ public Feed getFeed(String feedName) {
+ try {
+ //noinspection unchecked
+ Feed inCache = ((SoftReference<Feed>) pojoCache.get(getFeedFqn(feedName), CACHE_MAP_KEY)).get();
+ log.debug("Getting feed '#0' from the cache, result: #1.", feedName, inCache);
+ return inCache;
+ } catch (CacheException e) {
+ log.error(e);
+ return null;
+ }
+ }
+
+ public void evictFeed(String feedName) {
+ try {
+ log.debug("Evicting feed '#0' from the cache.", feedName);
+ pojoCache.remove(getFeedFqn(feedName));
+ } catch (CacheException e) {
+ log.error(e);
+ }
+ }
+
+ //
+
+ private Fqn getFeedPostsFqn(String feedName, int from, int to) {
+ return new Fqn(BASE_FQN, feedName, from, to);
+ }
+
+ public void putFeedPosts(Feed feed, List<Post> posts, int from, int to) {
+ try {
+ log.debug("Putting feed '#0' posts into the cache, from #1 to #2.", feed.getName(), from, to);
+ pojoCache.put(getFeedPostsFqn(feed.getName(), from, to), CACHE_MAP_KEY,
+ new SoftReference<List<Post>>(posts));
+ } catch (CacheException e) {
+ log.error(e);
+ }
+ }
+
+ public List<Post> getFeedPosts(String feedName, int from, int to) {
+ try {
+ //noinspection unchecked
+ List<Post> inCache = ((SoftReference<List<Post>>) pojoCache.get(getFeedPostsFqn(feedName,
+ from, to), CACHE_MAP_KEY)).get();
+ log.debug("Getting feed '#0' posts from the cache, from #1 to #2, result: #3.",
+ feedName, from, to, inCache);
+ return inCache;
+ } catch (CacheException e) {
+ log.error(e);
+ return null;
+ }
+ }
+
+ //
+
+ private final static Object POSTS_INDIVIDUAL = new Object();
+
+ private Fqn getFeedPostFqn(String titleAsId) {
+ return new Fqn(BASE_FQN, POSTS_INDIVIDUAL, titleAsId);
+ }
+
+ public void putFeedPost(Post post) {
+ try {
+ log.debug("Putting post '#0' into the cache.", post.getTitleAsId());
+ pojoCache.put(getFeedPostFqn(post.getTitleAsId()), CACHE_MAP_KEY,
+ new SoftReference<Post>(post));
+ } catch (CacheException e) {
+ log.error(e);
+ }
+ }
+
+ public Post getFeedPost(String titleAsId) {
+ try {
+ //noinspection unchecked
+ Post inCache = ((SoftReference<Post>) pojoCache.get(getFeedPostFqn(titleAsId),
+ CACHE_MAP_KEY)).get();
+ log.debug("Getting post '#0' from the cache, result: #1.", titleAsId, inCache);
+ return inCache;
+ } catch (CacheException e) {
+ log.error(e);
+ return null;
+ }
+ }
+}
Modified: trunk/src/action/org/jboss/blog/session/cache/FeedsChangesObserver.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/cache/FeedsChangesObserver.java 2008-01-17 20:43:01 UTC (rev 174)
+++ trunk/src/action/org/jboss/blog/session/cache/FeedsChangesObserver.java 2008-01-18 19:09:09 UTC (rev 175)
@@ -3,10 +3,6 @@
import org.jboss.seam.annotations.Observer;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.In;
-import org.jboss.seam.annotations.Logger;
-import org.jboss.seam.log.Log;
-import org.jboss.cache.aop.PojoCache;
-import org.jboss.cache.CacheException;
/**
* @author <a href="mailto:adam at warski.org">Adam Warski</a>
@@ -14,21 +10,25 @@
@Name("feedsChangesObserver")
public class FeedsChangesObserver {
@In
- private PojoCache pojoCache;
-
- @Logger
- private Log log;
+ private CacheManager cacheManager;
- @Observer({"org.jboss.blog.feed.updated", "org.jboss.blog.feed.removed"})
+ @Observer({"org.jboss.blog.feed.updated", "org.jboss.blog.feed.deleted"})
public void feedUpdated(String feedName) {
- try {
- String s = (String) pojoCache.get("/a/b/c", "x");
- pojoCache.put("/a/b/c", "x", "y" + s);
+ cacheManager.evictAll();
+ }
- log.debug("Current cache: " + s);
- } catch (CacheException e) {
- e.printStackTrace();
- }
- log.debug("Feed updated: " + feedName);
+ @Observer({"org.jboss.blog.feed.added"})
+ public void feedAdded(String feedName) {
+ cacheManager.evictAll();
}
+
+ @Observer({"org.jboss.blog.post.updated", "org.jboss.blog.post.deleted"})
+ public void postUpdated(String postTitleAsId, String feedName) {
+ cacheManager.evictAll();
+ }
+
+ @Observer("org.jboss.blog.post.added")
+ public void postAdded(String postTitleAsId, String feedName) {
+ cacheManager.evictAll();
+ }
}
Added: trunk/src/action/org/jboss/blog/session/cache/FeedsServiceGetFeedInterceptor.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/cache/FeedsServiceGetFeedInterceptor.java (rev 0)
+++ trunk/src/action/org/jboss/blog/session/cache/FeedsServiceGetFeedInterceptor.java 2008-01-18 19:09:09 UTC (rev 175)
@@ -0,0 +1,28 @@
+package org.jboss.blog.session.cache;
+
+import org.jboss.seam.intercept.InvocationContext;
+import org.jboss.seam.annotations.intercept.AroundInvoke;
+import org.jboss.seam.annotations.intercept.Interceptor;
+import org.jboss.seam.Component;
+import org.jboss.blog.model.feed.Feed;
+
+/**
+ * @author <a href="mailto:adam at warski.org">Adam Warski</a>
+ */
+ at Interceptor(stateless = true)
+public class FeedsServiceGetFeedInterceptor {
+ @AroundInvoke
+ public Object cachePosts(InvocationContext invocation) throws Exception {
+ CacheManager cacheManager = (CacheManager) Component.getInstance("cacheManager");
+
+ String feedName = (String) invocation.getParameters()[0];
+
+ Feed inCache = cacheManager.getFeed(feedName);
+
+ if (inCache != null) {
+ return inCache;
+ } else {
+ return invocation.proceed();
+ }
+ }
+}
\ No newline at end of file
Added: trunk/src/action/org/jboss/blog/session/cache/FeedsServiceGetPostsInterceptor.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/cache/FeedsServiceGetPostsInterceptor.java (rev 0)
+++ trunk/src/action/org/jboss/blog/session/cache/FeedsServiceGetPostsInterceptor.java 2008-01-18 19:09:09 UTC (rev 175)
@@ -0,0 +1,16 @@
+package org.jboss.blog.session.cache;
+
+import org.jboss.seam.intercept.InvocationContext;
+import org.jboss.seam.annotations.intercept.AroundInvoke;
+import org.jboss.seam.annotations.intercept.Interceptor;
+
+/**
+ * @author <a href="mailto:adam at warski.org">Adam Warski</a>
+ */
+ at Interceptor(stateless = true)
+public class FeedsServiceGetPostsInterceptor {
+ @AroundInvoke
+ public Object cachePosts(InvocationContext invocation) throws Exception {
+ return invocation.proceed();
+ }
+}
Modified: trunk/src/action/org/jboss/blog/session/converter/cached/CachedFeedConverter.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/converter/cached/CachedFeedConverter.java 2008-01-17 20:43:01 UTC (rev 174)
+++ trunk/src/action/org/jboss/blog/session/converter/cached/CachedFeedConverter.java 2008-01-18 19:09:09 UTC (rev 175)
@@ -1,7 +1,8 @@
package org.jboss.blog.session.converter.cached;
import org.jboss.blog.model.feed.Feed;
-import org.jboss.blog.service.FeedNotFoundException;
+import org.jboss.blog.session.cache.CacheManager;
+import org.jboss.blog.session.converter.FeedConverter;
import org.jboss.seam.Component;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Transactional;
@@ -10,8 +11,6 @@
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceException;
/**
* @author <a href="mailto:adam at warski.org">Adam Warski</a>
@@ -19,26 +18,17 @@
@Name("cachedFeedConverter")
@BypassInterceptors
@Converter
-public class CachedFeedConverter implements javax.faces.convert.Converter {
+public class CachedFeedConverter extends FeedConverter {
@Transactional
public Object getAsObject(FacesContext context, UIComponent cmp, String value) {
- EntityManager entityManager = (EntityManager) Component.getInstance("entityManager");
+ CacheManager cacheManager = (CacheManager) Component.getInstance("cacheManager");
- entityManager.joinTransaction();
+ Feed inCache = cacheManager.getFeed(value);
- if (value != null) {
- value = value.toLowerCase();
+ if (inCache != null) {
+ return inCache;
+ } else {
+ return super.getAsObject(context, cmp, value);
}
-
- try {
- return entityManager.createQuery("select feed from Feed feed where feed.name = ?1")
- .setParameter(1, value).getSingleResult();
- } catch (PersistenceException e) {
- throw new FeedNotFoundException(value, e);
- }
}
-
- public String getAsString(FacesContext context, UIComponent cmp, Object value) {
- return value == null ? null : ((Feed) value).getName();
- }
}
\ No newline at end of file
Modified: trunk/src/action/org/jboss/blog/session/converter/cached/CachedPostConverter.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/converter/cached/CachedPostConverter.java 2008-01-17 20:43:01 UTC (rev 174)
+++ trunk/src/action/org/jboss/blog/session/converter/cached/CachedPostConverter.java 2008-01-18 19:09:09 UTC (rev 175)
@@ -1,7 +1,8 @@
package org.jboss.blog.session.converter.cached;
import org.jboss.blog.model.Post;
-import org.jboss.blog.service.FeedNotFoundException;
+import org.jboss.blog.session.cache.CacheManager;
+import org.jboss.blog.session.converter.PostConverter;
import org.jboss.seam.Component;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Transactional;
@@ -10,8 +11,6 @@
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceException;
/**
* @author <a href="mailto:adam at warski.org">Adam Warski</a>
@@ -19,26 +18,17 @@
@Name("cachedPostConverter")
@BypassInterceptors
@Converter
-public class CachedPostConverter implements javax.faces.convert.Converter {
+public class CachedPostConverter extends PostConverter {
@Transactional
public Object getAsObject(FacesContext context, UIComponent cmp, String value) {
- EntityManager entityManager = (EntityManager) Component.getInstance("entityManager");
+ CacheManager cacheManager = (CacheManager) Component.getInstance("cacheManager");
- entityManager.joinTransaction();
+ Post inCache = cacheManager.getFeedPost(value);
- if (value != null) {
- value = value.toLowerCase();
+ if (inCache != null) {
+ return inCache;
+ } else {
+ return super.getAsObject(context, cmp, value);
}
-
- try {
- return entityManager.createQuery("select post from Post post where post.titleAsId = ?1")
- .setParameter(1, value).getSingleResult();
- } catch (PersistenceException e) {
- throw new FeedNotFoundException(value, e);
- }
}
-
- public String getAsString(FacesContext context, UIComponent cmp, Object value) {
- return value == null ? null : ((Post) value).getTitleAsId();
- }
}
\ No newline at end of file
Modified: trunk/src/action/org/jboss/blog/session/feed/FeedsServiceImpl.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/feed/FeedsServiceImpl.java 2008-01-17 20:43:01 UTC (rev 174)
+++ trunk/src/action/org/jboss/blog/session/feed/FeedsServiceImpl.java 2008-01-18 19:09:09 UTC (rev 175)
@@ -5,6 +5,8 @@
import org.jboss.blog.service.FeedNotFoundException;
import org.jboss.blog.service.FeedsService;
import org.jboss.blog.session.feed.type.FeedTypes;
+import org.jboss.blog.session.cache.FeedsServiceGetPostsInterceptor;
+import org.jboss.blog.session.cache.FeedsServiceGetFeedInterceptor;
import org.jboss.seam.annotations.AutoCreate;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
@@ -13,6 +15,7 @@
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
+import javax.interceptor.Interceptors;
import java.util.List;
/**
@@ -33,6 +36,7 @@
return entityManager.createQuery("select feed from Feed feed order by feed.name").getResultList();
}
+ @Interceptors(FeedsServiceGetFeedInterceptor.class)
public Feed getFeed(String feedName) throws FeedNotFoundException {
try {
return (Feed) entityManager.createQuery("select feed from Feed feed where feed.name = ?1")
@@ -41,7 +45,8 @@
throw new FeedNotFoundException();
}
}
-
+
+ @Interceptors(FeedsServiceGetPostsInterceptor.class)
public List<Post> getPosts(Feed feed, int from, int to) {
return feedTypes.getFeedDao(feed).getPosts(from, to);
}
More information about the jboss-cvs-commits
mailing list