You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2015/09/01 15:40:58 UTC
[11/14] ignite git commit: ignite-1273: fixed reading fields' handles,
added cyclic references tests
ignite-1273: fixed reading fields' handles, added cyclic references tests
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/8e8d59c7
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/8e8d59c7
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/8e8d59c7
Branch: refs/heads/ignite-1273
Commit: 8e8d59c7b3eb157530620dba0b5a0e6ad6229b2a
Parents: 1e39941
Author: Denis Magda <dm...@gridgain.com>
Authored: Tue Sep 1 15:44:12 2015 +0300
Committer: Denis Magda <dm...@gridgain.com>
Committed: Tue Sep 1 15:44:12 2015 +0300
----------------------------------------------------------------------
.../internal/portable/PortableReaderExImpl.java | 105 ++++++++++++++++---
.../GridPortableMarshallerSelfTest.java | 71 ++++++++++++-
2 files changed, 158 insertions(+), 18 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/8e8d59c7/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java
index 7d7323b..83ccb65 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java
@@ -586,6 +586,9 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
if (flag == NULL)
return null;
+ if (flag == HANDLE)
+ return readHandleField();
+
if (flag != BYTE_ARR)
throw new PortableException("Invalid flag value: " + flag);
@@ -609,6 +612,9 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
if (flag == NULL)
return null;
+ if (flag == HANDLE)
+ return readHandleField();
+
if (flag != SHORT_ARR)
throw new PortableException("Invalid flag value: " + flag);
@@ -632,6 +638,9 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
if (flag == NULL)
return null;
+ if (flag == HANDLE)
+ return readHandleField();
+
if (flag != INT_ARR)
throw new PortableException("Invalid flag value: " + flag);
@@ -655,6 +664,9 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
if (flag == NULL)
return null;
+ if (flag == HANDLE)
+ return readHandleField();
+
if (flag != LONG_ARR)
throw new PortableException("Invalid flag value: " + flag);
@@ -678,6 +690,9 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
if (flag == NULL)
return null;
+ if (flag == HANDLE)
+ return readHandleField();
+
if (flag != FLOAT_ARR)
throw new PortableException("Invalid flag value: " + flag);
@@ -701,6 +716,9 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
if (flag == NULL)
return null;
+ if (flag == HANDLE)
+ return readHandleField();
+
if (flag != DOUBLE_ARR)
throw new PortableException("Invalid flag value: " + flag);
@@ -724,6 +742,9 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
if (flag == NULL)
return null;
+ if (flag == HANDLE)
+ return readHandleField();
+
if (flag != CHAR_ARR)
throw new PortableException("Invalid flag value: " + flag);
@@ -747,6 +768,9 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
if (flag == NULL)
return null;
+ if (flag == HANDLE)
+ return readHandleField();
+
if (flag != BOOLEAN_ARR)
throw new PortableException("Invalid flag value: " + flag);
@@ -770,6 +794,9 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
if (flag == NULL)
return null;
+ if (flag == HANDLE)
+ return readHandleField();
+
if (flag != DECIMAL_ARR)
throw new PortableException("Invalid flag value: " + flag);
@@ -793,6 +820,9 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
if (flag == NULL)
return null;
+ if (flag == HANDLE)
+ return readHandleField();
+
if (flag != STRING_ARR)
throw new PortableException("Invalid flag value: " + flag);
@@ -816,6 +846,9 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
if (flag == NULL)
return null;
+ if (flag == HANDLE)
+ return readHandleField();
+
if (flag != UUID_ARR)
throw new PortableException("Invalid flag value: " + flag);
@@ -839,6 +872,9 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
if (flag == NULL)
return null;
+ if (flag == HANDLE)
+ return readHandleField();
+
if (flag != DATE_ARR)
throw new PortableException("Invalid flag value: " + flag);
@@ -862,6 +898,9 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
if (flag == NULL)
return null;
+ if (flag == HANDLE)
+ return readHandleField();
+
if (flag != OBJ_ARR)
throw new PortableException("Invalid flag value: " + flag);
@@ -887,6 +926,9 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
if (flag == NULL)
return null;
+ if (flag == HANDLE)
+ return readHandleField();
+
if (flag != COL)
throw new PortableException("Invalid flag value: " + flag);
@@ -912,6 +954,9 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
if (flag == NULL)
return null;
+ if (flag == HANDLE)
+ return readHandleField();
+
if (flag != MAP)
throw new PortableException("Invalid flag value: " + flag);
@@ -935,10 +980,13 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
if (flag == NULL)
return null;
+ if (flag == HANDLE)
+ return readHandleField();
+
if (flag != MAP_ENTRY)
throw new PortableException("Invalid flag value: " + flag);
- return new GridMapEntry<>(doReadObject(false), doReadObject(false));
+ return doReadMapEntry(false, true);
}
else
return null;
@@ -1067,6 +1115,25 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
rCtx.setObjectHandler(pos, obj);
}
+ /**
+ * Recreating field value from a handle.
+ *
+ * @param <T> Field type.
+ * @return Field.
+ */
+ private <T> T readHandleField() {
+ int handle = (off - 1) - doReadInt(false);
+
+ Object obj = rCtx.getObjectByHandle(handle);
+
+ if (obj == null) {
+ off = handle;
+
+ obj = doReadObject(false);
+ }
+
+ return (T)obj;
+ }
/** {@inheritDoc} */
@Override public byte readByte(String fieldName) throws PortableException {
Byte val = readByte(fieldId(fieldName));
@@ -2313,9 +2380,10 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
* @return Value.
*/
private byte[] doReadByteArray(boolean raw) {
- int len = doReadInt(raw);
int hPos = (raw ? rawOff : off) - 1;
+ int len = doReadInt(raw);
+
in.position(raw ? rawOff : off);
byte[] arr = in.readByteArray(len);
@@ -2335,9 +2403,10 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
* @return Value.
*/
private short[] doReadShortArray(boolean raw) {
- int len = doReadInt(raw);
int hPos = (raw ? rawOff : off) - 1;
+ int len = doReadInt(raw);
+
in.position(raw ? rawOff : off);
short[] arr = in.readShortArray(len);
@@ -2359,9 +2428,10 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
* @return Value.
*/
private int[] doReadIntArray(boolean raw) {
- int len = doReadInt(raw);
int hPos = (raw ? rawOff : off) - 1;
+ int len = doReadInt(raw);
+
in.position(raw ? rawOff : off);
int[] arr = in.readIntArray(len);
@@ -2383,9 +2453,10 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
* @return Value.
*/
private long[] doReadLongArray(boolean raw) {
- int len = doReadInt(raw);
int hPos = (raw ? rawOff : off) - 1;
+ int len = doReadInt(raw);
+
in.position(raw ? rawOff : off);
long[] arr = in.readLongArray(len);
@@ -2407,9 +2478,10 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
* @return Value.
*/
private float[] doReadFloatArray(boolean raw) {
- int len = doReadInt(raw);
int hPos = (raw ? rawOff : off) - 1;
+ int len = doReadInt(raw);
+
in.position(raw ? rawOff : off);
float[] arr = in.readFloatArray(len);
@@ -2431,9 +2503,10 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
* @return Value.
*/
private double[] doReadDoubleArray(boolean raw) {
- int len = doReadInt(raw);
int hPos = (raw ? rawOff : off) - 1;
+ int len = doReadInt(raw);
+
in.position(raw ? rawOff : off);
double[] arr = in.readDoubleArray(len);
@@ -2455,9 +2528,10 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
* @return Value.
*/
private char[] doReadCharArray(boolean raw) {
- int len = doReadInt(raw);
int hPos = (raw ? rawOff : off) - 1;
+ int len = doReadInt(raw);
+
in.position(raw ? rawOff : off);
char[] arr = in.readCharArray(len);
@@ -2479,9 +2553,10 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
* @return Value.
*/
private boolean[] doReadBooleanArray(boolean raw) {
- int len = doReadInt(raw);
int hPos = (raw ? rawOff : off) - 1;
+ int len = doReadInt(raw);
+
in.position(raw ? rawOff : off);
boolean[] arr = in.readBooleanArray(len);
@@ -2502,9 +2577,10 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
* @throws PortableException In case of error.
*/
private BigDecimal[] doReadDecimalArray(boolean raw) throws PortableException {
- int len = doReadInt(raw);
int hPos = (raw ? rawOff : off) - 1;
+ int len = doReadInt(raw);
+
BigDecimal[] arr = new BigDecimal[len];
setHandler(arr, hPos);
@@ -2531,9 +2607,10 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
* @throws PortableException In case of error.
*/
private String[] doReadStringArray(boolean raw) throws PortableException {
- int len = doReadInt(raw);
int hPos = (raw ? rawOff : off) - 1;
+ int len = doReadInt(raw);
+
String[] arr = new String[len];
setHandler(arr, hPos);
@@ -2560,9 +2637,10 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
* @throws PortableException In case of error.
*/
private UUID[] doReadUuidArray(boolean raw) throws PortableException {
- int len = doReadInt(raw);
int hPos = (raw ? rawOff : off) - 1;
+ int len = doReadInt(raw);
+
UUID[] arr = new UUID[len];
setHandler(arr, hPos);
@@ -2589,9 +2667,10 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
* @throws PortableException In case of error.
*/
private Date[] doReadDateArray(boolean raw) throws PortableException {
- int len = doReadInt(raw);
int hPos = (raw ? rawOff : off) - 1;
+ int len = doReadInt(raw);
+
Date[] arr = new Date[len];
setHandler(arr, hPos);
http://git-wip-us.apache.org/repos/asf/ignite/blob/8e8d59c7/modules/core/src/test/java/org/apache/ignite/internal/portable/GridPortableMarshallerSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/portable/GridPortableMarshallerSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/portable/GridPortableMarshallerSelfTest.java
index a5e8536..c8287a0 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/portable/GridPortableMarshallerSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/portable/GridPortableMarshallerSelfTest.java
@@ -69,6 +69,7 @@ import sun.misc.Unsafe;
import static org.apache.ignite.internal.portable.PortableThreadLocalMemoryAllocator.THREAD_LOCAL_ALLOC;
import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertTrue;
/**
* Portable marshaller tests.
@@ -1548,11 +1549,11 @@ public class GridPortableMarshallerSelfTest extends GridCommonAbstractTest {
PortableObject copy = copy(po, F.<String, Object>asMap("bArr", new byte[]{1, 2, 3}));
- assertArrayEquals(new byte[]{1, 2, 3}, copy.<byte[]>field("bArr"));
+ assertArrayEquals(new byte[] {1, 2, 3}, copy.<byte[]>field("bArr"));
SimpleObject obj0 = copy.deserialize();
- assertArrayEquals(new byte[]{1, 2, 3}, obj0.bArr);
+ assertArrayEquals(new byte[] {1, 2, 3}, obj0.bArr);
}
/**
@@ -1797,7 +1798,7 @@ public class GridPortableMarshallerSelfTest extends GridCommonAbstractTest {
assertEquals("str555", obj0.str);
assertEquals(newObj, obj0.inner);
- assertArrayEquals(new byte[]{6, 7, 9}, obj0.bArr);
+ assertArrayEquals(new byte[] {6, 7, 9}, obj0.bArr);
}
/**
@@ -1833,7 +1834,7 @@ public class GridPortableMarshallerSelfTest extends GridCommonAbstractTest {
assertEquals("str555", copy.<String>field("str"));
assertEquals(newObj, copy.<PortableObject>field("inner").deserialize());
assertEquals((short)2323, copy.<Short>field("s").shortValue());
- assertArrayEquals(new byte[]{6, 7, 9}, copy.<byte[]>field("bArr"));
+ assertArrayEquals(new byte[] {6, 7, 9}, copy.<byte[]>field("bArr"));
assertEquals((byte)111, copy.<Byte>field("b").byteValue());
SimpleObject obj0 = copy.deserialize();
@@ -1842,7 +1843,7 @@ public class GridPortableMarshallerSelfTest extends GridCommonAbstractTest {
assertEquals("str555", obj0.str);
assertEquals(newObj, obj0.inner);
assertEquals((short)2323, obj0.s);
- assertArrayEquals(new byte[]{6, 7, 9}, obj0.bArr);
+ assertArrayEquals(new byte[] {6, 7, 9}, obj0.bArr);
assertEquals((byte)111, obj0.b);
}
@@ -2240,6 +2241,53 @@ public class GridPortableMarshallerSelfTest extends GridCommonAbstractTest {
}
/**
+ * @throws Exception If failed.
+ */
+ public void testCyclicReferencesMarshalling() throws Exception {
+ PortableMarshaller marsh = new PortableMarshaller();
+
+ SimpleObject obj = simpleObject();
+
+ obj.bArr = obj.inner.bArr;
+ obj.cArr = obj.inner.cArr;
+ obj.boolArr = obj.inner.boolArr;
+ obj.sArr = obj.inner.sArr;
+ obj.strArr = obj.inner.strArr;
+ obj.iArr = obj.inner.iArr;
+ obj.lArr = obj.inner.lArr;
+ obj.fArr = obj.inner.fArr;
+ obj.dArr = obj.inner.dArr;
+ obj.dateArr = obj.inner.dateArr;
+ obj.uuidArr = obj.inner.uuidArr;
+ obj.objArr = obj.inner.objArr;
+ obj.bdArr = obj.inner.bdArr;
+ obj.map = obj.inner.map;
+ obj.col = obj.inner.col;
+ obj.mEntry = obj.inner.mEntry;
+
+ SimpleObject res = (SimpleObject)marshalUnmarshal(obj, marsh);
+
+ assertEquals(obj, res);
+
+ assertTrue(res.bArr == res.inner.bArr);
+ assertTrue(res.cArr == res.inner.cArr);
+ assertTrue(res.boolArr == res.inner.boolArr);
+ assertTrue(res.sArr == res.inner.sArr);
+ assertTrue(res.strArr == res.inner.strArr);
+ assertTrue(res.iArr == res.inner.iArr);
+ assertTrue(res.lArr == res.inner.lArr);
+ assertTrue(res.fArr == res.inner.fArr);
+ assertTrue(res.dArr == res.inner.dArr);
+ assertTrue(res.dateArr == res.inner.dateArr);
+ assertTrue(res.uuidArr == res.inner.uuidArr);
+ assertTrue(res.objArr == res.inner.objArr);
+ assertTrue(res.bdArr == res.inner.bdArr);
+ assertTrue(res.map == res.inner.map);
+ assertTrue(res.col == res.inner.col);
+ assertTrue(res.mEntry == res.inner.mEntry);
+ }
+
+ /**
*
*/
private static class ObjectWithClassFields {
@@ -2425,6 +2473,7 @@ public class GridPortableMarshallerSelfTest extends GridCommonAbstractTest {
inner.map = new HashMap<>();
inner.enumVal = TestEnum.A;
inner.enumArr = new TestEnum[] {TestEnum.A, TestEnum.B};
+ inner.bdArr = new BigDecimal[] {new BigDecimal(1000), BigDecimal.ONE};
inner.col.add("str1");
inner.col.add("str2");
@@ -2434,6 +2483,8 @@ public class GridPortableMarshallerSelfTest extends GridCommonAbstractTest {
inner.map.put(2, "str2");
inner.map.put(3, "str3");
+ inner.mEntry = inner.map.entrySet().iterator().next();
+
SimpleObject outer = new SimpleObject();
outer.b = 2;
@@ -2465,6 +2516,8 @@ public class GridPortableMarshallerSelfTest extends GridCommonAbstractTest {
outer.enumVal = TestEnum.B;
outer.enumArr = new TestEnum[] {TestEnum.B, TestEnum.C};
outer.inner = inner;
+ outer.bdArr = new BigDecimal[] {new BigDecimal(5000), BigDecimal.TEN};
+
outer.col.add("str4");
outer.col.add("str5");
@@ -2474,6 +2527,8 @@ public class GridPortableMarshallerSelfTest extends GridCommonAbstractTest {
outer.map.put(5, "str5");
outer.map.put(6, "str6");
+ outer.mEntry = outer.map.entrySet().iterator().next();
+
return outer;
}
@@ -2758,6 +2813,9 @@ public class GridPortableMarshallerSelfTest extends GridCommonAbstractTest {
private Object[] objArr;
/** */
+ private BigDecimal[] bdArr;
+
+ /** */
private Collection<String> col;
/** */
@@ -2770,6 +2828,9 @@ public class GridPortableMarshallerSelfTest extends GridCommonAbstractTest {
private TestEnum[] enumArr;
/** */
+ private Map.Entry<Integer, String> mEntry;
+
+ /** */
private SimpleObject inner;
/** {@inheritDoc} */