933aa16c79cbea78ba87f7120f02b9ecebc2dd53
[controller.git] / opendaylight / md-sal / cds-access-api / src / main / java / org / opendaylight / controller / cluster / access / concepts / FrontendIdentifier.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.controller.cluster.access.concepts;
9
10 import static com.google.common.base.Verify.verifyNotNull;
11 import static java.util.Objects.requireNonNull;
12
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;
22
23 /**
24  * A cluster-wide unique identifier of a frontend type located at a cluster member.
25  */
26 public final class FrontendIdentifier implements WritableIdentifier {
27     interface SerialForm extends Externalizable {
28         @NonNull FrontendIdentifier identifier();
29
30         void setIdentifier(@NonNull FrontendIdentifier identifier);
31
32         @java.io.Serial
33         Object readResolve();
34
35         @Override
36         default void writeExternal(final ObjectOutput out) throws IOException {
37             final var id = identifier();
38             id.memberName.writeTo(out);
39             id.clientType.writeTo(out);
40         }
41
42         @Override
43         default void readExternal(final ObjectInput in) throws IOException {
44             setIdentifier(new FrontendIdentifier(MemberName.readFrom(in), FrontendType.readFrom(in)));
45         }
46     }
47
48     private static final class Proxy implements SerialForm {
49         @java.io.Serial
50         private static final long serialVersionUID = 1L;
51
52         private FrontendIdentifier identifier;
53
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")
57         public Proxy() {
58             // Needed for Externalizable
59         }
60
61         Proxy(final FrontendIdentifier identifier) {
62             this.identifier = requireNonNull(identifier);
63         }
64
65         @Override
66         public FrontendIdentifier identifier() {
67             return verifyNotNull(identifier);
68         }
69
70         @Override
71         public void setIdentifier(final FrontendIdentifier identifier) {
72             this.identifier = requireNonNull(identifier);
73         }
74
75         @Override
76         public Object readResolve() {
77             return identifier();
78         }
79     }
80
81     @java.io.Serial
82     private static final long serialVersionUID = 1L;
83
84     private final MemberName memberName;
85     private final FrontendType clientType;
86
87     FrontendIdentifier(final MemberName memberName, final FrontendType clientType) {
88         this.clientType = requireNonNull(clientType);
89         this.memberName = requireNonNull(memberName);
90     }
91
92     public static @NonNull FrontendIdentifier create(final MemberName memberName, final FrontendType clientType) {
93         return new FrontendIdentifier(memberName, clientType);
94     }
95
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);
100     }
101
102     @Override
103     public void writeTo(final DataOutput out) throws IOException {
104         memberName.writeTo(out);
105         clientType.writeTo(out);
106     }
107
108     public @NonNull FrontendType getClientType() {
109         return clientType;
110     }
111
112     public @NonNull MemberName getMemberName() {
113         return memberName;
114     }
115
116     @Override
117     public int hashCode() {
118         return Objects.hash(memberName, clientType);
119     }
120
121     @Override
122     public boolean equals(final Object obj) {
123         return this == obj || obj instanceof FrontendIdentifier other && memberName.equals(other.memberName)
124             && clientType.equals(other.clientType);
125     }
126
127     public @NonNull String toPersistentId() {
128         return memberName.getName() + "-frontend-" + clientType.getName();
129     }
130
131     @Override
132     public String toString() {
133         return toPersistentId();
134     }
135
136     @java.io.Serial
137     private Object writeReplace() {
138         return new Proxy(this);
139     }
140 }