X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2Futils%2FSerializationUtils.java;h=f29b7d8b8bc8911767cd9a957a69e1b5270fc58d;hb=4e696d9795fe7eef40369c05c340d137394126f3;hp=87c78bd27535cdbd08ed2e86c3af3b59abb7c8ca;hpb=448bd0847750815fca81f20535014d1b08531e52;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/SerializationUtils.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/SerializationUtils.java index 87c78bd275..f29b7d8b8b 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/SerializationUtils.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/SerializationUtils.java @@ -8,14 +8,23 @@ package org.opendaylight.controller.cluster.datastore.utils; import com.google.common.base.Preconditions; +import com.google.protobuf.InvalidProtocolBufferException; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.DataInput; +import java.io.DataInputStream; import java.io.DataOutput; +import java.io.DataOutputStream; import java.io.IOException; +import org.opendaylight.controller.cluster.datastore.node.NormalizedNodeToNodeCodec; +import org.opendaylight.controller.cluster.datastore.node.utils.stream.InvalidNormalizedNodeStreamException; +import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeDataInput; +import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeDataOutput; +import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeInputOutput; import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeInputStreamReader; -import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeOutputStreamWriter; +import org.opendaylight.controller.protobuff.messages.common.NormalizedNodeMessages; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter; /** * Provides various utility methods for serialization and de-serialization. @@ -23,18 +32,38 @@ import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWrit * @author Thomas Pantelis */ public final class SerializationUtils { + public static final ThreadLocal REUSABLE_WRITER_TL = new ThreadLocal<>(); + public static final ThreadLocal REUSABLE_READER_TL = new ThreadLocal<>(); - public static interface Applier { + public interface Applier { void apply(T instance, YangInstanceIdentifier path, NormalizedNode node); } + private static NormalizedNodeDataOutput streamWriter(DataOutput out) throws IOException { + NormalizedNodeDataOutput streamWriter = REUSABLE_WRITER_TL.get(); + if (streamWriter == null) { + streamWriter = NormalizedNodeInputOutput.newDataOutput(out); + } + + return streamWriter; + } + + private static NormalizedNodeDataInput streamReader(DataInput in) throws IOException { + NormalizedNodeDataInput streamReader = REUSABLE_READER_TL.get(); + if (streamReader == null) { + streamReader = new NormalizedNodeInputStreamReader(in); + } + + return streamReader; + } + public static void serializePathAndNode(YangInstanceIdentifier path, NormalizedNode node, DataOutput out) { Preconditions.checkNotNull(path); Preconditions.checkNotNull(node); try { - NormalizedNodeOutputStreamWriter streamWriter = new NormalizedNodeOutputStreamWriter(out); - NormalizedNodeWriter.forStreamWriter(streamWriter).write(node); + NormalizedNodeDataOutput streamWriter = streamWriter(out); + streamWriter.writeNormalizedNode(node); streamWriter.writeYangInstanceIdentifier(path); } catch (IOException e) { throw new IllegalArgumentException(String.format("Error serializing path %s and Node %s", @@ -44,7 +73,7 @@ public final class SerializationUtils { public static void deserializePathAndNode(DataInput in, T instance, Applier applier) { try { - NormalizedNodeInputStreamReader streamReader = new NormalizedNodeInputStreamReader(in); + NormalizedNodeDataInput streamReader = streamReader(in); NormalizedNode node = streamReader.readNormalizedNode(); YangInstanceIdentifier path = streamReader.readYangInstanceIdentifier(); applier.apply(instance, path, node); @@ -53,12 +82,46 @@ public final class SerializationUtils { } } + private static NormalizedNode tryDeserializeNormalizedNode(DataInput in) throws IOException { + boolean present = in.readBoolean(); + if (present) { + NormalizedNodeDataInput streamReader = streamReader(in); + return streamReader.readNormalizedNode(); + } + + return null; + } + + public static NormalizedNode deserializeNormalizedNode(DataInput in) { + try { + return tryDeserializeNormalizedNode(in); + } catch (IOException e) { + throw new IllegalArgumentException("Error deserializing NormalizedNode", e); + } + } + + public static NormalizedNode deserializeNormalizedNode(byte [] bytes) { + try { + return tryDeserializeNormalizedNode(new DataInputStream(new ByteArrayInputStream(bytes))); + } catch (InvalidNormalizedNodeStreamException e) { + // Probably from legacy protobuf serialization - try that. + try { + NormalizedNodeMessages.Node serializedNode = NormalizedNodeMessages.Node.parseFrom(bytes); + return new NormalizedNodeToNodeCodec().decode(serializedNode); + } catch (InvalidProtocolBufferException e2) { + throw new IllegalArgumentException("Error deserializing NormalizedNode", e); + } + } catch (IOException e) { + throw new IllegalArgumentException("Error deserializing NormalizedNode", e); + } + } + public static void serializeNormalizedNode(NormalizedNode node, DataOutput out) { try { out.writeBoolean(node != null); - if(node != null) { - NormalizedNodeOutputStreamWriter streamWriter = new NormalizedNodeOutputStreamWriter(out); - NormalizedNodeWriter.forStreamWriter(streamWriter).write(node); + if (node != null) { + NormalizedNodeDataOutput streamWriter = streamWriter(out); + streamWriter.writeNormalizedNode(node); } } catch (IOException e) { throw new IllegalArgumentException(String.format("Error serializing NormalizedNode %s", @@ -66,33 +129,25 @@ public final class SerializationUtils { } } - public static NormalizedNode deserializeNormalizedNode(DataInput in) { - try { - boolean present = in.readBoolean(); - if(present) { - NormalizedNodeInputStreamReader streamReader = new NormalizedNodeInputStreamReader(in); - return streamReader.readNormalizedNode(); - } - } catch (IOException e) { - throw new IllegalArgumentException("Error deserializing NormalizedNode", e); - } - - return null; + public static byte [] serializeNormalizedNode(NormalizedNode node) { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + serializeNormalizedNode(node, new DataOutputStream(bos)); + return bos.toByteArray(); } public static void serializePath(YangInstanceIdentifier path, DataOutput out) { Preconditions.checkNotNull(path); try { - NormalizedNodeOutputStreamWriter streamWriter = new NormalizedNodeOutputStreamWriter(out); + NormalizedNodeDataOutput streamWriter = streamWriter(out); streamWriter.writeYangInstanceIdentifier(path); } catch (IOException e) { - throw new IllegalArgumentException(String.format("Error serializing path {}", path), e); + throw new IllegalArgumentException(String.format("Error serializing path %s", path), e); } } public static YangInstanceIdentifier deserializePath(DataInput in) { try { - NormalizedNodeInputStreamReader streamReader = new NormalizedNodeInputStreamReader(in); + NormalizedNodeDataInput streamReader = streamReader(in); return streamReader.readYangInstanceIdentifier(); } catch (IOException e) { throw new IllegalArgumentException("Error deserializing path", e);