Bug 4610 - Do not create duplicate declared statements
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / UsesStatementImpl.java
index 8a0a8290d8ccd02fba1b9906b24e31a70dc35d36..36cf90302da9eb1e9e1b830dde32cb1346ef91f1 100644 (file)
@@ -7,18 +7,10 @@
  */
 package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
 
-import static org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase.FULL_DECLARATION;
-
 import java.util.Collection;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping;
-import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
-import org.opendaylight.yangtools.yang.model.api.meta.StatementSource;
 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement;
@@ -34,17 +26,21 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.InferenceAction;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.Prerequisite;
+import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
 import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.UsesEffectiveStatementImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 
 public class UsesStatementImpl extends AbstractDeclaredStatement<QName> implements UsesStatement {
 
     private static final Logger LOG = LoggerFactory.getLogger(UsesStatementImpl.class);
 
-    protected UsesStatementImpl(StmtContext<QName, UsesStatement, ?> context) {
+    protected UsesStatementImpl(final StmtContext<QName, UsesStatement, ?> context) {
         super(context);
     }
 
@@ -56,7 +52,7 @@ public class UsesStatementImpl extends AbstractDeclaredStatement<QName> implemen
         }
 
         @Override
-        public QName parseArgumentValue(StmtContext<?, ?, ?> ctx, String value) {
+        public QName parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
             return Utils.qNameFromArgument(ctx, value);
         }
 
@@ -65,13 +61,17 @@ public class UsesStatementImpl extends AbstractDeclaredStatement<QName> implemen
                 final StmtContext.Mutable<QName, UsesStatement, EffectiveStatement<QName, UsesStatement>> usesNode)
                 throws SourceException {
 
-            ModelActionBuilder usesAction = usesNode.newInferenceAction(FULL_DECLARATION);
+            if(StmtContextUtils.isInExtensionBody(usesNode)) {
+                return;
+            }
+
+            ModelActionBuilder usesAction = usesNode.newInferenceAction(ModelProcessingPhase.EFFECTIVE_MODEL);
             final QName groupingName = usesNode.getStatementArgument();
 
             final Prerequisite<StmtContext<?, ?, ?>> sourceGroupingPre = usesAction.requiresCtx(usesNode,
-                    GroupingNamespace.class, groupingName, FULL_DECLARATION);
-            final Prerequisite<? extends StmtContext.Mutable<?, ?, ?>> targetNodePre = usesAction.mutatesCtx(
-                    usesNode.getParentContext(), FULL_DECLARATION);
+                    GroupingNamespace.class, groupingName, ModelProcessingPhase.EFFECTIVE_MODEL);
+            final Prerequisite<? extends StmtContext.Mutable<?, ?, ?>> targetNodePre = usesAction.mutatesEffectiveCtx(
+                    usesNode.getParentContext());
 
             usesAction.apply(new InferenceAction() {
 
@@ -81,15 +81,16 @@ public class UsesStatementImpl extends AbstractDeclaredStatement<QName> implemen
                     StatementContextBase<?, ?, ?> sourceGrpStmtCtx = (StatementContextBase<?, ?, ?>) sourceGroupingPre.get();
 
                     try {
-                        GroupingUtils.copyFromSourceToTarget(sourceGrpStmtCtx, targetNodeStmtCtx);
+                        GroupingUtils.copyFromSourceToTarget(sourceGrpStmtCtx, targetNodeStmtCtx, usesNode);
                         GroupingUtils.resolveUsesNode(usesNode, targetNodeStmtCtx);
                     } catch (SourceException e) {
                         LOG.warn(e.getMessage(), e);
+                        throw e;
                     }
                 }
 
                 @Override
-                public void prerequisiteFailed(Collection<? extends Prerequisite<?>> failed) throws InferenceException {
+                public void prerequisiteFailed(final Collection<? extends Prerequisite<?>> failed) throws InferenceException {
                     if (failed.contains(sourceGroupingPre)) {
                         throw new InferenceException("Grouping " + groupingName + " was not resolved.", usesNode
                                 .getStatementSourceReference());
@@ -100,13 +101,13 @@ public class UsesStatementImpl extends AbstractDeclaredStatement<QName> implemen
         }
 
         @Override
-        public UsesStatement createDeclared(StmtContext<QName, UsesStatement, ?> ctx) {
+        public UsesStatement createDeclared(final StmtContext<QName, UsesStatement, ?> ctx) {
             return new UsesStatementImpl(ctx);
         }
 
         @Override
         public EffectiveStatement<QName, UsesStatement> createEffective(
-                StmtContext<QName, UsesStatement, EffectiveStatement<QName, UsesStatement>> ctx) {
+                final StmtContext<QName, UsesStatement, EffectiveStatement<QName, UsesStatement>> ctx) {
             return new UsesEffectiveStatementImpl(ctx);
         }