Modernize DataTreeCandidateInputOutput 76/106776/3
authorRobert Varga <robert.varga@pantheon.tech>
Sat, 1 Jul 2023 17:45:46 +0000 (19:45 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Sun, 2 Jul 2023 08:59:49 +0000 (10:59 +0200)
Use local variable type inference and use records.

Change-Id: Iac4a7325d922cde24ed9180c2db4dcea09c3b8f4
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardDataTree.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/actors/JsonExportActor.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/DataTreeCandidateInputOutput.java
opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/persisted/CommitTransactionPayloadTest.java

index 1cc97ac0442cb182f4426e964442970b101678a1..9c1e856d7667a7fe6454b8990c74e62d3f5cca6e 100644 (file)
@@ -263,14 +263,14 @@ public class ShardDataTree extends ShardDataTreeTransactionParent {
         }
 
         final Map<Class<? extends ShardDataTreeSnapshotMetadata<?>>, ShardDataTreeSnapshotMetadata<?>> snapshotMeta;
-        if (snapshot instanceof MetadataShardDataTreeSnapshot) {
-            snapshotMeta = ((MetadataShardDataTreeSnapshot) snapshot).getMetadata();
+        if (snapshot instanceof MetadataShardDataTreeSnapshot metaSnapshot) {
+            snapshotMeta = metaSnapshot.getMetadata();
         } else {
             snapshotMeta = ImmutableMap.of();
         }
 
-        for (ShardDataTreeMetadata<?> m : metadata) {
-            final ShardDataTreeSnapshotMetadata<?> s = snapshotMeta.get(m.getSupportedType());
+        for (var m : metadata) {
+            final var s = snapshotMeta.get(m.getSupportedType());
             if (s != null) {
                 m.applySnapshot(s);
             } else {
@@ -283,11 +283,11 @@ public class ShardDataTree extends ShardDataTreeTransactionParent {
         // delete everything first
         mod.delete(YangInstanceIdentifier.of());
 
-        final Optional<NormalizedNode> maybeNode = snapshot.getRootNode();
-        if (maybeNode.isPresent()) {
+        snapshot.getRootNode().ifPresent(rootNode -> {
             // Add everything from the remote node back
-            mod.write(YangInstanceIdentifier.of(), maybeNode.orElseThrow());
-        }
+            mod.write(YangInstanceIdentifier.of(), rootNode);
+        });
+
         mod.ready();
 
         dataTree.validate(unwrapped);
@@ -336,9 +336,9 @@ public class ShardDataTree extends ShardDataTreeTransactionParent {
         final Entry<TransactionIdentifier, DataTreeCandidateWithVersion> entry = payload.acquireCandidate();
         final DataTreeModification unwrapped = newModification();
         final PruningDataTreeModification mod = createPruningModification(unwrapped,
-            NormalizedNodeStreamVersion.MAGNESIUM.compareTo(entry.getValue().getVersion()) > 0);
+            NormalizedNodeStreamVersion.MAGNESIUM.compareTo(entry.getValue().version()) > 0);
 
-        DataTreeCandidates.applyToModification(mod, entry.getValue().getCandidate());
+        DataTreeCandidates.applyToModification(mod, entry.getValue().candidate());
         mod.ready();
         LOG.trace("{}: Applying recovery modification {}", logContext, unwrapped);
 
@@ -375,20 +375,20 @@ public class ShardDataTree extends ShardDataTreeTransactionParent {
      * @throws DataValidationFailedException when the snapshot fails to apply
      */
     final void applyRecoveryPayload(final @NonNull Payload payload) throws IOException {
-        if (payload instanceof CommitTransactionPayload) {
-            applyRecoveryCandidate((CommitTransactionPayload) payload);
-        } else if (payload instanceof AbortTransactionPayload) {
-            allMetadataAbortedTransaction(((AbortTransactionPayload) payload).getIdentifier());
-        } else if (payload instanceof PurgeTransactionPayload) {
-            allMetadataPurgedTransaction(((PurgeTransactionPayload) payload).getIdentifier());
-        } else if (payload instanceof CreateLocalHistoryPayload) {
-            allMetadataCreatedLocalHistory(((CreateLocalHistoryPayload) payload).getIdentifier());
-        } else if (payload instanceof CloseLocalHistoryPayload) {
-            allMetadataClosedLocalHistory(((CloseLocalHistoryPayload) payload).getIdentifier());
-        } else if (payload instanceof PurgeLocalHistoryPayload) {
-            allMetadataPurgedLocalHistory(((PurgeLocalHistoryPayload) payload).getIdentifier());
-        } else if (payload instanceof SkipTransactionsPayload) {
-            allMetadataSkipTransactions((SkipTransactionsPayload) payload);
+        if (payload instanceof CommitTransactionPayload commit) {
+            applyRecoveryCandidate(commit);
+        } else if (payload instanceof AbortTransactionPayload abort) {
+            allMetadataAbortedTransaction(abort.getIdentifier());
+        } else if (payload instanceof PurgeTransactionPayload purge) {
+            allMetadataPurgedTransaction(purge.getIdentifier());
+        } else if (payload instanceof CreateLocalHistoryPayload create) {
+            allMetadataCreatedLocalHistory(create.getIdentifier());
+        } else if (payload instanceof CloseLocalHistoryPayload close) {
+            allMetadataClosedLocalHistory(close.getIdentifier());
+        } else if (payload instanceof PurgeLocalHistoryPayload purge) {
+            allMetadataPurgedLocalHistory(purge.getIdentifier());
+        } else if (payload instanceof SkipTransactionsPayload skip) {
+            allMetadataSkipTransactions(skip);
         } else {
             LOG.debug("{}: ignoring unhandled payload {}", logContext, payload);
         }
@@ -402,7 +402,7 @@ public class ShardDataTree extends ShardDataTreeTransactionParent {
 
         final DataTreeModification mod = newModification();
         // TODO: check version here, which will enable us to perform forward-compatibility transformations
-        DataTreeCandidates.applyToModification(mod, entry.getValue().getCandidate());
+        DataTreeCandidates.applyToModification(mod, entry.getValue().candidate());
         mod.ready();
 
         LOG.trace("{}: Applying foreign modification {}", logContext, mod);
@@ -436,52 +436,51 @@ public class ShardDataTree extends ShardDataTreeTransactionParent {
          * In any case, we know that this is an entry coming from replication, hence we can be sure we will not observe
          * pre-Boron state -- which limits the number of options here.
          */
-        if (payload instanceof CommitTransactionPayload) {
+        if (payload instanceof CommitTransactionPayload commit) {
             if (identifier == null) {
-                applyReplicatedCandidate((CommitTransactionPayload) payload);
+                applyReplicatedCandidate(commit);
             } else {
                 verify(identifier instanceof TransactionIdentifier);
                 // if we did not track this transaction before, it means that it came from another leader and we are in
                 // the process of commiting it while in PreLeader state. That means that it hasnt yet been committed to
                 // the local DataTree and would be lost if it was only applied via payloadReplicationComplete().
                 if (!payloadReplicationComplete((TransactionIdentifier) identifier)) {
-                    applyReplicatedCandidate((CommitTransactionPayload) payload);
+                    applyReplicatedCandidate(commit);
                 }
             }
 
             // make sure acquireCandidate() is the last call touching the payload data as we want it to be GC-ed.
-            checkRootOverwrite(((CommitTransactionPayload) payload).acquireCandidate().getValue()
-                    .getCandidate());
-        } else if (payload instanceof AbortTransactionPayload) {
+            checkRootOverwrite(((CommitTransactionPayload) payload).acquireCandidate().getValue().candidate());
+        } else if (payload instanceof AbortTransactionPayload abort) {
             if (identifier != null) {
-                payloadReplicationComplete((AbortTransactionPayload) payload);
+                payloadReplicationComplete(abort);
             }
-            allMetadataAbortedTransaction(((AbortTransactionPayload) payload).getIdentifier());
-        } else if (payload instanceof PurgeTransactionPayload) {
+            allMetadataAbortedTransaction(abort.getIdentifier());
+        } else if (payload instanceof PurgeTransactionPayload purge) {
             if (identifier != null) {
-                payloadReplicationComplete((PurgeTransactionPayload) payload);
+                payloadReplicationComplete(purge);
             }
-            allMetadataPurgedTransaction(((PurgeTransactionPayload) payload).getIdentifier());
-        } else if (payload instanceof CloseLocalHistoryPayload) {
+            allMetadataPurgedTransaction(purge.getIdentifier());
+        } else if (payload instanceof CloseLocalHistoryPayload close) {
             if (identifier != null) {
-                payloadReplicationComplete((CloseLocalHistoryPayload) payload);
+                payloadReplicationComplete(close);
             }
-            allMetadataClosedLocalHistory(((CloseLocalHistoryPayload) payload).getIdentifier());
-        } else if (payload instanceof CreateLocalHistoryPayload) {
+            allMetadataClosedLocalHistory(close.getIdentifier());
+        } else if (payload instanceof CreateLocalHistoryPayload create) {
             if (identifier != null) {
-                payloadReplicationComplete((CreateLocalHistoryPayload)payload);
+                payloadReplicationComplete(create);
             }
-            allMetadataCreatedLocalHistory(((CreateLocalHistoryPayload) payload).getIdentifier());
-        } else if (payload instanceof PurgeLocalHistoryPayload) {
+            allMetadataCreatedLocalHistory(create.getIdentifier());
+        } else if (payload instanceof PurgeLocalHistoryPayload purge) {
             if (identifier != null) {
-                payloadReplicationComplete((PurgeLocalHistoryPayload)payload);
+                payloadReplicationComplete(purge);
             }
-            allMetadataPurgedLocalHistory(((PurgeLocalHistoryPayload) payload).getIdentifier());
-        } else if (payload instanceof SkipTransactionsPayload) {
+            allMetadataPurgedLocalHistory(purge.getIdentifier());
+        } else if (payload instanceof SkipTransactionsPayload skip) {
             if (identifier != null) {
-                payloadReplicationComplete((SkipTransactionsPayload)payload);
+                payloadReplicationComplete(skip);
             }
-            allMetadataSkipTransactions((SkipTransactionsPayload) payload);
+            allMetadataSkipTransactions(skip);
         } else {
             LOG.warn("{}: ignoring unhandled identifier {} payload {}", logContext, identifier, payload);
         }
index fafa7d94a349f43ec849109420f90ee94f3b6007..938bb006c4c67be1d7e5cc901e8da52f0d3dc02c 100644 (file)
@@ -123,8 +123,7 @@ public final class JsonExportActor extends AbstractUntypedActor {
         try (JsonWriter jsonWriter = new JsonWriter(Files.newBufferedWriter(path))) {
             jsonWriter.beginObject();
 
-            try (NormalizedNodeWriter nnWriter = NormalizedNodeWriter.forStreamWriter(
-                JSONNormalizedNodeStreamWriter.createNestedWriter(
+            try (var nnWriter = NormalizedNodeWriter.forStreamWriter(JSONNormalizedNodeStreamWriter.createNestedWriter(
                     JSONCodecFactorySupplier.RFC7951.getShared(schemaContext),
                     SchemaInferenceStack.of(schemaContext).toInference(), null, jsonWriter),
                 true)) {
@@ -143,11 +142,10 @@ public final class JsonExportActor extends AbstractUntypedActor {
         try (JsonWriter jsonWriter = new JsonWriter(Files.newBufferedWriter(path))) {
             jsonWriter.beginObject().name("Entries");
             jsonWriter.beginArray();
-            for (ReplicatedLogEntry entry : entries) {
+            for (var entry : entries) {
                 final var data = entry.getData();
-                if (data instanceof CommitTransactionPayload) {
-                    final CommitTransactionPayload payload = (CommitTransactionPayload) entry.getData();
-                    final DataTreeCandidate candidate = payload.getCandidate().getValue().getCandidate();
+                if (data instanceof CommitTransactionPayload payload) {
+                    final var candidate = payload.getCandidate().getValue().candidate();
                     writeNode(jsonWriter, candidate);
                 } else {
                     jsonWriter.beginObject().name("Payload").value(data.toString()).endObject();
@@ -161,12 +159,9 @@ public final class JsonExportActor extends AbstractUntypedActor {
     }
 
     private static void writeNode(final JsonWriter writer, final DataTreeCandidate candidate) throws IOException {
-        writer.beginObject();
-        writer.name("Entry");
-        writer.beginArray();
+        writer.beginObject().name("Entry").beginArray();
         doWriteNode(writer, candidate.getRootPath(), candidate.getRootNode());
-        writer.endArray();
-        writer.endObject();
+        writer.endArray().endObject();
     }
 
     private static void doWriteNode(final JsonWriter writer, final YangInstanceIdentifier path,
@@ -238,8 +233,8 @@ public final class JsonExportActor extends AbstractUntypedActor {
 
         NodeIterator next(final JsonWriter writer) throws IOException {
             while (iterator.hasNext()) {
-                final DataTreeCandidateNode node = iterator.next();
-                final YangInstanceIdentifier child = path.node(node.name());
+                final var node = iterator.next();
+                final var child = path.node(node.name());
 
                 switch (node.modificationType()) {
                     case APPEARED:
index e48263400f19fa71ac6a7ec9f16f303c3f05d4a8..a5a76e06af8af2c9eda5daf6d40b9d9eecaa851c 100644 (file)
@@ -11,16 +11,14 @@ import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableList;
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
-import org.eclipse.jdt.annotation.NonNullByDefault;
+import java.util.List;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.concepts.Immutable;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.ReusableStreamReceiver;
 import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeDataInput;
 import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeDataOutput;
@@ -36,11 +34,18 @@ import org.slf4j.LoggerFactory;
 /**
  * Utility serialization/deserialization for {@link DataTreeCandidate}. Note that this utility does not maintain
  * before-image information across serialization.
- *
- * @author Robert Varga
  */
 @Beta
 public final class DataTreeCandidateInputOutput {
+    public record DataTreeCandidateWithVersion(
+            @NonNull DataTreeCandidate candidate,
+            @NonNull NormalizedNodeStreamVersion version) implements Immutable {
+        public DataTreeCandidateWithVersion {
+            requireNonNull(candidate);
+            requireNonNull(version);
+        }
+    }
+
     private static final Logger LOG = LoggerFactory.getLogger(DataTreeCandidateInputOutput.class);
     private static final byte DELETE = 0;
     private static final byte SUBTREE_MODIFIED = 1;
@@ -55,26 +60,26 @@ public final class DataTreeCandidateInputOutput {
 
     private static DataTreeCandidateNode readModifiedNode(final ModificationType type, final NormalizedNodeDataInput in,
             final ReusableStreamReceiver receiver) throws IOException {
-        final PathArgument identifier = in.readPathArgument();
-        final Collection<DataTreeCandidateNode> children = readChildren(in, receiver);
+        final var pathArg = in.readPathArgument();
+        final var children = readChildren(in, receiver);
         if (children.isEmpty()) {
-            LOG.debug("Modified node {} does not have any children, not instantiating it", identifier);
+            LOG.debug("Modified node {} does not have any children, not instantiating it", pathArg);
             return null;
         }
 
-        return ModifiedDataTreeCandidateNode.create(identifier, type, children);
+        return ModifiedDataTreeCandidateNode.create(pathArg, type, children);
     }
 
-    private static Collection<DataTreeCandidateNode> readChildren(final NormalizedNodeDataInput in,
+    private static List<DataTreeCandidateNode> readChildren(final NormalizedNodeDataInput in,
             final ReusableStreamReceiver receiver) throws IOException {
         final int size = in.readInt();
         if (size == 0) {
-            return ImmutableList.of();
+            return List.of();
         }
 
-        final Collection<DataTreeCandidateNode> ret = new ArrayList<>(size);
+        final var ret = new ArrayList<DataTreeCandidateNode>(size);
         for (int i = 0; i < size; ++i) {
-            final DataTreeCandidateNode child = readNode(in, receiver);
+            final var child = readNode(in, receiver);
             if (child != null) {
                 ret.add(child);
             }
@@ -96,40 +101,20 @@ public final class DataTreeCandidateInputOutput {
         };
     }
 
-    @NonNullByDefault
-    public static final class DataTreeCandidateWithVersion implements Immutable {
-        private final DataTreeCandidate candidate;
-        private final NormalizedNodeStreamVersion version;
-
-        public DataTreeCandidateWithVersion(final DataTreeCandidate candidate,
-                final NormalizedNodeStreamVersion version) {
-            this.candidate = requireNonNull(candidate);
-            this.version = requireNonNull(version);
-        }
-
-        public DataTreeCandidate getCandidate() {
-            return candidate;
-        }
-
-        public NormalizedNodeStreamVersion getVersion() {
-            return version;
-        }
-    }
-
     public static DataTreeCandidateWithVersion readDataTreeCandidate(final DataInput in,
             final ReusableStreamReceiver receiver) throws IOException {
-        final NormalizedNodeDataInput reader = NormalizedNodeDataInput.newDataInput(in);
-        final YangInstanceIdentifier rootPath = reader.readYangInstanceIdentifier();
+        final var reader = NormalizedNodeDataInput.newDataInput(in);
+        final var rootPath = reader.readYangInstanceIdentifier();
         final byte type = reader.readByte();
 
         final DataTreeCandidateNode rootNode = switch (type) {
             case APPEARED -> ModifiedDataTreeCandidateNode.create(ModificationType.APPEARED,
-                                readChildren(reader, receiver));
+                readChildren(reader, receiver));
             case DELETE -> DeletedDataTreeCandidateNode.create();
             case DISAPPEARED -> ModifiedDataTreeCandidateNode.create(ModificationType.DISAPPEARED,
-                                readChildren(reader, receiver));
+                readChildren(reader, receiver));
             case SUBTREE_MODIFIED -> ModifiedDataTreeCandidateNode.create(ModificationType.SUBTREE_MODIFIED,
-                                    readChildren(reader, receiver));
+                readChildren(reader, receiver));
             case WRITE -> DataTreeCandidateNodes.written(reader.readNormalizedNode(receiver));
             case UNMODIFIED -> AbstractDataTreeCandidateNode.createUnmodified();
             default -> throw new IllegalArgumentException("Unhandled node type " + type);
@@ -141,7 +126,7 @@ public final class DataTreeCandidateInputOutput {
     private static void writeChildren(final NormalizedNodeDataOutput out,
             final Collection<DataTreeCandidateNode> children) throws IOException {
         out.writeInt(children.size());
-        for (DataTreeCandidateNode child : children) {
+        for (var child : children) {
             writeNode(out, child);
         }
     }
@@ -149,69 +134,61 @@ public final class DataTreeCandidateInputOutput {
     private static void writeNode(final NormalizedNodeDataOutput out, final DataTreeCandidateNode node)
             throws IOException {
         switch (node.modificationType()) {
-            case APPEARED:
+            case APPEARED -> {
                 out.writeByte(APPEARED);
                 out.writePathArgument(node.name());
                 writeChildren(out, node.childNodes());
-                break;
-            case DELETE:
+            }
+            case DELETE -> {
                 out.writeByte(DELETE);
                 out.writePathArgument(node.name());
-                break;
-            case DISAPPEARED:
+            }
+            case DISAPPEARED -> {
                 out.writeByte(DISAPPEARED);
                 out.writePathArgument(node.name());
                 writeChildren(out, node.childNodes());
-                break;
-            case SUBTREE_MODIFIED:
+            }
+            case SUBTREE_MODIFIED -> {
                 out.writeByte(SUBTREE_MODIFIED);
                 out.writePathArgument(node.name());
                 writeChildren(out, node.childNodes());
-                break;
-            case WRITE:
+            }
+            case WRITE -> {
                 out.writeByte(WRITE);
                 out.writeNormalizedNode(node.getDataAfter());
-                break;
-            case UNMODIFIED:
-                out.writeByte(UNMODIFIED);
-                break;
-            default:
-                throwUnhandledNodeType(node);
+            }
+            case UNMODIFIED -> out.writeByte(UNMODIFIED);
+            default -> throwUnhandledNodeType(node);
         }
     }
 
     @VisibleForTesting
     public static void writeDataTreeCandidate(final DataOutput out, final PayloadVersion version,
             final DataTreeCandidate candidate) throws IOException {
-        try (NormalizedNodeDataOutput writer = version.getStreamVersion().newDataOutput(out)) {
+        try (var writer = version.getStreamVersion().newDataOutput(out)) {
             writer.writeYangInstanceIdentifier(candidate.getRootPath());
 
-            final DataTreeCandidateNode node = candidate.getRootNode();
+            final var node = candidate.getRootNode();
             switch (node.modificationType()) {
-                case APPEARED:
+                case APPEARED -> {
                     writer.writeByte(APPEARED);
                     writeChildren(writer, node.childNodes());
-                    break;
-                case DELETE:
-                    writer.writeByte(DELETE);
-                    break;
-                case DISAPPEARED:
+                }
+                case DELETE -> writer.writeByte(DELETE);
+                case DISAPPEARED -> {
                     writer.writeByte(DISAPPEARED);
                     writeChildren(writer, node.childNodes());
-                    break;
-                case SUBTREE_MODIFIED:
+                }
+                case SUBTREE_MODIFIED -> {
                     writer.writeByte(SUBTREE_MODIFIED);
                     writeChildren(writer, node.childNodes());
-                    break;
-                case UNMODIFIED:
-                    writer.writeByte(UNMODIFIED);
-                    break;
-                case WRITE:
+                }
+                case UNMODIFIED -> writer.writeByte(UNMODIFIED);
+                case WRITE -> {
                     writer.writeByte(WRITE);
                     writer.writeNormalizedNode(node.getDataAfter());
-                    break;
-                default:
-                    throwUnhandledNodeType(node);
+                }
+                default -> throwUnhandledNodeType(node);
             }
         }
     }
index f2d551818d48774ceeb64543645a2aedcb0cffa1..8147e0c562c8e9e5530d9bfe4e7ba61cbb583821 100644 (file)
@@ -68,7 +68,7 @@ public class CommitTransactionPayloadTest extends AbstractTest {
 
     private static void assertCandidateEquals(final DataTreeCandidate expected,
             final DataTreeCandidateWithVersion actual) {
-        final DataTreeCandidate candidate = actual.getCandidate();
+        final var candidate = actual.candidate();
         assertEquals("root path", expected.getRootPath(), candidate.getRootPath());
         assertCandidateNodeEquals(expected.getRootNode(), candidate.getRootNode());
     }