From d693701b368eeb1e9e9aabfe3be39b0c9ff59fe6 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 3 Jul 2020 00:08:34 +0200 Subject: [PATCH] Migrate InstanceIdentifierSpecificationSupport InstanceIdentifierSpecificationSupport can use memory-efficient representation through BaseStatementSupport. Furthermore we can reuse TypeEffectiveStatementImpl instead of brewing a separate effective implementation. JIRA: YANGTOOLS-1065 Change-Id: I821172baf33bd639fd52e02160db7122b4f53367 Signed-off-by: Robert Varga --- ...java => EmptyIdentifierSpecification.java} | 9 ++-- ...tifierSpecificationEffectiveStatement.java | 52 ------------------- ...nstanceIdentifierSpecificationSupport.java | 51 ++++++++++++++---- ...egularInstanceIdentifierSpecification.java | 22 ++++++++ 4 files changed, 68 insertions(+), 66 deletions(-) rename yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/{InstanceIdentifierSpecificationImpl.java => EmptyIdentifierSpecification.java} (54%) delete mode 100644 yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/InstanceIdentifierSpecificationEffectiveStatement.java create mode 100644 yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/RegularInstanceIdentifierSpecification.java diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/InstanceIdentifierSpecificationImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/EmptyIdentifierSpecification.java similarity index 54% rename from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/InstanceIdentifierSpecificationImpl.java rename to yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/EmptyIdentifierSpecification.java index b6c9f02341..8b87a16d4d 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/InstanceIdentifierSpecificationImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/EmptyIdentifierSpecification.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, @@ -8,12 +8,11 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.InstanceIdentifierSpecification; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithRawStringArgument; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; -final class InstanceIdentifierSpecificationImpl extends AbstractDeclaredStatement - implements InstanceIdentifierSpecification { - InstanceIdentifierSpecificationImpl(final StmtContext ctx) { +final class EmptyIdentifierSpecification extends WithRawStringArgument implements InstanceIdentifierSpecification { + EmptyIdentifierSpecification(final StmtContext ctx) { super(ctx); } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/InstanceIdentifierSpecificationEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/InstanceIdentifierSpecificationEffectiveStatement.java deleted file mode 100644 index 0dfbf4fe1e..0000000000 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/InstanceIdentifierSpecificationEffectiveStatement.java +++ /dev/null @@ -1,52 +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.type; - -import org.eclipse.jdt.annotation.NonNull; -import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; -import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.RequireInstanceEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.InstanceIdentifierSpecification; -import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefinition; -import org.opendaylight.yangtools.yang.model.util.type.BaseTypes; -import org.opendaylight.yangtools.yang.model.util.type.InstanceIdentifierTypeBuilder; -import org.opendaylight.yangtools.yang.model.util.type.RestrictedTypes; -import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.DeclaredEffectiveStatementBase; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; - -final class InstanceIdentifierSpecificationEffectiveStatement - extends DeclaredEffectiveStatementBase - implements TypeEffectiveStatement { - - private final @NonNull InstanceIdentifierTypeDefinition typeDefinition; - - InstanceIdentifierSpecificationEffectiveStatement(final StmtContext> ctx) { - super(ctx); - - final InstanceIdentifierTypeBuilder builder = RestrictedTypes.newInstanceIdentifierBuilder( - BaseTypes.instanceIdentifierType(), ctx.getSchemaPath().get()); - - for (EffectiveStatement stmt : effectiveSubstatements()) { - if (stmt instanceof RequireInstanceEffectiveStatement) { - builder.setRequireInstance(((RequireInstanceEffectiveStatement)stmt).argument()); - } - if (stmt instanceof UnknownSchemaNode) { - builder.addUnknownSchemaNode((UnknownSchemaNode)stmt); - } - } - - typeDefinition = builder.build(); - } - - @Override - public InstanceIdentifierTypeDefinition getTypeDefinition() { - return typeDefinition; - } -} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/InstanceIdentifierSpecificationSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/InstanceIdentifierSpecificationSupport.java index be40ac355a..19dfe29ff9 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/InstanceIdentifierSpecificationSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/InstanceIdentifierSpecificationSupport.java @@ -7,14 +7,20 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type; +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.RequireInstanceEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.InstanceIdentifierSpecification; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; +import org.opendaylight.yangtools.yang.model.util.type.BaseTypes; +import org.opendaylight.yangtools.yang.model.util.type.InstanceIdentifierTypeBuilder; +import org.opendaylight.yangtools.yang.model.util.type.RestrictedTypes; +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; -final class InstanceIdentifierSpecificationSupport extends AbstractStatementSupport> { private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder( YangStmtMapping.TYPE) @@ -31,20 +37,47 @@ final class InstanceIdentifierSpecificationSupport extends AbstractStatementSupp } @Override - public InstanceIdentifierSpecification createDeclared( + protected SubstatementValidator getSubstatementValidator() { + return SUBSTATEMENT_VALIDATOR; + } + + @Override + protected InstanceIdentifierSpecification createDeclared( + final StmtContext ctx, + final ImmutableList> substatements) { + return new RegularInstanceIdentifierSpecification(ctx, substatements); + } + + @Override + protected InstanceIdentifierSpecification createEmptyDeclared( final StmtContext ctx) { - return new InstanceIdentifierSpecificationImpl(ctx); + return new EmptyIdentifierSpecification(ctx); } @Override - public EffectiveStatement createEffective( + protected EffectiveStatement createEffective( final StmtContext> ctx) { - return new InstanceIdentifierSpecificationEffectiveStatement(ctx); + EffectiveStatement> ctx, + final InstanceIdentifierSpecification declared, + final ImmutableList> substatements) { + final InstanceIdentifierTypeBuilder builder = RestrictedTypes.newInstanceIdentifierBuilder( + BaseTypes.instanceIdentifierType(), ctx.getSchemaPath().get()); + + for (EffectiveStatement stmt : substatements) { + if (stmt instanceof RequireInstanceEffectiveStatement) { + builder.setRequireInstance(((RequireInstanceEffectiveStatement)stmt).argument()); + } + } + + return new TypeEffectiveStatementImpl<>(declared, substatements, builder); } @Override - protected SubstatementValidator getSubstatementValidator() { - return SUBSTATEMENT_VALIDATOR; + protected EffectiveStatement createEmptyEffective( + final StmtContext> ctx, + final InstanceIdentifierSpecification declared) { + // TODO: we could do better here, but its really splitting hairs + return createEffective(ctx, declared, ImmutableList.of()); } } \ No newline at end of file diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/RegularInstanceIdentifierSpecification.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/RegularInstanceIdentifierSpecification.java new file mode 100644 index 0000000000..b97d47a0b2 --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/RegularInstanceIdentifierSpecification.java @@ -0,0 +1,22 @@ +/* + * 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.type; + +import com.google.common.collect.ImmutableList; +import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.InstanceIdentifierSpecification; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithRawStringArgument.WithSubstatements; +import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; + +final class RegularInstanceIdentifierSpecification extends WithSubstatements + implements InstanceIdentifierSpecification { + RegularInstanceIdentifierSpecification(final StmtContext ctx, + final ImmutableList> substatements) { + super(ctx, substatements); + } +} -- 2.36.6