Merge "AbstractConfigTest - exposed BundleContext and ServiceRegistration mock."
[controller.git] / opendaylight / md-sal / sal-rest-connector / src / main / java / org / opendaylight / controller / sal / rest / impl / RestconfProvider.java
1 package org.opendaylight.controller.sal.rest.impl;
2
3 import java.util.Collection;
4 import java.util.Collections;
5
6 import org.opendaylight.controller.sal.core.api.Broker;
7 import org.opendaylight.controller.sal.core.api.Broker.ProviderSession;
8 import org.opendaylight.controller.sal.core.api.Provider;
9 import org.opendaylight.controller.sal.core.api.data.DataBrokerService;
10 import org.opendaylight.controller.sal.core.api.model.SchemaService;
11 import org.opendaylight.controller.sal.core.api.model.SchemaServiceListener;
12 import org.opendaylight.controller.sal.restconf.impl.BrokerFacade;
13 import org.opendaylight.controller.sal.restconf.impl.ControllerContext;
14 import org.opendaylight.yangtools.concepts.ListenerRegistration;
15 import org.osgi.framework.BundleActivator;
16 import org.osgi.framework.BundleContext;
17 import org.osgi.framework.ServiceReference;
18 import org.osgi.util.tracker.ServiceTracker;
19 import org.osgi.util.tracker.ServiceTrackerCustomizer;
20
21 public class RestconfProvider implements BundleActivator, Provider, ServiceTrackerCustomizer<Broker, Broker> {
22
23     public final static String NOT_INITALIZED_MSG = "Restcof is not initialized yet. Please try again later";
24     
25     private ListenerRegistration<SchemaServiceListener> listenerRegistration;
26     private ServiceTracker<Broker, Broker> brokerServiceTrancker;
27     private BundleContext bundleContext;
28     private ProviderSession session;
29
30     @Override
31     public void onSessionInitiated(ProviderSession session) {
32         DataBrokerService dataService = session.getService(DataBrokerService.class);
33
34         BrokerFacade.getInstance().setContext(session);
35         BrokerFacade.getInstance().setDataService(dataService);
36
37         SchemaService schemaService = session.getService(SchemaService.class);
38         listenerRegistration = schemaService.registerSchemaServiceListener(ControllerContext.getInstance());
39         ControllerContext.getInstance().setSchemas(schemaService.getGlobalContext());
40     }
41
42     @Override
43     public void start(BundleContext context) throws Exception {
44         bundleContext = context;
45         brokerServiceTrancker = new ServiceTracker<>(context, Broker.class, this);
46         brokerServiceTrancker.open();
47     }
48
49     @Override
50     public void stop(BundleContext context) {
51         if (listenerRegistration != null) {
52             try {
53                 listenerRegistration.close();
54             } catch (Exception e) {
55                 e.printStackTrace();
56             }
57         }
58         session.close();
59         brokerServiceTrancker.close();
60     }
61
62     @Override
63     public Collection<ProviderFunctionality> getProviderFunctionality() {
64         return Collections.emptySet();
65     }
66
67     @Override
68     public Broker addingService(ServiceReference<Broker> reference) {
69         Broker broker = bundleContext.getService(reference);
70         broker.registerProvider(this, bundleContext);
71         return broker;
72     }
73
74     @Override
75     public void modifiedService(ServiceReference<Broker> reference, Broker service) {
76         // NOOP
77     }
78
79     @Override
80     public void removedService(ServiceReference<Broker> reference, Broker service) {
81         bundleContext.ungetService(reference);
82         BrokerFacade.getInstance().setContext(null);
83         BrokerFacade.getInstance().setDataService(null);
84         ControllerContext.getInstance().setSchemas(null);
85     }
86 }