From af9a1e52c81722843415c645c49fac751ca25eb6 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 2 Jul 2020 20:18:59 +0200 Subject: [PATCH] Consolidate StringTypeEffectiveStatementImpl TypeEffectiveStatementImpl can easily support the case of a string type, migrate it. JIRA: YANGTOOLS-1065 Change-Id: Icaf85f1cb49f98a8c019fb0752777f00a98b5491 Signed-off-by: Robert Varga --- .../type/AbstractTypeStatementSupport.java | 41 +++++++++- .../StringTypeEffectiveStatementImpl.java | 76 ------------------- 2 files changed, 40 insertions(+), 77 deletions(-) delete mode 100644 yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/StringTypeEffectiveStatementImpl.java diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractTypeStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractTypeStatementSupport.java index f6266f1703..8cfe5f34da 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractTypeStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractTypeStatementSupport.java @@ -27,6 +27,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.BitEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.EnumEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.LengthEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.PatternEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.RangeEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.RequireInstanceEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement; @@ -49,6 +50,7 @@ import org.opendaylight.yangtools.yang.model.api.type.Int32TypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.Int64TypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.Int8TypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition; +import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint; import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.Uint16TypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.Uint32TypeDefinition; @@ -63,6 +65,7 @@ import org.opendaylight.yangtools.yang.model.util.type.LengthRestrictedTypeBuild import org.opendaylight.yangtools.yang.model.util.type.RangeRestrictedTypeBuilder; import org.opendaylight.yangtools.yang.model.util.type.RequireInstanceRestrictedTypeBuilder; import org.opendaylight.yangtools.yang.model.util.type.RestrictedTypes; +import org.opendaylight.yangtools.yang.model.util.type.StringTypeBuilder; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.TypeNamespace; import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException; @@ -77,9 +80,13 @@ 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; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; abstract class AbstractTypeStatementSupport extends BaseStatementSupport> { + private static final Logger LOG = LoggerFactory.getLogger(AbstractTypeStatementSupport.class); + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder( YangStmtMapping.TYPE) .addOptional(YangStmtMapping.BASE) @@ -262,7 +269,7 @@ abstract class AbstractTypeStatementSupport } else if (baseType instanceof LeafrefTypeDefinition) { return createLeafref(ctx, (LeafrefTypeDefinition) baseType, declared, substatements); } else if (baseType instanceof StringTypeDefinition) { - return new StringTypeEffectiveStatementImpl(ctx, (StringTypeDefinition) baseType); + return createString(ctx, (StringTypeDefinition) baseType, declared, substatements); } else if (baseType instanceof Uint8TypeDefinition) { return new IntegralTypeEffectiveStatementImpl<>(ctx, RestrictedTypes.newUint8Builder((Uint8TypeDefinition) baseType, typeEffectiveSchemaPath(ctx))); @@ -494,6 +501,38 @@ abstract class AbstractTypeStatementSupport builder.setRequireInstance(((RequireInstanceEffectiveStatement) stmt).argument()); } } + return new TypeEffectiveStatementImpl<>(declared, substatements, builder); + } + + private static @NonNull TypeEffectiveStatement createString(final StmtContext ctx, + final StringTypeDefinition baseType, final TypeStatement declared, + final ImmutableList> substatements) { + final StringTypeBuilder builder = RestrictedTypes.newStringBuilder(baseType, + AbstractTypeStatementSupport.typeEffectiveSchemaPath(ctx)); + + for (EffectiveStatement stmt : substatements) { + if (stmt instanceof LengthEffectiveStatement) { + final LengthEffectiveStatement length = (LengthEffectiveStatement)stmt; + + try { + builder.setLengthConstraint(length, length.argument()); + } catch (IllegalStateException e) { + throw new SourceException(ctx.getStatementSourceReference(), e, + "Multiple length constraints encountered"); + } catch (InvalidLengthConstraintException e) { + throw new SourceException(ctx.getStatementSourceReference(), e, "Invalid length constraint %s", + length.argument()); + } + } + if (stmt instanceof PatternEffectiveStatement) { + final PatternConstraint pattern = ((PatternEffectiveStatement)stmt).argument(); + if (pattern != null) { + builder.addPatternConstraint(pattern); + } else { + LOG.debug("Ignoring empty pattern statement {}", stmt); + } + } + } return new TypeEffectiveStatementImpl<>(declared, substatements, builder); } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/StringTypeEffectiveStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/StringTypeEffectiveStatementImpl.java deleted file mode 100644 index b8b07a3e9a..0000000000 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/StringTypeEffectiveStatementImpl.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.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.LengthEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.PatternEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement; -import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint; -import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition; -import org.opendaylight.yangtools.yang.model.util.type.InvalidLengthConstraintException; -import org.opendaylight.yangtools.yang.model.util.type.RestrictedTypes; -import org.opendaylight.yangtools.yang.model.util.type.StringTypeBuilder; -import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.DeclaredEffectiveStatementBase; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; -import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -final class StringTypeEffectiveStatementImpl extends DeclaredEffectiveStatementBase - implements TypeEffectiveStatement { - private static final Logger LOG = LoggerFactory.getLogger(StringTypeEffectiveStatementImpl.class); - - private final @NonNull StringTypeDefinition typeDefinition; - - StringTypeEffectiveStatementImpl( - final StmtContext> ctx, - final StringTypeDefinition baseType) { - super(ctx); - - final StringTypeBuilder builder = RestrictedTypes.newStringBuilder(baseType, - AbstractTypeStatementSupport.typeEffectiveSchemaPath(ctx)); - - for (EffectiveStatement stmt : effectiveSubstatements()) { - if (stmt instanceof LengthEffectiveStatement) { - final LengthEffectiveStatement length = (LengthEffectiveStatement)stmt; - - try { - builder.setLengthConstraint(length, length.argument()); - } catch (IllegalStateException e) { - throw new SourceException(ctx.getStatementSourceReference(), e, - "Multiple length constraints encountered"); - } catch (InvalidLengthConstraintException e) { - throw new SourceException(ctx.getStatementSourceReference(), e, "Invalid length constraint %s", - length.argument()); - } - } - if (stmt instanceof PatternEffectiveStatement) { - final PatternConstraint pattern = ((PatternEffectiveStatement)stmt).argument(); - if (pattern != null) { - builder.addPatternConstraint(pattern); - } else { - LOG.debug("Ignoring empty pattern statement {}", stmt); - } - } - if (stmt instanceof UnknownSchemaNode) { - builder.addUnknownSchemaNode((UnknownSchemaNode)stmt); - } - } - - typeDefinition = builder.build(); - } - - @Override - public StringTypeDefinition getTypeDefinition() { - return typeDefinition; - } -} -- 2.36.6