Use arrow cases in mdsal-replicate-netty
[mdsal.git] / replicate / mdsal-replicate-netty / src / main / java / org / opendaylight / mdsal / replicate / netty / SinkRequestHandler.java
index 7ead9c26e251e643ac94e8cf18685133ce3e9b69..759472cef3c364f4aed3a6b46739f990b36b64f8 100644 (file)
@@ -27,16 +27,21 @@ import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
 import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
 import org.opendaylight.mdsal.replicate.common.DataTreeCandidateUtils;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.ReusableStreamReceiver;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
 import org.opendaylight.yangtools.yang.data.codec.binfmt.DataTreeCandidateInputOutput;
 import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeDataInput;
+import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 import org.opendaylight.yangtools.yang.data.impl.schema.ReusableImmutableNormalizedNodeStreamWriter;
+import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidate;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 final class SinkRequestHandler extends SimpleChannelInboundHandler<ByteBuf> {
     private static final Logger LOG = LoggerFactory.getLogger(SinkRequestHandler.class);
+    private static final ContainerNode EMPTY_ROOT = ImmutableNodes.containerNode(SchemaContext.NAME);
 
     private final ReusableStreamReceiver receiver = ReusableImmutableNormalizedNodeStreamWriter.create();
     private final List<ByteBuf> chunks = new ArrayList<>();
@@ -56,23 +61,25 @@ final class SinkRequestHandler extends SimpleChannelInboundHandler<ByteBuf> {
         final Channel channel = ctx.channel();
         LOG.trace("Channel {} received message type {}", channel, msgType);
         switch (msgType) {
-            case Constants.MSG_EMPTY_DATA:
-                handleEmptyData();
-                break;
-            case Constants.MSG_DTC_CHUNK:
-                chunks.add(msg);
-                break;
-            case Constants.MSG_DTC_APPLY:
-                handleDtcApply();
-                break;
-            default:
-                throw new IllegalStateException("Unexpected message type " + msgType);
+            case Constants.MSG_EMPTY_DATA -> handleEmptyData();
+            case Constants.MSG_DTC_CHUNK -> chunks.add(msg.retain());
+            case Constants.MSG_DTC_APPLY -> handleDtcApply();
+            case Constants.MSG_PING -> {
+                LOG.trace("Received PING from Source, sending PONG");
+                ctx.channel().writeAndFlush(Constants.PONG);
+            }
+            default -> throw new IllegalStateException("Unexpected message type " + msgType);
         }
     }
 
     private void handleEmptyData() {
         final DOMDataTreeWriteTransaction tx = chain.newWriteOnlyTransaction();
-        tx.delete(tree.getDatastoreType(), tree.getRootIdentifier());
+
+        if (tree.getRootIdentifier().isEmpty()) {
+            tx.put(tree.getDatastoreType(), YangInstanceIdentifier.empty(), EMPTY_ROOT);
+        } else {
+            tx.delete(tree.getDatastoreType(), tree.getRootIdentifier());
+        }
         commit(tx);
     }