From 81c885b677a2d233ce9109206027a91b9961b0e8 Mon Sep 17 00:00:00 2001 From: Martin Ciglan Date: Fri, 20 Feb 2015 16:10:15 +0100 Subject: [PATCH 1/1] BUG-2689: Cast exception when serializing L3Address from groupbasedpolicy policy.yang When deserializing L3AddressKey, alphabetical order of key arguments didn't match with order of related QNames as defined in yang model. The binding-independent world retains the ordering specified in model, while the binding-aware world requires constructor arguments to be alpha-sorted. Change-Id: Icb277fed97d0984ca1a60aa7add7817db727facc Signed-off-by: Martin Ciglan Signed-off-by: Robert Varga --- .../codec/impl/IdentifiableItemCodec.java | 47 ++++++++++++++++--- 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/code-generator/binding-data-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/IdentifiableItemCodec.java b/code-generator/binding-data-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/IdentifiableItemCodec.java index e22f1f88fa..47a24fb593 100644 --- a/code-generator/binding-data-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/IdentifiableItemCodec.java +++ b/code-generator/binding-data-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/IdentifiableItemCodec.java @@ -8,14 +8,17 @@ package org.opendaylight.yangtools.binding.data.codec.impl; import com.google.common.base.Throwables; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodHandles.Lookup; import java.lang.reflect.Constructor; import java.util.ArrayList; -import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.opendaylight.yangtools.concepts.Codec; @@ -26,12 +29,19 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; final class IdentifiableItemCodec implements Codec> { + private static final Comparator KEYARG_COMPARATOR = new Comparator() { + @Override + public int compare(final QName q1, final QName q2) { + return q1.getLocalName().compareToIgnoreCase(q2.getLocalName()); + } + }; private static final Lookup LOOKUP = MethodHandles.publicLookup(); - private final MethodHandle ctor; - private final MethodHandle ctorInvoker; private final Map keyValueContexts; + private final List keysInBindingOrder; private final ListSchemaNode schema; private final Class identifiable; + private final MethodHandle ctorInvoker; + private final MethodHandle ctor; public IdentifiableItemCodec(final ListSchemaNode schema, final Class> keyClass, final Class identifiable, final Map keyValueContexts) { @@ -55,13 +65,38 @@ final class IdentifiableItemCodec implements Codec unsortedKeys = schema.getKeyDefinition(); + final List sortedKeys; + if (unsortedKeys.size() > 1) { + final List tmp = new ArrayList<>(unsortedKeys); + Collections.sort(tmp, KEYARG_COMPARATOR); + sortedKeys = tmp; + } else { + sortedKeys = unsortedKeys; + } + + this.keysInBindingOrder = ImmutableList.copyOf(sortedKeys); } @Override public IdentifiableItem deserialize(final NodeIdentifierWithPredicates input) { - final Collection keys = schema.getKeyDefinition(); - final ArrayList bindingValues = new ArrayList<>(keys.size()); - for (final QName key : keys) { + final ArrayList bindingValues = new ArrayList<>(keysInBindingOrder.size()); + for (final QName key : keysInBindingOrder) { final Object yangValue = input.getKeyValues().get(key); bindingValues.add(keyValueContexts.get(key).deserialize(yangValue)); } -- 2.36.6