BUG-223: Support having multiple RIB instances
[bgpcep.git] / bgp / rib-impl / src / main / java / org / opendaylight / protocol / bgp / rib / impl / RIBActivator.java
index bba3138852b1d49c084defb78908d5d1cfbf8258..b362cd4744295dc5fbe9aa111d374779d062c702 100644 (file)
@@ -8,65 +8,38 @@
 package org.opendaylight.protocol.bgp.rib.impl;
 
 import java.util.Comparator;
+import java.util.List;
 
+import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
+import org.opendaylight.protocol.bgp.rib.RibReference;
+import org.opendaylight.protocol.bgp.rib.spi.AbstractRIBExtensionProviderActivator;
 import org.opendaylight.protocol.bgp.rib.spi.AdjRIBsIn;
 import org.opendaylight.protocol.bgp.rib.spi.AdjRIBsInFactory;
-import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderActivator;
 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderContext;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130918.PathAttributes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.PathAttributes;
 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.Ipv4AddressFamily;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv6AddressFamily;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Preconditions;
+import com.google.common.collect.Lists;
 
-public final class RIBActivator implements RIBExtensionProviderActivator {
-       private static final Logger LOG = LoggerFactory.getLogger(RIBActivator.class);
-       private AutoCloseable v4reg, v6reg;
+public final class RIBActivator extends AbstractRIBExtensionProviderActivator {
 
        @Override
-       public void startRIBExtensionProvider(final RIBExtensionProviderContext context) {
-               Preconditions.checkState(v4reg == null);
-               Preconditions.checkState(v6reg == null);
-
-               v4reg = context.registerAdjRIBsInFactory(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class, new AdjRIBsInFactory() {
-                       @Override
-                       public AdjRIBsIn createAdjRIBsIn(final Comparator<PathAttributes> comparator, final TablesKey key) {
-                               return new Ipv4AdjRIBsIn(comparator, key);
-                       }
-               });
-
-               v6reg = context.registerAdjRIBsInFactory(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class, new AdjRIBsInFactory() {
-                       @Override
-                       public AdjRIBsIn createAdjRIBsIn(final Comparator<PathAttributes> comparator, final TablesKey key) {
-                               return new Ipv6AdjRIBsIn(comparator, key);
-                       }
-               });
-
-       }
-
-       @Override
-       public void stopRIBExtensionProvider() {
-               if (v4reg != null) {
-                       try {
-                               v4reg.close();
-                       } catch (Exception e) {
-                               LOG.warn("Failed to unregister IPv4 extension", e);
-                       } finally {
-                               v4reg = null;
-                       }
-               }
-               if (v6reg != null) {
-                       try {
-                               v6reg.close();
-                       } catch (Exception e) {
-                               LOG.warn("Failed to unregister IPv6 extension", e);
-                       } finally {
-                               v6reg = null;
-                       }
-               }
+       protected List<AutoCloseable> startRIBExtensionProviderImpl(final RIBExtensionProviderContext context) {
+               return Lists.newArrayList(
+                               context.registerAdjRIBsInFactory(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class, new AdjRIBsInFactory() {
+                                       @Override
+                                       public AdjRIBsIn createAdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final Comparator<PathAttributes> comparator, final TablesKey key) {
+                                               return new Ipv4AdjRIBsIn(trans, rib, comparator, key);
+                                       }
+                               }),
+                               context.registerAdjRIBsInFactory(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class, new AdjRIBsInFactory() {
+                                       @Override
+                                       public AdjRIBsIn createAdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final Comparator<PathAttributes> comparator, final TablesKey key) {
+                                               return new Ipv6AdjRIBsIn(trans, rib, comparator, key);
+                                       }
+                               }));
        }
 }