Merge "Reuse PEM provider in netconf-testtool."
[controller.git] / opendaylight / md-sal / sal-rest-docgen / src / main / java / org / opendaylight / controller / sal / rest / doc / DocProvider.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.sal.rest.doc;
9
10 import java.util.Collection;
11 import java.util.Collections;
12 import java.util.LinkedList;
13 import java.util.List;
14
15 import org.opendaylight.controller.sal.core.api.Broker;
16 import org.opendaylight.controller.sal.core.api.Provider;
17 import org.opendaylight.controller.sal.core.api.model.SchemaService;
18 import org.opendaylight.controller.sal.core.api.mount.MountProvisionService;
19 import org.opendaylight.controller.sal.core.api.mount.MountProvisionListener;
20 import org.opendaylight.controller.sal.rest.doc.impl.ApiDocGenerator;
21 import org.opendaylight.controller.sal.rest.doc.mountpoints.MountPointSwagger;
22 import org.opendaylight.yangtools.concepts.ListenerRegistration;
23 import org.osgi.framework.BundleActivator;
24 import org.osgi.framework.BundleContext;
25 import org.osgi.framework.ServiceReference;
26 import org.osgi.util.tracker.ServiceTracker;
27 import org.osgi.util.tracker.ServiceTrackerCustomizer;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31 public class DocProvider implements BundleActivator, ServiceTrackerCustomizer<Broker, Broker>,
32         Provider, AutoCloseable {
33
34     private final Logger _logger = LoggerFactory.getLogger(DocProvider.class);
35
36     private ServiceTracker<Broker, Broker> brokerServiceTracker;
37     private BundleContext bundleContext;
38     private Broker.ProviderSession session;
39
40     private final List<AutoCloseable> toClose = new LinkedList<>();
41
42     @Override
43     public void close() throws Exception {
44         stop(bundleContext);
45     }
46
47     @Override
48     public void onSessionInitiated(Broker.ProviderSession providerSession) {
49         SchemaService schemaService = providerSession.getService(SchemaService.class);
50         ApiDocGenerator.getInstance().setSchemaService(schemaService);
51
52         MountProvisionService mountService = providerSession
53                 .getService(MountProvisionService.class);
54         ListenerRegistration<MountProvisionListener> registration = mountService
55                 .registerProvisionListener(MountPointSwagger.getInstance());
56         MountPointSwagger.getInstance().setGlobalSchema(schemaService);
57         synchronized (toClose) {
58             toClose.add(registration);
59         }
60         MountPointSwagger.getInstance().setMountService(mountService);
61
62         _logger.debug("Restconf API Explorer started");
63     }
64
65     @Override
66     public Collection<ProviderFunctionality> getProviderFunctionality() {
67         return Collections.emptySet();
68     }
69
70     @Override
71     public void start(BundleContext context) throws Exception {
72         bundleContext = context;
73         brokerServiceTracker = new ServiceTracker<>(context, Broker.class, this);
74         brokerServiceTracker.open();
75     }
76
77     @Override
78     public void stop(BundleContext context) throws Exception {
79         if (brokerServiceTracker != null) {
80             brokerServiceTracker.close();
81         }
82
83         if (session != null) {
84             session.close();
85         }
86
87         synchronized (toClose) {
88             for (AutoCloseable close : toClose) {
89                 close.close();
90             }
91         }
92     }
93
94     @Override
95     public Broker addingService(ServiceReference<Broker> reference) {
96         Broker broker = bundleContext.getService(reference);
97         session = broker.registerProvider(this, bundleContext);
98         return broker;
99     }
100
101     @Override
102     public void modifiedService(ServiceReference<Broker> reference, Broker service) {
103         if (session != null) {
104             session.close();
105         }
106
107         Broker broker = bundleContext.getService(reference);
108         session = broker.registerProvider(this, bundleContext);
109     }
110
111     @Override
112     public void removedService(ServiceReference<Broker> reference, Broker service) {
113         bundleContext.ungetService(reference);
114     }
115 }