Bug 4656: Yang parser does not determine configuration true or false properly
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / effective / CaseEffectiveStatementImpl.java
index 36d2a13726de043aa2227c3f8bdbcdfa4f9c49b3..8bfab0a13bc8d8b67dcb9ccb59d8b5fb79f36cea 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective;
 
 import com.google.common.base.Optional;
+import java.util.Collection;
 import java.util.Objects;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
@@ -15,16 +16,34 @@ import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.CaseStatement;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase;
 
 public final class CaseEffectiveStatementImpl extends AbstractEffectiveSimpleDataNodeContainer<CaseStatement> implements
         ChoiceCaseNode, DerivableSchemaNode {
 
     private final ChoiceCaseNode original;
+    private final boolean configuration;
 
     public CaseEffectiveStatementImpl(
             final StmtContext<QName, CaseStatement, EffectiveStatement<QName, CaseStatement>> ctx) {
         super(ctx);
         this.original = ctx.getOriginalCtx() == null ? null : (ChoiceCaseNode) ctx.getOriginalCtx().buildEffective();
+
+        if (ctx.isConfiguration()) {
+            configuration = isAtLeastOneChildConfiguration(ctx.declaredSubstatements()) ||
+                    isAtLeastOneChildConfiguration(ctx.effectiveSubstatements());
+        } else {
+            configuration = false;
+        }
+    }
+
+    private boolean isAtLeastOneChildConfiguration(Collection<StatementContextBase<?, ?, ?>> substatements) {
+        for (StatementContextBase<?, ?, ?> substatement : substatements) {
+            if (substatement.isConfiguration()) {
+                return true;
+            }
+        }
+        return false;
     }
 
     @Override
@@ -32,6 +51,11 @@ public final class CaseEffectiveStatementImpl extends AbstractEffectiveSimpleDat
         return Optional.fromNullable(original);
     }
 
+    @Override
+    public boolean isConfiguration() {
+        return configuration;
+    }
+
     @Override
     public int hashCode() {
         final int prime = 31;