Skip to content

Commit

Permalink
Deduplicated some SubListSerializer code
Browse files Browse the repository at this point in the history
  • Loading branch information
magneticflux- committed Feb 2, 2018
1 parent 502908a commit fe7e34f
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 76 deletions.
67 changes: 37 additions & 30 deletions src/main/java/de/javakaffee/kryoserializers/SubListSerializers.java
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,34 @@ public static Kryo addDefaultSerializers(Kryo kryo) {
return kryo;
}

private static List<?> subListRead(Kryo kryo, Input input) {
kryo.reference(FAKE_REFERENCE);
final List<?> list = (List<?>) kryo.readClassAndObject(input);
final int fromIndex = input.readInt(true);
final int toIndex = input.readInt(true);
return list.subList(fromIndex, toIndex);
}

private static List<?> subListCopy(Kryo kryo, List<?> originalList, int parentOffset, int size) {
final int toIndex = parentOffset + size;
return kryo.copy(originalList).subList(parentOffset, toIndex);
}

private static void subListWrite(Kryo kryo, Output output, Object originalList, int fromIndex, int size) {
try {
kryo.writeClassAndObject(output, originalList);
output.writeInt(fromIndex, true);
final int toIndex = fromIndex + size;
output.writeInt(toIndex, true);
} catch (final RuntimeException e) {
// Don't eat and wrap RuntimeExceptions because the ObjectBuffer.write...
// handles SerializationException specifically (resizing the buffer)...
throw e;
} catch (final Exception e) {
throw new RuntimeException(e);
}
}

/**
* Supports sublists created via {@link ArrayList#subList(int, int)} since java7 (oracle jdk,
* represented by <code>java.util.ArrayList$SubList</code>).
Expand Down Expand Up @@ -128,22 +156,14 @@ public static Kryo addDefaultSerializer(Kryo kryo) {

@Override
public List<?> read(final Kryo kryo, final Input input, final Class<List<?>> clazz) {
kryo.reference(FAKE_REFERENCE);
final List<?> list = (List<?>) kryo.readClassAndObject(input);
final int fromIndex = input.readInt(true);
final int toIndex = input.readInt(true);
return list.subList(fromIndex, toIndex);
return subListRead(kryo, input);
}

@Override
public void write(final Kryo kryo, final Output output, final List<?> obj) {
try {
kryo.writeClassAndObject(output, _parentField.get(obj));
final int parentOffset = _parentOffsetField.getInt(obj);
final int fromIndex = parentOffset;
output.writeInt(fromIndex, true);
final int toIndex = fromIndex + _sizeField.getInt(obj);
output.writeInt(toIndex, true);
subListWrite(kryo, output, _parentField.get(obj), _parentOffsetField.getInt(obj),
_sizeField.getInt(obj));
} catch (final RuntimeException e) {
// Don't eat and wrap RuntimeExceptions because the ObjectBuffer.write...
// handles SerializationException specifically (resizing the buffer)...
Expand All @@ -157,11 +177,8 @@ public void write(final Kryo kryo, final Output output, final List<?> obj) {
public List<?> copy(final Kryo kryo, final List<?> original) {
kryo.reference(FAKE_REFERENCE);
try {
final List<?> list = (List<?>) _parentField.get(original);
final int parentOffset = _parentOffsetField.getInt(original);
final int fromIndex = parentOffset;
final int toIndex = fromIndex + _sizeField.getInt(original);
return kryo.copy(list).subList(fromIndex, toIndex);
return subListCopy(kryo, (List<?>) _parentField.get(original), _parentOffsetField.getInt(original),
_sizeField.getInt(original));
} catch (final Exception e) {
throw new RuntimeException(e);
}
Expand Down Expand Up @@ -212,21 +229,13 @@ public static Kryo addDefaultSerializer(Kryo kryo) {

@Override
public List<?> read(final Kryo kryo, final Input input, final Class<List<?>> clazz) {
kryo.reference(FAKE_REFERENCE);
final List<?> list = (List<?>) kryo.readClassAndObject(input);
final int fromIndex = input.readInt(true);
final int toIndex = input.readInt(true);
return list.subList(fromIndex, toIndex);
return subListRead(kryo, input);
}

@Override
public void write(final Kryo kryo, final Output output, final List<?> obj) {
try {
kryo.writeClassAndObject(output, _listField.get(obj));
final int fromIndex = _offsetField.getInt(obj);
output.writeInt(fromIndex, true);
final int toIndex = fromIndex + _sizeField.getInt(obj);
output.writeInt(toIndex, true);
subListWrite(kryo, output, _listField.get(obj), _offsetField.getInt(obj), _sizeField.getInt(obj));
} catch (final RuntimeException e) {
// Don't eat and wrap RuntimeExceptions because the ObjectBuffer.write...
// handles SerializationException specifically (resizing the buffer)...
Expand All @@ -240,10 +249,8 @@ public void write(final Kryo kryo, final Output output, final List<?> obj) {
public List<?> copy(final Kryo kryo, final List<?> obj) {
kryo.reference(FAKE_REFERENCE);
try {
final List<?> list = (List<?>) _listField.get(obj);
final int fromIndex = _offsetField.getInt(obj);
final int toIndex = fromIndex + _sizeField.getInt(obj);
return kryo.copy(list).subList(fromIndex, toIndex);
return subListCopy(kryo, (List<?>) _listField.get(obj), _offsetField.getInt(obj),
_sizeField.getInt(obj));
} catch (final Exception e) {
throw new RuntimeException(e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,9 @@ public class SubListSerializersTest {

private Kryo _kryo;

@SafeVarargs
private static <T> ArrayList<T> arrayList(final T... items) {
return new ArrayList<T>(Arrays.asList(items));
return new ArrayList<>(Arrays.asList(items));
}

@BeforeClass
Expand Down Expand Up @@ -77,60 +78,56 @@ private void doTestCopy(final List<TestEnum> subList) {
assertEquals(copy.remove(0), subList.remove(0));
}

@Test(enabled = true)
public void testSubList() throws Exception {
final List<TestEnum> subList = new LinkedList<TestEnum>(Arrays.asList(TestEnum.values())).subList(1, 2);
@Test()
public void testSubList() {
final List<TestEnum> subList = new LinkedList<>(Arrays.asList(TestEnum.values())).subList(1, 2);
doTest(subList);
}

@Test(enabled = true)
public void testCopySubList() throws Exception {
final List<TestEnum> subList = new LinkedList<TestEnum>(Arrays.asList(TestEnum.values())).subList(1, 2);
@Test()
public void testCopySubList() {
final List<TestEnum> subList = new LinkedList<>(Arrays.asList(TestEnum.values())).subList(1, 2);
doTestCopy(subList);
}

@Test(enabled = true)
public void testSubListSubList() throws Exception {
final List<TestEnum> subList =
new LinkedList<TestEnum>(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2);
@Test()
public void testSubListSubList() {
final List<TestEnum> subList = new LinkedList<>(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2);
doTest(subList);
}

@Test(enabled = true)
public void testCopySubListSubList() throws Exception {
final List<TestEnum> subList =
new LinkedList<TestEnum>(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2);
@Test()
public void testCopySubListSubList() {
final List<TestEnum> subList = new LinkedList<>(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2);
doTestCopy(subList);
}

@Test(enabled = true)
public void testArrayListSubList() throws Exception {
final List<TestEnum> subList = new ArrayList<TestEnum>(Arrays.asList(TestEnum.values())).subList(1, 2);
@Test()
public void testArrayListSubList() {
final List<TestEnum> subList = new ArrayList<>(Arrays.asList(TestEnum.values())).subList(1, 2);
doTest(subList);
}

@Test(enabled = true)
public void testCopyArrayListSubList() throws Exception {
final List<TestEnum> subList = new ArrayList<TestEnum>(Arrays.asList(TestEnum.values())).subList(1, 2);
@Test()
public void testCopyArrayListSubList() {
final List<TestEnum> subList = new ArrayList<>(Arrays.asList(TestEnum.values())).subList(1, 2);
doTestCopy(subList);
}

@Test(enabled = true)
public void testArrayListSubListSubList() throws Exception {
final List<TestEnum> subList =
new ArrayList<TestEnum>(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2);
@Test()
public void testArrayListSubListSubList() {
final List<TestEnum> subList = new ArrayList<>(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2);
doTest(subList);
}

@Test(enabled = true)
public void testCopyArrayListSubListSubList() throws Exception {
final List<TestEnum> subList =
new ArrayList<TestEnum>(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2);
@Test()
public void testCopyArrayListSubListSubList() {
final List<TestEnum> subList = new ArrayList<>(Arrays.asList(TestEnum.values())).subList(1, 3).subList(1, 2);
doTestCopy(subList);
}

@Test(enabled = true)
public void testArrayListSubListWithSharedItems() throws Exception {
@Test()
public void testArrayListSubListWithSharedItems() {
final List<String> mylist = arrayList("1", "1", "2", "1", "1");
final List<String> subList = mylist.subList(0, 5);

Expand All @@ -142,28 +139,29 @@ public void testArrayListSubListWithSharedItems() throws Exception {
assertEquals(deserialized, mylist);
}

@Test(enabled = true)
@SuppressWarnings("unchecked")
public void testNestedArrayListSubListWithSharedItems_1() throws Exception {
final List<String> l1 = arrayList("1", "1", "2");
final List<String> l1s1 = l1.subList(0, 3);
@Test()
@SuppressWarnings({ "unchecked", "Duplicates" })
public void testNestedArrayListSubListWithSharedItems_1() {
final List<String> list1 = arrayList("1", "1", "2");
final List<String> list1SubList1 = list1.subList(0, 3);

final List<String> l1s2 = l1.subList(1, 3);
final List<String> list1SubList2 = list1.subList(1, 3);

final List<String> l2 = arrayList("1", "2", "3");
final List<String> l2s1 = l2.subList(0, 3);
final List<String> list2 = arrayList("1", "2", "3");
final List<String> list2SubList1 = list2.subList(0, 3);

final List<List<String>> lists = new ArrayList<List<String>>(Arrays.asList(l1s1, l1s2, l2s1, l1, l2));
final List<List<String>> lists =
new ArrayList<>(Arrays.asList(list1SubList1, list1SubList2, list2SubList1, list1, list2));

final byte[] serialized = serialize(_kryo, lists);
final List<List<String>> deserialized = deserialize(_kryo, serialized, lists.getClass());

assertEquals(deserialized, lists);
}

@Test(enabled = true)
@SuppressWarnings("unchecked")
public void testNestedArrayListSubListWithSharedItems_2() throws Exception {
@Test()
@SuppressWarnings({ "unchecked", "Duplicates" })
public void testNestedArrayListSubListWithSharedItems_2() {
final List<String> l1 = arrayList("1", "1", "2");
final List<String> l1s1 = l1.subList(0, 3);

Expand All @@ -172,18 +170,18 @@ public void testNestedArrayListSubListWithSharedItems_2() throws Exception {
final List<String> l2 = arrayList("1", "2", "3");
final List<String> l2s1 = l2.subList(0, 3);

final List<List<String>> lists = new ArrayList<List<String>>(Arrays.asList(l1, l2, l1s1, l1s2, l2s1));
final List<List<String>> lists = new ArrayList<>(Arrays.asList(l1, l2, l1s1, l1s2, l2s1));

final byte[] serialized = serialize(_kryo, lists);
final List<List<String>> deserialized = deserialize(_kryo, serialized, lists.getClass());

assertEquals(deserialized, lists);
}

static enum TestEnum {
enum TestEnum {
ITEM1,
ITEM2,
ITEM3;
ITEM3
}

}

0 comments on commit fe7e34f

Please sign in to comment.