BUG-223: Support having multiple RIB instances
[bgpcep.git] / bgp / rib-impl / src / main / java / org / opendaylight / protocol / bgp / rib / impl / RIBTables.java
1 package org.opendaylight.protocol.bgp.rib.impl;
2
3 import java.util.Comparator;
4 import java.util.HashMap;
5 import java.util.Map;
6
7 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
8 import org.opendaylight.protocol.bgp.rib.RibReference;
9 import org.opendaylight.protocol.bgp.rib.spi.AdjRIBsIn;
10 import org.opendaylight.protocol.bgp.rib.spi.AdjRIBsInFactory;
11 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.PathAttributes;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
14
15 import com.google.common.base.Preconditions;
16
17 final class RIBTables {
18         private final Map<TablesKey, AdjRIBsIn> tables = new HashMap<>();
19         private final Comparator<PathAttributes> comparator;
20         private final RIBExtensionConsumerContext registry;
21
22         RIBTables(final Comparator<PathAttributes> comparator, final RIBExtensionConsumerContext extensions) {
23                 this.comparator = Preconditions.checkNotNull(comparator);
24                 this.registry = Preconditions.checkNotNull(extensions);
25         }
26
27         public synchronized AdjRIBsIn get(final TablesKey key) {
28                 return tables.get(key);
29         }
30
31         public synchronized AdjRIBsIn getOrCreate(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) {
32                 if (tables.containsKey(key)) {
33                         return tables.get(key);
34                 }
35
36                 final AdjRIBsInFactory f = registry.getAdjRIBsInFactory(key.getAfi(), key.getSafi());
37                 if (f == null) {
38                         return null;
39                 }
40
41                 final AdjRIBsIn table = Preconditions.checkNotNull(f.createAdjRIBsIn(trans, rib, comparator, key));
42                 tables.put(key, table);
43                 return table;
44         }
45 }