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 java.io.DataInput;
14 import java.io.DataOutput;
15 import java.io.Externalizable;
16 import java.io.IOException;
17 import java.io.ObjectInput;
18 import java.io.ObjectOutput;
19 import java.util.Objects;
20 import org.eclipse.jdt.annotation.NonNull;
21 import org.opendaylight.yangtools.concepts.WritableIdentifier;
24 * A cluster-wide unique identifier of a frontend type located at a cluster member.
26 public final class FrontendIdentifier implements WritableIdentifier {
27 interface SerialForm extends Externalizable {
28 @NonNull FrontendIdentifier identifier();
30 void setIdentifier(@NonNull FrontendIdentifier identifier);
36 default void writeExternal(final ObjectOutput out) throws IOException {
37 final var id = identifier();
38 id.memberName.writeTo(out);
39 id.clientType.writeTo(out);
43 default void readExternal(final ObjectInput in) throws IOException {
44 setIdentifier(new FrontendIdentifier(MemberName.readFrom(in), FrontendType.readFrom(in)));
48 private static final class Proxy implements SerialForm {
50 private static final long serialVersionUID = 1L;
52 private FrontendIdentifier identifier;
54 // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
55 // be able to create instances via reflection.
56 @SuppressWarnings("checkstyle:RedundantModifier")
58 // Needed for Externalizable
61 Proxy(final FrontendIdentifier identifier) {
62 this.identifier = requireNonNull(identifier);
66 public FrontendIdentifier identifier() {
67 return verifyNotNull(identifier);
71 public void setIdentifier(final FrontendIdentifier identifier) {
72 this.identifier = requireNonNull(identifier);
76 public Object readResolve() {
82 private static final long serialVersionUID = 1L;
84 private final MemberName memberName;
85 private final FrontendType clientType;
87 FrontendIdentifier(final MemberName memberName, final FrontendType clientType) {
88 this.clientType = requireNonNull(clientType);
89 this.memberName = requireNonNull(memberName);
92 public static @NonNull FrontendIdentifier create(final MemberName memberName, final FrontendType clientType) {
93 return new FrontendIdentifier(memberName, clientType);
96 public static @NonNull FrontendIdentifier readFrom(final DataInput in) throws IOException {
97 final MemberName memberName = MemberName.readFrom(in);
98 final FrontendType clientType = FrontendType.readFrom(in);
99 return new FrontendIdentifier(memberName, clientType);
103 public void writeTo(final DataOutput out) throws IOException {
104 memberName.writeTo(out);
105 clientType.writeTo(out);
108 public @NonNull FrontendType getClientType() {
112 public @NonNull MemberName getMemberName() {
117 public int hashCode() {
118 return Objects.hash(memberName, clientType);
122 public boolean equals(final Object obj) {
123 return this == obj || obj instanceof FrontendIdentifier other && memberName.equals(other.memberName)
124 && clientType.equals(other.clientType);
127 public @NonNull String toPersistentId() {
128 return memberName.getName() + "-frontend-" + clientType.getName();
132 public String toString() {
133 return toPersistentId();
137 private Object writeReplace() {
138 return new Proxy(this);