From: Robert Varga Date: Fri, 11 Feb 2022 22:16:07 +0000 (+0100) Subject: Add OrderedByAwareEffectiveStatement X-Git-Tag: v8.0.0~35 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;ds=sidebyside;h=2f876c1b23616d34913171225872ef7488da2f1b;hp=cf004535a88be1b4b28ed50e0901e6d52f3a2101;p=yangtools.git Add OrderedByAwareEffectiveStatement Add OrderedByAwareEffectiveStatement and UserOrderedAware interfaces to capture inquiries about how child data nodes are to be ordered. JIRA: YANGTOOLS-1399 Change-Id: I52e4da6bc86593730f7927e8b5435dd9a80e4677 Signed-off-by: Robert Varga --- diff --git a/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/LeafListSchemaNode.java b/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/LeafListSchemaNode.java index 68a8f01ad0..f4ac0a103e 100644 --- a/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/LeafListSchemaNode.java +++ b/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/LeafListSchemaNode.java @@ -15,15 +15,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.LeafListEffectiveStatement * Interface describing YANG 'leaf-list' statement. */ public interface LeafListSchemaNode extends TypedDataSchemaNode, MustConstraintAware, ElementCountConstraintAware, - EffectiveStatementEquivalent { - /** - * YANG 'ordered-by' statement. It defines whether the order of entries - * within this leaf-list are determined by the user or the system. If not - * present, default is false. - * - * @return true if ordered-by argument is "user", false otherwise - */ - boolean isUserOrdered(); + UserOrderedAware { /** * Return the default value of this leaf-list, as per the rules outlined in diff --git a/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/ListSchemaNode.java b/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/ListSchemaNode.java index 48dd9b7994..7b27eaece2 100644 --- a/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/ListSchemaNode.java +++ b/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/ListSchemaNode.java @@ -23,7 +23,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.UniqueEffectiveStatement; */ public interface ListSchemaNode extends DataNodeContainer, AugmentationTarget, DataSchemaNode, ActionNodeContainer, NotificationNodeContainer, ElementCountConstraintAware, MustConstraintAware, - EffectiveStatementEquivalent { + UserOrderedAware { /** * Returns the list of leaf identifiers. * @@ -31,14 +31,6 @@ public interface ListSchemaNode extends DataNodeContainer, AugmentationTarget, D */ @NonNull List<@NonNull QName> getKeyDefinition(); - /** - * YANG 'ordered-by' statement. It defines whether the order of entries within a list are determined by the user - * or the system. If not present, default is false. - * - * @return true if ordered-by argument is "user", false otherwise - */ - boolean isUserOrdered(); - /** * Returns unique constraints. * diff --git a/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/UserOrderedAware.java b/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/UserOrderedAware.java new file mode 100644 index 0000000000..96d625bd06 --- /dev/null +++ b/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/UserOrderedAware.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2022 PANTHEON.tech, 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 org.opendaylight.yangtools.yang.common.Ordering; +import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByAwareEffectiveStatement; + +/** + * Common interface for {@link DataSchemaNode}s which can have an {@code ordered-by} substatement. + * + * @param Effective representation of the underlying YANG statement + */ +@Beta +public interface UserOrderedAware> + extends EffectiveStatementEquivalent { + /** + * YANG {@code ordered-by} statement. It defines whether the order of entries within this node are determined by the + * user or the system. If not present, default is false. + * + * @return true if ordered-by argument is {@code user}, false otherwise + */ + default boolean isUserOrdered() { + return asEffectiveStatement().ordering() == Ordering.USER; + } +} diff --git a/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/LeafListEffectiveStatement.java b/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/LeafListEffectiveStatement.java index 27bf292efd..4d67fe35fc 100644 --- a/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/LeafListEffectiveStatement.java +++ b/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/LeafListEffectiveStatement.java @@ -8,11 +8,18 @@ package org.opendaylight.yangtools.yang.model.api.stmt; import com.google.common.annotations.Beta; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; +/** + * {@link EffectiveStatement} representation of a {@code leaf-list} statement as defined by + * RFC7950. + */ @Beta -public interface LeafListEffectiveStatement extends DataTreeEffectiveStatement { +public interface LeafListEffectiveStatement extends DataTreeEffectiveStatement, + OrderedByAwareEffectiveStatement { @Override default StatementDefinition statementDefinition() { return YangStmtMapping.LEAF_LIST; diff --git a/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/ListEffectiveStatement.java b/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/ListEffectiveStatement.java index eb717ac896..157a44888e 100644 --- a/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/ListEffectiveStatement.java +++ b/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/ListEffectiveStatement.java @@ -10,11 +10,16 @@ package org.opendaylight.yangtools.yang.model.api.stmt; import com.google.common.annotations.Beta; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; +/** + * {@link EffectiveStatement} representation of a {@code list} statement as defined by + * RFC7950. + */ @Beta public interface ListEffectiveStatement extends DataTreeEffectiveStatement, - DataTreeAwareEffectiveStatement { + DataTreeAwareEffectiveStatement, OrderedByAwareEffectiveStatement { @Override default StatementDefinition statementDefinition() { return YangStmtMapping.LIST; diff --git a/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/OrderedByAwareEffectiveStatement.java b/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/OrderedByAwareEffectiveStatement.java new file mode 100644 index 0000000000..2784004a46 --- /dev/null +++ b/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/OrderedByAwareEffectiveStatement.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2022 PANTHEON.tech, 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.stmt; + +import com.google.common.annotations.Beta; +import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.yangtools.yang.common.Empty; +import org.opendaylight.yangtools.yang.common.Ordering; +import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; + +/** + * An {@link EffectiveStatement} which can contain an {@link OrderedByEffectiveStatement}, controlling ordering of + * data elements. Absence of an {@code ordered-by} statement implies {@link Ordering#SYSTEM}. YANG statements using + * this interface are {@link LeafListEffectiveStatement} and {@link ListEffectiveStatement}. + * + * @param Argument type ({@link Empty} if statement does not have argument.) + * @param Class representing declared version of this statement. + */ +@Beta +public interface OrderedByAwareEffectiveStatement> extends EffectiveStatement { + /** + * Return the effective {@link Ordering} of this statement. + * + * @return Effective ordering + */ + default @NonNull Ordering ordering() { + return findFirstEffectiveSubstatementArgument(OrderedByEffectiveStatement.class).orElse(Ordering.SYSTEM); + } +} diff --git a/model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/AbstractLeafListEffectiveStatement.java b/model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/AbstractLeafListEffectiveStatement.java index b57e5b96fe..d9458c7ce2 100644 --- a/model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/AbstractLeafListEffectiveStatement.java +++ b/model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/AbstractLeafListEffectiveStatement.java @@ -21,11 +21,12 @@ import org.opendaylight.yangtools.yang.model.ri.type.ConcreteTypes; import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredEffectiveStatement; import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.DataSchemaNodeMixin; import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.MustConstraintMixin; -import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.UserOrderedMixin; +import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.UserOrderedAwareMixin; abstract class AbstractLeafListEffectiveStatement extends AbstractDeclaredEffectiveStatement.Default - implements LeafListEffectiveStatement, LeafListSchemaNode, UserOrderedMixin, + implements LeafListEffectiveStatement, LeafListSchemaNode, + UserOrderedAwareMixin, DataSchemaNodeMixin, MustConstraintMixin { private static final VarHandle TYPE; @@ -67,11 +68,6 @@ abstract class AbstractLeafListEffectiveStatement return flags; } - @Override - public final boolean isUserOrdered() { - return userOrdered(); - } - @Override public final LeafListEffectiveStatement asEffectiveStatement() { return this; diff --git a/model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/AbstractListEffectiveStatement.java b/model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/AbstractListEffectiveStatement.java index 05742d7dfe..3b33f694cf 100644 --- a/model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/AbstractListEffectiveStatement.java +++ b/model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/AbstractListEffectiveStatement.java @@ -27,7 +27,7 @@ import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.D import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.DataSchemaNodeMixin; import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.MustConstraintMixin; import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.NotificationNodeContainerMixin; -import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.UserOrderedMixin; +import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.UserOrderedAwareMixin; import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.WhenConditionMixin; abstract class AbstractListEffectiveStatement @@ -35,7 +35,7 @@ abstract class AbstractListEffectiveStatement implements ListEffectiveStatement, ListSchemaNode, ActionNodeContainerCompat, NotificationNodeContainerCompat, - DataSchemaNodeMixin, UserOrderedMixin, + DataSchemaNodeMixin, UserOrderedAwareMixin, DataNodeContainerMixin, WhenConditionMixin, AugmentationTargetMixin, NotificationNodeContainerMixin, ActionNodeContainerMixin, MustConstraintMixin { @@ -61,11 +61,6 @@ abstract class AbstractListEffectiveStatement return flags; } - @Override - public final boolean isUserOrdered() { - return userOrdered(); - } - @Override public final List getKeyDefinition() { return unmaskList(keyDefinition, QName.class); diff --git a/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/EffectiveStatementMixins.java b/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/EffectiveStatementMixins.java index b0b0e6780b..0d8cbf5306 100644 --- a/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/EffectiveStatementMixins.java +++ b/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/EffectiveStatementMixins.java @@ -43,6 +43,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaNode; import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; +import org.opendaylight.yangtools.yang.model.api.UserOrderedAware; import org.opendaylight.yangtools.yang.model.api.UsesNode; import org.opendaylight.yangtools.yang.model.api.WhenConditionAware; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; @@ -51,6 +52,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionEffectiveStatem import org.opendaylight.yangtools.yang.model.api.stmt.ErrorAppTagEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.InputEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByAwareEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.OutputEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement; @@ -336,9 +338,15 @@ public final class EffectiveStatementMixins { * * @param Argument type ({@link Empty} if statement does not have argument.) * @param Class representing declared version of this statement. + * @param Class representing effective version of this statement. */ - public interface UserOrderedMixin> extends EffectiveStatementWithFlags { - default boolean userOrdered() { + // FIXME: 9.0.0: remove this mixin once we have a properly-cached DataTree and JSON/XML codec tree and the speed + // of isUserOrdered() is not really critical. + public interface UserOrderedAwareMixin, + E extends OrderedByAwareEffectiveStatement> + extends EffectiveStatementWithFlags, UserOrderedAware { + @Override + default boolean isUserOrdered() { return (flags() & FlagsBuilder.USER_ORDERED) != 0; } }