Improve tests and blueprints of Netty Replication Utility
[mdsal.git] / replicate / mdsal-replicate-netty / src / main / java / org / opendaylight / mdsal / replicate / netty / SinkRequestHandler.java
index 7ead9c26e251e643ac94e8cf18685133ce3e9b69..0b65bc16eeeb9a10ac18256eb2df7cbaa9e60707 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.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<>();
@@ -60,7 +65,7 @@ final class SinkRequestHandler extends SimpleChannelInboundHandler<ByteBuf> {
                 handleEmptyData();
                 break;
             case Constants.MSG_DTC_CHUNK:
-                chunks.add(msg);
+                chunks.add(msg.retain());
                 break;
             case Constants.MSG_DTC_APPLY:
                 handleDtcApply();
@@ -72,7 +77,12 @@ final class SinkRequestHandler extends SimpleChannelInboundHandler<ByteBuf> {
 
     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);
     }