Make DOMMountPointService listenable
[controller.git] / opendaylight / md-sal / sal-rest-docgen / src / main / java / org / opendaylight / controller / sal / rest / doc / DocProvider.java
index 934412d95af1dce17b281e1b6c6e0f1e0a380bb7..9a1816b90e88f333417a6c62d335c67b7f04739f 100644 (file)
@@ -9,11 +9,17 @@ package org.opendaylight.controller.sal.rest.doc;
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
 
 import org.opendaylight.controller.sal.core.api.Broker;
 import org.opendaylight.controller.sal.core.api.Provider;
 import org.opendaylight.controller.sal.core.api.model.SchemaService;
+import org.opendaylight.controller.sal.core.api.mount.MountProvisionService;
+import org.opendaylight.controller.sal.core.api.mount.MountProvisionListener;
 import org.opendaylight.controller.sal.rest.doc.impl.ApiDocGenerator;
+import org.opendaylight.controller.sal.rest.doc.mountpoints.MountPointSwagger;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
@@ -22,24 +28,37 @@ import org.osgi.util.tracker.ServiceTrackerCustomizer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class DocProvider implements BundleActivator, ServiceTrackerCustomizer<Broker, Broker>, Provider, AutoCloseable {
+public class DocProvider implements BundleActivator, ServiceTrackerCustomizer<Broker, Broker>,
+        Provider, AutoCloseable {
 
-    private static final Logger _logger = LoggerFactory.getLogger(DocProvider.class);
+    private final Logger _logger = LoggerFactory.getLogger(DocProvider.class);
 
     private ServiceTracker<Broker, Broker> brokerServiceTracker;
     private BundleContext bundleContext;
     private Broker.ProviderSession session;
 
+    private final List<AutoCloseable> toClose = new LinkedList<>();
+
     @Override
     public void close() throws Exception {
         stop(bundleContext);
     }
 
     @Override
-    public void onSessionInitiated(final Broker.ProviderSession providerSession) {
+    public void onSessionInitiated(Broker.ProviderSession providerSession) {
         SchemaService schemaService = providerSession.getService(SchemaService.class);
         ApiDocGenerator.getInstance().setSchemaService(schemaService);
 
+        MountProvisionService mountService = providerSession
+                .getService(MountProvisionService.class);
+        ListenerRegistration<MountProvisionListener> registration = mountService
+                .registerProvisionListener(MountPointSwagger.getInstance());
+        MountPointSwagger.getInstance().setGlobalSchema(schemaService);
+        synchronized (toClose) {
+            toClose.add(registration);
+        }
+        MountPointSwagger.getInstance().setMountService(mountService);
+
         _logger.debug("Restconf API Explorer started");
     }
 
@@ -49,42 +68,45 @@ public class DocProvider implements BundleActivator, ServiceTrackerCustomizer<Br
     }
 
     @Override
-    public void start(final BundleContext context) throws Exception {
+    public void start(BundleContext context) throws Exception {
         bundleContext = context;
-        brokerServiceTracker = new ServiceTracker<>(context, Broker.class, this);
+        brokerServiceTracker = new ServiceTracker(context, Broker.class, this);
         brokerServiceTracker.open();
     }
 
     @Override
-    public void stop(final BundleContext context) throws Exception {
-        if (brokerServiceTracker != null) {
+    public void stop(BundleContext context) throws Exception {
+        if (brokerServiceTracker != null)
             brokerServiceTracker.close();
-        }
 
-        if (session != null) {
+        if (session != null)
             session.close();
+
+        synchronized (toClose) {
+            for (AutoCloseable close : toClose) {
+                close.close();
+            }
         }
     }
 
     @Override
-    public Broker addingService(final ServiceReference<Broker> reference) {
+    public Broker addingService(ServiceReference<Broker> reference) {
         Broker broker = bundleContext.getService(reference);
         session = broker.registerProvider(this, bundleContext);
         return broker;
     }
 
     @Override
-    public void modifiedService(final ServiceReference<Broker> reference, final Broker service) {
-        if (session != null) {
+    public void modifiedService(ServiceReference<Broker> reference, Broker service) {
+        if (session != null)
             session.close();
-        }
 
         Broker broker = bundleContext.getService(reference);
         session = broker.registerProvider(this, bundleContext);
     }
 
     @Override
-    public void removedService(final ServiceReference<Broker> reference, final Broker service) {
+    public void removedService(ServiceReference<Broker> reference, Broker service) {
         bundleContext.ungetService(reference);
     }
 }