From 1c6b0a3b95b142f338adec5398402be5d001f40a Mon Sep 17 00:00:00 2001 From: zhuyingjie Date: Sat, 14 Dec 2019 08:40:35 +0800 Subject: [PATCH] make container visible --- README.md | 29 +++++++++++++++++++ build.gradle | 2 +- .../java/org/tdf/rlp/CollectionContainer.java | 8 +++-- src/main/java/org/tdf/rlp/MapContainer.java | 10 ++++--- src/main/java/org/tdf/rlp/RLPCodec.java | 6 +++- src/main/java/org/tdf/rlp/Raw.java | 7 +++-- src/test/java/org/tdf/rlp/RLPTest.java | 29 +++++++++++++++++-- 7 files changed, 77 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index d8362f2..627083d 100644 --- a/README.md +++ b/README.md @@ -277,6 +277,35 @@ public class Main{ ``` +- decode use Container + +```java + +public class Main{ + + public static void main(String[] args){ + List> list = new ArrayList<>(); + list.add(new ByteArraySet()); + list.get(0).add("1".getBytes()); + Container container = CollectionContainer.builder() + .collectionType(ArrayList.class) + .contentType( + CollectionContainer.builder() + .collectionType(ByteArraySet.class) + .contentType(new Raw(byte[].class)) + .build() + ) + .build(); + List> decoded = (List>) RLPCodec.decodeContainer( + RLPCodec.encode(list), + container + ); + assert decoded.get(0).contains("1".getBytes()); + } +} + +``` + Benchmark compare to EthereumJ: decoding list 10000000 times: diff --git a/build.gradle b/build.gradle index 6529286..0083a36 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group 'org.tdf' -version '1.1.8' +version '1.1.9' sourceCompatibility = 1.8 diff --git a/src/main/java/org/tdf/rlp/CollectionContainer.java b/src/main/java/org/tdf/rlp/CollectionContainer.java index 42607e4..0182b63 100644 --- a/src/main/java/org/tdf/rlp/CollectionContainer.java +++ b/src/main/java/org/tdf/rlp/CollectionContainer.java @@ -2,6 +2,7 @@ import lombok.AccessLevel; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.NoArgsConstructor; import java.util.Collection; @@ -9,14 +10,15 @@ @NoArgsConstructor(access = AccessLevel.PACKAGE) @AllArgsConstructor(access = AccessLevel.PACKAGE) -class CollectionContainer, T> implements Container { - Class collectionType; +@Builder +public class CollectionContainer, T> implements Container { + Class collectionType; public ContainerType getType() { return ContainerType.COLLECTION; } - Container contentType; + Container contentType; @Override public Class asRaw() { diff --git a/src/main/java/org/tdf/rlp/MapContainer.java b/src/main/java/org/tdf/rlp/MapContainer.java index 2e4cf38..deb9551 100644 --- a/src/main/java/org/tdf/rlp/MapContainer.java +++ b/src/main/java/org/tdf/rlp/MapContainer.java @@ -2,6 +2,7 @@ import lombok.AccessLevel; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.NoArgsConstructor; import java.util.Collection; @@ -9,15 +10,16 @@ @NoArgsConstructor(access = AccessLevel.PACKAGE) @AllArgsConstructor(access = AccessLevel.PACKAGE) -class MapContainer, K, V> implements Container { - Class mapType; +@Builder +public class MapContainer, K, V> implements Container { + Class mapType; public ContainerType getType() { return ContainerType.MAP; } - Container keyType; - Container valueType; + Container keyType; + Container valueType; @Override public Class asRaw() { diff --git a/src/main/java/org/tdf/rlp/RLPCodec.java b/src/main/java/org/tdf/rlp/RLPCodec.java index dc8db21..d6f5b27 100644 --- a/src/main/java/org/tdf/rlp/RLPCodec.java +++ b/src/main/java/org/tdf/rlp/RLPCodec.java @@ -294,7 +294,11 @@ static RLPElement encodeMap(Map m, Comparator keyOrdering) { CollectionContainer.fromTypes(collectionType, elementType)); } - static Object decodeContainer(RLPElement element, Container container) { + public static Object decodeContainer(byte[] encoded, Container container){ + return decodeContainer(RLPElement.fromEncoded(encoded), container); + } + + public static Object decodeContainer(RLPElement element, Container container) { switch (container.getType()) { case RAW: return decode(element, container.asRaw()); diff --git a/src/main/java/org/tdf/rlp/Raw.java b/src/main/java/org/tdf/rlp/Raw.java index ed36095..0965c5e 100644 --- a/src/main/java/org/tdf/rlp/Raw.java +++ b/src/main/java/org/tdf/rlp/Raw.java @@ -1,9 +1,12 @@ package org.tdf.rlp; +import lombok.Builder; + import java.util.Collection; import java.util.Map; -class Raw implements Container { +@Builder +public class Raw implements Container { Class rawType; public ContainerType getType() { @@ -28,7 +31,7 @@ public CollectionContainer, V> asCollection() { Raw() { } - Raw(Class rawType) { + public Raw(Class rawType) { this.rawType = rawType; } } diff --git a/src/test/java/org/tdf/rlp/RLPTest.java b/src/test/java/org/tdf/rlp/RLPTest.java index 0e79b86..3163666 100644 --- a/src/test/java/org/tdf/rlp/RLPTest.java +++ b/src/test/java/org/tdf/rlp/RLPTest.java @@ -1492,17 +1492,17 @@ public void testByteArraySet() { } @Test - public void testMapContainer(){ + public void testMapContainer() { Map map = new HashMap<>(); map.put("key", "value"); byte[] encoded = RLPCodec.encode(map); TreeMap m2 = RLPCodec.decodeMap(encoded, - TreeMap.class, String.class, String.class); + TreeMap.class, String.class, String.class); assert m2.get("key").equals("value"); } @Test - public void testCollectionContainer(){ + public void testCollectionContainer() { Set set = new HashSet<>(); set.add("1".getBytes()); set.add("2".getBytes()); @@ -1513,4 +1513,27 @@ public void testCollectionContainer(){ assert set.contains("1".getBytes()); assert set.contains("2".getBytes()); } + + @Test + public void test3() { + List> list = new ArrayList<>(); + list.add(new ByteArraySet()); + list.get(0).add("1".getBytes()); + Container container = CollectionContainer.builder() + .collectionType(ArrayList.class) + .contentType( + CollectionContainer.builder() + .collectionType(ByteArraySet.class) + .contentType(new Raw(byte[].class)) + .build() + ) + .build(); + List> decoded = (List>) RLPCodec.decodeContainer( + RLPCodec.encode(list), + container + ); + + assert decoded.get(0).contains("1".getBytes()); + } + }