Bug 5845: can not transform ba to bi, when keys contain boolean type 07/39307/1
authorFilip Gregor <fgregor@cisco.com>
Fri, 13 May 2016 08:54:38 +0000 (10:54 +0200)
committerRobert Varga <nite@hq.sk>
Tue, 24 May 2016 08:08:42 +0000 (08:08 +0000)
Reworked check for getter methods, added test method
for getting boolean key starts with is due to the fact
that it is a boolean.

As it turns out, LeafNodeCodecContext already gives us
a ready-made name via getGetter().getName(), so let's
use that.

Also take a moment to do some minor cleaups while we're
at it.

Change-Id: I36adc6ff37159dba257a6fa437ab55eb49ed1151
Signed-off-by: Filip Gregor <fgregor@cisco.com>
Signed-off-by: Robert Varga <rovarga@cisco.com>
(cherry picked from commit 57773e0b8ab436cf29f9116b01cf9da39bc41663)

binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/Bug5845booleanKeyTest.java [new file with mode: 0644]
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/BindingCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/LeafNodeCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/ValueContext.java
binding/mdsal-binding-test-model/src/main/yang/opendaylight-bug-5845.yang [new file with mode: 0644]

diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/Bug5845booleanKeyTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/Bug5845booleanKeyTest.java
new file mode 100644 (file)
index 0000000..c71b779
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * 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.mdsal.binding.dom.adapter.test;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.util.Collections;
+import javassist.ClassPool;
+import org.junit.Test;
+import org.opendaylight.mdsal.binding.dom.adapter.BindingToNormalizedNodeCodec;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode;
+import org.opendaylight.yang.gen.v1.urn.yang.foo.rev160101.BooleanContainer;
+import org.opendaylight.yang.gen.v1.urn.yang.foo.rev160101.BooleanContainerBuilder;
+import org.opendaylight.yang.gen.v1.urn.yang.foo.rev160101._boolean.container.BooleanListBuilder;
+import org.opendaylight.yang.gen.v1.urn.yang.foo.rev160101._boolean.container.BooleanListIntBuilder;
+import org.opendaylight.yang.gen.v1.urn.yang.foo.rev160101._boolean.container.BooleanListIntKey;
+import org.opendaylight.yang.gen.v1.urn.yang.foo.rev160101._boolean.container.BooleanListKey;
+import org.opendaylight.yangtools.binding.data.codec.gen.impl.StreamWriterGenerator;
+import org.opendaylight.yangtools.binding.data.codec.impl.BindingNormalizedNodeCodecRegistry;
+import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy;
+import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext;
+import org.opendaylight.yangtools.sal.binding.generator.util.JavassistUtils;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+
+public class Bug5845booleanKeyTest extends AbstractDataBrokerTest {
+
+    @Test
+    public void testBug5845() throws Exception {
+        final BindingToNormalizedNodeCodec mappingService = new BindingToNormalizedNodeCodec(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(),
+                new BindingNormalizedNodeCodecRegistry(StreamWriterGenerator.create(JavassistUtils.forClassPool(ClassPool.getDefault()))));
+        final ModuleInfoBackedContext moduleInfoBackedContext = ModuleInfoBackedContext.create();
+        moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(BooleanContainer.class));
+        mappingService.onGlobalContextUpdated(moduleInfoBackedContext.tryToCreateSchemaContext().get());
+
+        final BooleanContainer booleanContainer = new BooleanContainerBuilder().setBooleanList(Collections
+                .singletonList(new BooleanListBuilder()
+                        .setKey(new BooleanListKey(true, true))
+                        .setBooleanLeaf1(true)
+                        .setBooleanLeaf2(true)
+                        .build()))
+                .build();
+
+        final BooleanContainer booleanContainerInt = new BooleanContainerBuilder().setBooleanListInt(Collections
+                .singletonList(new BooleanListIntBuilder()
+                        .setKey(new BooleanListIntKey((byte) 1))
+                        .setBooleanLeafInt((byte) 1)
+                        .build()))
+                .build();
+
+        final BindingCodecTree codecContext = mappingService.getCodecFactory().getCodecContext();
+        final BindingCodecTreeNode<BooleanContainer> subtreeCodec = codecContext.getSubtreeCodec(InstanceIdentifier.create(BooleanContainer.class));
+        final NormalizedNode<?, ?> serializedInt = subtreeCodec.serialize(booleanContainerInt);
+        assertNotNull(serializedInt);
+        final NormalizedNode<?, ?> serialized = subtreeCodec.serialize(booleanContainer);
+        assertNotNull(serialized);
+    }
+}
\ No newline at end of file
index 04fa7d217027297268847d1d7469fa330be914d6..0452a7dabb40207a821fb64b7552423858e0210e 100644 (file)
@@ -63,7 +63,6 @@ import org.slf4j.LoggerFactory;
 
 final class BindingCodecContext implements CodecContextFactory, BindingCodecTree, Immutable {
     private static final Logger LOG = LoggerFactory.getLogger(BindingCodecContext.class);
-    static final String GETTER_PREFIX = "get";
 
     private final Codec<YangInstanceIdentifier, InstanceIdentifier<?>> instanceIdentifierCodec;
     private final Codec<QName, Class<?>> identityCodec;
@@ -237,7 +236,7 @@ final class BindingCodecContext implements CodecContextFactory, BindingCodecTree
         return getLeafNodesUsingReflection(parentClass, getterToLeafSchema);
     }
 
-    private String getGetterName(final QName qName, TypeDefinition<?> typeDef) {
+    private static String getGetterName(final QName qName, TypeDefinition<?> typeDef) {
         final String suffix = BindingMapping.getGetterSuffix(qName);
         while (typeDef.getBaseType() != null) {
             typeDef = typeDef.getBaseType();
@@ -245,7 +244,7 @@ final class BindingCodecContext implements CodecContextFactory, BindingCodecTree
         if (typeDef instanceof BooleanTypeDefinition || typeDef instanceof EmptyTypeDefinition) {
             return "is" + suffix;
         }
-        return GETTER_PREFIX + suffix;
+        return "get" + suffix;
     }
 
     private ImmutableMap<String, LeafNodeCodecContext<?>> getLeafNodesUsingReflection(final Class<?> parentClass,
index 1b935d1cf28ac270868cdca14a599f661d32ce79..7b482ba2e6d3314eece728387b4ecba89ee4445b 100644 (file)
@@ -46,8 +46,8 @@ final class LeafNodeCodecContext<D extends DataObject> extends NodeCodecContext<
     private final DataSchemaNode schema;
     private final Object defaultObject;
 
-    public LeafNodeCodecContext(final DataSchemaNode schema, final Codec<Object, Object> codec, final Method getter,
-                                final SchemaContext schemaContext) {
+    LeafNodeCodecContext(final DataSchemaNode schema, final Codec<Object, Object> codec, final Method getter,
+                final SchemaContext schemaContext) {
         this.yangIdentifier = new YangInstanceIdentifier.NodeIdentifier(schema.getQName());
         this.valueCodec = Preconditions.checkNotNull(codec);
         this.getter = getter;
@@ -117,7 +117,7 @@ final class LeafNodeCodecContext<D extends DataObject> extends NodeCodecContext<
 
     private static Object domValueFromString(final Codec<Object, Object> codec, final TypeDefinition<?> type,
     Object defaultValue) {
-        TypeDefinitionAwareCodec typeDefAwareCodec = TypeDefinitionAwareCodec.from(type);
+        TypeDefinitionAwareCodec<?, ?> typeDefAwareCodec = TypeDefinitionAwareCodec.from(type);
         if (typeDefAwareCodec != null) {
             Object castedDefaultValue = typeDefAwareCodec.deserialize((String) defaultValue);
             return codec.deserialize(castedDefaultValue);
@@ -222,7 +222,7 @@ final class LeafNodeCodecContext<D extends DataObject> extends NodeCodecContext<
     }
 
     @Override
-    public Object getSchema() {
+    public DataSchemaNode getSchema() {
         return schema;
     }
 
index e44ae3128f48b7839b4d66aefdd131255f630d1c..d99c3aaed9fb328aa0dc8e9ab926920f5db9515a 100644 (file)
@@ -14,7 +14,6 @@ import java.lang.invoke.MethodHandles;
 import java.lang.invoke.MethodHandles.Lookup;
 import java.lang.invoke.MethodType;
 import org.opendaylight.yangtools.concepts.Codec;
-import org.opendaylight.yangtools.yang.binding.BindingMapping;
 
 final class ValueContext {
     private static final Lookup LOOKUP = MethodHandles.publicLookup();
@@ -25,7 +24,7 @@ final class ValueContext {
     private final String getterName;
 
     ValueContext(final Class<?> identifier, final LeafNodeCodecContext <?>leaf) {
-        getterName = BindingCodecContext.GETTER_PREFIX + BindingMapping.getClassName(leaf.getDomPathArgument().getNodeType());
+        getterName = leaf.getGetter().getName();
         try {
             getter = LOOKUP.unreflect(identifier.getMethod(getterName)).asType(OBJECT_METHOD);
         } catch (IllegalAccessException | NoSuchMethodException | SecurityException e) {
diff --git a/binding/mdsal-binding-test-model/src/main/yang/opendaylight-bug-5845.yang b/binding/mdsal-binding-test-model/src/main/yang/opendaylight-bug-5845.yang
new file mode 100644 (file)
index 0000000..dd92b03
--- /dev/null
@@ -0,0 +1,27 @@
+module foo {
+    yang-version 1;
+    namespace "urn:yang.foo";
+    prefix "foo";
+
+    revision "2016-01-01" {
+    }
+
+    container boolean-container {
+        list boolean-list {
+            key "boolean-leaf-1 boolean-leaf-2";
+            leaf boolean-leaf-1 {
+                type boolean;
+            }
+            leaf boolean-leaf-2 {
+                type boolean;
+            }
+        }
+
+        list boolean-list-int {
+            key "boolean-leaf-int";
+            leaf boolean-leaf-int {
+                type int8;
+            }
+        }
+    }
+}
\ No newline at end of file