[richfaces-svn-commits] JBoss Rich Faces SVN: r12257 - trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean.

richfaces-svn-commits at lists.jboss.org richfaces-svn-commits at lists.jboss.org
Tue Jan 13 11:59:19 EST 2009


Author: dsvyatobatsko
Date: 2009-01-13 11:59:19 -0500 (Tue, 13 Jan 2009)
New Revision: 12257

Modified:
   trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/AjaxPushTestBean.java
Log:
refactored the thread + NPE fix

Modified: trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/AjaxPushTestBean.java
===================================================================
--- trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/AjaxPushTestBean.java	2009-01-13 16:54:05 UTC (rev 12256)
+++ trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/AjaxPushTestBean.java	2009-01-13 16:59:19 UTC (rev 12257)
@@ -17,31 +17,31 @@
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */ 
+ */
 package org.ajax4jsf.bean;
 
 import java.util.Date;
 import java.util.EventListener;
 import java.util.EventObject;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.ajax4jsf.event.PushEventListener;
 
-public class AjaxPushTestBean implements Runnable {
+public class AjaxPushTestBean {
 
     private boolean enabled = false;
 
-    private Date startDate;
-
     private PushEventListener listener;
 
-    private Thread thread;
+    private EventGenerator generator;
 
-    private int eventsSent = 0;
-
     private String content = "content";
 
+    private final Object lock = new Object();
+
     /**
      * Gets value of content field.
+     * 
      * @return value of content field
      */
     public String getContent() {
@@ -50,7 +50,9 @@
 
     /**
      * Set a new value for content field.
-     * @param content a new value for content field
+     * 
+     * @param content
+     *                a new value for content field
      */
     public void setContent(String content) {
         this.content = content;
@@ -58,60 +60,41 @@
 
     /**
      * Gets value of eventsSent field.
+     * 
      * @return value of eventsSent field
      */
     public int getEventsSent() {
-        return eventsSent;
+        EventGenerator generator = getGenerator();
+        return generator != null ? generator.getEventsSent() : 0;
     }
 
-    /**
-     * Set a new value for eventsSent field.
-     * @param eventsSent a new value for eventsSent field
-     */
-    public void setEventsSent(int eventsSent) {
-        this.eventsSent = eventsSent;
-    }
-
     public void addListener(EventListener listener) {
-        synchronized (listener) {
+        synchronized (lock) {
             if (this.listener != listener) {
                 this.listener = (PushEventListener) listener;
             }
         }
     }
 
-    public void run() {
-        while (thread != null) {
-            try {
-                long left = System.currentTimeMillis() - startDate.getTime();
-                if (left >= 60000) {
-                    stop();
-                }
-                listener.onEvent(new EventObject(this));
-                eventsSent++;
-                Thread.sleep(2000);
-            } catch (InterruptedException e) {
-                e.printStackTrace();
+    public void start() {
+        synchronized (lock) {
+            if (generator == null && listener != null) {
+                generator = new EventGenerator(listener, 60000);
+                Thread thread = new Thread(generator);
+                thread.setDaemon(true);
+                thread.start();
+                setEnabled(true);
             }
         }
     }
 
-    public void start() {
-        if (thread == null) {
-            thread = new Thread(this);
-            thread.setDaemon(true);
-            thread.start();
-            startDate = new Date();
-            setEnabled(true);
-        }
-    }
-
     public void stop() {
-        if (thread != null) {
-            startDate = null;
-            eventsSent = 0;
-            setEnabled(false);
-            thread = null;
+        synchronized (lock) {
+            if (generator != null) {
+                generator.stop();
+                setEnabled(false);
+                generator = null;
+            }
         }
     }
 
@@ -127,4 +110,55 @@
         stop();
         start();
     }
+
+    private EventGenerator getGenerator() {
+        return generator;
+    }
+
+    private static class EventGenerator implements Runnable {
+
+        private final PushEventListener listener;
+
+        private final long time;
+
+        private AtomicInteger eventsSent = new AtomicInteger(0);
+
+        private volatile boolean stopped;
+
+        public EventGenerator(PushEventListener listener, long time) {
+            this.listener = listener;
+            this.time = time;
+        }
+
+        public void stop() {
+            stopped = true;
+            synchronized (this) {
+                notify();
+            }
+        }
+
+        public void run() {
+            Date startDate = new Date();
+            while (true) {
+                try {
+                    long left = System.currentTimeMillis() - startDate.getTime();
+                    if (left >= time || stopped) {
+                        break;
+                    }
+                    listener.onEvent(new EventObject(this));
+                    eventsSent.incrementAndGet();
+                    synchronized (this) {
+                        wait(500);
+                    }
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+        public int getEventsSent() {
+            return eventsSent.get();
+        }
+    }
+
 }




More information about the richfaces-svn-commits mailing list