*/
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,
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);
}
}
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));
+ }
}