From 3cd22508eba67ce9e23330ac5e4f052343685328 Mon Sep 17 00:00:00 2001 From: Warren Levy Date: Thu, 16 Nov 2000 21:34:48 +0000 Subject: [PATCH] PropertyChangeSupport.java (propertyListeners): Made transient. * java/beans/PropertyChangeSupport.java (propertyListeners): Made transient. (listeners): Made transient. (source): Renamed from 'bean'. (children): New field for serialization. (propertyChangeSupportSerializedDataVersion): Ditto. (serialVersionUID): Ditto. (writeObject): New serialization method. (readObject): New serialization method. * java/beans/VetoableChangeSupport.java (propertyListeners): Made transient. (listeners): Made transient. (source): Renamed from 'bean'. (children): New field for serialization. (vetoableChangeSupportSerializedDataVersion): Ditto. (serialVersionUID): Ditto. (writeObject): New serialization method. (readObject): New serialization method. * java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Fixed assert to allow constructor to have a return type (i.e. the class that the constructor constructs). Serialization mods. From-SVN: r37506 --- libjava/ChangeLog | 24 +++++++++++ libjava/java/beans/PropertyChangeSupport.java | 56 +++++++++++++++++++++----- libjava/java/beans/VetoableChangeSupport.java | 57 ++++++++++++++++++++++----- libjava/java/lang/reflect/natMethod.cc | 2 +- 4 files changed, 118 insertions(+), 21 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 18fc405..95df808 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,27 @@ +2000-11-16 Warren Levy + + * java/beans/PropertyChangeSupport.java (propertyListeners): Made + transient. + (listeners): Made transient. + (source): Renamed from 'bean'. + (children): New field for serialization. + (propertyChangeSupportSerializedDataVersion): Ditto. + (serialVersionUID): Ditto. + (writeObject): New serialization method. + (readObject): New serialization method. + * java/beans/VetoableChangeSupport.java (propertyListeners): Made + transient. + (listeners): Made transient. + (source): Renamed from 'bean'. + (children): New field for serialization. + (vetoableChangeSupportSerializedDataVersion): Ditto. + (serialVersionUID): Ditto. + (writeObject): New serialization method. + (readObject): New serialization method. + * java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Fixed assert + to allow constructor to have a return type (i.e. the class that the + constructor constructs). + 2000-11-14 Tom Tromey * Makefile.in: Rebuilt. diff --git a/libjava/java/beans/PropertyChangeSupport.java b/libjava/java/beans/PropertyChangeSupport.java index 512c8ed..4c3d3bc 100644 --- a/libjava/java/beans/PropertyChangeSupport.java +++ b/libjava/java/beans/PropertyChangeSupport.java @@ -1,5 +1,5 @@ /* java.beans.PropertyChangeSupport - Copyright (C) 1998, 1999 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -28,6 +28,11 @@ executable file might be covered by the GNU General Public License. */ package java.beans; import java.util.Hashtable; import java.util.Vector; +import java.util.Enumeration; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.IOException; +import java.io.Serializable; /** ** PropertyChangeSupport makes it easy to fire property @@ -39,16 +44,47 @@ import java.util.Vector; **/ public class PropertyChangeSupport implements java.io.Serializable { - Hashtable propertyListeners = new Hashtable(); - Vector listeners = new Vector(); - Object bean; + transient Hashtable propertyListeners = new Hashtable(); + transient Vector listeners = new Vector(); + Hashtable children; + Object source; + int propertyChangeSupportSerializedDataVersion = 2; + private static final long serialVersionUID = 6401253773779951803L; + + /** + * Saves the state of the object to the stream. */ + private void writeObject(ObjectOutputStream stream) throws IOException { + children = propertyListeners.isEmpty() ? null : propertyListeners; + stream.defaultWriteObject(); + for (Enumeration e = listeners.elements(); e.hasMoreElements(); ) { + PropertyChangeListener l = (PropertyChangeListener)e.nextElement(); + if (l instanceof Serializable) + stream.writeObject(l); + } + stream.writeObject(null); + } + + /** + * Reads the object back from stream (deserialization). + */ + private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { + stream.defaultReadObject(); + propertyListeners = (children == null) ? new Hashtable() : children; + PropertyChangeListener l; + while ((l = (PropertyChangeListener)stream.readObject()) != null) { + addPropertyChangeListener(l); + } + // FIXME: XXX: There is no spec for JDK 1.1 serialization + // so it is unclear what to do if the value of + // propertyChangeSupportSerializedDataVersion is 1. + } /** Create PropertyChangeSupport to work with a specific ** source bean. - ** @param bean the source bean to use. + ** @param source the source bean to use. **/ - public PropertyChangeSupport(Object bean) { - this.bean = bean; + public PropertyChangeSupport(Object source) { + this.source = source; } /** Adds a PropertyChangeListener to the list of listeners. @@ -166,7 +202,7 @@ public class PropertyChangeSupport implements java.io.Serializable { ** @param newVal the new value. **/ public void firePropertyChange(String propertyName, Object oldVal, Object newVal) { - firePropertyChange(new PropertyChangeEvent(bean,propertyName,oldVal,newVal)); + firePropertyChange(new PropertyChangeEvent(source,propertyName,oldVal,newVal)); } /** Fire a PropertyChangeEvent containing the old and new values of the property to all the listeners. @@ -176,7 +212,7 @@ public class PropertyChangeSupport implements java.io.Serializable { ** @param newVal the new value. **/ public void firePropertyChange(String propertyName, boolean oldVal, boolean newVal) { - firePropertyChange(new PropertyChangeEvent(bean, propertyName, new Boolean(oldVal), new Boolean(newVal))); + firePropertyChange(new PropertyChangeEvent(source, propertyName, new Boolean(oldVal), new Boolean(newVal))); } /** Fire a PropertyChangeEvent containing the old and new values of the property to all the listeners. @@ -186,7 +222,7 @@ public class PropertyChangeSupport implements java.io.Serializable { ** @param newVal the new value. **/ public void firePropertyChange(String propertyName, int oldVal, int newVal) { - firePropertyChange(new PropertyChangeEvent(bean, propertyName, new Integer(oldVal), new Integer(newVal))); + firePropertyChange(new PropertyChangeEvent(source, propertyName, new Integer(oldVal), new Integer(newVal))); } /** Tell whether the specified property is being listened on or not. diff --git a/libjava/java/beans/VetoableChangeSupport.java b/libjava/java/beans/VetoableChangeSupport.java index 6d0ff0c..a3e2bc6 100644 --- a/libjava/java/beans/VetoableChangeSupport.java +++ b/libjava/java/beans/VetoableChangeSupport.java @@ -1,6 +1,6 @@ /* * java.beans.VetoableChangeSupport: part of the Java Class Libraries project. - * Copyright (C) 1998 Free Software Foundation + * Copyright (C) 1998, 2000 Free Software Foundation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -21,6 +21,11 @@ package java.beans; import java.util.Hashtable; import java.util.Vector; +import java.util.Enumeration; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.IOException; +import java.io.Serializable; /** ** VetoableChangeSupport makes it easy to fire vetoable @@ -33,16 +38,48 @@ import java.util.Vector; **/ public class VetoableChangeSupport implements java.io.Serializable { - Hashtable propertyListeners = new Hashtable(); - Vector listeners = new Vector(); - Object bean; + transient Hashtable propertyListeners = new Hashtable(); + transient Vector listeners = new Vector(); + Hashtable children; + Object source; + int vetoableChangeSupportSerializedDataVersion = 2; + private static final long serialVersionUID = -5090210921595982017L; + + /** + * Saves the state of the object to the stream. */ + private void writeObject(ObjectOutputStream stream) throws IOException { + children = propertyListeners.isEmpty() ? null : propertyListeners; + stream.defaultWriteObject(); + for (Enumeration e = listeners.elements(); e.hasMoreElements(); ) { + VetoableChangeListener l = (VetoableChangeListener)e.nextElement(); + if (l instanceof Serializable) + stream.writeObject(l); + } + stream.writeObject(null); + } + + /** + * Reads the object back from stream (deserialization). + */ + private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { + stream.defaultReadObject(); + propertyListeners = (children == null) ? new Hashtable() : children; + VetoableChangeListener l; + while ((l = (VetoableChangeListener)stream.readObject()) != null) { + addVetoableChangeListener(l); + } + // FIXME: XXX: There is no spec for JDK 1.1 serialization + // so it is unclear what to do if the value of + // vetoableChangeSupportSerializedDataVersion is 1. + } + /** Create VetoableChangeSupport to work with a specific ** source bean. - ** @param bean the source bean to use. + ** @param source the source bean to use. **/ - public VetoableChangeSupport(Object bean) { - this.bean = bean; + public VetoableChangeSupport(Object source) { + this.source = source; } /** Adds a VetoableChangeListener to the list of listeners. @@ -199,7 +236,7 @@ public class VetoableChangeSupport implements java.io.Serializable { ** @exception PropertyVetoException if the change is vetoed. **/ public void fireVetoableChange(String propertyName, Object oldVal, Object newVal) throws PropertyVetoException { - fireVetoableChange(new PropertyChangeEvent(bean,propertyName,oldVal,newVal)); + fireVetoableChange(new PropertyChangeEvent(source,propertyName,oldVal,newVal)); } /** Fire a VetoableChangeEvent containing the old and new values of the property to all the listeners. @@ -213,7 +250,7 @@ public class VetoableChangeSupport implements java.io.Serializable { ** @exception PropertyVetoException if the change is vetoed. **/ public void fireVetoableChange(String propertyName, boolean oldVal, boolean newVal) throws PropertyVetoException { - fireVetoableChange(new PropertyChangeEvent(bean,propertyName,new Boolean(oldVal),new Boolean(newVal))); + fireVetoableChange(new PropertyChangeEvent(source,propertyName,new Boolean(oldVal),new Boolean(newVal))); } /** Fire a VetoableChangeEvent containing the old and new values of the property to all the listeners. @@ -227,7 +264,7 @@ public class VetoableChangeSupport implements java.io.Serializable { ** @exception PropertyVetoException if the change is vetoed. **/ public void fireVetoableChange(String propertyName, int oldVal, int newVal) throws PropertyVetoException { - fireVetoableChange(new PropertyChangeEvent(bean,propertyName,new Integer(oldVal),new Integer(newVal))); + fireVetoableChange(new PropertyChangeEvent(source,propertyName,new Integer(oldVal),new Integer(newVal))); } diff --git a/libjava/java/lang/reflect/natMethod.cc b/libjava/java/lang/reflect/natMethod.cc index 0e83e0d..d5f860a 100644 --- a/libjava/java/lang/reflect/natMethod.cc +++ b/libjava/java/lang/reflect/natMethod.cc @@ -312,7 +312,7 @@ _Jv_CallAnyMethodA (jobject obj, jvalue *result) { JvAssert (! is_constructor || ! obj); - JvAssert (! is_constructor || ! return_type); + JvAssert (! is_constructor || return_type); // See whether call needs an object as the first argument. A // constructor does need a `this' argument, but it is one we create. -- 2.7.4