From 8ed16bcfec20aa835e6a6cdef60a5d091a8472d8 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 7 Aug 2020 13:52:20 +0200 Subject: [PATCH] Remove unused abstract classes We do not need AbstractConstraintEffectiveStatement and AbstractListConstraintEffectiveStatement anymore. Remove them. Change-Id: Iaea7c91d4f738fc84384e66531cff2bee4faf513 Signed-off-by: Robert Varga --- .../AbstractConstraintEffectiveStatement.java | 81 ---------- .../stmt/AbstractEffectiveDocumentedNode.java | 146 ------------------ ...ractEffectiveDocumentedNodeWithStatus.java | 96 +++++++++++- ...tractListConstraintEffectiveStatement.java | 30 ---- 4 files changed, 91 insertions(+), 262 deletions(-) delete mode 100644 yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractConstraintEffectiveStatement.java delete mode 100644 yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveDocumentedNode.java delete mode 100644 yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractListConstraintEffectiveStatement.java diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractConstraintEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractConstraintEffectiveStatement.java deleted file mode 100644 index 12a3e56ee0..0000000000 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractConstraintEffectiveStatement.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) 2016 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; - -import com.google.common.annotations.Beta; -import java.util.Optional; -import org.opendaylight.yangtools.yang.model.api.ConstraintMetaDefinition; -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.ErrorAppTagEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.ModifierEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.type.ModifierKind; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; - -@Beta -@Deprecated(forRemoval = true) -//FIXME: 6.0.0: remove this class -public abstract class AbstractConstraintEffectiveStatement> extends - AbstractEffectiveDocumentedNode implements ConstraintMetaDefinition { - private final String errorAppTag; - private final String errorMessage; - private final ModifierKind modifier; - private final A constraints; - - protected AbstractConstraintEffectiveStatement(final StmtContext ctx) { - super(ctx); - String errorAppTagInit = null; - String errorMessageInit = null; - ModifierKind modifierInit = null; - - for (final EffectiveStatement stmt : effectiveSubstatements()) { - if (stmt instanceof ErrorAppTagEffectiveStatement) { - errorAppTagInit = ((ErrorAppTagEffectiveStatement) stmt).argument(); - } - if (stmt instanceof ErrorMessageEffectiveStatement) { - errorMessageInit = ((ErrorMessageEffectiveStatement) stmt).argument(); - } - if (stmt instanceof ModifierEffectiveStatement) { - modifierInit = ((ModifierEffectiveStatement) stmt).argument(); - } - } - - this.errorAppTag = errorAppTagInit; - this.errorMessage = errorMessageInit; - this.modifier = modifierInit; - this.constraints = createConstraints(super.argument()); - } - - @Override - public final A argument() { - return constraints; - } - - public final boolean isCustomizedStatement() { - return getDescription().isPresent() || getReference().isPresent() || this.errorAppTag != null - || this.errorMessage != null || this.modifier != null; - } - - public final ModifierKind getModifier() { - return modifier; - } - - @Override - public final Optional getErrorAppTag() { - return Optional.ofNullable(errorAppTag); - } - - @Override - public final Optional getErrorMessage() { - return Optional.ofNullable(errorMessage); - } - - protected abstract A createConstraints(A argument); -} - diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveDocumentedNode.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveDocumentedNode.java deleted file mode 100644 index 450aff1baf..0000000000 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveDocumentedNode.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (c) 2019 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; - -import com.google.common.annotations.Beta; -import com.google.common.collect.Collections2; -import com.google.common.collect.ImmutableList; -import java.util.Collection; -import java.util.Optional; -import java.util.function.Predicate; -import org.eclipse.jdt.annotation.NonNull; -import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.yangtools.yang.model.api.DocumentedNode; -import org.opendaylight.yangtools.yang.model.api.SchemaNode; -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.meta.StatementDefinition; -import org.opendaylight.yangtools.yang.model.api.meta.StatementSource; -import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceEffectiveStatement; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; - -/** - * A declared {@link AbstractEffectiveStatement}. - * - * @deprecated This class has a number of design problems. Use {@link AbstractDeclaredEffectiveStatement} and its - * subclasses instead. - */ -// TODO: This class is problematic in that it interacts with its subclasses via methods which are guaranteed to allows -// atrocities like RecursiveObjectLeaker tricks. That should be avoided and pushed to caller in a way where -// this class is a pure holder taking {@code ImmutableList>} in the -// constructor. -// -// From memory efficiency perspective, it is very common to have effective statements without any substatements, -// in which case 'substatements' field is redundant. -@Beta -@Deprecated(forRemoval = true) -// FIXME: 6.0.0: fold this into AbstractEffectiveDocumentedNodeWithStatus -public abstract class AbstractEffectiveDocumentedNode> - extends AbstractEffectiveStatement implements DocumentedNode { - private final @NonNull ImmutableList> substatements; - private final @NonNull StatementSource statementSource; - private final A argument; - private final @NonNull D declaredInstance; - private final @Nullable String description; - private final @Nullable String reference; - - protected AbstractEffectiveDocumentedNode(final StmtContext ctx) { - argument = ctx.getStatementArgument(); - statementSource = ctx.getStatementSource(); - declaredInstance = ctx.buildDeclared(); - substatements = ImmutableList.copyOf(initSubstatements(BaseStatementSupport.declaredSubstatements(ctx))); - - description = findFirstEffectiveSubstatementArgument(DescriptionEffectiveStatement.class).orElse(null); - reference = findFirstEffectiveSubstatementArgument(ReferenceEffectiveStatement.class).orElse(null); - } - - @Override - public final StatementDefinition statementDefinition() { - return declaredInstance.statementDefinition(); - } - - @Override - public A argument() { - return argument; - } - - @Override - public final StatementSource getStatementSource() { - return statementSource; - } - - @Override - public final D getDeclared() { - return declaredInstance; - } - - @Override - public final Collection> effectiveSubstatements() { - return substatements; - } - - @Override - public final Optional getDescription() { - return Optional.ofNullable(description); - } - - @Override - public final Optional getReference() { - return Optional.ofNullable(reference); - } - - @SuppressWarnings("unchecked") - public final Collection allSubstatementsOfType(final Class type) { - return Collection.class.cast(Collections2.filter(effectiveSubstatements(), type::isInstance)); - } - - - protected final @Nullable String nullableDescription() { - return description; - } - - protected final @Nullable String nullableReference() { - return reference; - } - - /** - * Create a set of substatements. This method is split out so it can be overridden in - * ExtensionEffectiveStatementImpl to leak a not-fully-initialized instance. - * - * @param substatementsInit proposed substatements - * @return Filtered substatements - */ - // FIXME: 6.0.0: this facility is only overridden by ExtensionEffectiveStatementImpl - protected Collection> initSubstatements( - final Collection> substatementsInit) { - return Collections2.transform(Collections2.filter(substatementsInit, - StmtContext::isSupportedToBuildEffective), StmtContext::buildEffective); - } - - protected final @Nullable T firstSubstatementOfType(final Class type) { - return effectiveSubstatements().stream().filter(type::isInstance).findFirst().map(type::cast).orElse(null); - } - - protected final R firstSubstatementOfType(final Class type, final Class returnType) { - return effectiveSubstatements().stream() - .filter(((Predicate)type::isInstance).and(returnType::isInstance)) - .findFirst().map(returnType::cast).orElse(null); - } - - protected final EffectiveStatement firstEffectiveSubstatementOfType(final Class type) { - return effectiveSubstatements().stream().filter(type::isInstance).findFirst().orElse(null); - } - - // FIXME: rename to 'getFirstEffectiveStatement()' - protected final S firstSchemaNode(final Class type) { - return findFirstEffectiveSubstatement(type).orElse(null); - } - - -} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveDocumentedNodeWithStatus.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveDocumentedNodeWithStatus.java index 6214a24962..2416f5267e 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveDocumentedNodeWithStatus.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveDocumentedNodeWithStatus.java @@ -7,24 +7,38 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt; +import com.google.common.annotations.Beta; +import com.google.common.collect.Collections2; import com.google.common.collect.ImmutableList; import java.lang.invoke.MethodHandles; import java.lang.invoke.VarHandle; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Optional; +import java.util.function.Predicate; import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.model.api.DocumentedNode; +import org.opendaylight.yangtools.yang.model.api.SchemaNode; import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; 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.meta.StatementDefinition; +import org.opendaylight.yangtools.yang.model.api.meta.StatementSource; +import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; -// FIXME: 6.0.0: use DocumentedNodeMixin.WithStatus instead of keeping any state +/** + * A declared {@link AbstractEffectiveStatement} with DocumentedNode.WithStatus. + */ +//FIXME: 6.0.0: use DocumentedNodeMixin.WithStatus instead of keeping any state +@Beta public abstract class AbstractEffectiveDocumentedNodeWithStatus> - extends AbstractEffectiveDocumentedNode implements DocumentedNode.WithStatus { + extends AbstractEffectiveStatement implements DocumentedNode.WithStatus { private static final VarHandle UNKNOWN_NODES; static { @@ -36,6 +50,12 @@ public abstract class AbstractEffectiveDocumentedNodeWithStatus> substatements; + private final @NonNull StatementSource statementSource; + private final A argument; + private final @NonNull D declaredInstance; + private final @Nullable String description; + private final @Nullable String reference; private final @NonNull Status status; @SuppressWarnings("unused") @@ -44,14 +64,61 @@ public abstract class AbstractEffectiveDocumentedNodeWithStatus ctx) { - super(ctx); + argument = ctx.getStatementArgument(); + statementSource = ctx.getStatementSource(); + declaredInstance = ctx.buildDeclared(); + substatements = ImmutableList.copyOf( + Collections2.transform(Collections2.filter(BaseStatementSupport.declaredSubstatements(ctx), + StmtContext::isSupportedToBuildEffective), StmtContext::buildEffective)); + + description = findFirstEffectiveSubstatementArgument(DescriptionEffectiveStatement.class).orElse(null); + reference = findFirstEffectiveSubstatementArgument(ReferenceEffectiveStatement.class).orElse(null); status = findFirstEffectiveSubstatementArgument(StatusEffectiveStatement.class).orElse(Status.CURRENT); } + @Override + public final StatementDefinition statementDefinition() { + return declaredInstance.statementDefinition(); + } + + @Override + public A argument() { + return argument; + } + + @Override + public final StatementSource getStatementSource() { + return statementSource; + } + + @Override + public final D getDeclared() { + return declaredInstance; + } + + @Override + public final Collection> effectiveSubstatements() { + return substatements; + } + + @Override + public final Optional getDescription() { + return Optional.ofNullable(description); + } + + @Override + public final Optional getReference() { + return Optional.ofNullable(reference); + } + + @SuppressWarnings("unchecked") + public final Collection allSubstatementsOfType(final Class type) { + return Collection.class.cast(Collections2.filter(effectiveSubstatements(), type::isInstance)); + } + @Override public final Status getStatus() { return status; @@ -64,6 +131,25 @@ public abstract class AbstractEffectiveDocumentedNodeWithStatus @Nullable T firstSubstatementOfType(final Class type) { + return effectiveSubstatements().stream().filter(type::isInstance).findFirst().map(type::cast).orElse(null); + } + + protected final R firstSubstatementOfType(final Class type, final Class returnType) { + return effectiveSubstatements().stream() + .filter(((Predicate)type::isInstance).and(returnType::isInstance)) + .findFirst().map(returnType::cast).orElse(null); + } + + protected final EffectiveStatement firstEffectiveSubstatementOfType(final Class type) { + return effectiveSubstatements().stream().filter(type::isInstance).findFirst().orElse(null); + } + + // FIXME: rename to 'getFirstEffectiveStatement()' + protected final S firstSchemaNode(final Class type) { + return findFirstEffectiveSubstatement(type).orElse(null); + } + @SuppressWarnings("unchecked") private @NonNull ImmutableList loadUnknownSchemaNodes() { final List init = new ArrayList<>(); diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractListConstraintEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractListConstraintEffectiveStatement.java deleted file mode 100644 index f21584da7c..0000000000 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractListConstraintEffectiveStatement.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2017 Pantheon Technologies, 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; - -import com.google.common.annotations.Beta; -import com.google.common.collect.ImmutableList; -import java.util.List; -import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; - -@Beta -@Deprecated(forRemoval = true) -// FIXME: 6.0.0: remove this class -public abstract class AbstractListConstraintEffectiveStatement>> - extends AbstractConstraintEffectiveStatement, D> { - - protected AbstractListConstraintEffectiveStatement(final StmtContext, D, ?> ctx) { - super(ctx); - } - - @Override - protected final List createConstraints(final List argument) { - return ImmutableList.copyOf(argument); - } -} -- 2.36.6