Seal more Binding contracts 08/100808/5
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 26 Apr 2022 10:03:56 +0000 (12:03 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 26 Apr 2022 20:10:10 +0000 (22:10 +0200)
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 <robert.varga@pantheon.tech>
12 files changed:
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDOMRpcResultFutureTest.java
binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/Annotation.java
binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/BaseIdentity.java
binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/BindingContract.java
binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/BindingObject.java
binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/ChoiceIn.java
binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/DataContainer.java
binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/DataObject.java
binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/OpaqueObject.java
binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/ScalarTypeObject.java
binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/TypeObject.java
binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/ValueAware.java

index ec047ff54d88c8c5bea34a3993e8ff2896c32103..63af518365281ea5c4236762ad488ce483ed65d9 100644 (file)
@@ -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);
     }
index 0e625ec613ede5203e4bae0751396f6984c284b2..6a77706f43a7cd1fe25f5c11ac4bc11e2e1d73f7 100644 (file)
@@ -28,6 +28,6 @@ import com.google.common.annotations.Beta;
  * @param <T> Value type
  */
 @Beta
-public interface Annotation<T> extends BindingObject, ValueAware<T> {
+public non-sealed interface Annotation<T> extends BindingObject, ValueAware<T> {
 
 }
index 5c2859d2c4a8997e5aafc9e1e338b5b0c854cb1b..d6a00440069405aee22f8c7ab0b59c4866c00549 100644 (file)
@@ -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<BaseIdentity> {
+public non-sealed interface BaseIdentity extends BindingObject, BindingContract<BaseIdentity> {
 
 }
index 0c06c7384123bd727e7fbb2e3327edf4a1af885a..9059a4ab84b9a239fb0fbc25cfc7d819b25ea313 100644 (file)
@@ -17,7 +17,7 @@ import org.eclipse.jdt.annotation.NonNull;
  */
 @Beta
 // FIXME: evaluate integrating with BindingObject
-public interface BindingContract<T extends BindingContract<T>> {
+public sealed interface BindingContract<T extends BindingContract<T>> 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.
index 7e0b44ccd97e667edf006a79616757f5bc15540a..c8275f8cc2af6c6426520026de623cdd51f2e6fa 100644 (file)
@@ -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 {
 }
index 90de8b5571089a685b30add526689f08ae6b1cbc..aadbdce5d802c19b2740ddb13d37d6edc3f6592a 100644 (file)
@@ -32,6 +32,6 @@ package org.opendaylight.yangtools.yang.binding;
  * @param <P> Parent container
  * @author Robert Varga
  */
-public interface ChoiceIn<P> extends DataContainer {
+public non-sealed interface ChoiceIn<P> extends DataContainer {
 
 }
index 78983fe810439cda3e65df7b5c702d538c04d53d..037f77901335d4d95b50e64a31d28425c3e7a293 100644 (file)
@@ -19,6 +19,7 @@ package org.opendaylight.yangtools.yang.binding;
  *   <li>Case</li>
  * </ul>
  */
-public interface DataContainer extends BindingContract<DataContainer> {
+public sealed interface DataContainer extends BindingContract<DataContainer>
+    permits BaseNotification, ChoiceIn, DataObject, OpaqueObject {
 
 }
index cf25e2da88b1dd2cbb8746e8aa1310496fcfd34d..adf331f79f0a5d3028880df7e104eb6abc6d42de 100644 (file)
@@ -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<? extends DataObject> implementedInterface();
 }
index fc58ecb5d0bc18498022f63df06363414fd47448..e3a86f3faef62b537820ce06106bbf314adfd802 100644 (file)
@@ -26,7 +26,7 @@ import com.google.common.annotations.Beta;
  * @param <T> Generated interface
  */
 @Beta
-public interface OpaqueObject<T extends OpaqueObject<T>> extends BindingObject, DataContainer,
+public non-sealed interface OpaqueObject<T extends OpaqueObject<T>> extends BindingObject, DataContainer,
         ValueAware<OpaqueData<?>> {
     @Override
     Class<T> implementedInterface();
index 8347e7af70ab3341799221231ee630ac49c1335e..971c887317fe8297962b99e8902f185c338ac133 100644 (file)
@@ -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<T> extends TypeObject {
-    /**
-     * Return encapsulated value.
-     *
-     * @return Encapsulated value.
-     */
-    @NonNull T getValue();
+public non-sealed interface ScalarTypeObject<T> extends TypeObject, ValueAware<T> {
+
 }
index e62973bac14c838335f181b322f7cb3d63f34ac4..7f958ac50ae4a7d60f17d7fc5d101a54202ee973 100644 (file)
@@ -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 {
 }
index 02d58842601945cdb3b61ded8c878ecbef5bbf68..4722655acddcc076c7e3023cb85890cf14bd75a1 100644 (file)
@@ -17,7 +17,7 @@ import org.eclipse.jdt.annotation.NonNull;
  * @param <T> value type
  */
 @Beta
-public interface ValueAware<T> {
+public sealed interface ValueAware<T> permits Annotation, OpaqueObject, ScalarTypeObject {
     /**
      * Return the value associated with this object.
      *