Skip to content

Commit 9e1ebc7

Browse files
committed
WIP convert CommunityRestConf to JaxRsEndpoint
This change also required us to convert LightyServerBuilder to use JettyWebServer since it is used in CommunityRestConf to initialize JaxRsEndpoint. Signed-off-by: tobias.pobocik <[email protected]>
1 parent ede85bc commit 9e1ebc7

File tree

10 files changed

+250
-267
lines changed

10 files changed

+250
-267
lines changed

lighty-modules/lighty-aaa-aggregator/lighty-aaa/src/main/java/io/lighty/aaa/AAALightyShiroProvider.java

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,8 @@
1515
import java.util.Map;
1616
import java.util.concurrent.CompletableFuture;
1717
import org.eclipse.jetty.server.Handler;
18-
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
19-
import org.eclipse.jetty.servlet.FilterHolder;
20-
import org.eclipse.jetty.servlet.ServletContextHandler;
21-
import org.eclipse.jetty.servlet.ServletHolder;
2218
import org.eclipse.jetty.servlets.CrossOriginFilter;
2319
import org.glassfish.jersey.internal.guava.Preconditions;
24-
import org.glassfish.jersey.server.ResourceConfig;
25-
import org.glassfish.jersey.servlet.ServletContainer;
2620
import org.opendaylight.aaa.api.AuthenticationService;
2721
import org.opendaylight.aaa.api.ClaimCache;
2822
import org.opendaylight.aaa.api.CredentialAuth;
@@ -47,6 +41,9 @@
4741
import org.opendaylight.aaa.tokenauthrealm.auth.AuthenticationManager;
4842
import org.opendaylight.aaa.tokenauthrealm.auth.HttpBasicAuth;
4943
import org.opendaylight.aaa.tokenauthrealm.auth.TokenAuthenticators;
44+
import org.opendaylight.aaa.web.FilterDetails;
45+
import org.opendaylight.aaa.web.ServletDetails;
46+
import org.opendaylight.aaa.web.WebContext;
5047
import org.opendaylight.aaa.web.servlet.jersey2.JerseyServletSupport;
5148
import org.opendaylight.mdsal.binding.api.DataBroker;
5249
import org.opendaylight.yang.gen.v1.urn.opendaylight.aaa.app.config.rev170619.DatastoreConfig;
@@ -128,17 +125,6 @@ private AAALightyShiroProvider(final DataBroker dataBroker,
128125
}
129126

130127
private void initAAAonServer(final LightyServerBuilder server) {
131-
final ContextHandlerCollection contexts = new ContextHandlerCollection();
132-
final ServletContextHandler mainHandler = new ServletContextHandler(contexts, "/auth", true, false);
133-
final IdmLightApplication idmLightApplication = new IdmLightApplication(iidmStore, claimCache);
134-
final ServletHolder idmLightServlet = new ServletHolder(new ServletContainer(ResourceConfig.forApplication(
135-
idmLightApplication)));
136-
idmLightServlet.setInitParameter("jersey.config.server.provider.packages",
137-
"org.opendaylight.aaa.impl.provider");
138-
mainHandler.addServlet(idmLightServlet, "/*");
139-
server.addContextHandler(contexts);
140-
this.handlers.add(contexts);
141-
this.handlers.add(mainHandler);
142128
this.aaaWebEnvironment = new AAAWebEnvironment(shiroConfiguration,
143129
dataBroker,
144130
certificateManager,
@@ -151,17 +137,36 @@ private void initAAAonServer(final LightyServerBuilder server) {
151137
final CustomFilterAdapterConfigurationImpl customFilterAdapterConfig =
152138
new CustomFilterAdapterConfigurationImpl();
153139
customFilterAdapterConfig.update(properties);
154-
final FilterHolder customFilterAdapter = new FilterHolder(new CustomFilterAdapter(customFilterAdapterConfig));
155-
server.addCommonFilter(customFilterAdapter, "/*");
156140

157-
final FilterHolder shiroFilter = new FilterHolder(new AAAShiroFilter(aaaWebEnvironment));
158-
server.addCommonFilter(shiroFilter, "/*");
141+
final var webContextBuilder = WebContext.builder()
142+
.name("RealmManagement")
143+
.contextPath("/auth")
144+
.supportsSessions(true)
159145

160-
final FilterHolder crossOriginFilter = new FilterHolder(new CrossOriginFilter());
161-
crossOriginFilter.setInitParameter("allowedMethods", "GET,POST,OPTIONS,DELETE,PUT,HEAD");
162-
crossOriginFilter.setInitParameter("allowedHeaders",
163-
"origin, content-type, accept, authorization, Authorization");
164-
server.addCommonFilter(crossOriginFilter, "/*");
146+
.addServlet(ServletDetails.builder()
147+
.servlet(new JerseyServletSupport().createHttpServletBuilder(
148+
new IdmLightApplication(iidmStore, claimCache)).build())
149+
.addUrlPattern("/*")
150+
.build())
151+
152+
.addFilter(FilterDetails.builder()
153+
.filter(new CustomFilterAdapter(customFilterAdapterConfig))
154+
.addUrlPattern("/*")
155+
.build())
156+
157+
.addFilter(FilterDetails.builder()
158+
.filter(new AAAShiroFilter(aaaWebEnvironment))
159+
.addUrlPattern("/*")
160+
.build())
161+
162+
.addFilter(FilterDetails.builder()
163+
.filter(new CrossOriginFilter())
164+
.addUrlPattern("/*").putInitParam("allowedMethods", "GET,POST,OPTIONS,DELETE,PUT,HEAD").putInitParam(
165+
"allowedHeaders", "origin, content-type, accept, authorization, Authorization")
166+
.build());
167+
168+
169+
server.addContextHandler(webContextBuilder.build());
165170
}
166171

167172
public static CompletableFuture<AAALightyShiroProvider> newInstance(final DataBroker dataBroker,

lighty-modules/lighty-aaa-aggregator/lighty-aaa/src/main/java/io/lighty/aaa/LocalHttpServer.java

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,31 +12,32 @@
1212
import java.util.HashMap;
1313
import java.util.Map;
1414
import javax.servlet.Servlet;
15-
import org.eclipse.jetty.server.Handler;
16-
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
17-
import org.eclipse.jetty.servlet.ServletContextHandler;
18-
import org.eclipse.jetty.servlet.ServletHolder;
15+
import org.opendaylight.aaa.web.ServletDetails;
16+
import org.opendaylight.aaa.web.WebContext;
1917

2018
final class LocalHttpServer {
2119
private final LightyServerBuilder server;
22-
private final Map<String, Handler> handlers;
20+
private final Map<String, WebContext> handlers;
2321

2422
LocalHttpServer(final LightyServerBuilder server) {
2523
this.server = server;
2624
this.handlers = new HashMap<>();
2725
}
2826

2927
@SuppressWarnings("rawtypes")
30-
public void registerServlet(final String alias, final Servlet servlet, final Dictionary initparams) {
31-
final ServletHolder servletHolder = new ServletHolder(servlet);
32-
final ContextHandlerCollection contexts = new ContextHandlerCollection();
33-
final ServletContextHandler mainHandler = new ServletContextHandler(contexts, alias, true, false);
34-
mainHandler.addServlet(servletHolder, "/*");
35-
this.server.addContextHandler(contexts);
36-
this.handlers.put(alias, contexts);
28+
public void registerServlet(final String alias, final Servlet servlet, final Dictionary<String, String> initParam) {
29+
WebContext webContext = WebContext.builder()
30+
.name("name")
31+
.contextPath(alias)
32+
.supportsSessions(true)
33+
.putContextParam("exampleKey", "exampleValue")
34+
.addServlet(ServletDetails.builder().servlet(servlet).addUrlPattern("/*").build())
35+
.build();
36+
37+
this.server.addContextHandler(webContext);
38+
this.handlers.put(alias, webContext);
3739
}
3840

3941
public void unregister(final String alias) {
40-
this.handlers.get(alias).destroy();
4142
}
4243
}

lighty-modules/lighty-aaa-aggregator/lighty-aaa/src/test/java/io/lighty/aaa/LocalHttpServerTest.java

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,23 @@
88
package io.lighty.aaa;
99

1010
import io.lighty.server.LightyServerBuilder;
11+
import java.lang.reflect.Field;
1112
import java.net.InetAddress;
1213
import java.net.InetSocketAddress;
14+
import java.security.AccessController;
15+
import java.security.PrivilegedAction;
1316
import javax.servlet.Servlet;
1417
import org.eclipse.jetty.server.Server;
1518
import org.mockito.Mock;
1619
import org.mockito.MockitoAnnotations;
20+
import org.opendaylight.aaa.web.jetty.JettyWebServer;
1721
import org.testng.Assert;
1822
import org.testng.annotations.BeforeClass;
1923
import org.testng.annotations.Test;
2024

2125
public class LocalHttpServerTest {
2226

23-
private static final String TEST_SERVLET = "TestServlet";
27+
private static final String TEST_SERVLET = "/TestServlet";
2428

2529
@Mock
2630
Servlet servlet;
@@ -34,16 +38,35 @@ public void init() {
3438
public void initLocalHttpServerTest() throws Exception {
3539
InetSocketAddress socketAddress = new InetSocketAddress(InetAddress.getLocalHost(), 8888);
3640
LightyServerBuilder serverBuilder = new LightyServerBuilder(socketAddress);
37-
Server server = serverBuilder.build();
41+
JettyWebServer server = serverBuilder.build();
42+
Server jettyServer = null;
43+
try {
44+
// Use AccessController.doPrivileged to allow access to the private field
45+
Field serverField = AccessController.doPrivileged((PrivilegedAction<Field>) () -> {
46+
try {
47+
Field field = JettyWebServer.class.getDeclaredField("server");
48+
field.setAccessible(true);
49+
return field;
50+
} catch (NoSuchFieldException e) {
51+
throw new RuntimeException("Field not found", e);
52+
}
53+
});
54+
55+
jettyServer = (Server) serverField.get(server);
56+
57+
// Only set the handler if no handler is already set by JaxRsEndpoint
58+
59+
} catch (IllegalAccessException e) {
60+
throw new RuntimeException("Failed to set handler on JettyWebServer", e);
61+
}
3862
LocalHttpServer localHttpServer = new LocalHttpServer(serverBuilder);
3963
localHttpServer.registerServlet(TEST_SERVLET, servlet, null);
40-
localHttpServer.unregister(TEST_SERVLET);
4164

4265
server.start();
43-
Assert.assertTrue(server.isStarted());
44-
Assert.assertTrue(server.isRunning());
66+
Assert.assertTrue(jettyServer.isStarted());
67+
Assert.assertTrue(jettyServer.isRunning());
4568
server.stop();
46-
Assert.assertFalse(server.isStarted());
47-
Assert.assertFalse(server.isRunning());
69+
Assert.assertFalse(jettyServer.isStarted());
70+
Assert.assertFalse(jettyServer.isRunning());
4871
}
4972
}

lighty-modules/lighty-jetty-server/src/main/java/io/lighty/server/Http2LightyServerBuilder.java

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@
88
package io.lighty.server;
99

1010
import io.lighty.server.config.SecurityConfig;
11+
import java.lang.reflect.Field;
1112
import java.net.InetSocketAddress;
13+
import java.security.AccessController;
14+
import java.security.PrivilegedAction;
1215
import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory;
1316
import org.eclipse.jetty.http.HttpScheme;
1417
import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory;
@@ -17,9 +20,9 @@
1720
import org.eclipse.jetty.server.SecureRequestCustomizer;
1821
import org.eclipse.jetty.server.Server;
1922
import org.eclipse.jetty.server.ServerConnector;
23+
import org.opendaylight.aaa.web.jetty.JettyWebServer;
2024

2125
public class Http2LightyServerBuilder extends LightyServerBuilder {
22-
2326
private final SecurityConfig securityConfig;
2427

2528
public Http2LightyServerBuilder(final InetSocketAddress inetSocketAddress, final SecurityConfig config) {
@@ -28,9 +31,30 @@ public Http2LightyServerBuilder(final InetSocketAddress inetSocketAddress, final
2831
}
2932

3033
@Override
31-
public Server build() {
32-
super.server = new Server();
33-
final var server = super.build();
34+
public JettyWebServer build() {
35+
if (super.server == null) {
36+
super.server = new JettyWebServer(this.inetSocketAddress.getPort());
37+
}
38+
super.build();
39+
40+
Server jettyServer;
41+
try {
42+
// Use AccessController.doPrivileged to allow access to the private field
43+
Field serverField = AccessController.doPrivileged((PrivilegedAction<Field>) () -> {
44+
try {
45+
Field field = JettyWebServer.class.getDeclaredField("server");
46+
field.setAccessible(true);
47+
return field;
48+
} catch (NoSuchFieldException e) {
49+
throw new RuntimeException("Field not found", e);
50+
}
51+
});
52+
53+
jettyServer = (Server) serverField.get(server);
54+
} catch (IllegalAccessException e) {
55+
throw new RuntimeException("Failed to set handler on JettyWebServer", e);
56+
}
57+
3458
// HTTPS Configuration
3559
final var httpsConfig = new HttpConfiguration();
3660
httpsConfig.setSecureScheme(HttpScheme.HTTPS.asString());
@@ -48,9 +72,11 @@ public Server build() {
4872
final var ssl = securityConfig.getSslConnectionFactory(alpn.getProtocol());
4973

5074
// HTTP/2 Connector
51-
final var sslConnector = new ServerConnector(server, ssl, alpn, h2, new HttpConnectionFactory(httpsConfig));
75+
final var sslConnector = new ServerConnector(
76+
jettyServer, ssl, alpn, h2, new HttpConnectionFactory(httpsConfig));
5277
sslConnector.setPort(this.inetSocketAddress.getPort());
53-
server.addConnector(sslConnector);
54-
return server;
78+
jettyServer.addConnector(sslConnector);
79+
80+
return super.server;
5581
}
56-
}
82+
}

lighty-modules/lighty-jetty-server/src/main/java/io/lighty/server/HttpsLightyServerBuilder.java

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,57 @@
88
package io.lighty.server;
99

1010
import io.lighty.server.config.SecurityConfig;
11+
import java.lang.reflect.Field;
1112
import java.net.InetSocketAddress;
13+
import java.security.AccessController;
14+
import java.security.PrivilegedAction;
1215
import org.eclipse.jetty.http.HttpVersion;
1316
import org.eclipse.jetty.server.HttpConfiguration;
1417
import org.eclipse.jetty.server.HttpConnectionFactory;
1518
import org.eclipse.jetty.server.SecureRequestCustomizer;
1619
import org.eclipse.jetty.server.Server;
1720
import org.eclipse.jetty.server.ServerConnector;
1821
import org.eclipse.jetty.server.SslConnectionFactory;
22+
import org.opendaylight.aaa.web.jetty.JettyWebServer;
1923

2024
public class HttpsLightyServerBuilder extends LightyServerBuilder {
2125
private final SecurityConfig securityConfig;
2226

2327
public HttpsLightyServerBuilder(final InetSocketAddress inetSocketAddress, final SecurityConfig securityConfig) {
2428
super(inetSocketAddress);
25-
this.server = new Server();
2629
this.securityConfig = securityConfig;
2730
}
2831

2932
@Override
30-
public Server build() {
31-
final Server server = super.build();
33+
public JettyWebServer build() {
34+
if (super.server == null) {
35+
super.server = new JettyWebServer(this.inetSocketAddress.getPort());
36+
}
3237
final SslConnectionFactory ssl = securityConfig.getSslConnectionFactory(HttpVersion.HTTP_1_1.asString());
33-
final ServerConnector sslConnector = new ServerConnector(server,
38+
39+
Server jettyServer;
40+
try {
41+
// Use AccessController.doPrivileged to allow access to the private field
42+
Field serverField = AccessController.doPrivileged((PrivilegedAction<Field>) () -> {
43+
try {
44+
Field field = JettyWebServer.class.getDeclaredField("server");
45+
field.setAccessible(true);
46+
return field;
47+
} catch (NoSuchFieldException e) {
48+
throw new RuntimeException("Field not found", e);
49+
}
50+
});
51+
52+
jettyServer = (Server) serverField.get(server);
53+
} catch (IllegalAccessException e) {
54+
throw new RuntimeException("Failed to set handler on JettyWebServer", e);
55+
}
56+
57+
final ServerConnector sslConnector = new ServerConnector(jettyServer,
3458
ssl, httpConfiguration(this.inetSocketAddress));
3559
sslConnector.setPort(this.inetSocketAddress.getPort());
3660

37-
server.addConnector(sslConnector);
61+
jettyServer.addConnector(sslConnector);
3862
return server;
3963
}
4064

0 commit comments

Comments
 (0)