Introduce formatting methods for SourceException
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / UsesStatementImpl.java
index a9bab4de76eca85c0fcb34443526d4e38736a172..a5872bd614f440a02497893ed86210e1cd7359f7 100644 (file)
@@ -7,16 +7,13 @@
  */
 package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
 
+import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX;
 import java.util.Collection;
 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.GroupingStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RefineStatement;
@@ -24,6 +21,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement;
 import org.opendaylight.yangtools.yang.parser.spi.GroupingNamespace;
+import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator;
 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException;
@@ -32,12 +30,29 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.Infere
 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.StmtContext.Mutable;
-import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference;
+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 {
 
-    protected UsesStatementImpl(StmtContext<QName, UsesStatement, ?> context) {
+public class UsesStatementImpl extends AbstractDeclaredStatement<QName> implements UsesStatement {
+    private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping
+            .USES)
+            .add(Rfc6020Mapping.AUGMENT, 0, MAX)
+            .add(Rfc6020Mapping.DESCRIPTION, 0, 1)
+            .add(Rfc6020Mapping.IF_FEATURE, 0, MAX)
+            .add(Rfc6020Mapping.REFINE, 0, MAX)
+            .add(Rfc6020Mapping.REFERENCE, 0, 1)
+            .add(Rfc6020Mapping.STATUS, 0, 1)
+            .add(Rfc6020Mapping.WHEN, 0, 1)
+            .build();
+
+    private static final Logger LOG = LoggerFactory.getLogger(UsesStatementImpl.class);
+
+    protected UsesStatementImpl(final StmtContext<QName, UsesStatement, ?> context) {
         super(context);
     }
 
@@ -49,49 +64,62 @@ 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);
         }
 
-        public void onStatementDeclared(Mutable<QName, UsesStatement, ?> usesNode) throws InferenceException {
-            ModelActionBuilder modifier = usesNode.newInferenceAction(ModelProcessingPhase.EFFECTIVE_MODEL);
-            final QName groupingName = usesNode.getStatementArgument();
-            final StatementSourceReference usesSource = usesNode.getStatementSourceReference();
-            final Prerequisite<?> targetPre = modifier.mutatesEffectiveCtx(usesNode.getParentContext());
-            final Prerequisite<EffectiveStatement<QName, GroupingStatement>> sourcePre = modifier.requiresEffective(
-                    usesNode, GroupingNamespace.class, groupingName);
+        @Override
+        public void onFullDefinitionDeclared(
+                final StmtContext.Mutable<QName, UsesStatement, EffectiveStatement<QName, UsesStatement>> usesNode)
+                throws SourceException {
+            SUBSTATEMENT_VALIDATOR.validate(usesNode);
 
-            modifier.apply(new InferenceAction() {
+            if (StmtContextUtils.isInExtensionBody(usesNode)) {
+                return;
+            }
 
-                @Override
-                public void apply() throws InferenceException {
-                    Mutable<?, ?, ?> targetCtx = (Mutable<?, ?, ?>) targetPre.get();
-                    EffectiveStatement<QName, GroupingStatement> source = sourcePre.get();
+            ModelActionBuilder usesAction = usesNode.newInferenceAction(ModelProcessingPhase.EFFECTIVE_MODEL);
+            final QName groupingName = usesNode.getStatementArgument();
 
-                    throw new UnsupportedOperationException("Copy of not not yet implemented.");
-                }
+            final Prerequisite<StmtContext<?, ?, ?>> sourceGroupingPre = usesAction.requiresCtx(usesNode,
+                    GroupingNamespace.class, groupingName, ModelProcessingPhase.EFFECTIVE_MODEL);
+            final Prerequisite<? extends StmtContext.Mutable<?, ?, ?>> targetNodePre = usesAction.mutatesEffectiveCtx(
+                    usesNode.getParentContext());
+
+            usesAction.apply(new InferenceAction() {
 
                 @Override
-                public void prerequisiteFailed(Collection<? extends Prerequisite<?>> failed) throws InferenceException {
-                    if(failed.contains(sourcePre)) {
-                        throw new InferenceException("Grouping " + groupingName + "was not found.", usesSource);
+                public void apply() {
+                    StatementContextBase<?, ?, ?> targetNodeStmtCtx = (StatementContextBase<?, ?, ?>) targetNodePre.get();
+                    StatementContextBase<?, ?, ?> sourceGrpStmtCtx = (StatementContextBase<?, ?, ?>) sourceGroupingPre.get();
+
+                    try {
+                        GroupingUtils.copyFromSourceToTarget(sourceGrpStmtCtx, targetNodeStmtCtx, usesNode);
+                        GroupingUtils.resolveUsesNode(usesNode, targetNodeStmtCtx);
+                    } catch (SourceException e) {
+                        LOG.warn(e.getMessage(), e);
+                        throw e;
                     }
-                    throw new InferenceException("Unknown error occured.", usesSource);
                 }
 
+                @Override
+                public void prerequisiteFailed(final Collection<? extends Prerequisite<?>> failed) {
+                    InferenceException.throwIf(failed.contains(sourceGroupingPre),
+                        usesNode.getStatementSourceReference(), "Grouping '%s' was not resolved.", groupingName);
+                    throw new InferenceException("Unknown error occurred.", usesNode.getStatementSourceReference());
+                }
             });
-
         }
 
         @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) {
-            throw new UnsupportedOperationException("Not implemented yet.");
+                final StmtContext<QName, UsesStatement, EffectiveStatement<QName, UsesStatement>> ctx) {
+            return new UsesEffectiveStatementImpl(ctx);
         }
 
     }
@@ -135,35 +163,4 @@ public class UsesStatementImpl extends AbstractDeclaredStatement<QName> implemen
     public Collection<? extends RefineStatement> getRefines() {
         return allDeclared(RefineStatement.class);
     }
-
-    @Override
-    public QName argument() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String rawArgument() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public Collection<? extends DeclaredStatement<?>> declaredSubstatements() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public StatementDefinition statementDefinition() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public StatementSource getStatementSource() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
 }