From 4dac4647c962ae43496601caec8d304286dc0a49 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 26 Apr 2022 12:03:56 +0200 Subject: [PATCH 1/1] Seal more Binding contracts DataContainer/BindingObject/BindingContract provide structural hierarchy which is fixed with codegen attaching to specific endpoints. Make sure we express this invariant by sealing the interior of the hierarchy. Change-Id: I5121b5afe9a880600e7ee12700fc954352afa82d Signed-off-by: Robert Varga --- .../dom/adapter/LazyDOMRpcResultFutureTest.java | 4 ++-- .../yangtools/yang/binding/Annotation.java | 2 +- .../yangtools/yang/binding/BaseIdentity.java | 2 +- .../yangtools/yang/binding/BindingContract.java | 2 +- .../yangtools/yang/binding/BindingObject.java | 2 +- .../opendaylight/yangtools/yang/binding/ChoiceIn.java | 2 +- .../yangtools/yang/binding/DataContainer.java | 3 ++- .../yangtools/yang/binding/DataObject.java | 2 +- .../yangtools/yang/binding/OpaqueObject.java | 2 +- .../yangtools/yang/binding/ScalarTypeObject.java | 10 ++-------- .../yangtools/yang/binding/TypeObject.java | 2 +- .../yangtools/yang/binding/ValueAware.java | 2 +- 12 files changed, 15 insertions(+), 20 deletions(-) diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDOMRpcResultFutureTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDOMRpcResultFutureTest.java index ec047ff54d..63af518365 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDOMRpcResultFutureTest.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDOMRpcResultFutureTest.java @@ -26,7 +26,7 @@ import java.util.concurrent.TimeUnit; import org.junit.Before; import org.junit.Test; import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer; -import org.opendaylight.yangtools.yang.binding.DataContainer; +import org.opendaylight.yangtools.yang.binding.RpcOutput; import org.opendaylight.yangtools.yang.common.RpcResult; public class LazyDOMRpcResultFutureTest { @@ -48,7 +48,7 @@ public class LazyDOMRpcResultFutureTest { doReturn(true).when(future).isCancelled(); doReturn(true).when(future).isDone(); - doReturn(mock(DataContainer.class)).when(domRpcResult).getResult(); + doReturn(mock(RpcOutput.class)).when(domRpcResult).getResult(); doReturn(domRpcResult).when(future).get(); doReturn(domRpcResult).when(future).get(1, TimeUnit.SECONDS); } diff --git a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/Annotation.java b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/Annotation.java index 0e625ec613..6a77706f43 100644 --- a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/Annotation.java +++ b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/Annotation.java @@ -28,6 +28,6 @@ import com.google.common.annotations.Beta; * @param Value type */ @Beta -public interface Annotation extends BindingObject, ValueAware { +public non-sealed interface Annotation extends BindingObject, ValueAware { } diff --git a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/BaseIdentity.java b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/BaseIdentity.java index 5c2859d2c4..d6a0044006 100644 --- a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/BaseIdentity.java +++ b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/BaseIdentity.java @@ -10,6 +10,6 @@ package org.opendaylight.yangtools.yang.binding; /** * Base Identity. Interface generated for {@code identity} statements extend this interface. */ -public interface BaseIdentity extends BindingObject, BindingContract { +public non-sealed interface BaseIdentity extends BindingObject, BindingContract { } diff --git a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/BindingContract.java b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/BindingContract.java index 0c06c73841..9059a4ab84 100644 --- a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/BindingContract.java +++ b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/BindingContract.java @@ -17,7 +17,7 @@ import org.eclipse.jdt.annotation.NonNull; */ @Beta // FIXME: evaluate integrating with BindingObject -public interface BindingContract> { +public sealed interface BindingContract> permits BaseIdentity, DataContainer { /** * Return the interface implemented by this object. This method differs from {@link Object#getClass()} in that it * returns the interface contract, not a concrete implementation class. diff --git a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/BindingObject.java b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/BindingObject.java index 7e0b44ccd9..c8275f8cc2 100644 --- a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/BindingObject.java +++ b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/BindingObject.java @@ -12,5 +12,5 @@ package org.opendaylight.yangtools.yang.binding; * * @author Jie Han */ -public interface BindingObject { +public sealed interface BindingObject permits Annotation, BaseIdentity, DataObject, OpaqueObject, TypeObject { } diff --git a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/ChoiceIn.java b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/ChoiceIn.java index 90de8b5571..aadbdce5d8 100644 --- a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/ChoiceIn.java +++ b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/ChoiceIn.java @@ -32,6 +32,6 @@ package org.opendaylight.yangtools.yang.binding; * @param

Parent container * @author Robert Varga */ -public interface ChoiceIn

extends DataContainer { +public non-sealed interface ChoiceIn

extends DataContainer { } diff --git a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/DataContainer.java b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/DataContainer.java index 78983fe810..037f779013 100644 --- a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/DataContainer.java +++ b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/DataContainer.java @@ -19,6 +19,7 @@ package org.opendaylight.yangtools.yang.binding; *

  • Case
  • * */ -public interface DataContainer extends BindingContract { +public sealed interface DataContainer extends BindingContract + permits BaseNotification, ChoiceIn, DataObject, OpaqueObject { } diff --git a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/DataObject.java b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/DataObject.java index cf25e2da88..adf331f79f 100644 --- a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/DataObject.java +++ b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/DataObject.java @@ -12,7 +12,7 @@ package org.opendaylight.yangtools.yang.binding; * * @author Tony Tkacik */ -public interface DataObject extends DataContainer, BindingObject { +public non-sealed interface DataObject extends DataContainer, BindingObject { @Override Class implementedInterface(); } diff --git a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/OpaqueObject.java b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/OpaqueObject.java index fc58ecb5d0..e3a86f3fae 100644 --- a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/OpaqueObject.java +++ b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/OpaqueObject.java @@ -26,7 +26,7 @@ import com.google.common.annotations.Beta; * @param Generated interface */ @Beta -public interface OpaqueObject> extends BindingObject, DataContainer, +public non-sealed interface OpaqueObject> extends BindingObject, DataContainer, ValueAware> { @Override Class implementedInterface(); diff --git a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/ScalarTypeObject.java b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/ScalarTypeObject.java index 8347e7af70..971c887317 100644 --- a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/ScalarTypeObject.java +++ b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/ScalarTypeObject.java @@ -8,18 +8,12 @@ package org.opendaylight.yangtools.yang.binding; import com.google.common.annotations.Beta; -import org.eclipse.jdt.annotation.NonNull; /** * A {@link TypeObject} that encapsulates an immutable native type. These are generated as YANG Binding type captures, * such as those implied by {@code typedef} and parameterized {@code type} statements. */ @Beta -public interface ScalarTypeObject extends TypeObject { - /** - * Return encapsulated value. - * - * @return Encapsulated value. - */ - @NonNull T getValue(); +public non-sealed interface ScalarTypeObject extends TypeObject, ValueAware { + } diff --git a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/TypeObject.java b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/TypeObject.java index e62973bac1..7f958ac50a 100644 --- a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/TypeObject.java +++ b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/TypeObject.java @@ -12,5 +12,5 @@ package org.opendaylight.yangtools.yang.binding; * * @author Jie Han */ -public interface TypeObject extends BindingObject { +public non-sealed interface TypeObject extends BindingObject { } diff --git a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/ValueAware.java b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/ValueAware.java index 02d5884260..4722655acd 100644 --- a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/ValueAware.java +++ b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/ValueAware.java @@ -17,7 +17,7 @@ import org.eclipse.jdt.annotation.NonNull; * @param value type */ @Beta -public interface ValueAware { +public sealed interface ValueAware permits Annotation, OpaqueObject, ScalarTypeObject { /** * Return the value associated with this object. * -- 2.36.6