*/
package org.opendaylight.yangtools.yang.model.api;
-import java.util.Set;
import javax.annotation.Nullable;
/**
* YANG element therefore if the constraint doesn't have sense for some element
* then the method returns <code>null</code> value.
*/
-public interface ConstraintDefinition extends WhenConditionAware {
- /**
- * Specifies the rules which the node which contains <code>must</code> YANG
- * substatement has to match.
- *
- * @return set of <code>MustDefinition</code> (XPath) instances which
- * represents the concrete data constraints
- */
- Set<MustDefinition> 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.
--- /dev/null
+/*
+ * 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 <code>must</code> YANG substatement has to match.
+ *
+ * @return collection of <code>MustDefinition</code> (XPath) instances which represents the concrete data
+ * constraints
+ */
+ Collection<MustDefinition> getMustConstraints();
+}
*/
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;
- }
}
}
- private void emitMustNodes(final Set<MustDefinition> mustConstraints) {
+ private void emitMustNodes(final Collection<MustDefinition> mustConstraints) {
for (final MustDefinition must : mustConstraints) {
emitMust(must);
}
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());
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;
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;
AbstractEffectiveDocumentedDataNodeContainer<QName, NotificationStatement> implements NotificationDefinition {
private final QName qname;
private final SchemaPath path;
- private final ConstraintDefinition constraints;
private final Set<AugmentationSchemaNode> augmentations;
private final List<UnknownSchemaNode> unknownNodes;
private final boolean augmenting;
private final boolean addedByUses;
+ private final Collection<MustDefinition> mustConstraints;
public NotificationEffectiveStatementImpl(
final StmtContext<QName, NotificationStatement, EffectiveStatement<QName, NotificationStatement>> ctx) {
this.qname = ctx.getStatementArgument();
this.path = ctx.getSchemaPath().get();
- this.constraints = EffectiveConstraintDefinitionImpl.forParent(this);
-
// initSubstatementCollections
final List<UnknownSchemaNode> unknownNodesInit = new ArrayList<>();
final Set<AugmentationSchemaNode> augmentationsInit = new LinkedHashSet<>();
}
this.unknownNodes = ImmutableList.copyOf(unknownNodesInit);
this.augmentations = ImmutableSet.copyOf(augmentationsInit);
+ this.mustConstraints = ImmutableSet.copyOf(this.allSubstatementsOfType(MustDefinition.class));
// initCopyType
final CopyHistory copyTypesFromOriginal = ctx.getCopyHistory();
}
@Override
- public ConstraintDefinition getConstraints() {
- return constraints;
+ public Collection<MustDefinition> getMustConstraints() {
+ return mustConstraints;
}
@Override
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;
final Set<NotificationDefinition> notifications = foo.getNotifications();
assertEquals(1, notifications.size());
final NotificationDefinition myNotification = notifications.iterator().next();
- Set<MustDefinition> mustConstraints = myNotification.getConstraints().getMustConstraints();
+ Collection<MustDefinition> mustConstraints = myNotification.getMustConstraints();
assertEquals(2, mustConstraints.size());
final Set<RpcDefinition> rpcs = foo.getRpcs();
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;
final DataSchemaNode dataChildByName = context.getDataChildByName(QName.create("foo", "root"));
assertTrue(dataChildByName instanceof ContainerSchemaNode);
final ContainerSchemaNode root = (ContainerSchemaNode) dataChildByName;
- final Set<MustDefinition> mustConstraints = root.getConstraints().getMustConstraints();
+ final Collection<MustDefinition> mustConstraints = root.getConstraints().getMustConstraints();
assertEquals(1, mustConstraints.size());
final MustDefinition must = mustConstraints.iterator().next();
assertEquals("not(deref(.)/../same-pass)", must.getXpath().toString());
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"));
assertEquals(Optional.of("address reference added by refine"), refineLeaf.getReference());
assertFalse(refineLeaf.isConfiguration());
assertFalse(refineLeaf.getConstraints().isMandatory());
- final Set<MustDefinition> leafMustConstraints = refineLeaf.getConstraints().getMustConstraints();
+ final Collection<MustDefinition> 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<MustDefinition> mustConstraints = refineContainer.getConstraints().getMustConstraints();
+ final Collection<MustDefinition> 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());
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;
assertNotNull(container);
assertTrue(container.isPresenceContainer());
- final Set<MustDefinition> musts = container.getConstraints().getMustConstraints();
+ final Collection<MustDefinition> musts = container.getConstraints().getMustConstraints();
assertEquals(2, musts.size());
final Iterator<MustDefinition> mustsIterator = musts.iterator();
import java.net.URI;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.Set;
assertFalse(data.isConfiguration());
final ConstraintDefinition constraints = data.getConstraints();
assertEquals("class != 'wheel'", constraints.getWhenCondition().get().toString());
- final Set<MustDefinition> mustConstraints = constraints.getMustConstraints();
+ final Collection<MustDefinition> mustConstraints = constraints.getMustConstraints();
assertEquals(2, constraints.getMustConstraints().size());
final String must1 = "ifType != 'ethernet' or (ifType = 'ethernet' and ifMTU = 1500)";
// constraints
final ConstraintDefinition constraints = nodes.getConstraints();
assertEquals("class != 'wheel'", constraints.getWhenCondition().get().toString());
- final Set<MustDefinition> mustConstraints = constraints.getMustConstraints();
+ final Collection<MustDefinition> mustConstraints = constraints.getMustConstraints();
assertEquals(2, constraints.getMustConstraints().size());
final String must1 = "ifType != 'atm' or (ifType = 'atm' and ifMTU <= 17966 and ifMTU >= 64)";
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;
assertEquals(Optional.of("address reference added by refine"), refineLeaf.getReference());
assertFalse(refineLeaf.isConfiguration());
assertTrue(refineLeaf.getConstraints().isMandatory());
- final Set<MustDefinition> leafMustConstraints = refineLeaf.getConstraints().getMustConstraints();
+ final Collection<MustDefinition> 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<MustDefinition> mustConstraints = refineContainer.getConstraints().getMustConstraints();
+ final Collection<MustDefinition> 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());