From: Robert Varga Date: Thu, 2 Jul 2020 14:30:33 +0000 (+0200) Subject: Optimize unique statement implementations X-Git-Tag: v5.0.4~43 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=9234581454ebf6b610f8c6369950516684e7392a;p=yangtools.git Optimize unique statement implementations unique is a simple statement, optimize the memory layout of its implementation classes. JIRA: YANGTOOLS-1065 Change-Id: Idccce468b38726ac25851b11352528c489e92b5e Signed-off-by: Robert Varga --- diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/UniqueConstraint.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/UniqueConstraint.java index 36f4853d88..4082d4e411 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/UniqueConstraint.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/UniqueConstraint.java @@ -21,6 +21,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Desce * leafs exist (for more information see RFC-6020 section 7.8.3.). */ @Beta +// FIXME: 6.0.0: replace all usages of this class with UniqueEffectiveStatement and remove this public interface UniqueConstraint { @NonNull Set getTag(); } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/UniqueEffectiveStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/UniqueEffectiveStatement.java index 649013b767..206aba9a04 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/UniqueEffectiveStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/UniqueEffectiveStatement.java @@ -9,10 +9,15 @@ package org.opendaylight.yangtools.yang.model.api.stmt; import com.google.common.annotations.Beta; import java.util.Set; +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; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant; @Beta public interface UniqueEffectiveStatement extends EffectiveStatement, UniqueStatement> { - + @Override + default StatementDefinition statementDefinition() { + return YangStmtMapping.UNIQUE; + } } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/UniqueStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/UniqueStatement.java index 9d05a24023..165f413a5c 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/UniqueStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/UniqueStatement.java @@ -10,10 +10,16 @@ package org.opendaylight.yangtools.yang.model.api.stmt; import static com.google.common.base.Verify.verifyNotNull; import java.util.Set; +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.StatementDefinition; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant; public interface UniqueStatement extends DeclaredStatement> { + @Override + default StatementDefinition statementDefinition() { + return YangStmtMapping.UNIQUE; + } default Set getTag() { // FIXME: YANGTOOLS-908: verifyNotNull() should not be needed here diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/UniqueEffectiveStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/EmptyUniqueEffectiveStatement.java similarity index 59% rename from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/UniqueEffectiveStatementImpl.java rename to yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/EmptyUniqueEffectiveStatement.java index 62ac291313..4c7cf36800 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/UniqueEffectiveStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/EmptyUniqueEffectiveStatement.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * 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, @@ -14,17 +14,16 @@ import org.opendaylight.yangtools.yang.model.api.UniqueConstraint; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant; import org.opendaylight.yangtools.yang.model.api.stmt.UniqueEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.UniqueStatement; -import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.DeclaredEffectiveStatementBase; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultArgument; -final class UniqueEffectiveStatementImpl extends DeclaredEffectiveStatementBase, UniqueStatement> - implements UniqueConstraint, UniqueEffectiveStatement { - UniqueEffectiveStatementImpl(final StmtContext, UniqueStatement, ?> ctx) { - super(ctx); +class EmptyUniqueEffectiveStatement extends DefaultArgument, UniqueStatement> + implements UniqueEffectiveStatement, UniqueConstraint { + EmptyUniqueEffectiveStatement(final UniqueStatement declared) { + super(declared); } @Override - public Set getTag() { + public final Set getTag() { // FIXME: YANGTOOLS-908: verifyNotNull() should not be needed here return verifyNotNull(argument()); } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/UniqueStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/EmptyUniqueStatement.java similarity index 61% rename from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/UniqueStatementImpl.java rename to yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/EmptyUniqueStatement.java index 2dc6de9583..e4d74939f7 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/UniqueStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/EmptyUniqueStatement.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * 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, @@ -10,11 +10,11 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.unique; import java.util.Set; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant; import org.opendaylight.yangtools.yang.model.api.stmt.UniqueStatement; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithArgument; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; -final class UniqueStatementImpl extends AbstractDeclaredStatement> implements UniqueStatement { - UniqueStatementImpl(final StmtContext, UniqueStatement, ?> context) { +final class EmptyUniqueStatement extends WithArgument> implements UniqueStatement { + EmptyUniqueStatement(final StmtContext, ?, ?> context) { super(context); } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/RegularUniqueEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/RegularUniqueEffectiveStatement.java new file mode 100644 index 0000000000..0b3579566a --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/RegularUniqueEffectiveStatement.java @@ -0,0 +1,28 @@ +/* + * 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.unique; + +import com.google.common.collect.ImmutableList; +import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.UniqueStatement; + +final class RegularUniqueEffectiveStatement extends EmptyUniqueEffectiveStatement { + private final @NonNull Object substatements; + + RegularUniqueEffectiveStatement(final UniqueStatement declared, + final ImmutableList> substatements) { + super(declared); + 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/unique/RegularUniqueStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/RegularUniqueStatement.java new file mode 100644 index 0000000000..ffd66387e1 --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/RegularUniqueStatement.java @@ -0,0 +1,23 @@ +/* + * 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.unique; + +import com.google.common.collect.ImmutableList; +import java.util.Set; +import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant; +import org.opendaylight.yangtools.yang.model.api.stmt.UniqueStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithArgument.WithSubstatements; +import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; + +final class RegularUniqueStatement extends WithSubstatements> implements UniqueStatement { + RegularUniqueStatement(final StmtContext, ?, ?> context, + final ImmutableList> substatements) { + super(context, substatements); + } +} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/UniqueStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/UniqueStatementSupport.java index 6e0154a85f..d38cc11fa0 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/UniqueStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/UniqueStatementSupport.java @@ -9,24 +9,27 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.unique; import com.google.common.base.CharMatcher; import com.google.common.base.Splitter; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import java.util.HashSet; import java.util.Set; import java.util.regex.Pattern; 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.SchemaNodeIdentifier; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant; import org.opendaylight.yangtools.yang.model.api.stmt.UniqueEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.UniqueStatement; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.ArgumentUtils; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; public final class UniqueStatementSupport - extends AbstractStatementSupport, UniqueStatement, UniqueEffectiveStatement> { + extends BaseStatementSupport, UniqueStatement, UniqueEffectiveStatement> { /** * Support 'sep' ABNF rule in RFC7950 section 14. CRLF pattern is used to squash line-break from CRLF to LF form * and then we use SEP_SPLITTER, which can operate on single characters. @@ -49,8 +52,8 @@ public final class UniqueStatementSupport } @Override - public Set parseArgumentValue(final StmtContext ctx, final String value) { - final Set uniqueConstraints = parseUniqueConstraintArgument(ctx, value); + public ImmutableSet parseArgumentValue(final StmtContext ctx, final String value) { + final ImmutableSet uniqueConstraints = parseUniqueConstraintArgument(ctx, value); SourceException.throwIf(uniqueConstraints.isEmpty(), ctx.getStatementSourceReference(), "Invalid argument value '%s' of unique statement. The value must contains at least " + "one descendant schema node identifier.", value); @@ -58,22 +61,36 @@ public final class UniqueStatementSupport } @Override - public UniqueStatement createDeclared(final StmtContext, UniqueStatement, ?> ctx) { - return new UniqueStatementImpl(ctx); + protected SubstatementValidator getSubstatementValidator() { + return SUBSTATEMENT_VALIDATOR; } @Override - public UniqueEffectiveStatement createEffective( - final StmtContext, UniqueStatement, UniqueEffectiveStatement> ctx) { - return new UniqueEffectiveStatementImpl(ctx); + protected UniqueStatement createDeclared(final StmtContext, UniqueStatement, ?> ctx, + final ImmutableList> substatements) { + return new RegularUniqueStatement(ctx, substatements); } @Override - protected SubstatementValidator getSubstatementValidator() { - return SUBSTATEMENT_VALIDATOR; + protected UniqueStatement createEmptyDeclared(final StmtContext, UniqueStatement, ?> ctx) { + return new EmptyUniqueStatement(ctx); + } + + @Override + protected UniqueEffectiveStatement createEffective( + final StmtContext, UniqueStatement, UniqueEffectiveStatement> ctx, + final UniqueStatement declared, final ImmutableList> substatements) { + return new RegularUniqueEffectiveStatement(declared, substatements); + } + + @Override + protected UniqueEffectiveStatement createEmptyEffective( + final StmtContext, UniqueStatement, UniqueEffectiveStatement> ctx, + final UniqueStatement declared) { + return new EmptyUniqueEffectiveStatement(declared); } - private static Set parseUniqueConstraintArgument(final StmtContext ctx, + private static ImmutableSet parseUniqueConstraintArgument(final StmtContext ctx, final String argumentValue) { // deal with 'line-break' rule, which is either "\n" or "\r\n", but not "\r" final String nocrlf = CRLF_PATTERN.matcher(argumentValue).replaceAll("\n");