[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