Author: peter_firmstone
Date: Sun Apr 10 01:57:46 2016
New Revision: 1738402

URL: http://svn.apache.org/viewvc?rev=1738402&view=rev
Log:
Critical patch:

This patch provides a compatible upgrade path for existing mutable subclasses 
of RemoteEvent.

Modified:
    river/jtsk/trunk/src/net/jini/core/event/RemoteEvent.java

Modified: river/jtsk/trunk/src/net/jini/core/event/RemoteEvent.java
URL: 
http://svn.apache.org/viewvc/river/jtsk/trunk/src/net/jini/core/event/RemoteEvent.java?rev=1738402&r1=1738401&r2=1738402&view=diff
==============================================================================
--- river/jtsk/trunk/src/net/jini/core/event/RemoteEvent.java (original)
+++ river/jtsk/trunk/src/net/jini/core/event/RemoteEvent.java Sun Apr 10 
01:57:46 2016
@@ -18,6 +18,8 @@
 
 package net.jini.core.event;
 
+import java.io.ObjectOutputStream.PutField;
+import java.io.ObjectStreamField;
 import java.rmi.MarshalledObject;
 
 /**
@@ -81,6 +83,14 @@ import java.rmi.MarshalledObject;
 public class RemoteEvent extends java.util.EventObject {
 
     private static final long serialVersionUID = 1777278867291906446L;
+   
+    private static final ObjectStreamField[] serialPersistentFields = 
+       {
+           new ObjectStreamField("source", Object.class),
+           new ObjectStreamField("eventID", long.class),
+           new ObjectStreamField("seqNum", long.class),
+           new ObjectStreamField("handback", MarshalledObject.class)
+       };
 
     /**
      * The event source.
@@ -188,4 +198,39 @@ public class RemoteEvent extends java.ut
        stream.defaultReadObject();
        super.source = source;
     }
+    
+    /**
+     * In River 3.0.0, RemoteEvent became immutable and all state made private,
+     * previously all fields were protected and non final.
+     * <p>
+     * This change breaks compatibility for subclasses that access these fields
+     * directly.  For other classes, all fields were accessible
+     * via public API getter methods.
+     * <p>
+     * To allow an upgrade path for subclasses that extend RemoteEvent and
+     * provide public setter methods for these fields, it is recommended to
+     * override all public methods and maintain state independently using 
+     * transient fields.  The subclass should also use RemoteEvent getter 
+     * methods to set these transient fields during de-serialization.
+     * <p>
+     * writeObject, instead of writing RemoteEvent fields, writes the 
+     * result of all getter methods to the ObjectOutputStream, during 
serialization,
+     * preserving serial form compatibility wither earlier versions, while 
+     * also allowing mutable subclasses to maintain full serial compatibility.
+     * <p>
+     * Mutable subclasses honoring this contract will be compatible with all 
+     * versions since Jini 1.0.
+     * 
+     * @param stream
+     * @throws java.io.IOException 
+     */
+    private void writeObject(java.io.ObjectOutputStream stream) throws 
java.io.IOException
+    {
+       PutField fields = stream.putFields();
+       fields.put("source", getSource());
+       fields.put("eventID", getID());
+       fields.put("seqNum", getSequenceNumber());
+       fields.put("handback", getRegistrationObject());
+       stream.writeFields();
+    }
 }


Reply via email to