Bug 9244: Fix deviate replace of implicit substatements
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / DeviateStatementImpl.java
index d947b7d407c5d904c5e93591d96f3ef5028d4c03..b87656fd100a4e5e65a96c51d7165fedb170ea44 100644 (file)
@@ -102,6 +102,9 @@ public class DeviateStatementImpl extends AbstractDeclaredStatement<DeviateKind>
                 YangStmtMapping.UNITS, YangStmtMapping.CONFIG, YangStmtMapping.MANDATORY,
                 YangStmtMapping.MIN_ELEMENTS, YangStmtMapping.MAX_ELEMENTS);
 
+        private static final Set<YangStmtMapping> IMPLICIT_STATEMENTS = ImmutableSet.of(YangStmtMapping.CONFIG,
+                YangStmtMapping.MANDATORY, YangStmtMapping.MAX_ELEMENTS, YangStmtMapping.MIN_ELEMENTS);
+
         public Definition() {
             super(YangStmtMapping.DEVIATE);
         }
@@ -267,6 +270,14 @@ public class DeviateStatementImpl extends AbstractDeclaredStatement<DeviateKind>
                 }
             }
 
+            // This is a special case when deviate replace of a config/mandatory/max/min-elements substatement targets
+            // a node which does not contain an explicitly declared config/mandatory/max/min-elements.
+            // However, according to RFC6020/RFC7950, these properties are always implicitly present.
+            if (IMPLICIT_STATEMENTS.contains(stmtToBeReplaced)) {
+                addStatement(stmtCtxToBeReplaced, targetCtx);
+                return;
+            }
+
             throw new InferenceException(stmtCtxToBeReplaced.getStatementSourceReference(), "Deviation cannot replace "
                     + "substatement %s in target node %s because it does not exist in target node.",
                     stmtToBeReplaced.getStatementName(), targetCtx.getStatementArgument());