package org.opendaylight.controller.cluster.raft.persisted;
import com.google.common.collect.ImmutableList;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.io.ByteArrayOutputStream;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
-import java.util.ArrayList;
import java.util.List;
-import javax.annotation.Nonnull;
-import org.opendaylight.controller.cluster.raft.protobuff.client.messages.Payload;
-import org.opendaylight.controller.cluster.raft.protobuff.client.messages.PersistentPayload;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.controller.cluster.raft.messages.Payload;
+import org.opendaylight.controller.cluster.raft.messages.PersistentPayload;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
*
* @author Thomas Pantelis
*/
-public final class ServerConfigurationPayload extends Payload implements PersistentPayload, MigratedSerializable {
+public final class ServerConfigurationPayload extends Payload implements PersistentPayload {
private static final class Proxy implements Externalizable {
+ @java.io.Serial
private static final long serialVersionUID = 1L;
private List<ServerInfo> serverConfig;
}
Proxy(final ServerConfigurationPayload payload) {
- this.serverConfig = payload.getServerConfig();
+ serverConfig = payload.getServerConfig();
}
@Override
@Override
public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
final int size = in.readInt();
- serverConfig = new ArrayList<>(size);
+
+ final var builder = ImmutableList.<ServerInfo>builderWithExpectedSize(size);
for (int i = 0; i < size; ++i) {
final String id = (String) in.readObject();
final boolean voting = in.readBoolean();
- serverConfig.add(new ServerInfo(id, voting));
+ builder.add(new ServerInfo(id, voting));
}
+ serverConfig = builder.build();
}
+ @java.io.Serial
private Object readResolve() {
return new ServerConfigurationPayload(serverConfig);
}
}
private static final Logger LOG = LoggerFactory.getLogger(ServerConfigurationPayload.class);
+ @java.io.Serial
private static final long serialVersionUID = 1L;
+ @SuppressFBWarnings(value = "SE_BAD_FIELD", justification = "This field is not Serializable but this class "
+ + "implements writeReplace to delegate serialization to a Proxy class and thus instances of this class "
+ + "aren't serialized. FindBugs does not recognize this.")
private final List<ServerInfo> serverConfig;
- private final boolean migrated;
private int serializedSize = -1;
- private ServerConfigurationPayload(final @Nonnull List<ServerInfo> serverConfig, boolean migrated) {
+ public ServerConfigurationPayload(final @NonNull List<ServerInfo> serverConfig) {
this.serverConfig = ImmutableList.copyOf(serverConfig);
- this.migrated = migrated;
- }
-
- public ServerConfigurationPayload(final @Nonnull List<ServerInfo> serverConfig) {
- this(serverConfig, false);
}
- @Deprecated
- public static ServerConfigurationPayload createMigrated(final @Nonnull List<ServerInfo> serverConfig) {
- return new ServerConfigurationPayload(serverConfig, true);
+ public @NonNull List<ServerInfo> getServerConfig() {
+ return serverConfig;
}
- @Deprecated
@Override
- public boolean isMigrated() {
- return migrated;
- }
-
- public @Nonnull List<ServerInfo> getServerConfig() {
- return serverConfig;
+ public int size() {
+ return serializedSize();
}
@Override
- public int size() {
+ public int serializedSize() {
if (serializedSize < 0) {
try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
try (ObjectOutputStream out = new ObjectOutputStream(bos)) {
return serializedSize;
}
+ @Override
+ public int hashCode() {
+ return serverConfig.hashCode();
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ return this == obj || obj instanceof ServerConfigurationPayload other
+ && serverConfig.equals(other.serverConfig);
+ }
+
@Override
public String toString() {
return "ServerConfigurationPayload [serverConfig=" + serverConfig + "]";
}
@Override
- public Object writeReplace() {
+ protected Object writeReplace() {
return new Proxy(this);
}
}