[jboss-cvs] JBossBlog SVN: r204 - in trunk: resources/WEB-INF and 6 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri Feb 8 03:45:43 EST 2008


Author: adamw
Date: 2008-02-08 03:45:43 -0500 (Fri, 08 Feb 2008)
New Revision: 204

Added:
   trunk/src/action/org/jboss/blog/session/feed/lock/
   trunk/src/action/org/jboss/blog/session/feed/lock/FeedsLocksBean.java
   trunk/src/action/org/jboss/blog/session/update/UpdateHandlerAsync.java
   trunk/src/action/org/jboss/blog/session/update/UpdateHandlerAsyncImpl.java
Modified:
   trunk/resources/WEB-INF/components.xml
   trunk/resources/WEB-INF/pages.xml
   trunk/resources/messages_en.properties
   trunk/src/action/org/jboss/blog/session/feed/mod/FeedModBean.java
   trunk/src/action/org/jboss/blog/session/feed/mod/FilterAddBean.java
   trunk/src/action/org/jboss/blog/session/feed/posts/AggregatedFeedStack.java
   trunk/src/action/org/jboss/blog/session/feed/update/RemoteFeedUpdate.java
   trunk/src/action/org/jboss/blog/session/update/UpdateHandler.java
Log:


Modified: trunk/resources/WEB-INF/components.xml
===================================================================
--- trunk/resources/WEB-INF/components.xml	2008-02-07 17:57:36 UTC (rev 203)
+++ trunk/resources/WEB-INF/components.xml	2008-02-08 08:45:43 UTC (rev 204)
@@ -31,6 +31,8 @@
                                              persistence-unit-jndi-name="java:/blogEntityManagerFactory"/>
 
     <security:identity authenticate-method="#{authenticator.authenticate}" />
+    
+    <async:thread-pool-dispatcher />
 
     <event type="org.jboss.seam.notLoggedIn">
         <action execute="#{redirect.captureCurrentView}"/>
@@ -49,6 +51,9 @@
     <event type="org.jboss.blog.feed.accept">
         <action execute="#{feedMod.acceptFeed}"/>
     </event>
+    <event type="org.jboss.blog.feed.proposed">
+        <action execute="#{feedMod.proposedFeed}"/>
+    </event>
 
     <mail:mail-session host="localhost" port="2525" username="test" password="test" />
 

Modified: trunk/resources/WEB-INF/pages.xml
===================================================================
--- trunk/resources/WEB-INF/pages.xml	2008-02-07 17:57:36 UTC (rev 203)
+++ trunk/resources/WEB-INF/pages.xml	2008-02-08 08:45:43 UTC (rev 204)
@@ -52,7 +52,8 @@
 
     <page view-id="/manage/feed_propose.xhtml" conversation-required="true">
         <navigation from-action="#{feedMod.saveNew}">
-            <end-conversation />
+            <end-conversation />            
+            <raise-event type="org.jboss.blog.feed.proposed" />
             <redirect view-id="/home.xhtml" />
         </navigation>
     </page>

Modified: trunk/resources/messages_en.properties
===================================================================
--- trunk/resources/messages_en.properties	2008-02-07 17:57:36 UTC (rev 203)
+++ trunk/resources/messages_en.properties	2008-02-08 08:45:43 UTC (rev 204)
@@ -91,7 +91,8 @@
 blog.feed.deleted=Feed {0} deleted.
 blog.feed.updated=Feed {0} updated.
 blog.feed.added=Feed {0} added.
-blog.feed.accepted=Feed {0} accepted. Its posts will bead read and saved in a couple of minutes.
+blog.feed.accepted=Feed {0} accepted. Its posts will bead read and saved in a moment.
+blog.feed.proposed=Your feed: '{0}' has been added to our proposition queue. It will be now reviewed.
 
 blog.template.deleted=Template {0} of type {1} deleted.
 blog.template.updated=Template {0} of type {1} updated.

Added: trunk/src/action/org/jboss/blog/session/feed/lock/FeedsLocksBean.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/feed/lock/FeedsLocksBean.java	                        (rev 0)
+++ trunk/src/action/org/jboss/blog/session/feed/lock/FeedsLocksBean.java	2008-02-08 08:45:43 UTC (rev 204)
@@ -0,0 +1,37 @@
+package org.jboss.blog.session.feed.lock;
+
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.annotations.AutoCreate;
+import org.jboss.seam.ScopeType;
+
+import javax.annotation.PostConstruct;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.Map;
+
+/**
+ * @author <a href="mailto:adam at warski.org">Adam Warski</a>
+ */
+ at Name("feedsLocks")
+ at Scope(ScopeType.APPLICATION)
+ at AutoCreate
+public class FeedsLocksBean {
+    private Map<String, Lock> locks;
+
+    @PostConstruct
+    public void init() {
+        locks = new ConcurrentHashMap<String, Lock>();
+    }
+
+    public Lock getLockForFeed(String feedName) {
+        synchronized(this) {
+            if (!locks.containsKey(feedName)) {
+                locks.put(feedName, new ReentrantLock());
+            }
+        }
+
+        return locks.get(feedName);
+    }
+}

Modified: trunk/src/action/org/jboss/blog/session/feed/mod/FeedModBean.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/feed/mod/FeedModBean.java	2008-02-07 17:57:36 UTC (rev 203)
+++ trunk/src/action/org/jboss/blog/session/feed/mod/FeedModBean.java	2008-02-08 08:45:43 UTC (rev 204)
@@ -5,6 +5,8 @@
 import org.jboss.blog.model.Template;
 import org.jboss.blog.model.XmlType;
 import org.jboss.blog.session.merge.MergeServiceBean;
+import org.jboss.blog.session.feed.lock.FeedsLocksBean;
+import org.jboss.blog.session.update.UpdateHandlerAsync;
 import org.jboss.seam.ScopeType;
 import org.jboss.seam.core.Events;
 import org.jboss.seam.annotations.AutoCreate;
@@ -18,6 +20,7 @@
 import java.io.Serializable;
 import java.util.HashMap;
 import java.util.ArrayList;
+import java.util.concurrent.locks.Lock;
 
 /**
  * @author <a href="mailto:adam at warski.org">Adam Warski</a>
@@ -37,6 +40,12 @@
     @In
     private MergeServiceBean mergeService;
 
+    @In
+    private FeedsLocksBean feedsLocks;
+
+    @In
+    private UpdateHandlerAsync updateHandlerAsync;
+
     public void initNewFeed(Feed feed) {
         this.feed = feed;
         feed.setMaxPostsInFeed(10);
@@ -63,18 +72,30 @@
 
         entityManager.flush();
 
+        updateHandlerAsync.update(feed);
+
         facesMessages.addFromResourceBundle(FacesMessage.SEVERITY_INFO, "blog.feed.accepted", getFeed().getName());
     }
 
+    public void proposedFeed() {
+        facesMessages.addFromResourceBundle(FacesMessage.SEVERITY_INFO, "blog.feed.proposed", getFeed().getName());
+    }
+
     public void saveNew() {
-        entityManager.persist(feed);
+        Lock feedLock = feedsLocks.getLockForFeed(feed.getName());
+        feedLock.lock();
+        try {
+            entityManager.persist(feed);
 
-        for (Post post : feed.getPosts()) {
-            mergeService.savePost(feed, post);
+            for (Post post : feed.getPosts()) {
+                mergeService.savePost(feed, post);
+            }
+
+            entityManager.flush();
+        } finally {
+            feedLock.unlock();
         }
 
-        entityManager.flush();
-
         facesMessages.addFromResourceBundle(FacesMessage.SEVERITY_INFO, "blog.feed.added", getFeed().getName());
 
         Events.instance().raiseEvent("org.jboss.blog.feed.added", getFeed().getName()); 

Modified: trunk/src/action/org/jboss/blog/session/feed/mod/FilterAddBean.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/feed/mod/FilterAddBean.java	2008-02-07 17:57:36 UTC (rev 203)
+++ trunk/src/action/org/jboss/blog/session/feed/mod/FilterAddBean.java	2008-02-08 08:45:43 UTC (rev 204)
@@ -9,13 +9,14 @@
 import org.jboss.blog.model.post.filter.AuthorRegexpFilter;
 
 import java.util.List;
+import java.io.Serializable;
 
 /**
  * @author <a href="mailto:adam at warski.org">Adam Warski</a>
  */
 @Name("filterAdd")
 @Scope(ScopeType.CONVERSATION)
-public class FilterAddBean {
+public class FilterAddBean implements Serializable {
     private List<PostFilter> addToList;
 
     private PodcastFilter podcastFilter;

Modified: trunk/src/action/org/jboss/blog/session/feed/posts/AggregatedFeedStack.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/feed/posts/AggregatedFeedStack.java	2008-02-07 17:57:36 UTC (rev 203)
+++ trunk/src/action/org/jboss/blog/session/feed/posts/AggregatedFeedStack.java	2008-02-08 08:45:43 UTC (rev 204)
@@ -9,6 +9,7 @@
 import javax.annotation.PostConstruct;
 import java.util.List;
 import java.util.ArrayList;
+import java.io.Serializable;
 
 /**
  * @author <a href="mailto:adam at warski.org">Adam Warski</a>
@@ -16,7 +17,7 @@
 @Name("aggregatedFeedStack")
 @Scope(ScopeType.CONVERSATION)
 @AutoCreate
-public class AggregatedFeedStack {
+public class AggregatedFeedStack implements Serializable {
     private List<AggregatedFeed> stack;
 
     @PostConstruct

Modified: trunk/src/action/org/jboss/blog/session/feed/update/RemoteFeedUpdate.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/feed/update/RemoteFeedUpdate.java	2008-02-07 17:57:36 UTC (rev 203)
+++ trunk/src/action/org/jboss/blog/session/feed/update/RemoteFeedUpdate.java	2008-02-08 08:45:43 UTC (rev 204)
@@ -6,11 +6,14 @@
 import org.jboss.blog.session.parser.ParserService;
 import org.jboss.blog.session.merge.MergeServiceBean;
 import org.jboss.blog.session.update.UpdateException;
+import org.jboss.blog.session.feed.lock.FeedsLocksBean;
 import org.jboss.seam.ScopeType;
 import org.jboss.seam.annotations.In;
 import org.jboss.seam.annotations.Name;
 import org.jboss.seam.annotations.Scope;
 
+import java.util.concurrent.locks.Lock;
+
 /**
  * @author <a href="mailto:adam at warski.org">Adam Warski</a>
  */
@@ -22,15 +25,24 @@
 
     @In
     private MergeServiceBean mergeService;
+    
+    @In
+    private FeedsLocksBean feedsLocks;
 
     public void update(RemoteFeed feed) throws UpdateException {
-        Feed parsedFeed;
+        Lock feedLock = feedsLocks.getLockForFeed(feed.getName());
+        feedLock.lock();
         try {
-            parsedFeed = parserService.parse(feed.getRemoteLink());
-        } catch (ParserException e) {
-            throw new UpdateException(e);
+            Feed parsedFeed;
+            try {
+                parsedFeed = parserService.parse(feed.getRemoteLink());
+            } catch (ParserException e) {
+                throw new UpdateException(e);
+            }
+
+            mergeService.merge(feed, parsedFeed.getPosts());
+        } finally {
+            feedLock.unlock();
         }
-
-        mergeService.merge(feed, parsedFeed.getPosts());
     }
 }

Modified: trunk/src/action/org/jboss/blog/session/update/UpdateHandler.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/update/UpdateHandler.java	2008-02-07 17:57:36 UTC (rev 203)
+++ trunk/src/action/org/jboss/blog/session/update/UpdateHandler.java	2008-02-08 08:45:43 UTC (rev 204)
@@ -1,6 +1,7 @@
 package org.jboss.blog.session.update;
 
 import org.jboss.blog.model.feed.Feed;
+import org.jboss.blog.model.feed.RestrictedFeed;
 import org.jboss.blog.model.Group;
 import org.jboss.blog.service.FeedsService;
 import org.jboss.blog.service.GroupsService;
@@ -32,16 +33,20 @@
     public void update() {
         for (Group group : feedsService.getAllGroups()) {
             for (Feed feed : groupsService.acceptedFeeds(group)) {
-                try {
-                    feedTypes.getFeedDao(feed).update();
-                } catch (UpdateException e) {
-                    // TODO: log this somewhere
-                    System.out.println("Exception when updating feed: " + feed.getName() + "; " + e.getMessage());
-                }
+                update(feed);
             }
         }
     }
 
+    public void update(RestrictedFeed feed) {
+        try {
+            feedTypes.getFeedDao(feed).update();
+        } catch (UpdateException e) {
+            // TODO: log this somewhere
+            System.out.println("Exception when updating feed: " + feed.getName() + "; " + e.getMessage());
+        }
+    }
+
     @Remove
     public void remove() { }
 }

Added: trunk/src/action/org/jboss/blog/session/update/UpdateHandlerAsync.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/update/UpdateHandlerAsync.java	                        (rev 0)
+++ trunk/src/action/org/jboss/blog/session/update/UpdateHandlerAsync.java	2008-02-08 08:45:43 UTC (rev 204)
@@ -0,0 +1,17 @@
+package org.jboss.blog.session.update;
+
+import org.jboss.blog.model.feed.RestrictedFeed;
+import org.jboss.seam.annotations.async.Asynchronous;
+
+import javax.ejb.Local;
+
+/**
+ * @author <a href="mailto:adam at warski.org">Adam Warski</a>
+ */
+ at Local
+public interface UpdateHandlerAsync {
+    @Asynchronous
+    public void update(RestrictedFeed feed);
+
+    public void remove();
+}

Added: trunk/src/action/org/jboss/blog/session/update/UpdateHandlerAsyncImpl.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/update/UpdateHandlerAsyncImpl.java	                        (rev 0)
+++ trunk/src/action/org/jboss/blog/session/update/UpdateHandlerAsyncImpl.java	2008-02-08 08:45:43 UTC (rev 204)
@@ -0,0 +1,27 @@
+package org.jboss.blog.session.update;
+
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.AutoCreate;
+import org.jboss.blog.model.feed.RestrictedFeed;
+
+import javax.ejb.Stateless;
+import javax.ejb.Remove;
+
+/**
+ * @author <a href="mailto:adam at warski.org">Adam Warski</a>
+ */
+ at Stateless
+ at Name("updateHandlerAsync")
+ at AutoCreate
+public class UpdateHandlerAsyncImpl implements UpdateHandlerAsync {
+    @In
+    private UpdateHandler updateHandler;
+
+    public void update(RestrictedFeed feed) {
+        updateHandler.update(feed);
+    }
+
+    @Remove
+    public void remove() { }
+}




More information about the jboss-cvs-commits mailing list