You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by py...@apache.org on 2007/05/10 10:23:28 UTC

svn commit: r536773 - in /harmony/enhanced/classlib/trunk/modules/beans: make/ src/main/java/java/beans/ src/test/java/org/apache/harmony/beans/tests/java/beans/ src/test/resources/serialization/java/beans/ src/test/resources/serialization/org/apache/h...

Author: pyang
Date: Thu May 10 01:23:27 2007
New Revision: 536773

URL: http://svn.apache.org/viewvc?view=rev&rev=536773
Log:
Fix serialization issues, enable PropertyChangeSupportTest and refine java.beans.PropertyChangeSupport.java

Added:
    harmony/enhanced/classlib/trunk/modules/beans/src/test/resources/serialization/org/apache/harmony/beans/tests/java/beans/PropertyChangeSupportTest.golden.ser   (with props)
Removed:
    harmony/enhanced/classlib/trunk/modules/beans/src/test/resources/serialization/java/beans/PropertyChangeSupport.ser
Modified:
    harmony/enhanced/classlib/trunk/modules/beans/make/exclude.common
    harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/PropertyChangeSupport.java
    harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/PropertyChangeSupportTest.java

Modified: harmony/enhanced/classlib/trunk/modules/beans/make/exclude.common
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/make/exclude.common?view=diff&rev=536773&r1=536772&r2=536773
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/make/exclude.common (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/make/exclude.common Thu May 10 01:23:27 2007
@@ -1,5 +1,4 @@
 org/apache/harmony/beans/tests/java/beans/EncoderTest.java
-org/apache/harmony/beans/tests/java/beans/PropertyChangeSupportTest.java
 org/apache/harmony/beans/tests/java/beans/VetoableChangeListenerProxyTest.java
 org/apache/harmony/beans/tests/java/beans/VetoableChangeSupportTest.java
 org/apache/harmony/beans/tests/java/beans/XMLDecoderTest.java

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/PropertyChangeSupport.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/PropertyChangeSupport.java?view=diff&rev=536773&r1=536772&r2=536773
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/PropertyChangeSupport.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/PropertyChangeSupport.java Thu May 10 01:23:27 2007
@@ -22,27 +22,17 @@
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.Hashtable;
-import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
-import java.util.Map;
 
 public class PropertyChangeSupport implements Serializable {
 
     private static final long serialVersionUID = 6401253773779951803l;
 
-    private transient Object sourceBean;
+    private transient List<PropertyChangeListener> globalListeners = new ArrayList<PropertyChangeListener>();
 
-    private transient List<PropertyChangeListener> allPropertiesChangeListeners =
-            new ArrayList<PropertyChangeListener>();
-
-    private transient Map<String, List<PropertyChangeListener>>
-            selectedPropertiesChangeListeners =
-            new HashMap<String, List<PropertyChangeListener>>();
-
-    // fields for serialization compatibility
-    private Hashtable<String, List<PropertyChangeListener>> children;
+    private Hashtable<String, PropertyChangeSupport> children = new Hashtable<String, PropertyChangeSupport>();
 
     private Object source;
 
@@ -52,7 +42,7 @@
         if (sourceBean == null) {
             throw new NullPointerException();
         }
-        this.sourceBean = sourceBean;
+        this.source = sourceBean;
     }
 
     public void firePropertyChange(String propertyName, Object oldValue,
@@ -66,18 +56,17 @@
             Object oldValue, Object newValue) {
 
         // nulls and equals check done in doFire...
-        doFirePropertyChange(new IndexedPropertyChangeEvent(sourceBean,
+        doFirePropertyChange(new IndexedPropertyChangeEvent(source,
                 propertyName, oldValue, newValue, index));
     }
 
     public synchronized void removePropertyChangeListener(String propertyName,
             PropertyChangeListener listener) {
         if ((propertyName != null) && (listener != null)) {
-            List<PropertyChangeListener> listeners =
-                    selectedPropertiesChangeListeners.get(propertyName);
+            PropertyChangeSupport listeners = children.get(propertyName);
 
             if (listeners != null) {
-                listeners.remove(listener);
+                listeners.removePropertyChangeListener(listener);
             }
         }
     }
@@ -85,39 +74,37 @@
     public synchronized void addPropertyChangeListener(String propertyName,
             PropertyChangeListener listener) {
         if ((listener != null) && (propertyName != null)) {
-            List<PropertyChangeListener> listeners =
-                    selectedPropertiesChangeListeners.get(propertyName);
+            PropertyChangeSupport listeners = children.get(propertyName);
 
             if (listeners == null) {
-                listeners = new ArrayList<PropertyChangeListener>();
-                selectedPropertiesChangeListeners.put(propertyName, listeners);
+                listeners = new PropertyChangeSupport(source);
+                children.put(propertyName, listeners);
             }
 
             // RI compatibility
             if (listener instanceof PropertyChangeListenerProxy) {
-                PropertyChangeListenerProxy proxy =
-                        (PropertyChangeListenerProxy) listener;
+                PropertyChangeListenerProxy proxy = (PropertyChangeListenerProxy) listener;
 
-                listeners.add(new PropertyChangeListenerProxy(
-                        proxy.getPropertyName(),
-                        (PropertyChangeListener) proxy.getListener()));
+                listeners
+                        .addPropertyChangeListener(new PropertyChangeListenerProxy(
+                                proxy.getPropertyName(),
+                                (PropertyChangeListener) proxy.getListener()));
             } else {
-                listeners.add(listener);
+                listeners.addPropertyChangeListener(listener);
             }
         }
     }
 
     public synchronized PropertyChangeListener[] getPropertyChangeListeners(
             String propertyName) {
-        List<PropertyChangeListener> listeners = null;
+        PropertyChangeSupport listeners = null;
 
         if (propertyName != null) {
-            listeners = selectedPropertiesChangeListeners.get(propertyName);
+            listeners = children.get(propertyName);
         }
 
-        return (listeners == null) ? new PropertyChangeListener[] {}
-                : listeners.toArray(
-                        new PropertyChangeListener[listeners.size()]);
+        return (listeners == null) ? new PropertyChangeListener[0]
+                : listeners.getPropertyChangeListeners();
     }
 
     public void firePropertyChange(String propertyName, boolean oldValue,
@@ -153,134 +140,89 @@
     }
 
     public synchronized boolean hasListeners(String propertyName) {
-        boolean result = allPropertiesChangeListeners.size() > 0;
-        if (!result && (propertyName != null)) {
-            List<PropertyChangeListener> listeners =
-                    selectedPropertiesChangeListeners.get(propertyName);
-            if (listeners != null) {
-                result = listeners.size() > 0;
-            }
+        if(globalListeners.size() > 0){
+            return true;
+        }
+        boolean result = false;
+        if (propertyName != null) {
+            PropertyChangeSupport listeners = children.get(propertyName);
+            result = (listeners != null && listeners.hasListeners(propertyName));
         }
         return result;
     }
 
     public synchronized void removePropertyChangeListener(
             PropertyChangeListener listener) {
-        if (listener != null) {
-            if (listener instanceof PropertyChangeListenerProxy) {
-                String name = ((PropertyChangeListenerProxy) listener)
-                        .getPropertyName();
-                PropertyChangeListener lst = (PropertyChangeListener)
-                        ((PropertyChangeListenerProxy) listener).getListener();
-
-                removePropertyChangeListener(name, lst);
-            } else {
-                allPropertiesChangeListeners.remove(listener);
-            }
+        if (listener instanceof PropertyChangeListenerProxy) {
+            String name = ((PropertyChangeListenerProxy) listener)
+                    .getPropertyName();
+            PropertyChangeListener lst = (PropertyChangeListener) ((PropertyChangeListenerProxy) listener)
+                    .getListener();
+
+            removePropertyChangeListener(name, lst);
+        } else {
+            globalListeners.remove(listener);
         }
     }
 
     public synchronized void addPropertyChangeListener(
             PropertyChangeListener listener) {
-        if (listener != null) {
-            if (listener instanceof PropertyChangeListenerProxy) {
-                String name = ((PropertyChangeListenerProxy) listener)
-                        .getPropertyName();
-                PropertyChangeListener lst = (PropertyChangeListener)
-                        ((PropertyChangeListenerProxy) listener).getListener();
-                addPropertyChangeListener(name, lst);
-            } else {
-                allPropertiesChangeListeners.add(listener);
-            }
+        if (listener instanceof PropertyChangeListenerProxy) {
+            String name = ((PropertyChangeListenerProxy) listener)
+                    .getPropertyName();
+            PropertyChangeListener lst = (PropertyChangeListener) ((PropertyChangeListenerProxy) listener)
+                    .getListener();
+            addPropertyChangeListener(name, lst);
+        } else if(listener != null){
+            globalListeners.add(listener);
         }
     }
 
     public synchronized PropertyChangeListener[] getPropertyChangeListeners() {
-        ArrayList<PropertyChangeListener> result =
-                new ArrayList<PropertyChangeListener>(
-                        allPropertiesChangeListeners);
-
-        for (String propertyName : selectedPropertiesChangeListeners.keySet()) {
-            List<PropertyChangeListener> selectedListeners =
-                    selectedPropertiesChangeListeners.get(propertyName);
-
-            if (selectedListeners != null) {
-
-                for (PropertyChangeListener listener : selectedListeners) {
-                    result.add(new PropertyChangeListenerProxy(propertyName,
-                            listener));
-                }
+        ArrayList<PropertyChangeListener> result = new ArrayList<PropertyChangeListener>(
+                globalListeners);
+        for (String propertyName : children.keySet()) {
+            PropertyChangeSupport namedListener = (PropertyChangeSupport) children
+                    .get(propertyName);
+            PropertyChangeListener[] listeners = namedListener
+                    .getPropertyChangeListeners();
+            for (int i = 0; i < listeners.length; i++) {
+                result.add(new PropertyChangeListenerProxy(propertyName,
+                        listeners[i]));
             }
         }
-
-        return result.toArray(new PropertyChangeListener[result.size()]);
+        return result.toArray(new PropertyChangeListener[0]);
     }
 
     private void writeObject(ObjectOutputStream oos) throws IOException {
-        List<PropertyChangeListener> allSerializedPropertiesChangeListeners =
-                new ArrayList<PropertyChangeListener>();
-
-        for (PropertyChangeListener pcl : allPropertiesChangeListeners) {
-            if (pcl instanceof Serializable) {
-                allSerializedPropertiesChangeListeners.add(pcl);
+        oos.defaultWriteObject();
+        PropertyChangeListener[] gListeners = (PropertyChangeListener[]) globalListeners
+                .toArray(new PropertyChangeListener[0]);
+        for (int i = 0; i < gListeners.length; i++) {
+            if (gListeners[i] instanceof Serializable) {
+                oos.writeObject(gListeners[i]);
             }
         }
+        // Denotes end of list
+        oos.writeObject(null);
 
-        Map<String, List<PropertyChangeListener>>
-                selectedSerializedPropertiesChangeListeners =
-                        new HashMap<String, List<PropertyChangeListener>>();
-
-        for (String propertyName : selectedPropertiesChangeListeners.keySet()) {
-            List<PropertyChangeListener> keyValues =
-                    selectedPropertiesChangeListeners.get(propertyName);
-
-            if (keyValues != null) {
-                List<PropertyChangeListener> serializedPropertiesChangeListeners
-                        = new ArrayList<PropertyChangeListener>();
-
-                for (PropertyChangeListener pcl : keyValues) {
-                    if (pcl instanceof Serializable) {
-                        serializedPropertiesChangeListeners.add(pcl);
-                    }
-                }
-
-                if (!serializedPropertiesChangeListeners.isEmpty()) {
-                    selectedSerializedPropertiesChangeListeners.put(
-                            propertyName, serializedPropertiesChangeListeners);
-                }
-            }
-        }
-
-        children = new Hashtable<String, List<PropertyChangeListener>>(
-                selectedSerializedPropertiesChangeListeners);
-        children.put("", allSerializedPropertiesChangeListeners); //$NON-NLS-1$
-        oos.writeObject(children);
-
-        Object source = null;
-        if (sourceBean instanceof Serializable) {
-            source = sourceBean;
-        }
-        oos.writeObject(source);
-
-        oos.writeInt(propertyChangeSupportSerializedDataVersion);
     }
 
-    @SuppressWarnings("unchecked")
     private void readObject(ObjectInputStream ois) throws IOException,
             ClassNotFoundException {
-        children = (Hashtable<String, List<PropertyChangeListener>>) ois
-                .readObject();
-
-        selectedPropertiesChangeListeners = new HashMap<String, List<PropertyChangeListener>>(
-                children);
-        allPropertiesChangeListeners = selectedPropertiesChangeListeners
-                .remove(""); //$NON-NLS-1$
-        if (allPropertiesChangeListeners == null) {
-            allPropertiesChangeListeners = new ArrayList<PropertyChangeListener>();
-        }
-
-        sourceBean = ois.readObject();
-        propertyChangeSupportSerializedDataVersion = ois.readInt();
+        ois.defaultReadObject();
+        this.globalListeners = new LinkedList<PropertyChangeListener>();
+        if (null == this.children) {
+            this.children = new Hashtable<String, PropertyChangeSupport>();
+        }
+        Object listener = null;
+        do {
+            // Reads a listener _or_ proxy
+            listener = ois.readObject();
+            if (listener != null) {
+                addPropertyChangeListener((PropertyChangeListener) listener);
+            }
+        } while (listener != null);
     }
 
     public void firePropertyChange(PropertyChangeEvent event) {
@@ -289,63 +231,43 @@
 
     private PropertyChangeEvent createPropertyChangeEvent(String propertyName,
             Object oldValue, Object newValue) {
-        return new PropertyChangeEvent(sourceBean, propertyName, oldValue,
-                newValue);
+        return new PropertyChangeEvent(source, propertyName, oldValue, newValue);
     }
 
     private PropertyChangeEvent createPropertyChangeEvent(String propertyName,
             boolean oldValue, boolean newValue) {
-        return new PropertyChangeEvent(sourceBean, propertyName, oldValue,
-                newValue);
+        return new PropertyChangeEvent(source, propertyName, oldValue, newValue);
     }
 
     private PropertyChangeEvent createPropertyChangeEvent(String propertyName,
             int oldValue, int newValue) {
-        return new PropertyChangeEvent(sourceBean, propertyName, oldValue,
-                newValue);
+        return new PropertyChangeEvent(source, propertyName, oldValue, newValue);
     }
 
     private void doFirePropertyChange(PropertyChangeEvent event) {
-        String propertyName = event.getPropertyName();
         Object oldValue = event.getOldValue();
         Object newValue = event.getNewValue();
-
-        if ((newValue != null) && (oldValue != null)
-                && newValue.equals(oldValue)) {
+        if (oldValue != null && newValue != null && oldValue.equals(newValue)) {
             return;
         }
 
-        /*
-         * Copy the listeners collections so they can be modified while we fire
-         * events.
-         */
-
-        // Listeners to all property change events
-        PropertyChangeListener[] listensToAll;
-        // Listens to a given property change
-        PropertyChangeListener[] listensToOne = null;
-        synchronized (this) {
-            listensToAll = allPropertiesChangeListeners
-                    .toArray(new PropertyChangeListener[allPropertiesChangeListeners
-                            .size()]);
-
-            List<PropertyChangeListener> listeners = selectedPropertiesChangeListeners
-                    .get(propertyName);
-            if (listeners != null) {
-                listensToOne = listeners
-                        .toArray(new PropertyChangeListener[listeners.size()]);
-            }
+        // Collect up the global listeners
+        PropertyChangeListener[] gListeners = (PropertyChangeListener[]) globalListeners
+                .toArray(new PropertyChangeListener[0]);
+        // Fire the events for global listeners
+        for (int i = 0; i < gListeners.length; i++) {
+            gListeners[i].propertyChange(event);
         }
 
-        // Fire the listeners
-        for (PropertyChangeListener listener : listensToAll) {
-            listener.propertyChange(event);
-        }
-        if (listensToOne != null) {
-            for (PropertyChangeListener listener : listensToOne) {
-                listener.propertyChange(event);
+        // Fire the events for the property specific listeners if any
+        if (event.getPropertyName() != null) {
+            PropertyChangeSupport namedListener = (PropertyChangeSupport) children
+                    .get(event.getPropertyName());
+            if (namedListener != null) {
+                namedListener.firePropertyChange(event);
             }
         }
+
     }
 
 }

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/PropertyChangeSupportTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/PropertyChangeSupportTest.java?view=diff&rev=536773&r1=536772&r2=536773
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/PropertyChangeSupportTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/PropertyChangeSupportTest.java Thu May 10 01:23:27 2007
@@ -17,11 +17,11 @@
 
 package org.apache.harmony.beans.tests.java.beans;
 
+import java.beans.IndexedPropertyChangeEvent;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeListenerProxy;
 import java.beans.PropertyChangeSupport;
-import java.beans.IndexedPropertyChangeEvent;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -36,6 +36,8 @@
 
 import org.apache.harmony.beans.tests.support.NonSerializablePropertyChangeListener;
 import org.apache.harmony.beans.tests.support.SerializablePropertyChangeListener;
+import org.apache.harmony.testframework.serialization.SerializationTest;
+import org.apache.harmony.testframework.serialization.SerializationTest.SerializableAssert;
 
 import tests.util.SerializationTester;
 
@@ -1216,6 +1218,7 @@
     /*
      * Test serialization/deserialization compatibility
      */
+
     public void testSerializationCompatibility() throws Exception {
         Object src = "PropertyChangeSupportSerializationTest";
         PropertyChangeSupport sup = new PropertyChangeSupport(src);
@@ -1232,16 +1235,19 @@
         sup.addPropertyChangeListener("myProp", l2);
         sup2.addPropertyChangeListener(l1);
         sup2.addPropertyChangeListener("myProp", l1);
-
-        PropertyChangeSupport deSup = (PropertyChangeSupport) SerializationTester
-                .readObject(sup,
-                        "serialization/java/beans/PropertyChangeSupport.ser");
-        assertEquals(sup2.getPropertyChangeListeners()[0], deSup
-                .getPropertyChangeListeners()[0]);
-        assertEquals(((PropertyChangeListenerProxy) sup2
-                .getPropertyChangeListeners()[1]).getListener(),
-                ((PropertyChangeListenerProxy) deSup
-                        .getPropertyChangeListeners()[1]).getListener());
+        SerializationTest.verifyGolden(this, sup2, new SerializableAssert() {
+            public void assertDeserialized(Serializable initial,
+                    Serializable deserialized) {
+                PropertyChangeSupport sup2 = (PropertyChangeSupport) initial;
+                PropertyChangeSupport deSup = (PropertyChangeSupport) deserialized;
+                assertEquals(sup2.getPropertyChangeListeners()[0], deSup
+                        .getPropertyChangeListeners()[0]);
+                assertEquals(((PropertyChangeListenerProxy) sup2
+                        .getPropertyChangeListeners()[1]).getListener(),
+                        ((PropertyChangeListenerProxy) deSup
+                                .getPropertyChangeListeners()[1]).getListener());
+            }
+        });
     }
 
     /*

Added: harmony/enhanced/classlib/trunk/modules/beans/src/test/resources/serialization/org/apache/harmony/beans/tests/java/beans/PropertyChangeSupportTest.golden.ser
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/test/resources/serialization/org/apache/harmony/beans/tests/java/beans/PropertyChangeSupportTest.golden.ser?view=auto&rev=536773
==============================================================================
Binary file - no diff available.

Propchange: harmony/enhanced/classlib/trunk/modules/beans/src/test/resources/serialization/org/apache/harmony/beans/tests/java/beans/PropertyChangeSupportTest.golden.ser
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream