You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2016/02/12 14:17:29 UTC

[07/10] ignite git commit: IGNITE-2430: Fixed binary builder serialization logic for non-standard collections.

IGNITE-2430: Fixed binary builder serialization logic for non-standard collections.


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

Branch: refs/heads/ignite-1786
Commit: 159b6cb4e17da75b77c958f5ad2b7b3fb7596c63
Parents: 35b0e6b
Author: dkarachentsev <dk...@gridgain.com>
Authored: Fri Feb 12 16:02:32 2016 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Fri Feb 12 16:02:32 2016 +0300

----------------------------------------------------------------------
 .../ignite/internal/binary/BinaryUtils.java     |  4 +-
 .../binary/builder/BinaryBuilderSerializer.java | 16 +++-
 .../binary/builder/BinaryObjectBuilderImpl.java | 12 ++-
 .../binary/builder/BinaryValueWithType.java     |  3 +-
 .../BinaryObjectBuilderAdditionalSelfTest.java  | 91 +++++++++++++++++++-
 ...naryObjectBuilderDefaultMappersSelfTest.java | 30 +++++--
 6 files changed, 141 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/159b6cb4/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
index c3343d4..8b5d780 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
@@ -1055,7 +1055,7 @@ public class BinaryUtils {
      * @param cls Class.
      * @return {@code True} if this is a special collection class.
      */
-    private static boolean isSpecialCollection(Class cls) {
+    public static boolean isSpecialCollection(Class cls) {
         return ArrayList.class.equals(cls) || LinkedList.class.equals(cls) ||
             HashSet.class.equals(cls) || LinkedHashSet.class.equals(cls);
     }
@@ -1066,7 +1066,7 @@ public class BinaryUtils {
      * @param cls Class.
      * @return {@code True} if this is a special map class.
      */
-    private static boolean isSpecialMap(Class cls) {
+    public static boolean isSpecialMap(Class cls) {
         return HashMap.class.equals(cls) || LinkedHashMap.class.equals(cls);
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/159b6cb4/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java
index 6e5a621..b296437 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java
@@ -50,6 +50,18 @@ class BinaryBuilderSerializer {
      * @param val Value.
      */
     public void writeValue(BinaryWriterExImpl writer, Object val) {
+        writeValue(writer, val, false, false);
+    }
+
+    /**     *
+     * @param writer Writer.
+     * @param val Value.
+     * @param forceCol Whether to force collection type.
+     * @param forceMap Whether to force map type.
+     */
+    public void writeValue(BinaryWriterExImpl writer, Object val, boolean forceCol, boolean forceMap) {
+        assert !(forceCol && forceMap);
+
         if (val == null) {
             writer.writeByte(GridBinaryMarshaller.NULL);
 
@@ -113,7 +125,7 @@ class BinaryBuilderSerializer {
             return;
         }
 
-        if (val instanceof Collection) {
+        if (forceCol || BinaryUtils.isSpecialCollection(val.getClass())) {
             Collection<?> c = (Collection<?>)val;
 
             writer.writeByte(GridBinaryMarshaller.COL);
@@ -129,7 +141,7 @@ class BinaryBuilderSerializer {
             return;
         }
 
-        if (val instanceof Map) {
+        if (forceMap || BinaryUtils.isSpecialMap(val.getClass())) {
             Map<?, ?> map = (Map<?, ?>)val;
 
             writer.writeByte(GridBinaryMarshaller.MAP);

http://git-wip-us.apache.org/repos/asf/ignite/blob/159b6cb4/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java
index e2290d6..9043a8b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java
@@ -36,6 +36,7 @@ import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteBiTuple;
 import org.jetbrains.annotations.Nullable;
 
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
@@ -508,10 +509,19 @@ public class BinaryObjectBuilderImpl implements BinaryObjectBuilder {
 
     /** {@inheritDoc} */
     @Override public <T> BinaryObjectBuilder setField(String name, @Nullable T val, Class<? super T> type) {
+        byte typeId;
+
+        if (Collection.class.equals(type))
+            typeId = GridBinaryMarshaller.COL;
+        else if (Map.class.equals(type))
+            typeId = GridBinaryMarshaller.MAP;
+        else
+            typeId = BinaryUtils.typeByClass(type);
+
         if (assignedVals == null)
             assignedVals = new LinkedHashMap<>();
 
-        assignedVals.put(name, new BinaryValueWithType(BinaryUtils.typeByClass(type), val));
+        assignedVals.put(name, new BinaryValueWithType(typeId, val));
 
         return this;
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/159b6cb4/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryValueWithType.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryValueWithType.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryValueWithType.java
index 9f43bdb..c5a3e0a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryValueWithType.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryValueWithType.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.binary.builder;
 
 import org.apache.ignite.internal.binary.BinaryWriterExImpl;
+import org.apache.ignite.internal.binary.GridBinaryMarshaller;
 import org.apache.ignite.internal.util.typedef.internal.S;
 
 /**
@@ -44,7 +45,7 @@ class BinaryValueWithType implements BinaryLazyValue {
         if (val instanceof BinaryBuilderSerializationAware)
             ((BinaryBuilderSerializationAware)val).writeTo(writer, ctx);
         else
-            ctx.writeValue(writer, val);
+            ctx.writeValue(writer, val, type == GridBinaryMarshaller.COL, type == GridBinaryMarshaller.MAP);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/159b6cb4/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderAdditionalSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderAdditionalSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderAdditionalSelfTest.java
index 06e1e93..804c060 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderAdditionalSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderAdditionalSelfTest.java
@@ -30,10 +30,10 @@ import org.apache.ignite.binary.BinaryType;
 import org.apache.ignite.configuration.BinaryConfiguration;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.internal.binary.mutabletest.GridBinaryTestClasses;
-import org.apache.ignite.internal.binary.builder.BinaryObjectBuilderImpl;
 import org.apache.ignite.internal.binary.builder.BinaryBuilderEnum;
+import org.apache.ignite.internal.binary.builder.BinaryObjectBuilderImpl;
 import org.apache.ignite.internal.binary.mutabletest.GridBinaryMarshalerAwareTestClass;
+import org.apache.ignite.internal.binary.mutabletest.GridBinaryTestClasses;
 import org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl;
 import org.apache.ignite.internal.processors.cache.binary.IgniteBinaryImpl;
 import org.apache.ignite.internal.util.lang.GridMapEntry;
@@ -43,12 +43,18 @@ import org.junit.Assert;
 
 import java.lang.reflect.Field;
 import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.sql.Timestamp;
+import java.util.AbstractMap;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -1261,4 +1267,85 @@ public class BinaryObjectBuilderAdditionalSelfTest extends GridCommonAbstractTes
         return new BinaryObjectBuilderImpl(processor.binaryContext(), processor.typeId(aCls.getName()), 
             processor.binaryContext().userTypeName(aCls.getName()));
     }
+
+    /**
+     * Check that correct type is stored in binary object.
+     */
+    public void testCollectionsSerialization() {
+        final BinaryObjectBuilder root = newWrapper(BigInteger.class);
+
+        final List<Integer> arrList = new ArrayList<>();
+
+        arrList.add(Integer.MAX_VALUE);
+
+        final List<Integer> linkedList = new LinkedList<>();
+
+        linkedList.add(Integer.MAX_VALUE);
+
+        final Set<Integer> hashSet = new HashSet<>();
+
+        hashSet.add(Integer.MAX_VALUE);
+
+        final Set<Integer> linkedHashSet = new LinkedHashSet<>();
+
+        linkedHashSet.add(Integer.MAX_VALUE);
+
+        final Map<String, String> hashMap = new HashMap<>();
+
+        hashMap.put("key", "val");
+
+        final Map<String, String> linkedHashMap = new LinkedHashMap<>();
+
+        linkedHashMap.put("key", "val");
+
+        // collections
+        root.setField("arrayList", arrList);
+        root.setField("linkedList", linkedList);
+        root.setField("hashSet", hashSet);
+        root.setField("linkedHashSet", linkedHashSet);
+
+        root.setField("singletonList", Collections.singletonList(Integer.MAX_VALUE), Collection.class);
+        root.setField("singletonSet",  Collections.singleton(Integer.MAX_VALUE), Collection.class);
+
+        // maps
+        root.setField("hashMap", hashMap);
+        root.setField("linkedHashMap", linkedHashMap);
+
+        root.setField("singletonMap", Collections.singletonMap("key", "val"), Map.class);
+
+        // objects
+        root.setField("asList", Collections.singletonList(Integer.MAX_VALUE));
+        root.setField("asSet", Collections.singleton(Integer.MAX_VALUE));
+        root.setField("asMap", Collections.singletonMap("key", "val"));
+        root.setField("asListHint", Collections.singletonList(Integer.MAX_VALUE), List.class);
+        root.setField("asSetHint", Collections.singleton(Integer.MAX_VALUE), Set.class);
+        root.setField("asMapHint", (AbstractMap) Collections.singletonMap("key", "val"), AbstractMap.class);
+
+        BinaryObject binaryObj = root.build();
+
+        final String COL = "Collection";
+        final String MAP = "Map";
+        final String OBJ = "Object";
+
+        assert COL.equals(binaryObj.type().fieldTypeName("arrayList"));
+        assert COL.equals(binaryObj.type().fieldTypeName("linkedList"));
+        assert COL.equals(binaryObj.type().fieldTypeName("hashSet"));
+        assert COL.equals(binaryObj.type().fieldTypeName("linkedHashSet"));
+        assert COL.equals(binaryObj.type().fieldTypeName("linkedHashSet"));
+        assert COL.equals(binaryObj.type().fieldTypeName("linkedHashSet"));
+
+        assert COL.equals(binaryObj.type().fieldTypeName("singletonList"));
+        assert COL.equals(binaryObj.type().fieldTypeName("singletonSet"));
+
+        assert MAP.equals(binaryObj.type().fieldTypeName("singletonMap"));
+
+        assert OBJ.equals(binaryObj.type().fieldTypeName("asList"));
+        assert OBJ.equals(binaryObj.type().fieldTypeName("asSet"));
+        assert OBJ.equals(binaryObj.type().fieldTypeName("asMap"));
+        assert OBJ.equals(binaryObj.type().fieldTypeName("asListHint"));
+        assert OBJ.equals(binaryObj.type().fieldTypeName("asSetHint"));
+        assert OBJ.equals(binaryObj.type().fieldTypeName("asMapHint"));
+
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/159b6cb4/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderDefaultMappersSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderDefaultMappersSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderDefaultMappersSelfTest.java
index 990c928..9659c39 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderDefaultMappersSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderDefaultMappersSelfTest.java
@@ -674,18 +674,24 @@ public class BinaryObjectBuilderDefaultMappersSelfTest extends GridCommonAbstrac
         builder.hashCode(100);
 
         builder.setField("collectionField", Arrays.asList(new Value(1), new Value(2)));
+        builder.setField("collectionField2", Arrays.asList(new Value(1), new Value(2)), Collection.class);
 
         BinaryObject po = builder.build();
 
         assertEquals(expectedHashCode("Class"), po.type().typeId());
         assertEquals(100, po.hashCode());
 
-        List<BinaryObject> list = po.field("collectionField");
+        List<Value> list = po.field("collectionField");
 
         assertEquals(2, list.size());
+        assertEquals(1, list.get(0).i);
+        assertEquals(2, list.get(1).i);
 
-        assertEquals(1, list.get(0).<Value>deserialize().i);
-        assertEquals(2, list.get(1).<Value>deserialize().i);
+        List<BinaryObject> list2 = po.field("collectionField2");
+
+        assertEquals(2, list2.size());
+        assertEquals(1, list2.get(0).<Value>deserialize().i);
+        assertEquals(2, list2.get(1).<Value>deserialize().i);
     }
 
     /**
@@ -697,17 +703,27 @@ public class BinaryObjectBuilderDefaultMappersSelfTest extends GridCommonAbstrac
         builder.hashCode(100);
 
         builder.setField("mapField", F.asMap(new Key(1), new Value(1), new Key(2), new Value(2)));
+        builder.setField("mapField2", F.asMap(new Key(1), new Value(1), new Key(2), new Value(2)), Map.class);
 
         BinaryObject po = builder.build();
 
         assertEquals(expectedHashCode("Class"), po.type().typeId());
         assertEquals(100, po.hashCode());
 
-        Map<BinaryObject, BinaryObject> map = po.field("mapField");
+        // Test non-standard map.
+        Map<Key, Value> map = po.field("mapField");
 
         assertEquals(2, map.size());
 
-        for (Map.Entry<BinaryObject, BinaryObject> e : map.entrySet())
+        for (Map.Entry<Key, Value> e : map.entrySet())
+            assertEquals(e.getKey().i, e.getValue().i);
+
+        // Test binary map
+        Map<BinaryObject, BinaryObject> map2 = po.field("mapField2");
+
+        assertEquals(2, map2.size());
+
+        for (Map.Entry<BinaryObject, BinaryObject> e : map2.entrySet())
             assertEquals(e.getKey().<Key>deserialize().i, e.getValue().<Value>deserialize().i);
     }
 
@@ -723,7 +739,7 @@ public class BinaryObjectBuilderDefaultMappersSelfTest extends GridCommonAbstrac
         builder.setField("f", 111.111f);
         builder.setField("iArr", new int[] {1, 2, 3});
         builder.setField("obj", new Key(1));
-        builder.setField("col", Arrays.asList(new Value(1), new Value(2)));
+        builder.setField("col", Arrays.asList(new Value(1), new Value(2)), Collection.class);
 
         BinaryObject po = builder.build();
 
@@ -755,7 +771,7 @@ public class BinaryObjectBuilderDefaultMappersSelfTest extends GridCommonAbstrac
         builder.setField("f", 111.111f);
         builder.setField("iArr", new int[] {1, 2, 3});
         builder.setField("obj", new Key(1));
-        builder.setField("col", Arrays.asList(new Value(1), new Value(2)));
+        builder.setField("col", Arrays.asList(new Value(1), new Value(2)), Collection.class);
 
         BinaryObject po = builder.build();