Add JSONRestconfService impl for the restconf Draft18 impl
[netconf.git] / restconf / sal-rest-connector / src / main / java / org / opendaylight / restconf / RestConnectorProvider.java
index 50012e643b4df92fca954fa7c407fc43f384be58..2aab6df3a243926742c4ca9499bfb30b6c7d878a 100644 (file)
@@ -9,22 +9,20 @@
 package org.opendaylight.restconf;
 
 import com.google.common.base.Preconditions;
-import java.util.Collection;
-import java.util.Collections;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionChain;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
 import org.opendaylight.controller.md.sal.dom.api.DOMMountPointService;
+import org.opendaylight.controller.md.sal.dom.api.DOMNotificationService;
 import org.opendaylight.controller.md.sal.dom.api.DOMRpcService;
-import org.opendaylight.controller.sal.core.api.Broker.ProviderSession;
-import org.opendaylight.controller.sal.core.api.Provider;
 import org.opendaylight.controller.sal.core.api.model.SchemaService;
 import org.opendaylight.netconf.sal.rest.api.RestConnector;
 import org.opendaylight.netconf.sal.restconf.impl.RestconfDocumentedException;
 import org.opendaylight.restconf.common.wrapper.services.ServicesWrapperImpl;
 import org.opendaylight.restconf.handlers.DOMDataBrokerHandler;
 import org.opendaylight.restconf.handlers.DOMMountPointServiceHandler;
+import org.opendaylight.restconf.handlers.NotificationServiceHandler;
 import org.opendaylight.restconf.handlers.RpcServiceHandler;
 import org.opendaylight.restconf.handlers.SchemaContextHandler;
 import org.opendaylight.restconf.handlers.TransactionChainHandler;
@@ -34,14 +32,14 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * Provider for restconf draft17.
+ * Provider for restconf draft18.
  *
  */
-public class RestConnectorProvider implements Provider, RestConnector, AutoCloseable {
+public class RestConnectorProvider implements RestConnector, AutoCloseable {
 
     private static final Logger LOG = LoggerFactory.getLogger(RestConnectorProvider.class);
 
-    public static final TransactionChainListener transactionListener = new TransactionChainListener() {
+    public static final TransactionChainListener TRANSACTION_CHAIN_LISTENER = new TransactionChainListener() {
         @Override
         public void onTransactionChainFailed(final TransactionChain<?, ?> chain,
                 final AsyncTransaction<?, ?> transaction, final Throwable cause) {
@@ -56,53 +54,76 @@ public class RestConnectorProvider implements Provider, RestConnector, AutoClose
         }
     };
 
-    private ListenerRegistration<SchemaContextListener> listenerRegistration;
     private static TransactionChainHandler transactionChainHandler;
     private static DOMDataBroker dataBroker;
+    private static DOMMountPointServiceHandler mountPointServiceHandler;
 
-    @Override
-    public void onSessionInitiated(final ProviderSession session) {
-        final SchemaService schemaService = Preconditions.checkNotNull(session.getService(SchemaService.class));
+    private final SchemaService schemaService;
+    private final DOMRpcService rpcService;
+    private final DOMNotificationService notificationService;
+    private final DOMMountPointService mountPointService;
+    private ListenerRegistration<SchemaContextListener> listenerRegistration;
+
+    private SchemaContextHandler schemaCtxHandler;
+
+    public RestConnectorProvider(DOMDataBroker domDataBroker, SchemaService schemaService, DOMRpcService rpcService,
+            DOMNotificationService notificationService, DOMMountPointService mountPointService) {
+        this.schemaService = Preconditions.checkNotNull(schemaService);
+        this.rpcService = Preconditions.checkNotNull(rpcService);
+        this.notificationService = Preconditions.checkNotNull(notificationService);
+        this.mountPointService = Preconditions.checkNotNull(mountPointService);
+
+        RestConnectorProvider.dataBroker = Preconditions.checkNotNull(domDataBroker);
+    }
 
+    public void start() {
         final ServicesWrapperImpl wrapperServices = ServicesWrapperImpl.getInstance();
 
-        final SchemaContextHandler schemaCtxHandler = new SchemaContextHandler();
-        this.listenerRegistration = schemaService.registerSchemaContextListener(schemaCtxHandler);
+        mountPointServiceHandler = new DOMMountPointServiceHandler(mountPointService);
 
-        final DOMMountPointServiceHandler domMountPointServiceHandler = new DOMMountPointServiceHandler(
-                session.getService(DOMMountPointService.class));
+        final DOMDataBrokerHandler brokerHandler = new DOMDataBrokerHandler(dataBroker);
 
-        RestConnectorProvider.dataBroker = session.getService(DOMDataBroker.class);
-        final DOMDataBrokerHandler brokerHandler = new DOMDataBrokerHandler(RestConnectorProvider.dataBroker);
+        RestConnectorProvider.transactionChainHandler = new TransactionChainHandler(dataBroker
+                .createTransactionChain(RestConnectorProvider.TRANSACTION_CHAIN_LISTENER));
 
-        RestConnectorProvider.transactionChainHandler = new TransactionChainHandler(RestConnectorProvider.dataBroker
-                .createTransactionChain(RestConnectorProvider.transactionListener));
+        this.schemaCtxHandler = new SchemaContextHandler(transactionChainHandler);
+        this.listenerRegistration = schemaService.registerSchemaContextListener(this.schemaCtxHandler);
 
-        final DOMRpcService rpcService = session.getService(DOMRpcService.class);
         final RpcServiceHandler rpcServiceHandler = new RpcServiceHandler(rpcService);
 
-        wrapperServices.setHandlers(schemaCtxHandler, domMountPointServiceHandler,
-                RestConnectorProvider.transactionChainHandler, brokerHandler, rpcServiceHandler);
+        final NotificationServiceHandler notificationServiceHandler =
+                new NotificationServiceHandler(notificationService);
+
+        wrapperServices.setHandlers(this.schemaCtxHandler, RestConnectorProvider.mountPointServiceHandler,
+                RestConnectorProvider.transactionChainHandler, brokerHandler, rpcServiceHandler,
+                notificationServiceHandler);
+    }
+
+    public DOMMountPointServiceHandler getMountPointServiceHandler() {
+        return mountPointServiceHandler;
     }
 
     /**
      * After {@link TransactionChain} failed, this updates {@link TransactionChainHandler} with new transaction chain.
      *
      * @param chain
-     *            - old {@link TransactionChain}
+     *             old {@link TransactionChain}
      */
     public static void resetTransactionChainForAdapaters(final TransactionChain<?, ?> chain) {
         LOG.trace("Resetting TransactionChain({})", chain);
         chain.close();
         RestConnectorProvider.transactionChainHandler.update(
-                Preconditions.checkNotNull(RestConnectorProvider.dataBroker).createTransactionChain(
-                        RestConnectorProvider.transactionListener)
+                Preconditions.checkNotNull(dataBroker).createTransactionChain(
+                        RestConnectorProvider.TRANSACTION_CHAIN_LISTENER)
         );
     }
 
-    @Override
-    public Collection<ProviderFunctionality> getProviderFunctionality() {
-        return Collections.emptySet();
+    /**
+     * Get current {@link DOMMountPointService} from {@link DOMMountPointServiceHandler}.
+     * @return {@link DOMMountPointService}
+     */
+    public static DOMMountPointService getMountPointService() {
+        return mountPointServiceHandler.get();
     }
 
     @Override
@@ -113,8 +134,12 @@ public class RestConnectorProvider implements Provider, RestConnector, AutoClose
         }
 
         // close transaction chain
-        if ((transactionChainHandler != null) && (transactionChainHandler.get() != null)) {
+        if (transactionChainHandler != null && transactionChainHandler.get() != null) {
             transactionChainHandler.get().close();
         }
+
+        transactionChainHandler = null;
+        mountPointServiceHandler = null;
+        dataBroker = null;
     }
 }