Bug 6329: Parser fails when target node of uses-augment is an unknown node
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / AugmentStatementImpl.java
index 8d2f5e0aeb8207948b78c569eddc8b111b5d8c3d..82f208303d8e04d15399d350c472ae3d072646c9 100644 (file)
@@ -130,7 +130,7 @@ public class AugmentStatementImpl extends AbstractDeclaredStatement<SchemaNodeId
                         AugmentUtils.copyFromSourceToTarget(augmentSourceCtx, augmentTargetCtx);
                         augmentTargetCtx.addEffectiveSubstatement(augmentSourceCtx);
                         updateAugmentOrder(augmentSourceCtx);
-                    } catch (SourceException e) {
+                    } catch (final SourceException e) {
                         LOG.debug("Failed to add augmentation {} defined at {}",
                             augmentTargetCtx.getStatementSourceReference(),
                                 augmentSourceCtx.getStatementSourceReference(), e);
@@ -152,16 +152,31 @@ public class AugmentStatementImpl extends AbstractDeclaredStatement<SchemaNodeId
 
                 @Override
                 public void prerequisiteFailed(final Collection<? extends ModelActionBuilder.Prerequisite<?>> failed) {
+                    /*
+                     * Do not fail, if it is an uses-augment to an unknown node.
+                     */
+                    if (Rfc6020Mapping.USES == augmentNode.getParentContext().getPublicDefinition()) {
+                        final StatementContextBase<?, ?, ?> targetNode = Utils.findNode(getSearchRoot(augmentNode),
+                                augmentNode.getStatementArgument());
+                        if (Utils.isUnknownNode(targetNode)) {
+                            augmentNode.setIsSupportedToBuildEffective(false);
+                            LOG.warn(
+                                    "Uses-augment to unknown node {}. Augmentation has not been performed. At line: {}",
+                                    augmentNode.getStatementArgument(), augmentNode.getStatementSourceReference());
+                            return;
+                        }
+                    }
+
                     throw new InferenceException(augmentNode.getStatementSourceReference(),
-                        "Augment target '%s' not found", augmentNode.getStatementArgument());
+                            "Augment target '%s' not found", augmentNode.getStatementArgument());
                 }
             });
         }
 
         private static Mutable<?, ?, ?> getSearchRoot(final Mutable<?, ?, ?> augmentContext) {
-            Mutable<?, ?, ?> parent = augmentContext.getParentContext();
+            final Mutable<?, ?, ?> parent = augmentContext.getParentContext();
             // Augment is in uses - we need to augment instantiated nodes in parent.
-            if (Rfc6020Mapping.USES.equals(parent.getPublicDefinition())) {
+            if (Rfc6020Mapping.USES == parent.getPublicDefinition()) {
                 return parent.getParentContext();
             }
             return parent;