From: Robert Varga Date: Sat, 9 Apr 2022 19:47:48 +0000 (+0200) Subject: Seal ModelStatement X-Git-Tag: v9.0.0~110 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=5d933298fdda96d608f3f20056ac38ceff7d064e;hp=fbe90278557317215c1abe197775dc91bd36adbe;p=yangtools.git Seal ModelStatement ModelStatement can either be a DeclaredStatement or an EffectiveStatement. Make sure we enforce that invariant. Change-Id: Ib54d7136527b3c49fd36e813a9f1acc5b02a8894 Signed-off-by: Robert Varga --- diff --git a/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/AbstractDeclaredStatement.java b/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/AbstractDeclaredStatement.java new file mode 100644 index 0000000000..322446d3be --- /dev/null +++ b/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/AbstractDeclaredStatement.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2022 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.model.api.meta; + +import com.google.common.collect.ImmutableList; +import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.yangtools.yang.common.Empty; + +/** + * Abstract base class for {@link DeclaredStatement} implementations. + * + * @param Argument type ({@link Empty} if statement does not have argument.) + */ +public abstract non-sealed class AbstractDeclaredStatement extends AbstractModelStatement + implements DeclaredStatement { + /** + * Utility method for recovering singleton lists squashed by {@link #maskList(ImmutableList)}. + * + * @param masked list to unmask + * @return Unmasked list + * @throws NullPointerException if masked is null + * @throws ClassCastException if masked object does not match DeclaredStatement + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + protected static final @NonNull ImmutableList> unmaskList( + final @NonNull Object masked) { + return (ImmutableList) unmaskList(masked, DeclaredStatement.class); + } +} diff --git a/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/AbstractEffectiveStatement.java b/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/AbstractEffectiveStatement.java new file mode 100644 index 0000000000..1144f7969a --- /dev/null +++ b/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/AbstractEffectiveStatement.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2022 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.model.api.meta; + +import com.google.common.collect.ImmutableList; +import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.yangtools.yang.common.Empty; + +/** + * Abstract base class for {@link EffectiveStatement} implementations. + * + * @param Argument type ({@link Empty} if statement does not have argument.) + * @param Class representing declared version of this statement. + */ +public abstract non-sealed class AbstractEffectiveStatement> + extends AbstractModelStatement implements EffectiveStatement { + /** + * Utility method for recovering singleton lists squashed by {@link #maskList(ImmutableList)}. + * + * @param masked list to unmask + * @return Unmasked list + * @throws NullPointerException if masked is null + * @throws ClassCastException if masked object does not match EffectiveStatement + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + protected static final @NonNull ImmutableList> unmaskList( + final @NonNull Object masked) { + return (ImmutableList) unmaskList(masked, EffectiveStatement.class); + } +} diff --git a/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractModelStatement.java b/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/AbstractModelStatement.java similarity index 94% rename from model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractModelStatement.java rename to model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/AbstractModelStatement.java index 0ae7e01b24..c424c6acbd 100644 --- a/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractModelStatement.java +++ b/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/AbstractModelStatement.java @@ -5,7 +5,7 @@ * 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.model.spi.meta; +package org.opendaylight.yangtools.yang.model.api.meta; import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects.ToStringHelper; @@ -13,7 +13,6 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.common.Empty; -import org.opendaylight.yangtools.yang.model.api.meta.ModelStatement; /** * Abstract base class for {@link ModelStatement} implementations. It mostly provides static methods for efficiently @@ -21,8 +20,8 @@ import org.opendaylight.yangtools.yang.model.api.meta.ModelStatement; * * @param Argument type ({@link Empty} if statement does not have argument.) */ -abstract class AbstractModelStatement implements ModelStatement { - +abstract sealed class AbstractModelStatement implements ModelStatement + permits AbstractDeclaredStatement, AbstractEffectiveStatement { @Override public final int hashCode() { return System.identityHashCode(this); diff --git a/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/DeclaredStatement.java b/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/DeclaredStatement.java index 639e52cef6..b4d253de75 100644 --- a/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/DeclaredStatement.java +++ b/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/DeclaredStatement.java @@ -24,7 +24,7 @@ import org.opendaylight.yangtools.yang.common.Empty; * * @param Argument type ({@link Empty} if statement does not have argument.) */ -public interface DeclaredStatement extends ModelStatement { +public non-sealed interface DeclaredStatement extends ModelStatement { /** * Returns statement argument as was present in original source. * diff --git a/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/EffectiveStatement.java b/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/EffectiveStatement.java index 42b8daf03d..019034ffbd 100644 --- a/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/EffectiveStatement.java +++ b/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/EffectiveStatement.java @@ -22,7 +22,7 @@ import org.opendaylight.yangtools.yang.common.Empty; * @param Argument type ({@link Empty} if statement does not have argument.) * @param Class representing declared version of this statement. */ -public interface EffectiveStatement> extends ModelStatement { +public non-sealed interface EffectiveStatement> extends ModelStatement { /** * Returns {@link StatementOrigin}, which denotes if statement was explicitly declared in original model or inferred * during semantic processing of model. diff --git a/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/ModelStatement.java b/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/ModelStatement.java index 3a4e3b7c9d..c9487c9fc4 100644 --- a/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/ModelStatement.java +++ b/model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/ModelStatement.java @@ -26,8 +26,7 @@ import org.opendaylight.yangtools.yang.common.Empty; * * @param Argument type ({@link Empty} if statement does not have argument.) */ -// FIXME: sealed interface when we have JDK17+ -public interface ModelStatement { +public sealed interface ModelStatement permits DeclaredStatement, EffectiveStatement, AbstractModelStatement { /** * Statement Definition of this statement. * diff --git a/model/yang-model-spi/src/main/java/module-info.java b/model/yang-model-spi/src/main/java/module-info.java index f6707b673e..4a54a3f500 100644 --- a/model/yang-model-spi/src/main/java/module-info.java +++ b/model/yang-model-spi/src/main/java/module-info.java @@ -19,5 +19,6 @@ module org.opendaylight.yangtools.yang.model.spi { requires org.slf4j; // Annotations + requires static com.github.spotbugs.annotations; requires static transitive org.eclipse.jdt.annotation; } diff --git a/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractDeclaredEffectiveStatement.java b/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractDeclaredEffectiveStatement.java index f6c1c7a5aa..5ec3fe08f7 100644 --- a/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractDeclaredEffectiveStatement.java +++ b/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractDeclaredEffectiveStatement.java @@ -44,8 +44,8 @@ import org.opendaylight.yangtools.yang.model.api.stmt.TypedefNamespace; * @param Class representing declared version of this statement. */ @Beta -public abstract class AbstractDeclaredEffectiveStatement> - extends AbstractEffectiveStatement { +public abstract non-sealed class AbstractDeclaredEffectiveStatement> + extends AbstractIndexedEffectiveStatement { @Override public abstract @NonNull D getDeclared(); diff --git a/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractDeclaredStatement.java b/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractDeclaredStatement.java index 274baf62a3..904cd36236 100644 --- a/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractDeclaredStatement.java +++ b/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractDeclaredStatement.java @@ -12,6 +12,7 @@ import static java.util.Objects.requireNonNull; import com.google.common.annotations.Beta; import com.google.common.collect.ImmutableList; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.common.QName; @@ -22,27 +23,15 @@ import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; * stateful subclasses. */ @Beta -public abstract class AbstractDeclaredStatement extends AbstractModelStatement implements DeclaredStatement { +@SuppressFBWarnings(value = "NM_SAME_SIMPLE_NAME_AS_SUPERCLASS", justification = "Migration") +public abstract class AbstractDeclaredStatement + extends org.opendaylight.yangtools.yang.model.api.meta.AbstractDeclaredStatement { @Override public ImmutableList> declaredSubstatements() { // Default to reduce load on subclasses and keep the number of implementations down return ImmutableList.of(); } - /** - * Utility method for recovering singleton lists squashed by {@link #maskList(ImmutableList)}. - * - * @param masked list to unmask - * @return Unmasked list - * @throws NullPointerException if masked is null - * @throws ClassCastException if masked object does not match DeclaredStatement - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected static final @NonNull ImmutableList> unmaskList( - final @NonNull Object masked) { - return (ImmutableList) unmaskList(masked, DeclaredStatement.class); - } - public abstract static class WithRawArgument extends AbstractDeclaredStatement { public abstract static class WithSubstatements extends WithRawArgument { private final @NonNull Object substatements; diff --git a/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractEffectiveStatement.java b/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractIndexedEffectiveStatement.java similarity index 90% rename from model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractEffectiveStatement.java rename to model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractIndexedEffectiveStatement.java index 71fb8974ae..afcc718f37 100644 --- a/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractEffectiveStatement.java +++ b/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractIndexedEffectiveStatement.java @@ -19,6 +19,7 @@ import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.meta.AbstractEffectiveStatement; 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.IdentifierNamespace; @@ -41,8 +42,9 @@ import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement; * @param Argument type ({@link Empty} if statement does not have argument.) * @param Class representing declared version of this statement. */ -abstract class AbstractEffectiveStatement> - extends AbstractModelStatement implements EffectiveStatement { +abstract sealed class AbstractIndexedEffectiveStatement> + extends AbstractEffectiveStatement + permits AbstractDeclaredEffectiveStatement, AbstractUndeclaredEffectiveStatement { @Override public final > Optional get(final Class namespace, final K identifier) { @@ -71,20 +73,6 @@ abstract class AbstractEffectiveStatement> return Optional.empty(); } - /** - * Utility method for recovering singleton lists squashed by {@link #maskList(ImmutableList)}. - * - * @param masked list to unmask - * @return Unmasked list - * @throws NullPointerException if masked is null - * @throws ClassCastException if masked object does not match EffectiveStatement - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected static final @NonNull ImmutableList> unmaskList( - final @NonNull Object masked) { - return (ImmutableList) unmaskList(masked, EffectiveStatement.class); - } - // TODO: below methods need to find a better place, this is just a temporary hideout as their public class is on // its way out /** diff --git a/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractUndeclaredEffectiveStatement.java b/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractUndeclaredEffectiveStatement.java index 2cd305ef1b..f7f2c0c0b6 100644 --- a/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractUndeclaredEffectiveStatement.java +++ b/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractUndeclaredEffectiveStatement.java @@ -31,8 +31,8 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeAwareEffectiveSt import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeEffectiveStatement; @Beta -public abstract class AbstractUndeclaredEffectiveStatement> - extends AbstractEffectiveStatement { +public abstract non-sealed class AbstractUndeclaredEffectiveStatement> + extends AbstractIndexedEffectiveStatement { @Override public final D getDeclared() { return null; diff --git a/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/ForwardingDeclaredStatement.java b/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/ForwardingDeclaredStatement.java index 5ed27974b3..f26a1355d1 100644 --- a/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/ForwardingDeclaredStatement.java +++ b/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/ForwardingDeclaredStatement.java @@ -8,18 +8,30 @@ package org.opendaylight.yangtools.yang.model.spi.meta; import com.google.common.annotations.Beta; +import com.google.common.collect.ForwardingObject; import java.util.List; import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.model.api.meta.DeclarationReference; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; +import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; /** * Common base class for forwarding implementations of {@link DeclaredStatement}. */ @Beta public abstract class ForwardingDeclaredStatement> - extends ForwardingModelStatement implements DeclaredStatement { + extends ForwardingObject implements DeclaredStatement { + @Override + public StatementDefinition statementDefinition() { + return delegate().statementDefinition(); + } + + @Override + public A argument() { + return delegate().argument(); + } + @Override public String rawArgument() { return delegate().rawArgument(); diff --git a/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/ForwardingModelStatement.java b/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/ForwardingModelStatement.java deleted file mode 100644 index fdf4071f4c..0000000000 --- a/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/ForwardingModelStatement.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2021 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.model.spi.meta; - -import com.google.common.collect.ForwardingObject; -import org.eclipse.jdt.annotation.NonNull; -import org.opendaylight.yangtools.yang.model.api.meta.ModelStatement; -import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; - -/** - * Common base class for forwarding implementations of {@link ModelStatement}. - */ -public abstract class ForwardingModelStatement> extends ForwardingObject - implements ModelStatement { - @Override - public StatementDefinition statementDefinition() { - return delegate().statementDefinition(); - } - - @Override - public A argument() { - return delegate().argument(); - } - - @Override - protected abstract @NonNull S delegate(); -} diff --git a/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/SubstatementIndexingException.java b/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/SubstatementIndexingException.java index 0b6f131435..e93ffef77a 100644 --- a/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/SubstatementIndexingException.java +++ b/model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/SubstatementIndexingException.java @@ -12,7 +12,8 @@ import static java.util.Objects.requireNonNull; import com.google.common.annotations.Beta; /** - * Exception thrown when indexing of substatements of a {@link AbstractEffectiveStatement} fails. + * Exception thrown when indexing of substatements of either a {@link AbstractDeclaredEffectiveStatement} or + * {@link AbstractUndeclaredEffectiveStatement} fails. */ @Beta public final class SubstatementIndexingException extends IllegalArgumentException {