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.YangInstanceIdentifier.NodeIdentifier;
+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.ReusableImmutableNormalizedNodeStreamWriter;
+import org.opendaylight.yangtools.yang.data.spi.node.ImmutableNodes;
+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.newContainerBuilder()
+ .withNodeIdentifier(NodeIdentifier.create(SchemaContext.NAME))
+ .build();
private final ReusableStreamReceiver receiver = ReusableImmutableNormalizedNodeStreamWriter.create();
private final List<ByteBuf> chunks = new ArrayList<>();
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());
+ final var tx = chain.newWriteOnlyTransaction();
+
+ if (tree.path().isEmpty()) {
+ tx.put(tree.datastore(), YangInstanceIdentifier.of(), EMPTY_ROOT);
+ } else {
+ tx.delete(tree.datastore(), tree.path());
+ }
commit(tx);
}
}
final DOMDataTreeWriteTransaction tx = chain.newWriteOnlyTransaction();
- DataTreeCandidateUtils.applyToTransaction(tx, tree.getDatastoreType(), candidate);
+ DataTreeCandidateUtils.applyToTransaction(tx, tree.datastore(), candidate);
commit(tx);
}