From: Tony Tkacik Date: Mon, 30 Jun 2014 12:53:27 +0000 (+0200) Subject: Bug 1027: Sort map of instance-identifiers and data by length. X-Git-Tag: release/helium~572^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=22000c97031a397b247a75ede2383f6ae792efc9 Bug 1027: Sort map of instance-identifiers and data by length. In order to have more reliable deserialization of Maps of Bidning-Independented data to Binding-Aware entries should be sorted by their length, with shorter ones beforehand, since codecs for them have higher probability to be known. Parent codecs also contains references to child-classes which may be never used in new context so this makes deserialization more predicable and easier to debug. Change-Id: Iad1490f893e946a2a019c88570325dcfb11c244d Signed-off-by: Tony Tkacik --- diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractForwardedDataBroker.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractForwardedDataBroker.java index f24809de45..b109f89ff6 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractForwardedDataBroker.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractForwardedDataBroker.java @@ -7,7 +7,9 @@ */ package org.opendaylight.controller.md.sal.binding.impl; +import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -40,6 +42,7 @@ import org.slf4j.LoggerFactory; import com.google.common.base.Objects; import com.google.common.base.Optional; +import com.google.common.collect.Iterables; public abstract class AbstractForwardedDataBroker implements Delegator, DomForwardedBroker, SchemaContextListener, AutoCloseable { @@ -97,8 +100,8 @@ public abstract class AbstractForwardedDataBroker implements Delegator, DataObject> toBinding( final Map> normalized) { Map, DataObject> newMap = new HashMap<>(); - for (Map.Entry> entry : normalized - .entrySet()) { + + for (Map.Entry> entry : sortedEntries(normalized)) { try { Optional, DataObject>> potential = getCodec().toBinding( entry); @@ -113,6 +116,21 @@ public abstract class AbstractForwardedDataBroker implements Delegator Iterable> sortedEntries(final Map map) { + ArrayList> entries = new ArrayList<>(map.entrySet()); + Collections.sort(entries, new Comparator>() { + + @Override + public int compare(final Entry left, + final Entry right) { + int leftSize = Iterables.size(left.getKey().getPathArguments()); + int rightSize = Iterables.size(right.getKey().getPathArguments()); + return Integer.compare(leftSize, rightSize); + } + }); + return entries; + } + protected Set> toBinding( final Set normalized) { Set> hashSet = new HashSet<>();