Add missing final keywords
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / persisted / DatastoreSnapshot.java
1 /*
2  * Copyright (c) 2015 Brocade Communications 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.datastore.persisted;
9
10 import static com.google.common.base.Verify.verifyNotNull;
11 import static java.util.Objects.requireNonNull;
12
13 import com.google.common.collect.ImmutableList;
14 import java.io.Externalizable;
15 import java.io.IOException;
16 import java.io.ObjectInput;
17 import java.io.ObjectOutput;
18 import java.io.Serializable;
19 import java.util.ArrayList;
20 import java.util.List;
21 import org.eclipse.jdt.annotation.NonNull;
22 import org.eclipse.jdt.annotation.Nullable;
23 import org.opendaylight.controller.cluster.raft.persisted.Snapshot;
24
25 /**
26  * Stores a snapshot of the internal state of a data store.
27  *
28  * @author Thomas Pantelis
29  */
30 public final class DatastoreSnapshot implements Serializable {
31     interface SerialForm extends Externalizable {
32
33         DatastoreSnapshot datastoreSnapshot();
34
35         Object readResolve();
36
37         void resolveTo(@NonNull DatastoreSnapshot newDatastoreSnapshot);
38
39         @Override
40         default void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
41             final var type = (String)in.readObject();
42             final var snapshot = (ShardManagerSnapshot) in.readObject();
43
44             final int size = in.readInt();
45             var localShardSnapshots = new ArrayList<ShardSnapshot>(size);
46             for (int i = 0; i < size; i++) {
47                 localShardSnapshots.add((ShardSnapshot) in.readObject());
48             }
49
50             resolveTo(new DatastoreSnapshot(type, snapshot, localShardSnapshots));
51         }
52
53         @Override
54         default void writeExternal(final ObjectOutput out) throws IOException {
55             final var datastoreSnapshot = datastoreSnapshot();
56             out.writeObject(datastoreSnapshot.type);
57             out.writeObject(datastoreSnapshot.shardManagerSnapshot);
58
59             out.writeInt(datastoreSnapshot.shardSnapshots.size());
60             for (ShardSnapshot shardSnapshot: datastoreSnapshot.shardSnapshots) {
61                 out.writeObject(shardSnapshot);
62             }
63         }
64     }
65
66     private static final class Proxy implements SerialForm {
67         private static final long serialVersionUID = 1L;
68
69         private DatastoreSnapshot datastoreSnapshot;
70
71         // checkstyle flags the public modifier as redundant which really doesn't make sense since it clearly isn't
72         // redundant. It is explicitly needed for Java serialization to be able to create instances via reflection.
73         @SuppressWarnings("checkstyle:RedundantModifier")
74         public Proxy() {
75             // For Externalizable
76         }
77
78         Proxy(final DatastoreSnapshot datastoreSnapshot) {
79             this.datastoreSnapshot = requireNonNull(datastoreSnapshot);
80         }
81
82         @Override
83         public DatastoreSnapshot datastoreSnapshot() {
84             return datastoreSnapshot;
85         }
86
87         @Override
88         public void resolveTo(final DatastoreSnapshot newDatastoreSnapshot) {
89             datastoreSnapshot = requireNonNull(newDatastoreSnapshot);
90         }
91
92         @Override
93         public Object readResolve() {
94             return verifyNotNull(datastoreSnapshot);
95         }
96     }
97
98     private static final long serialVersionUID = 1L;
99
100     private final @NonNull String type;
101     private final ShardManagerSnapshot shardManagerSnapshot;
102     private final @NonNull ImmutableList<ShardSnapshot> shardSnapshots;
103
104     public DatastoreSnapshot(final @NonNull String type, final @Nullable ShardManagerSnapshot shardManagerSnapshot,
105             final @NonNull List<ShardSnapshot> shardSnapshots) {
106         this.type = requireNonNull(type);
107         this.shardManagerSnapshot = shardManagerSnapshot;
108         this.shardSnapshots = ImmutableList.copyOf(shardSnapshots);
109     }
110
111     public @NonNull String getType() {
112         return type;
113     }
114
115     public @Nullable ShardManagerSnapshot getShardManagerSnapshot() {
116         return shardManagerSnapshot;
117     }
118
119     public @NonNull List<ShardSnapshot> getShardSnapshots() {
120         return shardSnapshots;
121     }
122
123     private Object writeReplace() {
124         return new Proxy(this);
125     }
126
127     public static final class ShardSnapshot implements Serializable {
128         interface SerialForm extends Externalizable {
129
130             ShardSnapshot shardSnapshot();
131
132             Object readResolve();
133
134             void resolveTo(String name, Snapshot snapshot);
135
136             @Override
137             default void writeExternal(final ObjectOutput out) throws IOException {
138                 final var shardSnapshot = shardSnapshot();
139                 out.writeObject(shardSnapshot.name);
140                 out.writeObject(shardSnapshot.snapshot);
141             }
142
143             @Override
144             default void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
145                 resolveTo((String) in.readObject(), (Snapshot) in.readObject());
146             }
147         }
148
149         private static final class Proxy implements SerialForm {
150             private static final long serialVersionUID = 1L;
151
152             private ShardSnapshot shardSnapshot;
153
154             // checkstyle flags the public modifier as redundant which really doesn't make sense since it clearly isn't
155             // redundant. It is explicitly needed for Java serialization to be able to create instances via reflection.
156             @SuppressWarnings("checkstyle:RedundantModifier")
157             public Proxy() {
158                 // For Externalizable
159             }
160
161             Proxy(final ShardSnapshot shardSnapshot) {
162                 this.shardSnapshot = shardSnapshot;
163             }
164
165             @Override
166             public ShardSnapshot shardSnapshot() {
167                 return shardSnapshot;
168             }
169
170             @Override
171             public void resolveTo(final String name, final Snapshot snapshot) {
172                 shardSnapshot = new ShardSnapshot(name, snapshot);
173             }
174
175             @Override
176             public Object readResolve() {
177                 return verifyNotNull(shardSnapshot);
178             }
179         }
180
181         private static final long serialVersionUID = 1L;
182
183         private final @NonNull String name;
184         private final @NonNull Snapshot snapshot;
185
186         public ShardSnapshot(final @NonNull String name, final @NonNull Snapshot snapshot) {
187             this.name = requireNonNull(name);
188             this.snapshot = requireNonNull(snapshot);
189         }
190
191         public @NonNull String getName() {
192             return name;
193         }
194
195         public @NonNull Snapshot getSnapshot() {
196             return snapshot;
197         }
198
199         private Object writeReplace() {
200             return new Proxy(this);
201         }
202     }
203 }