package org.opendaylight.yangtools.yang.model.api;
import java.util.Set;
+import javax.annotation.Nullable;
/**
* Contains method which returns various data constraints for some YANG element
*
* It is used with YANG statements leaf-list, list, deviate.
*
- * @return integer with minimal number of elements
+ * @return integer with minimal number of elements, or null if no minimum is defined
*/
- Integer getMinElements();
+ @Nullable Integer getMinElements();
/**
* Returns the maximum admissible number of data elements for node where
*
* It is used with YANG statements leaf-list, list, deviate.
*
- * @return integer with maximum number of elements
+ * @return integer with maximum number of elements, or null if no maximum is defined
*/
- Integer getMaxElements();
+ @Nullable Integer getMaxElements();
}
<leaf-list name="test-leaf-list">
<type name="string"></type>
<config value="false"></config>
- <min-elements value="0"></min-elements>
- <max-elements value="2147483647"></max-elements>
<ordered-by value="user"></ordered-by>
<status value="current"></status>
</leaf-list>
<key value="key-leaf-1 key-leaf-2"></key>
<config value="true"></config>
<min-elements value="5"></min-elements>
- <max-elements value="2147483647"></max-elements>
<ordered-by value="system"></ordered-by>
<status value="current"></status>
<leaf name="key-leaf-1">
<refine target-node="test-list">
<config value="true"></config>
<min-elements value="5"></min-elements>
- <max-elements value="2147483647"></max-elements>
</refine>
<refine target-node="test-leaf-list">
<config value="false"></config>
- <min-elements value="0"></min-elements>
- <max-elements value="2147483647"></max-elements>
</refine>
<refine target-node="test-leaf-1">
<default value="def-val"></default>
</refine>
</uses>
</notification>
-</module>
\ No newline at end of file
+</module>
import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
final class EffectiveConstraintDefinitionImpl implements ConstraintDefinition {
- private static final Integer UNBOUNDED_INT = Integer.MAX_VALUE;
private static final String UNBOUNDED_STR = "unbounded";
+
private final RevisionAwareXPath whenCondition;
private final Set<MustDefinition> mustConstraints;
private final Integer minElements;
final Integer maxElements, final RevisionAwareXPath whenCondition,
final Set<MustDefinition> mustConstraints) {
this.mandatory = mandatory;
- this.minElements = Preconditions.checkNotNull(minElements);
- this.maxElements = Preconditions.checkNotNull(maxElements);
+ this.minElements = minElements;
+ this.maxElements = maxElements;
this.whenCondition = whenCondition;
this.mustConstraints = Preconditions.checkNotNull(mustConstraints);
}
static ConstraintDefinition forParent(final EffectiveStatementBase<?, ?> parent) {
final MinElementsEffectiveStatementImpl firstMinElementsStmt = parent
.firstEffective(MinElementsEffectiveStatementImpl.class);
- final Integer minElements = (firstMinElementsStmt == null) ? 0 : firstMinElementsStmt.argument();
+ final Integer minElements;
+ if (firstMinElementsStmt != null) {
+ final Integer m = firstMinElementsStmt.argument();
+ minElements = m > 0 ? m : null;
+ } else {
+ minElements = null;
+ }
final MaxElementsEffectiveStatementImpl firstMaxElementsStmt = parent
.firstEffective(MaxElementsEffectiveStatementImpl.class);
final String maxElementsArg = (firstMaxElementsStmt == null) ? UNBOUNDED_STR : firstMaxElementsStmt.argument();
final Integer maxElements;
- if (UNBOUNDED_STR.equals(maxElementsArg)) {
- maxElements = UNBOUNDED_INT;
+ if (!UNBOUNDED_STR.equals(maxElementsArg)) {
+ final Integer m = Integer.valueOf(maxElementsArg);
+ maxElements = m < Integer.MAX_VALUE ? m : null;
} else {
- maxElements = Integer.valueOf(maxElementsArg);
+ maxElements = null;
}
final MandatoryEffectiveStatement firstMandatoryStmt = parent.firstEffective(MandatoryEffectiveStatement.class);
- final boolean mandatory = (firstMandatoryStmt == null) ? minElements > 0 : firstMandatoryStmt.argument();
+ final boolean mandatory = (firstMandatoryStmt == null) ? minElements != null : firstMandatoryStmt.argument();
final Set<MustDefinition> mustSubstatements = ImmutableSet.copyOf(parent.allSubstatementsOfType(
MustDefinition.class));
final WhenEffectiveStatementImpl firstWhenStmt = parent.firstEffective(WhenEffectiveStatementImpl.class);
// Check for singleton instances
- if (minElements == 0 && maxElements == UNBOUNDED_INT && mustSubstatements.isEmpty() && firstWhenStmt == null) {
+ if (minElements == null && maxElements == null && mustSubstatements.isEmpty() && firstWhenStmt == null) {
return EmptyConstraintDefinition.create(mandatory);
}
@Override
public final Integer getMinElements() {
- return 0;
+ return null;
}
@Override
public final Integer getMaxElements() {
- return Integer.MAX_VALUE;
+ return null;
}
@Override
assertEquals("addresses reference added by refine", refineList.getReference());
assertFalse(refineList.isConfiguration());
assertEquals(2, (int) refineList.getConstraints().getMinElements());
- assertEquals(Integer.MAX_VALUE, (int) refineList.getConstraints().getMaxElements());
+ assertNull(refineList.getConstraints().getMaxElements());
// leaf id
assertNotNull(refineInnerLeaf);
}
}
+ assertNotNull(foo);
+ assertNotNull(imp);
+
final LeafSchemaNode leaf = (LeafSchemaNode) ((ContainerSchemaNode) foo.getDataChildByName(QName.create(
foo.getQNameModule(), "my-container")))
.getDataChildByName(QName.create(foo.getQNameModule(), "my-leaf"));
}
}
+ assertNotNull(impType);
assertEquals(leaf.getType().getQName(), impType.getQName());
}
}
assertTrue(found2);
assertTrue(constraints.isMandatory());
- assertTrue(0 == constraints.getMinElements());
- assertTrue(Integer.MAX_VALUE == constraints.getMaxElements());
+ assertNull(constraints.getMinElements());
+ assertNull(constraints.getMaxElements());
}
@Test
- public void testParseContainer() {
+ public void testParseContainer() throws ParseException {
final Module test = TestUtils.findModule(modules, "simple-nodes");
final ContainerSchemaNode nodes = (ContainerSchemaNode) test.getDataChildByName(QName.create(test.getQNameModule(), "nodes"));
assertTrue(found2);
assertFalse(constraints.isMandatory());
- assertTrue(0 == constraints.getMinElements());
- assertTrue(Integer.MAX_VALUE == constraints.getMaxElements());
+ assertNull(constraints.getMinElements());
+ assertNull(constraints.getMaxElements());
assertTrue(nodes.isPresenceContainer());
// typedef
}
- private final URI ns = URI.create("urn:opendaylight:simple-nodes");
- private Date rev;
- private final String prefix = "sn";
+ private static final URI NS = URI.create("urn:opendaylight:simple-nodes");
- private SchemaPath createPath(final String... names) {
- try {
- rev = new SimpleDateFormat("yyyy-MM-dd").parse("2013-07-30");
- } catch (final ParseException e) {
- e.printStackTrace();
- }
+ private static SchemaPath createPath(final String... names) throws ParseException {
+ final Date rev = new SimpleDateFormat("yyyy-MM-dd").parse("2013-07-30");
final List<QName> path = new ArrayList<>();
for (final String name : names) {
- path.add(QName.create(ns, rev, name));
+ path.add(QName.create(NS, rev, name));
}
return SchemaPath.create(path, true);
}