2 * Copyright (c) 2016 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.access.concepts;
10 import static com.google.common.base.Verify.verifyNotNull;
11 import static java.util.Objects.requireNonNull;
13 import com.google.common.base.MoreObjects;
14 import java.io.DataInput;
15 import java.io.DataOutput;
16 import java.io.Externalizable;
17 import java.io.IOException;
18 import java.io.ObjectInput;
19 import java.io.ObjectOutput;
20 import org.eclipse.jdt.annotation.NonNull;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.cds.types.rev191024.ClientGeneration;
22 import org.opendaylight.yangtools.concepts.WritableIdentifier;
23 import org.opendaylight.yangtools.concepts.WritableObjects;
24 import org.opendaylight.yangtools.yang.common.Uint64;
27 * A cluster-wide unique identifier of a frontend instance. This identifier discerns between individual incarnations
28 * of a particular frontend.
30 public final class ClientIdentifier implements WritableIdentifier {
31 interface SerialForm extends Externalizable {
32 @NonNull ClientIdentifier identifier();
34 void setIdentifier(@NonNull ClientIdentifier identifier);
40 default void readExternal(final ObjectInput in) throws IOException {
41 setIdentifier(new ClientIdentifier(FrontendIdentifier.readFrom(in), WritableObjects.readLong(in)));
45 default void writeExternal(final ObjectOutput out) throws IOException {
46 final var id = identifier();
47 id.getFrontendId().writeTo(out);
48 WritableObjects.writeLong(out, id.getGeneration());
52 private static final class Proxy implements SerialForm {
54 private static final long serialVersionUID = 1L;
56 private ClientIdentifier identifier;
58 // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
59 // be able to create instances via reflection.
60 @SuppressWarnings("checkstyle:RedundantModifier")
62 // Needed for Externalizable
65 Proxy(final ClientIdentifier identifier) {
66 this.identifier = requireNonNull(identifier);
70 public ClientIdentifier identifier() {
71 return verifyNotNull(identifier);
75 public void setIdentifier(final ClientIdentifier identifier) {
76 this.identifier = requireNonNull(identifier);
80 public Object readResolve() {
86 private static final long serialVersionUID = 1L;
88 private final @NonNull FrontendIdentifier frontendId;
89 private final long generation;
91 ClientIdentifier(final FrontendIdentifier frontendId, final long generation) {
92 this.frontendId = requireNonNull(frontendId);
93 this.generation = generation;
96 public static @NonNull ClientIdentifier create(final FrontendIdentifier frontendId,
97 final long generation) {
98 return new ClientIdentifier(frontendId, generation);
101 public static @NonNull ClientIdentifier readFrom(final DataInput in) throws IOException {
102 final FrontendIdentifier frontendId = FrontendIdentifier.readFrom(in);
103 return new ClientIdentifier(frontendId, WritableObjects.readLong(in));
107 public void writeTo(final DataOutput out) throws IOException {
108 frontendId.writeTo(out);
109 WritableObjects.writeLong(out, generation);
112 public @NonNull FrontendIdentifier getFrontendId() {
116 public long getGeneration() {
120 public @NonNull ClientGeneration getYangGeneration() {
121 return new ClientGeneration(Uint64.fromLongBits(generation));
125 public int hashCode() {
126 return frontendId.hashCode() * 31 + Long.hashCode(generation);
130 public boolean equals(final Object obj) {
131 return this == obj || obj instanceof ClientIdentifier other && generation == other.generation
132 && frontendId.equals(other.frontendId);
136 public String toString() {
137 return MoreObjects.toStringHelper(ClientIdentifier.class)
138 .add("frontend", frontendId)
139 .add("generation", Long.toUnsignedString(generation))
144 private Object writeReplace() {
145 return new Proxy(this);