You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by re...@apache.org on 2023/11/18 16:34:02 UTC
(cxf) branch 3.6.x-fixes updated: CXF-8943: Adding a listener for Container events is not working on Jetty 9 (#1478)
This is an automated email from the ASF dual-hosted git repository.
reta pushed a commit to branch 3.6.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git
The following commit(s) were added to refs/heads/3.6.x-fixes by this push:
new 06f5c910b6 CXF-8943: Adding a listener for Container events is not working on Jetty 9 (#1478)
06f5c910b6 is described below
commit 06f5c910b61d4ad3428dc48bed95d39585bd0379
Author: Andriy Redko <dr...@gmail.com>
AuthorDate: Sat Nov 18 11:33:57 2023 -0500
CXF-8943: Adding a listener for Container events is not working on Jetty 9 (#1478)
---
parent/pom.xml | 1 -
rt/transports/http-jetty/pom.xml | 147 +++++++++++++++------
.../transport/http_jetty/JettyContextHandler.java | 23 ++++
.../http_jetty/JettyHTTPServerEngine.java | 36 +++--
.../http_jetty/JettyHTTPServerEngineFactory.java | 11 +-
5 files changed, 157 insertions(+), 61 deletions(-)
diff --git a/parent/pom.xml b/parent/pom.xml
index e1b6adb1b0..dec6de00f9 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -152,7 +152,6 @@
<cxf.jettison.version>1.5.4</cxf.jettison.version>
<cxf.jetty.osgi.version>[9.2,11)</cxf.jetty.osgi.version>
<cxf.jetty10.version>10.0.18</cxf.jetty10.version>
- <cxf.jetty9.version>9.4.51.v20230217</cxf.jetty9.version>
<cxf.jetty.version>${cxf.jetty10.version}</cxf.jetty.version>
<cxf.jexl.version>3.3</cxf.jexl.version>
<cxf.joda.time.version>2.10.10</cxf.joda.time.version>
diff --git a/rt/transports/http-jetty/pom.xml b/rt/transports/http-jetty/pom.xml
index 331b607161..a5cba7c256 100644
--- a/rt/transports/http-jetty/pom.xml
+++ b/rt/transports/http-jetty/pom.xml
@@ -98,46 +98,6 @@
<artifactId>spring-context</artifactId>
<optional>true</optional>
</dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-server</artifactId>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-util</artifactId>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-io</artifactId>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-security</artifactId>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-jmx</artifactId>
- <optional>true</optional>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-http</artifactId>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty.http2</groupId>
- <artifactId>http2-server</artifactId>
- <optional>true</optional>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-alpn-server</artifactId>
- <optional>true</optional>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-alpn-java-server</artifactId>
- <optional>true</optional>
- </dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
@@ -177,6 +137,113 @@
<scope>test</scope>
</dependency>
</dependencies>
+ <profiles>
+ <profile>
+ <id>jetty10</id>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+ <dependencies>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-server</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-util</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-io</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-security</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-jmx</artifactId>
+ <optional>true</optional>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-http</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty.http2</groupId>
+ <artifactId>http2-server</artifactId>
+ <optional>true</optional>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-alpn-server</artifactId>
+ <optional>true</optional>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-alpn-java-server</artifactId>
+ <optional>true</optional>
+ </dependency>
+ </dependencies>
+ </profile>
+ <profile>
+ <id>jetty9x</id>
+ <properties>
+ <cxf.jetty9.version>9.4.53.v20231009</cxf.jetty9.version>
+ </properties>
+ <dependencies>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-server</artifactId>
+ <version>${cxf.jetty9.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-util</artifactId>
+ <version>${cxf.jetty9.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-io</artifactId>
+ <version>${cxf.jetty9.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-security</artifactId>
+ <version>${cxf.jetty9.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-jmx</artifactId>
+ <optional>true</optional>
+ <version>${cxf.jetty9.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-http</artifactId>
+ <version>${cxf.jetty9.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty.http2</groupId>
+ <artifactId>http2-server</artifactId>
+ <optional>true</optional>
+ <version>${cxf.jetty9.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-alpn-server</artifactId>
+ <optional>true</optional>
+ <version>${cxf.jetty9.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-alpn-java-server</artifactId>
+ <optional>true</optional>
+ <version>${cxf.jetty9.version}</version>
+ </dependency>
+ </dependencies>
+ </profile>
+ </profiles>
<build>
<plugins>
<plugin>
diff --git a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyContextHandler.java b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyContextHandler.java
index 0ed2e0f4b3..b88a87db07 100644
--- a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyContextHandler.java
+++ b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyContextHandler.java
@@ -25,6 +25,9 @@ import org.eclipse.jetty.server.handler.ContextHandler;
* The Jetty-specific ContextHandler
*/
class JettyContextHandler extends ContextHandler {
+ private String defaultRequestCharacterEncoding;
+ private String defaultResponseCharacterEncoding;
+
JettyContextHandler() {
super(null, null);
_scontext = new JettyContext();
@@ -59,4 +62,24 @@ class JettyContextHandler extends ContextHandler {
setDefaultResponseCharacterEncoding(encoding);
}
}
+
+ @Override
+ public void setDefaultRequestCharacterEncoding(String encoding) {
+ defaultRequestCharacterEncoding = encoding;
+ }
+
+ @Override
+ public String getDefaultRequestCharacterEncoding() {
+ return defaultRequestCharacterEncoding;
+ }
+
+ @Override
+ public void setDefaultResponseCharacterEncoding(String encoding) {
+ defaultResponseCharacterEncoding = encoding;
+ }
+
+ @Override
+ public String getDefaultResponseCharacterEncoding() {
+ return defaultResponseCharacterEncoding;
+ }
}
diff --git a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngine.java b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngine.java
index fec87cb311..917b890616 100644
--- a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngine.java
+++ b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngine.java
@@ -23,11 +23,16 @@ import java.io.Closeable;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.io.Writer;
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.MethodHandles.Lookup;
+import java.lang.invoke.MethodType;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.EventListener;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Level;
@@ -608,20 +613,30 @@ public class JettyHTTPServerEngine implements ServerEngine, HttpServerEngineSupp
try {
Container container = getContainer(server);
- Method[] methods = ReflectionUtil.getDeclaredMethods(container.getClass());
- for (Method m : methods) {
- if ("addEventListener".equals(m.getName())) {
- ReflectionUtil.setAccessible(m).invoke(container, mBeanContainer);
- }
- }
- //container.addEventListener(mBeanContainer);
+ // Attempt to support Jetty 9.x (Apache Karaf) and Jetty 10.x variations:
+ // boolean addEventListener(EventListener listener);
+ // void addEventListener(Container.Listener listener);
+ findAddEventListener(container).invoke(mBeanContainer);
mBeanContainer.beanAdded(null, server);
} catch (RuntimeException rex) {
throw rex;
- } catch (Exception r) {
+ } catch (Throwable r) {
throw new RuntimeException(r);
}
}
+
+ private MethodHandle findAddEventListener(Container container)
+ throws NoSuchMethodException, IllegalAccessException {
+ final Lookup lookup = MethodHandles.publicLookup();
+ try {
+ return lookup.findVirtual(container.getClass(), "addEventListener",
+ MethodType.methodType(boolean.class, EventListener.class)).bindTo(container);
+ } catch (final IllegalAccessException | NoSuchMethodException ex) {
+ return lookup.findVirtual(container.getClass(), "addEventListener",
+ MethodType.methodType(void.class, Container.Listener.class)).bindTo(container);
+ }
+ }
+
private void removeServerMBean() {
try {
mBeanContainer.beanRemoved(null, server);
@@ -1118,8 +1133,9 @@ public class JettyHTTPServerEngine implements ServerEngine, HttpServerEngineSupp
if (mBeanContainer != null) {
removeServerMBean();
}
- //After upgrade Jetty to 10.0.12, server.destroy() will clear all MBeans from container
- //The old version doesn't behavior like this and this
+ // After upgrade Jetty to 10.0.12, server.destroy() will clear all MBeans from container
+ // The old version doesn't behave like this because MBeanContainer was shareable but
+ // is not anymore (the factory should create new a container for each server engine).
server.destroy();
server = null;
}
diff --git a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngineFactory.java b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngineFactory.java
index db5bf20475..dbe2210bd7 100644
--- a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngineFactory.java
+++ b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngineFactory.java
@@ -87,11 +87,6 @@ public class JettyHTTPServerEngineFactory {
*/
private Bus bus;
- /**
- * The Jetty {@link MBeanContainer} to use when enabling JMX in Jetty.
- */
- private Container.Listener mBeanContainer;
-
public JettyHTTPServerEngineFactory() {
// Empty
}
@@ -331,10 +326,7 @@ public class JettyHTTPServerEngineFactory {
}
public synchronized Container.Listener getMBeanContainer() {
- if (this.mBeanContainer != null) {
- return mBeanContainer;
- }
-
+ Container.Listener mBeanContainer = null;
MBeanServer mbs = getMBeanServer();
if (mbs != null) {
try {
@@ -374,7 +366,6 @@ public class JettyHTTPServerEngineFactory {
// clean up the collections
threadingParametersMap.clear();
tlsParametersMap.clear();
- mBeanContainer = null;
}
public void preShutdown() {