From: Robert Varga Date: Fri, 29 Jan 2021 21:03:32 +0000 (+0100) Subject: Use instantiatedPolicy() in list statement X-Git-Tag: v7.0.0~250 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=715fbf4e5f4835ed466f4ea5000937465ffd971c;p=yangtools.git Use instantiatedPolicy() in list statement This conversion turns out to be quite simple, but don't forget to add tests. JIRA: YANGTOOLS-1208 Change-Id: I39071d4147b679dc88d132e37fa65fe5a202e199 Signed-off-by: Robert Varga --- diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/AbstractListEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/AbstractListEffectiveStatement.java index 9dfa63a5ab..affaebfff3 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/AbstractListEffectiveStatement.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/AbstractListEffectiveStatement.java @@ -59,6 +59,15 @@ abstract class AbstractListEffectiveStatement this.flags = flags; } + AbstractListEffectiveStatement(final AbstractListEffectiveStatement original, final SchemaPath path, + final int flags) { + super(original); + this.substatements = original.substatements; + this.keyDefinition = original.keyDefinition; + this.path = path; + this.flags = flags; + } + @Override public final ImmutableList> effectiveSubstatements() { return unmaskList(substatements); diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/EmptyListEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/EmptyListEffectiveStatement.java index 03b9c21613..b7a64b63ef 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/EmptyListEffectiveStatement.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/EmptyListEffectiveStatement.java @@ -23,6 +23,10 @@ final class EmptyListEffectiveStatement extends AbstractListEffectiveStatement { super(declared, path, flags, substatements, keyDefinition); } + EmptyListEffectiveStatement(final EmptyListEffectiveStatement original, final SchemaPath path, final int flags) { + super(original, path, flags); + } + @Override public Optional getOriginal() { return Optional.empty(); diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/ListStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/ListStatementSupport.java index e667748424..c0237ff8ad 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/ListStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/ListStatementSupport.java @@ -14,6 +14,7 @@ import com.google.common.annotations.Beta; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import java.util.ArrayList; +import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Optional; @@ -113,7 +114,7 @@ public final class ListStatementSupport extends BaseSchemaTreeStatementSupport stmt, + final ListEffectiveStatement original) { + final int flags = computeFlags(stmt, original.effectiveSubstatements()); + if (original instanceof EmptyListEffectiveStatement) { + return new EmptyListEffectiveStatement((EmptyListEffectiveStatement) original, stmt.wrapSchemaPath(), + flags); + } else if (original instanceof RegularListEffectiveStatement) { + return new RegularListEffectiveStatement((RegularListEffectiveStatement) original, stmt.wrapSchemaPath(), + flags); + } else { + // Safe fallback + return super.copyEffective(stmt, original); + } + } + @Override protected ListEffectiveStatement createEffective(final Current stmt, final ImmutableList> substatements) { @@ -167,15 +184,8 @@ public final class ListStatementSupport extends BaseSchemaTreeStatementSupport stmt, + final Collection> substatements) { + return new FlagsBuilder() + .setHistory(stmt.history()) + .setStatus(findFirstArgument(substatements, StatusEffectiveStatement.class, Status.CURRENT)) + .setConfiguration(stmt.effectiveConfig().asNullable()) + .setUserOrdered(findFirstArgument(substatements, OrderedByEffectiveStatement.class, Ordering.SYSTEM) + .equals(Ordering.USER)) + .toFlags(); + } + private static void warnConfigList(final @NonNull Current stmt) { final StatementSourceReference ref = stmt.sourceReference(); final Boolean warned = stmt.getFromNamespace(ConfigListWarningNamespace.class, ref); diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/RegularListEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/RegularListEffectiveStatement.java index 582fbff4e6..b38657a696 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/RegularListEffectiveStatement.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/RegularListEffectiveStatement.java @@ -29,6 +29,13 @@ final class RegularListEffectiveStatement extends AbstractListEffectiveStatement this.original = original; } + RegularListEffectiveStatement(final RegularListEffectiveStatement original, final SchemaPath path, + final int flags) { + super(original, path, flags); + this.elementCountConstraint = original.elementCountConstraint; + this.original = original.original; + } + @Override public Optional getOriginal() { return Optional.ofNullable(original); diff --git a/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/YT1208Test.java b/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/YT1208Test.java index c0aa06aa61..d43f7b82c0 100644 --- a/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/YT1208Test.java +++ b/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/YT1208Test.java @@ -20,6 +20,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.ContainerEffectiveStatemen import org.opendaylight.yangtools.yang.model.api.stmt.GroupingEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.LeafEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.LeafListEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.ListEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.NotificationEffectiveStatement; @@ -149,4 +150,25 @@ public class YT1208Test { assertSame(contBar, grpBar); } + + @Test + public void testListStatementReuse() throws Exception { + final ModuleEffectiveStatement module = StmtTestUtils.parseYangSource("/bugs/YT1208/list.yang") + .getModuleStatements() + .get(QNameModule.create(URI.create("foo"))); + assertNotNull(module); + + final NotificationEffectiveStatement notif = module + .findFirstEffectiveSubstatement(NotificationEffectiveStatement.class).orElseThrow(); + + final ListEffectiveStatement grpBar = notif + .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow() + .findFirstEffectiveSubstatement(ListEffectiveStatement.class).orElseThrow(); + final ListEffectiveStatement contBar = notif + .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow() + .findFirstEffectiveSubstatement(ListEffectiveStatement.class).orElseThrow(); + + assertSame(contBar, grpBar); + } + } diff --git a/yang/yang-parser-rfc7950/src/test/resources/bugs/YT1208/list.yang b/yang/yang-parser-rfc7950/src/test/resources/bugs/YT1208/list.yang new file mode 100644 index 0000000000..68a210ab40 --- /dev/null +++ b/yang/yang-parser-rfc7950/src/test/resources/bugs/YT1208/list.yang @@ -0,0 +1,21 @@ +module foo { + namespace foo; + prefix foo; + + grouping grp { + list bar { + description "desc"; + reference "ref"; + } + } + + notification foo { + grouping foo { + uses grp; + } + + container foo { + uses foo; + } + } +}