+public abstract class PruningDataTreeModification extends ForwardingObject implements DataTreeModification {
+ /**
+ * A PruningDataTreeModification which always performs pruning before attempting an operation. This sacrifices
+ * performance to ensure all data has passed through the pruner -- such that data adaptations are performed.
+ */
+ public static final class Proactive extends PruningDataTreeModification {
+ public Proactive(final DataTreeModification delegate, final DataTree dataTree,
+ final ReusableNormalizedNodePruner pruner) {
+ super(delegate, dataTree, pruner);
+ }
+
+ @Override
+ public void merge(final YangInstanceIdentifier path, final NormalizedNode<?, ?> data) {
+ pruneAndMergeNode(path, data);
+ }
+
+ @Override
+ public void write(final YangInstanceIdentifier path, final NormalizedNode<?, ?> data) {
+ pruneAndWriteNode(path, data);
+ }
+
+ @Override
+ PruningDataTreeModification createNew(final DataTreeModification delegate, final DataTree dataTree,
+ final ReusableNormalizedNodePruner pruner) {
+ return new Proactive(delegate, dataTree, pruner);
+ }
+ }
+
+ /**
+ * A PruningDataTreeModification which performs pruning only when an operation results in an
+ * {@link SchemaValidationFailedException}. This offers superior performance in the normal case of not needing
+ * pruning.
+ */
+ public static final class Reactive extends PruningDataTreeModification {
+ public Reactive(final DataTreeModification delegate, final DataTree dataTree,
+ final ReusableNormalizedNodePruner pruner) {
+ super(delegate, dataTree, pruner);
+ }
+
+ @Override
+ public void merge(final YangInstanceIdentifier path, final NormalizedNode<?, ?> data) {
+ if (path.isEmpty()) {
+ pruneAndMergeNode(path, data);
+ return;
+ }
+
+ try {
+ delegate().merge(path, data);
+ } catch (SchemaValidationFailedException e) {
+ LOG.warn("Node at path {} was pruned during merge due to validation error: {}", path, e.getMessage());
+ pruneAndMergeNode(path, data);
+ }
+ }
+
+ @Override
+ public void write(final YangInstanceIdentifier path, final NormalizedNode<?, ?> data) {
+ if (path.isEmpty()) {
+ pruneAndWriteNode(path, data);
+ return;
+ }
+
+ try {
+ delegate().write(path, data);
+ } catch (SchemaValidationFailedException e) {
+ LOG.warn("Node at path : {} was pruned during write due to validation error: {}", path, e.getMessage());
+ pruneAndWriteNode(path, data);
+ }
+ }
+
+ @Override
+ PruningDataTreeModification createNew(final DataTreeModification delegate, final DataTree dataTree,
+ final ReusableNormalizedNodePruner pruner) {
+ return new Reactive(delegate, dataTree, pruner);
+ }
+ }
+