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() {