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 ca137d7..42f3129 100644 (file)
@@ -7,8 +7,16 @@
  */
 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.
@@ -26,26 +34,55 @@ public class DatastoreSnapshotList extends ArrayList<DatastoreSnapshot> {
         super(snapshots);
     }
 
-    private Object readResolve() {
+    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(), legacy.getShardManagerSnapshot(), fromLegacy(legacy.getShardSnapshots())));
+                    legacy.getType(), deserializeShardManagerSnapshot(legacy.getShardManagerSnapshot()),
+                    fromLegacy(legacy.getShardSnapshots())));
         }
 
         return new org.opendaylight.controller.cluster.datastore.persisted.DatastoreSnapshotList(snapshots);
     }
 
-    private List<org.opendaylight.controller.cluster.datastore.persisted.DatastoreSnapshot.ShardSnapshot> fromLegacy(
-            List<DatastoreSnapshot.ShardSnapshot> from) {
+    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(), legacy.getSnapshot()));
+                    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());
+        }
+    }
 }

©2013 OpenDaylight, A Linux Foundation Collaborative Project. All Rights Reserved.
OpenDaylight is a registered trademark of The OpenDaylight Project, Inc.
Linux Foundation and OpenDaylight are registered trademarks of the Linux Foundation.
Linux is a registered trademark of Linus Torvalds.