BUG-2383: refactor RIBSupportRegistry
[bgpcep.git] / bgp / rib-spi / src / main / java / org / opendaylight / protocol / bgp / rib / spi / SimpleRIBExtensionProviderContext.java
index bea86bce9433b307fb2a300a389745b79937c148..41e4d2a98012942f3cdccac5a31d0a0366f37690 100644 (file)
@@ -7,16 +7,17 @@
  */
 package org.opendaylight.protocol.bgp.rib.spi;
 
-import java.util.Map;
+import com.google.common.base.Preconditions;
 import java.util.concurrent.ConcurrentHashMap;
-
+import java.util.concurrent.ConcurrentMap;
 import org.opendaylight.protocol.concepts.AbstractRegistration;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily;
 
 public class SimpleRIBExtensionProviderContext implements RIBExtensionProviderContext {
-    private final Map<TablesKey, AdjRIBsFactory> factories = new ConcurrentHashMap<>();
+    private final ConcurrentMap<TablesKey, AdjRIBsFactory> factories = new ConcurrentHashMap<>();
+    private final ConcurrentMap<TablesKey, RIBSupport> supports = new ConcurrentHashMap<>();
 
     @Override
     public final synchronized AbstractRegistration registerAdjRIBsInFactory(final Class<? extends AddressFamily> afi,
@@ -29,11 +30,10 @@ public class SimpleRIBExtensionProviderContext implements RIBExtensionProviderCo
 
         this.factories.put(key, factory);
 
-        final Object lock = this;
         return new AbstractRegistration() {
             @Override
             protected void removeRegistration() {
-                synchronized (lock) {
+                synchronized (SimpleRIBExtensionProviderContext.this) {
                     SimpleRIBExtensionProviderContext.this.factories.remove(key);
                 }
             }
@@ -45,4 +45,30 @@ public class SimpleRIBExtensionProviderContext implements RIBExtensionProviderCo
             final Class<? extends SubsequentAddressFamily> safi) {
         return this.factories.get(new TablesKey(afi, safi));
     }
+
+    @Override
+    public <T extends RIBSupport> RIBSupportRegistration<T> registerRIBSupport(final Class<? extends AddressFamily> afi,
+            final Class<? extends SubsequentAddressFamily> safi, final T support) {
+        final TablesKey key = new TablesKey(afi, safi);
+
+        final RIBSupport prev = this.supports.putIfAbsent(key, support);
+        Preconditions.checkArgument(prev == null, "AFI %s SAFI %s is already registered with %s", afi, safi, prev);
+
+        return new AbstractRIBSupportRegistration<T>(support) {
+            @Override
+            protected void removeRegistration() {
+                SimpleRIBExtensionProviderContext.this.supports.remove(key);
+            }
+        };
+    }
+
+    @Override
+    public RIBSupport getRIBSupport(final Class<? extends AddressFamily> afi, final Class<? extends SubsequentAddressFamily> safi) {
+        return getRIBSupport(new TablesKey(afi, safi));
+    }
+
+    @Override
+    public RIBSupport getRIBSupport(final TablesKey key) {
+        return this.supports.get(Preconditions.checkNotNull(key));
+    }
 }