Eliminate NormalizedNodePayload
[netconf.git] / restconf / restconf-nb / src / main / java / org / opendaylight / restconf / nb / rfc8040 / JaxRsNorthbound.java
index 8f3ca53fe3b010ea28774d6d7e07b475e7a0d14c..965204df032cf59b9f615074550868e1473dd4d2 100644 (file)
@@ -7,13 +7,10 @@
  */
 package org.opendaylight.restconf.nb.rfc8040;
 
-import static org.opendaylight.restconf.nb.rfc8040.rests.utils.RestconfStreamsConstants.DATA_SUBSCRIPTION;
-import static org.opendaylight.restconf.nb.rfc8040.rests.utils.RestconfStreamsConstants.NOTIFICATION_STREAM;
-import static org.opendaylight.restconf.nb.rfc8040.utils.RestconfConstants.BASE_URI_PATTERN;
-import static org.opendaylight.restconf.nb.rfc8040.utils.RestconfConstants.NOTIF;
-
 import com.google.common.annotations.Beta;
+import java.util.Set;
 import javax.servlet.ServletException;
+import javax.ws.rs.core.Application;
 import org.opendaylight.aaa.filterchain.configuration.CustomFilterAdapterConfiguration;
 import org.opendaylight.aaa.filterchain.filters.CustomFilterAdapter;
 import org.opendaylight.aaa.web.FilterDetails;
@@ -22,64 +19,61 @@ import org.opendaylight.aaa.web.WebContext;
 import org.opendaylight.aaa.web.WebContextSecurer;
 import org.opendaylight.aaa.web.WebServer;
 import org.opendaylight.aaa.web.servlet.ServletSupport;
-import org.opendaylight.controller.config.threadpool.util.NamingThreadPoolFactory;
-import org.opendaylight.controller.config.threadpool.util.ScheduledThreadPoolWrapper;
-import org.opendaylight.mdsal.dom.api.DOMActionService;
-import org.opendaylight.mdsal.dom.api.DOMDataBroker;
-import org.opendaylight.mdsal.dom.api.DOMMountPointService;
-import org.opendaylight.mdsal.dom.api.DOMNotificationService;
-import org.opendaylight.mdsal.dom.api.DOMRpcService;
-import org.opendaylight.mdsal.dom.api.DOMSchemaService;
-import org.opendaylight.restconf.nb.rfc8040.databind.DatabindProvider;
-import org.opendaylight.restconf.nb.rfc8040.rests.services.impl.RestconfDataStreamServiceImpl;
-import org.opendaylight.restconf.nb.rfc8040.streams.Configuration;
-import org.opendaylight.restconf.nb.rfc8040.streams.WebSocketInitializer;
+import org.opendaylight.restconf.nb.jaxrs.JaxRsRestconf;
+import org.opendaylight.restconf.nb.jaxrs.JaxRsWebHostMetadata;
+import org.opendaylight.restconf.nb.jaxrs.JsonJaxRsFormattableBodyWriter;
+import org.opendaylight.restconf.nb.jaxrs.XmlJaxRsFormattableBodyWriter;
+import org.opendaylight.restconf.nb.rfc8040.jersey.providers.errors.RestconfDocumentedExceptionMapper;
+import org.opendaylight.restconf.nb.rfc8040.streams.RestconfStreamServletFactory;
+import org.opendaylight.restconf.server.api.RestconfServer;
+import org.opendaylight.restconf.server.spi.DatabindProvider;
 import org.opendaylight.yangtools.concepts.Registration;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
 
 /**
  * Main entrypoint into RFC8040 northbound. Take care of wiring up all applications activating them through JAX-RS.
  */
 @Beta
+@Component(service = { })
 public final class JaxRsNorthbound implements AutoCloseable {
     private final Registration discoveryReg;
     private final Registration restconfReg;
 
-    public JaxRsNorthbound(final WebServer webServer, final WebContextSecurer webContextSecurer,
-            final ServletSupport servletSupport, final CustomFilterAdapterConfiguration filterAdapterConfiguration,
-            final DOMActionService actionService, final DOMDataBroker dataBroker,
-            final DOMMountPointService mountPointService, final DOMNotificationService notificationService,
-            final DOMRpcService rpcService, final DOMSchemaService schemaService,
-            final DatabindProvider databindProvider,
-            final String pingNamePrefix, final int pingMaxThreadCount, final int maximumFragmentLength,
-            final int heartbeatInterval, final int idleTimeout, final boolean useSSE) throws ServletException {
-        final var configuration = new Configuration(maximumFragmentLength, idleTimeout, heartbeatInterval, useSSE);
-        final var scheduledThreadPool = new ScheduledThreadPoolWrapper(pingMaxThreadCount,
-            new NamingThreadPoolFactory(pingNamePrefix));
-
+    @Activate
+    public JaxRsNorthbound(@Reference final WebServer webServer, @Reference final WebContextSecurer webContextSecurer,
+            @Reference final ServletSupport servletSupport,
+            @Reference final CustomFilterAdapterConfiguration filterAdapterConfiguration,
+            @Reference final DatabindProvider databindProvider, @Reference final RestconfServer server,
+            @Reference final RestconfStreamServletFactory servletFactory) throws ServletException {
         final var restconfBuilder = WebContext.builder()
             .name("RFC8040 RESTCONF")
-            .contextPath("/" + BASE_URI_PATTERN)
+            .contextPath("/" + servletFactory.restconf())
             .supportsSessions(false)
             .addServlet(ServletDetails.builder()
                 .addUrlPattern("/*")
                 .servlet(servletSupport.createHttpServletBuilder(
-                    new RestconfApplication(databindProvider, mountPointService, dataBroker, rpcService, actionService,
-                        notificationService,schemaService, configuration)).build())
+                    new Application() {
+                        @Override
+                        public Set<Object> getSingletons() {
+                            final var errorTagMapping = servletFactory.errorTagMapping();
+
+                            return Set.of(
+                                new JsonJaxRsFormattableBodyWriter(), new XmlJaxRsFormattableBodyWriter(),
+                                new RestconfDocumentedExceptionMapper(databindProvider, errorTagMapping),
+                                new JaxRsRestconf(server, errorTagMapping, servletFactory.prettyPrint()));
+                        }
+                    }).build())
                 .asyncSupported(true)
                 .build())
             .addServlet(ServletDetails.builder()
-                .addUrlPattern("/" + NOTIF + "/*")
-                .servlet(servletSupport.createHttpServletBuilder(
-                    new DataStreamApplication(databindProvider, mountPointService,
-                        new RestconfDataStreamServiceImpl(scheduledThreadPool, configuration))).build())
+                .addUrlPattern("/" + URLConstants.STREAMS_SUBPATH + "/*")
+                .servlet(servletFactory.newStreamServlet())
                 .name("notificationServlet")
                 .asyncSupported(true)
                 .build())
-            .addServlet(ServletDetails.builder()
-                .addUrlPattern("/" + DATA_SUBSCRIPTION + "/*")
-                .addUrlPattern("/" + NOTIFICATION_STREAM + "/*")
-                .servlet(new WebSocketInitializer(scheduledThreadPool, configuration))
-                .build())
 
             // Allows user to add javax.servlet.Filter(s) in front of REST services
             .addFilter(FilterDetails.builder()
@@ -98,7 +92,13 @@ public final class JaxRsNorthbound implements AutoCloseable {
             .supportsSessions(false)
             .addServlet(ServletDetails.builder()
                 .addUrlPattern("/*")
-                .servlet(servletSupport.createHttpServletBuilder(new RootFoundApplication(BASE_URI_PATTERN)).build())
+                .servlet(servletSupport.createHttpServletBuilder(
+                    new Application() {
+                        @Override
+                        public Set<Object> getSingletons() {
+                            return Set.of(new JaxRsWebHostMetadata(servletFactory.restconf()));
+                        }
+                    }).build())
                 .name("Rootfound")
                 .build());
 
@@ -107,6 +107,7 @@ public final class JaxRsNorthbound implements AutoCloseable {
         discoveryReg = webServer.registerWebContext(discoveryBuilder.build());
     }
 
+    @Deactivate
     @Override
     public void close() {
         discoveryReg.close();