2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.cluster.raft.persisted;
10 import static java.util.Objects.requireNonNull;
12 import java.io.Externalizable;
13 import java.io.IOException;
14 import java.io.ObjectInput;
15 import java.io.ObjectOutput;
16 import java.io.Serializable;
17 import org.apache.commons.lang3.SerializationUtils;
18 import org.opendaylight.controller.cluster.raft.ReplicatedLogEntry;
19 import org.opendaylight.controller.cluster.raft.messages.Payload;
22 * A {@link ReplicatedLogEntry} implementation.
24 * @author Thomas Pantelis
26 public sealed class SimpleReplicatedLogEntry implements ReplicatedLogEntry, Serializable {
27 @Deprecated(since = "7.0.0", forRemoval = true)
28 private static final class Legacy extends SimpleReplicatedLogEntry implements LegacySerializable {
30 private static final long serialVersionUID = 1L;
32 Legacy(final long index, final long term, final Payload payload) {
33 super(index, term, payload);
37 @Deprecated(since = "7.0.0", forRemoval = true)
38 private static final class Proxy implements Externalizable {
40 private static final long serialVersionUID = 1L;
46 // checkstyle flags the public modifier as redundant which really doesn't make sense since it clearly isn't
47 // redundant. It is explicitly needed for Java serialization to be able to create instances via reflection.
48 @SuppressWarnings("checkstyle:RedundantModifier")
53 Proxy(final SimpleReplicatedLogEntry replicatedLogEntry) {
54 index = replicatedLogEntry.getIndex();
55 term = replicatedLogEntry.getTerm();
56 data = replicatedLogEntry.getData();
60 public void writeExternal(final ObjectOutput out) throws IOException {
63 out.writeObject(data);
67 public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
68 index = in.readLong();
70 data = (Payload) in.readObject();
74 private Object readResolve() {
75 return new Legacy(index, term, data);
80 private static final long serialVersionUID = 1L;
81 // Estimate to how big the proxy is. Note this includes object stream overhead, so it is a bit conservative.
82 private static final int PROXY_SIZE = SerializationUtils.serialize(new LE((Void) null)).length;
84 private final long index;
85 private final long term;
86 private final Payload payload;
87 private boolean persistencePending;
90 * Constructs an instance.
92 * @param index the index
93 * @param term the term
94 * @param payload the payload
96 public SimpleReplicatedLogEntry(final long index, final long term, final Payload payload) {
99 this.payload = requireNonNull(payload);
103 public final Payload getData() {
108 public final long getTerm() {
113 public final long getIndex() {
118 public final int size() {
119 return payload.size();
123 public final int serializedSize() {
124 return PROXY_SIZE + payload.serializedSize();
128 public final boolean isPersistencePending() {
129 return persistencePending;
133 public final void setPersistencePending(final boolean pending) {
134 persistencePending = pending;
138 public final Object writeReplace() {
143 public final int hashCode() {
144 final int prime = 31;
146 result = prime * result + payload.hashCode();
147 result = prime * result + (int) (index ^ index >>> 32);
148 result = prime * result + (int) (term ^ term >>> 32);
153 public final boolean equals(final Object obj) {
154 return this == obj || obj instanceof SimpleReplicatedLogEntry other && index == other.index
155 && term == other.term && payload.equals(other.payload);
159 public final String toString() {
160 return "SimpleReplicatedLogEntry [index=" + index + ", term=" + term + ", payload=" + payload + "]";