Add UnionTypeObject 97/103297/2
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 17 Nov 2022 22:56:36 +0000 (23:56 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 18 Nov 2022 00:36:21 +0000 (01:36 +0100)
Introduce UnionTypeObject, which is a specialization of TypeObject to
unions. This allows us to seal TypeObject, making sure all it is always
properly specialized.

Also revert the change in SerialVersionUID introduced with
BitsTypeObject by properly ignoring it.

Change-Id: I72ef1d452e2a48c630e9c87bfb4ff0fac0fda32c
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/AbstractTypeObjectGenerator.java
binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/SerialVersionHelper.java
binding/mdsal-binding-generator/src/test/java/org/opendaylight/mdsal/binding/generator/impl/Mdsal406TypeObjectTest.java
binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/TypedefCompilationTest.java
binding/mdsal-binding-model-ri/src/main/java/module-info.java
binding/mdsal-binding-model-ri/src/main/java/org/opendaylight/mdsal/binding/model/ri/BindingTypes.java
binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/BitsTypeObject.java
binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/Enumeration.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/UnionTypeObject.java [new file with mode: 0644]

index 048cf5a1d84ec7e8b2b9d96e1aaf5f028fde4bc6..a252abb624f20208b2f63d88786af5760881529b 100644 (file)
@@ -691,7 +691,7 @@ abstract class AbstractTypeObjectGenerator<S extends EffectiveStatement<?, ?>, R
             final TypeEffectiveStatement<?> type, final boolean isTypedef, final TypeDefinition<?> typedef) {
         final GeneratedUnionBuilder builder = builderFactory.newGeneratedUnionBuilder(typeName);
         YangSourceDefinition.of(module.statement(), definingStatement).ifPresent(builder::setYangSourceDefinition);
-        builder.addImplementsType(BindingTypes.TYPE_OBJECT);
+        builder.addImplementsType(BindingTypes.UNION_TYPE_OBJECT);
         builder.setIsUnion(true);
 
 //        builder.setSchemaPath(typedef.getPath());
index 05074fcc6fd8a69ce2eb76dea83ab026e4ccf2c1..b05bbf253fb3d41cee2eb6785e8a645996eaf5c1 100644 (file)
@@ -28,7 +28,7 @@ import org.opendaylight.mdsal.binding.model.ri.BindingTypes;
 
 public final class SerialVersionHelper {
     private static final Set<ConcreteType> IGNORED_INTERFACES =
-        Set.of(BindingTypes.TYPE_OBJECT, BindingTypes.SCALAR_TYPE_OBJECT);
+        Set.of(BindingTypes.BITS_TYPE_OBJECT, BindingTypes.SCALAR_TYPE_OBJECT, BindingTypes.UNION_TYPE_OBJECT);
     private static final Comparator<TypeMemberBuilder<?>> SUID_MEMBER_COMPARATOR =
         Comparator.comparing(TypeMemberBuilder::getName);
     private static final Comparator<Type> SUID_NAME_COMPARATOR = Comparator.comparing(Type::getFullyQualifiedName);
index 40c3c1e99ef82397973d3fabd61835fc708e6f7d..683ce02f6ec4b3e2d9679e749dad8f62a038ecff 100644 (file)
@@ -10,7 +10,7 @@ package org.opendaylight.mdsal.binding.generator.impl;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.opendaylight.mdsal.binding.model.ri.BindingTypes.BITS_TYPE_OBJECT;
-import static org.opendaylight.mdsal.binding.model.ri.BindingTypes.TYPE_OBJECT;
+import static org.opendaylight.mdsal.binding.model.ri.BindingTypes.UNION_TYPE_OBJECT;
 
 import java.util.List;
 import org.junit.AfterClass;
@@ -78,7 +78,7 @@ public class Mdsal406TypeObjectTest {
         assertNotNull(typedefType.getImplements());
         Type objectType = typedefType.getImplements().stream()
                 .filter(type -> type.getFullyQualifiedName()
-                        .equals("org.opendaylight.yangtools.yang.binding.TypeObject")).findAny().get();
-        assertEquals(TYPE_OBJECT, objectType);
+                        .equals("org.opendaylight.yangtools.yang.binding.UnionTypeObject")).findAny().get();
+        assertEquals(UNION_TYPE_OBJECT, objectType);
     }
 }
index 96cc85b4ef3eb81668f17afdb85f5991936563c7..6e42d65fc46fc09a9bfc430e58e185fffb4dfdce 100644 (file)
@@ -81,7 +81,7 @@ public class TypedefCompilationTest extends BaseCompilationTest {
         CompilationTestUtils.assertContainsField(bitsExtClass, "_sfmof", boolean.class);
         CompilationTestUtils.assertContainsField(bitsExtClass, "_sfapc", boolean.class);
         CompilationTestUtils.assertContainsFieldWithValue(bitsExtClass, "serialVersionUID", Long.TYPE,
-            7934653360983102096L, boolean.class, boolean.class, boolean.class, boolean.class, boolean.class,
+            -2922917845344851623L, boolean.class, boolean.class, boolean.class, boolean.class, boolean.class,
             boolean.class, boolean.class);
 
         assertEquals(9, bitsExtClass.getDeclaredFields().length);
index c67cf6791e19f98b2eeb3b2f785c261d9698db0b..5f2f0444d80054a70a0cf1d9dc97b13c5f0bcafd 100644 (file)
@@ -12,6 +12,7 @@ module org.opendaylight.mdsal.binding.model.ri {
     requires transitive org.opendaylight.mdsal.binding.model.api;
     requires org.opendaylight.mdsal.binding.spec.util;
     requires org.opendaylight.yangtools.util;
+    requires org.opendaylight.yangtools.yang.binding;
     requires org.opendaylight.yangtools.yang.common;
     requires org.opendaylight.yangtools.yang.model.api;
     requires org.opendaylight.yangtools.yang.model.ri;
index 7f3607a305e010fff8e5f01c675d81733a9665aa..bf29aecee3c131410be1bf3e4dc064627bc43b51 100644 (file)
@@ -46,7 +46,7 @@ import org.opendaylight.yangtools.yang.binding.RpcInput;
 import org.opendaylight.yangtools.yang.binding.RpcOutput;
 import org.opendaylight.yangtools.yang.binding.RpcService;
 import org.opendaylight.yangtools.yang.binding.ScalarTypeObject;
-import org.opendaylight.yangtools.yang.binding.TypeObject;
+import org.opendaylight.yangtools.yang.binding.UnionTypeObject;
 import org.opendaylight.yangtools.yang.binding.YangFeature;
 import org.opendaylight.yangtools.yang.binding.annotations.RoutingContext;
 import org.opendaylight.yangtools.yang.common.QName;
@@ -58,7 +58,6 @@ public final class BindingTypes {
     public static final ConcreteType BASE_IDENTITY = typeForClass(BaseIdentity.class);
     public static final ConcreteType DATA_CONTAINER = typeForClass(DataContainer.class);
     public static final ConcreteType DATA_OBJECT = typeForClass(DataObject.class);
-    public static final ConcreteType TYPE_OBJECT = typeForClass(TypeObject.class);
     public static final ConcreteType DATA_ROOT = typeForClass(DataRoot.class);
     @Deprecated(since = "10.0.0", forRemoval = true)
     public static final ConcreteType NOTIFICATION_LISTENER = typeForClass(NotificationListener.class);
@@ -68,6 +67,7 @@ public final class BindingTypes {
     public static final ConcreteType RPC_SERVICE = typeForClass(RpcService.class);
     public static final ConcreteType SCALAR_TYPE_OBJECT = typeForClass(ScalarTypeObject.class);
     public static final ConcreteType BITS_TYPE_OBJECT = typeForClass(BitsTypeObject.class);
+    public static final ConcreteType UNION_TYPE_OBJECT = typeForClass(UnionTypeObject.class);
     public static final ConcreteType INSTANCE_IDENTIFIER = typeForClass(InstanceIdentifier.class);
     public static final ConcreteType KEYED_INSTANCE_IDENTIFIER = typeForClass(KeyedInstanceIdentifier.class);
 
index 7453ece9999ea0c156c0dd33e60f5dcbb328f353..ae4abca4145278b479c9a49e64585b91221b0b5d 100644 (file)
@@ -13,7 +13,7 @@ import org.eclipse.jdt.annotation.NonNull;
 /**
  * Interface implemented by all {@link TypeObject}s generated for {@code type bits}.
  */
-public interface BitsTypeObject extends TypeObject {
+public non-sealed interface BitsTypeObject extends TypeObject {
     /**
      * Return the set of strings which are valid {@code bit} names for this type. The iteration order of the returned
      * set is required to match effective bit {@code position} assignment.
index a8eedd6d73e7210e56c185d2be721e09981f70fc..d3fdd3755b359b979bd8c08592dc7f4d304766e2 100644 (file)
@@ -12,7 +12,8 @@ package org.opendaylight.yangtools.yang.binding;
  *
  * @author Robert Varga
  */
-public interface Enumeration extends TypeObject {
+// FIXME: 12.0.0: rename to EnumTypeObject
+public non-sealed interface Enumeration extends TypeObject {
     /**
      * Returns the assigned name of the enumeration item as it is specified in the input YANG.
      *
index 7f958ac50ae4a7d60f17d7fc5d101a54202ee973..aa477a5c29fa52a0d49f0abce76961e9c3884d9b 100644 (file)
@@ -12,5 +12,7 @@ package org.opendaylight.yangtools.yang.binding;
  *
  * @author Jie Han
  */
-public non-sealed interface TypeObject extends BindingObject {
+public sealed interface TypeObject extends BindingObject
+    permits BitsTypeObject, Enumeration, ScalarTypeObject, UnionTypeObject {
+
 }
diff --git a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/UnionTypeObject.java b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/UnionTypeObject.java
new file mode 100644 (file)
index 0000000..fc8584e
--- /dev/null
@@ -0,0 +1,15 @@
+/*
+ * 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.binding;
+
+/**
+ * A {@link TypeObject} corresponding to a {@code type union}.
+ */
+public non-sealed interface UnionTypeObject extends TypeObject {
+
+}