From: Robert Varga Date: Mon, 3 Feb 2020 10:27:54 +0000 (+0100) Subject: Refactor min-elements statement implementations X-Git-Tag: v4.0.7~34 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=a4060dbae1bef0fad83337fd1326de8a7cedcade;p=yangtools.git Refactor min-elements statement implementations Migrate MinElements(Effective)Statement to improve their memory footprint. JIRA: YANGTOOLS-652 Change-Id: Iddf0d2d61d304eadefbf4433d4bd8f731aa4cefa Signed-off-by: Robert Varga --- diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/MinElementsEffectiveStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/MinElementsEffectiveStatement.java index e623fa25d8..6da990db03 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/MinElementsEffectiveStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/MinElementsEffectiveStatement.java @@ -8,9 +8,14 @@ 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.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; @Beta public interface MinElementsEffectiveStatement extends EffectiveStatement { - + @Override + default StatementDefinition statementDefinition() { + return YangStmtMapping.MIN_ELEMENTS; + } } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/MinElementsStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/MinElementsStatement.java index 5105e33a6a..20c50fa96f 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/MinElementsStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/MinElementsStatement.java @@ -10,9 +10,16 @@ package org.opendaylight.yangtools.yang.model.api.stmt; import static com.google.common.base.Verify.verifyNotNull; import org.eclipse.jdt.annotation.NonNull; +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; public interface MinElementsStatement extends DeclaredStatement { + @Override + default StatementDefinition statementDefinition() { + return YangStmtMapping.MIN_ELEMENTS; + } + default @NonNull Integer getValue() { // 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/min_elements/EmptyMinElementsEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/min_elements/EmptyMinElementsEffectiveStatement.java new file mode 100644 index 0000000000..7451aab6a3 --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/min_elements/EmptyMinElementsEffectiveStatement.java @@ -0,0 +1,19 @@ +/* + * 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.min_elements; + +import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultArgument; + +final class EmptyMinElementsEffectiveStatement extends DefaultArgument + implements MinElementsEffectiveStatement { + EmptyMinElementsEffectiveStatement(final MinElementsStatement declared) { + super(declared); + } +} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/min_elements/EmptyMinElementsStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/min_elements/EmptyMinElementsStatement.java new file mode 100644 index 0000000000..4243e88162 --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/min_elements/EmptyMinElementsStatement.java @@ -0,0 +1,17 @@ +/* + * 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.min_elements; + +import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.ArgumentToString; + +final class EmptyMinElementsStatement extends ArgumentToString implements MinElementsStatement { + EmptyMinElementsStatement(final Integer argument) { + super(argument); + } +} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/min_elements/MinElementsStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/min_elements/MinElementsStatementSupport.java index e8cd390231..79b0909bfe 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/min_elements/MinElementsStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/min_elements/MinElementsStatementSupport.java @@ -7,15 +7,19 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.min_elements; +import com.google.common.collect.ImmutableList; 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.MinElementsEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsStatement; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseInternedStatementSupport; 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 MinElementsStatementSupport - extends AbstractStatementSupport { + extends BaseInternedStatementSupport { private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder( YangStmtMapping.MIN_ELEMENTS) .build(); @@ -31,22 +35,39 @@ public final class MinElementsStatementSupport @Override public Integer parseArgumentValue(final StmtContext ctx, final String value) { - return Integer.parseInt(value); + try { + return Integer.valueOf(value); + } catch (NumberFormatException e) { + throw new SourceException("Invalid min-elements argument", ctx.getStatementSourceReference(), e); + } } @Override - public MinElementsStatement createDeclared(final StmtContext ctx) { - return new MinElementsStatementImpl(ctx); + protected SubstatementValidator getSubstatementValidator() { + return SUBSTATEMENT_VALIDATOR; } @Override - public MinElementsEffectiveStatement createEffective( - final StmtContext ctx) { - return new MinElementsEffectiveStatementImpl(ctx); + protected MinElementsStatement createDeclared(final Integer argument, + final ImmutableList> substatements) { + return new RegularMinElementsStatement(argument, substatements); } @Override - protected SubstatementValidator getSubstatementValidator() { - return SUBSTATEMENT_VALIDATOR; + protected MinElementsStatement createEmptyDeclared(final Integer argument) { + return new EmptyMinElementsStatement(argument); + } + + @Override + protected MinElementsEffectiveStatement createEffective( + final StmtContext ctx, + final MinElementsStatement declared, + final ImmutableList> substatements) { + return new RegularMinElementsEffectiveStatement(declared, substatements); + } + + @Override + protected MinElementsEffectiveStatement createEmptyEffective(final MinElementsStatement declared) { + return new EmptyMinElementsEffectiveStatement(declared); } } \ No newline at end of file diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/min_elements/RegularMinElementsEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/min_elements/RegularMinElementsEffectiveStatement.java new file mode 100644 index 0000000000..1b1eba707f --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/min_elements/RegularMinElementsEffectiveStatement.java @@ -0,0 +1,22 @@ +/* + * 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.min_elements; + +import com.google.common.collect.ImmutableList; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultArgument.WithSubstatements; + +final class RegularMinElementsEffectiveStatement extends WithSubstatements + implements MinElementsEffectiveStatement { + RegularMinElementsEffectiveStatement(final MinElementsStatement declared, + final ImmutableList> substatements) { + super(declared, substatements); + } +} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/min_elements/RegularMinElementsStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/min_elements/RegularMinElementsStatement.java new file mode 100644 index 0000000000..6b9feefb02 --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/min_elements/RegularMinElementsStatement.java @@ -0,0 +1,20 @@ +/* + * 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.min_elements; + +import com.google.common.collect.ImmutableList; +import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.ArgumentToString.WithSubstatements; + +final class RegularMinElementsStatement extends WithSubstatements implements MinElementsStatement { + RegularMinElementsStatement(final Integer argument, + final ImmutableList> substatements) { + super(argument, substatements); + } +}