[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