[infinispan-commits] Infinispan SVN: r358 - in trunk/core/src: test/java/org/infinispan/config/parsing and 2 other directories.

infinispan-commits at lists.jboss.org infinispan-commits at lists.jboss.org
Thu May 28 17:31:22 EDT 2009


Author: galder.zamarreno at jboss.com
Date: 2009-05-28 17:31:22 -0400 (Thu, 28 May 2009)
New Revision: 358

Modified:
   trunk/core/src/main/java/org/infinispan/marshall/MarshallerImpl.java
   trunk/core/src/main/java/org/infinispan/marshall/VersionAwareMarshaller.java
   trunk/core/src/test/java/org/infinispan/config/parsing/GlobalConfigurationParserTest.java
   trunk/core/src/test/java/org/infinispan/marshall/MarshalledValueTest.java
   trunk/core/src/test/java/org/infinispan/marshall/jboss/JBossMarshallerTest.java
Log:
[ISPN-84] Switched to JBoss Marshaller for default marshaller.

Modified: trunk/core/src/main/java/org/infinispan/marshall/MarshallerImpl.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/MarshallerImpl.java	2009-05-28 15:30:13 UTC (rev 357)
+++ trunk/core/src/main/java/org/infinispan/marshall/MarshallerImpl.java	2009-05-28 21:31:22 UTC (rev 358)
@@ -76,7 +76,13 @@
  * @author <a href="mailto:manik at jboss.org">Manik Surtani (manik at jboss.org)</a>
  * @author Galder Zamarreño
  * @since 4.0
+ * @deprecated JBoss Marshaller based Marshaller is now use rather than this legacy
+ * home grown marshaller. This marshaller hasn't been removed yet so that we can 
+ * can carry on comparing payload sizes between the different marshallers. This 
+ * will specially help as JBoss Marshaller continues to provide more and more efficient
+ * payloads.  
  */
+ at Deprecated
 public class MarshallerImpl extends AbstractMarshaller {
    // magic numbers
    protected static final int MAGICNUMBER_GTX = 1;

Modified: trunk/core/src/main/java/org/infinispan/marshall/VersionAwareMarshaller.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/marshall/VersionAwareMarshaller.java	2009-05-28 15:30:13 UTC (rev 357)
+++ trunk/core/src/main/java/org/infinispan/marshall/VersionAwareMarshaller.java	2009-05-28 21:31:22 UTC (rev 358)
@@ -23,23 +23,22 @@
 
 import org.infinispan.commands.RemoteCommandFactory;
 import org.infinispan.factories.annotations.Inject;
+import org.infinispan.factories.annotations.Stop;
 import org.infinispan.io.ByteBuffer;
 import org.infinispan.io.ExposedByteArrayOutputStream;
+import org.infinispan.marshall.jboss.JBossMarshaller;
 import org.infinispan.util.logging.Log;
 import org.infinispan.util.logging.LogFactory;
-import org.jboss.util.stream.MarshalledValueInputStream;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.ObjectInput;
-import java.io.ObjectInputStream;
 import java.io.ObjectOutput;
-import java.io.ObjectOutputStream;
 import java.io.OutputStream;
 
 /**
- * A delegate to various other marshallers like {@link MarshallerImpl}. This delegating marshaller adds versioning
+ * A delegate to various other marshallers like {@link JBossMarshaller}. This delegating marshaller adds versioning
  * information to the stream when marshalling objects and is able to pick the appropriate marshaller to delegate to
  * based on the versioning information when unmarshalling objects.
  *
@@ -54,15 +53,20 @@
    private static final int VERSION_400 = 400;
    private static final int CUSTOM_MARSHALLER = 999;
 
-   private MarshallerImpl defaultMarshaller;
+   private JBossMarshaller defaultMarshaller;
 
    ClassLoader defaultClassLoader;
 
    @Inject
    public void init(ClassLoader loader, RemoteCommandFactory remoteCommandFactory) {
-      defaultMarshaller = new MarshallerImpl();
+      defaultMarshaller = new JBossMarshaller();
       defaultMarshaller.init(loader, remoteCommandFactory);
    }
+   
+   @Stop
+   public void stop() {
+      defaultMarshaller.stop();
+   }
 
    protected int getCustomMarshallerVersionInt() {
       return CUSTOM_MARSHALLER;
@@ -70,35 +74,38 @@
 
    public ByteBuffer objectToBuffer(Object obj) throws IOException {
       ExposedByteArrayOutputStream baos = new ExposedByteArrayOutputStream(128);
-      ObjectOutputStream out = new ObjectOutputStream(baos);
-
-      out.writeShort(VERSION_400);
-      log.trace("Wrote version {0}", VERSION_400);
-
-      //now marshall the contents of the object
-      defaultMarshaller.objectToObjectStream(obj, out);
-      out.close();
-
-      // and return bytes.
+      ObjectOutput out = startObjectOutput(baos);
+      try {
+         defaultMarshaller.objectToObjectStream(obj, out);
+      } finally {
+         finishObjectOutput(out);
+      }
       return new ByteBuffer(baos.getRawBuffer(), 0, baos.size());
    }
 
    public Object objectFromByteBuffer(byte[] bytes, int offset, int len) throws IOException, ClassNotFoundException {
-      int versionId;
-      ObjectInputStream in = new MarshalledValueInputStream(new ByteArrayInputStream(bytes, offset, len));
+      ByteArrayInputStream is = new ByteArrayInputStream(bytes, offset, len);
+      ObjectInput in = startObjectInput(is);
+      Object o = null;
       try {
-         versionId = in.readShort();
-         log.trace("Read version {0}", versionId);
+         o = defaultMarshaller.objectFromObjectStream(in);
+      } finally {
+         finishObjectInput(in);
       }
-      catch (Exception e) {
-         log.error("Unable to read version id from first two bytes of stream, barfing.");
-         throw new IOException("Unable to read version id from first two bytes of stream.");
-      }
-      return defaultMarshaller.objectFromObjectStream(in);
+      return o;
    }
 
    public ObjectOutput startObjectOutput(OutputStream os) throws IOException {
-      return defaultMarshaller.startObjectOutput(os);
+      ObjectOutput out = defaultMarshaller.startObjectOutput(os);
+      try {
+         out.writeShort(VERSION_400);
+         if (trace) log.trace("Wrote version {0}", VERSION_400);         
+      } catch (Exception e) {
+         finishObjectOutput(out);
+         log.error("Unable to read version id from first two bytes of stream, barfing.");
+         throw new IOException("Unable to read version id from first two bytes of stream.", e);
+      }
+      return out;
    }
 
    public void finishObjectOutput(ObjectOutput oo) {
@@ -106,13 +113,29 @@
    }
 
    public void objectToObjectStream(Object obj, ObjectOutput out) throws IOException {
-      out.writeShort(VERSION_400);
-      log.trace("Wrote version {0}", VERSION_400);
+      /* No need to write version here. Clients should either be calling either:
+       * - startObjectOutput() -> objectToObjectStream() -> finishObjectOutput()  
+       * or
+       * - objectToBuffer() // underneath it calls start/finish
+       * So, there's only need to write version during the start. 
+       * First option is preferred when multiple objects are gonna be written.
+       */
       defaultMarshaller.objectToObjectStream(obj, out);
    }
 
    public ObjectInput startObjectInput(InputStream is) throws IOException {
-      return defaultMarshaller.startObjectInput(is);
+      ObjectInput in = defaultMarshaller.startObjectInput(is);
+      int versionId;
+      try {
+         versionId = in.readShort();
+         if (trace) log.trace("Read version {0}", versionId);
+      }
+      catch (Exception e) {
+         finishObjectInput(in);
+         log.error("Unable to read version id from first two bytes of stream, barfing.");
+         throw new IOException("Unable to read version id from first two bytes of stream.", e);
+      }
+      return in;
    }
 
    public void finishObjectInput(ObjectInput oi) {
@@ -120,23 +143,24 @@
    }
 
    public Object objectFromObjectStream(ObjectInput in) throws IOException, ClassNotFoundException {
-      int versionId;
-      try {
-         versionId = in.readShort();
-         log.trace("Read version {0}", versionId);
-      }
-      catch (Exception e) {
-         log.error("Unable to read version id from first two bytes of stream, barfing.");
-         throw new IOException("Unable to read version id from first two bytes of stream.");
-      }
+      /* No need to read version here. Clients should either be calling either:
+       * - startObjectInput() -> objectFromObjectStream() -> finishObjectInput()
+       * or
+       * - objectFromByteBuffer() // underneath it calls start/finish
+       * So, there's only need to read version during the start. 
+       * First option is preferred when multiple objects are gonna be written.
+       */
       return defaultMarshaller.objectFromObjectStream(in);
    }
 
    public byte[] objectToByteBuffer(Object obj) throws IOException {
-      return defaultMarshaller.objectToByteBuffer(obj);
+      ByteBuffer b = objectToBuffer(obj);
+      byte[] bytes = new byte[b.getLength()];
+      System.arraycopy(b.getBuf(), b.getOffset(), bytes, 0, b.getLength());
+      return bytes;
    }
 
    public Object objectFromByteBuffer(byte[] buf) throws IOException, ClassNotFoundException {
-      return defaultMarshaller.objectFromByteBuffer(buf);
+      return objectFromByteBuffer(buf, 0, buf.length);
    }
 }
\ No newline at end of file

Modified: trunk/core/src/test/java/org/infinispan/config/parsing/GlobalConfigurationParserTest.java
===================================================================
--- trunk/core/src/test/java/org/infinispan/config/parsing/GlobalConfigurationParserTest.java	2009-05-28 15:30:13 UTC (rev 357)
+++ trunk/core/src/test/java/org/infinispan/config/parsing/GlobalConfigurationParserTest.java	2009-05-28 21:31:22 UTC (rev 358)
@@ -1,10 +1,10 @@
 package org.infinispan.config.parsing;
 
-import org.infinispan.config.GlobalConfiguration;
+ import org.infinispan.config.GlobalConfiguration;
 import org.infinispan.executors.DefaultExecutorFactory;
 import org.infinispan.executors.DefaultScheduledExecutorFactory;
-import org.infinispan.marshall.MarshallerImpl;
 import org.infinispan.marshall.VersionAwareMarshaller;
+import org.infinispan.marshall.jboss.JBossMarshaller;
 import org.infinispan.remoting.transport.jgroups.JGroupsTransport;
 import org.testng.annotations.Test;
 import org.w3c.dom.Element;
@@ -77,14 +77,14 @@
 
    public void testMarshalling() throws Exception {
       XmlConfigurationParserImpl parser = new XmlConfigurationParserImpl();
-      String xml = "<serialization marshallerClass=\"org.infinispan.marshall.MarshallerImpl\" version=\"9.2\"\n" +
+      String xml = "<serialization marshallerClass=\"org.infinispan.marshall.jboss.JBossMarshaller\" version=\"9.2\"\n" +
             "                     objectInputStreamPoolSize=\"100\" objectOutputStreamPoolSize=\"100\"/>";
       Element e = XmlConfigHelper.stringToElement(xml);
 
       GlobalConfiguration gc = new GlobalConfiguration();
       parser.configureSerialization(e, gc);
 
-      assert gc.getMarshallerClass().equals(MarshallerImpl.class.getName());
+      assert gc.getMarshallerClass().equals(JBossMarshaller.class.getName());
       assert gc.getMarshallVersionString().equals("9.2");
       assert gc.getObjectInputStreamPoolSize() == 100;
       assert gc.getObjectOutputStreamPoolSize() == 100;

Modified: trunk/core/src/test/java/org/infinispan/marshall/MarshalledValueTest.java
===================================================================
--- trunk/core/src/test/java/org/infinispan/marshall/MarshalledValueTest.java	2009-05-28 15:30:13 UTC (rev 357)
+++ trunk/core/src/test/java/org/infinispan/marshall/MarshalledValueTest.java	2009-05-28 21:31:22 UTC (rev 358)
@@ -218,24 +218,24 @@
       MarshalledValue mv = new MarshalledValue(pojo, true);
 
 
-      MarshallerImpl marshaller = new MarshallerImpl();
+      VersionAwareMarshaller marshaller = new VersionAwareMarshaller();
+      marshaller.init(Thread.currentThread().getContextClassLoader(), null);
 
       // start the test
       ByteArrayOutputStream bout = new ByteArrayOutputStream();
-      ObjectOutputStream out = new ObjectOutputStream(bout);
-      marshaller.objectToObjectStream(mv, out);
-      out.close();
+      ObjectOutput oo = marshaller.startObjectOutput(bout);
+      marshaller.objectToObjectStream(mv, oo);
+      marshaller.finishObjectOutput(oo);
       bout.close();
 
       // check that the rest just contains a byte stream which a MarshalledValue will be able to deserialize.
       ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
-      ObjectInputStream in = new ObjectInputStream(bin);
+      ObjectInput oi = marshaller.startObjectInput(bin);
+      MarshalledValue recreated = (MarshalledValue) marshaller.objectFromObjectStream(oi);
 
-      MarshalledValue recreated = (MarshalledValue) marshaller.objectFromObjectStream(in);
-
       // there should be nothing more
-      assert in.available() == 0;
-      in.close();
+      assert oi.available() == 0;
+      marshaller.finishObjectInput(oi);
       bin.close();
 
       assertSerialized(recreated);

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 15:30:13 UTC (rev 357)
+++ trunk/core/src/test/java/org/infinispan/marshall/jboss/JBossMarshallerTest.java	2009-05-28 21:31:22 UTC (rev 358)
@@ -48,6 +48,7 @@
 import org.infinispan.container.entries.TransientMortalCacheValue;
 import org.infinispan.loaders.bucket.Bucket;
 import org.infinispan.marshall.MarshalledValue;
+import org.infinispan.marshall.VersionAwareMarshaller;
 import org.infinispan.remoting.responses.ExtendedResponse;
 import org.infinispan.remoting.responses.RequestIgnoredResponse;
 import org.infinispan.remoting.responses.SuccessfulResponse;
@@ -77,7 +78,8 @@
 @Test(groups = "functional", testName = "marshall.jboss.JBossMarshallerTest")
 public class JBossMarshallerTest {
 
-   private final JBossMarshaller marshaller = new JBossMarshaller();
+//   private final JBossMarshaller marshaller = new JBossMarshaller();
+   private final VersionAwareMarshaller marshaller = new VersionAwareMarshaller();
 
    @BeforeTest
    public void setUp() {




More information about the infinispan-commits mailing list