From 5c3e3812eca4e7a06c69c376037578fae49828a2 Mon Sep 17 00:00:00 2001 From: Moiz Raja Date: Mon, 9 Nov 2015 17:56:32 -0800 Subject: [PATCH] BUG 4589 : Handle writing and reading large strings Change-Id: If81926757aef3c1275ba43a7cf8c7adf94d86e08 Signed-off-by: Moiz Raja (cherry picked from commit 28484d59aa626dd4b32cdeb2d10dbc2c47cc051a) --- .../NormalizedNodeInputStreamReader.java | 10 ++++++ .../NormalizedNodeOutputStreamWriter.java | 6 ++++ .../node/utils/stream/ValueTypes.java | 7 ++++ .../NormalizedNodeStreamReaderWriterTest.java | 15 ++++++++- .../node/utils/stream/ValueTypesTest.java | 33 +++++++++++++++++++ 5 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 opendaylight/md-sal/sal-clustering-commons/src/test/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/ValueTypesTest.java diff --git a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/NormalizedNodeInputStreamReader.java b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/NormalizedNodeInputStreamReader.java index 8bb059c6ea..8c95397098 100644 --- a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/NormalizedNodeInputStreamReader.java +++ b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/NormalizedNodeInputStreamReader.java @@ -16,6 +16,7 @@ import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; import java.math.BigInteger; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -291,6 +292,9 @@ public class NormalizedNodeInputStreamReader implements NormalizedNodeStreamRead case ValueTypes.STRING_TYPE : return input.readUTF(); + case ValueTypes.STRING_BYTES_TYPE: + return readStringBytes(); + case ValueTypes.BIG_DECIMAL_TYPE : return new BigDecimal(input.readUTF()); @@ -310,6 +314,12 @@ public class NormalizedNodeInputStreamReader implements NormalizedNodeStreamRead } } + private String readStringBytes() throws IOException { + byte[] bytes = new byte[input.readInt()]; + input.readFully(bytes); + return new String(bytes, StandardCharsets.UTF_8); + } + public YangInstanceIdentifier readYangInstanceIdentifier() throws IOException { readSignatureMarkerAndVersionIfNeeded(); return readYangInstanceIdentifierInternal(); diff --git a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/NormalizedNodeOutputStreamWriter.java b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/NormalizedNodeOutputStreamWriter.java index 3a56335f74..b155b5af11 100644 --- a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/NormalizedNodeOutputStreamWriter.java +++ b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/NormalizedNodeOutputStreamWriter.java @@ -13,6 +13,7 @@ import java.io.DataOutput; import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.nio.charset.StandardCharsets; import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -387,6 +388,11 @@ public class NormalizedNodeOutputStreamWriter implements NormalizedNodeStreamWri break; case ValueTypes.NULL_TYPE : break; + case ValueTypes.STRING_BYTES_TYPE: + final byte[] valueBytes = value.toString().getBytes(StandardCharsets.UTF_8); + output.writeInt(valueBytes.length); + output.write(valueBytes); + break; default: output.writeUTF(value.toString()); break; diff --git a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/ValueTypes.java b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/ValueTypes.java index f107ce75a7..1afc73a3c8 100644 --- a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/ValueTypes.java +++ b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/ValueTypes.java @@ -18,6 +18,9 @@ import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; final class ValueTypes { + // The String length threshold beyond which a String should be encoded as bytes + public static final int STRING_BYTES_LENGTH_THRESHOLD = Short.MAX_VALUE / 4; + public static final byte SHORT_TYPE = 1; public static final byte BYTE_TYPE = 2; public static final byte INT_TYPE = 3; @@ -31,6 +34,7 @@ final class ValueTypes { public static final byte BIG_DECIMAL_TYPE = 11; public static final byte BINARY_TYPE = 12; public static final byte NULL_TYPE = 13; + public static final byte STRING_BYTES_TYPE = 14; private static final Map, Byte> TYPES; @@ -62,6 +66,9 @@ final class ValueTypes { final Byte type = TYPES.get(node.getClass()); if (type != null) { + if(type == STRING_TYPE && ((String) node).length() >= STRING_BYTES_LENGTH_THRESHOLD ){ + return STRING_BYTES_TYPE; + } return type; } diff --git a/opendaylight/md-sal/sal-clustering-commons/src/test/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/NormalizedNodeStreamReaderWriterTest.java b/opendaylight/md-sal/sal-clustering-commons/src/test/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/NormalizedNodeStreamReaderWriterTest.java index f468264181..6dbb0f8e64 100644 --- a/opendaylight/md-sal/sal-clustering-commons/src/test/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/NormalizedNodeStreamReaderWriterTest.java +++ b/opendaylight/md-sal/sal-clustering-commons/src/test/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/NormalizedNodeStreamReaderWriterTest.java @@ -43,9 +43,12 @@ public class NormalizedNodeStreamReaderWriterTest { QName toaster = QName.create("http://netconfcentral.org/ns/toaster","2009-11-20","toaster"); QName darknessFactor = QName.create("http://netconfcentral.org/ns/toaster","2009-11-20","darknessFactor"); + QName description = QName.create("http://netconfcentral.org/ns/toaster","2009-11-20","description"); ContainerNode toasterNode = Builders.containerBuilder(). withNodeIdentifier(new NodeIdentifier(toaster)). - withChild(ImmutableNodes.leafNode(darknessFactor, "1000")).build(); + withChild(ImmutableNodes.leafNode(darknessFactor, "1000")). + withChild(ImmutableNodes.leafNode(description, largeString(20))) + .build(); ContainerNode toasterContainer = Builders.containerBuilder(). withNodeIdentifier(new NodeIdentifier(SchemaContext.NAME)). @@ -172,4 +175,14 @@ public class NormalizedNodeStreamReaderWriterTest { Assert.assertEquals(input, clone.getInput()); } + + private String largeString(int pow){ + String s = "X"; + for(int i=0;i