IGNITE-141 - Marshallers refactoring

Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/b98e7e6a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/b98e7e6a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/b98e7e6a

Branch: refs/heads/sprint-2
Commit: b98e7e6a3321be8236165e0b37129d1667db4979
Parents: 13518b2
Author: Valentin Kulichenko <vkuliche...@gridgain.com>
Authored: Fri Mar 6 16:45:12 2015 -0800
Committer: Valentin Kulichenko <vkuliche...@gridgain.com>
Committed: Fri Mar 6 16:45:12 2015 -0800

----------------------------------------------------------------------
 .../optimized/OptimizedClassDescriptor.java     | 337 +++++--------------
 .../optimized/OptimizedMarshallerUtils.java     | 121 ++++++-
 .../optimized/OptimizedObjectInputStream.java   | 111 +++++-
 .../optimized/OptimizedObjectOutputStream.java  |   6 +-
 .../optimized/OptimizedMarshallerSelfTest.java  |   6 +-
 .../OptimizedObjectStreamSelfTest.java          |   3 +-
 6 files changed, 296 insertions(+), 288 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/b98e7e6a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedClassDescriptor.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedClassDescriptor.java
 
b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedClassDescriptor.java
index 5ce6956..5bc2bab 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedClassDescriptor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedClassDescriptor.java
@@ -19,7 +19,6 @@ package org.apache.ignite.marshaller.optimized;
 
 import org.apache.ignite.internal.util.*;
 import org.apache.ignite.internal.util.typedef.*;
-import org.apache.ignite.internal.util.typedef.internal.*;
 import org.apache.ignite.lang.*;
 import org.apache.ignite.marshaller.*;
 import sun.misc.*;
@@ -30,6 +29,7 @@ import java.util.*;
 
 import static java.lang.reflect.Modifier.*;
 import static 
org.apache.ignite.marshaller.optimized.OptimizedMarshallerUtils.*;
+import static 
org.apache.ignite.marshaller.optimized.OptimizedMarshallerUtils.ENUM;
 
 /**
  * Class descriptor.
@@ -38,99 +38,6 @@ class OptimizedClassDescriptor {
     /** Unsafe. */
     private static final Unsafe UNSAFE = GridUnsafe.unsafe();
 
-    /** */
-    private static final int TYPE_BYTE = 1;
-
-    /** */
-    private static final int TYPE_SHORT = 2;
-
-    /** */
-    private static final int TYPE_INT = 3;
-
-    /** */
-    private static final int TYPE_LONG = 4;
-
-    /** */
-    private static final int TYPE_FLOAT = 5;
-
-    /** */
-    private static final int TYPE_DOUBLE = 6;
-
-    /** */
-    private static final int TYPE_CHAR = 7;
-
-    /** */
-    private static final int TYPE_BOOLEAN = 8;
-
-    /** */
-    private static final int TYPE_BYTE_ARR = 9;
-
-    /** */
-    private static final int TYPE_SHORT_ARR = 10;
-
-    /** */
-    private static final int TYPE_INT_ARR = 11;
-
-    /** */
-    private static final int TYPE_LONG_ARR = 12;
-
-    /** */
-    private static final int TYPE_FLOAT_ARR = 13;
-
-    /** */
-    private static final int TYPE_DOUBLE_ARR = 14;
-
-    /** */
-    private static final int TYPE_CHAR_ARR = 15;
-
-    /** */
-    private static final int TYPE_BOOLEAN_ARR = 16;
-
-    /** */
-    private static final int TYPE_OBJ_ARR = 17;
-
-    /** */
-    private static final int TYPE_STR = 18;
-
-    /** */
-    private static final int TYPE_ENUM = 19;
-
-    /** */
-    private static final int TYPE_UUID = 20;
-
-    /** */
-    private static final int TYPE_PROPS = 21;
-
-    /** */
-    private static final int TYPE_ARRAY_LIST = 22;
-
-    /** */
-    private static final int TYPE_HASH_MAP = 23;
-
-    /** */
-    private static final int TYPE_HASH_SET = 24;
-
-    /** */
-    private static final int TYPE_LINKED_LIST = 25;
-
-    /** */
-    private static final int TYPE_LINKED_HASH_MAP = 26;
-
-    /** */
-    private static final int TYPE_LINKED_HASH_SET = 27;
-
-    /** */
-    private static final int TYPE_DATE = 28;
-
-    /** */
-    private static final int TYPE_CLS = 29;
-
-    /** */
-    private static final int TYPE_EXTERNALIZABLE = 50;
-
-    /** */
-    private static final int TYPE_SERIALIZABLE = 51;
-
     /** Class. */
     private final Class<?> cls;
 
@@ -194,9 +101,6 @@ class OptimizedClassDescriptor {
     /** Load factor field offset. */
     private long loadFactorFieldOff;
 
-    /** Map field offset. */
-    private long mapFieldOff;
-
     /** Access order field offset. */
     private long accessOrderFieldOff;
 
@@ -236,82 +140,82 @@ class OptimizedClassDescriptor {
             Class<?> parent;
 
             if (cls == byte.class || cls == Byte.class) {
-                type = TYPE_BYTE;
+                type = BYTE;
 
                 isPrimitive = true;
             }
             else if (cls == short.class || cls == Short.class) {
-                type = TYPE_SHORT;
+                type = SHORT;
 
                 isPrimitive = true;
             }
             else if (cls == int.class || cls == Integer.class) {
-                type = TYPE_INT;
+                type = INT;
 
                 isPrimitive = true;
             }
             else if (cls == long.class || cls == Long.class) {
-                type = TYPE_LONG;
+                type = LONG;
 
                 isPrimitive = true;
             }
             else if (cls == float.class || cls == Float.class) {
-                type = TYPE_FLOAT;
+                type = FLOAT;
 
                 isPrimitive = true;
             }
             else if (cls == double.class || cls == Double.class) {
-                type = TYPE_DOUBLE;
+                type = DOUBLE;
 
                 isPrimitive = true;
             }
             else if (cls == char.class || cls == Character.class) {
-                type = TYPE_CHAR;
+                type = CHAR;
 
                 isPrimitive = true;
             }
             else if (cls == boolean.class || cls == Boolean.class) {
-                type = TYPE_BOOLEAN;
+                type = BOOLEAN;
 
                 isPrimitive = true;
             }
             else if (cls == byte[].class)
-                type = TYPE_BYTE_ARR;
+                type = BYTE_ARR;
             else if (cls == short[].class)
-                type = TYPE_SHORT_ARR;
+                type = SHORT_ARR;
             else if (cls == int[].class)
-                type = TYPE_INT_ARR;
+                type = INT_ARR;
             else if (cls == long[].class)
-                type = TYPE_LONG_ARR;
+                type = LONG_ARR;
             else if (cls == float[].class)
-                type = TYPE_FLOAT_ARR;
+                type = FLOAT_ARR;
             else if (cls == double[].class)
-                type = TYPE_DOUBLE_ARR;
+                type = DOUBLE_ARR;
             else if (cls == char[].class)
-                type = TYPE_CHAR_ARR;
+                type = CHAR_ARR;
             else if (cls == boolean[].class)
-                type = TYPE_BOOLEAN_ARR;
+                type = BOOLEAN_ARR;
             else if (cls.isArray())
-                type = TYPE_OBJ_ARR;
+                type = OBJ_ARR;
             else if (cls == String.class)
-                type = TYPE_STR;
+                type = STR;
             else if (cls.isEnum()) {
-                type = TYPE_ENUM;
+                type = ENUM;
 
                 isEnum = true;
                 enumVals = cls.getEnumConstants();
             }
             // Support for enum constants, based on anonymous children classes.
             else if ((parent = cls.getSuperclass()) != null && 
parent.isEnum()) {
-                type = TYPE_ENUM;
+                type = ENUM;
 
                 isEnum = true;
                 enumVals = parent.getEnumConstants();
             }
             else if (cls == UUID.class)
-                type = TYPE_UUID;
+                type = UUID;
             else if (cls == Properties.class) {
-                type = TYPE_PROPS;
+                type = PROPS;
 
                 try {
                     dfltsFieldOff = 
UNSAFE.objectFieldOffset(Properties.class.getDeclaredField("defaults"));
@@ -321,9 +225,9 @@ class OptimizedClassDescriptor {
                 }
             }
             else if (cls == ArrayList.class)
-                type = TYPE_ARRAY_LIST;
+                type = ARRAY_LIST;
             else if (cls == HashMap.class) {
-                type = TYPE_HASH_MAP;
+                type = HASH_MAP;
 
                 try {
                     loadFactorFieldOff = 
UNSAFE.objectFieldOffset(HashMap.class.getDeclaredField("loadFactor"));
@@ -333,20 +237,19 @@ class OptimizedClassDescriptor {
                 }
             }
             else if (cls == HashSet.class) {
-                type = TYPE_HASH_SET;
+                type = HASH_SET;
 
                 try {
                     loadFactorFieldOff = 
UNSAFE.objectFieldOffset(HashMap.class.getDeclaredField("loadFactor"));
-                    mapFieldOff = 
UNSAFE.objectFieldOffset(HashSet.class.getDeclaredField("map"));
                 }
                 catch (NoSuchFieldException e) {
                     throw new IOException(e);
                 }
             }
             else if (cls == LinkedList.class)
-                type = TYPE_LINKED_LIST;
+                type = LINKED_LIST;
             else if (cls == LinkedHashMap.class) {
-                type = TYPE_LINKED_HASH_MAP;
+                type = LINKED_HASH_MAP;
 
                 try {
                     loadFactorFieldOff = 
UNSAFE.objectFieldOffset(HashMap.class.getDeclaredField("loadFactor"));
@@ -357,20 +260,19 @@ class OptimizedClassDescriptor {
                 }
             }
             else if (cls == LinkedHashSet.class) {
-                type = TYPE_LINKED_HASH_SET;
+                type = LINKED_HASH_SET;
 
                 try {
                     loadFactorFieldOff = 
UNSAFE.objectFieldOffset(HashMap.class.getDeclaredField("loadFactor"));
-                    mapFieldOff = 
UNSAFE.objectFieldOffset(HashSet.class.getDeclaredField("map"));
                 }
                 catch (NoSuchFieldException e) {
                     throw new IOException(e);
                 }
             }
             else if (cls == Date.class)
-                type = TYPE_DATE;
+                type = DATE;
             else if (cls == Class.class) {
-                type = TYPE_CLS;
+                type = CLS;
 
                 isCls = true;
             }
@@ -416,7 +318,7 @@ class OptimizedClassDescriptor {
                 }
 
                 if (Externalizable.class.isAssignableFrom(cls)) {
-                    type = TYPE_EXTERNALIZABLE;
+                    type = EXTERNALIZABLE;
 
                     try {
                         constructor = !Modifier.isStatic(cls.getModifiers()) 
&& cls.getDeclaringClass() != null ?
@@ -430,7 +332,7 @@ class OptimizedClassDescriptor {
                     }
                 }
                 else {
-                    type = TYPE_SERIALIZABLE;
+                    type = SERIALIZABLE;
 
                     isSerial = Serializable.class.isAssignableFrom(cls);
 
@@ -647,167 +549,172 @@ class OptimizedClassDescriptor {
      */
     @SuppressWarnings("ForLoopReplaceableByForEach")
     void write(OptimizedObjectOutputStream out, Object obj) throws IOException 
{
+        out.write(type);
+
         switch (type) {
-            case TYPE_BYTE:
+            case BYTE:
                 out.writeByte((Byte)obj);
 
                 break;
 
-            case TYPE_SHORT:
+            case SHORT:
                 out.writeShort((Short)obj);
 
                 break;
 
-            case TYPE_INT:
+            case INT:
                 out.writeInt((Integer)obj);
 
                 break;
 
-            case TYPE_LONG:
+            case LONG:
                 out.writeLong((Long)obj);
 
                 break;
 
-            case TYPE_FLOAT:
+            case FLOAT:
                 out.writeFloat((Float)obj);
 
                 break;
 
-            case TYPE_DOUBLE:
+            case DOUBLE:
                 out.writeDouble((Double)obj);
 
                 break;
 
-            case TYPE_CHAR:
+            case CHAR:
                 out.writeChar((Character)obj);
 
                 break;
 
-            case TYPE_BOOLEAN:
+            case BOOLEAN:
                 out.writeBoolean((Boolean)obj);
 
                 break;
 
-            case TYPE_BYTE_ARR:
+            case BYTE_ARR:
                 out.writeByteArray((byte[])obj);
 
                 break;
 
-            case TYPE_SHORT_ARR:
+            case SHORT_ARR:
                 out.writeShortArray((short[])obj);
 
                 break;
 
-            case TYPE_INT_ARR:
+            case INT_ARR:
                 out.writeIntArray((int[])obj);
 
                 break;
 
-            case TYPE_LONG_ARR:
+            case LONG_ARR:
                 out.writeLongArray((long[])obj);
 
                 break;
 
-            case TYPE_FLOAT_ARR:
+            case FLOAT_ARR:
                 out.writeFloatArray((float[])obj);
 
                 break;
 
-            case TYPE_DOUBLE_ARR:
+            case DOUBLE_ARR:
                 out.writeDoubleArray((double[])obj);
 
                 break;
 
-            case TYPE_CHAR_ARR:
+            case CHAR_ARR:
                 out.writeCharArray((char[])obj);
 
                 break;
 
-            case TYPE_BOOLEAN_ARR:
+            case BOOLEAN_ARR:
                 out.writeBooleanArray((boolean[])obj);
 
                 break;
 
-            case TYPE_OBJ_ARR:
+            case OBJ_ARR:
                 out.writeUTF(obj.getClass().getComponentType().getName());
                 out.writeArray((Object[])obj);
 
                 break;
 
-            case TYPE_STR:
+            case STR:
                 out.writeString((String)obj);
 
                 break;
 
-            case TYPE_ENUM:
-                out.writeInt(((Enum)obj).ordinal());
-
-                break;
-
-            case TYPE_UUID:
+            case UUID:
                 out.writeUuid((UUID)obj);
 
                 break;
 
-            case TYPE_PROPS:
+            case PROPS:
                 out.writeProperties((Properties)obj, dfltsFieldOff);
 
                 break;
 
-            case TYPE_ARRAY_LIST:
+            case ARRAY_LIST:
                 out.writeArrayList((ArrayList<?>)obj);
 
                 break;
 
-            case TYPE_HASH_MAP:
+            case HASH_MAP:
                 out.writeHashMap((HashMap<?, ?>)obj, loadFactorFieldOff, 
false);
 
                 break;
 
-            case TYPE_HASH_SET:
-                out.writeHashSet((HashSet<?>)obj, mapFieldOff, 
loadFactorFieldOff);
+            case HASH_SET:
+                out.writeHashSet((HashSet<?>)obj, HASH_SET_MAP_OFF, 
loadFactorFieldOff);
 
                 break;
 
-            case TYPE_LINKED_LIST:
+            case LINKED_LIST:
                 out.writeLinkedList((LinkedList<?>)obj);
 
                 break;
 
-            case TYPE_LINKED_HASH_MAP:
+            case LINKED_HASH_MAP:
                 out.writeLinkedHashMap((LinkedHashMap<?, ?>)obj, 
loadFactorFieldOff, accessOrderFieldOff, false);
 
                 break;
 
-            case TYPE_LINKED_HASH_SET:
-                out.writeLinkedHashSet((LinkedHashSet<?>)obj, mapFieldOff, 
loadFactorFieldOff);
+            case LINKED_HASH_SET:
+                out.writeLinkedHashSet((LinkedHashSet<?>)obj, 
HASH_SET_MAP_OFF, loadFactorFieldOff);
 
                 break;
 
-            case TYPE_DATE:
+            case DATE:
                 out.writeDate((Date)obj);
 
                 break;
 
-            case TYPE_CLS:
+            case CLS:
                 OptimizedClassDescriptor desc = classDescriptor((Class<?>)obj, 
ctx, mapper);
 
                 out.writeInt(desc.typeId());
 
                 break;
 
-            case TYPE_EXTERNALIZABLE:
+            case ENUM:
+                out.writeInt(typeId);
+                out.writeInt(((Enum)obj).ordinal());
+
+                break;
+
+            case EXTERNALIZABLE:
+                out.writeInt(typeId);
                 out.writeShort(checksum);
                 out.writeExternalizable(obj);
 
                 break;
 
-            case TYPE_SERIALIZABLE:
+            case SERIALIZABLE:
                 if (out.requireSerializable() && !isSerial)
                     throw new NotSerializableException("Must implement 
java.io.Serializable or " +
                         "set OptimizedMarshaller.setRequireSerializable() to 
false " +
                         "(note that performance may degrade if object is not 
Serializable): " + name);
 
+                out.writeInt(typeId);
                 out.writeShort(checksum);
                 out.writeSerializable(obj, writeObjMtds, fields);
 
@@ -828,105 +735,23 @@ class OptimizedClassDescriptor {
      */
     Object read(OptimizedObjectInputStream in) throws ClassNotFoundException, 
IOException {
         switch (type) {
-            case TYPE_BYTE:
-                return in.readByte();
-
-            case TYPE_SHORT:
-                return in.readShort();
-
-            case TYPE_INT:
-                return in.readInt();
-
-            case TYPE_LONG:
-                return in.readLong();
-
-            case TYPE_FLOAT:
-                return in.readFloat();
-
-            case TYPE_DOUBLE:
-                return in.readDouble();
-
-            case TYPE_CHAR:
-                return in.readChar();
-
-            case TYPE_BOOLEAN:
-                return in.readBoolean();
-
-            case TYPE_BYTE_ARR:
-                return in.readByteArray();
-
-            case TYPE_SHORT_ARR:
-                return in.readShortArray();
-
-            case TYPE_INT_ARR:
-                return in.readIntArray();
-
-            case TYPE_LONG_ARR:
-                return in.readLongArray();
-
-            case TYPE_FLOAT_ARR:
-                return in.readFloatArray();
-
-            case TYPE_DOUBLE_ARR:
-                return in.readDoubleArray();
-
-            case TYPE_CHAR_ARR:
-                return in.readCharArray();
-
-            case TYPE_BOOLEAN_ARR:
-                return in.readBooleanArray();
-
-            case TYPE_OBJ_ARR:
-                return in.readArray(Class.forName(in.readUTF(), false, 
in.classLoader()));
-
-            case TYPE_STR:
-                return in.readString();
-
-            case TYPE_ENUM:
+            case ENUM:
                 return enumVals[in.readInt()];
 
-            case TYPE_UUID:
-                return in.readUuid();
-
-            case TYPE_PROPS:
-                return in.readProperties();
-
-            case TYPE_ARRAY_LIST:
-                return in.readArrayList();
-
-            case TYPE_HASH_MAP:
-                return in.readHashMap(false);
-
-            case TYPE_HASH_SET:
-                return in.readHashSet(mapFieldOff);
-
-            case TYPE_LINKED_LIST:
-                return in.readLinkedList();
-
-            case TYPE_LINKED_HASH_MAP:
-                return in.readLinkedHashMap(false);
-
-            case TYPE_LINKED_HASH_SET:
-                return in.readLinkedHashSet(mapFieldOff);
-
-            case TYPE_DATE:
-                return in.readDate();
-
-            case TYPE_CLS:
-                return classDescriptor(in.readInt(), in.classLoader(), ctx, 
mapper).describedClass();
-
-            case TYPE_EXTERNALIZABLE:
+            case EXTERNALIZABLE:
                 verifyChecksum(in.readShort());
 
                 return in.readExternalizable(constructor, readResolveMtd);
 
-            case TYPE_SERIALIZABLE:
+            case SERIALIZABLE:
                 verifyChecksum(in.readShort());
 
                 return in.readSerializable(cls, readObjMtds, readResolveMtd, 
fields);
 
             default:
-                throw new IllegalStateException("Invalid class type: " + type);
+                assert false : "Unexpected type: " + type;
+
+                return null;
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/b98e7e6a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java
 
b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java
index 1c8d2f8..ff1967c 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.marshaller.optimized;
 
+import org.apache.ignite.*;
 import org.apache.ignite.internal.util.*;
 import org.apache.ignite.internal.util.typedef.*;
 import org.apache.ignite.marshaller.*;
@@ -35,20 +36,113 @@ import java.util.concurrent.*;
  * Miscellaneous utility methods to facilitate {@link OptimizedMarshaller}.
  */
 class OptimizedMarshallerUtils {
-    /** Unsafe. */
+    /** */
     private static final Unsafe UNSAFE = GridUnsafe.unsafe();
 
-    /** {@code Null} object reference. */
-    static final byte NULL = (byte)0x70;
+    /** */
+    static final long HASH_SET_MAP_OFF;
 
-    /** Handle reference. */
-    static final byte HANDLE = (byte)0x71;
+    /** */
+    static final byte JDK = -2;
 
-    /** Object reference. */
-    static final byte OBJECT = (byte)0x72;
+    /** */
+    static final byte HANDLE = -1;
 
-    /** Object marshalled with JDK marshaller. */
-    static final byte JDK = (byte)0x73;
+    /** */
+    static final byte NULL = 0;
+
+    /** */
+    static final byte BYTE = 1;
+
+    /** */
+    static final byte SHORT = 2;
+
+    /** */
+    static final byte INT = 3;
+
+    /** */
+    static final byte LONG = 4;
+
+    /** */
+    static final byte FLOAT = 5;
+
+    /** */
+    static final byte DOUBLE = 6;
+
+    /** */
+    static final byte CHAR = 7;
+
+    /** */
+    static final byte BOOLEAN = 8;
+
+    /** */
+    static final byte BYTE_ARR = 9;
+
+    /** */
+    static final byte SHORT_ARR = 10;
+
+    /** */
+    static final byte INT_ARR = 11;
+
+    /** */
+    static final byte LONG_ARR = 12;
+
+    /** */
+    static final byte FLOAT_ARR = 13;
+
+    /** */
+    static final byte DOUBLE_ARR = 14;
+
+    /** */
+    static final byte CHAR_ARR = 15;
+
+    /** */
+    static final byte BOOLEAN_ARR = 16;
+
+    /** */
+    static final byte OBJ_ARR = 17;
+
+    /** */
+    static final byte STR = 18;
+
+    /** */
+    static final byte UUID = 19;
+
+    /** */
+    static final byte PROPS = 20;
+
+    /** */
+    static final byte ARRAY_LIST = 21;
+
+    /** */
+    static final byte HASH_MAP = 22;
+
+    /** */
+    static final byte HASH_SET = 23;
+
+    /** */
+    static final byte LINKED_LIST = 24;
+
+    /** */
+    static final byte LINKED_HASH_MAP = 25;
+
+    /** */
+    static final byte LINKED_HASH_SET = 26;
+
+    /** */
+    static final byte DATE = 27;
+
+    /** */
+    static final byte CLS = 28;
+
+    /** */
+    static final byte ENUM = 100;
+
+    /** */
+    static final byte EXTERNALIZABLE = 101;
+
+    /** */
+    static final byte SERIALIZABLE = 102;
 
     /** UTF-8 character name. */
     static final Charset UTF_8 = Charset.forName("UTF-8");
@@ -59,6 +153,15 @@ class OptimizedMarshallerUtils {
     /** Class descriptors by class. */
     private static final ConcurrentMap<Class, OptimizedClassDescriptor> 
DESC_BY_CLS = new ConcurrentHashMap8<>();
 
+    static {
+        try {
+            HASH_SET_MAP_OFF = 
UNSAFE.objectFieldOffset(HashSet.class.getDeclaredField("map"));
+        }
+        catch (NoSuchFieldException e) {
+            throw new IgniteException("Initialization failure.", e);
+        }
+    }
+
     /**
      */
     private OptimizedMarshallerUtils() {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/b98e7e6a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectInputStream.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectInputStream.java
 
b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectInputStream.java
index aaeffa1..c0def75 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectInputStream.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectInputStream.java
@@ -92,13 +92,6 @@ class OptimizedObjectInputStream extends ObjectInputStream {
     }
 
     /**
-     * @return Class loader.
-     */
-    ClassLoader classLoader() {
-        return clsLdr;
-    }
-
-    /**
      * @return Input.
      */
     public GridDataInput in() {
@@ -148,15 +141,6 @@ class OptimizedObjectInputStream extends ObjectInputStream 
{
             case HANDLE:
                 return handles.lookup(readInt());
 
-            case OBJECT:
-                int typeId = readInt();
-
-                OptimizedClassDescriptor desc = 
OptimizedMarshallerUtils.classDescriptor(typeId, clsLdr, ctx, mapper);
-
-                curCls = desc.describedClass();
-
-                return desc.read(this);
-
             case JDK:
                 try {
                     return JDK_MARSH.unmarshal(this, clsLdr);
@@ -170,6 +154,101 @@ class OptimizedObjectInputStream extends 
ObjectInputStream {
                         throw new IOException("Failed to deserialize object 
with JDK marshaller.", e);
                 }
 
+            case BYTE:
+                return readByte();
+
+            case SHORT:
+                return readShort();
+
+            case INT:
+                return readInt();
+
+            case LONG:
+                return readLong();
+
+            case FLOAT:
+                return readFloat();
+
+            case DOUBLE:
+                return readDouble();
+
+            case CHAR:
+                return readChar();
+
+            case BOOLEAN:
+                return readBoolean();
+
+            case BYTE_ARR:
+                return readByteArray();
+
+            case SHORT_ARR:
+                return readShortArray();
+
+            case INT_ARR:
+                return readIntArray();
+
+            case LONG_ARR:
+                return readLongArray();
+
+            case FLOAT_ARR:
+                return readFloatArray();
+
+            case DOUBLE_ARR:
+                return readDoubleArray();
+
+            case CHAR_ARR:
+                return readCharArray();
+
+            case BOOLEAN_ARR:
+                return readBooleanArray();
+
+            case OBJ_ARR:
+                return readArray(Class.forName(readUTF(), false, clsLdr));
+
+            case STR:
+                return readString();
+
+            case UUID:
+                return readUuid();
+
+            case PROPS:
+                return readProperties();
+
+            case ARRAY_LIST:
+                return readArrayList();
+
+            case HASH_MAP:
+                return readHashMap(false);
+
+            case HASH_SET:
+                return readHashSet(HASH_SET_MAP_OFF);
+
+            case LINKED_LIST:
+                return readLinkedList();
+
+            case LINKED_HASH_MAP:
+                return readLinkedHashMap(false);
+
+            case LINKED_HASH_SET:
+                return readLinkedHashSet(HASH_SET_MAP_OFF);
+
+            case DATE:
+                return readDate();
+
+            case CLS:
+                return classDescriptor(in.readInt(), clsLdr, ctx, 
mapper).describedClass();
+
+            case ENUM:
+            case EXTERNALIZABLE:
+            case SERIALIZABLE:
+                int typeId = readInt();
+
+                OptimizedClassDescriptor desc = 
OptimizedMarshallerUtils.classDescriptor(typeId, clsLdr, ctx, mapper);
+
+                curCls = desc.describedClass();
+
+                return desc.read(this);
+
             default:
                 SB msg = new SB("Unexpected error occurred during 
unmarshalling");
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/b98e7e6a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectOutputStream.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectOutputStream.java
 
b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectOutputStream.java
index 9e392be..1faad50 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectOutputStream.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectOutputStream.java
@@ -200,12 +200,8 @@ class OptimizedObjectOutputStream extends 
ObjectOutputStream {
                     writeByte(HANDLE);
                     writeInt(handle);
                 }
-                else {
-                    writeByte(OBJECT);
-                    writeInt(desc.typeId());
-
+                else
                     desc.write(this, obj);
-                }
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/b98e7e6a/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerSelfTest.java
index 2cb1b2d..7d09070 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerSelfTest.java
@@ -84,7 +84,11 @@ public class OptimizedMarshallerSelfTest extends 
GridMarshallerAbstractTest {
             log,
             new Callable<Object>() {
                 @Override public Object call() throws Exception {
-                    unmarshal(new byte[10]);
+                    byte[] arr = new byte[10];
+
+                    arr[0] = (byte)200;
+
+                    unmarshal(arr);
 
                     return null;
                 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/b98e7e6a/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/OptimizedObjectStreamSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/OptimizedObjectStreamSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/OptimizedObjectStreamSelfTest.java
index c376195..5f63730 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/OptimizedObjectStreamSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/OptimizedObjectStreamSelfTest.java
@@ -1082,7 +1082,8 @@ public class OptimizedObjectStreamSelfTest extends 
GridCommonAbstractTest {
 
         /** {@inheritDoc} */
         @Override public void writeExternal(ObjectOutput out) throws 
IOException {
-            out.writeLong(0);
+            out.writeInt(0);
+            out.writeInt(200);
             out.writeObject("str");
         }
 

Reply via email to