Peel MustConstraintAware from ConstraintDefinition
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / effective / LeafListEffectiveStatementImpl.java
index ae6824f16b29040bf0228b0156c5e1310270795c..0209cc4e486b00eddadc9e1f7aa3fa309fcf1e01 100644 (file)
@@ -15,10 +15,18 @@ import java.util.Set;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.MustDefinition;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.DefaultEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.LeafListEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.LeafListStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.UnitsEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.util.type.ConcreteTypeBuilder;
 import org.opendaylight.yangtools.yang.model.util.type.ConcreteTypes;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
@@ -26,7 +34,7 @@ import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.TypeUtils;
 
 public final class LeafListEffectiveStatementImpl extends AbstractEffectiveDataSchemaNode<LeafListStatement>
-        implements LeafListSchemaNode, DerivableSchemaNode {
+        implements LeafListEffectiveStatement, LeafListSchemaNode, DerivableSchemaNode {
 
     private static final String ORDER_BY_USER_KEYWORD = "user";
 
@@ -34,6 +42,7 @@ public final class LeafListEffectiveStatementImpl extends AbstractEffectiveDataS
     private final LeafListSchemaNode original;
     private final boolean userOrdered;
     private final Set<String> defaultValues;
+    private final Collection<MustDefinition> mustConstraints;
 
     public LeafListEffectiveStatementImpl(
             final StmtContext<QName, LeafListStatement, EffectiveStatement<QName, LeafListStatement>> ctx) {
@@ -49,23 +58,24 @@ public final class LeafListEffectiveStatementImpl extends AbstractEffectiveDataS
         final ImmutableSet.Builder<String> defaultValuesBuilder = ImmutableSet.builder();
         boolean isUserOrdered = false;
         for (final EffectiveStatement<?, ?> stmt : effectiveSubstatements()) {
-            if (stmt instanceof OrderedByEffectiveStatementImpl) {
+            if (stmt instanceof OrderedByEffectiveStatement) {
                 isUserOrdered = ORDER_BY_USER_KEYWORD.equals(stmt.argument());
             }
 
-            if (stmt instanceof DefaultEffectiveStatementImpl) {
-                defaultValuesBuilder.add(((DefaultEffectiveStatementImpl) stmt).argument());
-            } else if (stmt instanceof DescriptionEffectiveStatementImpl) {
-                builder.setDescription(((DescriptionEffectiveStatementImpl)stmt).argument());
-            } else if (stmt instanceof ReferenceEffectiveStatementImpl) {
-                builder.setReference(((ReferenceEffectiveStatementImpl)stmt).argument());
-            } else if (stmt instanceof StatusEffectiveStatementImpl) {
-                builder.setStatus(((StatusEffectiveStatementImpl)stmt).argument());
-            } else if (stmt instanceof UnitsEffectiveStatementImpl) {
-                builder.setUnits(((UnitsEffectiveStatementImpl)stmt).argument());
+            if (stmt instanceof DefaultEffectiveStatement) {
+                defaultValuesBuilder.add(((DefaultEffectiveStatement) stmt).argument());
+            } else if (stmt instanceof DescriptionEffectiveStatement) {
+                builder.setDescription(((DescriptionEffectiveStatement)stmt).argument());
+            } else if (stmt instanceof ReferenceEffectiveStatement) {
+                builder.setReference(((ReferenceEffectiveStatement)stmt).argument());
+            } else if (stmt instanceof StatusEffectiveStatement) {
+                builder.setStatus(((StatusEffectiveStatement)stmt).argument());
+            } else if (stmt instanceof UnitsEffectiveStatement) {
+                builder.setUnits(((UnitsEffectiveStatement)stmt).argument());
             }
         }
 
+        // FIXME: We need to interpret the default value in terms of supplied element type
         defaultValues = defaultValuesBuilder.build();
         SourceException.throwIf(
                 TypeUtils.hasDefaultValueMarkedWithIfFeature(ctx.getRootVersion(), typeStmt, defaultValues),
@@ -73,8 +83,11 @@ public final class LeafListEffectiveStatementImpl extends AbstractEffectiveDataS
                 "Leaf-list '%s' has one of its default values '%s' marked with an if-feature statement.",
                 ctx.getStatementArgument(), defaultValues);
 
+        // FIXME: RFC7950 section 7.7.4: we need to check for min-elements and defaultValues conflict
+
         type = builder.build();
         userOrdered = isUserOrdered;
+        mustConstraints = ImmutableSet.copyOf(allSubstatementsOfType(MustDefinition.class));
     }
 
     @Override
@@ -97,6 +110,11 @@ public final class LeafListEffectiveStatementImpl extends AbstractEffectiveDataS
         return userOrdered;
     }
 
+    @Override
+    public Collection<MustDefinition> getMustConstraints() {
+        return mustConstraints;
+    }
+
     @Override
     public int hashCode() {
         final int prime = 31;