Map identities to interfaces, not abstract classes 12/69212/39
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 7 Mar 2018 14:06:04 +0000 (15:06 +0100)
committerRobert Varga <nite@hq.sk>
Fri, 30 Mar 2018 21:04:09 +0000 (21:04 +0000)
This changes mapping of identities from abstract class to an interface,
allowing for multiple inheritence, as needed by YANG 1.1.

JIRA: MDSAL-326
Change-Id: I01f636f5f055f929cdcee4ccb61e04ad0a6841b2
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/AbstractTypeGenerator.java
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/ModuleContext.java
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/RuntimeTypeGenerator.java
binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/CompilationTest.java
binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/BaseIdentity.java
binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/BaseIdentityTest.java [deleted file]
binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/util/BindingReflectionsTest.java

index 947191e53af93d9956a5b8e34832e94e663c7f72..307fb5fd27eb1c246648af6e7dcaad23de7b6ab4 100644 (file)
@@ -569,21 +569,21 @@ abstract class AbstractTypeGenerator {
         if (identity == null) {
             return;
         }
-        final GeneratedTOBuilder newType = typeProvider.newGeneratedTOBuilder(JavaTypeName.create(
+        final GeneratedTypeBuilder newType = typeProvider.newGeneratedTypeBuilder(JavaTypeName.create(
             packageNameForGeneratedType(context.modulePackageName(), identity.getPath()),
             BindingMapping.getClassName(identity.getQName())));
         final Set<IdentitySchemaNode> baseIdentities = identity.getBaseIdentities();
         if (baseIdentities.isEmpty()) {
             final GeneratedTOBuilder gto = typeProvider.newGeneratedTOBuilder(JavaTypeName.create(BaseIdentity.class));
-            newType.setExtendsType(gto.build());
+            newType.addImplementsType(gto.build());
         } else {
-            final IdentitySchemaNode baseIdentity = baseIdentities.iterator().next();
-            final QName qname = baseIdentity.getQName();
-            final GeneratedTransferObject gto = typeProvider.newGeneratedTOBuilder(JavaTypeName.create(
-                BindingMapping.getRootPackageName(qname.getModule()), BindingMapping.getClassName(qname))).build();
-            newType.setExtendsType(gto);
+            for (IdentitySchemaNode baseIdentity : baseIdentities) {
+                final QName qname = baseIdentity.getQName();
+                final GeneratedTransferObject gto = typeProvider.newGeneratedTOBuilder(JavaTypeName.create(
+                    BindingMapping.getRootPackageName(qname.getModule()), BindingMapping.getClassName(qname))).build();
+                newType.addImplementsType(gto);
+            }
         }
-        newType.setAbstract(true);
 
         final Module module = context.module();
         addCodegenInformation(newType, module, identity);
index f2b5b9ad447c3b70e6ab96cb9e6a83d41c57656b..b615785494de9b3f835c47f184db3e8994686095 100644 (file)
@@ -44,8 +44,8 @@ public final class ModuleContext {
     private final Map<SchemaPath, GeneratedTypeBuilder> groupings = new HashMap<>();
     private final BiMap<Type, CaseSchemaNode> caseTypeToSchema = HashBiMap.create();
     private final Map<SchemaPath, GeneratedTypeBuilder> cases = new HashMap<>();
+    private final Map<QName, GeneratedTypeBuilder> identities = new HashMap<>();
     private final List<GeneratedTypeBuilder> augmentations = new ArrayList<>();
-    private final Map<QName, GeneratedTOBuilder> identities = new HashMap<>();
     private final Multimap<Type, Type> choiceToCases = HashMultimap.create();
     private final Set<GeneratedTypeBuilder> topLevelNodes = new HashSet<>();
     private final Map<Type, WithStatus> typeToSchema = new HashMap<>();
@@ -97,7 +97,7 @@ public final class ModuleContext {
         for (GeneratedTypeBuilder b : cases.values()) {
             result.add(b.build());
         }
-        for (GeneratedTOBuilder b : identities.values()) {
+        for (GeneratedTypeBuilder b : identities.values()) {
             result.add(b.build());
         }
         for (GeneratedTypeBuilder b : topLevelNodes) {
@@ -154,8 +154,8 @@ public final class ModuleContext {
         cases.put(p, b);
     }
 
-    public void addIdentityType(final QName name,final GeneratedTOBuilder b) {
-        identities.put(name,b);
+    public void addIdentityType(final QName name,final GeneratedTypeBuilder b) {
+        identities.put(name, b);
     }
 
     public void addTopLevelNodeType(final GeneratedTypeBuilder b) {
@@ -182,7 +182,7 @@ public final class ModuleContext {
         return Collections.unmodifiableMap(cases);
     }
 
-    public Map<QName,GeneratedTOBuilder> getIdentities() {
+    public Map<QName, GeneratedTypeBuilder> getIdentities() {
         return Collections.unmodifiableMap(identities);
     }
 
@@ -214,7 +214,6 @@ public final class ModuleContext {
     }
 
     /**
-     *
      * Returns mapping of type to its schema.
      *
      * Valid values are only instances of {@link DataSchemaNode} or {@link AugmentationSchemaNode}
index d815b55c547bc779f9d2d62b0532341463c27682..7d150fb04587d7aa5a2f09c4cc3df5d9aba37d88 100644 (file)
@@ -18,7 +18,6 @@ import java.util.Map.Entry;
 import java.util.Set;
 import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeTypes;
 import org.opendaylight.mdsal.binding.model.api.Type;
-import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTOBuilder;
 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilderBase;
 import org.opendaylight.mdsal.binding.model.api.type.builder.TypeMemberBuilder;
@@ -58,7 +57,7 @@ final class RuntimeTypeGenerator extends AbstractTypeGenerator {
             for (Entry<Type, Type> e : ctx.getChoiceToCases().entries()) {
                 choiceToCases.put(builtType(builderToType, e.getKey()), builtType(builderToType, e.getValue()));
             }
-            for (Entry<QName, GeneratedTOBuilder> e : ctx.getIdentities().entrySet()) {
+            for (Entry<QName, GeneratedTypeBuilder> e : ctx.getIdentities().entrySet()) {
                 identities.put(e.getKey(), builtType(builderToType, e.getValue()));
             }
         }
index 172751f570302c68c5b112ca5b386bf00efc041a..221c52cc2af4e656311693a721852bb0eb3a10c2 100644 (file)
@@ -12,6 +12,7 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 import com.google.common.collect.Collections2;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Range;
 import java.io.File;
@@ -451,13 +452,8 @@ public class CompilationTest extends BaseCompilationTest {
                 .forName(CompilationTestUtils.BASE_PKG + ".urn.opendaylight.bar.rev131008.IdentityClass", true, loader);
 
         // test identity
-        try {
-            identityClass.getConstructor();
-            final Class<?> baseIdentity = Class.forName("org.opendaylight.yangtools.yang.binding.BaseIdentity", true, loader);
-            assertEquals(baseIdentity, identityClass.getSuperclass());
-        } catch (final NoSuchMethodException e) {
-            throw new AssertionError("IdentityClass must have no-arg constructor");
-        }
+        final Class<?> baseIdentity = Class.forName("org.opendaylight.yangtools.yang.binding.BaseIdentity", true, loader);
+        assertEquals(ImmutableList.of(baseIdentity), Arrays.asList(identityClass.getInterfaces()));
 
         // Test annotation
         try {
index c6f0d0e5cfc9fc537f97e90c1692185491d5a2d6..905890bda8c9da05fa157fb8d3c2ab5ff8451ce7 100644 (file)
@@ -10,12 +10,6 @@ package org.opendaylight.yangtools.yang.binding;
 /**
  * Base Identity.
  */
-public abstract class BaseIdentity {
-
-    public static final BaseIdentity INSTANCE = new BaseIdentity() { };
-
-    protected BaseIdentity() {
-
-    }
+public interface BaseIdentity {
 
 }
diff --git a/binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/BaseIdentityTest.java b/binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/BaseIdentityTest.java
deleted file mode 100644 (file)
index 7bd0b21..0000000
+++ /dev/null
@@ -1,20 +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.binding;
-
-import static org.junit.Assert.assertNotNull;
-
-import org.junit.Test;
-
-public class BaseIdentityTest extends BaseIdentity {
-
-    @Test
-    public void constructTest() throws Exception {
-        assertNotNull(INSTANCE);
-    }
-}
\ No newline at end of file
index 0d7e5bd357688026fd62b6682f89badda80f4f2e..a90f0dfeb1372bcf8e12be944b8aea11653c9568 100644 (file)
@@ -58,7 +58,7 @@ public class BindingReflectionsTest {
         assertFalse(BindingReflections.resolveRpcOutputClass(
                 TestImplementation.class.getDeclaredMethod("rpcMethodTest2")).isPresent());
 
-        assertEquals(QName.create("test", "test"), BindingReflections.getQName(TestImplementation.class));
+        assertEquals(QName.create("test", "test"), BindingReflections.getQName(TestIdentity.class));
     }
 
     @Test(expected = UnsupportedOperationException.class)
@@ -74,14 +74,22 @@ public class BindingReflectionsTest {
         }
     }
 
-    private static final class TestImplementation extends BaseIdentity implements Augmentation<TestImplementation>,
-                                                                                    RpcService {
+    private interface TestIdentity extends BaseIdentity {
+        @SuppressWarnings("unused")
+        QName QNAME = QName.create("test", "test");
+
+    }
+
+    private static final class TestImplementation implements Augmentation<TestImplementation>, RpcService {
+        @SuppressWarnings("unused")
         public static final QName QNAME = QName.create("test", "test");
 
+        @SuppressWarnings({ "unused", "static-method" })
         Future<List<Object>> rpcMethodTest() {
             return null;
         }
 
+        @SuppressWarnings({ "unused", "static-method" })
         Future<?> rpcMethodTest2() {
             return null;
         }