Implement proper activator shutdown
[bgpcep.git] / bgp / rib-spi / src / main / java / org / opendaylight / protocol / bgp / rib / spi / AbstractRIBExtensionProviderActivator.java
diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AbstractRIBExtensionProviderActivator.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AbstractRIBExtensionProviderActivator.java
new file mode 100644 (file)
index 0000000..1b23cd3
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.protocol.bgp.rib.spi;
+
+import java.util.List;
+
+import javax.annotation.concurrent.GuardedBy;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Preconditions;
+
+public abstract class AbstractRIBExtensionProviderActivator implements RIBExtensionProviderActivator {
+       private static final Logger LOG = LoggerFactory.getLogger(AbstractRIBExtensionProviderActivator.class);
+
+       @GuardedBy("this")
+       private List<AutoCloseable> registrations;
+
+       @GuardedBy("this")
+       protected abstract List<AutoCloseable> startRIBExtensionProviderImpl(RIBExtensionProviderContext context);
+
+       @Override
+       public synchronized final void startRIBExtensionProvider(final RIBExtensionProviderContext context) {
+               Preconditions.checkState(this.registrations == null);
+
+               this.registrations = Preconditions.checkNotNull(startRIBExtensionProviderImpl(context));
+       }
+
+       @Override
+       public synchronized final void stopRIBExtensionProvider() {
+               Preconditions.checkState(this.registrations != null);
+
+               for (final AutoCloseable r : this.registrations) {
+                       try {
+                               r.close();
+                       } catch (final Exception e) {
+                               LOG.warn("Failed to close registration", e);
+                       }
+               }
+
+               this.registrations = null;
+       }
+}