Switch ShardSnapshot to new proxy
[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         @Override
79         public DatastoreSnapshot datastoreSnapshot() {
80             return datastoreSnapshot;
81         }
82
83         @Override
84         public void resolveTo(final DatastoreSnapshot newDatastoreSnapshot) {
85             datastoreSnapshot = requireNonNull(newDatastoreSnapshot);
86         }
87
88         @Override
89         public Object readResolve() {
90             return verifyNotNull(datastoreSnapshot);
91         }
92     }
93
94     @java.io.Serial
95     private static final long serialVersionUID = 1L;
96
97     private final @NonNull String type;
98     private final ShardManagerSnapshot shardManagerSnapshot;
99     private final @NonNull ImmutableList<ShardSnapshot> shardSnapshots;
100
101     public DatastoreSnapshot(final @NonNull String type, final @Nullable ShardManagerSnapshot shardManagerSnapshot,
102             final @NonNull List<ShardSnapshot> shardSnapshots) {
103         this.type = requireNonNull(type);
104         this.shardManagerSnapshot = shardManagerSnapshot;
105         this.shardSnapshots = ImmutableList.copyOf(shardSnapshots);
106     }
107
108     public @NonNull String getType() {
109         return type;
110     }
111
112     public @Nullable ShardManagerSnapshot getShardManagerSnapshot() {
113         return shardManagerSnapshot;
114     }
115
116     public @NonNull List<ShardSnapshot> getShardSnapshots() {
117         return shardSnapshots;
118     }
119
120     @java.io.Serial
121     private Object writeReplace() {
122         return new DS(this);
123     }
124
125     public static final class ShardSnapshot implements Serializable {
126         interface SerialForm extends Externalizable {
127
128             ShardSnapshot shardSnapshot();
129
130             Object readResolve();
131
132             void resolveTo(String name, Snapshot snapshot);
133
134             @Override
135             default void writeExternal(final ObjectOutput out) throws IOException {
136                 final var shardSnapshot = shardSnapshot();
137                 out.writeObject(shardSnapshot.name);
138                 out.writeObject(shardSnapshot.snapshot);
139             }
140
141             @Override
142             default void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
143                 resolveTo((String) in.readObject(), (Snapshot) in.readObject());
144             }
145         }
146
147         private static final class Proxy implements SerialForm {
148             @java.io.Serial
149             private static final long serialVersionUID = 1L;
150
151             private ShardSnapshot shardSnapshot;
152
153             // checkstyle flags the public modifier as redundant which really doesn't make sense since it clearly isn't
154             // redundant. It is explicitly needed for Java serialization to be able to create instances via reflection.
155             @SuppressWarnings("checkstyle:RedundantModifier")
156             public Proxy() {
157                 // For Externalizable
158             }
159
160             @Override
161             public ShardSnapshot shardSnapshot() {
162                 return shardSnapshot;
163             }
164
165             @Override
166             public void resolveTo(final String name, final Snapshot snapshot) {
167                 shardSnapshot = new ShardSnapshot(name, snapshot);
168             }
169
170             @Override
171             public Object readResolve() {
172                 return verifyNotNull(shardSnapshot);
173             }
174         }
175
176         @java.io.Serial
177         private static final long serialVersionUID = 1L;
178
179         private final @NonNull String name;
180         private final @NonNull Snapshot snapshot;
181
182         public ShardSnapshot(final @NonNull String name, final @NonNull Snapshot snapshot) {
183             this.name = requireNonNull(name);
184             this.snapshot = requireNonNull(snapshot);
185         }
186
187         public @NonNull String getName() {
188             return name;
189         }
190
191         public @NonNull Snapshot getSnapshot() {
192             return snapshot;
193         }
194
195         @java.io.Serial
196         private Object writeReplace() {
197             return new DSS(this);
198         }
199     }
200 }