Cache MapJoiner
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / persisted / AbstractVersionedShardDataTreeSnapshot.java
index 0d92eac586c023444bf95ed6b7dd34394ae477cc..c12403f81913f4b372c5e9ccfc533ebc7be5d6d6 100644 (file)
@@ -8,12 +8,11 @@
 package org.opendaylight.controller.cluster.datastore.persisted;
 
 import com.google.common.base.Verify;
-import java.io.ByteArrayOutputStream;
 import java.io.DataInputStream;
-import java.io.DataOutputStream;
 import java.io.IOException;
+import java.io.ObjectInput;
 import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
+import java.io.ObjectOutput;
 import java.util.Optional;
 import javax.annotation.Nonnull;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
@@ -29,12 +28,14 @@ import org.slf4j.LoggerFactory;
 abstract class AbstractVersionedShardDataTreeSnapshot extends ShardDataTreeSnapshot {
     private static final Logger LOG = LoggerFactory.getLogger(AbstractVersionedShardDataTreeSnapshot.class);
 
-    static ShardDataTreeSnapshot deserialize(final DataInputStream is) throws IOException {
+    @SuppressWarnings("checkstyle:FallThrough")
+    @Deprecated
+    static ShardDataTreeSnapshot deserializePreCarbon(final DataInputStream is) throws IOException {
         final PayloadVersion version = PayloadVersion.readFrom(is);
         switch (version) {
             case BORON:
                 // Boron snapshots use Java Serialization
-                try (final ObjectInputStream ois = new ObjectInputStream(is)) {
+                try (ObjectInputStream ois = new ObjectInputStream(is)) {
                     return (ShardDataTreeSnapshot) ois.readObject();
                 } catch (ClassNotFoundException e) {
                     LOG.error("Failed to serialize data tree snapshot", e);
@@ -44,6 +45,32 @@ abstract class AbstractVersionedShardDataTreeSnapshot extends ShardDataTreeSnaps
             case TEST_PAST_VERSION:
                 // These versions are never returned and this code is effectively dead
                 break;
+            default:
+                throw new IOException("Invalid payload version in snapshot");
+        }
+
+        // Not included as default in above switch to ensure we get warnings when new versions are added
+        throw new IOException("Encountered unhandled version" + version);
+    }
+
+    @SuppressWarnings("checkstyle:FallThrough")
+    static ShardDataTreeSnapshot versionedDeserialize(final ObjectInput in) throws IOException {
+        final PayloadVersion version = PayloadVersion.readFrom(in);
+        switch (version) {
+            case BORON:
+                // Boron snapshots use Java Serialization
+                try {
+                    return (ShardDataTreeSnapshot) in.readObject();
+                } catch (ClassNotFoundException e) {
+                    LOG.error("Failed to serialize data tree snapshot", e);
+                    throw new IOException("Snapshot failed to deserialize", e);
+                }
+            case TEST_FUTURE_VERSION:
+            case TEST_PAST_VERSION:
+                // These versions are never returned and this code is effectively dead
+                break;
+            default:
+                throw new IOException("Invalid payload version in snapshot");
         }
 
         // Not included as default in above switch to ensure we get warnings when new versions are added
@@ -60,42 +87,37 @@ abstract class AbstractVersionedShardDataTreeSnapshot extends ShardDataTreeSnaps
      *
      * @return The root node.
      */
-    abstract @Nonnull NormalizedNode<?, ?> rootNode();
+    @Nonnull
+    abstract NormalizedNode<?, ?> rootNode();
 
     /**
      * Return the snapshot payload version. Implementations of this method should return a constant.
      *
      * @return Snapshot payload version
      */
-    abstract @Nonnull PayloadVersion version();
+    @Nonnull
+    abstract PayloadVersion version();
 
-    private void versionedSerialize(final DataOutputStream dos, final PayloadVersion version) throws IOException {
+    private void versionedSerialize(final ObjectOutput out, final PayloadVersion version) throws IOException {
         switch (version) {
             case BORON:
                 // Boron snapshots use Java Serialization
-                try (ObjectOutputStream oos = new ObjectOutputStream(dos)) {
-                    oos.writeObject(this);
-                }
+                out.writeObject(this);
                 return;
             case TEST_FUTURE_VERSION:
             case TEST_PAST_VERSION:
                 break;
-
+            default:
+                throw new IOException("Invalid payload version in snapshot");
         }
 
         throw new IOException("Encountered unhandled version" + version);
     }
 
     @Override
-    public final byte[] serialize() throws IOException {
-        try (final ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
-            try (final DataOutputStream dos = new DataOutputStream(bos)) {
-                final PayloadVersion version = version();
-                version.writeTo(dos);
-                versionedSerialize(dos, version);
-            }
-
-            return bos.toByteArray();
-        }
+    public void serialize(final ObjectOutput out) throws IOException {
+        final PayloadVersion version = version();
+        version.writeTo(out);
+        versionedSerialize(out, version);
     }
 }