From 93a11c9fd78cb0e9d14e59b243790a4c7fa0fb85 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sun, 29 Oct 2017 22:48:41 +0100 Subject: [PATCH] Fix NotificationDefinition NotificationDefinition should provide MustDefinitions directly, as it cannot have any other constraints. Change-Id: Icf38b5b832979fafac8c38b09b108509014fc48c Signed-off-by: Robert Varga --- .../yang/model/api/ConstraintDefinition.java | 12 +-------- .../yang/model/api/MustConstraintAware.java | 25 +++++++++++++++++++ .../model/api/NotificationDefinition.java | 17 ++----------- .../model/export/SchemaContextEmitter.java | 6 +++-- .../NotificationEffectiveStatementImpl.java | 12 ++++----- .../yang/parser/stmt/rfc7950/Bug6871Test.java | 3 ++- .../yangtools/yang/stmt/Bug5518Test.java | 4 +-- .../yang/stmt/DeviationResolutionTest.java | 2 +- .../yangtools/yang/stmt/GroupingTest.java | 4 +-- .../yang/stmt/MustAndWhenStmtTest.java | 4 +-- .../yang/stmt/YangParserSimpleTest.java | 5 ++-- .../yang/stmt/YangParserWithContextTest.java | 5 ++-- 12 files changed, 53 insertions(+), 46 deletions(-) create mode 100644 yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/MustConstraintAware.java 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 1f9ee72771..47f8cf0d83 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 @@ -7,7 +7,6 @@ */ package org.opendaylight.yangtools.yang.model.api; -import java.util.Set; import javax.annotation.Nullable; /** @@ -16,16 +15,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 extends WhenConditionAware { - /** - * Specifies the rules which the node which contains must YANG - * substatement has to match. - * - * @return set of MustDefinition (XPath) instances which - * represents the concrete data constraints - */ - Set getMustConstraints(); - +public interface ConstraintDefinition extends MustConstraintAware, WhenConditionAware { /** * Expreses if the presence of the data element for which this constraint is * specified is|isn't required. diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/MustConstraintAware.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/MustConstraintAware.java new file mode 100644 index 0000000000..609ff1f1f6 --- /dev/null +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/MustConstraintAware.java @@ -0,0 +1,25 @@ +/* + * 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 java.util.Collection; + +/** + * Mix-in interface for nodes which can define must constraints. + * + * @author Robert Varga + */ +public interface MustConstraintAware { + /** + * Specifies the rules which the node which contains must YANG substatement has to match. + * + * @return collection of MustDefinition (XPath) instances which represents the concrete data + * constraints + */ + Collection getMustConstraints(); +} diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/NotificationDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/NotificationDefinition.java index 95d1dd3cb8..ad3577e459 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/NotificationDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/NotificationDefinition.java @@ -7,24 +7,11 @@ */ package org.opendaylight.yangtools.yang.model.api; -import javax.annotation.Nullable; - /** * Interface describing YANG 'notification' statement. The notification * statement is used to define a NETCONF notification. */ -public interface NotificationDefinition extends SchemaNode, DataNodeContainer, AugmentationTarget, CopyableNode { +public interface NotificationDefinition extends SchemaNode, DataNodeContainer, AugmentationTarget, CopyableNode, + MustConstraintAware { - /** - * All implementations should override this method. - * The default definition of this method is used only in YANG 1.0 (RFC6020) implementation of - * NotificationDefinition which does not support any constraints. - * YANG notification statement has been changed in YANG 1.1 (RFC7950) and now allows must constraints. - * - * @return the constraints associated with this NotificationDefinition - */ - // FIXME: version 2.0.0: make this method non-default - @Nullable default ConstraintDefinition getConstraints() { - return null; - } } 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 7f8172df96..989ecafcdf 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 @@ -1843,7 +1843,7 @@ abstract class SchemaContextEmitter { } - private void emitMustNodes(final Set mustConstraints) { + private void emitMustNodes(final Collection mustConstraints) { for (final MustDefinition must : mustConstraints) { emitMust(must); } @@ -2226,7 +2226,9 @@ abstract class SchemaContextEmitter { super.writer.startNotificationNode(notification.getQName()); // FIXME: BUG-2444: *(ifFeatureNode ) - emitConstraints(notification.getConstraints()); + for (final MustDefinition mustCondition : notification.getMustConstraints()) { + emitMust(mustCondition); + } emitDocumentedNode(notification); emitDataNodeContainer(notification); emitUnknownStatementNodes(notification.getUnknownSchemaNodes()); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/NotificationEffectiveStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/NotificationEffectiveStatementImpl.java index a48a212de1..eab05cf65d 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/NotificationEffectiveStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/NotificationEffectiveStatementImpl.java @@ -10,6 +10,7 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import java.util.ArrayList; +import java.util.Collection; import java.util.LinkedHashSet; import java.util.List; import java.util.Objects; @@ -17,7 +18,7 @@ import java.util.Set; import javax.annotation.Nonnull; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode; -import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition; +import org.opendaylight.yangtools.yang.model.api.MustDefinition; import org.opendaylight.yangtools.yang.model.api.NotificationDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; @@ -31,11 +32,11 @@ public class NotificationEffectiveStatementImpl extends AbstractEffectiveDocumentedDataNodeContainer implements NotificationDefinition { private final QName qname; private final SchemaPath path; - private final ConstraintDefinition constraints; private final Set augmentations; private final List unknownNodes; private final boolean augmenting; private final boolean addedByUses; + private final Collection mustConstraints; public NotificationEffectiveStatementImpl( final StmtContext> ctx) { @@ -43,8 +44,6 @@ public class NotificationEffectiveStatementImpl extends this.qname = ctx.getStatementArgument(); this.path = ctx.getSchemaPath().get(); - this.constraints = EffectiveConstraintDefinitionImpl.forParent(this); - // initSubstatementCollections final List unknownNodesInit = new ArrayList<>(); final Set augmentationsInit = new LinkedHashSet<>(); @@ -60,6 +59,7 @@ public class NotificationEffectiveStatementImpl extends } this.unknownNodes = ImmutableList.copyOf(unknownNodesInit); this.augmentations = ImmutableSet.copyOf(augmentationsInit); + this.mustConstraints = ImmutableSet.copyOf(this.allSubstatementsOfType(MustDefinition.class)); // initCopyType final CopyHistory copyTypesFromOriginal = ctx.getCopyHistory(); @@ -84,8 +84,8 @@ public class NotificationEffectiveStatementImpl extends } @Override - public ConstraintDefinition getConstraints() { - return constraints; + public Collection getMustConstraints() { + return mustConstraints; } @Override diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/Bug6871Test.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/Bug6871Test.java index b7febbe8ad..46a6be1940 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/Bug6871Test.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/Bug6871Test.java @@ -13,6 +13,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import java.util.Collection; import java.util.Set; import org.junit.Test; import org.opendaylight.yangtools.yang.common.Revision; @@ -37,7 +38,7 @@ public class Bug6871Test { final Set notifications = foo.getNotifications(); assertEquals(1, notifications.size()); final NotificationDefinition myNotification = notifications.iterator().next(); - Set mustConstraints = myNotification.getConstraints().getMustConstraints(); + Collection mustConstraints = myNotification.getMustConstraints(); assertEquals(2, mustConstraints.size()); final Set rpcs = foo.getRpcs(); diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug5518Test.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug5518Test.java index 331fd8fa6a..a299e0f292 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug5518Test.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug5518Test.java @@ -11,7 +11,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import java.util.Set; +import java.util.Collection; import org.junit.Test; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; @@ -28,7 +28,7 @@ public class Bug5518Test { final DataSchemaNode dataChildByName = context.getDataChildByName(QName.create("foo", "root")); assertTrue(dataChildByName instanceof ContainerSchemaNode); final ContainerSchemaNode root = (ContainerSchemaNode) dataChildByName; - final Set mustConstraints = root.getConstraints().getMustConstraints(); + final Collection mustConstraints = root.getConstraints().getMustConstraints(); assertEquals(1, mustConstraints.size()); final MustDefinition must = mustConstraints.iterator().next(); assertEquals("not(deref(.)/../same-pass)", must.getXpath().toString()); diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/DeviationResolutionTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/DeviationResolutionTest.java index 7168c747b6..bafaf7df9b 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/DeviationResolutionTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/DeviationResolutionTest.java @@ -100,7 +100,7 @@ public class DeviationResolutionTest { assertEquals(2, output.getConstraints().getMustConstraints().size()); final NotificationDefinition myNotification = barModule.getNotifications().iterator().next(); - assertEquals(2, myNotification.getConstraints().getMustConstraints().size()); + assertEquals(2, myNotification.getMustConstraints().size()); final AnyXmlSchemaNode myAnyxml = (AnyXmlSchemaNode) barModule.getDataChildByName( QName.create(barModule.getQNameModule(), "my-anyxml")); diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/GroupingTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/GroupingTest.java index 6381924a0d..c03f6aaed2 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/GroupingTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/GroupingTest.java @@ -104,7 +104,7 @@ public class GroupingTest { assertEquals(Optional.of("address reference added by refine"), refineLeaf.getReference()); assertFalse(refineLeaf.isConfiguration()); assertFalse(refineLeaf.getConstraints().isMandatory()); - final Set leafMustConstraints = refineLeaf.getConstraints().getMustConstraints(); + final Collection leafMustConstraints = refineLeaf.getConstraints().getMustConstraints(); assertEquals(1, leafMustConstraints.size()); final MustDefinition leafMust = leafMustConstraints.iterator().next(); assertEquals("ifType != 'ethernet' or (ifType = 'ethernet' and ifMTU = 1500)", leafMust.toString()); @@ -112,7 +112,7 @@ public class GroupingTest { // container port assertNotNull(refineContainer); - final Set mustConstraints = refineContainer.getConstraints().getMustConstraints(); + final Collection mustConstraints = refineContainer.getConstraints().getMustConstraints(); assertTrue(mustConstraints.isEmpty()); assertEquals(Optional.of("description of port defined by refine"), refineContainer.getDescription()); assertEquals(Optional.of("port reference added by refine"), refineContainer.getReference()); 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 8ddabcebbd..b33289d6e9 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 @@ -16,9 +16,9 @@ import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.opendaylight.yangtools.yang.stmt.StmtTestUtils.sourceForResource; +import java.util.Collection; import java.util.Iterator; import java.util.Optional; -import java.util.Set; import org.junit.Test; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; @@ -51,7 +51,7 @@ public class MustAndWhenStmtTest { assertNotNull(container); assertTrue(container.isPresenceContainer()); - final Set musts = container.getConstraints().getMustConstraints(); + final Collection musts = container.getConstraints().getMustConstraints(); assertEquals(2, musts.size()); final Iterator mustsIterator = musts.iterator(); 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 4ea6c6d2bd..7fd9b2078f 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 @@ -15,6 +15,7 @@ import static org.junit.Assert.assertTrue; import java.net.URI; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Optional; import java.util.Set; @@ -73,7 +74,7 @@ public class YangParserSimpleTest { assertFalse(data.isConfiguration()); final ConstraintDefinition constraints = data.getConstraints(); assertEquals("class != 'wheel'", constraints.getWhenCondition().get().toString()); - final Set mustConstraints = constraints.getMustConstraints(); + final Collection mustConstraints = constraints.getMustConstraints(); assertEquals(2, constraints.getMustConstraints().size()); final String must1 = "ifType != 'ethernet' or (ifType = 'ethernet' and ifMTU = 1500)"; @@ -119,7 +120,7 @@ public class YangParserSimpleTest { // constraints final ConstraintDefinition constraints = nodes.getConstraints(); assertEquals("class != 'wheel'", constraints.getWhenCondition().get().toString()); - final Set mustConstraints = constraints.getMustConstraints(); + final Collection mustConstraints = constraints.getMustConstraints(); assertEquals(2, constraints.getMustConstraints().size()); final String must1 = "ifType != 'atm' or (ifType = 'atm' and ifMTU <= 17966 and ifMTU >= 64)"; diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserWithContextTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserWithContextTest.java index af378b1ee4..5da099328e 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserWithContextTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserWithContextTest.java @@ -16,6 +16,7 @@ import static org.opendaylight.yangtools.yang.stmt.StmtTestUtils.sourceForResour import com.google.common.collect.Iterables; import java.net.URI; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Optional; @@ -261,14 +262,14 @@ public class YangParserWithContextTest { assertEquals(Optional.of("address reference added by refine"), refineLeaf.getReference()); assertFalse(refineLeaf.isConfiguration()); assertTrue(refineLeaf.getConstraints().isMandatory()); - final Set leafMustConstraints = refineLeaf.getConstraints().getMustConstraints(); + final Collection leafMustConstraints = refineLeaf.getConstraints().getMustConstraints(); assertEquals(1, leafMustConstraints.size()); final MustDefinition leafMust = leafMustConstraints.iterator().next(); assertEquals("ifType != 'ethernet' or (ifType = 'ethernet' and ifMTU = 1500)", leafMust.toString()); // container port assertNotNull(refineContainer); - final Set mustConstraints = refineContainer.getConstraints().getMustConstraints(); + final Collection mustConstraints = refineContainer.getConstraints().getMustConstraints(); assertTrue(mustConstraints.isEmpty()); assertEquals(Optional.of("description of port defined by refine"), refineContainer.getDescription()); assertEquals(Optional.of("port reference added by refine"), refineContainer.getReference()); -- 2.36.6