X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=code-generator%2Fbinding-data-codec%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fbinding%2Fdata%2Fcodec%2Fimpl%2FBindingCodecContext.java;h=dfef41afc0aedd37bac71784384be0b3e816db95;hb=ce5c6eb0184495fc7b2723e07bbf245e831f2442;hp=6d1e31c2b47a1a3b7589ee060f89cbcd39156633;hpb=15f1044825f20789f9b6ba1bab13add1997ceded;p=yangtools.git diff --git a/code-generator/binding-data-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/BindingCodecContext.java b/code-generator/binding-data-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/BindingCodecContext.java index 6d1e31c2b4..dfef41afc0 100644 --- a/code-generator/binding-data-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/BindingCodecContext.java +++ b/code-generator/binding-data-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/BindingCodecContext.java @@ -9,7 +9,6 @@ package org.opendaylight.yangtools.binding.data.codec.impl; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSortedMap; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; @@ -20,6 +19,7 @@ import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -357,9 +357,9 @@ class BindingCodecContext implements CodecContextFactory, Immutable { } - private class IdentifiableItemCodec implements Codec> { + private static class IdentifiableItemCodec implements Codec> { - private final ImmutableSortedMap keyValueContexts; + private final Map keyValueContexts; private final ListSchemaNode schema; private final Constructor> constructor; private final Class identifiable; @@ -368,39 +368,50 @@ class BindingCodecContext implements CodecContextFactory, Immutable { final Class identifiable, final Map keyValueContexts) { this.schema = schema; this.identifiable = identifiable; - this.keyValueContexts = ImmutableSortedMap.copyOf(keyValueContexts); this.constructor = getConstructor(keyClass); + + /* + * We need to re-index to make sure we instantiate nodes in the order in which + * they are defined. + */ + final Map keys = new LinkedHashMap<>(); + for (QName qname : schema.getKeyDefinition()) { + keys.put(qname, keyValueContexts.get(qname)); + } + this.keyValueContexts = ImmutableMap.copyOf(keys); } @Override public IdentifiableItem deserialize(final NodeIdentifierWithPredicates input) { - ArrayList bindingValues = new ArrayList<>(); - - for(QName key: schema.getKeyDefinition()) { + final Collection keys = schema.getKeyDefinition(); + final ArrayList bindingValues = new ArrayList<>(keys.size()); + for (QName key : keys) { Object yangValue = input.getKeyValues().get(key); bindingValues.add(keyValueContexts.get(key).deserialize(yangValue)); } + + final Identifier identifier; try { - final Identifier identifier = constructor.newInstance(bindingValues.toArray()); - @SuppressWarnings({ "rawtypes", "unchecked" }) - final IdentifiableItem identifiableItem = new IdentifiableItem(identifiable, identifier); - return identifiableItem; + identifier = constructor.newInstance(bindingValues.toArray()); } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { - throw new IllegalStateException(e); + throw new IllegalStateException(String.format("Failed to instantiate key class %s", constructor.getDeclaringClass()), e); } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + final IdentifiableItem identifiableItem = new IdentifiableItem(identifiable, identifier); + return identifiableItem; } @Override public NodeIdentifierWithPredicates serialize(final IdentifiableItem input) { Object value = input.getKey(); - Map values = new HashMap<>(); + Map values = new LinkedHashMap<>(); for (Entry valueCtx : keyValueContexts.entrySet()) { values.put(valueCtx.getKey(), valueCtx.getValue().getAndSerialize(value)); } return new NodeIdentifierWithPredicates(schema.getQName(), values); } - } @SuppressWarnings("unchecked")