[infinispan-commits] Infinispan SVN: r599 - in trunk: core/src/main/java/org/infinispan/commands and 19 other directories.

infinispan-commits at lists.jboss.org infinispan-commits at lists.jboss.org
Tue Jul 21 10:26:19 EDT 2009


Author: galder.zamarreno at jboss.com
Date: 2009-07-21 10:26:19 -0400 (Tue, 21 Jul 2009)
New Revision: 599

Added:
   trunk/core/src/main/java/org/infinispan/marshall/Ids.java
   trunk/core/src/main/java/org/infinispan/marshall/Marshallable.java
Modified:
   trunk/core/src/main/java/org/infinispan/atomic/AtomicHashMap.java
   trunk/core/src/main/java/org/infinispan/commands/LockControlCommand.java
   trunk/core/src/main/java/org/infinispan/commands/control/StateTransferControlCommand.java
   trunk/core/src/main/java/org/infinispan/commands/read/GetKeyValueCommand.java
   trunk/core/src/main/java/org/infinispan/commands/remote/ClusteredGetCommand.java
   trunk/core/src/main/java/org/infinispan/commands/remote/MultipleRpcCommand.java
   trunk/core/src/main/java/org/infinispan/commands/remote/SingleRpcCommand.java
   trunk/core/src/main/java/org/infinispan/commands/tx/CommitCommand.java
   trunk/core/src/main/java/org/infinispan/commands/tx/PrepareCommand.java
   trunk/core/src/main/java/org/infinispan/commands/tx/RollbackCommand.java
   trunk/core/src/main/java/org/infinispan/commands/write/ClearCommand.java
   trunk/core/src/main/java/org/infinispan/commands/write/EvictCommand.java
   trunk/core/src/main/java/org/infinispan/commands/write/InvalidateCommand.java
   trunk/core/src/main/java/org/infinispan/commands/write/InvalidateL1Command.java
   trunk/core/src/main/java/org/infinispan/commands/write/PutKeyValueCommand.java
   trunk/core/src/main/java/org/infinispan/commands/write/PutMapCommand.java
   trunk/core/src/main/java/org/infinispan/commands/write/RemoveCommand.java
   trunk/core/src/main/java/org/infinispan/commands/write/ReplaceCommand.java
   trunk/core/src/main/java/org/infinispan/container/entries/ImmortalCacheEntry.java
   trunk/core/src/main/java/org/infinispan/container/entries/ImmortalCacheValue.java
   trunk/core/src/main/java/org/infinispan/container/entries/MortalCacheEntry.java
   trunk/core/src/main/java/org/infinispan/container/entries/MortalCacheValue.java
   trunk/core/src/main/java/org/infinispan/container/entries/TransientCacheEntry.java
   trunk/core/src/main/java/org/infinispan/container/entries/TransientCacheValue.java
   trunk/core/src/main/java/org/infinispan/container/entries/TransientMortalCacheEntry.java
   trunk/core/src/main/java/org/infinispan/container/entries/TransientMortalCacheValue.java
   trunk/core/src/main/java/org/infinispan/loaders/bucket/Bucket.java
   trunk/core/src/main/java/org/infinispan/marshall/Externalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/MarshalledValue.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/ArrayListExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/BucketExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/DeadlockDetectingGlobalTransactionExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/DeltaAwareExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/ExceptionResponseExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/ExtendedResponseExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/GlobalTransactionExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/ImmortalCacheEntryExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/ImmortalCacheValueExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/ImmutableMapExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/JGroupsAddressExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/LinkedListExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/MapExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/MarshalledValueExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/MortalCacheEntryExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/MortalCacheValueExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/ReplicableCommandExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/SetExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/SingletonListExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/SuccessfulResponseExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/TransactionLogExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/TransientCacheEntryExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/TransientCacheValueExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/TransientMortalCacheEntryExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/exts/TransientMortalCacheValueExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/jboss/ConstantObjectTable.java
   trunk/core/src/main/java/org/infinispan/marshall/jboss/JBossMarshaller.java
   trunk/core/src/main/java/org/infinispan/remoting/responses/ExceptionResponse.java
   trunk/core/src/main/java/org/infinispan/remoting/responses/ExtendedResponse.java
   trunk/core/src/main/java/org/infinispan/remoting/responses/RequestIgnoredResponse.java
   trunk/core/src/main/java/org/infinispan/remoting/responses/SuccessfulResponse.java
   trunk/core/src/main/java/org/infinispan/remoting/responses/UnsuccessfulResponse.java
   trunk/core/src/main/java/org/infinispan/remoting/transport/jgroups/JGroupsAddress.java
   trunk/core/src/main/java/org/infinispan/transaction/TransactionLog.java
   trunk/core/src/main/java/org/infinispan/transaction/xa/DeadlockDetectingGlobalTransaction.java
   trunk/core/src/main/java/org/infinispan/transaction/xa/GlobalTransaction.java
   trunk/core/src/main/java/org/infinispan/util/FastCopyHashMap.java
   trunk/core/src/main/java/org/infinispan/util/Immutables.java
   trunk/core/src/test/java/org/infinispan/marshall/MarshallersTest.java
   trunk/core/src/test/java/org/infinispan/marshall/jboss/JBossMarshallerTest.java
   trunk/tree/src/main/java/org/infinispan/tree/Fqn.java
   trunk/tree/src/main/java/org/infinispan/tree/NodeKey.java
   trunk/tree/src/main/java/org/infinispan/tree/marshall/exts/NodeKeyExternalizer.java
Log:
[ISPN-125] (Switching to Externalizers to hardcoded indexes and @Marshallable annotation) All classes that have an Externalizer are now annotated with @Marshallable. This annotations takes the class name of the Externalizer and the unique index. Indexes are maintained in Ids class for easy spot of what's next available index. The majority of externalizer implementations have been merged into their classes as internal static classes. I've deprecated the previous location of such externalizers (They'll be removed at a later stage). As agreed, @Marshallable class list is hardcoded until we find a good, performant and fool proof dynamic way of handling this.

Modified: trunk/core/src/main/java/org/infinispan/atomic/AtomicHashMap.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/atomic/AtomicHashMap.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/atomic/AtomicHashMap.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -25,8 +25,13 @@
 import org.infinispan.Cache;
 import org.infinispan.batch.BatchContainer;
 import org.infinispan.context.InvocationContextContainer;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
 import org.infinispan.util.FastCopyHashMap;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
@@ -42,6 +47,7 @@
  * @since 4.0
  */
 @NotThreadSafe
+ at Marshallable(externalizer = AtomicHashMap.Externalizer.class, id = Ids.ATOMIC_HASH_MAP)
 public class AtomicHashMap<K, V> implements AtomicMap<K, V>, DeltaAware, Cloneable {
    FastCopyHashMap<K, V> delegate;
    private AtomicHashMapDelta delta = null;
@@ -182,4 +188,15 @@
       if (delta == null) delta = new AtomicHashMapDelta();
       return delta;
    }
+   
+   public static class Externalizer implements org.infinispan.marshall.Externalizer {
+      public void writeObject(ObjectOutput output, Object subject) throws IOException {
+         DeltaAware dw = (DeltaAware) subject;
+         output.writeObject(dw.delta());      
+      }
+
+      public Object readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+         return input.readObject();
+      }
+   }
 }

Modified: trunk/core/src/main/java/org/infinispan/commands/LockControlCommand.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/commands/LockControlCommand.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/commands/LockControlCommand.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -26,6 +26,9 @@
 import org.infinispan.context.InvocationContext;
 import org.infinispan.context.impl.RemoteTxInvocationContext;
 import org.infinispan.context.impl.TxInvocationContext;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+import org.infinispan.marshall.exts.ReplicableCommandExternalizer;
 import org.infinispan.transaction.xa.GlobalTransaction;
 import org.infinispan.transaction.xa.RemoteTransaction;
 
@@ -42,6 +45,7 @@
  * @param
  * @since 4.0
  */
+ at Marshallable(externalizer = ReplicableCommandExternalizer.class, id = Ids.LOCK_CONTROL_COMMAND)
 public class LockControlCommand extends AbstractTransactionBoundaryCommand {
    public static final int COMMAND_ID = 3;
    private Collection keys;

Modified: trunk/core/src/main/java/org/infinispan/commands/control/StateTransferControlCommand.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/commands/control/StateTransferControlCommand.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/commands/control/StateTransferControlCommand.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -2,6 +2,9 @@
 
 import org.infinispan.commands.ReplicableCommand;
 import org.infinispan.context.InvocationContext;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+import org.infinispan.marshall.exts.ReplicableCommandExternalizer;
 import org.infinispan.remoting.transport.Transport;
 
 /**
@@ -10,6 +13,7 @@
  * @author Manik Surtani
  * @since 4.0
  */
+ at Marshallable(externalizer = ReplicableCommandExternalizer.class, id = Ids.STATE_TRANSFER_CONTROL_COMMAND)
 public class StateTransferControlCommand implements ReplicableCommand {
    public static final int COMMAND_ID = 15;
    Transport transport;

Modified: trunk/core/src/main/java/org/infinispan/commands/read/GetKeyValueCommand.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/commands/read/GetKeyValueCommand.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/commands/read/GetKeyValueCommand.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -24,6 +24,9 @@
 import org.infinispan.commands.Visitor;
 import org.infinispan.container.entries.CacheEntry;
 import org.infinispan.context.InvocationContext;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+import org.infinispan.marshall.exts.ReplicableCommandExternalizer;
 import org.infinispan.notifications.cachelistener.CacheNotifier;
 import org.infinispan.util.logging.Log;
 import org.infinispan.util.logging.LogFactory;
@@ -34,6 +37,7 @@
  * @author Manik Surtani (<a href="mailto:manik at jboss.org">manik at jboss.org</a>)
  * @since 4.0
  */
+ at Marshallable(externalizer = ReplicableCommandExternalizer.class, id = Ids.GET_KEY_VALUE_COMMAND)
 public class GetKeyValueCommand extends AbstractDataCommand {
    public static final byte COMMAND_ID = 4;
    private static final Log log = LogFactory.getLog(GetKeyValueCommand.class);

Modified: trunk/core/src/main/java/org/infinispan/commands/remote/ClusteredGetCommand.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/commands/remote/ClusteredGetCommand.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/commands/remote/ClusteredGetCommand.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -33,6 +33,9 @@
 import org.infinispan.context.InvocationContextContainer;
 import org.infinispan.context.impl.NonTxInvocationContext;
 import org.infinispan.interceptors.InterceptorChain;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+import org.infinispan.marshall.exts.ReplicableCommandExternalizer;
 import org.infinispan.util.logging.Log;
 import org.infinispan.util.logging.LogFactory;
 
@@ -44,6 +47,7 @@
  * @author Mircea.Markus at jboss.com
  * @since 4.0
  */
+ at Marshallable(externalizer = ReplicableCommandExternalizer.class, id = Ids.CLUSTERED_GET_COMMAND)
 public class ClusteredGetCommand implements CacheRpcCommand {
 
    public static final byte COMMAND_ID = 16;

Modified: trunk/core/src/main/java/org/infinispan/commands/remote/MultipleRpcCommand.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/commands/remote/MultipleRpcCommand.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/commands/remote/MultipleRpcCommand.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -25,6 +25,9 @@
 import org.infinispan.commands.VisitableCommand;
 import org.infinispan.commands.tx.TransactionBoundaryCommand;
 import org.infinispan.context.InvocationContext;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+import org.infinispan.marshall.exts.ReplicableCommandExternalizer;
 import org.infinispan.util.logging.Log;
 import org.infinispan.util.logging.LogFactory;
 
@@ -41,6 +44,7 @@
  * @author Mircea.Markus at jboss.com
  * @since 4.0
  */
+ at Marshallable(externalizer = ReplicableCommandExternalizer.class, id = Ids.MULTIPLE_RPC_COMMAND)
 public class MultipleRpcCommand extends BaseRpcCommand {
 
    public static final byte COMMAND_ID = 2;

Modified: trunk/core/src/main/java/org/infinispan/commands/remote/SingleRpcCommand.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/commands/remote/SingleRpcCommand.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/commands/remote/SingleRpcCommand.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -2,6 +2,9 @@
 
 import org.infinispan.commands.ReplicableCommand;
 import org.infinispan.context.InvocationContext;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+import org.infinispan.marshall.exts.ReplicableCommandExternalizer;
 import org.infinispan.util.logging.Log;
 import org.infinispan.util.logging.LogFactory;
 
@@ -11,6 +14,7 @@
  *
  * @author Mircea.Markus at jboss.com
  */
+ at Marshallable(externalizer = ReplicableCommandExternalizer.class, id = Ids.SINGLE_RPC_COMMAND)
 public class SingleRpcCommand extends BaseRpcCommand {
    public static final int COMMAND_ID = 1;
    private static Log log = LogFactory.getLog(SingleRpcCommand.class);

Modified: trunk/core/src/main/java/org/infinispan/commands/tx/CommitCommand.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/commands/tx/CommitCommand.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/commands/tx/CommitCommand.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -24,6 +24,9 @@
 import org.infinispan.commands.Visitor;
 import org.infinispan.context.InvocationContext;
 import org.infinispan.context.impl.TxInvocationContext;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+import org.infinispan.marshall.exts.ReplicableCommandExternalizer;
 import org.infinispan.transaction.xa.GlobalTransaction;
 
 /**
@@ -32,6 +35,7 @@
  * @author Manik Surtani (<a href="mailto:manik at jboss.org">manik at jboss.org</a>)
  * @since 4.0
  */
+ at Marshallable(externalizer = ReplicableCommandExternalizer.class, id = Ids.COMMIT_COMMAND)
 public class CommitCommand extends AbstractTransactionBoundaryCommand {
    public static final byte COMMAND_ID = 14;
 

Modified: trunk/core/src/main/java/org/infinispan/commands/tx/PrepareCommand.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/commands/tx/PrepareCommand.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/commands/tx/PrepareCommand.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -27,6 +27,9 @@
 import org.infinispan.context.InvocationContext;
 import org.infinispan.context.impl.RemoteTxInvocationContext;
 import org.infinispan.context.impl.TxInvocationContext;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+import org.infinispan.marshall.exts.ReplicableCommandExternalizer;
 import org.infinispan.notifications.cachelistener.CacheNotifier;
 import org.infinispan.transaction.xa.GlobalTransaction;
 import org.infinispan.transaction.xa.RemoteTransaction;
@@ -43,6 +46,7 @@
  * @author Mircea.Markus at jboss.com
  * @since 4.0
  */
+ at Marshallable(externalizer = ReplicableCommandExternalizer.class, id = Ids.PREPARE_COMMAND)
 public class PrepareCommand extends AbstractTransactionBoundaryCommand {
 
    private static Log log = LogFactory.getLog(PrepareCommand.class);

Modified: trunk/core/src/main/java/org/infinispan/commands/tx/RollbackCommand.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/commands/tx/RollbackCommand.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/commands/tx/RollbackCommand.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -24,6 +24,9 @@
 import org.infinispan.commands.Visitor;
 import org.infinispan.context.InvocationContext;
 import org.infinispan.context.impl.TxInvocationContext;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+import org.infinispan.marshall.exts.ReplicableCommandExternalizer;
 import org.infinispan.transaction.xa.GlobalTransaction;
 
 /**
@@ -32,6 +35,7 @@
  * @author Manik Surtani (<a href="mailto:manik at jboss.org">manik at jboss.org</a>)
  * @since 4.0
  */
+ at Marshallable(externalizer = ReplicableCommandExternalizer.class, id = Ids.ROLLBACK_COMMAND)
 public class RollbackCommand extends AbstractTransactionBoundaryCommand {
    public static final byte COMMAND_ID = 13;
 

Modified: trunk/core/src/main/java/org/infinispan/commands/write/ClearCommand.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/commands/write/ClearCommand.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/commands/write/ClearCommand.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -25,12 +25,16 @@
 import org.infinispan.container.entries.CacheEntry;
 import org.infinispan.container.entries.MVCCEntry;
 import org.infinispan.context.InvocationContext;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+import org.infinispan.marshall.exts.ReplicableCommandExternalizer;
 import org.infinispan.notifications.cachelistener.CacheNotifier;
 
 /**
  * @author Mircea.Markus at jboss.com
  * @since 4.0
  */
+ at Marshallable(externalizer = ReplicableCommandExternalizer.class, id = Ids.CLEAR_COMMAND)
 public class ClearCommand implements WriteCommand {
    private static final Object[] params = new Object[0];
    public static final byte COMMAND_ID = 5;

Modified: trunk/core/src/main/java/org/infinispan/commands/write/EvictCommand.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/commands/write/EvictCommand.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/commands/write/EvictCommand.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -23,12 +23,16 @@
 
 import org.infinispan.commands.Visitor;
 import org.infinispan.context.InvocationContext;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+import org.infinispan.marshall.exts.ReplicableCommandExternalizer;
 import org.infinispan.notifications.cachelistener.CacheNotifier;
 
 /**
  * @author Mircea.Markus at jboss.com
  * @since 4.0
  */
+ at Marshallable(externalizer = ReplicableCommandExternalizer.class, id = Ids.EVICT_COMMAND)
 public class EvictCommand extends RemoveCommand {
 
    public EvictCommand(Object key, CacheNotifier notifier) {

Modified: trunk/core/src/main/java/org/infinispan/commands/write/InvalidateCommand.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/commands/write/InvalidateCommand.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/commands/write/InvalidateCommand.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -23,6 +23,9 @@
 
 import org.infinispan.commands.Visitor;
 import org.infinispan.context.InvocationContext;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+import org.infinispan.marshall.exts.ReplicableCommandExternalizer;
 import org.infinispan.notifications.cachelistener.CacheNotifier;
 import org.infinispan.util.logging.Log;
 import org.infinispan.util.logging.LogFactory;
@@ -36,6 +39,7 @@
  * @author Mircea.Markus at jboss.com
  * @since 4.0
  */
+ at Marshallable(externalizer = ReplicableCommandExternalizer.class, id = Ids.INVALIDATE_COMMAND)
 public class InvalidateCommand extends RemoveCommand {
    public static final int COMMAND_ID = 6;
    private static final Log log = LogFactory.getLog(InvalidateCommand.class);

Modified: trunk/core/src/main/java/org/infinispan/commands/write/InvalidateL1Command.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/commands/write/InvalidateL1Command.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/commands/write/InvalidateL1Command.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -2,6 +2,9 @@
 
 import org.infinispan.context.InvocationContext;
 import org.infinispan.distribution.DistributionManager;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+import org.infinispan.marshall.exts.ReplicableCommandExternalizer;
 import org.infinispan.notifications.cachelistener.CacheNotifier;
 
 /**
@@ -10,6 +13,7 @@
  * @author Manik Surtani
  * @since 4.0
  */
+ at Marshallable(externalizer = ReplicableCommandExternalizer.class, id = Ids.INVALIDATE_L1_COMMAND)
 public class InvalidateL1Command extends InvalidateCommand {
    public static final int COMMAND_ID = 7;
    private DistributionManager dm;

Modified: trunk/core/src/main/java/org/infinispan/commands/write/PutKeyValueCommand.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/commands/write/PutKeyValueCommand.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/commands/write/PutKeyValueCommand.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -27,6 +27,9 @@
 import org.infinispan.commands.read.AbstractDataCommand;
 import org.infinispan.container.entries.MVCCEntry;
 import org.infinispan.context.InvocationContext;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+import org.infinispan.marshall.exts.ReplicableCommandExternalizer;
 import org.infinispan.notifications.cachelistener.CacheNotifier;
 
 /**
@@ -35,6 +38,7 @@
  * @author Mircea.Markus at jboss.com
  * @since 4.0
  */
+ at Marshallable(externalizer = ReplicableCommandExternalizer.class, id = Ids.PUT_KEY_VALUE_COMMAND)
 public class PutKeyValueCommand extends AbstractDataCommand implements DataWriteCommand {
    public static final byte COMMAND_ID = 8;
 

Modified: trunk/core/src/main/java/org/infinispan/commands/write/PutMapCommand.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/commands/write/PutMapCommand.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/commands/write/PutMapCommand.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -24,6 +24,9 @@
 import org.infinispan.commands.Visitor;
 import org.infinispan.container.entries.MVCCEntry;
 import org.infinispan.context.InvocationContext;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+import org.infinispan.marshall.exts.ReplicableCommandExternalizer;
 import org.infinispan.notifications.cachelistener.CacheNotifier;
 
 import java.util.Map;
@@ -33,6 +36,7 @@
  * @author Mircea.Markus at jboss.com
  * @since 4.0
  */
+ at Marshallable(externalizer = ReplicableCommandExternalizer.class, id = Ids.PUT_MAP_COMMAND)
 public class PutMapCommand implements WriteCommand {
    public static final byte COMMAND_ID = 9;
 

Modified: trunk/core/src/main/java/org/infinispan/commands/write/RemoveCommand.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/commands/write/RemoveCommand.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/commands/write/RemoveCommand.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -25,6 +25,9 @@
 import org.infinispan.commands.read.AbstractDataCommand;
 import org.infinispan.container.entries.MVCCEntry;
 import org.infinispan.context.InvocationContext;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+import org.infinispan.marshall.exts.ReplicableCommandExternalizer;
 import org.infinispan.notifications.cachelistener.CacheNotifier;
 import org.infinispan.util.logging.Log;
 import org.infinispan.util.logging.LogFactory;
@@ -35,6 +38,7 @@
  * @author <a href="mailto:galder.zamarreno at jboss.com">Galder Zamarreno</a>
  * @since 4.0
  */
+ at Marshallable(externalizer = ReplicableCommandExternalizer.class, id = Ids.REMOVE_COMMAND)
 public class RemoveCommand extends AbstractDataCommand implements DataWriteCommand {
    private static final Log log = LogFactory.getLog(RemoveCommand.class);
    private static final boolean trace = log.isTraceEnabled();

Modified: trunk/core/src/main/java/org/infinispan/commands/write/ReplaceCommand.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/commands/write/ReplaceCommand.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/commands/write/ReplaceCommand.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -25,12 +25,16 @@
 import org.infinispan.commands.read.AbstractDataCommand;
 import org.infinispan.container.entries.MVCCEntry;
 import org.infinispan.context.InvocationContext;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+import org.infinispan.marshall.exts.ReplicableCommandExternalizer;
 
 
 /**
  * @author Mircea.Markus at jboss.com
  * @since 4.0
  */
+ at Marshallable(externalizer = ReplicableCommandExternalizer.class, id = Ids.REPLACE_COMMAND)
 public class ReplaceCommand extends AbstractDataCommand implements DataWriteCommand {
    public static final byte COMMAND_ID = 11;
 

Modified: trunk/core/src/main/java/org/infinispan/container/entries/ImmortalCacheEntry.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/container/entries/ImmortalCacheEntry.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/container/entries/ImmortalCacheEntry.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -1,11 +1,19 @@
 package org.infinispan.container.entries;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+
 /**
  * A cache entry that is immortal/cannot expire
  *
  * @author Manik Surtani
  * @since 4.0
  */
+ at Marshallable(externalizer = ImmortalCacheEntry.Externalizer.class, id = Ids.IMMORTAL_ENTRY)
 public class ImmortalCacheEntry extends AbstractInternalCacheEntry {
    private ImmortalCacheValue cacheValue;
 
@@ -100,4 +108,18 @@
       clone.cacheValue = cacheValue.clone();
       return clone;
    }
+   
+   public static class Externalizer implements org.infinispan.marshall.Externalizer {
+      public void writeObject(ObjectOutput output, Object subject) throws IOException {
+         ImmortalCacheEntry ice = (ImmortalCacheEntry) subject;
+         output.writeObject(ice.key);
+         output.writeObject(ice.cacheValue.value);      
+      }
+
+      public Object readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+         Object k = input.readObject();
+         Object v = input.readObject();
+         return new ImmortalCacheEntry(k, v);
+      }
+   }
 }

Modified: trunk/core/src/main/java/org/infinispan/container/entries/ImmortalCacheValue.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/container/entries/ImmortalCacheValue.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/container/entries/ImmortalCacheValue.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -1,14 +1,23 @@
 package org.infinispan.container.entries;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
 import org.infinispan.util.logging.Log;
 import org.infinispan.util.logging.LogFactory;
 
 /**
  * An immortal cache value, to correspond with {@link org.infinispan.container.entries.ImmortalCacheEntry}
+ * 
+ * TODO: Once {@link org.infinispan.marshall.MarshallerImpl} is gone, make the class package private.
  *
  * @author Manik Surtani
  * @since 4.0
  */
+ at Marshallable(externalizer = ImmortalCacheValue.Externalizer.class, id = Ids.IMMORTAL_VALUE)
 public class ImmortalCacheValue implements InternalCacheValue, Cloneable {
    private static final Log log = LogFactory.getLog(ImmortalCacheValue.class);
    Object value;
@@ -87,4 +96,16 @@
          throw new RuntimeException("Should never happen", e);
       }
    }
+   
+   public static class Externalizer implements org.infinispan.marshall.Externalizer {
+      public void writeObject(ObjectOutput output, Object subject) throws IOException {
+         ImmortalCacheValue icv = (ImmortalCacheValue) subject;
+         output.writeObject(icv.value);
+      }
+
+      public Object readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+         Object v = input.readObject();
+         return new ImmortalCacheValue(v);
+      }
+   }
 }

Modified: trunk/core/src/main/java/org/infinispan/container/entries/MortalCacheEntry.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/container/entries/MortalCacheEntry.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/container/entries/MortalCacheEntry.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -1,11 +1,20 @@
 package org.infinispan.container.entries;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.infinispan.io.UnsignedNumeric;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+
 /**
  * A cache entry that is mortal.  I.e., has a lifespan.
  *
  * @author Manik Surtani
  * @since 4.0
  */
+ at Marshallable(externalizer = MortalCacheEntry.Externalizer.class, id = Ids.MORTAL_ENTRY)
 public class MortalCacheEntry extends AbstractInternalCacheEntry {
    private MortalCacheValue cacheValue;
 
@@ -111,4 +120,21 @@
       return clone;
    }
 
+   public static class Externalizer implements org.infinispan.marshall.Externalizer {
+      public void writeObject(ObjectOutput output, Object subject) throws IOException {
+         MortalCacheEntry ice = (MortalCacheEntry) subject;
+         output.writeObject(ice.key);
+         output.writeObject(ice.cacheValue.value);
+         UnsignedNumeric.writeUnsignedLong(output, ice.cacheValue.created);
+         output.writeLong(ice.cacheValue.lifespan); // could be negative so should not use unsigned longs      
+      }
+
+      public Object readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+         Object k = input.readObject();
+         Object v = input.readObject();
+         long created = UnsignedNumeric.readUnsignedLong(input);
+         Long lifespan = input.readLong();
+         return new MortalCacheEntry(k, v, lifespan, created);
+      }      
+   }
 }

Modified: trunk/core/src/main/java/org/infinispan/container/entries/MortalCacheValue.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/container/entries/MortalCacheValue.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/container/entries/MortalCacheValue.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -1,11 +1,20 @@
 package org.infinispan.container.entries;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.infinispan.io.UnsignedNumeric;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+
 /**
  * A mortal cache value, to correspond with {@link org.infinispan.container.entries.MortalCacheEntry}
  *
  * @author Manik Surtani
  * @since 4.0
  */
+ at Marshallable(externalizer = MortalCacheValue.Externalizer.class, id = Ids.MORTAL_VALUE)
 public class MortalCacheValue extends ImmortalCacheValue {
 
    long created;
@@ -84,4 +93,20 @@
    public MortalCacheValue clone() {
       return (MortalCacheValue) super.clone();
    }
+   
+   public static class Externalizer implements org.infinispan.marshall.Externalizer {
+      public void writeObject(ObjectOutput output, Object subject) throws IOException {
+         MortalCacheValue icv = (MortalCacheValue) subject;
+         output.writeObject(icv.value);
+         UnsignedNumeric.writeUnsignedLong(output, icv.created);
+         output.writeLong(icv.lifespan); // could be negative so should not use unsigned longs
+      }
+
+      public Object readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+         Object v = input.readObject();
+         long created = UnsignedNumeric.readUnsignedLong(input);
+         Long lifespan = input.readLong();
+         return new MortalCacheValue(v, created, lifespan);
+      }
+   }
 }

Modified: trunk/core/src/main/java/org/infinispan/container/entries/TransientCacheEntry.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/container/entries/TransientCacheEntry.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/container/entries/TransientCacheEntry.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -1,11 +1,20 @@
 package org.infinispan.container.entries;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.infinispan.io.UnsignedNumeric;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+
 /**
  * A cache entry that is transient, i.e., it can be considered expired afer a period of not being used.
  *
  * @author Manik Surtani
  * @since 4.0
  */
+ at Marshallable(externalizer = TransientCacheEntry.Externalizer.class, id = Ids.TRANSIENT_ENTRY)
 public class TransientCacheEntry extends AbstractInternalCacheEntry {
    private TransientCacheValue cacheValue;
 
@@ -113,4 +122,21 @@
       return clone;
    }
 
+   public static class Externalizer implements org.infinispan.marshall.Externalizer {
+      public void writeObject(ObjectOutput output, Object subject) throws IOException {
+         TransientCacheEntry ice = (TransientCacheEntry) subject;
+         output.writeObject(ice.key);
+         output.writeObject(ice.cacheValue.value);
+         UnsignedNumeric.writeUnsignedLong(output, ice.cacheValue.lastUsed);
+         output.writeLong(ice.cacheValue.maxIdle); // could be negative so should not use unsigned longs
+      }
+
+      public Object readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+         Object k = input.readObject();
+         Object v = input.readObject();
+         long lastUsed = UnsignedNumeric.readUnsignedLong(input);
+         Long maxIdle = input.readLong();
+         return new TransientCacheEntry(k, v, maxIdle, lastUsed);
+      }      
+   }
 }

Modified: trunk/core/src/main/java/org/infinispan/container/entries/TransientCacheValue.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/container/entries/TransientCacheValue.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/container/entries/TransientCacheValue.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -1,11 +1,20 @@
 package org.infinispan.container.entries;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.infinispan.io.UnsignedNumeric;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+
 /**
  * A transient cache value, to correspond with {@link org.infinispan.container.entries.TransientCacheEntry}
  *
  * @author Manik Surtani
  * @since 4.0
  */
+ at Marshallable(externalizer = TransientCacheValue.Externalizer.class, id = Ids.TRANSIENT_VALUE)
 public class TransientCacheValue extends ImmortalCacheValue {
    long maxIdle = -1;
    long lastUsed;
@@ -83,4 +92,20 @@
    public TransientCacheValue clone() {
       return (TransientCacheValue) super.clone();
    }
+   
+   public static class Externalizer implements org.infinispan.marshall.Externalizer {
+      public void writeObject(ObjectOutput output, Object subject) throws IOException {
+         TransientCacheValue icv = (TransientCacheValue) subject;
+         output.writeObject(icv.value);
+         UnsignedNumeric.writeUnsignedLong(output, icv.lastUsed);
+         output.writeLong(icv.maxIdle); // could be negative so should not use unsigned longs
+      }
+
+      public Object readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+         Object v = input.readObject();
+         long lastUsed = UnsignedNumeric.readUnsignedLong(input);
+         Long maxIdle = input.readLong();
+         return new TransientCacheValue(v, maxIdle, lastUsed);
+      }      
+   }
 }

Modified: trunk/core/src/main/java/org/infinispan/container/entries/TransientMortalCacheEntry.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/container/entries/TransientMortalCacheEntry.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/container/entries/TransientMortalCacheEntry.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -1,11 +1,20 @@
 package org.infinispan.container.entries;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.infinispan.io.UnsignedNumeric;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+
 /**
  * A cache entry that is both transient and mortal.
  *
  * @author Manik Surtani
  * @since 4.0
  */
+ at Marshallable(externalizer = TransientMortalCacheEntry.Externalizer.class, id = Ids.TRANSIENT_MORTAL_ENTRY)
 public class TransientMortalCacheEntry extends AbstractInternalCacheEntry {
 
    private TransientMortalCacheValue cacheValue;
@@ -124,5 +133,26 @@
             "} " + super.toString();
    }
 
+   public static class Externalizer implements org.infinispan.marshall.Externalizer {
+      public void writeObject(ObjectOutput output, Object subject) throws IOException {
+         TransientMortalCacheEntry ice = (TransientMortalCacheEntry) subject;
+         output.writeObject(ice.key);
+         output.writeObject(ice.cacheValue.value);
+         UnsignedNumeric.writeUnsignedLong(output, ice.cacheValue.created);
+         output.writeLong(ice.cacheValue.lifespan); // could be negative so should not use unsigned longs
+         UnsignedNumeric.writeUnsignedLong(output, ice.cacheValue.lastUsed);
+         output.writeLong(ice.cacheValue.maxIdle); // could be negative so should not use unsigned longs
+      }
+
+      public Object readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+         Object k = input.readObject();
+         Object v = input.readObject();
+         long created = UnsignedNumeric.readUnsignedLong(input);
+         Long lifespan = input.readLong();
+         long lastUsed = UnsignedNumeric.readUnsignedLong(input);
+         Long maxIdle = input.readLong();
+         return new TransientMortalCacheEntry(k, v, maxIdle, lifespan, lastUsed, created);
+      }
+   }
 }
 

Modified: trunk/core/src/main/java/org/infinispan/container/entries/TransientMortalCacheValue.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/container/entries/TransientMortalCacheValue.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/container/entries/TransientMortalCacheValue.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -1,11 +1,20 @@
 package org.infinispan.container.entries;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.infinispan.io.UnsignedNumeric;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+
 /**
  * A transient, mortal cache value to correspond with {@link org.infinispan.container.entries.TransientMortalCacheEntry}
  *
  * @author Manik Surtani
  * @since 4.0
  */
+ at Marshallable(externalizer = TransientMortalCacheValue.Externalizer.class, id = Ids.TRANSIENT_MORTAL_VALUE)
 public class TransientMortalCacheValue extends MortalCacheValue {
    long maxIdle = -1;
    long lastUsed;
@@ -85,4 +94,24 @@
    public TransientMortalCacheValue clone() {
       return (TransientMortalCacheValue) super.clone();
    }
+   
+   public static class Externalizer implements org.infinispan.marshall.Externalizer {
+      public void writeObject(ObjectOutput output, Object subject) throws IOException {
+         TransientMortalCacheValue icv = (TransientMortalCacheValue) subject;
+         output.writeObject(icv.value);
+         UnsignedNumeric.writeUnsignedLong(output, icv.created);
+         output.writeLong(icv.lifespan); // could be negative so should not use unsigned longs
+         UnsignedNumeric.writeUnsignedLong(output, icv.lastUsed);
+         output.writeLong(icv.maxIdle); // could be negative so should not use unsigned longs
+      }
+
+      public Object readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+         Object v = input.readObject();
+         long created = UnsignedNumeric.readUnsignedLong(input);
+         Long lifespan = input.readLong();
+         long lastUsed = UnsignedNumeric.readUnsignedLong(input);
+         Long maxIdle = input.readLong();
+         return new TransientMortalCacheValue(v, created, lifespan, maxIdle, lastUsed);
+      }      
+   }
 }

Modified: trunk/core/src/main/java/org/infinispan/loaders/bucket/Bucket.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/loaders/bucket/Bucket.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/loaders/bucket/Bucket.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -1,9 +1,13 @@
 package org.infinispan.loaders.bucket;
 
 import org.infinispan.container.entries.InternalCacheEntry;
+import org.infinispan.io.UnsignedNumeric;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
 
 import java.io.IOException;
 import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -12,6 +16,7 @@
 /**
  * A bucket is where entries are stored.
  */
+ at Marshallable(externalizer = Bucket.Externalizer.class, id = Ids.BUCKET)
 public final class Bucket {
    private Map<Object, InternalCacheEntry> entries = new HashMap<Object, InternalCacheEntry>();
    private transient String bucketName;
@@ -95,4 +100,20 @@
    public void clearEntries() {
       entries.clear();
    }
+   
+   public static class Externalizer implements org.infinispan.marshall.Externalizer {
+      public void writeObject(ObjectOutput output, Object subject) throws IOException {
+         Bucket b = (Bucket) subject;
+         Map<Object, InternalCacheEntry> entries = b.entries;
+         UnsignedNumeric.writeUnsignedInt(output, entries.size());
+         for (InternalCacheEntry se : entries.values()) output.writeObject(se);
+      }
+
+      public Object readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+         Bucket b = new Bucket();
+         int numEntries = UnsignedNumeric.readUnsignedInt(input);
+         for (int i = 0; i < numEntries; i++) b.addEntry((InternalCacheEntry) input.readObject());
+         return b;
+      }
+   }
 }

Modified: trunk/core/src/main/java/org/infinispan/marshall/Externalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/Externalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/Externalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -25,6 +25,8 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 
+import org.infinispan.marshall.jboss.ConstantObjectTable;
+
 /**
  * Extended interface that extends capabilities of writing predefined objects 
  * with the possibility of reading them. Any new externalizer implementations
@@ -32,12 +34,16 @@
  * information to the wire as they wish. See {@link ReplicableCommandExternalizer} 
  * for an such example.
  * 
- * To add a new non-user Externalizer, follow these steps:
+ * To add a new {@link Externalizer}, follow these steps:
  * 
- * 1. Create an implementation of Externalizer.
+ * 1. Create an implementation of {@link Externalizer}.
  * 
- * 2. Add Class to Externalizer mapping to ConstantObjectTable.EXTERNALIZERS
+ * 2. Add class that {@link Externalizer} implementation marshalls to set in 
+ * {@link ConstantObjectTable.MARSHALLABLES}
  * 
+ * 3. Annotate the class being marshalled with {@link Marshallable} indicating the 
+ * {@link Externalizer} implementation and a unique index number.
+ * 
  * @author Galder Zamarreño
  * @since 4.0
  */

Added: trunk/core/src/main/java/org/infinispan/marshall/Ids.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/Ids.java	                        (rev 0)
+++ trunk/core/src/main/java/org/infinispan/marshall/Ids.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -0,0 +1,94 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.infinispan.marshall;
+
+/**
+ * Indexes.
+ * 
+ * @author Galder Zamarreño
+ * @since 4.0
+ */
+public interface Ids {
+   /** ids for jdk classes **/
+   
+   static final byte ARRAY_LIST = 0;
+   static final byte LINKED_LIST = 1;
+   static final byte JDK_MAPS = 2;
+   static final byte JDK_SETS = 3;
+   static final byte SINGLETON_LIST = 4; 
+
+   /** ids for infinispan core classes **/
+
+   // responses
+   static final byte SUCCESSFUL_RESPONSE = 5;
+   static final byte EXTENDED_RESPONSE = 6; 
+   static final byte EXCEPTION_RESPONSE = 7;
+   static final byte UNSUCCESSFUL_RESPONSE = 8;
+   static final byte REQUEST_IGNORED_RESPONSE = 9;
+   
+   // entries and values
+   static final byte IMMORTAL_ENTRY = 10; 
+   static final byte MORTAL_ENTRY = 11;
+   static final byte TRANSIENT_ENTRY = 12;
+   static final byte TRANSIENT_MORTAL_ENTRY = 13;
+   static final byte IMMORTAL_VALUE = 14; 
+   static final byte MORTAL_VALUE = 15; 
+   static final byte TRANSIENT_VALUE = 16;
+   static final byte TRANSIENT_MORTAL_VALUE = 17;
+
+   // internal collections
+   static final byte FASTCOPY_HASHMAP = 18;
+   static final byte IMMUTABLE_MAP = 19;
+   static final byte ATOMIC_HASH_MAP = 20;
+
+   // commands
+   static final byte STATE_TRANSFER_CONTROL_COMMAND = 21;
+   static final byte CLUSTERED_GET_COMMAND = 22;
+   static final byte MULTIPLE_RPC_COMMAND = 23;
+   static final byte SINGLE_RPC_COMMAND = 24;
+   static final byte GET_KEY_VALUE_COMMAND = 25;
+   static final byte PUT_KEY_VALUE_COMMAND = 26;
+   static final byte REMOVE_COMMAND = 27;
+   static final byte INVALIDATE_COMMAND = 28; 
+   static final byte REPLACE_COMMAND = 29;
+   static final byte CLEAR_COMMAND = 30;
+   static final byte PUT_MAP_COMMAND = 31; 
+   static final byte PREPARE_COMMAND = 32;
+   static final byte COMMIT_COMMAND = 33;
+   static final byte ROLLBACK_COMMAND = 34;
+   static final byte INVALIDATE_L1_COMMAND = 35;
+   static final byte LOCK_CONTROL_COMMAND = 36;
+   static final byte EVICT_COMMAND = 37;
+
+   // others
+   static final byte GLOBAL_TRANSACTION = 38;
+   static final byte JGROUPS_ADDRESS = 39;
+   static final byte MARSHALLED_VALUE = 40;
+   static final byte TRANSACTION_LOG_ENTRY = 41; 
+   static final byte BUCKET = 42;
+   static final byte DEADLOCK_DETECTING_GLOBAL_TRANSACTION = 43;
+   
+   /** ids for infinispan tree classes **/
+
+   static final byte NODE_KEY = 44;
+   static final byte FQN = 45;
+}

Added: trunk/core/src/main/java/org/infinispan/marshall/Marshallable.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/Marshallable.java	                        (rev 0)
+++ trunk/core/src/main/java/org/infinispan/marshall/Marshallable.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.infinispan.marshall;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation is used for those classes that need to be marshalled/unmarshalled between nodes
+ * in the cluster or to/from cahe stores. Such classes need to provide an implementation for 
+ * {@link Externalizer} interface and a unique index number (see {@link Ids} for index numbers 
+ * currently allocated).
+ * 
+ * @author Galder Zamarreño
+ * @since 4.0
+ */
+//ensure this annotation is available at runtime.
+ at Retention(RetentionPolicy.RUNTIME)
+
+// only applies to classes.
+ at Target(ElementType.TYPE) 
+public @interface Marshallable {
+   
+   Class<? extends Externalizer> externalizer() default Externalizer.class;
+   
+   int id();
+   
+}

Modified: trunk/core/src/main/java/org/infinispan/marshall/MarshalledValue.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/MarshalledValue.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/MarshalledValue.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -24,10 +24,13 @@
 import org.infinispan.CacheException;
 import org.infinispan.commands.ReplicableCommand;
 import org.infinispan.io.ExposedByteArrayOutputStream;
+import org.infinispan.io.UnsignedNumeric;
 import org.infinispan.remoting.transport.Address;
 import org.infinispan.transaction.xa.GlobalTransaction;
 
+import java.io.IOException;
 import java.io.NotSerializableException;
+import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.io.Serializable;
 import java.util.Arrays;
@@ -45,6 +48,7 @@
  * @see org.infinispan.interceptors.MarshalledValueInterceptor
  * @since 4.0
  */
+ at Marshallable(externalizer = MarshalledValue.Externalizer.class, id = Ids.MARSHALLED_VALUE)
 public class MarshalledValue {
    protected Object instance;
    protected byte[] raw;
@@ -216,4 +220,28 @@
             (type.isArray() && isTypeExcluded(type.getComponentType())) || type.equals(GlobalTransaction.class) || Address.class.isAssignableFrom(type) ||
             ReplicableCommand.class.isAssignableFrom(type) || type.equals(MarshalledValue.class);
    }
+   
+   public static class Externalizer implements org.infinispan.marshall.Externalizer {
+      private Marshaller marshaller;
+      
+      public void inject(Marshaller marshaller) {
+         this.marshaller = marshaller;
+      }
+      
+      public void writeObject(ObjectOutput output, Object subject) throws IOException {
+         MarshalledValue mv = ((MarshalledValue) subject);
+         byte[] raw = mv.getRaw();
+         UnsignedNumeric.writeUnsignedInt(output, raw.length);
+         output.write(raw);
+         output.writeInt(mv.hashCode());      
+      }
+
+      public Object readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+         int length = UnsignedNumeric.readUnsignedInt(input);
+         byte[] raw = new byte[length];
+         input.readFully(raw);
+         int hc = input.readInt();
+         return new MarshalledValue(raw, hc, marshaller);
+      }
+   }
 }

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/ArrayListExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/ArrayListExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/ArrayListExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -25,7 +25,9 @@
 
 import org.infinispan.io.UnsignedNumeric;
 import org.infinispan.marshall.Externalizer;
+import org.infinispan.marshall.Ids;
 import org.infinispan.marshall.MarshallUtil;
+import org.infinispan.marshall.Marshallable;
 
 import java.io.IOException;
 import java.io.ObjectInput;
@@ -40,6 +42,7 @@
  * @since 4.0
  */
 @Immutable
+ at Marshallable(id = Ids.ARRAY_LIST)
 public class ArrayListExternalizer implements Externalizer {
 
    public void writeObject(ObjectOutput output, Object subject) throws IOException {

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/BucketExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/BucketExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/BucketExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -38,6 +38,7 @@
  * 
  * @author Galder Zamarreño
  * @since 4.0
+ * @deprecated Externalizer implementation now within {@link Bucket}
  */
 @Immutable
 public class BucketExternalizer implements Externalizer {

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/DeadlockDetectingGlobalTransactionExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/DeadlockDetectingGlobalTransactionExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/DeadlockDetectingGlobalTransactionExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -11,6 +11,7 @@
  * Externalizer for {@link DeadlockDetectingGlobalTransaction}.
  *
  * @author Mircea.Markus at jboss.com
+ * @deprecated Externalizer implementation now within {@link DeadlockDetectingGlobalTransaction}
  */
 public class DeadlockDetectingGlobalTransactionExternalizer extends GlobalTransactionExternalizer {
 

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/DeltaAwareExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/DeltaAwareExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/DeltaAwareExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -22,6 +22,8 @@
 package org.infinispan.marshall.exts;
 
 import net.jcip.annotations.Immutable;
+
+import org.infinispan.atomic.AtomicHashMap;
 import org.infinispan.atomic.DeltaAware;
 import org.infinispan.marshall.Externalizer;
 
@@ -34,6 +36,7 @@
  *
  * @author Galder Zamarreño
  * @since 4.0
+ * @deprecated Externalizer implementation now within {@link AtomicHashMap} 
  */
 @Immutable
 public class DeltaAwareExternalizer implements Externalizer {

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/ExceptionResponseExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/ExceptionResponseExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/ExceptionResponseExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -14,6 +14,7 @@
  *
  * @author Manik Surtani
  * @since 4.0
+ * @deprecated Externalizer implementation now within {@link ExceptionResponse}
  */
 @Immutable
 public class ExceptionResponseExternalizer implements Externalizer {

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/ExtendedResponseExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/ExtendedResponseExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/ExtendedResponseExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -36,6 +36,7 @@
  *
  * @author Galder Zamarreño
  * @since 4.0
+ * @deprecated Externalizer implementation now within {@link ExtendedResponse}
  */
 @Immutable
 public class ExtendedResponseExternalizer implements Externalizer {

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/GlobalTransactionExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/GlobalTransactionExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/GlobalTransactionExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -35,7 +35,9 @@
  *
  * @author Galder Zamarreño
  * @since 4.0
+ * @deprecated Externalizer implementation now within {@link GlobalTransaction}
  */
+ at Deprecated
 public class GlobalTransactionExternalizer implements Externalizer {
 
    protected GlobalTransactionFactory gtxFactory = new GlobalTransactionFactory();

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/ImmortalCacheEntryExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/ImmortalCacheEntryExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/ImmortalCacheEntryExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -36,6 +36,7 @@
  * 
  * @author Galder Zamarreño
  * @since 4.0 
+ * @deprecated Externalizer implementation now within {@link ImmortalCacheEntry}
  */
 @Immutable
 public class ImmortalCacheEntryExternalizer implements Externalizer {

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/ImmortalCacheValueExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/ImmortalCacheValueExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/ImmortalCacheValueExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -36,6 +36,7 @@
  * 
  * @author Galder Zamarreño
  * @since 4.0
+ * @deprecated Externalizer implementation now within {@link ImmortalCacheValue}
  */
 @Immutable
 public class ImmortalCacheValueExternalizer implements Externalizer {

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/ImmutableMapExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/ImmutableMapExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/ImmutableMapExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -38,6 +38,7 @@
  *
  * @author Galder Zamarreño
  * @since 4.0
+ * @deprecated Externalizer implementation now within {@link Immutables.ImmutableMapWrapper}
  */
 @Immutable
 public class ImmutableMapExternalizer implements Externalizer {

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/JGroupsAddressExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/JGroupsAddressExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/JGroupsAddressExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -34,6 +34,7 @@
  *
  * @author Galder Zamarreño
  * @since 4.0
+ * @deprecated Externalizer implementation now within {@link JGroupsAddress}
  */
 @Immutable
 public class JGroupsAddressExternalizer implements Externalizer {

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/LinkedListExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/LinkedListExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/LinkedListExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -25,7 +25,9 @@
 
 import org.infinispan.io.UnsignedNumeric;
 import org.infinispan.marshall.Externalizer;
+import org.infinispan.marshall.Ids;
 import org.infinispan.marshall.MarshallUtil;
+import org.infinispan.marshall.Marshallable;
 
 import java.io.IOException;
 import java.io.ObjectInput;
@@ -40,6 +42,7 @@
  * @since 4.0
  */
 @Immutable
+ at Marshallable(id = Ids.LINKED_LIST)
 public class LinkedListExternalizer implements Externalizer {
 
    public void writeObject(ObjectOutput output, Object subject) throws IOException {

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/MapExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/MapExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/MapExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -23,6 +23,8 @@
 
 import org.infinispan.marshall.Externalizer;
 import org.infinispan.marshall.MarshallUtil;
+import org.infinispan.marshall.Marshallable;
+import org.infinispan.marshall.Ids;
 import org.infinispan.util.FastCopyHashMap;
 import org.jboss.marshalling.util.IdentityIntMap;
 
@@ -40,6 +42,7 @@
  * @author Galder Zamarreño
  * @since 4.0
  */
+ at Marshallable(id = Ids.JDK_MAPS)
 public class MapExternalizer implements Externalizer {
    private static final int HASHMAP = 0;
    private static final int TREEMAP = 1;
@@ -54,7 +57,7 @@
 
    public void writeObject(ObjectOutput output, Object subject) throws IOException {
       int number = numbers.get(subject.getClass(), -1);
-      output.writeByte(number);
+      output.write(number);
       MarshallUtil.marshallMap((Map) subject, output);
    }
 

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/MarshalledValueExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/MarshalledValueExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/MarshalledValueExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -34,6 +34,7 @@
  *
  * @author Galder Zamarreño
  * @since 4.0
+ * @deprecated Externalizer implementation now within {@link MarshalledValue}
  */
 public class MarshalledValueExternalizer implements Externalizer {
    private org.infinispan.marshall.Marshaller ispnMarshaller;

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/MortalCacheEntryExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/MortalCacheEntryExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/MortalCacheEntryExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -37,6 +37,7 @@
  * 
  * @author Galder Zamarreño
  * @since 4.0
+ * @deprecated Externalizer implementation now within {@link MortalCacheEntry}
  */
 @Immutable
 public class MortalCacheEntryExternalizer implements Externalizer {

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/MortalCacheValueExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/MortalCacheValueExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/MortalCacheValueExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -35,6 +35,7 @@
  * 
  * @author Galder Zamarreño
  * @since 4.0
+ * @deprecated Externalizer implementation now within {@link MortalCacheValue}
  */
 public class MortalCacheValueExternalizer implements Externalizer {
 

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/ReplicableCommandExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/ReplicableCommandExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/ReplicableCommandExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -38,7 +38,7 @@
 public class ReplicableCommandExternalizer implements Externalizer {
    private RemoteCommandFactory cmdFactory;
    
-   public void init(RemoteCommandFactory cmdFactory) {
+   public void inject(RemoteCommandFactory cmdFactory) {
       this.cmdFactory = cmdFactory;
    }
 

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/SetExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/SetExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/SetExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -25,7 +25,9 @@
 
 import org.infinispan.io.UnsignedNumeric;
 import org.infinispan.marshall.Externalizer;
+import org.infinispan.marshall.Ids;
 import org.infinispan.marshall.MarshallUtil;
+import org.infinispan.marshall.Marshallable;
 import org.jboss.marshalling.util.IdentityIntMap;
 
 import java.io.IOException;
@@ -43,6 +45,7 @@
  * @since 4.0
  */
 @Immutable
+ at Marshallable(id = Ids.JDK_SETS)
 public class SetExternalizer implements Externalizer {
    private static final int HASHSET = 0;
    private static final int TREESET = 1;

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/SingletonListExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/SingletonListExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/SingletonListExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -24,6 +24,8 @@
 import net.jcip.annotations.Immutable; 
 
 import org.infinispan.marshall.Externalizer;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
 
 import java.io.IOException;
 import java.io.ObjectInput;
@@ -38,6 +40,7 @@
  * @since 4.0
  */
 @Immutable
+ at Marshallable(id = Ids.SINGLETON_LIST)
 public class SingletonListExternalizer implements Externalizer {
 
    public void writeObject(ObjectOutput output, Object subject) throws IOException {

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/SuccessfulResponseExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/SuccessfulResponseExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/SuccessfulResponseExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -14,6 +14,7 @@
  *
  * @author Manik Surtani
  * @since 4.0
+ * @deprecated Externalizer implementation now within {@link SuccessfulResponse}
  */
 @Immutable
 public class SuccessfulResponseExternalizer implements Externalizer {

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/TransactionLogExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/TransactionLogExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/TransactionLogExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -37,6 +37,7 @@
  *
  * @author Galder Zamarreño
  * @since 4.0
+ * @deprecated Externalizer implementation now within {@link TransactionLog.LogEntry}
  */
 @Immutable
 public class TransactionLogExternalizer implements Externalizer {

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/TransientCacheEntryExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/TransientCacheEntryExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/TransientCacheEntryExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -37,6 +37,7 @@
  * 
  * @author Galder Zamarreño
  * @since 4.0
+ * @deprecated Externalizer implementation now within {@link TransientCacheEntry}
  */
 @Immutable
 public class TransientCacheEntryExternalizer implements Externalizer {

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/TransientCacheValueExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/TransientCacheValueExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/TransientCacheValueExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -37,6 +37,7 @@
  * 
  * @author Galder Zamarreño
  * @since 4.0
+ * @deprecated Externalizer implementation now within {@link TransientCacheValue}
  */
 @Immutable
 public class TransientCacheValueExternalizer implements Externalizer {

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/TransientMortalCacheEntryExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/TransientMortalCacheEntryExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/TransientMortalCacheEntryExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -37,6 +37,7 @@
  * 
  * @author Galder Zamarreño
  * @since 4.0
+ * @deprecated Externalizer implementation now within {@link TransientMortalCacheEntry}
  */
 @Immutable
 public class TransientMortalCacheEntryExternalizer implements Externalizer {

Modified: trunk/core/src/main/java/org/infinispan/marshall/exts/TransientMortalCacheValueExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/exts/TransientMortalCacheValueExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/exts/TransientMortalCacheValueExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -37,6 +37,7 @@
  * 
  * @author Galder Zamarreño
  * @since 4.0
+ * @deprecated Externalizer implementation now within {@link TransientMortalCacheValue}
  */
 @Immutable
 public class TransientMortalCacheValueExternalizer implements Externalizer {

Modified: trunk/core/src/main/java/org/infinispan/marshall/jboss/ConstantObjectTable.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/jboss/ConstantObjectTable.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/jboss/ConstantObjectTable.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -48,12 +48,16 @@
 import org.infinispan.container.entries.TransientCacheValue;
 import org.infinispan.container.entries.TransientMortalCacheEntry;
 import org.infinispan.container.entries.TransientMortalCacheValue;
-import org.infinispan.factories.scopes.Scope;
-import org.infinispan.factories.scopes.Scopes;
 import org.infinispan.loaders.bucket.Bucket;
 import org.infinispan.marshall.Externalizer;
+import org.infinispan.marshall.Marshallable;
 import org.infinispan.marshall.MarshalledValue;
-import org.infinispan.marshall.exts.*;
+import org.infinispan.marshall.exts.ArrayListExternalizer;
+import org.infinispan.marshall.exts.LinkedListExternalizer;
+import org.infinispan.marshall.exts.MapExternalizer;
+import org.infinispan.marshall.exts.ReplicableCommandExternalizer;
+import org.infinispan.marshall.exts.SetExternalizer;
+import org.infinispan.marshall.exts.SingletonListExternalizer;
 import org.infinispan.remoting.responses.ExceptionResponse;
 import org.infinispan.remoting.responses.ExtendedResponse;
 import org.infinispan.remoting.responses.RequestIgnoredResponse;
@@ -63,6 +67,7 @@
 import org.infinispan.transaction.xa.DeadlockDetectingGlobalTransaction;
 import org.infinispan.transaction.xa.GlobalTransaction;
 import org.infinispan.util.FastCopyHashMap;
+import org.infinispan.util.ReflectionUtil;
 import org.infinispan.util.Util;
 import org.infinispan.util.logging.Log;
 import org.infinispan.util.logging.LogFactory;
@@ -71,15 +76,13 @@
 import org.jboss.marshalling.Unmarshaller;
 
 import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.IdentityHashMap;
 import java.util.LinkedList;
-import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.TreeMap;
 import java.util.TreeSet;
 
@@ -92,158 +95,152 @@
  * @author Galder Zamarreño
  * @since 4.0
  */
- at Scope(Scopes.GLOBAL)
 public class ConstantObjectTable implements ObjectTable {
    private static final Log log = LogFactory.getLog(ConstantObjectTable.class);
-   private static final int CAPACITY = 50;
-   private static final Map<String, String> EXTERNALIZERS = new HashMap<String, String>(CAPACITY);
+   private static final Map<String, String> JDK_EXTERNALIZERS = new HashMap<String, String>();
+   static final Set<String> MARSHALLABLES = new HashSet<String>();
 
    static {
-      EXTERNALIZERS.put(GlobalTransaction.class.getName(), GlobalTransactionExternalizer.class.getName());
-      EXTERNALIZERS.put(DeadlockDetectingGlobalTransaction.class.getName(), DeadlockDetectingGlobalTransactionExternalizer.class.getName());
-      EXTERNALIZERS.put(JGroupsAddress.class.getName(), JGroupsAddressExternalizer.class.getName());
-      EXTERNALIZERS.put(ArrayList.class.getName(), ArrayListExternalizer.class.getName());
-      EXTERNALIZERS.put(LinkedList.class.getName(), LinkedListExternalizer.class.getName());
-      EXTERNALIZERS.put(HashMap.class.getName(), MapExternalizer.class.getName());
-      EXTERNALIZERS.put(TreeMap.class.getName(), MapExternalizer.class.getName());
-      EXTERNALIZERS.put(HashSet.class.getName(), SetExternalizer.class.getName());
-      EXTERNALIZERS.put(TreeSet.class.getName(), SetExternalizer.class.getName());
-      EXTERNALIZERS.put("org.infinispan.util.Immutables$ImmutableMapWrapper", ImmutableMapExternalizer.class.getName());
-      EXTERNALIZERS.put(MarshalledValue.class.getName(), MarshalledValueExternalizer.class.getName());
-      EXTERNALIZERS.put(FastCopyHashMap.class.getName(), MapExternalizer.class.getName());
-      EXTERNALIZERS.put("java.util.Collections$SingletonList", SingletonListExternalizer.class.getName());
-      EXTERNALIZERS.put("org.infinispan.transaction.TransactionLog$LogEntry", TransactionLogExternalizer.class.getName());
-      EXTERNALIZERS.put(ExtendedResponse.class.getName(), ExtendedResponseExternalizer.class.getName());
-      EXTERNALIZERS.put(SuccessfulResponse.class.getName(), SuccessfulResponseExternalizer.class.getName());
-      EXTERNALIZERS.put(ExceptionResponse.class.getName(), ExceptionResponseExternalizer.class.getName());
-      EXTERNALIZERS.put(AtomicHashMap.class.getName(), DeltaAwareExternalizer.class.getName());
+      JDK_EXTERNALIZERS.put(ArrayList.class.getName(), ArrayListExternalizer.class.getName());
+      JDK_EXTERNALIZERS.put(LinkedList.class.getName(), LinkedListExternalizer.class.getName());
+      JDK_EXTERNALIZERS.put(HashMap.class.getName(), MapExternalizer.class.getName());
+      JDK_EXTERNALIZERS.put(TreeMap.class.getName(), MapExternalizer.class.getName());
+      JDK_EXTERNALIZERS.put(HashSet.class.getName(), SetExternalizer.class.getName());
+      JDK_EXTERNALIZERS.put(TreeSet.class.getName(), SetExternalizer.class.getName());
+      JDK_EXTERNALIZERS.put("java.util.Collections$SingletonList", SingletonListExternalizer.class.getName());
+      
+      MARSHALLABLES.add(GlobalTransaction.class.getName());
+      MARSHALLABLES.add(DeadlockDetectingGlobalTransaction.class.getName());
+      MARSHALLABLES.add(JGroupsAddress.class.getName());
+      MARSHALLABLES.add("org.infinispan.util.Immutables$ImmutableMapWrapper");
+      MARSHALLABLES.add(MarshalledValue.class.getName());
+      MARSHALLABLES.add(FastCopyHashMap.class.getName());
+      
+      MARSHALLABLES.add("org.infinispan.transaction.TransactionLog$LogEntry");
+      MARSHALLABLES.add(ExtendedResponse.class.getName());
+      MARSHALLABLES.add(SuccessfulResponse.class.getName());
+      MARSHALLABLES.add(ExceptionResponse.class.getName());
+      MARSHALLABLES.add(RequestIgnoredResponse.class.getName());
+      MARSHALLABLES.add(UnsuccessfulResponse.class.getName());
 
-      EXTERNALIZERS.put(StateTransferControlCommand.class.getName(), ReplicableCommandExternalizer.class.getName());
-      EXTERNALIZERS.put(ClusteredGetCommand.class.getName(), ReplicableCommandExternalizer.class.getName());
-      EXTERNALIZERS.put(MultipleRpcCommand.class.getName(), ReplicableCommandExternalizer.class.getName());
-      EXTERNALIZERS.put(SingleRpcCommand.class.getName(), ReplicableCommandExternalizer.class.getName());
-      EXTERNALIZERS.put(GetKeyValueCommand.class.getName(), ReplicableCommandExternalizer.class.getName());
-      EXTERNALIZERS.put(PutKeyValueCommand.class.getName(), ReplicableCommandExternalizer.class.getName());
-      EXTERNALIZERS.put(RemoveCommand.class.getName(), ReplicableCommandExternalizer.class.getName());
-      EXTERNALIZERS.put(InvalidateCommand.class.getName(), ReplicableCommandExternalizer.class.getName());
-      EXTERNALIZERS.put(ReplaceCommand.class.getName(), ReplicableCommandExternalizer.class.getName());
-      EXTERNALIZERS.put(ClearCommand.class.getName(), ReplicableCommandExternalizer.class.getName());
-      EXTERNALIZERS.put(PutMapCommand.class.getName(), ReplicableCommandExternalizer.class.getName());
-      EXTERNALIZERS.put(PrepareCommand.class.getName(), ReplicableCommandExternalizer.class.getName());
-      EXTERNALIZERS.put(CommitCommand.class.getName(), ReplicableCommandExternalizer.class.getName());
-      EXTERNALIZERS.put(RollbackCommand.class.getName(), ReplicableCommandExternalizer.class.getName());
-      EXTERNALIZERS.put(InvalidateL1Command.class.getName(), ReplicableCommandExternalizer.class.getName());
-      EXTERNALIZERS.put(LockControlCommand.class.getName(), ReplicableCommandExternalizer.class.getName());
+      MARSHALLABLES.add(StateTransferControlCommand.class.getName());
+      MARSHALLABLES.add(ClusteredGetCommand.class.getName());
+      MARSHALLABLES.add(MultipleRpcCommand.class.getName());
+      MARSHALLABLES.add(SingleRpcCommand.class.getName());
+      MARSHALLABLES.add(GetKeyValueCommand.class.getName());
+      MARSHALLABLES.add(PutKeyValueCommand.class.getName());
+      MARSHALLABLES.add(RemoveCommand.class.getName());
+      MARSHALLABLES.add(InvalidateCommand.class.getName());
+      MARSHALLABLES.add(ReplaceCommand.class.getName());
+      MARSHALLABLES.add(ClearCommand.class.getName());
+      MARSHALLABLES.add(PutMapCommand.class.getName());
+      MARSHALLABLES.add(PrepareCommand.class.getName());
+      MARSHALLABLES.add(CommitCommand.class.getName());
+      MARSHALLABLES.add(RollbackCommand.class.getName());
+      MARSHALLABLES.add(InvalidateL1Command.class.getName());
+      MARSHALLABLES.add(LockControlCommand.class.getName());
 
-      EXTERNALIZERS.put(ImmortalCacheEntry.class.getName(), ImmortalCacheEntryExternalizer.class.getName());
-      EXTERNALIZERS.put(MortalCacheEntry.class.getName(), MortalCacheEntryExternalizer.class.getName());
-      EXTERNALIZERS.put(TransientCacheEntry.class.getName(), TransientCacheEntryExternalizer.class.getName());
-      EXTERNALIZERS.put(TransientMortalCacheEntry.class.getName(), TransientMortalCacheEntryExternalizer.class.getName());    
-      EXTERNALIZERS.put(ImmortalCacheValue.class.getName(), ImmortalCacheValueExternalizer.class.getName());
-      EXTERNALIZERS.put(MortalCacheValue.class.getName(), MortalCacheValueExternalizer.class.getName());
-      EXTERNALIZERS.put(TransientCacheValue.class.getName(), TransientCacheValueExternalizer.class.getName());
-      EXTERNALIZERS.put(TransientMortalCacheValue.class.getName(), TransientMortalCacheValueExternalizer.class.getName());
+      MARSHALLABLES.add(ImmortalCacheEntry.class.getName());
+      MARSHALLABLES.add(MortalCacheEntry.class.getName());
+      MARSHALLABLES.add(TransientCacheEntry.class.getName());
+      MARSHALLABLES.add(TransientMortalCacheEntry.class.getName());    
+      MARSHALLABLES.add(ImmortalCacheValue.class.getName());
+      MARSHALLABLES.add(MortalCacheValue.class.getName());
+      MARSHALLABLES.add(TransientCacheValue.class.getName());
+      MARSHALLABLES.add(TransientMortalCacheValue.class.getName());
       
-      EXTERNALIZERS.put(Bucket.class.getName(), BucketExternalizer.class.getName());
+      MARSHALLABLES.add(AtomicHashMap.class.getName());
+      MARSHALLABLES.add(Bucket.class.getName());
       
-      EXTERNALIZERS.put("org.infinispan.tree.NodeKey", "org.infinispan.tree.marshall.exts.NodeKeyExternalizer");
-      EXTERNALIZERS.put("org.infinispan.tree.Fqn", "org.infinispan.tree.marshall.exts.FqnExternalizer");
+      MARSHALLABLES.add("org.infinispan.tree.NodeKey");
+      MARSHALLABLES.add("org.infinispan.tree.Fqn");
    }
 
-   /** Contains list of singleton objects written such as constant objects, 
-    * singleton Externalizer implementations...etc. When writing, index of each 
-    * object is written, and when reading, index is used to find the instance 
-    * in this list.*/
-   private final List<Object> objects = new ArrayList<Object>(CAPACITY);
-   
-   /** Contains mapping of constant instances to their writers and also custom 
-    * object externalizer classes to their Externalizer instances. 
-    * Do not use this map for storing Externalizer implementations for user 
-    * classes. For these, please use weak key based maps, i.e WeakHashMap */
-   private final Map<Class<?>, ExternalizerAdapter> writers = new IdentityHashMap<Class<?>, ExternalizerAdapter>(CAPACITY);
+   /** Contains mapping of classes to their corresponding Externalizer classes via ExternalizerAdapter instances. */
+   private final Map<Class<?>, ExternalizerAdapter> writers = new IdentityHashMap<Class<?>, ExternalizerAdapter>();
 
-   private byte index;
+   /** Contains mapping of ids to their corresponding Externalizer classes via ExternalizerAdapter instances. */
+   private final Map<Integer, ExternalizerAdapter> readers = new HashMap<Integer, ExternalizerAdapter>();
 
-   public void init(RemoteCommandFactory cmdFactory, org.infinispan.marshall.Marshaller ispnMarshaller) {
-      // Init singletons
-      ExternalizerAdapter adapter = new ExternalizerAdapter(index++, new InstanceWriter(RequestIgnoredResponse.INSTANCE));
-      objects.add(adapter);
-      writers.put(RequestIgnoredResponse.class, adapter);
-      adapter = new ExternalizerAdapter(index++, new InstanceWriter(UnsuccessfulResponse.INSTANCE));
-      objects.add(adapter);
-      writers.put(UnsuccessfulResponse.class, adapter);
+   public void start(RemoteCommandFactory cmdFactory, org.infinispan.marshall.Marshaller ispnMarshaller) {
+      HashSet<Integer> ids = new HashSet<Integer>();
       
       try {
-         for (Map.Entry<String, String> entry : EXTERNALIZERS.entrySet()) {
+         for (Map.Entry<String, String> entry : JDK_EXTERNALIZERS.entrySet()) {
             try {
-               Class typeClazz = Util.loadClass(entry.getKey());
-               Externalizer delegate = (Externalizer) Util.getInstance(entry.getValue());
-               if (delegate instanceof ReplicableCommandExternalizer) {
-                  ((ReplicableCommandExternalizer) delegate).init(cmdFactory);
-               }
-               if (delegate instanceof MarshalledValueExternalizer) {
-                  ((MarshalledValueExternalizer) delegate).init(ispnMarshaller);
-               }
-               ExternalizerAdapter rwrt = new ExternalizerAdapter(index++, delegate);
-               objects.add(rwrt);
-               writers.put(typeClazz, rwrt);               
+               Class clazz = Util.loadClass(entry.getKey());
+               Externalizer ext = (Externalizer) Util.getInstance(entry.getValue());
+               Marshallable marshallable = ReflectionUtil.getAnnotation(ext.getClass(), Marshallable.class);
+               int id = marshallable.id();
+               ids.add(id);
+               ExternalizerAdapter adapter = new ExternalizerAdapter(id, ext);
+               writers.put(clazz, adapter);               
+               readers.put(id, adapter);
             } catch (ClassNotFoundException e) {
                if (log.isDebugEnabled()) log.debug("Unable to load class (ignore if class belonging to a module not in use): {0}", e.getMessage());
             }
          }
          
+         for (String marshallableClass : MARSHALLABLES) {
+            try {
+               Class clazz = Util.loadClass(marshallableClass);
+               Marshallable marshallable = ReflectionUtil.getAnnotation(clazz, Marshallable.class);
+               if (marshallable != null && !marshallable.externalizer().equals(Externalizer.class)) {
+                  int id = marshallable.id();
+                  Externalizer ext = (Externalizer) Util.getInstance(marshallable.externalizer());
+                  if (!ids.add(id)) throw new CacheException("Duplicat id found! id=" + id + " in " + ext.getClass().getName() + " is shared by another marshallable class.");
+                  if (ext instanceof ReplicableCommandExternalizer) {
+                     ((ReplicableCommandExternalizer) ext).inject(cmdFactory);
+                  }
+                  if (ext instanceof MarshalledValue.Externalizer) {
+                     ((MarshalledValue.Externalizer) ext).inject(ispnMarshaller);
+                  }
+                  
+                  ExternalizerAdapter adapter = new ExternalizerAdapter(id, ext);
+                  writers.put(clazz, adapter);
+                  readers.put(id, adapter);
+               }               
+            } catch (ClassNotFoundException e) {
+               if (log.isDebugEnabled()) log.debug("Unable to load class (ignore if class belonging to a module not in use): {0}", e.getMessage());
+            }
+         }
       } catch (Exception e) {
          throw new CacheException("Unable to instantiate Externalizer class", e);
       }
+      
+      
    }
 
    public void stop() {
       writers.clear();
-      objects.clear();
+      readers.clear();
    }
 
    public Writer getObjectWriter(Object o) throws IOException {
-      return writers.get(o.getClass());
+      return writers.get(o.getClass());      
    }
 
-   public Object readObject(Unmarshaller unmarshaller) throws IOException, ClassNotFoundException {
-      ExternalizerAdapter adapter = (ExternalizerAdapter) objects.get(unmarshaller.readUnsignedByte());
-      return adapter.readObject(unmarshaller);
+   public Object readObject(Unmarshaller input) throws IOException, ClassNotFoundException {
+      ExternalizerAdapter adapter = (ExternalizerAdapter) readers.get(input.readUnsignedByte());
+      return adapter.readObject(input);
    }
-   
-   static class InstanceWriter implements Externalizer {
-      private final Object singleton;
-      
-      InstanceWriter(Object singleton) {
-         this.singleton = singleton;
-      }
-      
-      public void writeObject(ObjectOutput output, Object object) throws IOException {
-         // no-op
-      }
-      
-      public Object readObject(ObjectInput input) throws IOException, ClassNotFoundException {
-         return singleton;
-      }
-   }
-   
-   class ExternalizerAdapter implements Writer {
-      final byte id;
+     
+   static class ExternalizerAdapter implements Writer {
+      final int id;
       final Externalizer externalizer;
       
-      ExternalizerAdapter(byte objectId, Externalizer externalizer) {
-         this.id = objectId;
+      ExternalizerAdapter(int id, Externalizer externalizer) {
+         this.id = id;
          this.externalizer = externalizer;
       }
       
-      public Object readObject(Unmarshaller unmarshaller) throws IOException, ClassNotFoundException {
-         return externalizer.readObject(unmarshaller);
+      public Object readObject(Unmarshaller input) throws IOException, ClassNotFoundException {
+         return externalizer.readObject(input);
       }
 
-      public void writeObject(Marshaller marshaller, Object object) throws IOException {
-         marshaller.write(id);
-         externalizer.writeObject(marshaller, object);
+      public void writeObject(Marshaller output, Object object) throws IOException {
+         output.write(id);
+         externalizer.writeObject(output, object);
       }
-   }
-   
+   }   
 }

Modified: trunk/core/src/main/java/org/infinispan/marshall/jboss/JBossMarshaller.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/jboss/JBossMarshaller.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/marshall/jboss/JBossMarshaller.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -208,7 +208,7 @@
 
    private ConstantObjectTable createCustomObjectTable(RemoteCommandFactory cmdFactory, org.infinispan.marshall.Marshaller ispnMarshaller) {
       ConstantObjectTable objectTable = new ConstantObjectTable();
-      objectTable.init(cmdFactory, ispnMarshaller);
+      objectTable.start(cmdFactory, ispnMarshaller);
       return objectTable;
    }
 }

Modified: trunk/core/src/main/java/org/infinispan/remoting/responses/ExceptionResponse.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/remoting/responses/ExceptionResponse.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/remoting/responses/ExceptionResponse.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -1,11 +1,19 @@
 package org.infinispan.remoting.responses;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+
 /**
  * A response that encapsulates an exception
  *
  * @author Manik Surtani
  * @since 4.0
  */
+ at Marshallable(externalizer = ExceptionResponse.Externalizer.class, id = Ids.EXCEPTION_RESPONSE)
 public class ExceptionResponse extends InvalidResponse {
    private Exception exception;
 
@@ -23,4 +31,14 @@
    public void setException(Exception exception) {
       this.exception = exception;
    }
+   
+   public static class Externalizer implements org.infinispan.marshall.Externalizer {
+      public void writeObject(ObjectOutput output, Object subject) throws IOException {
+         output.writeObject(((ExceptionResponse) subject).exception);
+      }
+
+      public Object readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+         return new ExceptionResponse((Exception) input.readObject());
+      }
+   }
 }

Modified: trunk/core/src/main/java/org/infinispan/remoting/responses/ExtendedResponse.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/remoting/responses/ExtendedResponse.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/remoting/responses/ExtendedResponse.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -21,11 +21,19 @@
 */
 package org.infinispan.remoting.responses;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.infinispan.marshall.Marshallable;
+import org.infinispan.marshall.Ids;
+
 /**
  * A response with extended information
  *
  * @author Jason T. Greene
  */
+ at Marshallable(externalizer = ExtendedResponse.Externalizer.class, id = Ids.EXTENDED_RESPONSE)
 public class ExtendedResponse extends ValidResponse {
    private final boolean replayIgnoredRequests;
    private final Response response;
@@ -46,4 +54,18 @@
    public boolean isSuccessful() {
       return response.isSuccessful();
    }
+   
+   public static class Externalizer implements org.infinispan.marshall.Externalizer {
+      public void writeObject(ObjectOutput output, Object subject) throws IOException {
+         ExtendedResponse er = (ExtendedResponse) subject;
+         output.writeBoolean(er.replayIgnoredRequests);
+         output.writeObject(er.response);
+      }
+
+      public Object readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+         boolean replayIgnoredRequests = input.readBoolean();
+         Response response = (Response) input.readObject();
+         return new ExtendedResponse(response, replayIgnoredRequests);
+      }
+   }
 }

Modified: trunk/core/src/main/java/org/infinispan/remoting/responses/RequestIgnoredResponse.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/remoting/responses/RequestIgnoredResponse.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/remoting/responses/RequestIgnoredResponse.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -21,11 +21,19 @@
 */
 package org.infinispan.remoting.responses;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+
 /**
  * Indicates that the request was ignored,
  *
  * @author Jason T. Greene
  */
+ at Marshallable(externalizer = RequestIgnoredResponse.Externalizer.class, id = Ids.REQUEST_IGNORED_RESPONSE)
 public class RequestIgnoredResponse extends InvalidResponse {
    public static final RequestIgnoredResponse INSTANCE = new RequestIgnoredResponse();
 
@@ -36,4 +44,14 @@
    public String toString() {
       return "RequestIgnoredResponse";
    }
+   
+   public static class Externalizer implements org.infinispan.marshall.Externalizer {
+      public void writeObject(ObjectOutput output, Object object) throws IOException {
+         // no-op
+      }
+      
+      public Object readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+         return INSTANCE;
+      }
+   }
 }

Modified: trunk/core/src/main/java/org/infinispan/remoting/responses/SuccessfulResponse.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/remoting/responses/SuccessfulResponse.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/remoting/responses/SuccessfulResponse.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -1,11 +1,19 @@
 package org.infinispan.remoting.responses;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.infinispan.marshall.Marshallable;
+import org.infinispan.marshall.Ids;
+
 /**
  * A successful response
  *
  * @author Manik Surtani
  * @since 4.0
  */
+ at Marshallable(externalizer = SuccessfulResponse.Externalizer.class, id = Ids.SUCCESSFUL_RESPONSE)
 public class SuccessfulResponse extends ValidResponse {
 
    private Object responseValue;
@@ -45,4 +53,14 @@
    public int hashCode() {
       return responseValue != null ? responseValue.hashCode() : 0;
    }
+   
+   public static class Externalizer implements org.infinispan.marshall.Externalizer {
+      public void writeObject(ObjectOutput output, Object subject) throws IOException {
+         output.writeObject(((SuccessfulResponse) subject).responseValue);      
+      }
+
+      public Object readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+         return new SuccessfulResponse(input.readObject());
+      }
+   }
 }

Modified: trunk/core/src/main/java/org/infinispan/remoting/responses/UnsuccessfulResponse.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/remoting/responses/UnsuccessfulResponse.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/remoting/responses/UnsuccessfulResponse.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -1,11 +1,19 @@
 package org.infinispan.remoting.responses;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
+
 /**
  * An unsuccessful response
  *
  * @author Manik Surtani
  * @since 4.0
  */
+ at Marshallable(externalizer = UnsuccessfulResponse.Externalizer.class, id = Ids.UNSUCCESSFUL_RESPONSE)
 public class UnsuccessfulResponse extends ValidResponse {
    public static final UnsuccessfulResponse INSTANCE = new UnsuccessfulResponse();
 
@@ -25,4 +33,14 @@
    public int hashCode() {
       return 13;
    }
+   
+   public static class Externalizer implements org.infinispan.marshall.Externalizer {
+      public void writeObject(ObjectOutput output, Object object) throws IOException {
+         // no-op
+      }
+      
+      public Object readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+         return INSTANCE;
+      }
+   }
 }

Modified: trunk/core/src/main/java/org/infinispan/remoting/transport/jgroups/JGroupsAddress.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/remoting/transport/jgroups/JGroupsAddress.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/remoting/transport/jgroups/JGroupsAddress.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -1,5 +1,11 @@
 package org.infinispan.remoting.transport.jgroups;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
 import org.infinispan.remoting.transport.Address;
 
 /**
@@ -8,6 +14,7 @@
  * @author Manik Surtani
  * @since 4.0
  */
+ at Marshallable(externalizer = JGroupsAddress.Externalizer.class, id = Ids.JGROUPS_ADDRESS)
 public class JGroupsAddress implements Address {
    org.jgroups.Address address;
 
@@ -51,4 +58,17 @@
    public void setJGroupsAddress(org.jgroups.Address address) {
       this.address = address;
    }
+   
+   public static class Externalizer implements org.infinispan.marshall.Externalizer {
+      public void writeObject(ObjectOutput output, Object subject) throws IOException {
+         JGroupsAddress address = (JGroupsAddress) subject;
+         output.writeObject(address.address);
+      }
+
+      public Object readObject(ObjectInput unmarshaller) throws IOException, ClassNotFoundException {
+         JGroupsAddress address = new JGroupsAddress();
+         address.address = (org.jgroups.Address) unmarshaller.readObject();
+         return address;
+      }
+   }
 }

Modified: trunk/core/src/main/java/org/infinispan/transaction/TransactionLog.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/transaction/TransactionLog.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/transaction/TransactionLog.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -23,11 +23,16 @@
 
 import org.infinispan.commands.tx.PrepareCommand;
 import org.infinispan.commands.write.WriteCommand;
+import org.infinispan.io.UnsignedNumeric;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
 import org.infinispan.marshall.Marshaller;
 import org.infinispan.transaction.xa.GlobalTransaction;
 import org.infinispan.util.logging.Log;
 import org.infinispan.util.logging.LogFactory;
 
+import java.io.IOException;
+import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.util.ArrayList;
 import java.util.List;
@@ -47,6 +52,7 @@
    private final BlockingQueue<LogEntry> entries = new LinkedBlockingQueue<LogEntry>();
    private AtomicBoolean active = new AtomicBoolean();
 
+   @Marshallable(externalizer = LogEntry.Externalizer.class, id = Ids.TRANSACTION_LOG_ENTRY)
    public static class LogEntry {
       private final GlobalTransaction transaction;
       private final WriteCommand[] modifications;
@@ -63,6 +69,24 @@
       public WriteCommand[] getModifications() {
          return modifications;
       }
+      
+      public static class Externalizer implements org.infinispan.marshall.Externalizer {
+         public void writeObject(ObjectOutput output, Object subject) throws IOException {
+            TransactionLog.LogEntry le = (TransactionLog.LogEntry) subject;
+            output.writeObject(le.transaction);
+            WriteCommand[] cmds = le.modifications;
+            UnsignedNumeric.writeUnsignedInt(output, cmds.length);
+            for (WriteCommand c : cmds) output.writeObject(c);
+         }
+
+         public Object readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+            GlobalTransaction gtx = (GlobalTransaction) input.readObject();
+            int numCommands = UnsignedNumeric.readUnsignedInt(input);
+            WriteCommand[] cmds = new WriteCommand[numCommands];
+            for (int i = 0; i < numCommands; i++) cmds[i] = (WriteCommand) input.readObject();
+            return new TransactionLog.LogEntry(gtx, cmds);
+         }
+      }
    }
 
    private static Log log = LogFactory.getLog(TransactionLog.class);

Modified: trunk/core/src/main/java/org/infinispan/transaction/xa/DeadlockDetectingGlobalTransaction.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/transaction/xa/DeadlockDetectingGlobalTransaction.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/transaction/xa/DeadlockDetectingGlobalTransaction.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -1,9 +1,14 @@
 package org.infinispan.transaction.xa;
 
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
 import org.infinispan.remoting.transport.Address;
 import org.infinispan.util.logging.Log;
 import org.infinispan.util.logging.LogFactory;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.Collections;
 import java.util.Set;
 
@@ -12,6 +17,7 @@
  *
  * @author Mircea.Markus at jboss.com
  */
+ at Marshallable(externalizer = DeadlockDetectingGlobalTransaction.Externalizer.class, id = Ids.DEADLOCK_DETECTING_GLOBAL_TRANSACTION)
 public class DeadlockDetectingGlobalTransaction extends GlobalTransaction {
 
    private static Log log = LogFactory.getLog(DeadlockDetectingGlobalTransaction.class);
@@ -162,4 +168,24 @@
    public void setLockInterntion(Object lockInterntion) {
       this.lockInterntion = lockInterntion;
    }
+   
+   public static class Externalizer extends GlobalTransaction.Externalizer {
+      public Externalizer() {
+         gtxFactory = new GlobalTransactionFactory(true);
+      }
+
+      @Override
+      public void writeObject(ObjectOutput output, Object subject) throws IOException {
+         super.writeObject(output, subject);
+         DeadlockDetectingGlobalTransaction ddGt = (DeadlockDetectingGlobalTransaction) subject;
+         output.writeLong(ddGt.getCoinToss());
+      }
+
+      @Override
+      public Object readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+         DeadlockDetectingGlobalTransaction ddGt = (DeadlockDetectingGlobalTransaction) super.readObject(input);
+         ddGt.setCoinToss(input.readLong());
+         return ddGt;
+      }
+   }
 }

Modified: trunk/core/src/main/java/org/infinispan/transaction/xa/GlobalTransaction.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/transaction/xa/GlobalTransaction.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/transaction/xa/GlobalTransaction.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -21,12 +21,13 @@
  */
 package org.infinispan.transaction.xa;
 
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
 import org.infinispan.remoting.transport.Address;
 
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
-import java.io.Externalizable;
 import java.util.concurrent.atomic.AtomicLong;
 
 
@@ -41,7 +42,8 @@
  * @author Mircea.Markus at jboss.com
  * @since 4.0
  */
-public class GlobalTransaction implements Externalizable, Cloneable {
+ at Marshallable(externalizer = GlobalTransaction.Externalizer.class, id = Ids.GLOBAL_TRANSACTION)
+public class GlobalTransaction implements Cloneable {
 
    private static final long serialVersionUID = 8011434781266976149L;
 
@@ -77,17 +79,6 @@
       return remote;
    }
 
-   public void writeExternal(ObjectOutput out) throws IOException {
-      out.writeLong(id);
-      out.writeObject(addr);
-   }
-
-   public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-      id = in.readLong();
-      addr = (Address) in.readObject();
-      hash_code = -1;
-   }
-
    @Override
    public int hashCode() {
       if (hash_code == -1) {
@@ -131,4 +122,21 @@
          throw new IllegalStateException("Impossible!");
       }
    }
+   
+   public static class Externalizer implements org.infinispan.marshall.Externalizer {
+      protected GlobalTransactionFactory gtxFactory = new GlobalTransactionFactory();
+      
+      public void writeObject(ObjectOutput output, Object subject) throws IOException {
+         GlobalTransaction gtx = (GlobalTransaction) subject;
+         output.writeLong(gtx.id);
+         output.writeObject(gtx.addr);      
+      }
+
+      public Object readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+         GlobalTransaction gtx = gtxFactory.instantiateGlobalTransaction();
+         gtx.id = input.readLong();
+         gtx.addr = (Address) input.readObject();
+         return gtx;
+      }
+   }
 }
\ No newline at end of file

Modified: trunk/core/src/main/java/org/infinispan/util/FastCopyHashMap.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/util/FastCopyHashMap.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/util/FastCopyHashMap.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -32,6 +32,10 @@
 import java.util.NoSuchElementException;
 import java.util.Set;
 
+import org.infinispan.marshall.Marshallable;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.exts.MapExternalizer;
+
 /**
  * A HashMap that is optimized for fast shallow copies.
  * <p/>
@@ -40,6 +44,7 @@
  * @author Jason T. Greene
  * @since 4.0
  */
+ at Marshallable(externalizer = MapExternalizer.class, id = Ids.FASTCOPY_HASHMAP)
 public class FastCopyHashMap<K, V> extends AbstractMap<K, V> implements Map<K, V>, Cloneable, Serializable {
    /**
     * Serialization ID

Modified: trunk/core/src/main/java/org/infinispan/util/Immutables.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/util/Immutables.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/main/java/org/infinispan/util/Immutables.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -21,6 +21,9 @@
  */
 package org.infinispan.util;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.io.Serializable;
 import java.lang.reflect.Array;
 import java.util.ArrayList;
@@ -36,6 +39,9 @@
 import org.infinispan.container.DataContainer;
 import org.infinispan.container.entries.InternalCacheEntry;
 import org.infinispan.container.entries.InternalCacheValue;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.MarshallUtil;
+import org.infinispan.marshall.Marshallable;
 
 /**
  * Factory for generating immutable type wrappers.
@@ -612,6 +618,7 @@
       }
    }
 
+   @Marshallable(externalizer = ImmutableMapWrapper.Externalizer.class, id = Ids.IMMUTABLE_MAP)
    private static class ImmutableMapWrapper<K, V> implements Map<K, V>, Serializable, Immutable {
       private static final long serialVersionUID = 708144227046742221L;
 
@@ -680,5 +687,17 @@
       public String toString() {
          return map.toString();
       }
+      
+      public static class Externalizer implements org.infinispan.marshall.Externalizer {
+         public void writeObject(ObjectOutput output, Object subject) throws IOException {
+            MarshallUtil.marshallMap((Map) subject, output);      
+         }
+
+         public Object readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+            Map map = new HashMap();
+            MarshallUtil.unmarshallMap(map, input);
+            return Immutables.immutableMapWrap(map);
+         }
+      }
    }
 }
\ No newline at end of file

Modified: trunk/core/src/test/java/org/infinispan/marshall/MarshallersTest.java
===================================================================
--- trunk/core/src/test/java/org/infinispan/marshall/MarshallersTest.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/test/java/org/infinispan/marshall/MarshallersTest.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -157,9 +157,9 @@
    }
 
    public void testMarshalledValueMarshalling() throws Exception {
-      GlobalTransaction gtx = gtf.newGlobalTransaction(new JGroupsAddress(new IpAddress(12345)), false);
-      int bytesH = marshallAndAssertEquality(home, new MarshalledValue(gtx, true, home));
-      int bytesJ = marshallAndAssertEquality(jboss, new MarshalledValue(gtx, true, jboss));
+      IpAddress addr = new IpAddress(12345);
+      int bytesH = marshallAndAssertEquality(home, new MarshalledValue(addr, true, home));
+      int bytesJ = marshallAndAssertEquality(jboss, new MarshalledValue(addr, true, jboss));
       assert bytesJ < bytesH : "JBoss Marshaller should write less bytes: bytesJBoss=" + bytesJ + ", bytesHome=" + bytesH;
    }
 

Modified: trunk/core/src/test/java/org/infinispan/marshall/jboss/JBossMarshallerTest.java
===================================================================
--- trunk/core/src/test/java/org/infinispan/marshall/jboss/JBossMarshallerTest.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/core/src/test/java/org/infinispan/marshall/jboss/JBossMarshallerTest.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -21,6 +21,7 @@
  */
 package org.infinispan.marshall.jboss;
 
+import org.infinispan.CacheException;
 import org.infinispan.commands.RemoteCommandFactory;
 import org.infinispan.commands.ReplicableCommand;
 import org.infinispan.commands.control.StateTransferControlCommand;
@@ -47,6 +48,8 @@
 import org.infinispan.container.entries.TransientMortalCacheEntry;
 import org.infinispan.container.entries.TransientMortalCacheValue;
 import org.infinispan.loaders.bucket.Bucket;
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
 import org.infinispan.marshall.MarshalledValue;
 import org.infinispan.marshall.VersionAwareMarshaller;
 import org.infinispan.remoting.responses.ExceptionResponse;
@@ -345,7 +348,32 @@
       ExceptionResponse rer = (ExceptionResponse) marshaller.objectFromByteBuffer(bytes);
       assert rer.getException().getClass().equals(er.getException().getClass()) : "Writen[" + er.getException().getClass() + "] and read[" + rer.getException().getClass() + "] objects should be the same";
    }
+   
+   public void testDuplicateExternalizerId() throws Exception {
+      JBossMarshaller jbmarshaller = new JBossMarshaller();
+      ConstantObjectTable.MARSHALLABLES.add(DuplicateIdClass.class.getName());
+      try {
+         jbmarshaller.start(Thread.currentThread().getContextClassLoader(), new RemoteCommandFactory(), marshaller);
+         assert false : "Should have thrown a CacheException reporting the duplicate id";
+      } catch (CacheException ce) {
+      } finally {
+         jbmarshaller.stop();
+         ConstantObjectTable.MARSHALLABLES.remove(DuplicateIdClass.class.getName());
+      }
+   }
 
+//   TODO: fix unit test, will be done as part of https://jira.jboss.org/jira/browse/ISPN-136   
+//   public void testAtomicHashMap() throws Exception {
+//      AtomicHashMap m = new AtomicHashMap();
+//      m.initForWriting();
+//      m.put("k1", "v1");
+//      m.put("k1", "v2");
+//      m.put("k1", "v3");
+//      byte[] bytes = marshaller.objectToByteBuffer(m);
+//      AtomicHashMapDelta d = (AtomicHashMapDelta) marshaller.objectFromByteBuffer(bytes);
+//      assert d.getChangeLogSize() == ((AtomicHashMapDelta) m.delta()).getChangeLogSize();
+//   }
+   
    protected void marshallAndAssertEquality(Object writeObj) throws Exception {
       byte[] bytes = marshaller.objectToByteBuffer(writeObj);
       Object readObj = marshaller.objectFromByteBuffer(bytes);
@@ -388,4 +416,16 @@
          deserializationCount++;
       }
    }
+
+   @Marshallable(externalizer = DuplicateIdClass.Externalizer.class, id = Ids.ARRAY_LIST)
+   static class DuplicateIdClass {
+      public static class Externalizer implements org.infinispan.marshall.Externalizer {
+         public Object readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+            return null;
+         }
+         public void writeObject(ObjectOutput output, Object object) throws IOException {
+         }
+      }
+   }
+   
 }

Modified: trunk/tree/src/main/java/org/infinispan/tree/Fqn.java
===================================================================
--- trunk/tree/src/main/java/org/infinispan/tree/Fqn.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/tree/src/main/java/org/infinispan/tree/Fqn.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -23,8 +23,15 @@
 
 
 import net.jcip.annotations.Immutable;
+
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
 import org.infinispan.util.Immutables;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -75,6 +82,7 @@
  * @since 4.0
  */
 @Immutable
+ at Marshallable(externalizer = Fqn.Externalizer.class, id = Ids.FQN)
 public class Fqn implements Comparable<Fqn> {
    /**
     * Separator between FQN elements.
@@ -493,4 +501,19 @@
       Fqn subFqn = this.getSubFqn(oldAncestor.size(), size());
       return Fqn.fromRelativeFqn(newAncestor, subFqn);
    }
+   
+   public static class Externalizer implements org.infinispan.marshall.Externalizer {
+      public void writeObject(ObjectOutput output, Object object) throws IOException {
+         Fqn fqn = (Fqn) object;
+         output.writeShort(fqn.size);
+         for (Object element : fqn.elements) output.writeObject(element);
+      }
+
+      public Object readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+         short size = input.readShort();
+         List elements = new ArrayList(size);
+         for (int i = 0; i < size; i++) elements.add(input.readObject());
+         return Fqn.fromList(elements);
+      }
+   }
 }
\ No newline at end of file

Modified: trunk/tree/src/main/java/org/infinispan/tree/NodeKey.java
===================================================================
--- trunk/tree/src/main/java/org/infinispan/tree/NodeKey.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/tree/src/main/java/org/infinispan/tree/NodeKey.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -23,6 +23,15 @@
 
 package org.infinispan.tree;
 
+import static org.infinispan.tree.NodeKey.Type.DATA;
+import static org.infinispan.tree.NodeKey.Type.STRUCTURE;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.infinispan.marshall.Ids;
+import org.infinispan.marshall.Marshallable;
 import org.infinispan.util.Util;
 
 /**
@@ -31,6 +40,7 @@
  * @author Manik Surtani
  * @since 4.0
  */
+ at Marshallable(externalizer = NodeKey.Externalizer.class, id = Ids.NODE_KEY)
 public class NodeKey {
    final Fqn fqn;
    final Type contents;
@@ -79,4 +89,39 @@
             ", fqn=" + fqn +
             '}';
    }
+   
+   public static class Externalizer implements org.infinispan.marshall.Externalizer {
+      private static final byte DATA_BYTE = 1;
+      private static final byte STRUCTURE_BYTE = 2;
+
+      public void writeObject(ObjectOutput output, Object object) throws IOException {
+         NodeKey key = (NodeKey) object;
+         output.writeObject(key.fqn);
+         byte type = 0;
+         switch (key.contents) {
+            case DATA:
+               type = DATA_BYTE;
+               break;
+            case STRUCTURE:
+               type = STRUCTURE_BYTE;
+               break;
+         }
+         output.write(type);
+      }
+      
+      public Object readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+         Fqn fqn = (Fqn) input.readObject();
+         int typeb = input.readUnsignedByte();
+         NodeKey.Type type = null; 
+         switch (typeb) {
+            case DATA_BYTE:
+               type = DATA;
+               break;
+            case STRUCTURE_BYTE:
+               type = STRUCTURE;
+               break;
+         }
+         return new NodeKey(fqn, type);
+      }
+   }
 }

Modified: trunk/tree/src/main/java/org/infinispan/tree/marshall/exts/NodeKeyExternalizer.java
===================================================================
--- trunk/tree/src/main/java/org/infinispan/tree/marshall/exts/NodeKeyExternalizer.java	2009-07-21 13:59:16 UTC (rev 598)
+++ trunk/tree/src/main/java/org/infinispan/tree/marshall/exts/NodeKeyExternalizer.java	2009-07-21 14:26:19 UTC (rev 599)
@@ -35,7 +35,9 @@
  * 
  * @author Galder Zamarreño
  * @since 4.0
+ * @deprecated Externalizer implementation now within NodeKey
  */
+ at Deprecated
 public class NodeKeyExternalizer implements Externalizer {
    private static final byte DATA_BYTE = 1;
    private static final byte STRUCTURE_BYTE = 2;



More information about the infinispan-commits mailing list