X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-clustering-commons%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2Fnode%2Futils%2Fstream%2FSerializationUtils.java;h=a2c456d17a65efb3fa5c2007379f75a1219dcc40;hb=HEAD;hp=4d01702215867d29a6b35ade6eda539fdeb30abe;hpb=6a32d897d2dcb4fa54977b3b2defe76dc0a5d5e2;p=controller.git diff --git a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SerializationUtils.java b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SerializationUtils.java index 4d01702215..51e61ea47f 100644 --- a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SerializationUtils.java +++ b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SerializationUtils.java @@ -7,15 +7,17 @@ */ package org.opendaylight.controller.cluster.datastore.node.utils.stream; -import java.io.ByteArrayInputStream; import java.io.DataInput; -import java.io.DataInputStream; import java.io.DataOutput; import java.io.IOException; +import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeDataInput; +import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeDataOutput; +import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeStreamVersion; /** * Provides various utility methods for serialization and de-serialization. @@ -23,67 +25,33 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; * @author Thomas Pantelis */ public final class SerializationUtils { - public static final ThreadLocal REUSABLE_READER_TL = new ThreadLocal<>(); - private SerializationUtils() { - } - public interface Applier { - void apply(T instance, YangInstanceIdentifier path, NormalizedNode node); } - private static NormalizedNodeDataInput streamReader(final DataInput in) throws IOException { - NormalizedNodeDataInput streamReader = REUSABLE_READER_TL.get(); - if (streamReader == null) { - streamReader = NormalizedNodeInputOutput.newDataInput(in); - } - - return streamReader; - } - - public static void deserializePathAndNode(final DataInput in, final T instance, final Applier applier) { - try { - NormalizedNodeDataInput streamReader = streamReader(in); - NormalizedNode node = streamReader.readNormalizedNode(); - YangInstanceIdentifier path = streamReader.readYangInstanceIdentifier(); - applier.apply(instance, path, node); - } catch (IOException e) { - throw new IllegalArgumentException("Error deserializing path and Node", e); - } - } - - private static NormalizedNode tryDeserializeNormalizedNode(final DataInput in) throws IOException { - boolean present = in.readBoolean(); - if (present) { - NormalizedNodeDataInput streamReader = streamReader(in); - return streamReader.readNormalizedNode(); - } - - return null; + @FunctionalInterface + public interface Applier { + void apply(T instance, YangInstanceIdentifier path, NormalizedNode node); } - public static NormalizedNode deserializeNormalizedNode(final DataInput in) { - try { - return tryDeserializeNormalizedNode(in); - } catch (IOException e) { - throw new IllegalArgumentException("Error deserializing NormalizedNode", e); + public static Optional readNormalizedNode(final DataInput in) throws IOException { + if (!in.readBoolean()) { + return Optional.empty(); } + return Optional.of(NormalizedNodeDataInput.newDataInput(in).readNormalizedNode()); } - public static NormalizedNode deserializeNormalizedNode(final byte [] bytes) { - try { - return tryDeserializeNormalizedNode(new DataInputStream(new ByteArrayInputStream(bytes))); - } catch (IOException e) { - throw new IllegalArgumentException("Error deserializing NormalizedNode", e); - } + public static void writeNormalizedNode(final DataOutput out, final @Nullable NormalizedNode node) + throws IOException { + writeNormalizedNode(out, NormalizedNodeStreamVersion.POTASSIUM, node); } - public static void writeNormalizedNode(final DataOutput out, final @Nullable NormalizedNode node) - throws IOException { + public static void writeNormalizedNode(final DataOutput out, final NormalizedNodeStreamVersion version, + final @Nullable NormalizedNode node) throws IOException { if (node != null) { out.writeBoolean(true); - try (NormalizedNodeDataOutput stream = NormalizedNodeInputOutput.newDataOutput(out)) { + try (NormalizedNodeDataOutput stream = version.newDataOutput(out)) { stream.writeNormalizedNode(node); } } else { @@ -91,35 +59,62 @@ public final class SerializationUtils { } } + public static YangInstanceIdentifier readPath(final DataInput in) throws IOException { + return NormalizedNodeDataInput.newDataInput(in).readYangInstanceIdentifier(); + } + public static void writePath(final DataOutput out, final @NonNull YangInstanceIdentifier path) throws IOException { - try (NormalizedNodeDataOutput stream = NormalizedNodeInputOutput.newDataOutput(out)) { + writePath(out, NormalizedNodeStreamVersion.POTASSIUM, path); + } + + public static void writePath(final DataOutput out, final NormalizedNodeStreamVersion version, + final @NonNull YangInstanceIdentifier path) throws IOException { + try (NormalizedNodeDataOutput stream = version.newDataOutput(out)) { stream.writeYangInstanceIdentifier(path); } } - public static void writeNodeAndPath(final DataOutput out, final YangInstanceIdentifier path, - final NormalizedNode node) throws IOException { - try (NormalizedNodeDataOutput stream = NormalizedNodeInputOutput.newDataOutput(out)) { + public static void readNodeAndPath(final DataInput in, final T instance, final Applier applier) + throws IOException { + final NormalizedNodeDataInput stream = NormalizedNodeDataInput.newDataInput(in); + NormalizedNode node = stream.readNormalizedNode(); + YangInstanceIdentifier path = stream.readYangInstanceIdentifier(); + applier.apply(instance, path, node); + } + + public static void writeNodeAndPath(final DataOutput out, final NormalizedNodeStreamVersion version, + final YangInstanceIdentifier path, final NormalizedNode node) throws IOException { + try (NormalizedNodeDataOutput stream = version.newDataOutput(out)) { stream.writeNormalizedNode(node); stream.writeYangInstanceIdentifier(path); } } - public static void writePathAndNode(final DataOutput out, final YangInstanceIdentifier path, - final NormalizedNode node) throws IOException { - try (NormalizedNodeDataOutput stream = NormalizedNodeInputOutput.newDataOutput(out)) { + public static void writeNodeAndPath(final DataOutput out, final YangInstanceIdentifier path, + final NormalizedNode node) throws IOException { + writeNodeAndPath(out, NormalizedNodeStreamVersion.POTASSIUM, path, node); + } + + public static void readPathAndNode(final DataInput in, final T instance, final Applier applier) + throws IOException { + final NormalizedNodeDataInput stream = NormalizedNodeDataInput.newDataInput(in); + YangInstanceIdentifier path = stream.readYangInstanceIdentifier(); + NormalizedNode node = stream.readNormalizedNode(); + applier.apply(instance, path, node); + } + + public static void writePathAndNode(final DataOutput out, + final org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeStreamVersion version, + final YangInstanceIdentifier path, final NormalizedNode node) throws IOException { + try (NormalizedNodeDataOutput stream = version.newDataOutput(out)) { stream.writeYangInstanceIdentifier(path); stream.writeNormalizedNode(node); } } - public static YangInstanceIdentifier deserializePath(final DataInput in) { - try { - NormalizedNodeDataInput streamReader = streamReader(in); - return streamReader.readYangInstanceIdentifier(); - } catch (IOException e) { - throw new IllegalArgumentException("Error deserializing path", e); - } + public static void writePathAndNode(final DataOutput out, final YangInstanceIdentifier path, + final NormalizedNode node) throws IOException { + writePathAndNode(out, NormalizedNodeStreamVersion.POTASSIUM, path, node); } }