From a1e19889a714901902548430031ab94be63ca655 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 4 Oct 2018 17:17:42 +0200 Subject: [PATCH] Make sure we compare key members via their property name As it turns out, simple comparison ignoring cases does not correctly work if the schema is using CamelCase. We need to do the hard work of deriving Binding property name and sort on that to be consistent with what the codegen does. JIRA: MDSAL-355 Change-Id: I34cdb032fbdeb093e2973b91c5011e302e6280bc Signed-off-by: Robert Varga --- .../dom/codec/impl/IdentifiableItemCodec.java | 7 +++++-- .../codec/test/InstanceIdentifierTest.java | 20 +++++++++++++++++++ .../src/main/yang/mdsal-355.yang | 13 ++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 binding/mdsal-binding-test-model/src/main/yang/mdsal-355.yang diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/IdentifiableItemCodec.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/IdentifiableItemCodec.java index 92185cd2f1..8e06d5ae54 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/IdentifiableItemCodec.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/IdentifiableItemCodec.java @@ -14,10 +14,12 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.reflect.Constructor; import java.util.ArrayList; +import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import org.opendaylight.mdsal.binding.spec.naming.BindingMapping; import org.opendaylight.yangtools.concepts.Codec; import org.opendaylight.yangtools.yang.binding.Identifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.IdentifiableItem; @@ -63,7 +65,7 @@ final class IdentifiableItemCodec implements Codec sortedKeys; if (unsortedKeys.size() > 1) { final List tmp = new ArrayList<>(unsortedKeys); - tmp.sort((q1, q2) -> q1.getLocalName().compareToIgnoreCase(q2.getLocalName())); + // This is not terribly efficient but gets the job done + tmp.sort(Comparator.comparing(qname -> BindingMapping.getPropertyName(qname.getLocalName()))); sortedKeys = tmp; } else { sortedKeys = unsortedKeys; diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/InstanceIdentifierTest.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/InstanceIdentifierTest.java index ae3cb9f745..35ddbb20a7 100644 --- a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/InstanceIdentifierTest.java +++ b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/InstanceIdentifierTest.java @@ -10,16 +10,23 @@ package org.opendaylight.mdsal.binding.dom.codec.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import com.google.common.collect.ImmutableMap; import org.junit.Test; +import org.opendaylight.yang.gen.v1.mdsal._355.norev.OspfStatLsdbBrief; +import org.opendaylight.yang.gen.v1.mdsal._355.norev.OspfStatLsdbBriefKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.TreeComplexUsesAugment; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.TreeLeafOnlyAugment; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.Top; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelList; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelListKey; +import org.opendaylight.yangtools.yang.binding.Identifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; public class InstanceIdentifierTest extends AbstractBindingCodecTest { @@ -49,4 +56,17 @@ public class InstanceIdentifierTest extends AbstractBindingCodecTest { assertTrue(((AugmentationIdentifier) leafOnlyLastArg).getPossibleChildNames().contains(SIMPLE_VALUE_QNAME)); } + @Test + public void testCamelCaseKeys() { + final InstanceIdentifier result = registry.fromYangInstanceIdentifier(YangInstanceIdentifier.create( + NodeIdentifier.create(OspfStatLsdbBrief.QNAME), + new NodeIdentifierWithPredicates(OspfStatLsdbBrief.QNAME, ImmutableMap.of( + QName.create(OspfStatLsdbBrief.QNAME, "AreaIndex"), 1, + QName.create(OspfStatLsdbBrief.QNAME, "LsaType"), (short) 2, + QName.create(OspfStatLsdbBrief.QNAME, "LsId"), 3, + QName.create(OspfStatLsdbBrief.QNAME, "AdvRtr"), "foo")))); + assertTrue(result instanceof KeyedInstanceIdentifier); + final Identifier key = ((KeyedInstanceIdentifier) result).getKey(); + assertEquals(new OspfStatLsdbBriefKey("foo", 1, 3, (short)2), key); + } } diff --git a/binding/mdsal-binding-test-model/src/main/yang/mdsal-355.yang b/binding/mdsal-binding-test-model/src/main/yang/mdsal-355.yang new file mode 100644 index 0000000000..a1effc58e9 --- /dev/null +++ b/binding/mdsal-binding-test-model/src/main/yang/mdsal-355.yang @@ -0,0 +1,13 @@ +module mdsal-355 { + namespace "mdsal-355"; + prefix "mdsal355"; + + list OspfStatLsdbBrief { + key "AreaIndex LsaType LsId AdvRtr"; + leaf AreaIndex { type int32; description "Area Index"; } + leaf LsaType { type uint8; description "LSA Type"; } + leaf LsId { type int32; description "LSA ID"; } + leaf AdvRtr { type string; description "Advertised Router"; } + } +} + -- 2.36.6