BUG 2970 : Recovery fails with SchemaValidationException when removing modules
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / utils / PruningDataTreeModification.java
index cc976b381f98b7c76b9811f28aa6dbf5e1cfbe04..d59e5643458b5184ced5ff35eab2baa4dbca4fb7 100644 (file)
@@ -50,41 +50,57 @@ public class PruningDataTreeModification implements DataTreeModification {
     @Override
     public void merge(YangInstanceIdentifier yangInstanceIdentifier, NormalizedNode<?, ?> normalizedNode) {
         try {
-            delegate.merge(yangInstanceIdentifier, normalizedNode);
+            if(YangInstanceIdentifier.EMPTY.equals(yangInstanceIdentifier)){
+                pruneAndMergeNode(yangInstanceIdentifier, normalizedNode);
+            } else {
+                delegate.merge(yangInstanceIdentifier, normalizedNode);
+            }
         } catch (SchemaValidationFailedException e){
             if(!isValidYangInstanceIdentifier(yangInstanceIdentifier)){
                 LOG.warn("Invalid node identifier {} ignoring merge", yangInstanceIdentifier);
                 return;
             }
 
-            LOG.warn("Node at path : {} was pruned during merge", yangInstanceIdentifier);
+            pruneAndMergeNode(yangInstanceIdentifier, normalizedNode);
+        }
+
+    }
 
-            NormalizedNode<?,?> pruned = pruneNormalizedNode(normalizedNode);
+    private void pruneAndMergeNode(YangInstanceIdentifier yangInstanceIdentifier, NormalizedNode<?, ?> normalizedNode) {
+        LOG.warn("Node at path : {} was pruned during merge", yangInstanceIdentifier);
 
-            if(pruned != null) {
-                delegate.merge(yangInstanceIdentifier, pruned);
-            }
-        }
+        NormalizedNode<?,?> pruned = pruneNormalizedNode(normalizedNode);
 
+        if(pruned != null) {
+            delegate.merge(yangInstanceIdentifier, pruned);
+        }
     }
 
     @Override
     public void write(YangInstanceIdentifier yangInstanceIdentifier, NormalizedNode<?, ?> normalizedNode) {
         try {
-            delegate.write(yangInstanceIdentifier, normalizedNode);
+            if(YangInstanceIdentifier.EMPTY.equals(yangInstanceIdentifier)){
+                pruneAndWriteNode(yangInstanceIdentifier, normalizedNode);
+            } else {
+                delegate.write(yangInstanceIdentifier, normalizedNode);
+            }
         } catch (SchemaValidationFailedException e){
             if(!isValidYangInstanceIdentifier(yangInstanceIdentifier)){
                 LOG.warn("Invalid node identifier {} ignoring write", yangInstanceIdentifier);
                 return;
             }
 
-            LOG.warn("Node at path : {} was pruned during write", yangInstanceIdentifier);
+            pruneAndWriteNode(yangInstanceIdentifier, normalizedNode);
+        }
+    }
+
+    private void pruneAndWriteNode(YangInstanceIdentifier yangInstanceIdentifier, NormalizedNode<?, ?> normalizedNode) {
+        LOG.warn("Node at path : {} was pruned during write", yangInstanceIdentifier);
 
-            NormalizedNode<?,?> pruned = pruneNormalizedNode(normalizedNode);
+        NormalizedNode<?,?> pruned = pruneNormalizedNode(normalizedNode);
 
-            if(pruned != null) {
-                delegate.write(yangInstanceIdentifier, pruned);
-            }
+        if(pruned != null) {
+            delegate.write(yangInstanceIdentifier, pruned);
         }
     }