fb6f5bc821cb3a62dbf49bb4153095e8d4bdc481
[netconf.git] / restconf / restconf-nb-bierman02 / src / main / java / org / opendaylight / netconf / sal / restconf / web / Bierman02WebRegistrarImpl.java
1 /*
2  * Copyright (c) 2018 Inocybe Technologies 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.netconf.sal.restconf.web;
9
10 import java.util.concurrent.atomic.AtomicBoolean;
11 import javax.servlet.ServletException;
12 import javax.ws.rs.core.Application;
13 import org.opendaylight.aaa.filterchain.configuration.CustomFilterAdapterConfiguration;
14 import org.opendaylight.aaa.filterchain.filters.CustomFilterAdapter;
15 import org.opendaylight.aaa.web.FilterDetails;
16 import org.opendaylight.aaa.web.ServletDetails;
17 import org.opendaylight.aaa.web.WebContext;
18 import org.opendaylight.aaa.web.WebContextBuilder;
19 import org.opendaylight.aaa.web.WebContextRegistration;
20 import org.opendaylight.aaa.web.WebContextSecurer;
21 import org.opendaylight.aaa.web.WebServer;
22 import org.opendaylight.aaa.web.servlet.ServletSupport;
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
25
26 /**
27  * Implementation of Bierman02WebRegistrar.
28  *
29  * @author Thomas Pantelis
30  */
31 public class Bierman02WebRegistrarImpl implements Bierman02WebRegistrar {
32     private static final Logger LOG = LoggerFactory.getLogger(Bierman02WebRegistrarImpl.class);
33
34     private final WebServer webServer;
35     private final WebContextSecurer webContextSecurer;
36     private final ServletSupport servletSupport;
37     private final Application webApp;
38     private final CustomFilterAdapterConfiguration customFilterAdapterConfig;
39     private volatile WebContextRegistration registraton;
40     private final AtomicBoolean registered = new AtomicBoolean(false);
41
42     public Bierman02WebRegistrarImpl(WebServer webServer,  WebContextSecurer webContextSecurer,
43             ServletSupport servletSupport, Application webApp,
44             CustomFilterAdapterConfiguration customFilterAdapterConfig) {
45         this.webServer = webServer;
46         this.webContextSecurer = webContextSecurer;
47         this.servletSupport = servletSupport;
48         this.webApp = webApp;
49         this.customFilterAdapterConfig = customFilterAdapterConfig;
50     }
51
52     public void close() {
53         if (registered.compareAndSet(true, false)) {
54             if (registraton != null) {
55                 registraton.close();
56             }
57         }
58     }
59
60     @Override
61     public void registerWithAuthentication() {
62         register(true);
63     }
64
65     @Override
66     public void registerWithoutAuthentication() {
67         register(false);
68     }
69
70     private void register(boolean authenticate) {
71         if (!registered.compareAndSet(false, true)) {
72             LOG.warn("Web context has already been registered", new Exception("call site"));
73             return;
74         }
75
76         WebContextBuilder webContextBuilder = WebContext.builder().contextPath("restconf").supportsSessions(true)
77                 .addServlet(ServletDetails.builder().servlet(servletSupport.createHttpServletBuilder(webApp).build())
78                     .addUrlPattern("/*").build())
79
80                 // Allows user to add javax.servlet.Filter(s) in front of REST services
81                 .addFilter(FilterDetails.builder().filter(new CustomFilterAdapter(customFilterAdapterConfig))
82                     .addUrlPattern("/*").build())
83
84                 .addFilter(FilterDetails.builder().filter(new org.eclipse.jetty.servlets.GzipFilter())
85                     .putInitParam("mimeTypes",
86                         "application/xml,application/yang.data+xml,xml,application/json,application/yang.data+json")
87                     .addUrlPattern("/*").build());
88
89         if (authenticate) {
90             webContextSecurer.requireAuthentication(webContextBuilder, "/*");
91         }
92
93         try {
94             registraton = webServer.registerWebContext(webContextBuilder.build());
95         } catch (ServletException e) {
96             throw new RuntimeException("Failed to register the web context", e);
97         }
98     }
99 }