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(); } }
