[infinispan-commits] Infinispan SVN: r353 - in trunk/core: src/main/java/org/infinispan/marshall/jboss and 2 other directories.

infinispan-commits at lists.jboss.org infinispan-commits at lists.jboss.org
Thu May 28 06:52:19 EDT 2009


Author: galder.zamarreno at jboss.com
Date: 2009-05-28 06:52:19 -0400 (Thu, 28 May 2009)
New Revision: 353

Modified:
   trunk/core/pom.xml
   trunk/core/src/main/java/org/infinispan/marshall/jboss/ClassExternalizer.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/marshall/jboss/NumberClassExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/jboss/externalizers/MapExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/jboss/externalizers/ReplicableCommandExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/jboss/externalizers/SetExternalizer.java
   trunk/core/src/main/java/org/infinispan/marshall/jboss/externalizers/StateTransferControlCommandExternalizer.java
   trunk/core/src/test/java/org/infinispan/marshall/jboss/JBossMarshallerTest.java
Log:
[ISPN-32] (Object stream pooling) Added thread local based caching for JBMAR marshaller/unmarshaller and tweaked implementation to be purely based on OBjectTable which decreases complexity and increases performance. Finally, upgraded to JBMAR 1.1.3.GA to fix a long String bug.

Modified: trunk/core/pom.xml
===================================================================
--- trunk/core/pom.xml	2009-05-28 08:50:37 UTC (rev 352)
+++ trunk/core/pom.xml	2009-05-28 10:52:19 UTC (rev 353)
@@ -61,13 +61,13 @@
       <dependency>
          <groupId>org.jboss.marshalling</groupId>
          <artifactId>marshalling-api</artifactId>
-         <version>1.1.2.GA</version>
+         <version>1.1.3.GA</version>
       </dependency>
 
       <dependency>
          <groupId>org.jboss.marshalling</groupId>
          <artifactId>river</artifactId>
-         <version>1.1.2.GA</version>
+         <version>1.1.3.GA</version>
       </dependency>
 
       <dependency>

Modified: trunk/core/src/main/java/org/infinispan/marshall/jboss/ClassExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/jboss/ClassExternalizer.java	2009-05-28 08:50:37 UTC (rev 352)
+++ trunk/core/src/main/java/org/infinispan/marshall/jboss/ClassExternalizer.java	2009-05-28 10:52:19 UTC (rev 353)
@@ -34,7 +34,11 @@
  *
  * @author Galder Zamarreño
  * @since 4.0
+ * @deprecated With new ObjectTable based solution where there's no need hard need to send
+ * class information around and bearing in mind that instantiation based on reflection is
+ * expensive, moving instantiation to the corresponding externalizer.
  */
+ at Deprecated
 public interface ClassExternalizer {
    /**
     * Write the predefined class reference to the stream.
@@ -46,14 +50,14 @@
    void writeClass(Marshaller output, Class<?> subjectType) throws IOException;
    
    /**
-    * Read a class from the stream.  The class will have been written by the
+    * Read a class from the stream, instantiate it and return it.  The class will have been written by the
     * writeClass(Marshaller, Class) method, as defined above.
     *
     * @param unmarshaller the unmarshaller to read from
-    * @return the class
+    * @return an instance of the class read
     * @throws IOException if an I/O error occurs
     */
-   Class<?> readClass(Unmarshaller input) throws IOException;
+   Object readClassInstance(Unmarshaller input) throws IOException;
       
    /**
     * Classes that provide a shortened version of Class information should

Modified: trunk/core/src/main/java/org/infinispan/marshall/jboss/ConstantObjectTable.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/jboss/ConstantObjectTable.java	2009-05-28 08:50:37 UTC (rev 352)
+++ trunk/core/src/main/java/org/infinispan/marshall/jboss/ConstantObjectTable.java	2009-05-28 10:52:19 UTC (rev 353)
@@ -21,11 +21,12 @@
  */
 package org.infinispan.marshall.jboss;
 
-import net.jcip.annotations.Immutable;
+ import net.jcip.annotations.Immutable;
 
 import org.infinispan.CacheException;
 import org.infinispan.atomic.AtomicHashMap;
 import org.infinispan.commands.LockControlCommand;
+import org.infinispan.commands.RemoteCommandFactory;
 import org.infinispan.commands.control.StateTransferControlCommand;
 import org.infinispan.commands.read.GetKeyValueCommand;
 import org.infinispan.commands.remote.ClusteredGetCommand;
@@ -69,7 +70,6 @@
 import org.infinispan.marshall.jboss.externalizers.ReplicableCommandExternalizer;
 import org.infinispan.marshall.jboss.externalizers.SetExternalizer;
 import org.infinispan.marshall.jboss.externalizers.SingletonListExternalizer;
-import org.infinispan.marshall.jboss.externalizers.StateTransferControlCommandExternalizer;
 import org.infinispan.marshall.jboss.externalizers.SuccessfulResponseExternalizer;
 import org.infinispan.marshall.jboss.externalizers.TransactionLogExternalizer;
 import org.infinispan.marshall.jboss.externalizers.TransientCacheEntryExternalizer;
@@ -81,7 +81,6 @@
 import org.infinispan.remoting.responses.RequestIgnoredResponse;
 import org.infinispan.remoting.responses.SuccessfulResponse;
 import org.infinispan.remoting.responses.UnsuccessfulResponse;
-import org.infinispan.remoting.transport.Transport;
 import org.infinispan.remoting.transport.jgroups.JGroupsAddress;
 import org.infinispan.transaction.xa.GlobalTransaction;
 import org.infinispan.util.FastCopyHashMap;
@@ -111,7 +110,8 @@
  * @since 4.0
  */
 public class ConstantObjectTable implements ObjectTable {
-   private static final Map<String, String> EXTERNALIZERS = new HashMap<String, String>();
+   private static final int CAPACITY = 50;
+   private static final Map<String, String> EXTERNALIZERS = new HashMap<String, String>(CAPACITY);
 
    static {
       EXTERNALIZERS.put(GlobalTransaction.class.getName(), GlobalTransactionExternalizer.class.getName());
@@ -132,7 +132,7 @@
       EXTERNALIZERS.put(ExceptionResponse.class.getName(), ExceptionResponseExternalizer.class.getName());
       EXTERNALIZERS.put(AtomicHashMap.class.getName(), DeltaAwareExternalizer.class.getName());
 
-      EXTERNALIZERS.put(StateTransferControlCommand.class.getName(), StateTransferControlCommandExternalizer.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());
@@ -162,45 +162,42 @@
    }
 
    /** Contains list of singleton objects written such as constant objects, 
-    * singleton ReadWriter implementations...etc. When writing, index of each 
+    * 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>();
-   /** Contains mapping of constant instances to their writers */
-   private final Map<Object, Writer> writers = new IdentityHashMap<Object, Writer>();
-   /** Contains mapping of 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<?>, Externalizer> externalizers = new IdentityHashMap<Class<?>, Externalizer>();
+   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<?>, Writer> writers = new IdentityHashMap<Class<?>, Writer>(CAPACITY);
+
    private byte index;
-   private final Transport transport;
-   private final NumberClassExternalizer classTable = new NumberClassExternalizer();
+
+   private final RemoteCommandFactory cmdFactory;
    
-   public ConstantObjectTable(Transport transport) {
-      this.transport = transport;
+   public ConstantObjectTable(RemoteCommandFactory cmdFactory) {
+      this.cmdFactory = cmdFactory;
    }
 
    public void init() {
       // Init singletons
       objects.add(RequestIgnoredResponse.INSTANCE);
-      writers.put(RequestIgnoredResponse.INSTANCE, new InstanceWriter(index++));
+      writers.put(RequestIgnoredResponse.class, new InstanceWriter(index++));
       objects.add(UnsuccessfulResponse.INSTANCE);
-      writers.put(UnsuccessfulResponse.INSTANCE, new InstanceWriter(index++));
+      writers.put(UnsuccessfulResponse.class, new InstanceWriter(index++));
       
       try {
          for (Map.Entry<String, String> entry : EXTERNALIZERS.entrySet()) {
             Class typeClazz = Util.loadClass(entry.getKey());
             Externalizer delegate = (Externalizer) Util.getInstance(entry.getValue());
-            if (delegate instanceof StateTransferControlCommandExternalizer) {
-               ((StateTransferControlCommandExternalizer) delegate).init(transport);
+            if (delegate instanceof ReplicableCommandExternalizer) {
+               ((ReplicableCommandExternalizer) delegate).init(cmdFactory);
             }
-            if (delegate instanceof ClassExternalizer.ClassWritable) {
-               ((ClassExternalizer.ClassWritable) delegate).setClassExternalizer(classTable);
-            }
             Externalizer rwrt = new DelegatingReadWriter(index++, delegate);
             objects.add(rwrt);
-            externalizers.put(typeClazz, rwrt);
+            writers.put(typeClazz, rwrt);
          }
          
       } catch (IOException e) {
@@ -213,18 +210,12 @@
    }
 
    public void stop() {
-      classTable.stop();
       writers.clear();
       objects.clear();
-      externalizers.clear();
    }
 
    public Writer getObjectWriter(Object o) throws IOException {
-      Object singleton = writers.get(o);
-      if (singleton == null) {
-         return externalizers.get(o.getClass()); 
-      }
-      return writers.get(o);
+      return writers.get(o.getClass());
    }
 
    public Object readObject(Unmarshaller unmarshaller) throws IOException, ClassNotFoundException {

Modified: trunk/core/src/main/java/org/infinispan/marshall/jboss/JBossMarshaller.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/jboss/JBossMarshaller.java	2009-05-28 08:50:37 UTC (rev 352)
+++ trunk/core/src/main/java/org/infinispan/marshall/jboss/JBossMarshaller.java	2009-05-28 10:52:19 UTC (rev 353)
@@ -22,6 +22,7 @@
 package org.infinispan.marshall.jboss;
 
 import org.infinispan.CacheException;
+import org.infinispan.commands.RemoteCommandFactory;
 import org.infinispan.factories.annotations.Inject;
 import org.infinispan.factories.annotations.Stop;
 import org.infinispan.factories.scopes.Scope;
@@ -29,7 +30,6 @@
 import org.infinispan.io.ByteBuffer;
 import org.infinispan.io.ExposedByteArrayOutputStream;
 import org.infinispan.marshall.AbstractMarshaller;
-import org.infinispan.remoting.transport.Transport;
 import org.infinispan.util.Util;
 import org.infinispan.util.logging.Log;
 import org.infinispan.util.logging.LogFactory;
@@ -57,35 +57,61 @@
 public class JBossMarshaller extends AbstractMarshaller {
    private static final Log log = LogFactory.getLog(JBossMarshaller.class);
    private static final String DEFAULT_MARSHALLER_FACTORY = "org.jboss.marshalling.river.RiverMarshallerFactory";
-   private ClassLoader defaultClassLoader;
+   private ClassLoader defaultCl;
    private MarshallingConfiguration configuration;
    private MarshallerFactory factory;
    private ConstantObjectTable objectTable;
+   
+   /**
+    *  Marshaller thread local. JBossMarshaller is a singleton shared by all caches (global component), 
+    *  so no urgent need for static here.
+    *  JBMAR clears pretty much any state during finish(), so no urgent need to clear the thread local 
+    *  since it shouldn't be leaking.
+    */
+   private ThreadLocal<org.jboss.marshalling.Marshaller> marshallerTL = new ThreadLocal<org.jboss.marshalling.Marshaller>() {
+      @Override
+      protected org.jboss.marshalling.Marshaller initialValue() {
+         try {
+            return factory.createMarshaller(configuration);
+         } catch (IOException e) {
+            throw new CacheException(e);
+         }
+      }
+   };
+   
+   /**
+    *  Unmarshaller thread local. JBossMarshaller is a singleton shared by all caches (global component), 
+    *  so no urgent need for static here.
+    *  JBMAR clears pretty much any state during finish(), so no urgent need to clear the thread local 
+    *  since it shouldn't be leaking.
+    */
+   private ThreadLocal<Unmarshaller> unmarshallerTL = new ThreadLocal<Unmarshaller>() {
+      @Override
+      protected Unmarshaller initialValue() {
+         try {
+            return factory.createUnmarshaller(configuration);
+         } catch (IOException e) {
+            throw new CacheException(e);
+         }
+      }
+   };
 
    @Inject
-   public void init(ClassLoader defaultCl, Transport transport) {
+   public void init(ClassLoader defaultCl, RemoteCommandFactory cmdFactory) {
       log.debug("Using JBoss Marshalling based marshaller.");
-      defaultClassLoader = defaultCl;
+      this.defaultCl = defaultCl;
       try {
-         // Todo: Enable different marshaller factories via configuration
+         // TODO: Enable different marshaller factories via configuration
          factory = (MarshallerFactory) Util.getInstance(DEFAULT_MARSHALLER_FACTORY);
       } catch (Exception e) {
          throw new CacheException("Unable to load JBoss Marshalling marshaller factory " + DEFAULT_MARSHALLER_FACTORY, e);
       }
 
-      objectTable = createCustomObjectTable(transport);
+      objectTable = createCustomObjectTable(cmdFactory);
       configuration = new MarshallingConfiguration();
       configuration.setCreator(new SunReflectiveCreator());
       configuration.setObjectTable(objectTable);
       
-      /* Doubtful: Setting version to 0 reduces the payload avoiding block mode 
-       * (each object in a block) but could potentially be a security issue 
-       * and could spoil things when trying to serialize a spec-compliant 
-       * Serializable object which relies on reading a -1 to know when its data 
-       * ends will "overrun" the buffer if there's no block mode in place. 
-       */ 
-//      configuration.setVersion(0);
-
       // ContextClassResolver provides same functionality as MarshalledValueInputStream
       configuration.setClassResolver(new ContextClassResolver());
    }
@@ -93,7 +119,7 @@
    @Stop
    public void stop() {
       // Do not leak classloader when cache is stopped.
-      defaultClassLoader = null;
+      defaultCl = null;
       objectTable.stop();
    }
 
@@ -116,7 +142,7 @@
    }
 
    public ObjectOutput startObjectOutput(OutputStream os) throws IOException {
-      org.jboss.marshalling.Marshaller marshaller = factory.createMarshaller(configuration);
+      org.jboss.marshalling.Marshaller marshaller = marshallerTL.get();
       marshaller.start(Marshalling.createByteOutput(os));
       return marshaller;
    }
@@ -129,7 +155,7 @@
    }
 
    public void objectToObjectStream(Object obj, ObjectOutput out) throws IOException {
-      ClassLoader toUse = defaultClassLoader;
+      ClassLoader toUse = defaultCl;
       Thread current = Thread.currentThread();
       ClassLoader old = current.getContextClassLoader();
       if (old != null) toUse = old;
@@ -161,7 +187,7 @@
    }
 
    public ObjectInput startObjectInput(InputStream is) throws IOException {
-      Unmarshaller unmarshaller = factory.createUnmarshaller(configuration);
+      Unmarshaller unmarshaller = unmarshallerTL.get();      
       unmarshaller.start(Marshalling.createByteInput(is));
       return unmarshaller;
    }
@@ -177,8 +203,8 @@
       return in.readObject();
    }
 
-   private ConstantObjectTable createCustomObjectTable(Transport transport) {
-      ConstantObjectTable objectTable = new ConstantObjectTable(transport);
+   private ConstantObjectTable createCustomObjectTable(RemoteCommandFactory cmdFactory) {
+      ConstantObjectTable objectTable = new ConstantObjectTable(cmdFactory);
       objectTable.init();
       return objectTable;
    }

Modified: trunk/core/src/main/java/org/infinispan/marshall/jboss/NumberClassExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/jboss/NumberClassExternalizer.java	2009-05-28 08:50:37 UTC (rev 352)
+++ trunk/core/src/main/java/org/infinispan/marshall/jboss/NumberClassExternalizer.java	2009-05-28 10:52:19 UTC (rev 353)
@@ -57,34 +57,43 @@
  *
  * @author Galder Zamarreño
  * @since 4.0
+ * @deprecated With new ObjectTable based solution where there's no need hard need to send
+ * class information around and bearing in mind that instantiation based on reflection is
+ * expensive, moving simple map/set collection handling to the each externalizer.
  */
 @Immutable
+ at Deprecated
 public class NumberClassExternalizer implements ClassExternalizer {
    private static final List<String> MAGIC_NUMBERS = new ArrayList<String>();
+   private static final int HASHMAP = 0;
+   private static final int TREEMAP = 1;
+   private static final int FASTCOPYHASHMAP = 2;
+   private static final int HASHSET = 3;
+   private static final int TREESET = 4;
 
    static {
-      MAGIC_NUMBERS.add(HashMap.class.getName());
-      MAGIC_NUMBERS.add(TreeMap.class.getName());
-      MAGIC_NUMBERS.add(FastCopyHashMap.class.getName());
+      MAGIC_NUMBERS.add(HASHMAP, HashMap.class.getName());
+      MAGIC_NUMBERS.add(TREEMAP, TreeMap.class.getName());
+      MAGIC_NUMBERS.add(FASTCOPYHASHMAP, FastCopyHashMap.class.getName());
       
-      MAGIC_NUMBERS.add(HashSet.class.getName());
-      MAGIC_NUMBERS.add(TreeSet.class.getName());
+      MAGIC_NUMBERS.add(HASHSET, HashSet.class.getName());
+      MAGIC_NUMBERS.add(TREESET, TreeSet.class.getName());
       
-      MAGIC_NUMBERS.add(ClusteredGetCommand.class.getName());
-      MAGIC_NUMBERS.add(MultipleRpcCommand.class.getName());
-      MAGIC_NUMBERS.add(SingleRpcCommand.class.getName());
-      MAGIC_NUMBERS.add(GetKeyValueCommand.class.getName());
-      MAGIC_NUMBERS.add(PutKeyValueCommand.class.getName());
-      MAGIC_NUMBERS.add(RemoveCommand.class.getName());
-      MAGIC_NUMBERS.add(InvalidateCommand.class.getName());
-      MAGIC_NUMBERS.add(ReplaceCommand.class.getName());
-      MAGIC_NUMBERS.add(ClearCommand.class.getName());
-      MAGIC_NUMBERS.add(PutMapCommand.class.getName());
-      MAGIC_NUMBERS.add(PrepareCommand.class.getName());
-      MAGIC_NUMBERS.add(CommitCommand.class.getName());
-      MAGIC_NUMBERS.add(RollbackCommand.class.getName());
-      MAGIC_NUMBERS.add(InvalidateL1Command.class.getName());
-      MAGIC_NUMBERS.add(LockControlCommand.class.getName());
+//      MAGIC_NUMBERS.add(ClusteredGetCommand.class.getName());
+//      MAGIC_NUMBERS.add(MultipleRpcCommand.class.getName());
+//      MAGIC_NUMBERS.add(SingleRpcCommand.class.getName());
+//      MAGIC_NUMBERS.add(GetKeyValueCommand.class.getName());
+//      MAGIC_NUMBERS.add(PutKeyValueCommand.class.getName());
+//      MAGIC_NUMBERS.add(RemoveCommand.class.getName());
+//      MAGIC_NUMBERS.add(InvalidateCommand.class.getName());
+//      MAGIC_NUMBERS.add(ReplaceCommand.class.getName());
+//      MAGIC_NUMBERS.add(ClearCommand.class.getName());
+//      MAGIC_NUMBERS.add(PutMapCommand.class.getName());
+//      MAGIC_NUMBERS.add(PrepareCommand.class.getName());
+//      MAGIC_NUMBERS.add(CommitCommand.class.getName());
+//      MAGIC_NUMBERS.add(RollbackCommand.class.getName());
+//      MAGIC_NUMBERS.add(InvalidateL1Command.class.getName());
+//      MAGIC_NUMBERS.add(LockControlCommand.class.getName());
    }
    
    /** Class to int mapping providing magic number to be written. Do not use 
@@ -121,9 +130,22 @@
       marshaller.writeByte(number);
    }
 
-   public Class<?> readClass(Unmarshaller unmarshaller) throws IOException {
+   public Object readClassInstance(Unmarshaller unmarshaller) throws IOException {
       int magicNumber = unmarshaller.readUnsignedByte();
-      return classes.get(magicNumber);
+      switch (magicNumber) {
+         case HASHMAP:
+            return new HashMap();
+         case TREEMAP:
+            return new TreeMap();
+         case FASTCOPYHASHMAP:
+            return new FastCopyHashMap();
+         case HASHSET:
+            return new HashSet();
+         case TREESET:
+            return new TreeSet();
+         default:
+            return null;
+      }
    }
    
 }

Modified: trunk/core/src/main/java/org/infinispan/marshall/jboss/externalizers/MapExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/jboss/externalizers/MapExternalizer.java	2009-05-28 08:50:37 UTC (rev 352)
+++ trunk/core/src/main/java/org/infinispan/marshall/jboss/externalizers/MapExternalizer.java	2009-05-28 10:52:19 UTC (rev 353)
@@ -21,16 +21,17 @@
  */
 package org.infinispan.marshall.jboss.externalizers;
 
-import org.infinispan.CacheException;
-import org.infinispan.marshall.jboss.ClassExternalizer;
 import org.infinispan.marshall.jboss.MarshallUtil;
 import org.infinispan.marshall.jboss.Externalizer;
-import org.infinispan.util.Util;
+import org.infinispan.util.FastCopyHashMap;
 import org.jboss.marshalling.Marshaller;
 import org.jboss.marshalling.Unmarshaller;
+import org.jboss.marshalling.util.IdentityIntMap;
 
 import java.io.IOException;
+import java.util.HashMap;
 import java.util.Map;
+import java.util.TreeMap;
 
 /**
  * Map externalizer for all map implementations except immutable maps and singleton maps, i.e. FastCopyHashMap, HashMap,
@@ -39,29 +40,39 @@
  * @author Galder Zamarreño
  * @since 4.0
  */
-public class MapExternalizer implements Externalizer, ClassExternalizer.ClassWritable {
-   /** The serialVersionUID */
-   private static final long serialVersionUID = -532896252671303391L;
-   private ClassExternalizer classExt;
+public class MapExternalizer implements Externalizer {
+   private static final int HASHMAP = 0;
+   private static final int TREEMAP = 1;
+   private static final int FASTCOPYHASHMAP = 2;
+   private final IdentityIntMap<Class<?>> numbers = new IdentityIntMap<Class<?>>(3);
+   
+   public MapExternalizer() {
+      numbers.put(HashMap.class, HASHMAP);
+      numbers.put(TreeMap.class, TREEMAP);
+      numbers.put(FastCopyHashMap.class, FASTCOPYHASHMAP);
+   }
 
    public void writeObject(Marshaller output, Object subject) throws IOException {
-      classExt.writeClass(output, subject.getClass());
+      int number = numbers.get(subject.getClass(), -1);
+      output.writeByte(number);
       MarshallUtil.marshallMap((Map) subject, output);
    }
 
    public Object readObject(Unmarshaller input) throws IOException, ClassNotFoundException {
-      Class<?> subjectType = classExt.readClass(input);
+      int magicNumber = input.readUnsignedByte();
       Map subject = null;
-      try {
-         subject = (Map) Util.getInstance(subjectType);
-      } catch (Exception e) {
-         throw new CacheException("Unable to create new instance of ReplicableCommand", e);
+      switch (magicNumber) {
+         case HASHMAP:
+            subject = new HashMap();
+            break;
+         case TREEMAP:
+            subject = new TreeMap();
+            break;
+         case FASTCOPYHASHMAP:
+            subject = new FastCopyHashMap();
+            break;
       }
       MarshallUtil.unmarshallMap(subject, input);
       return subject;
    }
-
-   public void setClassExternalizer(ClassExternalizer classExt) {
-      this.classExt = classExt;
-   }
 }

Modified: trunk/core/src/main/java/org/infinispan/marshall/jboss/externalizers/ReplicableCommandExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/jboss/externalizers/ReplicableCommandExternalizer.java	2009-05-28 08:50:37 UTC (rev 352)
+++ trunk/core/src/main/java/org/infinispan/marshall/jboss/externalizers/ReplicableCommandExternalizer.java	2009-05-28 10:52:19 UTC (rev 353)
@@ -21,11 +21,9 @@
  */
 package org.infinispan.marshall.jboss.externalizers;
 
-import org.infinispan.CacheException;
+import org.infinispan.commands.RemoteCommandFactory;
 import org.infinispan.commands.ReplicableCommand;
-import org.infinispan.marshall.jboss.ClassExternalizer;
 import org.infinispan.marshall.jboss.Externalizer;
-import org.infinispan.util.Util;
 import org.jboss.marshalling.Marshaller;
 import org.jboss.marshalling.Unmarshaller;
 
@@ -37,13 +35,14 @@
  * @author Galder Zamarreño
  * @since 4.0
  */
-public class ReplicableCommandExternalizer implements Externalizer, ClassExternalizer.ClassWritable {
-   /** The serialVersionUID */
-   private static final long serialVersionUID = 6915200269446867084L;
-   private ClassExternalizer classExt;
+public class ReplicableCommandExternalizer implements Externalizer {
+   private RemoteCommandFactory cmdFactory;
+   
+   public void init(RemoteCommandFactory cmdFactory) {
+      this.cmdFactory = cmdFactory;
+   }
 
    public void writeObject(Marshaller output, Object subject) throws IOException {
-      writeClass(output, subject.getClass());
       ReplicableCommand command = (ReplicableCommand) subject;
       output.writeShort(command.getCommandId());
       Object[] args = command.getParameters();
@@ -55,7 +54,6 @@
    }
 
    public Object readObject(Unmarshaller input) throws IOException, ClassNotFoundException {
-      ReplicableCommand command = (ReplicableCommand)createExternal(input);
       short methodId = input.readShort();
       byte numArgs = input.readByte();
       Object[] args = null;
@@ -63,25 +61,6 @@
          args = new Object[numArgs];
          for (int i = 0; i < numArgs; i++) args[i] = input.readObject();
       }
-      command.setParameters(methodId, args);
-      return command;
-   }
-   
-   protected void writeClass(Marshaller output, Class<?> subjectType) throws IOException {
-      classExt.writeClass(output, subjectType);
-   }
-   
-   protected Object createExternal(Unmarshaller input) throws IOException, ClassNotFoundException {
-      try {
-         Class<?> subjectType = classExt.readClass(input);
-         ReplicableCommand command = (ReplicableCommand) Util.getInstance(subjectType);
-         return command;
-      } catch (Exception e) {
-         throw new CacheException("Unable to create new instance of ReplicableCommand", e);
-      }
-   }
-   
-   public void setClassExternalizer(ClassExternalizer classExt) {
-      this.classExt = classExt;
-   }
+      return cmdFactory.fromStream((byte) methodId, args);
+   }   
 }
\ No newline at end of file

Modified: trunk/core/src/main/java/org/infinispan/marshall/jboss/externalizers/SetExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/jboss/externalizers/SetExternalizer.java	2009-05-28 08:50:37 UTC (rev 352)
+++ trunk/core/src/main/java/org/infinispan/marshall/jboss/externalizers/SetExternalizer.java	2009-05-28 10:52:19 UTC (rev 353)
@@ -22,17 +22,17 @@
 package org.infinispan.marshall.jboss.externalizers;
 
 import net.jcip.annotations.Immutable;
-import org.infinispan.CacheException;
-import org.infinispan.marshall.jboss.ClassExternalizer;
 import org.infinispan.marshall.jboss.MarshallUtil;
 import org.infinispan.marshall.jboss.Externalizer;
-import org.infinispan.util.Util;
 import org.jboss.marshalling.Marshaller;
 import org.jboss.marshalling.Unmarshaller;
+import org.jboss.marshalling.util.IdentityIntMap;
 
 import java.io.IOException;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.Set;
+import java.util.TreeSet;
 
 /**
  * Set externalizer for all set implementations, i.e. HashSet and TreeSet
@@ -41,31 +41,35 @@
  * @since 4.0
  */
 @Immutable
-public class SetExternalizer implements Externalizer, ClassExternalizer.ClassWritable {
-   /** The serialVersionUID */
-   private static final long serialVersionUID = -3147427397000304867L;
-   private ClassExternalizer classExt;
+public class SetExternalizer implements Externalizer {
+   private static final int HASHSET = 0;
+   private static final int TREESET = 1;
+   private final IdentityIntMap<Class<?>> numbers = new IdentityIntMap<Class<?>>(2);
+   
+   public SetExternalizer() {
+      numbers.put(HashSet.class, HASHSET);
+      numbers.put(TreeSet.class, TREESET);
+   }
 
    public void writeObject(Marshaller output, Object subject) throws IOException {
-      classExt.writeClass(output, subject.getClass());
+      int number = numbers.get(subject.getClass(), -1);
+      output.writeByte(number);
       MarshallUtil.marshallCollection((Collection) subject, output);
    }
 
    public Object readObject(Unmarshaller input) throws IOException, ClassNotFoundException {
-      Class<?> subjectType = classExt.readClass(input);
+      int magicNumber = input.readUnsignedByte();
       Set subject = null;
-      try {
-         subject = (Set) Util.getInstance(subjectType);
-      } catch (Exception e) {
-         throw new CacheException("Unable to create new instance of ReplicableCommand", e);
+      switch (magicNumber) {
+         case HASHSET:
+            subject = new HashSet();
+            break;
+         case TREESET:
+            subject = new TreeSet();
+            break;
       }
       int size = MarshallUtil.readUnsignedInt(input);
       for (int i = 0; i < size; i++) subject.add(input.readObject());
       return subject;
    }
-
-   public void setClassExternalizer(ClassExternalizer classExt) {
-      this.classExt = classExt;
-   }
-
 }
\ No newline at end of file

Modified: trunk/core/src/main/java/org/infinispan/marshall/jboss/externalizers/StateTransferControlCommandExternalizer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/jboss/externalizers/StateTransferControlCommandExternalizer.java	2009-05-28 08:50:37 UTC (rev 352)
+++ trunk/core/src/main/java/org/infinispan/marshall/jboss/externalizers/StateTransferControlCommandExternalizer.java	2009-05-28 10:52:19 UTC (rev 353)
@@ -33,7 +33,11 @@
  *
  * @author Galder Zamarreño
  * @since 4.0
+ * @deprecated With new ObjecTable based solution, we're now fully in control of the stream, 
+ * so no need to put class on the wire. As a result, we can use the exact same trick used
+ * by the old marshaller implementation which uses a RemoteCommandFactory to load the class.
  */
+ at Deprecated
 public class StateTransferControlCommandExternalizer extends ReplicableCommandExternalizer {
    /** The serialVersionUID */
    private static final long serialVersionUID = -3743458410265076691L;
@@ -43,15 +47,15 @@
       this.transport = transport;
    }
 
-   @Override
-   protected void writeClass(Marshaller output, Class<?> subjectType) throws IOException {
-      // No-op
-   }
-
-   @Override
-   protected Object createExternal(Unmarshaller input) throws IOException, ClassNotFoundException {
-      StateTransferControlCommand command = new StateTransferControlCommand();
-      command.init(transport);
-      return command;
-   }
+//   @Override
+//   protected void writeClass(Marshaller output, Class<?> subjectType) throws IOException {
+//      // No-op
+//   }
+//
+//   @Override
+//   protected Object createExternal(Unmarshaller input) throws IOException, ClassNotFoundException {
+//      StateTransferControlCommand command = new StateTransferControlCommand();
+//      command.init(transport);
+//      return command;
+//   }
 }
\ No newline at end of file

Modified: trunk/core/src/test/java/org/infinispan/marshall/jboss/JBossMarshallerTest.java
===================================================================
--- trunk/core/src/test/java/org/infinispan/marshall/jboss/JBossMarshallerTest.java	2009-05-28 08:50:37 UTC (rev 352)
+++ trunk/core/src/test/java/org/infinispan/marshall/jboss/JBossMarshallerTest.java	2009-05-28 10:52:19 UTC (rev 353)
@@ -21,6 +21,7 @@
  */
 package org.infinispan.marshall.jboss;
 
+import org.infinispan.commands.RemoteCommandFactory;
 import org.infinispan.commands.ReplicableCommand;
 import org.infinispan.commands.control.StateTransferControlCommand;
 import org.infinispan.commands.read.GetKeyValueCommand;
@@ -80,7 +81,7 @@
 
    @BeforeTest
    public void setUp() {
-      marshaller.init(Thread.currentThread().getContextClassLoader(), null);
+      marshaller.init(Thread.currentThread().getContextClassLoader(), new RemoteCommandFactory());
    }
 
    @AfterTest
@@ -311,6 +312,12 @@
       Bucket rb = (Bucket) marshaller.objectFromByteBuffer(bytes);
       assert rb.getEntries().equals(b.getEntries()) : "Writen[" + b.getEntries() + "] and read[" + rb.getEntries() + "] objects should be the same";
    }
+   
+   public void testLongPutKeyValueCommand() throws Exception
+   {
+      PutKeyValueCommand c = new PutKeyValueCommand("SESSION_173", "@TSXMHVROYNOFCJVEUJQGBCENNQDEWSCYSOHECJOHEICBEIGJVTIBB at TVNCWLTQCGTEJ@NBJLTMVGXCHXTSVE at BCRYGWPRVLXOJXBRJDVNBVXPRTRLBMHPOUYQKDEPDSADUAWPFSIOCINPSSFGABDUXRMTMMJMRTGBGBOAMGVMTKUDUAJGCAHCYW@LAXMDSFYOSXJXLUAJGQKPTHUKDOXRWKEFIVRTH at VIMQBGYPKWMS@HPOESTPIJE at OTOTWUWIOBLYKQQPTNGWVLRRCWHNIMWDQNOO@JHHEVYVQEODMWKFKKKSWURVDLXPTFQYIHLIM at GSBFWMDQGDQIJONNEVHGQTLDBRBML@BEWGHOQHHEBRFUQSLB@@CILXEAVQQBTXSITMBXHMHORHLTJF at MKMHQGHTSENWILTAKCCPVSQIPBVRAFSSEXIOVCPDXHUBIBUPBSCGPRECXEPMQHRHDOHIHVBPNDKOVLPCLKAJMNOTSF@SRXYVUEMQRCXVIETXVHOVNGYERBNM at RIMGHC@FNTUXSJSKALGHAFHGTFEANQUMBPUYFDSGLUYRRFDJHCW at JBWOBGMGTITAICRC@TPVCRKRMFPUSRRAHI at XOYKVGPHEBQD@@APEKSBCTBKREWAQGKHTJ at IHJD@YFSRDQPA at HKKELIJGFDYFEXFCOTCQIHKCQBLVDFHMGOWIDOWMVBDSJQOFGOIAPURRHVBGEJWYBUGGVHE@PU at NMQFMYTNYJDWPIADNVNCNYCCCPGODLAO@YYLVITEMNNKIFSDXKORJYWMFGKNYFPUQIC at AIDR@IWXCVALQBDOXRWIBXLKYTWDNHHSCUROAU at HVNENDAOP@RPTRIGLLLUNDQIDXJDDNF at P@PA at FEIBQKSKFQITTHDYGQRJMWPRLQC@NJVNVSKGOGYXPYS!
 QHKPALKLFWNAOSQFTLEPVOII at RPDNRCVRDUMMFIVSWGIASUBMTGQSDGB@TBBYECFBRBGILJFCJ at JIQIQRVJXWIPGNVXKYATSPJTIPGCMCNPOKNEHBNUIAEQFQTYVLGAR@RVWVA at RMPBX@LRLJUEBUWO at PKXNIP@FKIQSVWKNO at FOJWDSIOLXHXJFBQPPVKKP@YKXPOOMBTLXMEHPRLLSFSVGMPXXNBCYVVSPNGMFBJUDCVOVGXPKVNTOFKVJUJOSDHSCOQRXOKBVP at WCUUFGMJAUQ@GRAGXICFCFICBSNASUBPAFRIPUK at OXOCCNOGTTSFVQKBQNB@DWGVEFSGTAXAPLBJ at SYHUNXWXPMR@KPFAJCIXPDURELFYPMUSLTJSQNDHHKJTIWCGNEKJF at CUWYTWLPNHYPHXNOGLSICKEFDULIXXSIGFMCQGURSRTUJDKRXBUUXIDFECMPXQX@CVYLDABEMFKUGBTBNMNBPCKCHWRJKSOGJFXMFYLLPUVUHBCNULEFAXPVKVKQKYCEFRUYPBRBDBDOVYLIQMQBLTUK at PRDCYBOKJGVUADFJFAFFXKJTNAJTHISWOSMVAYLIOGIORQQWFAKNU@KHPM at BYKTFSLSRHBATQTKUWSFAQS@Y at QIKCUWQYTODBRCYYYIAFMDVRURKVYJXHNGVLSQQFCXKLNUPCTEJSWIJUBFELSBUHANELHSIWLVQSSAIJRUEDOHHX@CKEBPOJRLRHEPLENSCDGEWXRTVUCSPFSAJUXDJOIUWFGPKHBVRVDMUUCPUDKRKVAXPSOBOPKPRRLFCKTLH at VGWKERASJYU@JAVWNBJGQOVF at QPSGJVEPAV@NAD@@FQRYPQIOAURILWXCKINPMBNUHPUID at YDQBHWAVDPPWRFKKGWJQTI@@OPSQ at ROUGHFNHCJBDFCHRLRTEMTUBWVCNOPYXKSSQDCXTOLOIIOCXBTPAUYDICFIXPJRB@CHFNXUCXANXY!
 KXAISDSSLJGQOLBYXWHG@@KPARPCKOXAYVPDGRW at LDCRQBNMJREHWDYMXHEXAJQKHBIRAV
HJQIVGOIXNINYQMJBXKM at DXESMBHLKHVSFDLVPOSOVMLHPSHQYY@DNMCGGGAJMHPVDLBGJP at EVDGLYBMD@NWHEYTBPIBPUPYOPOJVV at IVJXJMHIWWSIRKUWSR@U@@TDVMG at GRXVLCNEIISEVIVPOMJHKOWMRMITYDUQASWJIKVNYUFQVDT@BHTOMFXVFRKAARLNOGX at ADWCKHOVEMIGBWXINCUXEMVHSJJQDU@INTHDJQPSAQNAYONDBBFYGBTNGUSJHRKLCPHQMNLDHUQJPLLCDVTYLXTHJCBUXCRDY at YI@IQDCLJBBJC at NXGANXFIWPPNFVTDJWQ@@BIYJONOFP at RHTQEYPVHPPUS@UUENSNNF at WVGTSAVKDSQNMHP@VJORGTVWXVBPWKQNRWLSQFSBMXQKWRYMXPAYREXYGONKEWJMBCSLB at KSHXMIWMSBDGQWPDMUGVNMEWKMJKQECIRRVXBPBLGAFTUFHYSHLF@TGYETMDXRFAXVEUBSTGLSMWJMXJWMDPPDAFGNBMTQEMBDLRASMUMU at QTCDCPEGODHESDQVEIQYBJJPFXDLWPUNFAREYCY@YDDSTMKWCANNPXF@@WLMEXRPUNTWNOX at YKFNNTGMXIBBDA@TYLPJFNFHPQKMSNCLBME at FBPOIYNSDFBLHITKIFEFNXXOJAAFMRTGPALOANXF@YPY at RYTVOW@AKNM at C@LJKGBJMUYGGTXRHQCPOLNOGPPS at YSKAJSTQHLRBXUACXJYBLJSEHDNMLLUBSOIHQUI@VUNF at XAVRXUCYNCBDDGUDNVRYP@TPFPKGVNPTEDOTTUUFKCHQ at WWASQXLCBHNRBVSD@NVYT at GJQYSQGYPJO@WSEYDVKCBWANAFUWLDXOQYCYP at BSJFCBTXGKUNWLWUCYL@TNOWGDFHQTWQVYLQBBRQVMGNDBVXEFXTMMVYSHNVTTQAJCHKULOAJUSGJRPHQFCROWE at OMFUVRKGCWED@IA!
 QGRLADOJGQKLCL at FCKTSITGMJRCCMPLOS@ONPQWFUROXYAUJQXIYVDCYBPYHPYCXNCRKRKLATLWWXLBLNOPUJFUJEDOIRKS at MMYPXIJNXPFOQJCHSCBEBGDUQYXQAWEEJDOSINXYLDXUJCQECU@WQSACTDFLGELHPGDFVDXFSSFOSYDLHQFVJESNAVAHKTUPBTPLSFSHYKLEXJXGWESVQQUTUPU at QXRTIDQ@IXBBOYINNHPEMTPRVRNJPQJFACFXUBKXOFHQSPOTLCQ at PLWGEFNKYCYFMKWPFUP@GLHKNMASGIENCACUISTG at YNQCNSOSBKOIXORKSHEOXHSMJJRUICJTCK@PWFRBPLXU at MUEMPFGDLUJEKD@ROUFBLKATXUCHEAQHEYDLCFDIRJSAXTV at CYMPQNMLTMFAHPRBLNSCVFBJMKQLAHWYIOLRMTOY@@RNKTUXHFYUMHGKCCGNEOIOQCISJEHCEVTTWM at TLFRIFDREHFBTTDEJRUNTWAEETGSVDOR@@UQNKFERMBVFJBOAYHPOKMSMRIERDA at JXYSJ@ORER at MBAVWCVGFNA@FRRPQSIIOIUGAJKVQXGINUUKPJPLQRMHPUBETEEIMIBPM at PETR@XD at DOHGRIBVXKLXQWHUFMTWEDYWFWRLPGDS@TANUXGIDTRVXKVCVEXYRKXQCTI at WNSFRAHJJGG@NIPPAAOJXQRTCLBYKDA at FFGHNUIGBFKOQMEDUEFELFLNKPCHA@OXJJRYNPDFSXIFSJYTDMSSBHDPUSQQDAVD at JAAWJDSVTERAJBFEPVRWKMYAPISPWLDPSRE@UMRQLXERTWRDLQVMVCOM at NYPXFLWMWKALMQVNJ@HCTMMIOLRWBJHCYFLMM at IWXPSHRRUNICSSWHOQHUVJE@HKJAADLBTPVLDAKCHRSURJCAXYTMYKHQMWDAWWASUW at HWGBVPTRHJGDWOGHPCNWSXTNKWONQGEKDDWGCKWVSAD!
 @YLCCENMCHALHVDYQW at NQGNCY@M at GGV@RIR at OUS@PQIJMCFEIMGPYBXYR at NSIAUEXT@MOC
NWRMLYHUUAFJCCLLRNFGKLPPIIH at BYRME@UJAKIFHOV at ILP@BGXRNJBIBARSOIMTDSHMGPIGRJBGHYRYXPFUHVOOMCQFNLM at CNCBTGO@UKXBOICNVCRGHADYQVAMNSFRONJ at WITET@BSHMQLWYMVGMQJVSJOXOUJDSXYVVBQJSVGREQLIQKWC at BMDNONHXFYPQENSJINQYKHVCTUTG@QQYJKJURDCKJTUQAM at DWNXWRNILYVAAJ@IADBIXKEIHVXLXUVMGQPAQTWJCDMVDVYUDTXQTCYXDPHKBAGMTAMKEM at QNOQJBREXNWFCXNXRPGOGEIR@KQJIGXAWXLTNCX at ID@XNRNYGRF at QPNWEX@XH at XKSXLQTLQPFSHAHXJLHUTNQWFFAJYHBWIFVJELDPSPLRRDPPNXSBYBEREEELIWNVYXOXYJQAIGHALUAWNUSSNMBHBFLRMMTKEKNSINECUGWTDNMROXI@BJJXKSPIIIXOAJBFVSITQDXTODBGKEPJMWK at JOL@SWTCGSHCOPHECTPJFUXIHUOSVMUTNNSLLJDEOMAGIXEAAVILRMOJXVHHPNPUYYODMXYAYGHI at BUB@NLP at KNPCYFRWAFES@WISBACDSPELEVTJEBNRVENSXXEVDVC at RIDIDSBPQIQNNSRPS@HCJ at XPIOFDXHUBCNFQKHMUYLXW@LMFMALHLESSXCOULRWDTJIVKKTLGFE at HKGVKUGMVHWACQOTSVNWBNUUGTMSQEJ@DXJQQYPOWVRQNQKXSLOEAA@@FRDCGCCQWQ at IY@EATGQGQIETPIJHOIQRYWLTGUENQYDNQSBI at IAUDEWDKICHNUGNAIXNICMBK@CJGSASMTFKWOBSI at KULNENWXV@VNFOANM at OJHFVV@IYRMDB at LHSGXIJMMFCGJKTKDXSMY@FHDNY at VSDUORGWVFMVKJXOCCDLSLMHCSXFBTW@RQTFNRDJUIKRD at PWPY", false, null!
 , 0, 0);
+      marshallAndAssertEquality(c);
+   }
 
    protected void marshallAndAssertEquality(Object writeObj) throws Exception {
       byte[] bytes = marshaller.objectToByteBuffer(writeObj);




More information about the infinispan-commits mailing list