]> source.dussan.org Git - vaadin-framework.git/commitdiff
Merged changes from trunk
authorArtur Signell <artur.signell@itmill.com>
Wed, 25 Nov 2009 17:49:17 +0000 (17:49 +0000)
committerArtur Signell <artur.signell@itmill.com>
Wed, 25 Nov 2009 17:49:17 +0000 (17:49 +0000)
svn changeset:10040/svn branch:event-framework-3234

src/com/vaadin/event/EventRouter.java
src/com/vaadin/terminal/gwt/server/ApplicationRunnerServlet.java
tests/src/com/vaadin/tests/server/TestEventRouter.java [new file with mode: 0644]

index b12a2802627b66c56414a72ec24b006b35b68660..dd13445e93235fad2506a58abfc0385ad2288919 100644 (file)
@@ -138,13 +138,17 @@ public class EventRouter implements MethodEventSource {
     public void fireEvent(EventObject event) {
         // It is not necessary to send any events if there are no listeners
         if (listenerList != null) {
+
+            // Make a copy of the listener list to allow listeners to be added
+            // inside listener methods. Fixes #3605.
+
             // Send the event to all listeners. The listeners themselves
             // will filter out unwanted events.
-
-            final Iterator<ListenerMethod> i = listenerList.iterator();
-            while (i.hasNext()) {
-                (i.next()).receiveEvent(event);
+            final Object[] listeners = listenerList.toArray();
+            for (int i = 0; i < listeners.length; i++) {
+                ((ListenerMethod) listeners[i]).receiveEvent(event);
             }
+
         }
     }
 
index aeb1b50c9c083c3ffdeaf3cc8398ce26b64b0a7a..b047556371eb8a985e3f0358cb3d284943c719af 100644 (file)
@@ -164,6 +164,8 @@ public class ApplicationRunnerServlet extends AbstractApplicationServlet {
                         appClass = (Class<? extends Application>) getClass()
                                 .getClassLoader().loadClass(
                                         defaultPackages[i] + "." + baseName);
+                    } catch (ClassNotFoundException ee) {
+                        // Ignore as this is expected for many packages
                     } catch (Exception e2) {
                         // TODO: handle exception
                         e2.printStackTrace();
diff --git a/tests/src/com/vaadin/tests/server/TestEventRouter.java b/tests/src/com/vaadin/tests/server/TestEventRouter.java
new file mode 100644 (file)
index 0000000..dc388a6
--- /dev/null
@@ -0,0 +1,37 @@
+package com.vaadin.tests.server;
+
+import junit.framework.TestCase;
+
+import com.vaadin.data.Property.ValueChangeEvent;
+import com.vaadin.data.Property.ValueChangeListener;
+import com.vaadin.ui.TextField;
+
+public class TestEventRouter extends TestCase {
+
+    int innerListenerCalls = 0;
+
+    public void testAddInEventListener() {
+        final TextField tf = new TextField();
+
+        final ValueChangeListener outer = new ValueChangeListener() {
+
+            public void valueChange(ValueChangeEvent event) {
+                ValueChangeListener inner = new ValueChangeListener() {
+
+                    public void valueChange(ValueChangeEvent event) {
+                        innerListenerCalls++;
+                        System.out.println("The inner listener was called");
+                    }
+                };
+
+                tf.addListener(inner);
+            }
+        };
+
+        tf.addListener(outer);
+        tf.setValue("abc"); // No inner listener calls, adds one inner
+        tf.setValue("def"); // One inner listener call, adds one inner
+        tf.setValue("ghi"); // Two inner listener calls, adds one inner
+        assert (innerListenerCalls == 3);
+    }
+}