- private NormalizedNode readStoredNode(final LogicalDatastoreType logicalDatastoreType, final YangInstanceIdentifier path) throws NetconfDocumentedException{
- final DOMDataReadWriteTransaction rwTx = transactionProvider.getOrCreateTransaction();
- final CheckedFuture<Optional<NormalizedNode<?, ?>>, ReadFailedException> readFuture = rwTx.read(logicalDatastoreType, path);
- try {
- if (readFuture.checkedGet().isPresent()) {
- final NormalizedNode node = readFuture.checkedGet().get();
- return node;
- } else {
- LOG.debug("Unable to read node : {} from {} datastore", path, logicalDatastoreType);
+ private void executeOperations(final DataTreeChangeTracker changeTracker) throws DocumentedException {
+ final DOMDataReadWriteTransaction rwTx = transactionProvider.getOrCreateTransaction();
+ final List<DataTreeChange> aa = changeTracker.getDataTreeChanges();
+ final ListIterator<DataTreeChange> iterator = aa.listIterator(aa.size());
+
+ while (iterator.hasPrevious()) {
+ final DataTreeChange dtc = iterator.previous();
+ executeChange(rwTx, dtc);
+ }
+ }
+
+ private void executeChange(final DOMDataReadWriteTransaction rwtx, final DataTreeChange change) throws DocumentedException {
+ switch (change.getAction()) {
+ case NONE:
+ return;
+ case MERGE:
+ rwtx.merge(LogicalDatastoreType.CONFIGURATION, YangInstanceIdentifier.create(change.getPath()), change.getChangeRoot());
+ break;
+ case CREATE:
+ try {
+ final Optional<NormalizedNode<?, ?>> readResult = rwtx.read(LogicalDatastoreType.CONFIGURATION, YangInstanceIdentifier.create(change.getPath())).checkedGet();
+ if (readResult.isPresent()) {
+ throw new DocumentedException("Data already exists, cannot execute CREATE operation", ErrorType.protocol, ErrorTag.data_exists, ErrorSeverity.error);
+ }
+ rwtx.put(LogicalDatastoreType.CONFIGURATION, YangInstanceIdentifier.create(change.getPath()), change.getChangeRoot());
+ } catch (ReadFailedException e) {
+ LOG.warn("Read from datastore failed when trying to read data for create operation", change, e);
+ }
+ break;
+ case REPLACE:
+ rwtx.put(LogicalDatastoreType.CONFIGURATION, YangInstanceIdentifier.create(change.getPath()), change.getChangeRoot());
+ break;
+ case DELETE:
+ try {
+ final Optional<NormalizedNode<?, ?>> readResult = rwtx.read(LogicalDatastoreType.CONFIGURATION, YangInstanceIdentifier.create(change.getPath())).checkedGet();
+ if (!readResult.isPresent()) {
+ throw new DocumentedException("Data is missing, cannot execute DELETE operation", ErrorType.protocol, ErrorTag.data_missing, ErrorSeverity.error);
+ }
+ rwtx.delete(LogicalDatastoreType.CONFIGURATION, YangInstanceIdentifier.create(change.getPath()));
+ } catch (ReadFailedException e) {
+ LOG.warn("Read from datastore failed when trying to read data for delete operation", change, e);