From 5ab5d6335f237c2ddb8a09c4d56bfda1dfbaa5ad Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 7 Mar 2018 15:06:04 +0100 Subject: [PATCH] Map identities to interfaces, not abstract classes 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 --- .../generator/impl/AbstractTypeGenerator.java | 16 +++++++-------- .../binding/generator/impl/ModuleContext.java | 11 +++++----- .../generator/impl/RuntimeTypeGenerator.java | 3 +-- .../api/generator/test/CompilationTest.java | 10 +++------- .../yangtools/yang/binding/BaseIdentity.java | 8 +------- .../yang/binding/BaseIdentityTest.java | 20 ------------------- .../binding/util/BindingReflectionsTest.java | 14 ++++++++++--- 7 files changed, 29 insertions(+), 53 deletions(-) delete mode 100644 binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/BaseIdentityTest.java diff --git a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/AbstractTypeGenerator.java b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/AbstractTypeGenerator.java index 947191e53a..307fb5fd27 100644 --- a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/AbstractTypeGenerator.java +++ b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/AbstractTypeGenerator.java @@ -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 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); diff --git a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/ModuleContext.java b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/ModuleContext.java index f2b5b9ad44..b615785494 100644 --- a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/ModuleContext.java +++ b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/ModuleContext.java @@ -44,8 +44,8 @@ public final class ModuleContext { private final Map groupings = new HashMap<>(); private final BiMap caseTypeToSchema = HashBiMap.create(); private final Map cases = new HashMap<>(); + private final Map identities = new HashMap<>(); private final List augmentations = new ArrayList<>(); - private final Map identities = new HashMap<>(); private final Multimap choiceToCases = HashMultimap.create(); private final Set topLevelNodes = new HashSet<>(); private final Map 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 getIdentities() { + public Map 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} diff --git a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/RuntimeTypeGenerator.java b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/RuntimeTypeGenerator.java index d815b55c54..7d150fb045 100644 --- a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/RuntimeTypeGenerator.java +++ b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/RuntimeTypeGenerator.java @@ -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 e : ctx.getChoiceToCases().entries()) { choiceToCases.put(builtType(builderToType, e.getKey()), builtType(builderToType, e.getValue())); } - for (Entry e : ctx.getIdentities().entrySet()) { + for (Entry e : ctx.getIdentities().entrySet()) { identities.put(e.getKey(), builtType(builderToType, e.getValue())); } } diff --git a/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/CompilationTest.java b/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/CompilationTest.java index 172751f570..221c52cc2a 100644 --- a/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/CompilationTest.java +++ b/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/CompilationTest.java @@ -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 { 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 c6f0d0e5cf..905890bda8 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,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 index 7bd0b21369..0000000000 --- a/binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/BaseIdentityTest.java +++ /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 diff --git a/binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/util/BindingReflectionsTest.java b/binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/util/BindingReflectionsTest.java index 0d7e5bd357..a90f0dfeb1 100644 --- a/binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/util/BindingReflectionsTest.java +++ b/binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/util/BindingReflectionsTest.java @@ -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, - RpcService { + private interface TestIdentity extends BaseIdentity { + @SuppressWarnings("unused") + QName QNAME = QName.create("test", "test"); + + } + + private static final class TestImplementation implements Augmentation, RpcService { + @SuppressWarnings("unused") public static final QName QNAME = QName.create("test", "test"); + @SuppressWarnings({ "unused", "static-method" }) Future> rpcMethodTest() { return null; } + @SuppressWarnings({ "unused", "static-method" }) Future rpcMethodTest2() { return null; } -- 2.36.6