Fix FindBugs warnings in sal-akk-raft
[controller.git] / opendaylight / md-sal / sal-akka-raft / src / main / java / org / opendaylight / controller / cluster / raft / Snapshot.java
index 77bf10370184894d6a510990e08fb1a8bc785a84..2677baff6da40d1e2caba4a7b257594e5233bb3b 100644 (file)
@@ -7,38 +7,65 @@
  */
 package org.opendaylight.controller.cluster.raft;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.Serializable;
 import java.util.List;
+import org.opendaylight.controller.cluster.raft.persisted.ServerConfigurationPayload;
 
-
+/**
+ * Represents a snapshot of the raft data.
+ *
+ * @author Moiz Raja
+ * @author Thomas Pantelis
+ */
 public class Snapshot implements Serializable {
-    private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = -8298574936724056236L;
+
     private final byte[] state;
     private final List<ReplicatedLogEntry> unAppliedEntries;
     private final long lastIndex;
     private final long lastTerm;
     private final long lastAppliedIndex;
     private final long lastAppliedTerm;
+    private final long electionTerm;
+    private final String electionVotedFor;
+    private final ServerConfigurationPayload serverConfig;
 
-    private Snapshot(byte[] state,
-        List<ReplicatedLogEntry> unAppliedEntries, long lastIndex,
-        long lastTerm, long lastAppliedIndex, long lastAppliedTerm) {
+    private Snapshot(byte[] state, List<ReplicatedLogEntry> unAppliedEntries, long lastIndex, long lastTerm,
+            long lastAppliedIndex, long lastAppliedTerm, long electionTerm, String electionVotedFor,
+            ServerConfigurationPayload serverConfig) {
         this.state = state;
         this.unAppliedEntries = unAppliedEntries;
         this.lastIndex = lastIndex;
         this.lastTerm = lastTerm;
         this.lastAppliedIndex = lastAppliedIndex;
         this.lastAppliedTerm = lastAppliedTerm;
+        this.electionTerm = electionTerm;
+        this.electionVotedFor = electionVotedFor;
+        this.serverConfig = serverConfig;
     }
 
+    public static Snapshot create(byte[] state, List<ReplicatedLogEntry> entries, long lastIndex, long lastTerm,
+            long lastAppliedIndex, long lastAppliedTerm) {
+        return new Snapshot(state, entries, lastIndex, lastTerm, lastAppliedIndex, lastAppliedTerm, -1, null, null);
+    }
+
+    public static Snapshot create(byte[] state, List<ReplicatedLogEntry> entries, long lastIndex, long lastTerm,
+            long lastAppliedIndex, long lastAppliedTerm, long electionTerm, String electionVotedFor) {
+        return new Snapshot(state, entries, lastIndex, lastTerm, lastAppliedIndex, lastAppliedTerm,
+                electionTerm, electionVotedFor, null);
+    }
 
-    public static Snapshot create(byte[] state,
-        List<ReplicatedLogEntry> entries, long lastIndex, long lastTerm,
-        long lastAppliedIndex, long lastAppliedTerm) {
-        return new Snapshot(state, entries, lastIndex, lastTerm,
-            lastAppliedIndex, lastAppliedTerm);
+    public static Snapshot create(byte[] state, List<ReplicatedLogEntry> entries, long lastIndex, long lastTerm,
+            long lastAppliedIndex, long lastAppliedTerm, long electionTerm, String electionVotedFor,
+            ServerConfigurationPayload serverConfig) {
+        return new Snapshot(state, entries, lastIndex, lastTerm, lastAppliedIndex, lastAppliedTerm,
+                electionTerm, electionVotedFor, serverConfig);
     }
 
+    @SuppressFBWarnings(value = "EI_EXPOSE_REP", justification = "Exposes a mutable object stored in a field but "
+            + "this is OK since this class is merely a DTO and does not process the byte[] internally. "
+            + "Also it would be inefficient to create a return copy as the byte[] could be large.")
     public byte[] getState() {
         return state;
     }
@@ -63,15 +90,24 @@ public class Snapshot implements Serializable {
         return this.lastIndex;
     }
 
-    public String getLogMessage() {
-        StringBuilder sb = new StringBuilder();
-        return sb.append("Snapshot={")
-            .append("lastTerm:" + this.getLastTerm() + ", ")
-            .append("lastIndex:" + this.getLastIndex()  + ", ")
-            .append("LastAppliedIndex:" + this.getLastAppliedIndex()  + ", ")
-            .append("LastAppliedTerm:" + this.getLastAppliedTerm()  + ", ")
-            .append("UnAppliedEntries size:" + this.getUnAppliedEntries().size()  + "}")
-            .toString();
+    public long getElectionTerm() {
+        return electionTerm;
+    }
+
+
+    public String getElectionVotedFor() {
+        return electionVotedFor;
+    }
+
+    public ServerConfigurationPayload getServerConfiguration() {
+        return serverConfig;
+    }
 
+    @Override
+    public String toString() {
+        return "Snapshot [lastIndex=" + lastIndex + ", lastTerm=" + lastTerm + ", lastAppliedIndex=" + lastAppliedIndex
+                + ", lastAppliedTerm=" + lastAppliedTerm + ", unAppliedEntries size=" + unAppliedEntries.size()
+                + ", state size=" + state.length + ", electionTerm=" + electionTerm + ", electionVotedFor="
+                + electionVotedFor + ", ServerConfigPayload="  + serverConfig + "]";
     }
 }