[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