Bump odlparent/yangtools/mdsal
[controller.git] / opendaylight / md-sal / sal-clustering-commons / src / main / java / org / opendaylight / controller / cluster / datastore / node / utils / stream / SerializationUtils.java
index fc0497280cc59212f4feed17f1b7460c6a215af6..a2c456d17a65efb3fa5c2007379f75a1219dcc40 100644 (file)
@@ -7,16 +7,19 @@
  */
 package org.opendaylight.controller.cluster.datastore.node.utils.stream;
 
-import com.google.common.base.Preconditions;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
+import static org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeStreamVersion.MAGNESIUM;
+
 import java.io.DataInput;
-import java.io.DataInputStream;
 import java.io.DataOutput;
-import java.io.DataOutputStream;
 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.
@@ -24,117 +27,96 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
  * @author Thomas Pantelis
  */
 public final class SerializationUtils {
-    public static final ThreadLocal<NormalizedNodeDataOutput> REUSABLE_WRITER_TL = new ThreadLocal<>();
-    public static final ThreadLocal<NormalizedNodeDataInput> REUSABLE_READER_TL = new ThreadLocal<>();
+    private SerializationUtils() {
+
+    }
 
+    @FunctionalInterface
     public interface Applier<T> {
-        void apply(T instance, YangInstanceIdentifier path, NormalizedNode<?, ?> node);
+        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);
+    public static Optional<NormalizedNode> readNormalizedNode(final DataInput in) throws IOException {
+        if (!in.readBoolean()) {
+            return Optional.empty();
         }
+        return Optional.of(NormalizedNodeDataInput.newDataInput(in).readNormalizedNode());
+    }
 
-        return streamWriter;
+    public static void writeNormalizedNode(final DataOutput out, final @Nullable NormalizedNode node)
+            throws IOException {
+        writeNormalizedNode(out, MAGNESIUM, node);
     }
 
-    private static NormalizedNodeDataInput streamReader(DataInput in) throws IOException {
-        NormalizedNodeDataInput streamReader = REUSABLE_READER_TL.get();
-        if (streamReader == null) {
-            streamReader = NormalizedNodeInputOutput.newDataInput(in);
-        }
+    public static void writeNormalizedNode(final DataOutput out, final NormalizedNodeStreamVersion version,
+            final @Nullable NormalizedNode node) throws IOException {
+        if (node != null) {
+            out.writeBoolean(true);
 
-        return streamReader;
+            try (NormalizedNodeDataOutput stream = version.newDataOutput(out)) {
+                stream.writeNormalizedNode(node);
+            }
+        } else {
+            out.writeBoolean(false);
+        }
     }
 
-    public static void serializePathAndNode(YangInstanceIdentifier path, NormalizedNode<?, ?> node,
-            DataOutput out) {
-        Preconditions.checkNotNull(path);
-        Preconditions.checkNotNull(node);
-        try {
-            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",
-                    path, node), e);
-        }
+    public static YangInstanceIdentifier readPath(final DataInput in) throws IOException {
+        return NormalizedNodeDataInput.newDataInput(in).readYangInstanceIdentifier();
     }
 
-    public static <T> void deserializePathAndNode(DataInput in, T instance, Applier<T> 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);
-        }
+    public static void writePath(final DataOutput out, final @NonNull YangInstanceIdentifier path)
+            throws IOException {
+        writePath(out, MAGNESIUM, path);
     }
 
-    private static NormalizedNode<?, ?> tryDeserializeNormalizedNode(DataInput in) throws IOException {
-        boolean present = in.readBoolean();
-        if (present) {
-            NormalizedNodeDataInput streamReader = streamReader(in);
-            return streamReader.readNormalizedNode();
+    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);
         }
-
-        return null;
     }
 
-    public static NormalizedNode<?, ?> deserializeNormalizedNode(DataInput in) {
-        try {
-            return tryDeserializeNormalizedNode(in);
-        } catch (IOException e) {
-            throw new IllegalArgumentException("Error deserializing NormalizedNode", e);
-        }
+    public static <T> void readNodeAndPath(final DataInput in, final T instance, final Applier<T> applier)
+            throws IOException {
+        final NormalizedNodeDataInput stream = NormalizedNodeDataInput.newDataInput(in);
+        NormalizedNode node = stream.readNormalizedNode();
+        YangInstanceIdentifier path = stream.readYangInstanceIdentifier();
+        applier.apply(instance, path, node);
     }
 
-    public static NormalizedNode<?, ?> deserializeNormalizedNode(byte [] bytes) {
-        try {
-            return tryDeserializeNormalizedNode(new DataInputStream(new ByteArrayInputStream(bytes)));
-        } catch (IOException e) {
-            throw new IllegalArgumentException("Error deserializing NormalizedNode", e);
+    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 serializeNormalizedNode(NormalizedNode<?, ?> node, DataOutput out) {
-        try {
-            out.writeBoolean(node != null);
-            if (node != null) {
-                NormalizedNodeDataOutput streamWriter = streamWriter(out);
-                streamWriter.writeNormalizedNode(node);
-            }
-        } catch (IOException e) {
-            throw new IllegalArgumentException(String.format("Error serializing NormalizedNode %s",
-                    node), e);
-        }
+    public static void writeNodeAndPath(final DataOutput out, final YangInstanceIdentifier path,
+            final NormalizedNode node) throws IOException {
+        writeNodeAndPath(out, MAGNESIUM, path, node);
     }
 
-    public static byte [] serializeNormalizedNode(NormalizedNode<?, ?> node) {
-        ByteArrayOutputStream bos = new ByteArrayOutputStream();
-        serializeNormalizedNode(node, new DataOutputStream(bos));
-        return bos.toByteArray();
+    public static <T> void readPathAndNode(final DataInput in, final T instance, final Applier<T> 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 serializePath(YangInstanceIdentifier path, DataOutput out) {
-        Preconditions.checkNotNull(path);
-        try {
-            NormalizedNodeDataOutput streamWriter = streamWriter(out);
-            streamWriter.writeYangInstanceIdentifier(path);
-        } catch (IOException e) {
-            throw new IllegalArgumentException(String.format("Error serializing path %s", path), e);
+    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(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, MAGNESIUM, path, node);
     }
 }