Skip to content

Commit aa22659

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 aa22659

File tree

8 files changed

+185
-156
lines changed

8 files changed

+185
-156
lines changed

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

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,16 @@
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;
@@ -34,16 +38,36 @@ 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);
4064
localHttpServer.unregister(TEST_SERVLET);
4165

4266
server.start();
43-
Assert.assertTrue(server.isStarted());
44-
Assert.assertTrue(server.isRunning());
67+
Assert.assertTrue(jettyServer.isStarted());
68+
Assert.assertTrue(jettyServer.isRunning());
4569
server.stop();
46-
Assert.assertFalse(server.isStarted());
47-
Assert.assertFalse(server.isRunning());
70+
Assert.assertFalse(jettyServer.isStarted());
71+
Assert.assertFalse(jettyServer.isRunning());
4872
}
4973
}

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

Lines changed: 28 additions & 5 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,6 +20,7 @@
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 {
2226

@@ -28,9 +32,10 @@ public Http2LightyServerBuilder(final InetSocketAddress inetSocketAddress, final
2832
}
2933

3034
@Override
31-
public Server build() {
32-
super.server = new Server();
35+
public JettyWebServer build() {
36+
super.server = new JettyWebServer(this.inetSocketAddress.getPort());
3337
final var server = super.build();
38+
3439
// HTTPS Configuration
3540
final var httpsConfig = new HttpConfiguration();
3641
httpsConfig.setSecureScheme(HttpScheme.HTTPS.asString());
@@ -48,9 +53,27 @@ public Server build() {
4853
final var ssl = securityConfig.getSslConnectionFactory(alpn.getProtocol());
4954

5055
// HTTP/2 Connector
51-
final var sslConnector = new ServerConnector(server, ssl, alpn, h2, new HttpConnectionFactory(httpsConfig));
52-
sslConnector.setPort(this.inetSocketAddress.getPort());
53-
server.addConnector(sslConnector);
56+
try {
57+
// Use AccessController.doPrivileged to allow access to the private field
58+
Field serverField = AccessController.doPrivileged((PrivilegedAction<Field>) () -> {
59+
try {
60+
Field field = JettyWebServer.class.getDeclaredField("server");
61+
field.setAccessible(true);
62+
return field;
63+
} catch (NoSuchFieldException e) {
64+
throw new RuntimeException("Field not found", e);
65+
}
66+
});
67+
68+
Server jettyServer = (Server) serverField.get(server);
69+
final var sslConnector = new ServerConnector(
70+
jettyServer, ssl, alpn, h2, new HttpConnectionFactory(httpsConfig));
71+
sslConnector.setPort(this.inetSocketAddress.getPort());
72+
jettyServer.addConnector(sslConnector);
73+
} catch (IllegalAccessException e) {
74+
throw new RuntimeException("Failed to set handler on JettyWebServer", e);
75+
}
76+
5477
return server;
5578
}
5679
}

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

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,56 @@
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+
super.server = new JettyWebServer(this.inetSocketAddress.getPort());
35+
final JettyWebServer server = super.build();
36+
37+
// HTTPS Configuration
3238
final SslConnectionFactory ssl = securityConfig.getSslConnectionFactory(HttpVersion.HTTP_1_1.asString());
33-
final ServerConnector sslConnector = new ServerConnector(server,
34-
ssl, httpConfiguration(this.inetSocketAddress));
35-
sslConnector.setPort(this.inetSocketAddress.getPort());
39+
final ServerConnector sslConnector;
40+
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+
Server jettyServer = (Server) serverField.get(server);
54+
sslConnector = new ServerConnector(jettyServer, ssl, httpConfiguration(this.inetSocketAddress));
55+
sslConnector.setPort(this.inetSocketAddress.getPort());
56+
jettyServer.addConnector(sslConnector);
57+
} catch (IllegalAccessException e) {
58+
throw new RuntimeException("Failed to set handler on JettyWebServer", e);
59+
}
3660

37-
server.addConnector(sslConnector);
3861
return server;
3962
}
4063

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

Lines changed: 73 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77
*/
88
package io.lighty.server;
99

10+
import java.lang.reflect.Field;
1011
import java.net.InetSocketAddress;
12+
import java.security.AccessController;
13+
import java.security.PrivilegedAction;
1114
import java.util.ArrayList;
1215
import java.util.EnumSet;
1316
import java.util.EventListener;
@@ -18,8 +21,10 @@
1821
import org.eclipse.jetty.server.Handler;
1922
import org.eclipse.jetty.server.Server;
2023
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
24+
import org.eclipse.jetty.server.handler.HandlerCollection;
2125
import org.eclipse.jetty.servlet.FilterHolder;
2226
import org.eclipse.jetty.servlet.ServletContextHandler;
27+
import org.opendaylight.aaa.web.jetty.JettyWebServer;
2328

2429
/**
2530
* Allows user to build jetty server.
@@ -31,13 +36,8 @@ public class LightyServerBuilder {
3136

3237
protected final InetSocketAddress inetSocketAddress;
3338
protected final List<Handler> contexts;
34-
protected Server server;
39+
protected JettyWebServer server;
3540

36-
/**
37-
* Init new jetty server on specific port and address wrapped into {@link InetSocketAddress}.
38-
*
39-
* @param inetSocketAddress - port and address of server
40-
*/
4141
public LightyServerBuilder(final InetSocketAddress inetSocketAddress) {
4242
this.inetSocketAddress = inetSocketAddress;
4343
this.filters = new HashMap<>();
@@ -46,80 +46,106 @@ public LightyServerBuilder(final InetSocketAddress inetSocketAddress) {
4646
this.contexts = new ArrayList<>();
4747
}
4848

49-
/**
50-
* Init jetty server with existing ones.
51-
*
52-
* @param server - jetty server
53-
*/
54-
public LightyServerBuilder(final Server server) {
49+
public LightyServerBuilder(final JettyWebServer server) {
5550
this(new InetSocketAddress(0));
5651
this.server = server;
5752
}
5853

59-
/**
60-
* Add filter for handlers.
61-
*
62-
* @param filterHolder - filter holder
63-
* @param path - path
64-
* @return instance of {@link LightyServerBuilder}
65-
*/
6654
public LightyServerBuilder addCommonFilter(final FilterHolder filterHolder, final String path) {
6755
this.filters.put(filterHolder, path);
6856
return this;
6957
}
7058

71-
/**
72-
* Add listener for handlers.
73-
*
74-
* @param eventListener - event listener
75-
* @return instance of {@link LightyServerBuilder}
76-
*/
7759
public LightyServerBuilder addCommonEventListener(final EventListener eventListener) {
7860
this.listeners.add(eventListener);
7961
return this;
8062
}
8163

82-
/**
83-
* Add init parameters for handlers.
84-
*
85-
* @param key - key of init parameters
86-
* @param value - value of init parameters
87-
* @return instance of {@link LightyServerBuilder}
88-
*/
8964
public LightyServerBuilder addCommonInitParameter(final String key, final String value) {
9065
this.parameters.put(key, value);
9166
return this;
9267
}
9368

94-
/**
95-
* Add specific handler for server to handle incoming HTTP requests.
96-
*
97-
* @param handler - specific handler
98-
* @return instance of {@link LightyServerBuilder}
99-
*/
10069
public LightyServerBuilder addContextHandler(final Handler handler) {
10170
this.contexts.add(handler);
10271
return this;
10372
}
10473

105-
/**
106-
* Build jetty server with specific settings (filters, init params, event listeners, handlers).
107-
*
108-
* @return instance of jetty server
109-
*/
110-
public Server build() {
74+
public JettyWebServer build() {
11175
if (this.server == null) {
112-
this.server = new Server(this.inetSocketAddress);
76+
this.server = new JettyWebServer(this.inetSocketAddress.getPort());
11377
}
78+
11479
final ContextHandlerCollection contextHandlerCollection = new ContextHandlerCollection();
115-
this.contexts.forEach((contextHandler) -> {
80+
this.contexts.forEach(contextHandler -> {
11681
addFilters(contextHandler);
11782
contextHandlerCollection.addHandler(contextHandler);
11883
});
119-
this.server.setHandler(contextHandlerCollection);
84+
85+
try {
86+
Field serverField = AccessController.doPrivileged((PrivilegedAction<Field>) () -> {
87+
try {
88+
Field field = JettyWebServer.class.getDeclaredField("server");
89+
field.setAccessible(true);
90+
return field;
91+
} catch (NoSuchFieldException e) {
92+
throw new RuntimeException("Field not found", e);
93+
}
94+
});
95+
96+
Server jettyServer = (Server) serverField.get(this.server);
97+
Handler currentHandler = jettyServer.getHandler();
98+
99+
if (currentHandler == null) {
100+
jettyServer.setHandler(contextHandlerCollection);
101+
} else if (currentHandler instanceof HandlerCollection) {
102+
HandlerCollection handlerCollection = (HandlerCollection) currentHandler;
103+
handlerCollection.addHandler(contextHandlerCollection);
104+
} else {
105+
HandlerCollection handlerCollection = new HandlerCollection();
106+
handlerCollection.addHandler(currentHandler);
107+
handlerCollection.addHandler(contextHandlerCollection);
108+
jettyServer.setHandler(handlerCollection);
109+
}
110+
111+
} catch (IllegalAccessException e) {
112+
throw new RuntimeException("Failed to set handler on JettyWebServer", e);
113+
}
114+
120115
return this.server;
121116
}
122117

118+
@SuppressWarnings("IllegalCatch")
119+
public void addHandlerAtRuntime(ContextHandlerCollection newHandler) {
120+
try {
121+
Field serverField = AccessController.doPrivileged((PrivilegedAction<Field>) () -> {
122+
try {
123+
Field field = JettyWebServer.class.getDeclaredField("server");
124+
field.setAccessible(true);
125+
return field;
126+
} catch (NoSuchFieldException e) {
127+
throw new RuntimeException("Field not found", e);
128+
}
129+
});
130+
131+
Server jettyServer = (Server) serverField.get(this.server);
132+
Handler currentHandler = jettyServer.getHandler();
133+
134+
if (currentHandler instanceof HandlerCollection) {
135+
HandlerCollection handlerCollection = (HandlerCollection) currentHandler;
136+
handlerCollection.addHandler(newHandler);
137+
newHandler.start();
138+
} else {
139+
throw new IllegalStateException("Current handler is not a HandlerCollection");
140+
}
141+
142+
} catch (RuntimeException e) {
143+
throw new RuntimeException("Failed to add handler at runtime", e);
144+
} catch (Exception e) {
145+
throw new RuntimeException(e);
146+
}
147+
}
148+
123149
void addFilters(final Handler contextHandler) {
124150
if (contextHandler instanceof ContextHandlerCollection) {
125151
final ContextHandlerCollection sch = (ContextHandlerCollection) contextHandler;

lighty-modules/lighty-jetty-server/src/test/java/io/lighty/server/LightyServerBuilderTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
import io.lighty.server.util.LightyServerConfigUtils;
1313
import java.net.InetSocketAddress;
1414
import java.util.EventListener;
15-
import org.eclipse.jetty.server.Server;
1615
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
1716
import org.eclipse.jetty.servlet.FilterHolder;
17+
import org.opendaylight.aaa.web.jetty.JettyWebServer;
1818
import org.testng.annotations.Test;
1919

2020
public class LightyServerBuilderTest {
@@ -68,7 +68,7 @@ public void testHttpsCustomServerBuilder() throws Exception {
6868
assertNotNull(server);
6969
}
7070

71-
private static Server initLightyServer(final LightyServerBuilder serverBuilder) {
71+
private static JettyWebServer initLightyServer(final LightyServerBuilder serverBuilder) {
7272
final var filterHolder = new FilterHolder();
7373
final var contexts = new ContextHandlerCollection();
7474
serverBuilder.addCommonEventListener(new EventListener(){});

lighty-modules/lighty-openapi/src/main/java/io/lighty/openapi/OpenApiLighty.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public Set<Object> getSingletons() {
7777
addStaticResources(mainHandler, "/explorer", "static-content");
7878

7979
LOG.info("adding context handler ...");
80-
jettyServerBuilder.addContextHandler(contexts);
80+
jettyServerBuilder.addHandlerAtRuntime(contexts);
8181
return true;
8282
}
8383

0 commit comments

Comments
 (0)