Remove use of thread-local input
[controller.git] / opendaylight / md-sal / sal-clustering-commons / src / main / java / org / opendaylight / controller / cluster / datastore / node / utils / stream / SerializationUtils.java
index 4d01702215867d29a6b35ade6eda539fdeb30abe..076e96c29390dcf5b54c9f9ccffb3b5bad5ab1c0 100644 (file)
@@ -7,11 +7,10 @@
  */
 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;
@@ -23,59 +22,20 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
  * @author Thomas Pantelis
  */
 public final class SerializationUtils {
-    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);
     }
 
-    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 <T> void deserializePathAndNode(final DataInput in, final T instance, final 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);
-        }
-    }
-
-    private static NormalizedNode<?, ?> tryDeserializeNormalizedNode(final DataInput in) throws IOException {
-        boolean present = in.readBoolean();
-        if (present) {
-            NormalizedNodeDataInput streamReader = streamReader(in);
-            return streamReader.readNormalizedNode();
-        }
-
-        return null;
-    }
-
-    public static NormalizedNode<?, ?> deserializeNormalizedNode(final DataInput in) {
-        try {
-            return tryDeserializeNormalizedNode(in);
-        } catch (IOException e) {
-            throw new IllegalArgumentException("Error deserializing NormalizedNode", e);
-        }
-    }
-
-    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 Optional<NormalizedNode<?, ?>> readNormalizedNode(final DataInput in) throws IOException {
+        if (!in.readBoolean()) {
+            return Optional.empty();
         }
+        return Optional.of(NormalizedNodeInputOutput.newDataInput(in).readNormalizedNode());
     }
 
     public static void writeNormalizedNode(final DataOutput out, final @Nullable NormalizedNode<?, ?> node)
@@ -91,6 +51,10 @@ public final class SerializationUtils {
         }
     }
 
+    public static YangInstanceIdentifier readPath(final DataInput in) throws IOException {
+        return NormalizedNodeInputOutput.newDataInput(in).readYangInstanceIdentifier();
+    }
+
     public static void writePath(final DataOutput out, final @NonNull YangInstanceIdentifier path)
             throws IOException {
         try (NormalizedNodeDataOutput stream = NormalizedNodeInputOutput.newDataOutput(out)) {
@@ -98,6 +62,14 @@ public final class SerializationUtils {
         }
     }
 
+    public static <T> void readNodeAndPath(final DataInput in, final T instance, final Applier<T> applier)
+            throws IOException {
+        final NormalizedNodeDataInput stream = NormalizedNodeInputOutput.newDataInput(in);
+        NormalizedNode<?, ?> node = stream.readNormalizedNode();
+        YangInstanceIdentifier path = stream.readYangInstanceIdentifier();
+        applier.apply(instance, path, node);
+    }
+
     public static void writeNodeAndPath(final DataOutput out, final YangInstanceIdentifier path,
             final NormalizedNode<?, ?> node) throws IOException {
         try (NormalizedNodeDataOutput stream = NormalizedNodeInputOutput.newDataOutput(out)) {
@@ -106,6 +78,14 @@ public final class SerializationUtils {
         }
     }
 
+    public static <T> void readPathAndNode(final DataInput in, final T instance, final Applier<T> applier)
+            throws IOException {
+        final NormalizedNodeDataInput stream = NormalizedNodeInputOutput.newDataInput(in);
+        YangInstanceIdentifier path = stream.readYangInstanceIdentifier();
+        NormalizedNode<?, ?> node = stream.readNormalizedNode();
+        applier.apply(instance, path, node);
+    }
+
     public static void writePathAndNode(final DataOutput out, final YangInstanceIdentifier path,
             final NormalizedNode<?, ?> node) throws IOException {
         try (NormalizedNodeDataOutput stream = NormalizedNodeInputOutput.newDataOutput(out)) {
@@ -113,13 +93,4 @@ public final class SerializationUtils {
             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);
-        }
-    }
 }