2 * Copyright (c) 2022 PANTHEON.tech, s.r.o. 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.datastore.persisted;
10 import static com.google.common.base.Preconditions.checkArgument;
12 import com.google.common.collect.ImmutableMap;
13 import java.io.Externalizable;
14 import java.io.IOException;
15 import java.io.ObjectInput;
16 import java.io.ObjectOutput;
18 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
19 import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeDataInput;
20 import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeStreamVersion;
21 import org.slf4j.Logger;
22 import org.slf4j.LoggerFactory;
25 * Externalizable proxy for {@link MetadataShardDataTreeSnapshot}.
27 final class MS implements Externalizable {
28 private static final Logger LOG = LoggerFactory.getLogger(MS.class);
30 private static final long serialVersionUID = 1L;
32 private Map<Class<? extends ShardDataTreeSnapshotMetadata<?>>, ShardDataTreeSnapshotMetadata<?>> metadata;
33 private NormalizedNodeStreamVersion version;
34 private NormalizedNode rootNode;
36 @SuppressWarnings("checkstyle:RedundantModifier")
41 MS(final MetadataShardDataTreeSnapshot snapshot) {
42 rootNode = snapshot.getRootNode().orElseThrow();
43 metadata = snapshot.getMetadata();
44 version = snapshot.version().getStreamVersion();
48 public void writeExternal(final ObjectOutput out) throws IOException {
49 out.writeInt(metadata.size());
50 for (var m : metadata.values()) {
53 try (var stream = version.newDataOutput(out)) {
54 stream.writeNormalizedNode(rootNode);
59 public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
60 final int metaSize = in.readInt();
61 checkArgument(metaSize >= 0, "Invalid negative metadata map length %s", metaSize);
63 // Default pre-allocate is 4, which should be fine
64 final var metaBuilder = ImmutableMap
65 .<Class<? extends ShardDataTreeSnapshotMetadata<?>>, ShardDataTreeSnapshotMetadata<?>>builder();
66 for (int i = 0; i < metaSize; ++i) {
67 final var m = (ShardDataTreeSnapshotMetadata<?>) in.readObject();
69 metaBuilder.put(m.getType(), m);
71 LOG.warn("Skipping null metadata");
74 metadata = metaBuilder.build();
76 final var stream = NormalizedNodeDataInput.newDataInput(in);
77 version = stream.getVersion();
78 rootNode = stream.readNormalizedNode();
82 private Object readResolve() {
83 return new MetadataShardDataTreeSnapshot(rootNode, metadata);