Skip to content

Commit de6e02b

Browse files
committed
Remove Jetty specific ServletHolder from the AdditionalServlet interface
1 parent d3527da commit de6e02b

File tree

10 files changed

+114
-33
lines changed

10 files changed

+114
-33
lines changed

pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/plugin/servlet/AdditionalServlet.java

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,19 @@
2020

2121
import com.google.common.annotations.Beta;
2222
import org.apache.pulsar.common.configuration.PulsarConfiguration;
23-
import org.eclipse.jetty.ee8.servlet.ServletHolder;
2423

2524
/**
2625
* The additional servlet interface for support additional servlet.
2726
*/
2827
@Beta
2928
public interface AdditionalServlet extends AutoCloseable {
29+
/**
30+
* The servlet implementation type enum.
31+
* Currently, only {@link AdditionalServletType#JAVAX_SERVLET} is supported.
32+
*/
33+
enum AdditionalServletType {
34+
JAVAX_SERVLET
35+
}
3036

3137
/**
3238
* load plugin config.
@@ -43,11 +49,24 @@ public interface AdditionalServlet extends AutoCloseable {
4349
String getBasePath();
4450

4551
/**
46-
* Get the servlet holder.
52+
* Get the servlet type that this implementation uses.
53+
*/
54+
default AdditionalServletType getServletType() {
55+
return AdditionalServletType.JAVAX_SERVLET;
56+
}
57+
58+
/**
59+
* Retrieves the servlet instance for this additional servlet implementation.
60+
* <p>
61+
* The returned object's type must be compatible with the servlet interface class
62+
* specified by the {@link AdditionalServletType} returned from {@link #getServletType()}.
63+
* For example, if {@link #getServletType()} returns {@link AdditionalServletType#JAVAX_SERVLET},
64+
* the returned object must implement {@code javax.servlet.Servlet}.
65+
* </p>
4766
*
48-
* @return the servlet holder
67+
* @return the servlet instance implementing the appropriate servlet interface
4968
*/
50-
ServletHolder getServletHolder();
69+
Object getServletInstance();
5170

5271
@Override
5372
void close();

pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/plugin/servlet/AdditionalServletWithClassLoader.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import lombok.extern.slf4j.Slf4j;
2525
import org.apache.pulsar.common.configuration.PulsarConfiguration;
2626
import org.apache.pulsar.common.nar.NarClassLoader;
27-
import org.eclipse.jetty.ee8.servlet.ServletHolder;
2827

2928
/**
3029
* An additional servlet with it's classloader.
@@ -60,11 +59,22 @@ public String getBasePath() {
6059
}
6160

6261
@Override
63-
public ServletHolder getServletHolder() {
62+
public AdditionalServletType getServletType() {
6463
ClassLoader prevClassLoader = Thread.currentThread().getContextClassLoader();
6564
try {
6665
Thread.currentThread().setContextClassLoader(classLoader);
67-
return servlet.getServletHolder();
66+
return servlet.getServletType();
67+
} finally {
68+
Thread.currentThread().setContextClassLoader(prevClassLoader);
69+
}
70+
}
71+
72+
@Override
73+
public Object getServletInstance() {
74+
ClassLoader prevClassLoader = Thread.currentThread().getContextClassLoader();
75+
try {
76+
Thread.currentThread().setContextClassLoader(classLoader);
77+
return servlet.getServletInstance();
6878
} finally {
6979
Thread.currentThread().setContextClassLoader(prevClassLoader);
7080
}

pulsar-broker-common/src/test/java/org/apache/pulsar/broker/web/plugin/servlet/MockAdditionalServlet.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
package org.apache.pulsar.broker.web.plugin.servlet;
2020

2121
import org.apache.pulsar.common.configuration.PulsarConfiguration;
22-
import org.eclipse.jetty.ee8.servlet.ServletHolder;
2322

2423
public class MockAdditionalServlet implements AdditionalServlet {
2524

@@ -34,7 +33,7 @@ public String getBasePath() {
3433
}
3534

3635
@Override
37-
public ServletHolder getServletHolder() {
36+
public Object getServletInstance() {
3837
return null;
3938
}
4039

pulsar-broker/src/main/java/org/apache/pulsar/broker/PulsarService.java

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
import java.util.concurrent.locks.ReentrantLock;
6363
import java.util.function.Consumer;
6464
import java.util.function.Supplier;
65+
import javax.servlet.Servlet;
6566
import javax.servlet.ServletException;
6667
import lombok.AccessLevel;
6768
import lombok.Getter;
@@ -1237,9 +1238,37 @@ private void addBrokerAdditionalServlets(WebService webService,
12371238
if (additionalServlet instanceof AdditionalServletWithPulsarService) {
12381239
((AdditionalServletWithPulsarService) additionalServlet).setPulsarService(this);
12391240
}
1240-
webService.addServlet(servletWithClassLoader.getBasePath(), servletWithClassLoader.getServletHolder(),
1241-
config.isAuthenticationEnabled(), attributeMap);
1242-
LOG.info("Broker add additional servlet basePath {} ", servletWithClassLoader.getBasePath());
1241+
switch (servletWithClassLoader.getServletType()) {
1242+
case JAVAX_SERVLET -> {
1243+
Object servletInstance = servletWithClassLoader.getServletInstance();
1244+
if (!(servletInstance instanceof javax.servlet.Servlet)) {
1245+
LOG.error("AdditionalServletWithClassLoader {} has invalid servlet instance type {} which "
1246+
+ "doesn't match {}. Skipping.", servletWithClassLoader,
1247+
servletInstance.getClass().getName(), servletWithClassLoader.getServletType());
1248+
try {
1249+
servletWithClassLoader.close();
1250+
} catch (Exception e) {
1251+
LOG.error("Failed to close servlet {}.", servletWithClassLoader, e);
1252+
}
1253+
continue;
1254+
}
1255+
ServletHolder servletHolder =
1256+
new ServletHolder((Servlet) servletInstance);
1257+
webService.addServlet(servletWithClassLoader.getBasePath(), servletHolder,
1258+
config.isAuthenticationEnabled(), attributeMap);
1259+
LOG.info("Broker add additional servlet basePath {} ", servletWithClassLoader.getBasePath());
1260+
}
1261+
default -> {
1262+
LOG.error("AdditionalServletWithClassLoader {} has unsupported servlet type {}. Skipping.",
1263+
servletWithClassLoader, servletWithClassLoader.getServletType());
1264+
try {
1265+
servletWithClassLoader.close();
1266+
} catch (Exception e) {
1267+
LOG.error("Failed to close servlet {}.", servletWithClassLoader, e);
1268+
}
1269+
continue;
1270+
}
1271+
}
12431272
}
12441273
}
12451274
}

pulsar-broker/src/test/java/org/apache/pulsar/broker/BrokerAdditionalServletTest.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
import org.apache.pulsar.broker.web.plugin.servlet.AdditionalServlets;
3939
import org.apache.pulsar.common.configuration.PulsarConfiguration;
4040
import org.eclipse.jetty.ee8.nested.Request;
41-
import org.eclipse.jetty.ee8.servlet.ServletHolder;
4241
import org.mockito.Mockito;
4342
import org.testng.Assert;
4443
import org.testng.annotations.AfterClass;
@@ -75,7 +74,7 @@ private void mockAdditionalServlet(PulsarService pulsar) {
7574

7675
AdditionalServlet brokerAdditionalServlet = Mockito.mock(AdditionalServlet.class);
7776
Mockito.when(brokerAdditionalServlet.getBasePath()).thenReturn(BASE_PATH);
78-
Mockito.when(brokerAdditionalServlet.getServletHolder()).thenReturn(new ServletHolder(servlet));
77+
Mockito.when(brokerAdditionalServlet.getServletInstance()).thenReturn(servlet);
7978

8079
AdditionalServletWithPulsarService brokerAdditionalServletWithPulsarService =
8180
new AdditionalServletWithPulsarService() {
@@ -96,8 +95,8 @@ public String getBasePath() {
9695
}
9796

9897
@Override
99-
public ServletHolder getServletHolder() {
100-
return new ServletHolder(new WithPulsarServiceServlet(pulsarService));
98+
public Object getServletInstance() {
99+
return new WithPulsarServiceServlet(pulsarService);
101100
}
102101

103102
@Override

pulsar-broker/src/test/java/org/apache/pulsar/broker/web/plugin/servlet/AdditionalServletWithClassLoaderTest.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@
2525
import static org.mockito.Mockito.when;
2626
import static org.testng.Assert.assertEquals;
2727
import static org.testng.Assert.assertNull;
28+
import javax.servlet.Servlet;
2829
import org.apache.pulsar.broker.ServiceConfiguration;
2930
import org.apache.pulsar.common.configuration.PulsarConfiguration;
3031
import org.apache.pulsar.common.nar.NarClassLoader;
31-
import org.eclipse.jetty.ee8.servlet.ServletHolder;
3232
import org.testng.annotations.Test;
3333

3434

@@ -55,10 +55,9 @@ public void testWrapper() {
5555
// test getServlet
5656
assertEquals(wrapper.getServlet(), servlet);
5757
// test getServletHolder
58-
ServletHolder servletHolder = new ServletHolder();
59-
when(servlet.getServletHolder()).thenReturn(servletHolder);
60-
assertEquals(wrapper.getServletHolder(), servletHolder);
61-
verify(servlet, times(1)).getServletHolder();
58+
Servlet servletInstance = mock(Servlet.class);
59+
when(servlet.getServletInstance()).thenReturn(servletInstance);
60+
verify(servlet, times(1)).getServletInstance();
6261
}
6362

6463
@Test
@@ -77,7 +76,7 @@ public String getBasePath() {
7776
}
7877

7978
@Override
80-
public ServletHolder getServletHolder() {
79+
public Object getServletInstance() {
8180
assertEquals(Thread.currentThread().getContextClassLoader(), narLoader);
8281
return null;
8382
}
@@ -101,7 +100,7 @@ public void close() {
101100
additionalServletWithClassLoader.loadConfig(conf);
102101
assertEquals(Thread.currentThread().getContextClassLoader(), curClassLoader);
103102
// test getServletHolder
104-
assertNull(additionalServletWithClassLoader.getServletHolder());
103+
assertNull(additionalServletWithClassLoader.getServletInstance());
105104
assertEquals(Thread.currentThread().getContextClassLoader(), curClassLoader);
106105
// test getServlet
107106
assertEquals(additionalServletWithClassLoader.getServlet(), servlet);

pulsar-broker/src/test/java/org/apache/pulsar/broker/web/plugin/servlet/MockAdditionalServletWithClassLoader.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020

2121
import org.apache.pulsar.broker.PulsarService;
2222
import org.apache.pulsar.common.configuration.PulsarConfiguration;
23-
import org.eclipse.jetty.ee8.servlet.ServletHolder;
2423

2524
public class MockAdditionalServletWithClassLoader implements AdditionalServletWithPulsarService{
2625
@Override
@@ -34,7 +33,7 @@ public String getBasePath() {
3433
}
3534

3635
@Override
37-
public ServletHolder getServletHolder() {
36+
public Object getServletInstance() {
3837
return null;
3938
}
4039

pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/ProxyServiceStarter.java

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import java.util.Objects;
3939
import java.util.concurrent.atomic.AtomicReference;
4040
import java.util.function.Consumer;
41+
import javax.servlet.Servlet;
4142
import lombok.Getter;
4243
import org.apache.logging.log4j.LogManager;
4344
import org.apache.logging.log4j.core.util.datetime.FixedDateFormat;
@@ -403,9 +404,37 @@ public static void addWebServerHandlers(WebServer server,
403404
service.getProxyAdditionalServlets().getServlets().values();
404405
for (AdditionalServletWithClassLoader servletWithClassLoader : additionalServletCollection) {
405406
servletWithClassLoader.loadConfig(config);
406-
server.addServlet(servletWithClassLoader.getBasePath(), servletWithClassLoader.getServletHolder(),
407-
Collections.emptyList(), config.isAuthenticationEnabled());
408-
log.info("proxy add additional servlet basePath {} ", servletWithClassLoader.getBasePath());
407+
switch (servletWithClassLoader.getServletType()) {
408+
case JAVAX_SERVLET -> {
409+
Object servletInstance = servletWithClassLoader.getServletInstance();
410+
if (!(servletInstance instanceof javax.servlet.Servlet)) {
411+
log.error("AdditionalServletWithClassLoader {} has invalid servlet instance type {} which "
412+
+ "doesn't match {}. Skipping.", servletWithClassLoader,
413+
servletInstance.getClass().getName(), servletWithClassLoader.getServletType());
414+
try {
415+
servletWithClassLoader.close();
416+
} catch (Exception e) {
417+
log.error("Failed to close servlet {}.", servletWithClassLoader, e);
418+
}
419+
continue;
420+
}
421+
ServletHolder additionalServletHolder =
422+
new ServletHolder((Servlet) servletInstance);
423+
server.addServlet(servletWithClassLoader.getBasePath(), additionalServletHolder,
424+
Collections.emptyList(), config.isAuthenticationEnabled());
425+
log.info("proxy add additional servlet basePath {} ", servletWithClassLoader.getBasePath());
426+
}
427+
default -> {
428+
log.error("AdditionalServletWithClassLoader {} has unsupported servlet type {}. Skipping.",
429+
servletWithClassLoader, servletWithClassLoader.getServletType());
430+
try {
431+
servletWithClassLoader.close();
432+
} catch (Exception e) {
433+
log.error("Failed to close servlet {}.", servletWithClassLoader, e);
434+
}
435+
continue;
436+
}
437+
}
409438
}
410439
}
411440

pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyAdditionalServletTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@
5050
import org.apache.pulsar.common.util.ObjectMapperFactory;
5151
import org.apache.pulsar.metadata.impl.ZKMetadataStore;
5252
import org.eclipse.jetty.ee8.nested.Request;
53-
import org.eclipse.jetty.ee8.servlet.ServletHolder;
5453
import org.mockito.Mockito;
5554
import org.testng.Assert;
5655
import org.testng.annotations.AfterClass;
@@ -177,7 +176,7 @@ public void destroy() {
177176

178177
AdditionalServlet proxyAdditionalServlet = Mockito.mock(AdditionalServlet.class);
179178
Mockito.when(proxyAdditionalServlet.getBasePath()).thenReturn(BASE_PATH);
180-
Mockito.when(proxyAdditionalServlet.getServletHolder()).thenReturn(new ServletHolder(servlet));
179+
Mockito.when(proxyAdditionalServlet.getServletInstance()).thenReturn(servlet);
181180

182181
AdditionalServlets proxyAdditionalServlets = Mockito.mock(AdditionalServlets.class);
183182
Map<String, AdditionalServletWithClassLoader> map = new HashMap<>();

tests/docker-images/java-test-plugins/src/main/java/org/apache/pulsar/tests/integration/plugins/RandomAdditionalServlet.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import javax.servlet.http.HttpServletResponse;
3131
import org.apache.pulsar.broker.web.plugin.servlet.AdditionalServlet;
3232
import org.apache.pulsar.common.configuration.PulsarConfiguration;
33-
import org.eclipse.jetty.ee8.servlet.ServletHolder;
3433

3534
public class RandomAdditionalServlet extends HttpServlet implements AdditionalServlet {
3635

@@ -49,8 +48,8 @@ public String getBasePath() {
4948
}
5049

5150
@Override
52-
public ServletHolder getServletHolder() {
53-
return new ServletHolder(this);
51+
public Object getServletInstance() {
52+
return this;
5453
}
5554

5655
@Override

0 commit comments

Comments
 (0)