import com.google.common.collect.Iterables;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
+import java.util.AbstractMap;
+import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.opendaylight.bgp.concepts.NextHopUtil;
private final ConcurrentMap<BgpTableType, NlriParser> handlers = new ConcurrentHashMap<>();
private final ConcurrentMap<Class<? extends DataObject>, NlriSerializer> serializers = new ConcurrentHashMap<>();
private final ConcurrentMap<BgpTableType, NextHopParserSerializer> nextHopParsers = new ConcurrentHashMap<>();
- private final ConcurrentMap<Class<? extends CNextHop>, NextHopParserSerializer> nextHopSerializers = new ConcurrentHashMap<>();
+ private final ConcurrentMap<Map.Entry<Class<? extends CNextHop>, BgpTableType>, NextHopParserSerializer> nextHopSerializers = new ConcurrentHashMap<>();
private final SubsequentAddressFamilyRegistry safiReg;
private final AddressFamilyRegistry afiReg;
}
private static BgpTableType createKey(final Class<? extends AddressFamily> afi,
- final Class<? extends SubsequentAddressFamily> safi) {
+ final Class<? extends SubsequentAddressFamily> safi) {
Preconditions.checkNotNull(afi);
Preconditions.checkNotNull(safi);
return new BgpTableTypeImpl(afi, safi);
}
synchronized AutoCloseable registerNlriParser(final Class<? extends AddressFamily> afi,
- final Class<? extends SubsequentAddressFamily> safi, final NlriParser parser,
- final NextHopParserSerializer nextHopSerializer, final Class<? extends CNextHop> cNextHopClass,
- final Class<? extends CNextHop>... cNextHopClassList) {
+ final Class<? extends SubsequentAddressFamily> safi, final NlriParser parser,
+ final NextHopParserSerializer nextHopSerializer, final Class<? extends CNextHop> cNextHopClass,
+ final Class<? extends CNextHop>... cNextHopClassList) {
final BgpTableType key = createKey(afi, safi);
final NlriParser prev = this.handlers.get(key);
Preconditions.checkState(prev == null, "AFI/SAFI is already bound to parser " + prev);
this.nextHopParsers.put(key,nextHopSerializer);
if (cNextHopClass != null) {
- this.nextHopSerializers.put(cNextHopClass, nextHopSerializer);
- for (Class<? extends CNextHop> cNextHop : cNextHopClassList) {
- this.nextHopSerializers.put(cNextHop, nextHopSerializer);
+ final Map.Entry<Class<? extends CNextHop>, BgpTableType> nhKey = new AbstractMap.SimpleEntry(cNextHopClass, key);
+ this.nextHopSerializers.put(nhKey, nextHopSerializer);
+ for (final Class<? extends CNextHop> cNextHop : cNextHopClassList) {
+ final Map.Entry<Class<? extends CNextHop>, BgpTableType> nhKeys = new AbstractMap.SimpleEntry(cNextHop, key);
+ this.nextHopSerializers.put(nhKeys, nextHopSerializer);
}
}
SimpleNlriRegistry.this.nextHopParsers.remove(key);
if (cNextHopClass != null) {
SimpleNlriRegistry.this.nextHopSerializers.remove(cNextHopClass);
- for (Class<? extends CNextHop> cNextHop : cNextHopClassList) {
+ for (final Class<? extends CNextHop> cNextHop : cNextHopClassList) {
SimpleNlriRegistry.this.nextHopSerializers.remove(cNextHop);
}
}
final CNextHop cNextHop = mpReachNlri.getCNextHop();
if (cNextHop != null) {
- final NextHopParserSerializer nextHopSerializer = this.nextHopSerializers.get(cNextHop.getImplementedInterface());
+ final Map.Entry<Class<? extends CNextHop>, BgpTableType> key = new AbstractMap.SimpleEntry(cNextHop.getImplementedInterface(),
+ new BgpTableTypeImpl(afi, safi));
+ final NextHopParserSerializer nextHopSerializer = this.nextHopSerializers.get(key);
final ByteBuf nextHopBuffer = Unpooled.buffer();
if (nextHopSerializer == null) {
//TODO Remove once deprecated registerNlriParser is removed