[jboss-cvs] JBossBlog SVN: r176 - in trunk: src/action/org/jboss/blog/servlet and 10 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Jan 21 12:10:26 EST 2008


Author: adamw
Date: 2008-01-21 12:10:26 -0500 (Mon, 21 Jan 2008)
New Revision: 176

Added:
   trunk/src/action/org/jboss/blog/session/cache/FeedsServiceGetFeedsInterceptor.java
   trunk/src/action/org/jboss/blog/session/cache/FeedsServiceGetPostInterceptor.java
   trunk/src/action/org/jboss/blog/session/cache/XmlServiceWriteXmlInterceptor.java
   trunk/src/action/org/jboss/blog/session/converter/writeable/
   trunk/src/action/org/jboss/blog/session/converter/writeable/WriteableFeedConverter.java
   trunk/src/action/org/jboss/blog/session/converter/writeable/WriteablePostConverter.java
   trunk/src/action/org/jboss/blog/session/xml/content/
   trunk/src/action/org/jboss/blog/session/xml/content/ContentResponse.java
   trunk/src/action/org/jboss/blog/session/xml/content/InMemoryContentResponse.java
   trunk/src/action/org/jboss/blog/session/xml/content/ServletResponseContentResponse.java
   trunk/src/services/org/jboss/blog/service/PostNotFoundException.java
Removed:
   trunk/src/action/org/jboss/blog/session/converter/cached/
Modified:
   trunk/resources/WEB-INF/pages.xml
   trunk/src/action/org/jboss/blog/servlet/FeedsServlet.java
   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
   trunk/src/action/org/jboss/blog/session/converter/FeedConverter.java
   trunk/src/action/org/jboss/blog/session/converter/PostConverter.java
   trunk/src/action/org/jboss/blog/session/feed/FeedsServiceImpl.java
   trunk/src/action/org/jboss/blog/session/search/PostSearchBean.java
   trunk/src/action/org/jboss/blog/session/xml/XmlService.java
   trunk/src/action/org/jboss/blog/session/xml/velocity/VelocityXmlService.java
   trunk/src/services/org/jboss/blog/service/FeedsService.java
   trunk/src/tools/org/jboss/blog/tools/GeneralTools.java
Log:


Modified: trunk/resources/WEB-INF/pages.xml
===================================================================
--- trunk/resources/WEB-INF/pages.xml	2008-01-18 19:09:09 UTC (rev 175)
+++ trunk/resources/WEB-INF/pages.xml	2008-01-21 17:10:26 UTC (rev 176)
@@ -17,12 +17,12 @@
     <!-- View feeds -->
 
     <page view-id="/view/feed.xhtml">
-        <param name="name" converterId="cachedFeedConverter" value="#{feedView.feed}" />
+        <param name="name" converterId="feedConverter" value="#{feedView.feed}" />
         <param name="from" value="#{feedView.from}" />
     </page>
 
     <page view-id="/view/post.xhtml">
-        <param name="post" converterId="cachedPostConverter" value="#{postView.post}" />
+        <param name="post" converterId="postConverter" value="#{postView.post}" />
         <navigation from-action="#{postView.delete}">
             <redirect view-id="/view/feed.xhtml">
                 <param name="name" value="#{postView.post.feed.name}" />
@@ -52,7 +52,7 @@
 
     <page view-id="/manage/feed_edit.xhtml">
         <begin-conversation flush-mode="manual" join="true" />
-        <param name="name" converterId="feedConverter" value="#{feedMod.feed}" />
+        <param name="name" converterId="writeableFeedConverter" value="#{feedMod.feed}" />
         <navigation from-action="#{feedMod.saveExisting}">
             <end-conversation />
             <redirect view-id="/manage/index.xhtml" />
@@ -60,7 +60,7 @@
     </page>
 
     <page view-id="/manage/feed_delete.xhtml">
-        <param name="name" converterId="feedConverter" value="#{feedMod.feed}" />
+        <param name="name" converterId="writeableFeedConverter" value="#{feedMod.feed}" />
         <navigation from-action="#{feedMod.delete}">
             <redirect view-id="/manage/index.xhtml" />
         </navigation>
@@ -77,7 +77,7 @@
 
     <page view-id="/manage/remote/remote_edit.xhtml">
         <begin-conversation flush-mode="manual" join="true" />
-        <param name="name" converterId="feedConverter" value="#{feedMod.feed}" />
+        <param name="name" converterId="writeableFeedConverter" value="#{feedMod.feed}" />
         <navigation from-action="#{remoteFeedMod.saveExisting}">
             <end-conversation />
             <redirect view-id="/manage/index.xhtml" />
@@ -105,7 +105,7 @@
 
     <page view-id="/manage/aggregated/aggregated_edit.xhtml">
         <begin-conversation flush-mode="manual" join="true" />
-        <param name="name" converterId="feedConverter" value="#{feedMod.feed}" />
+        <param name="name" converterId="writeableFeedConverter" value="#{feedMod.feed}" />
         <navigation from-action="#{aggregatedFeedMod.saveExisting}">
             <end-conversation />
             <redirect view-id="/manage/index.xhtml" />

Modified: trunk/src/action/org/jboss/blog/servlet/FeedsServlet.java
===================================================================
--- trunk/src/action/org/jboss/blog/servlet/FeedsServlet.java	2008-01-18 19:09:09 UTC (rev 175)
+++ trunk/src/action/org/jboss/blog/servlet/FeedsServlet.java	2008-01-21 17:10:26 UTC (rev 176)
@@ -3,6 +3,8 @@
 import org.jboss.blog.service.FeedNotFoundException;
 import org.jboss.blog.session.xml.velocity.InvalidTemplateTypeException;
 import org.jboss.blog.session.xml.XmlService;
+import org.jboss.blog.session.xml.content.ContentResponse;
+import org.jboss.blog.session.xml.content.ServletResponseContentResponse;
 import org.jboss.seam.Component;
 import org.jboss.seam.log.Logging;
 
@@ -51,8 +53,10 @@
 
             // TODO: expires, created, if-not-modified-since
 
+            ContentResponse contentResponse = new ServletResponseContentResponse(response);
+
             XmlService xmlService = (XmlService) Component.getInstance("xmlService");
-            xmlService.writeXml(feedType, feedName, response);
+            xmlService.writeXml(feedType, feedName, contentResponse);
             response.getWriter().flush();
 
             if (txStarted) {

Modified: trunk/src/action/org/jboss/blog/session/cache/CacheManager.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/cache/CacheManager.java	2008-01-18 19:09:09 UTC (rev 175)
+++ trunk/src/action/org/jboss/blog/session/cache/CacheManager.java	2008-01-21 17:10:26 UTC (rev 176)
@@ -9,6 +9,7 @@
 import org.jboss.cache.CacheException;
 import org.jboss.blog.model.feed.Feed;
 import org.jboss.blog.model.Post;
+import org.jboss.blog.session.xml.content.InMemoryContentResponse;
 
 import java.lang.ref.SoftReference;
 import java.util.List;
@@ -29,6 +30,16 @@
 
     //
 
+    private <T> T getFromSoftReference(SoftReference<T> reference) {
+        if (reference == null) {
+            return null;
+        }
+
+        return reference.get();
+    }
+
+    //
+
     public void evictAll() {
         try {
             log.debug("Evicting all feeds from the cache.");
@@ -40,6 +51,45 @@
 
     //
 
+    private final static Object ALL_FEEDS = new Object();
+
+    private Fqn getAllFeedsListFqn() {
+        return new Fqn(BASE_FQN, ALL_FEEDS);
+    }
+
+    public void putAllFeedsList(List<Feed> feeds) {
+        try {
+            log.debug("Putting all feeds list into the cache.");
+            pojoCache.put(getAllFeedsListFqn(), CACHE_MAP_KEY, new SoftReference<List<Feed>>(feeds));
+        } catch (CacheException e) {
+            log.error(e);
+        }
+    }
+
+    public List<Feed> getAllFeedsList() {
+        try {
+            //noinspection unchecked
+            List<Feed> inCache = getFromSoftReference((SoftReference<List<Feed>>) pojoCache.get(getAllFeedsListFqn(),
+                    CACHE_MAP_KEY));
+            log.debug("Getting all feeds list from the cache, result: #0.", inCache);
+            return inCache;
+        } catch (CacheException e) {
+            log.error(e);
+            return null;
+        }
+    }
+
+    public void evictAllFeedsList() {
+        try {
+            log.debug("Evicting all feeds list from the cache.");
+            pojoCache.remove(getAllFeedsListFqn());
+        } catch (CacheException e) {
+            log.error(e);
+        }
+    }
+
+    //
+
     private Fqn getFeedFqn(String feedName) {
         return new Fqn(BASE_FQN, feedName);
     }
@@ -56,7 +106,8 @@
     public Feed getFeed(String feedName) {
         try {
             //noinspection unchecked
-            Feed inCache = ((SoftReference<Feed>) pojoCache.get(getFeedFqn(feedName), CACHE_MAP_KEY)).get();
+            Feed inCache = getFromSoftReference((SoftReference<Feed>) pojoCache.get(getFeedFqn(feedName),
+                    CACHE_MAP_KEY));
             log.debug("Getting feed '#0' from the cache, result: #1.", feedName, inCache);
             return inCache;
         } catch (CacheException e) {
@@ -93,8 +144,8 @@
     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();
+            List<Post> inCache = getFromSoftReference(((SoftReference<List<Post>>) pojoCache.get(
+                    getFeedPostsFqn(feedName, from, to), CACHE_MAP_KEY)));
             log.debug("Getting feed '#0' posts from the cache, from #1 to #2, result: #3.",
                     feedName, from, to, inCache);
             return inCache;
@@ -106,27 +157,59 @@
 
     //
 
+    private final static Object FEED_XML = new Object();
+
+    private Fqn getFeedXmlFqn(String feedName, String feedType) {
+        return new Fqn(BASE_FQN, FEED_XML, feedName, feedType == null ? null : feedType.toLowerCase());
+    }
+
+    public void putFeedXml(String feedName, String feedType, InMemoryContentResponse xml) {
+        try {
+            log.debug("Putting xml for feed '#0' to the cache, type: #1.", feedName, feedType);
+            pojoCache.put(getFeedXmlFqn(feedName, feedType), CACHE_MAP_KEY,
+                    new SoftReference<InMemoryContentResponse>(xml));
+        } catch (CacheException e) {
+            log.error(e);
+        }
+    }
+
+    public InMemoryContentResponse getFeedXml(String feedName, String feedType) {
+        try {
+            //noinspection unchecked
+            InMemoryContentResponse inCache = getFromSoftReference(((SoftReference<InMemoryContentResponse>)
+                    pojoCache.get(getFeedXmlFqn(feedName, feedType), CACHE_MAP_KEY)));
+            log.debug("Getting xml for feed '#0' from the cache, type: #1, result: #2.",
+                    feedName, feedType, inCache);
+            return inCache;
+        } catch (CacheException e) {
+            log.error(e);
+            return null;
+        }
+    }
+
+    //
+
     private final static Object POSTS_INDIVIDUAL = new Object();
 
-    private Fqn getFeedPostFqn(String titleAsId) {
+    private Fqn getPostFqn(String titleAsId) {
         return new Fqn(BASE_FQN, POSTS_INDIVIDUAL, titleAsId);
     }
 
-    public void putFeedPost(Post post) {
+    public void putPost(Post post) {
         try {
             log.debug("Putting post '#0' into the cache.", post.getTitleAsId());
-            pojoCache.put(getFeedPostFqn(post.getTitleAsId()), CACHE_MAP_KEY,
+            pojoCache.put(getPostFqn(post.getTitleAsId()), CACHE_MAP_KEY,
                     new SoftReference<Post>(post));
         } catch (CacheException e) {
             log.error(e);
         }
     }
 
-    public Post getFeedPost(String titleAsId) {
+    public Post getPost(String titleAsId) {
         try {
             //noinspection unchecked
-            Post inCache = ((SoftReference<Post>) pojoCache.get(getFeedPostFqn(titleAsId),
-                    CACHE_MAP_KEY)).get();
+            Post inCache = getFromSoftReference(((SoftReference<Post>) pojoCache.get(getPostFqn(titleAsId),
+                    CACHE_MAP_KEY)));
             log.debug("Getting post '#0' from the cache, result: #1.", titleAsId, inCache);
             return inCache;
         } catch (CacheException e) {

Modified: trunk/src/action/org/jboss/blog/session/cache/FeedsServiceGetFeedInterceptor.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/cache/FeedsServiceGetFeedInterceptor.java	2008-01-18 19:09:09 UTC (rev 175)
+++ trunk/src/action/org/jboss/blog/session/cache/FeedsServiceGetFeedInterceptor.java	2008-01-21 17:10:26 UTC (rev 176)
@@ -1,28 +1,40 @@
 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;
 
+import javax.interceptor.AroundInvoke;
+import javax.interceptor.InvocationContext;
+
 /**
  * @author <a href="mailto:adam at warski.org">Adam Warski</a>
  */
 @Interceptor(stateless = true)
 public class FeedsServiceGetFeedInterceptor {
     @AroundInvoke
-    public Object cachePosts(InvocationContext invocation) throws Exception {
+    public Object cacheFeed(InvocationContext invocation) throws Exception {
         CacheManager cacheManager = (CacheManager) Component.getInstance("cacheManager");
 
         String feedName = (String) invocation.getParameters()[0];
+        Boolean writeable = false;
+        if (invocation.getParameters().length > 1) {
+            writeable = (Boolean) invocation.getParameters()[1];
+        }
 
+        if (writeable) {
+            return invocation.proceed();
+        }
+
         Feed inCache = cacheManager.getFeed(feedName);
 
         if (inCache != null) {
             return inCache;
         } else {
-            return invocation.proceed();
+            Feed feed = (Feed) invocation.proceed();
+            cacheManager.putFeed(feed);
+
+            return feed;
         }
     }
 }
\ No newline at end of file

Added: trunk/src/action/org/jboss/blog/session/cache/FeedsServiceGetFeedsInterceptor.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/cache/FeedsServiceGetFeedsInterceptor.java	                        (rev 0)
+++ trunk/src/action/org/jboss/blog/session/cache/FeedsServiceGetFeedsInterceptor.java	2008-01-21 17:10:26 UTC (rev 176)
@@ -0,0 +1,32 @@
+package org.jboss.blog.session.cache;
+
+import org.jboss.seam.annotations.intercept.Interceptor;
+import org.jboss.seam.Component;
+import org.jboss.blog.model.feed.Feed;
+
+import javax.interceptor.AroundInvoke;
+import javax.interceptor.InvocationContext;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:adam at warski.org">Adam Warski</a>
+ */
+ at Interceptor(stateless = true)
+public class FeedsServiceGetFeedsInterceptor {
+    @AroundInvoke
+    public Object cacheFeeds(InvocationContext invocation) throws Exception {
+        CacheManager cacheManager = (CacheManager) Component.getInstance("cacheManager");
+
+        List<Feed> inCache = cacheManager.getAllFeedsList();
+
+        if (inCache != null) {
+            return inCache;
+        } else {
+            //noinspection unchecked
+            List<Feed> feeds = (List<Feed>) invocation.proceed();
+            cacheManager.putAllFeedsList(feeds);
+
+            return feeds;
+        }
+    }
+}
\ No newline at end of file

Copied: trunk/src/action/org/jboss/blog/session/cache/FeedsServiceGetPostInterceptor.java (from rev 175, trunk/src/action/org/jboss/blog/session/cache/FeedsServiceGetPostsInterceptor.java)
===================================================================
--- trunk/src/action/org/jboss/blog/session/cache/FeedsServiceGetPostInterceptor.java	                        (rev 0)
+++ trunk/src/action/org/jboss/blog/session/cache/FeedsServiceGetPostInterceptor.java	2008-01-21 17:10:26 UTC (rev 176)
@@ -0,0 +1,40 @@
+package org.jboss.blog.session.cache;
+
+import org.jboss.seam.annotations.intercept.Interceptor;
+import org.jboss.seam.Component;
+import org.jboss.blog.model.Post;
+
+import javax.interceptor.AroundInvoke;
+import javax.interceptor.InvocationContext;
+
+/**
+ * @author <a href="mailto:adam at warski.org">Adam Warski</a>
+ */
+ at Interceptor(stateless = true)
+public class FeedsServiceGetPostInterceptor {
+    @AroundInvoke
+    public Object cachePost(InvocationContext invocation) throws Exception {
+        CacheManager cacheManager = (CacheManager) Component.getInstance("cacheManager");
+
+        String titleAsId = (String) invocation.getParameters()[0];
+        Boolean writeable = false;
+        if (invocation.getParameters().length > 1) {
+            writeable = (Boolean) invocation.getParameters()[1];
+        }
+
+        if (writeable) {
+            return invocation.proceed();
+        }
+
+        Post inCache = cacheManager.getPost(titleAsId);
+
+        if (inCache != null) {
+            return inCache;
+        } else {
+            Post post = (Post) invocation.proceed();
+            cacheManager.putPost(post);
+
+            return post;
+        }
+    }
+}
\ No newline at end of file

Modified: trunk/src/action/org/jboss/blog/session/cache/FeedsServiceGetPostsInterceptor.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/cache/FeedsServiceGetPostsInterceptor.java	2008-01-18 19:09:09 UTC (rev 175)
+++ trunk/src/action/org/jboss/blog/session/cache/FeedsServiceGetPostsInterceptor.java	2008-01-21 17:10:26 UTC (rev 176)
@@ -1,9 +1,14 @@
 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;
+import org.jboss.blog.model.Post;
 
+import javax.interceptor.AroundInvoke;
+import javax.interceptor.InvocationContext;
+import java.util.List;
+
 /**
  * @author <a href="mailto:adam at warski.org">Adam Warski</a>
  */
@@ -11,6 +16,22 @@
 public class FeedsServiceGetPostsInterceptor {
     @AroundInvoke
     public Object cachePosts(InvocationContext invocation) throws Exception {
-        return invocation.proceed();    
+        CacheManager cacheManager = (CacheManager) Component.getInstance("cacheManager");
+
+        Feed feed = (Feed) invocation.getParameters()[0];
+        Integer from = (Integer) invocation.getParameters()[1];
+        Integer to = (Integer) invocation.getParameters()[2];
+
+        List<Post> inCache = cacheManager.getFeedPosts(feed.getName(), from, to);
+
+        if (inCache != null) {
+            return inCache;
+        } else {
+            //noinspection unchecked
+            List<Post> posts = (List<Post>) invocation.proceed();
+            cacheManager.putFeedPosts(feed, posts, from, to);
+
+            return posts;
+        }
     }
 }

Added: trunk/src/action/org/jboss/blog/session/cache/XmlServiceWriteXmlInterceptor.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/cache/XmlServiceWriteXmlInterceptor.java	                        (rev 0)
+++ trunk/src/action/org/jboss/blog/session/cache/XmlServiceWriteXmlInterceptor.java	2008-01-21 17:10:26 UTC (rev 176)
@@ -0,0 +1,46 @@
+package org.jboss.blog.session.cache;
+
+import org.jboss.seam.annotations.intercept.Interceptor;
+import org.jboss.seam.Component;
+import org.jboss.blog.session.xml.content.InMemoryContentResponse;
+import org.jboss.blog.tools.GeneralTools;
+
+import javax.interceptor.AroundInvoke;
+import javax.interceptor.InvocationContext;
+import java.io.CharArrayWriter;
+import java.io.CharArrayReader;
+
+/**
+ * @author <a href="mailto:adam at warski.org">Adam Warski</a>
+ */
+ at Interceptor(stateless = true)
+public class XmlServiceWriteXmlInterceptor {
+    @AroundInvoke
+    public Object cacheFeeds(InvocationContext invocation) throws Exception {
+        CacheManager cacheManager = (CacheManager) Component.getInstance("cacheManager");
+
+        String feedName = (String) invocation.getParameters()[0];
+        String feedType = (String) invocation.getParameters()[1];
+        InMemoryContentResponse response = (InMemoryContentResponse) invocation.getParameters()[2];
+
+        InMemoryContentResponse inCache = cacheManager.getFeedXml(feedName, feedType);
+
+        if (inCache == null) {
+            inCache = new InMemoryContentResponse();
+
+            //noinspection unchecked
+            invocation.setParameters(new Object[] { feedName, feedType, inCache });
+            invocation.proceed();
+
+            cacheManager.putFeedXml(feedName, feedType, inCache);
+        }
+
+        response.setCharacterEncoding(inCache.getCharacterEncoding());
+        response.setContentType(inCache.getContentType());
+              
+        GeneralTools.transfer(new CharArrayReader(((CharArrayWriter) inCache.getWriter()).toCharArray()),
+                response.getWriter());
+
+        return inCache;
+    }
+}

Modified: trunk/src/action/org/jboss/blog/session/converter/FeedConverter.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/converter/FeedConverter.java	2008-01-18 19:09:09 UTC (rev 175)
+++ trunk/src/action/org/jboss/blog/session/converter/FeedConverter.java	2008-01-21 17:10:26 UTC (rev 176)
@@ -2,6 +2,7 @@
 
 import org.jboss.blog.model.feed.Feed;
 import org.jboss.blog.service.FeedNotFoundException;
+import org.jboss.blog.service.FeedsService;
 import org.jboss.seam.Component;
 import org.jboss.seam.annotations.Name;
 import org.jboss.seam.annotations.Transactional;
@@ -22,20 +23,12 @@
 public class FeedConverter implements javax.faces.convert.Converter {
     @Transactional
     public Object getAsObject(FacesContext context, UIComponent cmp, String value) {
-        EntityManager entityManager = (EntityManager) Component.getInstance("entityManager");
+        FeedsService feedsService = (FeedsService) Component.getInstance("feedsService");
 
-        entityManager.joinTransaction();
-
-        if (value != null) {
-            value = value.toLowerCase();
-        }
-
-        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);
-        }
+        // TODO: entityManager.joinTransaction();
+        // EntityManager entityManager = (EntityManager) Component.getInstance("entityManager");
+        
+        return feedsService.getFeed(value);
     }
 
     public String getAsString(FacesContext context, UIComponent cmp, Object value) {

Modified: trunk/src/action/org/jboss/blog/session/converter/PostConverter.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/converter/PostConverter.java	2008-01-18 19:09:09 UTC (rev 175)
+++ trunk/src/action/org/jboss/blog/session/converter/PostConverter.java	2008-01-21 17:10:26 UTC (rev 176)
@@ -1,7 +1,7 @@
 package org.jboss.blog.session.converter;
 
 import org.jboss.blog.model.Post;
-import org.jboss.blog.service.FeedNotFoundException;
+import org.jboss.blog.service.FeedsService;
 import org.jboss.seam.Component;
 import org.jboss.seam.annotations.Name;
 import org.jboss.seam.annotations.Transactional;
@@ -10,8 +10,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>
@@ -22,20 +20,9 @@
 public class PostConverter implements javax.faces.convert.Converter {
     @Transactional
     public Object getAsObject(FacesContext context, UIComponent cmp, String value) {
-        EntityManager entityManager = (EntityManager) Component.getInstance("entityManager");
+        FeedsService feedsService = (FeedsService) Component.getInstance("feedsService");
 
-        entityManager.joinTransaction();
-
-        if (value != null) {
-            value = value.toLowerCase();
-        }
-
-        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);
-        }
+        return feedsService.getPost(value);
     }
 
     public String getAsString(FacesContext context, UIComponent cmp, Object value) {

Copied: trunk/src/action/org/jboss/blog/session/converter/writeable/WriteableFeedConverter.java (from rev 166, trunk/src/action/org/jboss/blog/session/converter/FeedConverter.java)
===================================================================
--- trunk/src/action/org/jboss/blog/session/converter/writeable/WriteableFeedConverter.java	                        (rev 0)
+++ trunk/src/action/org/jboss/blog/session/converter/writeable/WriteableFeedConverter.java	2008-01-21 17:10:26 UTC (rev 176)
@@ -0,0 +1,34 @@
+package org.jboss.blog.session.converter.writeable;
+
+import org.jboss.blog.model.feed.Feed;
+import org.jboss.blog.service.FeedNotFoundException;
+import org.jboss.blog.service.FeedsService;
+import org.jboss.seam.Component;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Transactional;
+import org.jboss.seam.annotations.faces.Converter;
+import org.jboss.seam.annotations.intercept.BypassInterceptors;
+
+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>
+ */
+ at Name("writeableFeedConverter")
+ at BypassInterceptors
+ at Converter
+public class WriteableFeedConverter implements javax.faces.convert.Converter {
+    @Transactional
+    public Object getAsObject(FacesContext context, UIComponent cmp, String value) {
+        FeedsService feedsService = (FeedsService) Component.getInstance("feedsService");
+
+        return feedsService.getFeed(value, true);
+    }
+
+    public String getAsString(FacesContext context, UIComponent cmp, Object value) {
+        return value == null ? null : ((Feed) value).getName();
+    }
+}
\ No newline at end of file

Copied: trunk/src/action/org/jboss/blog/session/converter/writeable/WriteablePostConverter.java (from rev 166, trunk/src/action/org/jboss/blog/session/converter/PostConverter.java)
===================================================================
--- trunk/src/action/org/jboss/blog/session/converter/writeable/WriteablePostConverter.java	                        (rev 0)
+++ trunk/src/action/org/jboss/blog/session/converter/writeable/WriteablePostConverter.java	2008-01-21 17:10:26 UTC (rev 176)
@@ -0,0 +1,31 @@
+package org.jboss.blog.session.converter.writeable;
+
+import org.jboss.blog.model.Post;
+import org.jboss.blog.service.FeedsService;
+import org.jboss.seam.Component;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Transactional;
+import org.jboss.seam.annotations.faces.Converter;
+import org.jboss.seam.annotations.intercept.BypassInterceptors;
+
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+
+/**
+ * @author <a href="mailto:adam at warski.org">Adam Warski</a>
+ */
+ at Name("writeablePostConverter")
+ at BypassInterceptors
+ at Converter
+public class WriteablePostConverter implements javax.faces.convert.Converter {
+    @Transactional
+    public Object getAsObject(FacesContext context, UIComponent cmp, String value) {
+        FeedsService feedsService = (FeedsService) Component.getInstance("feedsService");
+
+        return feedsService.getPost(value, true);
+    }
+
+    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-18 19:09:09 UTC (rev 175)
+++ trunk/src/action/org/jboss/blog/session/feed/FeedsServiceImpl.java	2008-01-21 17:10:26 UTC (rev 176)
@@ -4,12 +4,17 @@
 import org.jboss.blog.model.Post;
 import org.jboss.blog.service.FeedNotFoundException;
 import org.jboss.blog.service.FeedsService;
+import org.jboss.blog.service.PostNotFoundException;
 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.blog.session.cache.FeedsServiceGetPostInterceptor;
+import org.jboss.blog.session.cache.FeedsServiceGetFeedsInterceptor;
 import org.jboss.seam.annotations.AutoCreate;
 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 javax.ejb.Remove;
 import javax.ejb.Stateless;
@@ -31,13 +36,40 @@
     @In
     private FeedTypes feedTypes;
 
+    @Logger
+    private Log log;
+
     @SuppressWarnings("unchecked")
+    @Interceptors(FeedsServiceGetFeedsInterceptor.class)
     public List<Feed> getAllFeeds() {
+        log.debug("Reading a list of all feeds from the DB.");
         return entityManager.createQuery("select feed from Feed feed order by feed.name").getResultList();
     }
 
+    @Interceptors(FeedsServiceGetPostInterceptor.class)
+    public Post getPost(String titleAsId) throws PostNotFoundException {
+        return getPost(titleAsId, false);
+    }
+
+    @Interceptors(FeedsServiceGetPostInterceptor.class)
+    public Post getPost(String titleAsId, boolean writeable) throws PostNotFoundException {
+        log.debug("Reading post '#0' from the DB, writeable: #1.", titleAsId, writeable);
+        try {
+            return (Post) entityManager.createQuery("select post from Post post where post.titleAsId = ?1")
+                    .setParameter(1, titleAsId).getSingleResult();
+        } catch (NoResultException e) {
+            throw new PostNotFoundException();
+        }
+    }
+
     @Interceptors(FeedsServiceGetFeedInterceptor.class)
     public Feed getFeed(String feedName) throws FeedNotFoundException {
+        return getFeed(feedName, false);
+    }
+
+    @Interceptors(FeedsServiceGetFeedInterceptor.class)
+    public Feed getFeed(String feedName, boolean writeable) throws FeedNotFoundException {
+        log.debug("Reading feed '#0' from the DB, writeable: #1.", feedName, writeable);
         try {
             return (Feed) entityManager.createQuery("select feed from Feed feed where feed.name = ?1")
                     .setParameter(1, feedName).getSingleResult();
@@ -48,13 +80,10 @@
 
     @Interceptors(FeedsServiceGetPostsInterceptor.class)
     public List<Post> getPosts(Feed feed, int from, int to) {
+        log.debug("Reading feed '#0' posts from the DB, from #1 to #2.", feed.getName(), from, to);
         return feedTypes.getFeedDao(feed).getPosts(from, to);
     }
 
-    public List<Post> getPosts(String feedName, int from, int to) throws FeedNotFoundException {
-        return getPosts(getFeed(feedName), from, to);
-    }
-
     @Remove
     public void remove() { }
 }

Modified: trunk/src/action/org/jboss/blog/session/search/PostSearchBean.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/search/PostSearchBean.java	2008-01-18 19:09:09 UTC (rev 175)
+++ trunk/src/action/org/jboss/blog/session/search/PostSearchBean.java	2008-01-21 17:10:26 UTC (rev 176)
@@ -16,13 +16,14 @@
 import javax.faces.application.FacesMessage;
 import java.util.ArrayList;
 import java.util.List;
+import java.io.Serializable;
 
 /**
  * @author <a href="mailto:adam at warski.org">Adam Warski</a>
  */
 @Name("postSearch")
 @Scope(ScopeType.CONVERSATION)
-public class PostSearchBean {
+public class PostSearchBean implements Serializable {
     @In
     private FullTextEntityManager entityManager;
 

Modified: trunk/src/action/org/jboss/blog/session/xml/XmlService.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/xml/XmlService.java	2008-01-18 19:09:09 UTC (rev 175)
+++ trunk/src/action/org/jboss/blog/session/xml/XmlService.java	2008-01-21 17:10:26 UTC (rev 176)
@@ -1,14 +1,15 @@
 package org.jboss.blog.session.xml;
 
+import org.jboss.blog.session.xml.content.ContentResponse;
+
 import javax.ejb.Local;
-import javax.servlet.ServletResponse;
 
 /**
  * @author <a href="mailto:adam at warski.org">Adam Warski</a>
  */
 @Local
 public interface XmlService {
-    void writeXml(String feedType, String feedName, ServletResponse response)
+    void writeXml(String feedType, String feedName, ContentResponse response)
             throws Exception;
 
     void remove();

Added: trunk/src/action/org/jboss/blog/session/xml/content/ContentResponse.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/xml/content/ContentResponse.java	                        (rev 0)
+++ trunk/src/action/org/jboss/blog/session/xml/content/ContentResponse.java	2008-01-21 17:10:26 UTC (rev 176)
@@ -0,0 +1,19 @@
+package org.jboss.blog.session.xml.content;
+
+import java.io.Writer;
+import java.io.IOException;
+
+/**
+ * @author <a href="mailto:adam at warski.org">Adam Warski</a>
+ */
+public interface ContentResponse {
+    public String getContentType();
+
+    public void setContentType(String contentType);
+
+    public String getCharacterEncoding();
+
+    public void setCharacterEncoding(String characterEncoding);
+
+    public Writer getWriter() throws IOException;
+}

Added: trunk/src/action/org/jboss/blog/session/xml/content/InMemoryContentResponse.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/xml/content/InMemoryContentResponse.java	                        (rev 0)
+++ trunk/src/action/org/jboss/blog/session/xml/content/InMemoryContentResponse.java	2008-01-21 17:10:26 UTC (rev 176)
@@ -0,0 +1,37 @@
+package org.jboss.blog.session.xml.content;
+
+import java.io.Writer;
+import java.io.CharArrayWriter;
+
+/**
+ * @author <a href="mailto:adam at warski.org">Adam Warski</a>
+ */
+public class InMemoryContentResponse implements ContentResponse {
+    private String contentType;
+    private String characterEncoding;
+    private CharArrayWriter writer;
+
+    public InMemoryContentResponse() {
+        writer = new CharArrayWriter();
+    }
+
+    public String getContentType() {
+        return contentType;
+    }
+
+    public void setContentType(String contentType) {
+        this.contentType = contentType;
+    }
+
+    public String getCharacterEncoding() {
+        return characterEncoding;
+    }
+
+    public void setCharacterEncoding(String characterEncoding) {
+        this.characterEncoding = characterEncoding;
+    }
+
+    public Writer getWriter() {
+        return writer;
+    }
+}

Added: trunk/src/action/org/jboss/blog/session/xml/content/ServletResponseContentResponse.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/xml/content/ServletResponseContentResponse.java	                        (rev 0)
+++ trunk/src/action/org/jboss/blog/session/xml/content/ServletResponseContentResponse.java	2008-01-21 17:10:26 UTC (rev 176)
@@ -0,0 +1,37 @@
+package org.jboss.blog.session.xml.content;
+
+import javax.servlet.ServletResponse;
+import java.io.Writer;
+import java.io.PrintWriter;
+import java.io.IOException;
+
+/**
+ * @author <a href="mailto:adam at warski.org">Adam Warski</a>
+ */
+public class ServletResponseContentResponse implements ContentResponse {
+    private ServletResponse servletResponse;
+
+    public ServletResponseContentResponse(ServletResponse servletResponse) {
+        this.servletResponse = servletResponse;
+    }
+
+    public String getCharacterEncoding() {
+        return servletResponse.getCharacterEncoding();
+    }
+
+    public String getContentType() {
+        return servletResponse.getContentType();
+    }
+
+    public Writer getWriter() throws IOException {
+        return servletResponse.getWriter();
+    }
+
+    public void setCharacterEncoding(String s) {
+        servletResponse.setCharacterEncoding(s);
+    }
+
+    public void setContentType(String s) {
+        servletResponse.setContentType(s);
+    }
+}

Modified: trunk/src/action/org/jboss/blog/session/xml/velocity/VelocityXmlService.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/xml/velocity/VelocityXmlService.java	2008-01-18 19:09:09 UTC (rev 175)
+++ trunk/src/action/org/jboss/blog/session/xml/velocity/VelocityXmlService.java	2008-01-21 17:10:26 UTC (rev 176)
@@ -8,17 +8,21 @@
 import org.jboss.blog.model.XmlType;
 import org.jboss.blog.service.FeedsService;
 import org.jboss.blog.session.xml.XmlService;
+import org.jboss.blog.session.xml.content.ContentResponse;
 import org.jboss.blog.session.xml.velocity.tools.XmlTools;
 import org.jboss.blog.session.xml.velocity.tools.AtomXmlTools;
 import org.jboss.blog.session.xml.velocity.tools.Rss2XmlTools;
+import org.jboss.blog.session.cache.XmlServiceWriteXmlInterceptor;
 import org.jboss.seam.annotations.AutoCreate;
 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 javax.ejb.Remove;
 import javax.ejb.Stateless;
-import javax.servlet.ServletResponse;
 import javax.annotation.PostConstruct;
+import javax.interceptor.Interceptors;
 import java.util.List;
 import java.util.Properties;
 import java.util.Map;
@@ -34,6 +38,9 @@
     @In
     private FeedsService feedsService;
 
+    @Logger
+    private Log log;
+
     private VelocityEngine engine;
 
     private Map<XmlType, XmlTools> xmlTools;
@@ -54,8 +61,11 @@
         }
     }
 
-    public void writeXml(String feedType, String feedName, ServletResponse response)
+    @Interceptors(XmlServiceWriteXmlInterceptor.class)
+    public void writeXml(String feedType, String feedName, ContentResponse response)
             throws Exception {
+        log.debug("Generating xml for feed '#0' of type: #1.", feedName, feedType);
+
         XmlType xmlType;
         try {
             xmlType = XmlType.valueOf(feedType == null? "" : feedType.toUpperCase());

Modified: trunk/src/services/org/jboss/blog/service/FeedsService.java
===================================================================
--- trunk/src/services/org/jboss/blog/service/FeedsService.java	2008-01-18 19:09:09 UTC (rev 175)
+++ trunk/src/services/org/jboss/blog/service/FeedsService.java	2008-01-21 17:10:26 UTC (rev 176)
@@ -13,9 +13,13 @@
 public interface FeedsService {
     public List<Feed> getAllFeeds();
 
+    public Post getPost(String titleAsId) throws PostNotFoundException;
+
+    public Post getPost(String titleAsId, boolean writeable) throws PostNotFoundException;
+
     public Feed getFeed(String feedName) throws FeedNotFoundException;
 
-    public List<Post> getPosts(String feedName, int from, int to) throws FeedNotFoundException;
+    public Feed getFeed(String feedName, boolean writeable) throws FeedNotFoundException;
 
     public List<Post> getPosts(Feed feed, int from, int to);
 

Added: trunk/src/services/org/jboss/blog/service/PostNotFoundException.java
===================================================================
--- trunk/src/services/org/jboss/blog/service/PostNotFoundException.java	                        (rev 0)
+++ trunk/src/services/org/jboss/blog/service/PostNotFoundException.java	2008-01-21 17:10:26 UTC (rev 176)
@@ -0,0 +1,21 @@
+package org.jboss.blog.service;
+
+/**
+ * @author <a href="mailto:adam at warski.org">Adam Warski</a>
+ */
+public class PostNotFoundException extends RuntimeException {
+    public PostNotFoundException() {
+    }
+
+    public PostNotFoundException(String message) {
+        super(message);
+    }
+
+    public PostNotFoundException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public PostNotFoundException(Throwable cause) {
+        super(cause);
+    }
+}

Modified: trunk/src/tools/org/jboss/blog/tools/GeneralTools.java
===================================================================
--- trunk/src/tools/org/jboss/blog/tools/GeneralTools.java	2008-01-18 19:09:09 UTC (rev 175)
+++ trunk/src/tools/org/jboss/blog/tools/GeneralTools.java	2008-01-21 17:10:26 UTC (rev 176)
@@ -28,7 +28,7 @@
      *            Printwriter to write to.
      * @throws java.io.IOException In case of an IO exception.
      */
-    public static void transfer(InputStream is, PrintWriter w) throws IOException {
+    public static void transfer(InputStream is, Writer w) throws IOException {
         char[] buffer = new char[TRANSFER_BUFFER_SIZE];
         int read;
         InputStreamReader isr = new InputStreamReader(is);
@@ -38,6 +38,23 @@
     }
 
     /**
+     * Transferes all bytes from the given reader to the writer
+     *
+     * @param r
+     *            Reader to read from.
+     * @param w
+     *            Writer to write to.
+     * @throws java.io.IOException In case of an IO exception.
+     */
+    public static void transfer(Reader r, Writer w) throws IOException {
+        char[] buffer = new char[TRANSFER_BUFFER_SIZE];
+        int read;
+        while ((read = r.read(buffer)) != -1) {
+            w.write(buffer, 0, read);
+        }
+    }
+
+    /**
      * Transferes all bytes from the given input stream to the given output
      * stream.
      *




More information about the jboss-cvs-commits mailing list