From: Robert Varga Date: Tue, 4 Feb 2020 18:30:04 +0000 (+0100) Subject: Refactor anyxml/anydata X-Git-Tag: v4.0.7~14 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=a20e641241a48049d3fb7c7f8319c533edf1b195;p=yangtools.git Refactor anyxml/anydata These are quite simple classes, which are needlessly bloated. Fix up implementation classes to shed ~50% of overhead. This also leaves AbstractEffectiveMustConstraintAwareDataSchemaNode without any users, hence we mark it for removal. JIRA: YANGTOOLS-1065 Change-Id: I206b186e058f493a9b90aa2ed7529be0d88a1fc7 Signed-off-by: Robert Varga --- diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/AnydataEffectiveStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/AnydataEffectiveStatement.java index d88a2c96b4..69ac8bf18a 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/AnydataEffectiveStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/AnydataEffectiveStatement.java @@ -8,8 +8,13 @@ package org.opendaylight.yangtools.yang.model.api.stmt; import com.google.common.annotations.Beta; +import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; +import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; @Beta public interface AnydataEffectiveStatement extends DataTreeEffectiveStatement { - + @Override + default StatementDefinition statementDefinition() { + return YangStmtMapping.ANYDATA; + } } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/AnydataStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/AnydataStatement.java index 0b0325b88a..cf9f5d70f1 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/AnydataStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/AnydataStatement.java @@ -9,6 +9,8 @@ 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.StatementDefinition; /** * The "anydata" statement defines an interior node in the schema tree. It takes one argument, which is an identifier, @@ -22,6 +24,9 @@ import org.opendaylight.yangtools.yang.common.QName; */ @Beta public interface AnydataStatement extends DataDefinitionStatement, ConfigStatementAwareDeclaredStatement, - MandatoryStatementAwareDeclaredStatement, MustStatementAwareDeclaredStatement { - + MandatoryStatementAwareDeclaredStatement, MustStatementAwareDeclaredStatement { + @Override + default StatementDefinition statementDefinition() { + return YangStmtMapping.ANYDATA; + } } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/AnyxmlEffectiveStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/AnyxmlEffectiveStatement.java index 9e8fdaa537..87708948d3 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/AnyxmlEffectiveStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/AnyxmlEffectiveStatement.java @@ -8,8 +8,14 @@ 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.model.api.YangStmtMapping; +import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; @Beta public interface AnyxmlEffectiveStatement extends DataTreeEffectiveStatement { - + @Override + default @NonNull StatementDefinition statementDefinition() { + return YangStmtMapping.ANYXML; + } } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/AnyxmlStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/AnyxmlStatement.java index c10b472aec..0a91b48821 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/AnyxmlStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/AnyxmlStatement.java @@ -7,9 +7,15 @@ */ package org.opendaylight.yangtools.yang.model.api.stmt; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; +import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; public interface AnyxmlStatement extends DataDefinitionStatement, ConfigStatementAwareDeclaredStatement, - MandatoryStatementAwareDeclaredStatement, MustStatementAwareDeclaredStatement { - + MandatoryStatementAwareDeclaredStatement, MustStatementAwareDeclaredStatement { + @Override + default @NonNull StatementDefinition statementDefinition() { + return YangStmtMapping.ANYXML; + } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveMustConstraintAwareDataSchemaNode.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveMustConstraintAwareDataSchemaNode.java index 12226f34b5..2cfea879d2 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveMustConstraintAwareDataSchemaNode.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveMustConstraintAwareDataSchemaNode.java @@ -7,7 +7,6 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt; -import com.google.common.annotations.Beta; import com.google.common.collect.ImmutableSet; import java.lang.invoke.MethodHandles; import java.lang.invoke.VarHandle; @@ -17,7 +16,7 @@ import org.opendaylight.yangtools.yang.model.api.MustDefinition; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; -@Beta +@Deprecated(forRemoval = true) public abstract class AbstractEffectiveMustConstraintAwareDataSchemaNode> extends AbstractEffectiveDataSchemaNode implements MustConstraintAware { private static final VarHandle MUST_CONSTRAINTS; diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/EffectiveStatementMixins.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/EffectiveStatementMixins.java index 2ca462fea7..3ca01d62ca 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/EffectiveStatementMixins.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/EffectiveStatementMixins.java @@ -29,6 +29,7 @@ import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; import org.opendaylight.yangtools.yang.model.api.CopyableNode; import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; +import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode; import org.opendaylight.yangtools.yang.model.api.DocumentedNode; import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; import org.opendaylight.yangtools.yang.model.api.MandatoryAware; @@ -323,7 +324,6 @@ public final class EffectiveStatementMixins { * * @param Class representing declared version of this statement. */ - @Beta public interface OperationContainerMixin> extends ContainerSchemaNode, DocumentedNodeMixin.WithStatus, DataNodeContainerMixin, MustConstraintMixin, WhenConditionMixin, AugmentationTargetMixin, @@ -374,6 +374,25 @@ public final class EffectiveStatementMixins { } } + /** + * Helper bridge for {@code anydata} and {@code anyxml} opaque data.. + * + * @param Class representing declared version of this statement. + */ + public interface OpaqueDataSchemaNodeMixin> + extends DerivableSchemaNode, DataSchemaNodeMixin, DocumentedNodeMixin.WithStatus, + MandatoryMixin, MustConstraintMixin, WhenConditionMixin { + @Override + default @NonNull QName argument() { + return getPath().getLastComponent(); + } + + @Override + default QName getQName() { + return argument(); + } + } + /** * Support interface for various mixins. Implementations are required to store 32bits worth of flags, which are * globally assigned to sub-interfaces -- thus providing storage for many low-cardinality properties. diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/AnydataEffectiveStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/AnydataEffectiveStatementImpl.java deleted file mode 100644 index c0b8d04948..0000000000 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/AnydataEffectiveStatementImpl.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. 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.parser.rfc7950.stmt.anydata; - -import com.google.common.annotations.Beta; -import com.google.common.base.MoreObjects; -import java.util.Objects; -import java.util.Optional; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; -import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode; -import org.opendaylight.yangtools.yang.model.api.stmt.AnydataEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.AnydataStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryEffectiveStatement; -import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveMustConstraintAwareDataSchemaNode; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; - -/** - * YANG 1.1 AnyData effective statement implementation. - */ -@Beta -final class AnydataEffectiveStatementImpl extends AbstractEffectiveMustConstraintAwareDataSchemaNode - implements AnydataEffectiveStatement, AnydataSchemaNode, DerivableSchemaNode { - - private final AnydataSchemaNode original; - private final ContainerSchemaNode schema; - private final boolean mandatory; - - AnydataEffectiveStatementImpl(final StmtContext ctx) { - super(ctx); - this.original = (AnydataSchemaNode) ctx.getOriginalCtx().map(StmtContext::buildEffective).orElse(null); - mandatory = findFirstEffectiveSubstatementArgument(MandatoryEffectiveStatement.class).orElse(Boolean.FALSE) - .booleanValue(); - - /* - * :TODO we need to determine a way how to set schema of AnyData - */ - this.schema = null; - } - - @Override - public Optional getOriginal() { - return Optional.ofNullable(original); - } - - @Override - public Optional getDataSchema() { - return Optional.ofNullable(schema); - } - - @Override - public boolean isMandatory() { - return mandatory; - } - - @Override - public int hashCode() { - return Objects.hash(getQName(),getPath()); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - - final AnydataEffectiveStatementImpl other = (AnydataEffectiveStatementImpl) obj; - return Objects.equals(getQName(), other.getQName()) && Objects.equals(getPath(), other.getPath()); - } - - @Override - public String toString() { - return MoreObjects.toStringHelper(this).add("qname", getQName()).add("path", getPath()).toString(); - } -} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/AnydataStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/AnydataStatementSupport.java index e729e8cb0f..7f578b89db 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/AnydataStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/AnydataStatementSupport.java @@ -7,19 +7,28 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anydata; +import com.google.common.collect.ImmutableList; +import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode; +import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; +import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.AnydataEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.AnydataStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement; import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractQNameStatementSupport; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseQNameStatementSupport; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.EffectiveStatementWithFlags.FlagsBuilder; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator; public final class AnydataStatementSupport - extends AbstractQNameStatementSupport { + extends BaseQNameStatementSupport { private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder( YangStmtMapping.ANYDATA) .addOptional(YangStmtMapping.CONFIG) @@ -52,18 +61,49 @@ public final class AnydataStatementSupport } @Override - public AnydataStatement createDeclared(final StmtContext ctx) { - return new AnydataStatementImpl(ctx); + protected SubstatementValidator getSubstatementValidator() { + return SUBSTATEMENT_VALIDATOR; } @Override - public AnydataEffectiveStatement createEffective( - final StmtContext ctx) { - return new AnydataEffectiveStatementImpl(ctx); + protected AnydataStatement createDeclared(final StmtContext ctx, + final ImmutableList> substatements) { + return new RegularAnydataStatement(ctx.coerceStatementArgument(), substatements); } @Override - protected SubstatementValidator getSubstatementValidator() { - return SUBSTATEMENT_VALIDATOR; + protected AnydataStatement createEmptyDeclared(final StmtContext ctx) { + return new EmptyAnydataStatement(ctx.coerceStatementArgument()); + } + + @Override + protected AnydataEffectiveStatement createEffective( + final StmtContext ctx, + final AnydataStatement declared, + final ImmutableList> substatements) { + return new RegularAnydataEffectiveStatement(declared, ctx.getSchemaPath().get(), + computeFlags(ctx, substatements), findOriginal(ctx), substatements); + } + + @Override + protected AnydataEffectiveStatement createEmptyEffective( + final StmtContext ctx, + final AnydataStatement declared) { + return new EmptyAnydataEffectiveStatement(declared, ctx.getSchemaPath().get(), + computeFlags(ctx, ImmutableList.of()), findOriginal(ctx)); + } + + private static int computeFlags(final StmtContext ctx, + final ImmutableList> substatements) { + return new FlagsBuilder() + .setHistory(ctx.getCopyHistory()) + .setStatus(findFirstArgument(substatements, StatusEffectiveStatement.class, Status.CURRENT)) + .setConfiguration(ctx.isConfiguration()) + .setMandatory(findFirstArgument(substatements, MandatoryEffectiveStatement.class, Boolean.FALSE)) + .toFlags(); + } + + private static @Nullable AnydataSchemaNode findOriginal(final StmtContext ctx) { + return (AnydataSchemaNode) ctx.getOriginalCtx().map(StmtContext::buildEffective).orElse(null); } } \ No newline at end of file diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/EmptyAnydataEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/EmptyAnydataEffectiveStatement.java new file mode 100644 index 0000000000..670204ed0d --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/EmptyAnydataEffectiveStatement.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2020 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.parser.rfc7950.stmt.anydata; + +import static java.util.Objects.requireNonNull; + +import com.google.common.base.MoreObjects; +import java.util.Objects; +import java.util.Optional; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode; +import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; +import org.opendaylight.yangtools.yang.model.api.SchemaPath; +import org.opendaylight.yangtools.yang.model.api.stmt.AnydataEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.AnydataStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.Default; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.OpaqueDataSchemaNodeMixin; + +class EmptyAnydataEffectiveStatement extends Default + implements AnydataEffectiveStatement, AnydataSchemaNode, OpaqueDataSchemaNodeMixin { + private final @NonNull SchemaPath path; + private final AnydataSchemaNode original; + private final int flags; + + EmptyAnydataEffectiveStatement(final AnydataStatement declared, final SchemaPath path, final int flags, + final @Nullable AnydataSchemaNode original) { + super(declared); + this.path = requireNonNull(path); + this.flags = flags; + this.original = original; + } + + @Override + public final @NonNull SchemaPath getPath() { + return path; + } + + @Override + public final int flags() { + return flags; + } + + @Override + public final Optional getOriginal() { + return Optional.ofNullable(original); + } + + @Override + public final Optional getDataSchema() { + /* + * :TODO we need to determine a way how to set schema of AnyData + */ + return Optional.empty(); + } + + @Override + public final int hashCode() { + return Objects.hash(getQName(), getPath()); + } + + @Override + public final boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof EmptyAnydataEffectiveStatement)) { + return false; + } + final EmptyAnydataEffectiveStatement other = (EmptyAnydataEffectiveStatement) obj; + return Objects.equals(getQName(), other.getQName()) && Objects.equals(getPath(), other.getPath()); + } + + @Override + public final String toString() { + return MoreObjects.toStringHelper(this).add("qname", getQName()).add("path", getPath()).toString(); + } +} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/EmptyAnydataStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/EmptyAnydataStatement.java new file mode 100644 index 0000000000..593a5ee72a --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/EmptyAnydataStatement.java @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2020 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.parser.rfc7950.stmt.anydata; + +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.stmt.AnydataStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithQNameArgument; + +final class EmptyAnydataStatement extends WithQNameArgument implements AnydataStatement { + EmptyAnydataStatement(final QName argument) { + super(argument); + } +} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/RegularAnydataEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/RegularAnydataEffectiveStatement.java new file mode 100644 index 0000000000..cac8eae299 --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/RegularAnydataEffectiveStatement.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2015 Cisco Systems, Inc. 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.parser.rfc7950.stmt.anydata; + +import com.google.common.collect.ImmutableList; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; +import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode; +import org.opendaylight.yangtools.yang.model.api.SchemaPath; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.AnydataStatement; + +/** + * YANG 1.1 AnyData effective statement implementation. + */ +final class RegularAnydataEffectiveStatement extends EmptyAnydataEffectiveStatement { + private final @NonNull Object substatements; + + RegularAnydataEffectiveStatement(final AnydataStatement declared, final SchemaPath path, final int flags, + final @Nullable AnydataSchemaNode original, + final ImmutableList> substatements) { + super(declared, path, flags, original); + this.substatements = maskList(substatements); + } + + @Override + public ImmutableList> effectiveSubstatements() { + return unmaskList(substatements); + } +} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/AnydataStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/RegularAnydataStatement.java similarity index 53% rename from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/AnydataStatementImpl.java rename to yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/RegularAnydataStatement.java index 6948d151d5..e9cebc1bce 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/AnydataStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/RegularAnydataStatement.java @@ -7,18 +7,17 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anydata; -import com.google.common.annotations.Beta; +import com.google.common.collect.ImmutableList; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.stmt.AnydataStatement; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithQNameArgument.WithSubstatements; /** * YANG 1.1 AnyData declared statement implementation. */ -@Beta -final class AnydataStatementImpl extends AbstractDeclaredStatement implements AnydataStatement { - AnydataStatementImpl(final StmtContext context) { - super(context); +final class RegularAnydataStatement extends WithSubstatements implements AnydataStatement { + RegularAnydataStatement(final QName argument, final ImmutableList> substatements) { + super(argument, substatements); } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/AnyxmlEffectiveStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/AnyxmlEffectiveStatementImpl.java deleted file mode 100644 index e0e8bcd566..0000000000 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/AnyxmlEffectiveStatementImpl.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. 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.parser.rfc7950.stmt.anyxml; - -import java.util.Objects; -import java.util.Optional; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode; -import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode; -import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryEffectiveStatement; -import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveMustConstraintAwareDataSchemaNode; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; - -final class AnyxmlEffectiveStatementImpl extends AbstractEffectiveMustConstraintAwareDataSchemaNode - implements AnyxmlEffectiveStatement, AnyxmlSchemaNode, DerivableSchemaNode { - - private final AnyxmlSchemaNode original; - private final boolean mandatory; - - AnyxmlEffectiveStatementImpl(final StmtContext ctx) { - super(ctx); - this.original = (AnyxmlSchemaNode) ctx.getOriginalCtx().map(StmtContext::buildEffective).orElse(null); - mandatory = findFirstEffectiveSubstatementArgument(MandatoryEffectiveStatement.class).orElse(Boolean.FALSE) - .booleanValue(); - } - - @Override - public boolean isMandatory() { - return mandatory; - } - - @Override - public Optional getOriginal() { - return Optional.ofNullable(original); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + Objects.hashCode(getQName()); - result = prime * result + Objects.hashCode(getPath()); - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - - AnyxmlEffectiveStatementImpl other = (AnyxmlEffectiveStatementImpl) obj; - return Objects.equals(getQName(), other.getQName()) && Objects.equals(getPath(), other.getPath()); - } - - @Override - public String toString() { - return AnyxmlEffectiveStatementImpl.class.getSimpleName() + "[" - + "qname=" + getQName() - + ", path=" + getPath() - + "]"; - } -} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/AnyxmlStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/AnyxmlStatementSupport.java index f2ed909fe4..9a873aae1a 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/AnyxmlStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/AnyxmlStatementSupport.java @@ -7,19 +7,28 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anyxml; +import com.google.common.collect.ImmutableList; +import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode; +import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; +import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement; import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractQNameStatementSupport; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseQNameStatementSupport; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.EffectiveStatementWithFlags.FlagsBuilder; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator; public final class AnyxmlStatementSupport - extends AbstractQNameStatementSupport { + extends BaseQNameStatementSupport { private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping .ANYXML) .addOptional(YangStmtMapping.CONFIG) @@ -52,18 +61,47 @@ public final class AnyxmlStatementSupport } @Override - public AnyxmlStatement createDeclared(final StmtContext ctx) { - return new AnyxmlStatementImpl(ctx); + protected SubstatementValidator getSubstatementValidator() { + return SUBSTATEMENT_VALIDATOR; } @Override - public AnyxmlEffectiveStatement createEffective( - final StmtContext ctx) { - return new AnyxmlEffectiveStatementImpl(ctx); + protected AnyxmlStatement createDeclared(final StmtContext ctx, + final ImmutableList> substatements) { + return new RegularAnyxmlStatement(ctx.coerceStatementArgument(), substatements); } @Override - protected SubstatementValidator getSubstatementValidator() { - return SUBSTATEMENT_VALIDATOR; + protected AnyxmlStatement createEmptyDeclared(final StmtContext ctx) { + return new EmptyAnyxmlStatement(ctx.coerceStatementArgument()); + } + + @Override + protected AnyxmlEffectiveStatement createEffective( + final StmtContext ctx, + final AnyxmlStatement declared, final ImmutableList> substatements) { + return new RegularAnyxmlEffectiveStatement(declared, ctx.getSchemaPath().get(), + computeFlags(ctx, substatements), findOriginal(ctx),substatements); + } + + @Override + protected AnyxmlEffectiveStatement createEmptyEffective( + final StmtContext ctx, final AnyxmlStatement declared) { + return new EmptyAnyxmlEffectiveStatement(declared, ctx.getSchemaPath().get(), + computeFlags(ctx, ImmutableList.of()), findOriginal(ctx)); + } + + private static int computeFlags(final StmtContext ctx, + final ImmutableList> substatements) { + return new FlagsBuilder() + .setHistory(ctx.getCopyHistory()) + .setStatus(findFirstArgument(substatements, StatusEffectiveStatement.class, Status.CURRENT)) + .setConfiguration(ctx.isConfiguration()) + .setMandatory(findFirstArgument(substatements, MandatoryEffectiveStatement.class, Boolean.FALSE)) + .toFlags(); + } + + private static @Nullable AnyxmlSchemaNode findOriginal(final StmtContext ctx) { + return (AnyxmlSchemaNode) ctx.getOriginalCtx().map(StmtContext::buildEffective).orElse(null); } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/EmptyAnyxmlEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/EmptyAnyxmlEffectiveStatement.java new file mode 100644 index 0000000000..911a130e35 --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/EmptyAnyxmlEffectiveStatement.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2020 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.parser.rfc7950.stmt.anyxml; + +import static java.util.Objects.requireNonNull; + +import com.google.common.base.MoreObjects; +import java.util.Objects; +import java.util.Optional; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode; +import org.opendaylight.yangtools.yang.model.api.SchemaPath; +import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.Default; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.OpaqueDataSchemaNodeMixin; + +class EmptyAnyxmlEffectiveStatement extends Default + implements AnyxmlEffectiveStatement, AnyxmlSchemaNode, OpaqueDataSchemaNodeMixin { + private final @NonNull SchemaPath path; + private final AnyxmlSchemaNode original; + private final int flags; + + EmptyAnyxmlEffectiveStatement(final AnyxmlStatement declared, final SchemaPath path, final int flags, + final @Nullable AnyxmlSchemaNode original) { + super(declared); + this.path = requireNonNull(path); + this.flags = flags; + this.original = original; + } + + @Override + public final @NonNull SchemaPath getPath() { + return path; + } + + @Override + public final int flags() { + return flags; + } + + @Override + public final Optional getOriginal() { + return Optional.ofNullable(original); + } + + @Override + public final int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + Objects.hashCode(getQName()); + result = prime * result + Objects.hashCode(getPath()); + return result; + } + + @Override + public final boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof EmptyAnyxmlEffectiveStatement)) { + return false; + } + + EmptyAnyxmlEffectiveStatement other = (EmptyAnyxmlEffectiveStatement) obj; + return Objects.equals(getQName(), other.getQName()) && Objects.equals(getPath(), other.getPath()); + } + + @Override + public final String toString() { + return MoreObjects.toStringHelper(this).add("qname", getQName()).add("path", getPath()).toString(); + } +} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/EmptyAnyxmlStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/EmptyAnyxmlStatement.java new file mode 100644 index 0000000000..19df08c8ac --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/EmptyAnyxmlStatement.java @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2020 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.parser.rfc7950.stmt.anyxml; + +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithQNameArgument; + +final class EmptyAnyxmlStatement extends WithQNameArgument implements AnyxmlStatement { + EmptyAnyxmlStatement(final QName argument) { + super(argument); + } +} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/RegularAnyxmlEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/RegularAnyxmlEffectiveStatement.java new file mode 100644 index 0000000000..de7bf25899 --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/RegularAnyxmlEffectiveStatement.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2015 Cisco Systems, Inc. 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.parser.rfc7950.stmt.anyxml; + +import com.google.common.collect.ImmutableList; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; +import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode; +import org.opendaylight.yangtools.yang.model.api.SchemaPath; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement; + +final class RegularAnyxmlEffectiveStatement extends EmptyAnyxmlEffectiveStatement { + private final @NonNull Object substatements; + + RegularAnyxmlEffectiveStatement(final AnyxmlStatement declared, final SchemaPath path, final int flags, + final @Nullable AnyxmlSchemaNode original, + final ImmutableList> substatements) { + super(declared, path, flags, original); + this.substatements = maskList(substatements); + } + + @Override + public ImmutableList> effectiveSubstatements() { + return unmaskList(substatements); + } +} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/AnyxmlStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/RegularAnyxmlStatement.java similarity index 50% rename from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/AnyxmlStatementImpl.java rename to yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/RegularAnyxmlStatement.java index ae94414f6b..630ce4d2c8 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/AnyxmlStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/RegularAnyxmlStatement.java @@ -7,13 +7,14 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anyxml; +import com.google.common.collect.ImmutableList; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithQNameArgument.WithSubstatements; -final class AnyxmlStatementImpl extends AbstractDeclaredStatement implements AnyxmlStatement { - AnyxmlStatementImpl(final StmtContext context) { - super(context); +final class RegularAnyxmlStatement extends WithSubstatements implements AnyxmlStatement { + RegularAnyxmlStatement(final QName argument, final ImmutableList> substatements) { + super(argument, substatements); } } diff --git a/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserSimpleTest.java b/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserSimpleTest.java index 328ac01b3d..33268a1351 100644 --- a/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserSimpleTest.java +++ b/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserSimpleTest.java @@ -58,8 +58,8 @@ public class YangParserSimpleTest { QName.create(testModule.getQNameModule(), "data")); assertNotNull("'anyxml data not found'", data); assertFalse(data.equals(null)); - assertEquals("AnyxmlEffectiveStatementImpl[qname=(urn:opendaylight:simple-nodes?revision=2013-07-30)data, " - + "path=AbsoluteSchemaPath{path=[(urn:opendaylight:simple-nodes?revision=2013-07-30)data]}]", + assertEquals("RegularAnyxmlEffectiveStatement{qname=(urn:opendaylight:simple-nodes?revision=2013-07-30)data, " + + "path=AbsoluteSchemaPath{path=[(urn:opendaylight:simple-nodes?revision=2013-07-30)data]}}", data.toString()); // test SchemaNode args @@ -104,7 +104,7 @@ public class YangParserSimpleTest { QName.create(testModule.getQNameModule(), "data2")).orElse(null); assertNotNull("'anydata data not found'", anydata); - assertEquals("AnydataEffectiveStatementImpl{qname=(urn:opendaylight:simple-nodes?revision=2013-07-30)data2, " + assertEquals("RegularAnydataEffectiveStatement{qname=(urn:opendaylight:simple-nodes?revision=2013-07-30)data2, " + "path=AbsoluteSchemaPath{path=[(urn:opendaylight:simple-nodes?revision=2013-07-30)data2]}}", anydata.toString());