Author: peter_firmstone
Date: Tue May 21 10:55:06 2013
New Revision: 1484750

URL: http://svn.apache.org/r1484750
Log:
First refactoring towards making persisted state immutable in Outrigger to 
simplify synchronization.

Modified:
    river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/EntryRep.java
    
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/JoinStateManager.java
    
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StorableAvailabilityWatcher.java
    
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StorableEventWatcher.java
    
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StorableObject.java
    
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StorableResource.java
    
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StoredObject.java
    river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/Txn.java
    
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/BaseObject.java

Modified: 
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/EntryRep.java
URL: 
http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/EntryRep.java?rev=1484750&r1=1484749&r2=1484750&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/EntryRep.java 
(original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/EntryRep.java 
Tue May 21 10:55:06 2013
@@ -61,7 +61,7 @@ import net.jini.space.JavaSpace;
  * @see JavaSpace
  * @see Entry
  */
-class EntryRep implements StorableResource, LeasedResource, Serializable {
+class EntryRep implements StorableResource<EntryRep>, LeasedResource, 
Serializable {
     static final long serialVersionUID = 3L;
 
     // Synchronization isn't used where volatile access would be atomic.  
@@ -827,7 +827,7 @@ class EntryRep implements StorableResour
     }
 
     // inherit doc comment
-    public synchronized void restore(ObjectInputStream in) 
+    public synchronized EntryRep restore(ObjectInputStream in) 
        throws IOException, ClassNotFoundException 
     {
        final long bits0 = in.readLong();
@@ -845,6 +845,7 @@ class EntryRep implements StorableResour
        values       = (MarshalledInstance [])in.readObject();
        hash         = in.readLong();
        hashes       = (long[])in.readObject();
+        return this;
     }
 
     // Utility methods for throwing and logging exceptions

Modified: 
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/JoinStateManager.java
URL: 
http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/JoinStateManager.java?rev=1484750&r1=1484749&r2=1484750&view=diff
==============================================================================
--- 
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/JoinStateManager.java
 (original)
+++ 
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/JoinStateManager.java
 Tue May 21 10:55:06 2013
@@ -52,7 +52,7 @@ import com.sun.jini.logging.Levels;
  * @see JoinManager
  */
 // @see JoinAdminState
-class JoinStateManager implements StorableObject {
+class JoinStateManager implements StorableObject<JoinStateManager> {
     /** <code>ProxyPreparer</code> for <code>LookupLocators</code> */
     private volatile ProxyPreparer lookupLocatorPreparer;
 
@@ -593,13 +593,14 @@ class JoinStateManager implements Storab
     }
 
     // inherit doc comment
-    public void restore(ObjectInputStream in) 
+    public JoinStateManager restore(ObjectInputStream in) 
        throws IOException, ClassNotFoundException 
     {
        initial = false;
         attributes = readAttributes(in);
         locators   = (LookupLocator [])in.readObject();
         groups     = (String [])in.readObject();
+        return this;
     }
 
     /**

Modified: 
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StorableAvailabilityWatcher.java
URL: 
http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StorableAvailabilityWatcher.java?rev=1484750&r1=1484749&r2=1484750&view=diff
==============================================================================
--- 
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StorableAvailabilityWatcher.java
 (original)
+++ 
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StorableAvailabilityWatcher.java
 Tue May 21 10:55:06 2013
@@ -33,7 +33,7 @@ import net.jini.security.ProxyPreparer;
  * registrations.  
  */
 class StorableAvailabilityWatcher extends AvailabilityRegistrationWatcher
-    implements StorableResource
+    implements StorableResource<StorableAvailabilityWatcher>
 {
     /** The listener that should be notified of matches */
     private StorableReference listener;
@@ -160,7 +160,7 @@ class StorableAvailabilityWatcher extend
     /**
      * Restore the persistent fields
      */
-    public void restore(ObjectInputStream in) 
+    public StorableAvailabilityWatcher restore(ObjectInputStream in) 
        throws IOException, ClassNotFoundException 
     {
         synchronized (this){
@@ -173,6 +173,7 @@ class StorableAvailabilityWatcher extend
             if (listener == null)
                 throw new StreamCorruptedException(
                     "Stream corrupted, should not be null");
+            return this;
         }
     }
 }

Modified: 
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StorableEventWatcher.java
URL: 
http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StorableEventWatcher.java?rev=1484750&r1=1484749&r2=1484750&view=diff
==============================================================================
--- 
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StorableEventWatcher.java
 (original)
+++ 
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StorableEventWatcher.java
 Tue May 21 10:55:06 2013
@@ -33,7 +33,7 @@ import net.jini.security.ProxyPreparer;
  * persistent event registrations.
  */
 class StorableEventWatcher extends EventRegistrationWatcher
-    implements StorableResource
+    implements StorableResource<StorableEventWatcher>
 {
     /** The listener that should be notified of matches */
     private volatile StorableReference listener;
@@ -137,7 +137,7 @@ class StorableEventWatcher extends Event
     /**
      * Restore the persistent fields
      */
-    public synchronized void restore(ObjectInputStream in) 
+    public synchronized StorableEventWatcher restore(ObjectInputStream in) 
        throws IOException, ClassNotFoundException 
     {
        cookie = UuidFactory.read(in);
@@ -148,5 +148,6 @@ class StorableEventWatcher extends Event
        if (listener == null)
            throw new StreamCorruptedException(
                "Stream corrupted, should not be null");
+        return this;
     }
 }

Modified: 
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StorableObject.java
URL: 
http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StorableObject.java?rev=1484750&r1=1484749&r2=1484750&view=diff
==============================================================================
--- 
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StorableObject.java
 (original)
+++ 
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StorableObject.java
 Tue May 21 10:55:06 2013
@@ -25,22 +25,29 @@ import java.io.ObjectOutputStream;
  * Interface that must be implemented by objects that must persist their
  * state.
  *
+ * @param <T> The type of the object to be restored 
  * @see LogOps
  *
  * @author Sun Microsystems, Inc.
  *
  * @since 2.0
  */
-public interface StorableObject {
+public interface StorableObject<T> {
 
     /**  
      * Store the persistent fields 
+     * @param out
+     * @throws IOException  
      */
     public void store(ObjectOutputStream out) throws IOException;
 
     /**
-     * Restore the persistent fields
+     * Restore the persistent fields and return new instance.
+     * @param in
+     * @return
+     * @throws IOException
+     * @throws ClassNotFoundException  
      */
-    public void restore(ObjectInputStream in) 
+    public T  restore(ObjectInputStream in) 
        throws IOException, ClassNotFoundException;
 }

Modified: 
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StorableResource.java
URL: 
http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StorableResource.java?rev=1484750&r1=1484749&r2=1484750&view=diff
==============================================================================
--- 
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StorableResource.java
 (original)
+++ 
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StorableResource.java
 Tue May 21 10:55:06 2013
@@ -23,11 +23,12 @@ import com.sun.jini.landlord.LeasedResou
  * Sub-interface of <code>StorableObject</code> that must be implemented by
  * objects that represent leased resources and must persist their state.
  *
+ * @param <T> 
  * @see LogOps
  *
  * @author Sun Microsystems, Inc.
  *
  * @since 2.0
  */
-public interface StorableResource extends StorableObject, LeasedResource {
+public interface StorableResource<T extends LeasedResource> extends 
StorableObject<T>, LeasedResource {
 }

Modified: 
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StoredObject.java
URL: 
http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StoredObject.java?rev=1484750&r1=1484749&r2=1484750&view=diff
==============================================================================
--- 
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StoredObject.java 
(original)
+++ 
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/StoredObject.java 
Tue May 21 10:55:06 2013
@@ -23,15 +23,22 @@ import java.io.IOException;
  * Interface for a stored resource. Objects implementing this interface 
  * are passed into calls to <code>Recover</code> objects.
  *
+ * @param <T> the type of object stored.
  * @see Recover
  */
-public interface StoredObject {
+public interface StoredObject<T extends StorableObject<T>> {
 
     /**  
      * Restore the state of a <code>StorableObject</code> object.
+     * 
+     * There are two use cases for this method:<br>
+     * 
+     * 1. The object passed in is restored with the stored state and the same 
object returned.<br>
+     * 2. The object passed in is immutable and a copy with the restored state 
is returned.<br>
      *   
-     * @param object to restore 
+     * @param object to restore
+     * @return a restored instance of T
      */  
-    public void restore(StorableObject object)
+    public T restore(T object)
        throws IOException, ClassNotFoundException;
 }

Modified: river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/Txn.java
URL: 
http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/Txn.java?rev=1484750&r1=1484749&r2=1484750&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/Txn.java 
(original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/Txn.java Tue 
May 21 10:55:06 2013
@@ -85,7 +85,7 @@ import net.jini.security.ProxyPreparer;
  *
  * @author Sun Microsystems, Inc.  
  */
-class Txn implements TransactableMgr, TransactionConstants, StorableObject {
+class Txn implements TransactableMgr, TransactionConstants, 
StorableObject<Txn> {
 
     /** The internal id Outrigger as assigned to the transaction */
     final private long id;
@@ -499,7 +499,7 @@ class Txn implements TransactableMgr, Tr
     }
 
     // inherit doc comment
-    public void restore(ObjectInputStream in) 
+    public Txn restore(ObjectInputStream in) 
        throws IOException, ClassNotFoundException 
     {
        /* Only transactions that got prepared and not committed or
@@ -510,5 +510,6 @@ class Txn implements TransactableMgr, Tr
             trm      = (StorableReference)in.readObject();
             trId     = in.readLong();
         }
+        return this;
     }
 }

Modified: 
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/BaseObject.java
URL: 
http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/BaseObject.java?rev=1484750&r1=1484749&r2=1484750&view=diff
==============================================================================
--- 
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/BaseObject.java
 (original)
+++ 
river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/BaseObject.java
 Tue May 21 10:55:06 2013
@@ -34,12 +34,15 @@ import net.jini.space.InternalSpaceExcep
  * The target object is serialized and stored here as a byte
  * array.
  */
-class BaseObject implements StoredObject, Serializable {
+class BaseObject<T extends StorableObject<T>> implements StoredObject<T>, 
Serializable {
     static final long serialVersionUID = -400804064969360164L;
 
+    /**
+     * @serialField 
+     */
     private final byte[]       blob;
 
-    BaseObject(StorableObject object) {
+    BaseObject(T object) {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
@@ -52,10 +55,27 @@ class BaseObject implements StoredObject
        }
     }
 
-    public void restore(StorableObject object)
+    public T restore(T object)
       throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new 
ByteArrayInputStream(blob));
-       object.restore(ois);
+       T result = object.restore(ois);
        ois.close();
+        return result;
+    }
+    
+    /**
+     * Added to enable the serial form to be modified
+     * in a backward compatible manner (if necessary) with 2.3.0 and later.  
+     * Modified serial form would be a breaking change for versions
+     * prior to 2.3.0 
+     * 
+     * @serialData 
+     * @param ois
+     * @throws IOException
+     * @throws ClassNotFoundException 
+     * @since 2.3.0
+     */
+    private void readObject(ObjectInputStream ois) throws IOException, 
ClassNotFoundException {
+        ois.defaultReadObject();
     }
 }


Reply via email to