From: Robert Varga Date: Fri, 27 Oct 2017 15:59:34 +0000 (+0200) Subject: Introduce WhenConditionAware X-Git-Tag: v2.0.0~135 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=15659e6dd10120bd600de5ab99b68484799679ff;p=yangtools.git Introduce WhenConditionAware getWhenCondition() is used by multiple interfaces, extract it to a dedicated interface so the individual definitions are consistent. Change-Id: I177f8dcddd1ffa150ffe50c106475ee624343a20 Signed-off-by: Robert Varga --- diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ConstraintDefinitions.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ConstraintDefinitions.java index e7b93721f2..a5edb1c890 100644 --- a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ConstraintDefinitions.java +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ConstraintDefinitions.java @@ -58,7 +58,7 @@ public final class ConstraintDefinitions { public static String toString(final ConstraintDefinition def) { return MoreObjects.toStringHelper(def).omitNullValues() - .add("whenCondition", def.getWhenCondition()) + .add("whenCondition", def.getWhenCondition().orElse(null)) .add("mustConstraints", def.getMustConstraints()) .add("mandatory", def.isMandatory()) .add("minElements", def.getMinElements()) diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/EmptyConstraintDefinition.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/EmptyConstraintDefinition.java index 8050a1fcb2..ab348855a2 100644 --- a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/EmptyConstraintDefinition.java +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/EmptyConstraintDefinition.java @@ -8,6 +8,7 @@ package org.opendaylight.yangtools.yang.data.util; import com.google.common.collect.ImmutableSet; +import java.util.Optional; import java.util.Set; import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition; import org.opendaylight.yangtools.yang.model.api.MustDefinition; @@ -39,8 +40,8 @@ public abstract class EmptyConstraintDefinition implements ConstraintDefinition } @Override - public final RevisionAwareXPath getWhenCondition() { - return null; + public final Optional getWhenCondition() { + return Optional.empty(); } @Override diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/AugmentationSchemaNode.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/AugmentationSchemaNode.java index 5e280997dc..dcb64f7725 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/AugmentationSchemaNode.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/AugmentationSchemaNode.java @@ -16,21 +16,7 @@ import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus; * from a grouping in a "uses" statement. */ public interface AugmentationSchemaNode extends DataNodeContainer, NotificationNodeContainer, ActionNodeContainer, - WithStatus { - /** - * Returns when statement. - * - *

- * If when condition is present node defined by the parent data definition - * statement is only valid when the returned XPath - * expression conceptually evaluates to "true" - * for a particular instance, then the node defined by the parent data - * definition statement is valid; otherwise, it is not. - * - * @return XPath condition - */ - RevisionAwareXPath getWhenCondition(); - + WhenConditionAware, WithStatus { /** * Returns augmentation schema path. * diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/ConstraintDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/ConstraintDefinition.java index 6da5c0e116..1f9ee72771 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/ConstraintDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/ConstraintDefinition.java @@ -16,17 +16,7 @@ import javax.annotation.Nullable; * YANG element therefore if the constraint doesn't have sense for some element * then the method returns null value. */ -public interface ConstraintDefinition { - - /** - * Specifies the condition when the data node which contains - * when YANG substatement has to be present. If XPath - * expression is evaluated as true then the data node has to be present. - * - * @return XPath expression. - */ - RevisionAwareXPath getWhenCondition(); - +public interface ConstraintDefinition extends WhenConditionAware { /** * Specifies the rules which the node which contains must YANG * substatement has to match. diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/UsesNode.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/UsesNode.java index e494db7580..b96d2b2bc0 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/UsesNode.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/UsesNode.java @@ -8,15 +8,14 @@ package org.opendaylight.yangtools.yang.model.api; import java.util.Map; -import java.util.Optional; import java.util.Set; import javax.annotation.Nonnull; +import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus; /** - * Contains the methods for getting data and checking properties of the YANG - * uses substatement. + * Contains the methods for getting data and checking properties of the YANG uses substatement. */ -public interface UsesNode extends DocumentedNode.WithStatus { +public interface UsesNode extends WhenConditionAware, WithStatus { /** * Returns the schema path to used grouping. @@ -58,19 +57,4 @@ public interface UsesNode extends DocumentedNode.WithStatus { * refined node */ @Nonnull Map getRefines(); - - /** - * Returns when statement. - * - *

- * If when condition is present node defined by the parent data definition - * statement is only valid when the returned XPath expression conceptually - * evaluates to "true" for a particular instance, then the node defined by - * the parent data definition statement is valid; otherwise, it is not. - * - * @return Optional of XPath condition - */ - default @Nonnull Optional getWhenCondition() { - return Optional.empty(); - } } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/WhenConditionAware.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/WhenConditionAware.java new file mode 100644 index 0000000000..1b07f480be --- /dev/null +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/WhenConditionAware.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2017 Pantheon Technologies, s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.yangtools.yang.model.api; + +import com.google.common.annotations.Beta; +import java.util.Optional; + +/** + * Mix-in interface for nodes which can be conditional on a when statement. + * + * @author Robert Varga + */ +@Beta +public interface WhenConditionAware { + /** + * Returns when statement. + * + *

+ * If when condition is present node defined by the parent data definition + * statement is only valid when the returned XPath + * expression conceptually evaluates to "true" + * for a particular instance, then the node defined by the parent data + * definition statement is valid; otherwise, it is not. + * + * @return XPath condition + */ + Optional getWhenCondition(); + +} diff --git a/yang/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/SchemaContextEmitter.java b/yang/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/SchemaContextEmitter.java index d6e557d78f..414aaa1086 100644 --- a/yang/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/SchemaContextEmitter.java +++ b/yang/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/SchemaContextEmitter.java @@ -1814,7 +1814,7 @@ abstract class SchemaContextEmitter { } private void emitConstraints(final ConstraintDefinition constraints) { - emitWhen(constraints.getWhenCondition()); + constraints.getWhenCondition().ifPresent(this::emitWhen); for (final MustDefinition mustCondition : constraints.getMustConstraints()) { emitMust(mustCondition); } @@ -1822,7 +1822,7 @@ abstract class SchemaContextEmitter { private void emitLeaf(final LeafSchemaNode child) { super.writer.startLeafNode(child.getQName()); - emitWhen(child.getConstraints().getWhenCondition()); + child.getConstraints().getWhenCondition().ifPresent(this::emitWhen); // FIXME: BUG-2444: *(ifFeatureNode ) emitTypeNode(child.getPath(), child.getType()); emitUnitsNode(child.getUnits()); @@ -1839,7 +1839,7 @@ abstract class SchemaContextEmitter { private void emitLeafList(final LeafListSchemaNode child) { super.writer.startLeafListNode(child.getQName()); - emitWhen(child.getConstraints().getWhenCondition()); + child.getConstraints().getWhenCondition().ifPresent(this::emitWhen); // FIXME: BUG-2444: *(ifFeatureNode ) emitTypeNode(child.getPath(), child.getType()); emitUnitsNode(child.getType().getUnits()); @@ -1858,7 +1858,7 @@ abstract class SchemaContextEmitter { private void emitList(final ListSchemaNode child) { super.writer.startListNode(child.getQName()); - emitWhen(child.getConstraints().getWhenCondition()); + child.getConstraints().getWhenCondition().ifPresent(this::emitWhen); // FIXME: BUG-2444: *(ifFeatureNode ) emitMustNodes(child.getConstraints().getMustConstraints()); @@ -1903,7 +1903,7 @@ abstract class SchemaContextEmitter { private void emitChoice(final ChoiceSchemaNode choice) { super.writer.startChoiceNode(choice.getQName()); - emitWhen(choice.getConstraints().getWhenCondition()); + choice.getConstraints().getWhenCondition().ifPresent(this::emitWhen); // FIXME: BUG-2444: *(ifFeatureNode ) // FIXME: BUG-2444: defaultNode //Optional emitConfigNode(choice.isConfiguration()); @@ -1922,7 +1922,7 @@ abstract class SchemaContextEmitter { return; } super.writer.startCaseNode(caze.getQName()); - emitWhen(caze.getConstraints().getWhenCondition()); + caze.getConstraints().getWhenCondition().ifPresent(this::emitWhen); // FIXME: BUG-2444: *(ifFeatureNode ) emitDocumentedNode(caze); emitDataNodeContainer(caze); @@ -1944,7 +1944,7 @@ abstract class SchemaContextEmitter { } private void emitBodyOfDataSchemaNode(final DataSchemaNode dataSchemaNode) { - emitWhen(dataSchemaNode.getConstraints().getWhenCondition()); + dataSchemaNode.getConstraints().getWhenCondition().ifPresent(this::emitWhen); // FIXME: BUG-2444: *(ifFeatureNode ) emitMustNodes(dataSchemaNode.getConstraints().getMustConstraints()); emitConfigNode(dataSchemaNode.isConfiguration()); diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/EffectiveAugmentationSchema.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/EffectiveAugmentationSchema.java index fdb09d08b3..0f4e019b5c 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/EffectiveAugmentationSchema.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/EffectiveAugmentationSchema.java @@ -50,7 +50,7 @@ public final class EffectiveAugmentationSchema implements AugmentationSchemaNode } @Override - public RevisionAwareXPath getWhenCondition() { + public Optional getWhenCondition() { return delegate.getWhenCondition(); } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/AugmentEffectiveStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/AugmentEffectiveStatementImpl.java index f05bef46a1..62edcab92a 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/AugmentEffectiveStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/AugmentEffectiveStatementImpl.java @@ -87,8 +87,8 @@ public final class AugmentEffectiveStatementImpl } @Override - public RevisionAwareXPath getWhenCondition() { - return whenCondition; + public Optional getWhenCondition() { + return Optional.ofNullable(whenCondition); } @Nonnull diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/EffectiveConstraintDefinitionImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/EffectiveConstraintDefinitionImpl.java index b29451b9b0..dfcf434a5f 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/EffectiveConstraintDefinitionImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/EffectiveConstraintDefinitionImpl.java @@ -10,6 +10,7 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective; import static java.util.Objects.requireNonNull; import com.google.common.collect.ImmutableSet; +import java.util.Optional; import java.util.Set; import org.opendaylight.yangtools.yang.data.util.ConstraintDefinitions; import org.opendaylight.yangtools.yang.data.util.EmptyConstraintDefinition; @@ -75,8 +76,8 @@ final class EffectiveConstraintDefinitionImpl implements ConstraintDefinition { } @Override - public RevisionAwareXPath getWhenCondition() { - return whenCondition; + public Optional getWhenCondition() { + return Optional.ofNullable(whenCondition); } @Override diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/AugmentTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/AugmentTest.java index 7bd9b1ab24..300111b7a8 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/AugmentTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/AugmentTest.java @@ -133,11 +133,11 @@ public class AugmentTest { AugmentationSchemaNode augment2 = null; AugmentationSchemaNode augment3 = null; for (final AugmentationSchemaNode as : augmentations) { - if (as.getWhenCondition() == null) { + if (!as.getWhenCondition().isPresent()) { augment3 = as; - } else if ("if:ifType='ds0'".equals(as.getWhenCondition().toString())) { + } else if ("if:ifType='ds0'".equals(as.getWhenCondition().get().toString())) { augment1 = as; - } else if ("if:ifType='ds2'".equals(as.getWhenCondition().toString())) { + } else if ("if:ifType='ds2'".equals(as.getWhenCondition().get().toString())) { augment2 = as; } } diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug5481Test.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug5481Test.java index 6d09dfe008..dd4e0889ab 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug5481Test.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug5481Test.java @@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.stmt; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -39,9 +40,8 @@ public class Bug5481Test { assertTrue(dataChildByName instanceof ContainerSchemaNode); ContainerSchemaNode topContainer = (ContainerSchemaNode) dataChildByName; - RevisionAwareXPath whenConditionTopContainer = topContainer.getConstraints().getWhenCondition(); - assertNull(whenConditionTopContainer); + assertFalse(topContainer.getConstraints().getWhenCondition().isPresent()); assertEquals(Status.CURRENT, topContainer.getStatus()); assertNull(topContainer.getDescription()); assertNull(topContainer.getReference()); @@ -54,7 +54,7 @@ public class Bug5481Test { assertTrue(dataChildByName2 instanceof LeafSchemaNode); LeafSchemaNode extendedLeaf = (LeafSchemaNode) dataChildByName2; - RevisionAwareXPath whenConditionExtendedLeaf = extendedLeaf.getConstraints().getWhenCondition(); + RevisionAwareXPath whenConditionExtendedLeaf = extendedLeaf.getConstraints().getWhenCondition().get(); assertEquals(new RevisionAwareXPathImpl("module1:top = 'extended'", false), whenConditionExtendedLeaf); assertEquals(Status.DEPRECATED, extendedLeaf.getStatus()); diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug6180Test.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug6180Test.java index 260b1f080a..2700ef44f1 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug6180Test.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug6180Test.java @@ -70,7 +70,7 @@ public class Bug6180Test { final DataSchemaNode dataNodeBar = schemaContext.getDataChildByName(QName.create("foo", "2016-07-11", "bar")); assertTrue(dataNodeBar instanceof ContainerSchemaNode); final ContainerSchemaNode bar = (ContainerSchemaNode) dataNodeBar; - final RevisionAwareXPath whenCondition = bar.getConstraints().getWhenCondition(); + final RevisionAwareXPath whenCondition = bar.getConstraints().getWhenCondition().get(); assertEquals("/foo != \"bar\"", whenCondition.toString()); final Set> typeDefinitions = schemaContext.getTypeDefinitions(); @@ -88,7 +88,7 @@ public class Bug6180Test { final DataSchemaNode dataNodeBar = schemaContext.getDataChildByName(QName.create("foo", "2016-07-11", "bar")); assertTrue(dataNodeBar instanceof ContainerSchemaNode); final ContainerSchemaNode bar = (ContainerSchemaNode) dataNodeBar; - final RevisionAwareXPath whenCondition = bar.getConstraints().getWhenCondition(); + final RevisionAwareXPath whenCondition = bar.getConstraints().getWhenCondition().get(); assertEquals("/foo != 'bar'", whenCondition.toString()); final Set> typeDefinitions = schemaContext.getTypeDefinitions(); diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/MustAndWhenStmtTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/MustAndWhenStmtTest.java index 2f3390d1e9..f6bc785260 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/MustAndWhenStmtTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/MustAndWhenStmtTest.java @@ -82,6 +82,7 @@ public class MustAndWhenStmtTest { final ContainerSchemaNode container = (ContainerSchemaNode) testModule.getDataChildByName( QName.create(testModule.getQNameModule(), "test-container")); assertNotNull(container); - assertEquals("conditional-leaf = 'autumn-leaf'", container.getConstraints().getWhenCondition().toString()); + assertEquals("conditional-leaf = 'autumn-leaf'", container.getConstraints().getWhenCondition() + .get().toString()); } } diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserSimpleTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserSimpleTest.java index 6a072559b1..a0f6230341 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserSimpleTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserSimpleTest.java @@ -71,7 +71,7 @@ public class YangParserSimpleTest { assertFalse(data.isAugmenting()); assertFalse(data.isConfiguration()); final ConstraintDefinition constraints = data.getConstraints(); - assertEquals("class != 'wheel'", constraints.getWhenCondition().toString()); + assertEquals("class != 'wheel'", constraints.getWhenCondition().get().toString()); final Set mustConstraints = constraints.getMustConstraints(); assertEquals(2, constraints.getMustConstraints().size()); @@ -119,7 +119,7 @@ public class YangParserSimpleTest { // constraints final ConstraintDefinition constraints = nodes.getConstraints(); - assertEquals("class != 'wheel'", constraints.getWhenCondition().toString()); + assertEquals("class != 'wheel'", constraints.getWhenCondition().get().toString()); final Set mustConstraints = constraints.getMustConstraints(); assertEquals(2, constraints.getMustConstraints().size()); diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/yin/YinFileChoiceStmtTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/yin/YinFileChoiceStmtTest.java index 72065a976d..61351d5b8e 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/yin/YinFileChoiceStmtTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/yin/YinFileChoiceStmtTest.java @@ -23,7 +23,6 @@ import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException; import org.opendaylight.yangtools.yang.stmt.TestUtils; @@ -67,8 +66,7 @@ public class YinFileChoiceStmtTest { assertEquals("main-impl", caseNode.getQName().getLocalName()); assertEquals(13, caseNode.getChildNodes().size()); - final RevisionAwareXPath whenCondition = caseNode.getConstraints().getWhenCondition(); - assertNotNull(whenCondition); + assertTrue(caseNode.getConstraints().getWhenCondition().isPresent()); choice = (ChoiceSchemaNode) list.getDataChildByName(QName.create(testModule.getQNameModule(), "state")); assertNotNull(choice);