You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ta...@apache.org on 2018/11/13 21:48:52 UTC

[2/3] qpid-proton-j git commit: PROTON-1963 Optimize hot path for encoder and decoder classes

PROTON-1963 Optimize hot path for encoder and decoder classes

Optimize the hot paths in the encoder and decoder to deal directly with
the primitive types and allow inlining of the normal encodings lookup
path.  Also cleans up some type encoding to use the read with defaults
methods.

Project: http://git-wip-us.apache.org/repos/asf/qpid-proton-j/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton-j/commit/c8fd87e0
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton-j/tree/c8fd87e0
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton-j/diff/c8fd87e0

Branch: refs/heads/master
Commit: c8fd87e09177f49bd8f8ce7744d2f83af3510b3b
Parents: 391af06
Author: Timothy Bish <ta...@gmail.com>
Authored: Tue Nov 13 15:26:50 2018 -0500
Committer: Timothy Bish <ta...@gmail.com>
Committed: Tue Nov 13 15:26:50 2018 -0500

----------------------------------------------------------------------
 .../apache/qpid/proton/codec/DecoderImpl.java   | 163 ++++++++++++++-----
 .../apache/qpid/proton/codec/EncoderImpl.java   | 123 +++++++-------
 .../codec/messaging/FastPathHeaderType.java     |  20 ++-
 .../codec/messaging/FastPathPropertiesType.java |  37 +++--
 .../transport/FastPathDispositionType.java      |   4 +-
 .../codec/transport/FastPathFlowType.java       |  16 +-
 .../codec/transport/FastPathTransferType.java   |  10 +-
 7 files changed, 235 insertions(+), 138 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton-j/blob/c8fd87e0/proton-j/src/main/java/org/apache/qpid/proton/codec/DecoderImpl.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec/DecoderImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/codec/DecoderImpl.java
index 2d4989b..a85b0ff 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec/DecoderImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec/DecoderImpl.java
@@ -20,6 +20,18 @@
  */
 package org.apache.qpid.proton.codec;
 
+import java.lang.reflect.Array;
+import java.nio.ByteBuffer;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.StandardCharsets;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
 import org.apache.qpid.proton.ProtonException;
 import org.apache.qpid.proton.amqp.Binary;
 import org.apache.qpid.proton.amqp.Decimal128;
@@ -32,12 +44,6 @@ import org.apache.qpid.proton.amqp.UnsignedInteger;
 import org.apache.qpid.proton.amqp.UnsignedLong;
 import org.apache.qpid.proton.amqp.UnsignedShort;
 
-import java.lang.reflect.Array;
-import java.nio.ByteBuffer;
-import java.nio.charset.CharsetDecoder;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-
 public class DecoderImpl implements ByteBufferDecoder
 {
     private ReadableBuffer _buffer;
@@ -90,11 +96,11 @@ public class DecoderImpl implements ByteBufferDecoder
 
             if (EncodingCodes.SMALLULONG == encoding || EncodingCodes.ULONG == encoding)
             {
-                descriptor = readUnsignedLong();
+                descriptor = readUnsignedLong(null);
             }
             else if (EncodingCodes.SYM8 == encoding || EncodingCodes.SYM32 == encoding)
             {
-                descriptor = readSymbol();
+                descriptor = readSymbol(null);
             }
             else
             {
@@ -110,17 +116,19 @@ public class DecoderImpl implements ByteBufferDecoder
                 }
             }
 
-            TypeConstructor<?> nestedEncoding = readConstructor();
+            TypeConstructor<?> nestedEncoding = readConstructor(false);
             DescribedTypeConstructor<?> dtc = _dynamicTypeConstructors.get(descriptor);
             if(dtc == null)
             {
                 dtc = new DescribedTypeConstructor()
                 {
+                    @Override
                     public DescribedType newInstance(final Object described)
                     {
                         return new UnknownDescribedType(descriptor, described);
                     }
 
+                    @Override
                     public Class<?> getTypeClass()
                     {
                         return UnknownDescribedType.class;
@@ -136,11 +144,13 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public void register(final Object descriptor, final FastPathDescribedTypeConstructor<?> btc)
     {
         _fastPathTypeConstructors.put(descriptor, btc);
     }
 
+    @Override
     public void register(final Object descriptor, final DescribedTypeConstructor dtc)
     {
         // Allow external type constructors to replace the built-in instances.
@@ -157,11 +167,13 @@ public class DecoderImpl implements ByteBufferDecoder
     }
 
 
+    @Override
     public Boolean readBoolean()
     {
         return readBoolean(null);
     }
 
+    @Override
     public Boolean readBoolean(final Boolean defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -173,7 +185,7 @@ public class DecoderImpl implements ByteBufferDecoder
             case EncodingCodes.BOOLEAN_FALSE:
                 return Boolean.FALSE;
             case EncodingCodes.BOOLEAN:
-                return (Boolean) _constructors[EncodingCodes.BOOLEAN & 0xff].readValue();
+                return readRawByte() == 0 ? Boolean.FALSE : Boolean.TRUE;
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -181,6 +193,7 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public boolean readBoolean(final boolean defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -192,7 +205,7 @@ public class DecoderImpl implements ByteBufferDecoder
             case EncodingCodes.BOOLEAN_FALSE:
                 return false;
             case EncodingCodes.BOOLEAN:
-                return (Boolean) _constructors[EncodingCodes.BOOLEAN & 0xff].readValue();
+                return readRawByte() != 0;
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -200,18 +213,20 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public Byte readByte()
     {
         return readByte(null);
     }
 
+    @Override
     public Byte readByte(final Byte defaultVal)
     {
         byte encodingCode = _buffer.get();
 
         switch (encodingCode) {
             case EncodingCodes.BYTE:
-                return (Byte) _constructors[EncodingCodes.BYTE & 0xff].readValue();
+                return (Byte) readRawByte();
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -219,9 +234,10 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public byte readByte(final byte defaultVal)
     {
-        TypeConstructor constructor = readConstructor();
+        TypeConstructor<?> constructor = readConstructor();
         if(constructor instanceof ByteType.ByteEncoding)
         {
             return ((ByteType.ByteEncoding)constructor).readPrimitiveValue();
@@ -240,11 +256,13 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public Short readShort()
     {
         return readShort(null);
     }
 
+    @Override
     public Short readShort(final Short defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -252,7 +270,7 @@ public class DecoderImpl implements ByteBufferDecoder
         switch (encodingCode)
         {
             case EncodingCodes.SHORT:
-                return (Short) _constructors[EncodingCodes.SHORT & 0xff].readValue();
+                return Short.valueOf(readRawShort());
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -260,10 +278,10 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public short readShort(final short defaultVal)
     {
-
-        TypeConstructor constructor = readConstructor();
+        TypeConstructor<?> constructor = readConstructor();
         if(constructor instanceof ShortType.ShortEncoding)
         {
             return ((ShortType.ShortEncoding)constructor).readPrimitiveValue();
@@ -282,11 +300,13 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public Integer readInteger()
     {
         return readInteger(null);
     }
 
+    @Override
     public Integer readInteger(final Integer defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -294,9 +314,9 @@ public class DecoderImpl implements ByteBufferDecoder
         switch (encodingCode)
         {
             case EncodingCodes.SMALLINT:
-                return (Integer) _constructors[EncodingCodes.SMALLINT & 0xff].readValue();
+                return Integer.valueOf(readRawByte());
             case EncodingCodes.INT:
-                return (Integer) _constructors[EncodingCodes.INT & 0xff].readValue();
+                return Integer.valueOf(readRawInt());
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -304,10 +324,10 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public int readInteger(final int defaultVal)
     {
-
-        TypeConstructor constructor = readConstructor();
+        TypeConstructor<?> constructor = readConstructor();
         if(constructor instanceof IntegerType.IntegerEncoding)
         {
             return ((IntegerType.IntegerEncoding)constructor).readPrimitiveValue();
@@ -326,11 +346,13 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public Long readLong()
     {
         return readLong(null);
     }
 
+    @Override
     public Long readLong(final Long defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -338,9 +360,9 @@ public class DecoderImpl implements ByteBufferDecoder
         switch (encodingCode)
         {
             case EncodingCodes.SMALLLONG:
-                return (Long) _constructors[EncodingCodes.SMALLLONG & 0xff].readValue();
+                return Long.valueOf(readRawByte());
             case EncodingCodes.LONG:
-                return (Long) _constructors[EncodingCodes.LONG & 0xff].readValue();
+                return Long.valueOf(readRawLong());
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -348,10 +370,10 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public long readLong(final long defaultVal)
     {
-
-        TypeConstructor constructor = readConstructor();
+        TypeConstructor<?> constructor = readConstructor();
         if(constructor instanceof LongType.LongEncoding)
         {
             return ((LongType.LongEncoding)constructor).readPrimitiveValue();
@@ -370,11 +392,13 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public UnsignedByte readUnsignedByte()
     {
         return readUnsignedByte(null);
     }
 
+    @Override
     public UnsignedByte readUnsignedByte(final UnsignedByte defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -382,7 +406,7 @@ public class DecoderImpl implements ByteBufferDecoder
         switch (encodingCode)
         {
             case EncodingCodes.UBYTE:
-                return (UnsignedByte) _constructors[EncodingCodes.UBYTE & 0xff].readValue();
+                return UnsignedByte.valueOf(readRawByte());
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -390,11 +414,13 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public UnsignedShort readUnsignedShort()
     {
         return readUnsignedShort(null);
     }
 
+    @Override
     public UnsignedShort readUnsignedShort(final UnsignedShort defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -402,7 +428,7 @@ public class DecoderImpl implements ByteBufferDecoder
         switch (encodingCode)
         {
             case EncodingCodes.USHORT:
-                return (UnsignedShort) _constructors[EncodingCodes.USHORT & 0xff].readValue();
+                return UnsignedShort.valueOf(readRawShort());
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -410,11 +436,13 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public UnsignedInteger readUnsignedInteger()
     {
         return readUnsignedInteger(null);
     }
 
+    @Override
     public UnsignedInteger readUnsignedInteger(final UnsignedInteger defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -424,9 +452,9 @@ public class DecoderImpl implements ByteBufferDecoder
             case EncodingCodes.UINT0:
                 return UnsignedInteger.ZERO;
             case EncodingCodes.SMALLUINT:
-                return (UnsignedInteger) _constructors[EncodingCodes.SMALLUINT & 0xff].readValue();
+                return UnsignedInteger.valueOf(((int) readRawByte()) & 0xff);
             case EncodingCodes.UINT:
-                return (UnsignedInteger) _constructors[EncodingCodes.UINT & 0xff].readValue();
+                return UnsignedInteger.valueOf(readRawInt());
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -434,11 +462,13 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public UnsignedLong readUnsignedLong()
     {
         return readUnsignedLong(null);
     }
 
+    @Override
     public UnsignedLong readUnsignedLong(final UnsignedLong defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -448,9 +478,9 @@ public class DecoderImpl implements ByteBufferDecoder
             case EncodingCodes.ULONG0:
                 return UnsignedLong.ZERO;
             case EncodingCodes.SMALLULONG:
-                return (UnsignedLong) _constructors[EncodingCodes.SMALLULONG & 0xff].readValue();
+                return UnsignedLong.valueOf(((long) readRawByte())&0xffl);
             case EncodingCodes.ULONG:
-                return (UnsignedLong) _constructors[EncodingCodes.ULONG & 0xff].readValue();
+                return UnsignedLong.valueOf(readRawLong());
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -458,11 +488,13 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public Character readCharacter()
     {
         return readCharacter(null);
     }
 
+    @Override
     public Character readCharacter(final Character defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -470,7 +502,7 @@ public class DecoderImpl implements ByteBufferDecoder
         switch (encodingCode)
         {
             case EncodingCodes.CHAR:
-                return (Character) _constructors[EncodingCodes.CHAR & 0xff].readValue();
+                return Character.valueOf((char) (readRawInt() & 0xffff));
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -478,6 +510,7 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public char readCharacter(final char defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -485,7 +518,7 @@ public class DecoderImpl implements ByteBufferDecoder
         switch (encodingCode)
         {
             case EncodingCodes.CHAR:
-                return (Character) _constructors[EncodingCodes.CHAR & 0xff].readValue();
+                return (char) (readRawInt() & 0xffff);
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -493,11 +526,13 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public Float readFloat()
     {
         return readFloat(null);
     }
 
+    @Override
     public Float readFloat(final Float defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -505,7 +540,7 @@ public class DecoderImpl implements ByteBufferDecoder
         switch (encodingCode)
         {
             case EncodingCodes.FLOAT:
-                return (Float) _constructors[EncodingCodes.FLOAT & 0xff].readValue();
+                return Float.valueOf(readRawFloat());
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -513,10 +548,10 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public float readFloat(final float defaultVal)
     {
-
-        TypeConstructor constructor = readConstructor();
+        TypeConstructor<?> constructor = readConstructor();
         if(constructor instanceof FloatType.FloatEncoding)
         {
             return ((FloatType.FloatEncoding)constructor).readPrimitiveValue();
@@ -535,11 +570,13 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public Double readDouble()
     {
         return readDouble(null);
     }
 
+    @Override
     public Double readDouble(final Double defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -547,7 +584,7 @@ public class DecoderImpl implements ByteBufferDecoder
         switch (encodingCode)
         {
             case EncodingCodes.DOUBLE:
-                return (Double) _constructors[EncodingCodes.DOUBLE & 0xff].readValue();
+                return Double.valueOf(readRawDouble());
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -555,10 +592,10 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public double readDouble(final double defaultVal)
     {
-
-        TypeConstructor constructor = readConstructor();
+        TypeConstructor<?> constructor = readConstructor();
         if(constructor instanceof DoubleType.DoubleEncoding)
         {
             return ((DoubleType.DoubleEncoding)constructor).readPrimitiveValue();
@@ -577,11 +614,13 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public UUID readUUID()
     {
         return readUUID(null);
     }
 
+    @Override
     public UUID readUUID(final UUID defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -589,7 +628,7 @@ public class DecoderImpl implements ByteBufferDecoder
         switch (encodingCode)
         {
             case EncodingCodes.UUID:
-                return (UUID) _constructors[EncodingCodes.UUID & 0xff].readValue();
+                return new UUID(readRawLong(), readRawLong());
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -597,11 +636,13 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public Decimal32 readDecimal32()
     {
         return readDecimal32(null);
     }
 
+    @Override
     public Decimal32 readDecimal32(final Decimal32 defaultValue)
     {
         byte encodingCode = _buffer.get();
@@ -617,11 +658,13 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public Decimal64 readDecimal64()
     {
         return readDecimal64(null);
     }
 
+    @Override
     public Decimal64 readDecimal64(final Decimal64 defaultValue)
     {
         byte encodingCode = _buffer.get();
@@ -637,11 +680,13 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public Decimal128 readDecimal128()
     {
         return readDecimal128(null);
     }
 
+    @Override
     public Decimal128 readDecimal128(final Decimal128 defaultValue)
     {
         byte encodingCode = _buffer.get();
@@ -657,11 +702,13 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public Date readTimestamp()
     {
         return readTimestamp(null);
     }
 
+    @Override
     public Date readTimestamp(final Date defaultValue)
     {
         byte encodingCode = _buffer.get();
@@ -669,7 +716,7 @@ public class DecoderImpl implements ByteBufferDecoder
         switch (encodingCode)
         {
             case EncodingCodes.TIMESTAMP:
-                return (Date) _constructors[EncodingCodes.TIMESTAMP & 0xff].readValue();
+                return new Date(readRawLong());
             case EncodingCodes.NULL:
                 return defaultValue;
             default:
@@ -677,11 +724,13 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public Binary readBinary()
     {
         return readBinary(null);
     }
 
+    @Override
     public Binary readBinary(final Binary defaultValue)
     {
         byte encodingCode = _buffer.get();
@@ -699,11 +748,13 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public Symbol readSymbol()
     {
         return readSymbol(null);
     }
 
+    @Override
     public Symbol readSymbol(final Symbol defaultValue)
     {
         byte encodingCode = _buffer.get();
@@ -721,11 +772,13 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public String readString()
     {
         return readString(null);
     }
 
+    @Override
     public String readString(final String defaultValue)
     {
         byte encodingCode = _buffer.get();
@@ -743,6 +796,7 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     @SuppressWarnings("rawtypes")
     public List readList()
     {
@@ -763,11 +817,13 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public <T> void readList(final ListProcessor<T> processor)
     {
         //TODO.
     }
 
+    @Override
     @SuppressWarnings("rawtypes")
     public Map readMap()
     {
@@ -786,57 +842,68 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public <T> T[] readArray(final Class<T> clazz)
     {
         return null;  //TODO.
     }
 
+    @Override
     public Object[] readArray()
     {
         return (Object[]) readConstructor().readValue();
 
     }
 
+    @Override
     public boolean[] readBooleanArray()
     {
         return (boolean[]) ((ArrayType.ArrayEncoding)readConstructor()).readValueArray();
     }
 
+    @Override
     public byte[] readByteArray()
     {
         return (byte[]) ((ArrayType.ArrayEncoding)readConstructor()).readValueArray();
     }
 
+    @Override
     public short[] readShortArray()
     {
         return (short[]) ((ArrayType.ArrayEncoding)readConstructor()).readValueArray();
     }
 
+    @Override
     public int[] readIntegerArray()
     {
         return (int[]) ((ArrayType.ArrayEncoding)readConstructor()).readValueArray();
     }
 
+    @Override
     public long[] readLongArray()
     {
         return (long[]) ((ArrayType.ArrayEncoding)readConstructor()).readValueArray();
     }
 
+    @Override
     public float[] readFloatArray()
     {
         return (float[]) ((ArrayType.ArrayEncoding)readConstructor()).readValueArray();
     }
 
+    @Override
     public double[] readDoubleArray()
     {
         return (double[]) ((ArrayType.ArrayEncoding)readConstructor()).readValueArray();
     }
 
+    @Override
     public char[] readCharacterArray()
     {
         return (char[]) ((ArrayType.ArrayEncoding)readConstructor()).readValueArray();
     }
 
+    @Override
     public <T> T[] readMultiple(final Class<T> clazz)
     {
         Object val = readObject();
@@ -867,6 +934,7 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public Object[] readMultiple()
     {
         Object val = readObject();
@@ -886,41 +954,49 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public byte[] readByteMultiple()
     {
         return new byte[0];  //TODO.
     }
 
+    @Override
     public short[] readShortMultiple()
     {
         return new short[0];  //TODO.
     }
 
+    @Override
     public int[] readIntegerMultiple()
     {
         return new int[0];  //TODO.
     }
 
+    @Override
     public long[] readLongMultiple()
     {
         return new long[0];  //TODO.
     }
 
+    @Override
     public float[] readFloatMultiple()
     {
         return new float[0];  //TODO.
     }
 
+    @Override
     public double[] readDoubleMultiple()
     {
         return new double[0];  //TODO.
     }
 
+    @Override
     public char[] readCharacterMultiple()
     {
         return new char[0];  //TODO.
     }
 
+    @Override
     public Object readObject()
     {
         boolean arrayType = false;
@@ -932,7 +1008,7 @@ public class DecoderImpl implements ByteBufferDecoder
                 arrayType = true;
         }
 
-        TypeConstructor constructor = readConstructor();
+        TypeConstructor<?> constructor = readConstructor();
         if(constructor== null)
         {
             throw new DecodeException("Unknown constructor");
@@ -945,6 +1021,7 @@ public class DecoderImpl implements ByteBufferDecoder
         }
     }
 
+    @Override
     public Object readObject(final Object defaultValue)
     {
         Object val = readObject();
@@ -1004,6 +1081,7 @@ public class DecoderImpl implements ByteBufferDecoder
         return decode;
     }
 
+    @Override
     public void setByteBuffer(final ByteBuffer buffer)
     {
         _buffer = new ReadableBuffer.ByteBufferReader(buffer);
@@ -1045,11 +1123,13 @@ public class DecoderImpl implements ByteBufferDecoder
             _described = described;
         }
 
+        @Override
         public Object getDescriptor()
         {
             return _descriptor;
         }
 
+        @Override
         public Object getDescribed()
         {
             return _described;
@@ -1070,6 +1150,7 @@ public class DecoderImpl implements ByteBufferDecoder
 
     }
 
+    @Override
     public int getByteBufferRemaining() {
         return _buffer.remaining();
     }

http://git-wip-us.apache.org/repos/asf/qpid-proton-j/blob/c8fd87e0/proton-j/src/main/java/org/apache/qpid/proton/codec/EncoderImpl.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec/EncoderImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/codec/EncoderImpl.java
index 512805b..164a77d 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec/EncoderImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec/EncoderImpl.java
@@ -157,44 +157,52 @@ public final class EncoderImpl implements ByteBufferEncoder
         return getTypeFromClass(clazz, null);
     }
 
-    private AMQPType getTypeFromClass(final Class clazz, Object instance)
+    private AMQPType<?> getTypeFromClass(final Class<?> clazz, final Object instance)
     {
-        AMQPType amqpType = _typeRegistry.get(clazz);
+        AMQPType<?> amqpType = _typeRegistry.get(clazz);
         if(amqpType == null)
         {
-            if(clazz.isArray())
+            amqpType = deduceTypeFromClass(clazz, instance);
+        }
+
+        return amqpType;
+    }
+
+    private AMQPType<?> deduceTypeFromClass(final Class<?> clazz, final Object instance) {
+        AMQPType<?> amqpType = null;
+
+        if(clazz.isArray())
+        {
+            amqpType = _arrayType;
+        }
+        else
+        {
+            if(List.class.isAssignableFrom(clazz))
             {
-                amqpType = _arrayType;
+                amqpType = _listType;
             }
-            else
+            else if(Map.class.isAssignableFrom(clazz))
             {
-                if(List.class.isAssignableFrom(clazz))
-                {
-                    amqpType = _listType;
-                }
-                else if(Map.class.isAssignableFrom(clazz))
-                {
-                    amqpType = _mapType;
-                }
-                else if(DescribedType.class.isAssignableFrom(clazz))
+                amqpType = _mapType;
+            }
+            else if(DescribedType.class.isAssignableFrom(clazz))
+            {
+                amqpType = _describedTypesClassRegistry.get(clazz);
+                if(amqpType == null && instance != null)
                 {
-                    amqpType = _describedTypesClassRegistry.get(clazz);
-                    if(amqpType == null && instance != null)
+                    Object descriptor = ((DescribedType) instance).getDescriptor();
+                    amqpType = _describedDescriptorRegistry.get(descriptor);
+                    if(amqpType == null)
                     {
-                        Object descriptor = ((DescribedType) instance).getDescriptor();
-                        amqpType = _describedDescriptorRegistry.get(descriptor);
-                        if(amqpType == null)
-                        {
-                            amqpType = new DynamicDescribedType(this, descriptor);
-                            _describedDescriptorRegistry.put(descriptor, amqpType);
-                        }
+                        amqpType = new DynamicDescribedType(this, descriptor);
+                        _describedDescriptorRegistry.put(descriptor, amqpType);
                     }
-
-                    return amqpType;
                 }
+
+                return amqpType;
             }
-            _typeRegistry.put(clazz, amqpType);
         }
+        _typeRegistry.put(clazz, amqpType);
 
         return amqpType;
     }
@@ -212,7 +220,7 @@ public final class EncoderImpl implements ByteBufferEncoder
 
     public void registerDescribedType(Class clazz, Object descriptor)
     {
-        AMQPType type = _describedDescriptorRegistry.get(descriptor);
+        AMQPType<?> type = _describedDescriptorRegistry.get(descriptor);
         if(type == null)
         {
             type = new DynamicDescribedType(this, descriptor);
@@ -513,7 +521,6 @@ public final class EncoderImpl implements ByteBufferEncoder
         {
             _uuidType.fastWrite(this, uuid);
         }
-
     }
 
     @Override
@@ -553,7 +560,6 @@ public final class EncoderImpl implements ByteBufferEncoder
         {
             _symbolType.fastWrite(this, s);
         }
-
     }
 
     @Override
@@ -715,44 +721,51 @@ public final class EncoderImpl implements ByteBufferEncoder
         }
     }
 
+    @SuppressWarnings({ "rawtypes", "unchecked" })
     @Override
     public void writeObject(final Object o)
     {
-        if (o == null)
+        if (o != null)
         {
-            getBuffer().put(EncodingCodes.NULL);
-            return;
-        }
-
-        AMQPType type = _typeRegistry.get(o.getClass());
+            AMQPType type = _typeRegistry.get(o.getClass());
 
-        if(type == null)
-        {
-            if(o.getClass().isArray())
-            {
-                writeArrayType(o);
-            }
-            else if(o instanceof List)
-            {
-                writeList((List)o);
-            }
-            else if(o instanceof Map)
+            if(type != null)
             {
-                writeMap((Map)o);
-            }
-            else if(o instanceof DescribedType)
-            {
-                writeDescribedType((DescribedType)o);
+                type.write(o);
             }
             else
             {
-                throw new IllegalArgumentException(
-                    "Do not know how to write Objects of class " + o.getClass().getName());
+                writeUnregisteredType(o);
             }
         }
         else
         {
-            type.write(o);
+            _buffer.put(EncodingCodes.NULL);
+        }
+    }
+
+    private void writeUnregisteredType(final Object o)
+    {
+        if(o.getClass().isArray())
+        {
+            writeArrayType(o);
+        }
+        else if(o instanceof List)
+        {
+            writeList((List<?>)o);
+        }
+        else if(o instanceof Map)
+        {
+            writeMap((Map<?, ?>)o);
+        }
+        else if(o instanceof DescribedType)
+        {
+            writeDescribedType((DescribedType)o);
+        }
+        else
+        {
+            throw new IllegalArgumentException(
+                "Do not know how to write Objects of class " + o.getClass().getName());
         }
     }
 
@@ -843,7 +856,7 @@ public final class EncoderImpl implements ByteBufferEncoder
         _buffer.put(string);
     }
 
-    AMQPType getNullTypeEncoder()
+    AMQPType<?> getNullTypeEncoder()
     {
         return _nullType;
     }

http://git-wip-us.apache.org/repos/asf/qpid-proton-j/blob/c8fd87e0/proton-j/src/main/java/org/apache/qpid/proton/codec/messaging/FastPathHeaderType.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec/messaging/FastPathHeaderType.java b/proton-j/src/main/java/org/apache/qpid/proton/codec/messaging/FastPathHeaderType.java
index 2562e57..b60d53e 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec/messaging/FastPathHeaderType.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec/messaging/FastPathHeaderType.java
@@ -28,6 +28,7 @@ import org.apache.qpid.proton.codec.DecoderImpl;
 import org.apache.qpid.proton.codec.EncoderImpl;
 import org.apache.qpid.proton.codec.EncodingCodes;
 import org.apache.qpid.proton.codec.FastPathDescribedTypeConstructor;
+import org.apache.qpid.proton.codec.ReadableBuffer;
 import org.apache.qpid.proton.codec.TypeEncoding;
 import org.apache.qpid.proton.codec.WritableBuffer;
 
@@ -57,6 +58,7 @@ public class FastPathHeaderType implements AMQPType<Header>, FastPathDescribedTy
     @Override
     public Header readValue() {
         DecoderImpl decoder = getDecoder();
+        ReadableBuffer buffer = decoder.getBuffer();
         byte typeCode = decoder.getBuffer().get();
 
         @SuppressWarnings("unused")
@@ -67,12 +69,12 @@ public class FastPathHeaderType implements AMQPType<Header>, FastPathDescribedTy
             case EncodingCodes.LIST0:
                 break;
             case EncodingCodes.LIST8:
-                size = ((int)decoder.getBuffer().get()) & 0xff;
-                count = ((int)decoder.getBuffer().get()) & 0xff;
+                size = buffer.get() & 0xff;
+                count = buffer.get() & 0xff;
                 break;
             case EncodingCodes.LIST32:
-                size = decoder.getBuffer().getInt();
-                count = decoder.getBuffer().getInt();
+                size = buffer.getInt();
+                count = buffer.getInt();
                 break;
             default:
                 throw new DecodeException("Incorrect type found in Header encoding: " + typeCode);
@@ -83,19 +85,19 @@ public class FastPathHeaderType implements AMQPType<Header>, FastPathDescribedTy
         for (int index = 0; index < count; ++index) {
             switch (index) {
                 case 0:
-                    header.setDurable(decoder.readBoolean());
+                    header.setDurable(decoder.readBoolean(null));
                     break;
                 case 1:
-                    header.setPriority(decoder.readUnsignedByte());
+                    header.setPriority(decoder.readUnsignedByte(null));
                     break;
                 case 2:
-                    header.setTtl(decoder.readUnsignedInteger());
+                    header.setTtl(decoder.readUnsignedInteger(null));
                     break;
                 case 3:
-                    header.setFirstAcquirer(decoder.readBoolean());
+                    header.setFirstAcquirer(decoder.readBoolean(null));
                     break;
                 case 4:
-                    header.setDeliveryCount(decoder.readUnsignedInteger());
+                    header.setDeliveryCount(decoder.readUnsignedInteger(null));
                     break;
                 default:
                     throw new IllegalStateException("To many entries in Header encoding");

http://git-wip-us.apache.org/repos/asf/qpid-proton-j/blob/c8fd87e0/proton-j/src/main/java/org/apache/qpid/proton/codec/messaging/FastPathPropertiesType.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec/messaging/FastPathPropertiesType.java b/proton-j/src/main/java/org/apache/qpid/proton/codec/messaging/FastPathPropertiesType.java
index 3d5c7c4..22b30d1 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec/messaging/FastPathPropertiesType.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec/messaging/FastPathPropertiesType.java
@@ -1,5 +1,5 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under one or more
+  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
  * The ASF licenses this file to You under the Apache License, Version 2.0
@@ -28,6 +28,7 @@ import org.apache.qpid.proton.codec.DecoderImpl;
 import org.apache.qpid.proton.codec.EncoderImpl;
 import org.apache.qpid.proton.codec.EncodingCodes;
 import org.apache.qpid.proton.codec.FastPathDescribedTypeConstructor;
+import org.apache.qpid.proton.codec.ReadableBuffer;
 import org.apache.qpid.proton.codec.TypeEncoding;
 import org.apache.qpid.proton.codec.WritableBuffer;
 
@@ -57,6 +58,7 @@ public class FastPathPropertiesType implements AMQPType<Properties>, FastPathDes
     @Override
     public Properties readValue() {
         DecoderImpl decoder = getDecoder();
+        ReadableBuffer buffer = decoder.getBuffer();
         byte typeCode = decoder.getBuffer().get();
 
         @SuppressWarnings("unused")
@@ -67,12 +69,12 @@ public class FastPathPropertiesType implements AMQPType<Properties>, FastPathDes
             case EncodingCodes.LIST0:
                 break;
             case EncodingCodes.LIST8:
-                size = ((int)decoder.getBuffer().get()) & 0xff;
-                count = ((int)decoder.getBuffer().get()) & 0xff;
+                size = buffer.get() & 0xff;
+                count = buffer.get() & 0xff;
                 break;
             case EncodingCodes.LIST32:
-                size = decoder.getBuffer().getInt();
-                count = decoder.getBuffer().getInt();
+                size = buffer.getInt();
+                count = buffer.getInt();
                 break;
             default:
                 throw new DecodeException("Incorrect type found in Properties encoding: " + typeCode);
@@ -86,40 +88,40 @@ public class FastPathPropertiesType implements AMQPType<Properties>, FastPathDes
                     properties.setMessageId(decoder.readObject());
                     break;
                 case 1:
-                    properties.setUserId(decoder.readBinary());
+                    properties.setUserId(decoder.readBinary(null));
                     break;
                 case 2:
-                    properties.setTo(decoder.readString());
+                    properties.setTo(decoder.readString(null));
                     break;
                 case 3:
-                    properties.setSubject(decoder.readString());
+                    properties.setSubject(decoder.readString(null));
                     break;
                 case 4:
-                    properties.setReplyTo(decoder.readString());
+                    properties.setReplyTo(decoder.readString(null));
                     break;
                 case 5:
                     properties.setCorrelationId(decoder.readObject());
                     break;
                 case 6:
-                    properties.setContentType(decoder.readSymbol());
+                    properties.setContentType(decoder.readSymbol(null));
                     break;
                 case 7:
-                    properties.setContentEncoding(decoder.readSymbol());
+                    properties.setContentEncoding(decoder.readSymbol(null));
                     break;
                 case 8:
-                    properties.setAbsoluteExpiryTime(decoder.readTimestamp());
+                    properties.setAbsoluteExpiryTime(decoder.readTimestamp(null));
                     break;
                 case 9:
-                    properties.setCreationTime(decoder.readTimestamp());
+                    properties.setCreationTime(decoder.readTimestamp(null));
                     break;
                 case 10:
-                    properties.setGroupId(decoder.readString());
+                    properties.setGroupId(decoder.readString(null));
                     break;
                 case 11:
-                    properties.setGroupSequence(decoder.readUnsignedInteger());
+                    properties.setGroupSequence(decoder.readUnsignedInteger(null));
                     break;
                 case 12:
-                    properties.setReplyToGroupId(decoder.readString());
+                    properties.setReplyToGroupId(decoder.readString(null));
                     break;
                 default:
                     throw new IllegalStateException("To many entries in Properties encoding");
@@ -300,8 +302,7 @@ public class FastPathPropertiesType implements AMQPType<Properties>, FastPathDes
 
     public static void register(Decoder decoder, EncoderImpl encoder) {
         FastPathPropertiesType type = new FastPathPropertiesType(encoder);
-        for(Object descriptor : DESCRIPTORS)
-        {
+        for(Object descriptor : DESCRIPTORS) {
             decoder.register(descriptor, (FastPathDescribedTypeConstructor<?>) type);
         }
         encoder.register(type);

http://git-wip-us.apache.org/repos/asf/qpid-proton-j/blob/c8fd87e0/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathDispositionType.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathDispositionType.java b/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathDispositionType.java
index 4424cfa..32bed2b 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathDispositionType.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathDispositionType.java
@@ -124,10 +124,10 @@ public class FastPathDispositionType implements AMQPType<Disposition>, FastPathD
                     disposition.setRole(Boolean.TRUE.equals(decoder.readBoolean()) ? Role.RECEIVER : Role.SENDER);
                     break;
                 case 1:
-                    disposition.setFirst(decoder.readUnsignedInteger());
+                    disposition.setFirst(decoder.readUnsignedInteger(null));
                     break;
                 case 2:
-                    disposition.setLast(decoder.readUnsignedInteger());
+                    disposition.setLast(decoder.readUnsignedInteger(null));
                     break;
                 case 3:
                     disposition.setSettled(decoder.readBoolean(false));

http://git-wip-us.apache.org/repos/asf/qpid-proton-j/blob/c8fd87e0/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathFlowType.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathFlowType.java b/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathFlowType.java
index 7ed89e4..534ab0c 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathFlowType.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathFlowType.java
@@ -109,28 +109,28 @@ public class FastPathFlowType implements AMQPType<Flow>, FastPathDescribedTypeCo
         for (int index = 0; index < count; ++index) {
             switch (index) {
                 case 0:
-                    flow.setNextIncomingId(decoder.readUnsignedInteger());
+                    flow.setNextIncomingId(decoder.readUnsignedInteger(null));
                     break;
                 case 1:
-                    flow.setIncomingWindow(decoder.readUnsignedInteger());
+                    flow.setIncomingWindow(decoder.readUnsignedInteger(null));
                     break;
                 case 2:
-                    flow.setNextOutgoingId(decoder.readUnsignedInteger());
+                    flow.setNextOutgoingId(decoder.readUnsignedInteger(null));
                     break;
                 case 3:
-                    flow.setOutgoingWindow(decoder.readUnsignedInteger());
+                    flow.setOutgoingWindow(decoder.readUnsignedInteger(null));
                     break;
                 case 4:
-                    flow.setHandle(decoder.readUnsignedInteger());
+                    flow.setHandle(decoder.readUnsignedInteger(null));
                     break;
                 case 5:
-                    flow.setDeliveryCount(decoder.readUnsignedInteger());
+                    flow.setDeliveryCount(decoder.readUnsignedInteger(null));
                     break;
                 case 6:
-                    flow.setLinkCredit(decoder.readUnsignedInteger());
+                    flow.setLinkCredit(decoder.readUnsignedInteger(null));
                     break;
                 case 7:
-                    flow.setAvailable(decoder.readUnsignedInteger());
+                    flow.setAvailable(decoder.readUnsignedInteger(null));
                     break;
                 case 8:
                     flow.setDrain(decoder.readBoolean(false));

http://git-wip-us.apache.org/repos/asf/qpid-proton-j/blob/c8fd87e0/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathTransferType.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathTransferType.java b/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathTransferType.java
index d27e59c..b37c5b6 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathTransferType.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathTransferType.java
@@ -90,19 +90,19 @@ public class FastPathTransferType implements AMQPType<Transfer>, FastPathDescrib
         for (int index = 0; index < count; ++index) {
             switch (index) {
                 case 0:
-                    transfer.setHandle(decoder.readUnsignedInteger());
+                    transfer.setHandle(decoder.readUnsignedInteger(null));
                     break;
                 case 1:
-                    transfer.setDeliveryId(decoder.readUnsignedInteger());
+                    transfer.setDeliveryId(decoder.readUnsignedInteger(null));
                     break;
                 case 2:
-                    transfer.setDeliveryTag(decoder.readBinary());
+                    transfer.setDeliveryTag(decoder.readBinary(null));
                     break;
                 case 3:
-                    transfer.setMessageFormat(decoder.readUnsignedInteger());
+                    transfer.setMessageFormat(decoder.readUnsignedInteger(null));
                     break;
                 case 4:
-                    transfer.setSettled(decoder.readBoolean());
+                    transfer.setSettled(decoder.readBoolean(null));
                     break;
                 case 5:
                     transfer.setMore(decoder.readBoolean(false));


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org