Bug 7521: Convert byte[] to ShardManagerSnapshot in DatastoreSnapshot
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / messages / DatastoreSnapshotList.java
index f0f18568c71467a0a5d5bdaa49e637b6b3894934..42f3129728aae62f9a34527c1888c10a21501de2 100644 (file)
@@ -7,12 +7,23 @@
  */
 package org.opendaylight.controller.cluster.datastore.messages;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
 import java.util.ArrayList;
 import java.util.List;
+import org.opendaylight.controller.cluster.datastore.persisted.ShardDataTreeSnapshot;
+import org.opendaylight.controller.cluster.datastore.persisted.ShardManagerSnapshot;
+import org.opendaylight.controller.cluster.datastore.persisted.ShardSnapshotState;
+import org.opendaylight.controller.cluster.raft.Snapshot;
+import org.opendaylight.controller.cluster.raft.persisted.EmptyState;
 
 /**
  * Stores a list of DatastoreSnapshot instances.
+ *
+ * @deprecated Use {@link org.opendaylight.controller.cluster.datastore.persisted.DatastoreSnapshotList} instead.
  */
+@Deprecated
 public class DatastoreSnapshotList extends ArrayList<DatastoreSnapshot> {
     private static final long serialVersionUID = 1L;
 
@@ -22,4 +33,56 @@ public class DatastoreSnapshotList extends ArrayList<DatastoreSnapshot> {
     public DatastoreSnapshotList(List<DatastoreSnapshot> snapshots) {
         super(snapshots);
     }
+
+    private Object readResolve() throws IOException, ClassNotFoundException {
+        List<org.opendaylight.controller.cluster.datastore.persisted.DatastoreSnapshot> snapshots =
+                new ArrayList<>(size());
+        for (DatastoreSnapshot legacy: this) {
+            snapshots.add(new org.opendaylight.controller.cluster.datastore.persisted.DatastoreSnapshot(
+                    legacy.getType(), deserializeShardManagerSnapshot(legacy.getShardManagerSnapshot()),
+                    fromLegacy(legacy.getShardSnapshots())));
+        }
+
+        return new org.opendaylight.controller.cluster.datastore.persisted.DatastoreSnapshotList(snapshots);
+    }
+
+    private static org.opendaylight.controller.cluster.datastore.persisted.ShardManagerSnapshot
+            deserializeShardManagerSnapshot(byte [] bytes) throws IOException, ClassNotFoundException {
+        if (bytes == null) {
+            return null;
+        }
+
+        try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes))) {
+            return (ShardManagerSnapshot) ois.readObject();
+        }
+    }
+
+    private static List<org.opendaylight.controller.cluster.datastore.persisted.DatastoreSnapshot.ShardSnapshot>
+            fromLegacy(List<DatastoreSnapshot.ShardSnapshot> from) throws IOException, ClassNotFoundException {
+        List<org.opendaylight.controller.cluster.datastore.persisted.DatastoreSnapshot.ShardSnapshot> snapshots =
+                new ArrayList<>(from.size());
+        for (DatastoreSnapshot.ShardSnapshot legacy: from) {
+            snapshots.add(new org.opendaylight.controller.cluster.datastore.persisted.DatastoreSnapshot.ShardSnapshot(
+                    legacy.getName(), deserializeShardSnapshot(legacy.getSnapshot())));
+        }
+
+        return snapshots;
+    }
+
+    private static org.opendaylight.controller.cluster.raft.persisted.Snapshot deserializeShardSnapshot(byte[] bytes)
+            throws IOException, ClassNotFoundException {
+        try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes))) {
+            Snapshot legacy = (Snapshot) ois.readObject();
+
+            org.opendaylight.controller.cluster.raft.persisted.Snapshot.State state = EmptyState.INSTANCE;
+            if (legacy.getState().length > 0) {
+                state = new ShardSnapshotState(ShardDataTreeSnapshot.deserializePreCarbon(legacy.getState()));
+            }
+
+            return org.opendaylight.controller.cluster.raft.persisted.Snapshot.create(
+                    state, legacy.getUnAppliedEntries(), legacy.getLastIndex(),
+                    legacy.getLastTerm(), legacy.getLastAppliedIndex(), legacy.getLastAppliedTerm(),
+                    legacy.getElectionTerm(), legacy.getElectionVotedFor(), legacy.getServerConfiguration());
+        }
+    }
 }