You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ml...@apache.org on 2006/04/25 14:32:41 UTC

svn commit: r396863 - in /incubator/harmony/enhanced/classlib/trunk/modules/beans/src: main/java/java/beans/VetoableChangeSupport.java test/java/tests/api/java/beans/VetoableChangeSupportTest.java

Author: mloenko
Date: Tue Apr 25 05:32:38 2006
New Revision: 396863

URL: http://svn.apache.org/viewcvs?rev=396863&view=rev
Log:
fixes for HARMONY-321:
VetoableChangeSupport: the reverting event is not fired if the change is vetoed

Modified:
    incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/VetoableChangeSupport.java
    incubator/harmony/enhanced/classlib/trunk/modules/beans/src/test/java/tests/api/java/beans/VetoableChangeSupportTest.java

Modified: incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/VetoableChangeSupport.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/VetoableChangeSupport.java?rev=396863&r1=396862&r2=396863&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/VetoableChangeSupport.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/VetoableChangeSupport.java Tue Apr 25 05:32:38 2006
@@ -318,7 +318,7 @@
     
     private void doFirePropertyChange(PropertyChangeEvent event)
             throws PropertyVetoException {
-        String propertyName = event.getPropertyName();
+        String propName = event.getPropertyName();
         Object oldValue = event.getOldValue();
         Object newValue = event.getNewValue();
         
@@ -326,23 +326,38 @@
             return;
         }
 
-        Iterator iterator = allVetoableChangeListeners.iterator();
+        try {
+            notifyAllListeners(event);
+        } catch (PropertyVetoException pve) {
+            PropertyChangeEvent rEvent = createPropertyChangeEvent(propName,
+                    newValue, oldValue);
+            notifyAllListeners(rEvent);
+            throw pve;
+        }
+    }
+
+    private void notifyListeners(Iterator iterator, PropertyChangeEvent event)
+            throws PropertyVetoException {
+
+        VetoableChangeListener listener = null;
         while (iterator.hasNext()) {
-            VetoableChangeListener listener =
-                    (VetoableChangeListener) iterator.next();
+            listener = (VetoableChangeListener) iterator.next();
             listener.vetoableChange(event);
         }
-        
-        ArrayList listeners = (ArrayList) selectedVetoableChangeListeners.get(
-                propertyName);
-        if (listeners != null) {
-            iterator = listeners.iterator();
-            while (iterator.hasNext()) {
-                VetoableChangeListener listener =
-                        (VetoableChangeListener) iterator.next();
-                listener.vetoableChange(event);
-            }
+
+    }
+
+    private void notifyAllListeners(PropertyChangeEvent event)
+            throws PropertyVetoException {
+
+        notifyListeners(allVetoableChangeListeners.iterator(), event);
+        String propertyName = event.getPropertyName();
+        ArrayList listeners = (ArrayList) selectedVetoableChangeListeners
+                .get(propertyName);
+        if (listeners == null) {
+            return;
         }
+        notifyListeners(listeners.iterator(), event);
     }
     
     private static VetoableChangeListener[] getAsVetoableChangeListenerArray(

Modified: incubator/harmony/enhanced/classlib/trunk/modules/beans/src/test/java/tests/api/java/beans/VetoableChangeSupportTest.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/modules/beans/src/test/java/tests/api/java/beans/VetoableChangeSupportTest.java?rev=396863&r1=396862&r2=396863&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/beans/src/test/java/tests/api/java/beans/VetoableChangeSupportTest.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/beans/src/test/java/tests/api/java/beans/VetoableChangeSupportTest.java Tue Apr 25 05:32:38 2006
@@ -1510,6 +1510,24 @@
 		assertEquals(0, support.getVetoableChangeListeners().length);
 	}
 
+    /*
+     * Regression test for HARMONY-321
+     */
+    public void testFireVetoableChange_regression() {
+        VetoableChangeSupport vcs = new VetoableChangeSupport(this);
+        MockVetoListener2 vlistener = new MockVetoListener2();
+
+        vcs.addVetoableChangeListener(vlistener);
+        try {
+            vcs.fireVetoableChange(vlistener.vetoedPropName, 0, 1);
+            fail("PropertyVetoException expected");
+        } catch (PropertyVetoException ok) {}
+
+        assertEquals(1, vlistener.event.getOldValue());
+        assertEquals(0, vlistener.event.getNewValue());
+    } 
+
+    
 	/*
 	 * no this listener
 	 */
@@ -1747,5 +1765,26 @@
 		}
 
 	}
+
+    public static class MockVetoListener2 implements VetoableChangeListener {
+
+        public PropertyChangeEvent event;
+
+        public final String vetoedPropName = "prop";
+
+        public void vetoableChange(PropertyChangeEvent e)
+                throws PropertyVetoException {
+
+            event = e;
+            String propName = e.getPropertyName();
+
+            if (propName.equals(vetoedPropName)
+                    && e.getNewValue().equals(new Integer(1))) {
+                throw new PropertyVetoException(
+                        propName + " change is vetoed!", e);
+            }
+        }
+
+    }
 
 }