From 68c5fa552f503bb841167e6032972d9243c4b7eb Mon Sep 17 00:00:00 2001 From: Lari Hotari Date: Sun, 31 May 2026 01:52:40 +0300 Subject: [PATCH 01/10] [improve][misc] PIP-472: Migrate from javax.* to jakarta.* APIs Implements PIP-472. Completes the javax.* -> jakarta.* namespace migration so Pulsar 5.0 LTS ships on clean Jakarta APIs. Dependencies (gradle/libs.versions.toml): - Jersey 2.42 -> 3.1.10; jakarta.ws.rs-api 2.1.6 -> 3.1.0; jakarta.annotation-api -> 2.1.1; jakarta.xml.bind-api -> 4.0.2; jakarta.validation-api -> 3.0.2; jakarta.activation-api -> 2.1.3 (impl -> org.eclipse.angus:angus-activation). - Added jetty-ee10-* alongside the retained jetty-ee8-*; added jakarta.servlet:jakarta.servlet-api:6.0.0 alongside the retained javax.servlet. - jackson-jaxrs-json-provider -> jackson-jakarta-rs-json-provider; Prometheus simpleclient_servlet -> simpleclient_servlet_jakarta. Source: - javax.ws.rs.* -> jakarta.ws.rs.* (Jersey 3 REST tier). - javax.servlet.* -> jakarta.servlet.* for Pulsar's own code; broker/proxy/websocket Jetty wiring moved ee8 -> ee10 (removed .get() core-Handler bridges; ee8.nested Request connector lookup -> ServletContextRequest). - WebSocket endpoints migrated to Jetty 12's native WebSocket API (org.eclipse.jetty.websocket.api.Session.Listener / Callback). AdditionalServlet plugin SPI (backward compatible): - Added AdditionalServletType.JAKARTA_SERVLET; broker/proxy route JAKARTA_SERVLET handlers to Jetty ee10 and keep routing legacy JAVAX_SERVLET handlers to the retained ee8 environment, so existing javax.servlet plugins keep working. Shading: client-shade-conventions and localrun-shaded relocations javax.* -> jakarta.*; renamed shaded META-INF/services javax.ws.rs.* files to jakarta.ws.rs.*. Swagger 1.x -> Swagger Core 2.x is deferred to a follow-up (decoupled, compile-/doc-only). See pip/pip-472-notes.md for discovered state, decisions and deviations. Assisted-by: Claude Code (Opus 4.8) --- ...pulsar.client-shade-conventions.gradle.kts | 17 +- gradle/libs.versions.toml | 33 ++-- pip/pip-472-notes.md | 151 ++++++++++++++++++ pip/pip-472.md | 8 + pulsar-broker-auth-sasl/build.gradle.kts | 2 +- .../AuthenticationProviderSasl.java | 4 +- .../authentication/SaslAuthenticateTest.java | 4 +- pulsar-broker-common/build.gradle.kts | 4 +- .../AuthenticationDataHttp.java | 2 +- .../AuthenticationDataHttps.java | 4 +- .../AuthenticationProvider.java | 4 +- .../AuthenticationProviderList.java | 4 +- .../AuthenticationProviderToken.java | 6 +- .../authentication/AuthenticationService.java | 4 +- .../OneStageAuthenticationState.java | 2 +- .../authorization/AuthorizationService.java | 2 +- .../MultiRolesTokenAuthorizationProvider.java | 2 +- .../PulsarAuthorizationProvider.java | 2 +- .../prometheus/PrometheusMetricsServlet.java | 14 +- .../broker/web/AuthenticationFilter.java | 16 +- .../web/DisableDebugHttpMethodFilter.java | 16 +- .../pulsar/broker/web/JsonMapperProvider.java | 4 +- .../pulsar/broker/web/RateLimitingFilter.java | 14 +- .../UnrecognizedPropertyExceptionMapper.java | 6 +- .../web/plugin/servlet/AdditionalServlet.java | 13 +- .../common/configuration/VipStatus.java | 12 +- .../AuthenticationDataSubscriptionTest.java | 2 +- .../AuthenticationProviderListTest.java | 2 +- .../AuthenticationProviderTokenTest.java | 2 +- .../OneStageAuthenticationStateTest.java | 2 +- .../broker/web/AuthenticationFilterTest.java | 6 +- .../common/configuration/VipStatusTest.java | 6 +- pulsar-broker/build.gradle.kts | 13 +- .../apache/pulsar/broker/PulsarService.java | 41 ++++- .../pulsar/broker/admin/AdminResource.java | 10 +- .../broker/admin/impl/BrokerStatsBase.java | 12 +- .../pulsar/broker/admin/impl/BrokersBase.java | 22 +-- .../broker/admin/impl/ClustersBase.java | 28 ++-- .../broker/admin/impl/FunctionsBase.java | 22 +-- .../admin/impl/MetadataMigrationBase.java | 10 +- .../broker/admin/impl/NamespacesBase.java | 12 +- .../broker/admin/impl/PackagesBase.java | 8 +- .../admin/impl/PersistentTopicsBase.java | 12 +- .../broker/admin/impl/ResourceGroupsBase.java | 2 +- .../admin/impl/SchemasResourceBase.java | 2 +- .../pulsar/broker/admin/impl/SinksBase.java | 18 +-- .../pulsar/broker/admin/impl/SourcesBase.java | 18 +-- .../pulsar/broker/admin/impl/TenantsBase.java | 24 +-- .../broker/admin/impl/TransactionsBase.java | 12 +- .../pulsar/broker/admin/v2/Bookies.java | 24 +-- .../pulsar/broker/admin/v2/BrokerStats.java | 12 +- .../pulsar/broker/admin/v2/Brokers.java | 6 +- .../pulsar/broker/admin/v2/Clusters.java | 6 +- .../admin/v2/ExtNonPersistentTopics.java | 22 +-- .../broker/admin/v2/ExtPersistentTopics.java | 22 +-- .../pulsar/broker/admin/v2/Functions.java | 22 +-- .../broker/admin/v2/MetadataMigration.java | 6 +- .../pulsar/broker/admin/v2/Namespaces.java | 32 ++-- .../broker/admin/v2/NonPersistentTopics.java | 32 ++-- .../broker/admin/v2/PersistentTopics.java | 30 ++-- .../broker/admin/v2/ResourceGroups.java | 16 +- .../broker/admin/v2/ResourceQuotas.java | 22 +-- .../broker/admin/v2/ScalableTopics.java | 32 ++-- .../broker/admin/v2/SchemasResource.java | 28 ++-- .../pulsar/broker/admin/v2/Segments.java | 28 ++-- .../pulsar/broker/admin/v2/Tenants.java | 8 +- .../apache/pulsar/broker/admin/v2/Worker.java | 12 +- .../pulsar/broker/admin/v2/WorkerStats.java | 8 +- .../pulsar/broker/admin/v3/Functions.java | 8 +- .../pulsar/broker/admin/v3/Packages.java | 26 +-- .../apache/pulsar/broker/admin/v3/Sink.java | 8 +- .../apache/pulsar/broker/admin/v3/Sinks.java | 8 +- .../apache/pulsar/broker/admin/v3/Source.java | 8 +- .../pulsar/broker/admin/v3/Sources.java | 8 +- .../pulsar/broker/admin/v3/Transactions.java | 32 ++-- .../broker/intercept/BrokerInterceptor.java | 8 +- .../BrokerInterceptorWithClassLoader.java | 8 +- .../broker/intercept/BrokerInterceptors.java | 6 +- .../pulsar/broker/lookup/LookupResult.java | 6 +- .../pulsar/broker/lookup/TopicLookupBase.java | 6 +- .../pulsar/broker/lookup/v2/TopicLookup.java | 22 +-- .../org/apache/pulsar/broker/rest/Topics.java | 22 +-- .../apache/pulsar/broker/rest/TopicsBase.java | 6 +- .../pulsar/broker/service/ServerCnx.java | 8 +- .../PulsarPrometheusMetricsServlet.java | 14 +- .../pulsar/broker/web/ExceptionHandler.java | 6 +- .../broker/web/MaxRequestSizeFilter.java | 16 +- .../pulsar/broker/web/PreInterceptFilter.java | 16 +- .../broker/web/ProcessHandlerFilter.java | 14 +- .../pulsar/broker/web/PulsarWebResource.java | 18 +-- .../pulsar/broker/web/RequestWrapper.java | 8 +- .../broker/web/ResponseHandlerFilter.java | 24 +-- .../pulsar/broker/web/RestException.java | 8 +- .../apache/pulsar/broker/web/WebService.java | 62 ++++--- .../broker/BrokerAdditionalServletTest.java | 26 +-- .../pulsar/broker/admin/AdminApi2Test.java | 4 +- .../AdminApiDynamicConfigurationsTest.java | 2 +- .../admin/AdminApiGetLastMessageIdTest.java | 6 +- .../broker/admin/AdminApiOffloadTest.java | 6 +- .../admin/AdminApiSubscriptionTest.java | 2 +- .../pulsar/broker/admin/AdminApiTest.java | 6 +- .../broker/admin/AdminApiTlsAuthTest.java | 12 +- .../broker/admin/AdminResourceTest.java | 2 +- .../pulsar/broker/admin/AdminRestTest.java | 12 +- .../apache/pulsar/broker/admin/AdminTest.java | 12 +- .../broker/admin/CreateSubscriptionTest.java | 4 +- .../pulsar/broker/admin/NamespacesTest.java | 18 +-- .../pulsar/broker/admin/NamespacesV2Test.java | 6 +- .../broker/admin/PersistentTopicsTest.java | 12 +- .../broker/admin/ResourceGroupsTest.java | 2 +- .../broker/admin/TopicPoliciesTest.java | 8 +- .../pulsar/broker/admin/TopicsAuthTest.java | 14 +- .../pulsar/broker/admin/TopicsTest.java | 8 +- .../broker/admin/TopicsWithoutTlsTest.java | 6 +- .../broker/admin/v3/AsyncResponseTest.java | 12 +- .../auth/AuthenticationServiceTest.java | 4 +- .../auth/MockedPulsarServiceBaseTest.java | 4 +- .../broker/cache/PulsarLookupProxy.java | 10 +- .../intercept/BrokerInterceptorTest.java | 2 +- .../BrokerInterceptorWithClassLoaderTest.java | 6 +- .../intercept/CounterBrokerInterceptor.java | 10 +- .../ExceptionsBrokerInterceptor.java | 6 +- .../intercept/InterceptFilterOutTest.java | 12 +- .../intercept/MockBrokerInterceptor.java | 6 +- .../broker/lookup/LookupResultTest.java | 4 +- .../lookup/http/HttpTopicLookupv2Test.java | 8 +- .../lookup/http/v2/TopicLookupTest.java | 2 +- .../service/BrokerEntryMetadataE2ETest.java | 4 +- .../service/PersistentMessageFinderTest.java | 4 +- .../stats/MetricsAuthenticationTest.java | 8 +- .../TransactionBatchWriterMetricsTest.java | 10 +- .../broker/web/ExceptionHandlerTest.java | 2 +- .../broker/web/MaxRequestSizeFilterTest.java | 12 +- .../broker/web/ProcessHandlerFilterTest.java | 10 +- .../broker/web/PulsarWebResourceTest.java | 8 +- .../pulsar/broker/web/RestExceptionTest.java | 4 +- .../AdditionalServletWithClassLoaderTest.java | 2 +- .../AuthenticatedProducerConsumerTest.java | 2 +- .../impl/AdminApiKeyStoreTlsAuthTest.java | 10 +- .../client/PulsarBrokerStatsClientTest.java | 4 +- .../proxy/ProxyAuthenticationTest.java | 12 +- .../proxy/ProxyPublishConsumeTest.java | 14 +- ....shade.jakarta.ws.rs.client.ClientBuilder} | 0 ...r.shade.jakarta.ws.rs.ext.RuntimeDelegate} | 0 pulsar-client-admin/build.gradle.kts | 4 +- .../client/admin/internal/BaseResource.java | 22 +-- .../client/admin/internal/BookiesImpl.java | 6 +- .../admin/internal/BrokerStatsImpl.java | 2 +- .../client/admin/internal/BrokersImpl.java | 8 +- .../client/admin/internal/ClustersImpl.java | 6 +- .../admin/internal/ComponentResource.java | 2 +- .../client/admin/internal/FunctionsImpl.java | 12 +- .../admin/internal/JacksonConfigurator.java | 4 +- .../client/admin/internal/LookupImpl.java | 2 +- .../admin/internal/MetadataMigrationImpl.java | 2 +- .../client/admin/internal/NamespacesImpl.java | 8 +- .../internal/NonPersistentTopicsImpl.java | 6 +- .../client/admin/internal/PackagesImpl.java | 8 +- .../client/admin/internal/ProxyStatsImpl.java | 2 +- .../admin/internal/PulsarAdminImpl.java | 6 +- .../admin/internal/ResourceGroupsImpl.java | 6 +- .../admin/internal/ResourceQuotasImpl.java | 6 +- .../admin/internal/ScalableTopicsImpl.java | 8 +- .../client/admin/internal/SchemasImpl.java | 6 +- .../client/admin/internal/SinksImpl.java | 10 +- .../client/admin/internal/SourcesImpl.java | 10 +- .../client/admin/internal/TenantsImpl.java | 6 +- .../admin/internal/TopicPoliciesImpl.java | 8 +- .../client/admin/internal/TopicsImpl.java | 16 +- .../admin/internal/TransactionsImpl.java | 6 +- .../client/admin/internal/WebTargets.java | 2 +- .../client/admin/internal/WorkerImpl.java | 8 +- .../internal/http/AsyncHttpConnector.java | 10 +- .../http/AsyncHttpConnectorProvider.java | 4 +- .../client/admin/internal/SinksImplTest.java | 2 +- ....shade.jakarta.ws.rs.client.ClientBuilder} | 0 ...r.shade.jakarta.ws.rs.ext.RuntimeDelegate} | 0 .../client/impl/auth/AuthenticationSasl.java | 14 +- .../common/policies/data/PoliciesUtil.java | 2 +- .../pulsar/common/util/RestException.java | 8 +- .../ConcurrentBitSetRecyclable.java | 3 +- .../localrun-shaded/build.gradle.kts | 14 +- .../functions/proto/FunctionDetailsTest.java | 1 - pulsar-functions/worker/build.gradle.kts | 4 +- .../worker/FunctionRuntimeManager.java | 10 +- .../functions/worker/PulsarWorkerService.java | 2 +- .../worker/rest/ConfigurationResource.java | 10 +- .../worker/rest/FunctionApiResource.java | 8 +- .../functions/worker/rest/RestUtils.java | 2 +- .../worker/rest/WorkerReadinessResource.java | 14 +- .../functions/worker/rest/WorkerServer.java | 16 +- .../worker/rest/api/ComponentImpl.java | 10 +- .../worker/rest/api/FunctionsImpl.java | 6 +- .../worker/rest/api/FunctionsImplV2.java | 2 +- .../rest/api/FunctionsMetricsResource.java | 12 +- .../functions/worker/rest/api/SinksImpl.java | 4 +- .../worker/rest/api/SourcesImpl.java | 4 +- .../functions/worker/rest/api/WorkerImpl.java | 8 +- .../rest/api/v2/FunctionsApiV2Resource.java | 20 +-- .../rest/api/v2/WorkerApiV2Resource.java | 22 +-- .../rest/api/v2/WorkerStatsApiV2Resource.java | 16 +- .../rest/api/v3/FunctionsApiV3Resource.java | 22 +-- .../worker/rest/api/v3/SinkApiV3Resource.java | 8 +- .../rest/api/v3/SinksApiV3Resource.java | 18 +-- .../rest/api/v3/SourceApiV3Resource.java | 8 +- .../rest/api/v3/SourcesApiV3Resource.java | 18 +-- .../worker/service/api/Component.java | 2 +- .../worker/service/api/FunctionsV2.java | 2 +- .../api/v2/FunctionApiV2ResourceTest.java | 4 +- .../v3/AbstractFunctionApiResourceTest.java | 2 +- .../api/v3/FunctionApiV3ResourceTest.java | 4 +- .../rest/api/v3/SinkApiV3ResourceTest.java | 2 +- .../rest/api/v3/SourceApiV3ResourceTest.java | 2 +- pulsar-proxy/build.gradle.kts | 11 +- .../proxy/server/AdminProxyHandler.java | 8 +- .../proxy/server/ProxyServiceStarter.java | 41 ++++- .../apache/pulsar/proxy/server/WebServer.java | 51 ++++-- .../apache/pulsar/proxy/stats/ProxyStats.java | 20 +-- .../pulsar/proxy/stats/RestException.java | 6 +- .../AdminProxyHandlerKeystoreTLSTest.java | 2 +- .../proxy/server/AdminProxyHandlerTest.java | 10 +- .../server/AuthedAdminProxyHandlerTest.java | 2 +- .../server/FunctionWorkerRoutingTest.java | 2 +- .../server/ProxyAdditionalServletTest.java | 17 +- .../proxy/server/ProxyIsAHttpProxyTest.java | 37 ++--- .../proxy/server/ProxyPackagesUploadTest.java | 2 +- .../server/ProxyPrometheusMetricsTest.java | 6 +- .../pulsar/proxy/server/ProxyStatsTest.java | 10 +- .../server/ProxyWithJwtAuthorizationTest.java | 8 +- .../SuperUserAuthedAdminProxyHandlerTest.java | 2 +- .../server/UnauthedAdminProxyHandlerTest.java | 10 +- pulsar-websocket/build.gradle.kts | 12 +- .../websocket/AbstractWebSocketHandler.java | 47 +++--- .../pulsar/websocket/ConsumerHandler.java | 108 ++++++------- .../websocket/MultiTopicConsumerHandler.java | 4 +- .../pulsar/websocket/ProducerHandler.java | 44 +++-- .../pulsar/websocket/ReaderHandler.java | 100 +++++------- .../websocket/WebSocketConsumerServlet.java | 4 +- .../WebSocketHttpServletRequestWrapper.java | 4 +- .../WebSocketMultiTopicConsumerServlet.java | 4 +- .../websocket/WebSocketProducerServlet.java | 4 +- .../websocket/WebSocketReaderServlet.java | 4 +- .../pulsar/websocket/WebSocketService.java | 2 +- .../admin/WebSocketProxyStatsBase.java | 2 +- .../websocket/admin/WebSocketWebResource.java | 10 +- .../admin/v2/WebSocketProxyStatsV2.java | 12 +- .../pulsar/websocket/service/ProxyServer.java | 18 ++- .../websocket/stats/ProxyTopicStat.java | 6 +- .../AbstractWebSocketHandlerTest.java | 13 +- .../pulsar/websocket/PingPongSupportTest.java | 14 +- .../pulsar/websocket/ProducerHandlerTest.java | 4 +- .../pulsar/websocket/ReaderHandlerTest.java | 6 +- ...ebSocketHttpServletRequestWrapperTest.java | 2 +- .../admin/WebSocketWebResourceTest.java | 8 +- .../java-test-plugins/build.gradle.kts | 1 + .../plugins/LoggingBrokerInterceptor.java | 8 +- tiered-storage/jcloud/build.gradle.kts | 2 +- 257 files changed, 1603 insertions(+), 1337 deletions(-) create mode 100644 pip/pip-472-notes.md rename pulsar-client-admin-shaded/src/main/resources/META-INF/services/{org.apache.pulsar.shade.javax.ws.rs.client.ClientBuilder => org.apache.pulsar.shade.jakarta.ws.rs.client.ClientBuilder} (100%) rename pulsar-client-admin-shaded/src/main/resources/META-INF/services/{org.apache.pulsar.shade.javax.ws.rs.ext.RuntimeDelegate => org.apache.pulsar.shade.jakarta.ws.rs.ext.RuntimeDelegate} (100%) rename pulsar-client-all/src/main/resources/META-INF/services/{org.apache.pulsar.shade.javax.ws.rs.client.ClientBuilder => org.apache.pulsar.shade.jakarta.ws.rs.client.ClientBuilder} (100%) rename pulsar-client-all/src/main/resources/META-INF/services/{org.apache.pulsar.shade.javax.ws.rs.ext.RuntimeDelegate => org.apache.pulsar.shade.jakarta.ws.rs.ext.RuntimeDelegate} (100%) diff --git a/build-logic/conventions/src/main/kotlin/pulsar.client-shade-conventions.gradle.kts b/build-logic/conventions/src/main/kotlin/pulsar.client-shade-conventions.gradle.kts index f67f5a7014767..a7013d9b5b2b6 100644 --- a/build-logic/conventions/src/main/kotlin/pulsar.client-shade-conventions.gradle.kts +++ b/build-logic/conventions/src/main/kotlin/pulsar.client-shade-conventions.gradle.kts @@ -48,7 +48,7 @@ tasks.named("shadowJ include(dependency("com.google.re2j:re2j")) include(dependency("com.spotify:completable-futures")) include(dependency("com.squareup.*:.*")) - include(dependency("com.sun.activation:jakarta.activation")) + include(dependency("org.eclipse.angus:angus-activation")) include(dependency("com.thoughtworks.paranamer:paranamer")) include(dependency("com.typesafe.netty:netty-reactive-streams")) include(dependency("com.yahoo.datasketches:.*")) @@ -63,10 +63,9 @@ tasks.named("shadowJ include(dependency("io.swagger:.*")) include(dependency("jakarta.activation:jakarta.activation-api")) include(dependency("jakarta.annotation:jakarta.annotation-api")) + include(dependency("jakarta.inject:jakarta.inject-api")) include(dependency("jakarta.ws.rs:jakarta.ws.rs-api")) include(dependency("jakarta.xml.bind:jakarta.xml.bind-api")) - include(dependency("javax.ws.rs:.*")) - include(dependency("javax.xml.bind:jaxb-api")) include(dependency("org.apache.avro:.*")) include(dependency("org.apache.bookkeeper:.*")) include(dependency("org.apache.commons:commons-compress")) @@ -136,7 +135,7 @@ tasks.named("shadowJ relocateWithPrefix(shadePrefix, "com.github.benmanes") relocateWithPrefix(shadePrefix, "com.spotify.futures") relocateWithPrefix(shadePrefix, "com.squareup") - relocateWithPrefix(shadePrefix, "com.sun.activation") + relocateWithPrefix(shadePrefix, "org.eclipse.angus") relocateWithPrefix(shadePrefix, "com.thoughtworks.paranamer") relocateWithPrefix(shadePrefix, "com.typesafe") relocateWithPrefix(shadePrefix, "com.yahoo") @@ -147,11 +146,11 @@ tasks.named("shadowJ relocateWithPrefix(shadePrefix, "io.prometheus.client") relocateWithPrefix(shadePrefix, "io.swagger") relocateWithPrefix(shadePrefix, "javassist") - relocateWithPrefix(shadePrefix, "javax.activation") - relocateWithPrefix(shadePrefix, "javax.annotation") - relocateWithPrefix(shadePrefix, "javax.inject") - relocateWithPrefix(shadePrefix, "javax.ws") - relocateWithPrefix(shadePrefix, "javax.xml.bind") + relocateWithPrefix(shadePrefix, "jakarta.activation") + relocateWithPrefix(shadePrefix, "jakarta.annotation") + relocateWithPrefix(shadePrefix, "jakarta.inject") + relocateWithPrefix(shadePrefix, "jakarta.ws.rs") + relocateWithPrefix(shadePrefix, "jakarta.xml.bind") relocateWithPrefix(shadePrefix, "jersey") relocateWithPrefix(shadePrefix, "okio") relocateWithPrefix(shadePrefix, "org.aopalliance") diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cd94415b05bbf..d9c1d0bdbb2c2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -28,7 +28,7 @@ zookeeper = "3.9.5" netty = "4.1.134.Final" netty-iouring = "0.0.26.Final" jetty = "12.1.9" -jersey = "2.42" +jersey = "3.1.10" jackson = "2.21.3" jackson-annotations = "2.21" protobuf = "3.25.5" @@ -112,6 +112,7 @@ audience-annotations = "0.12.0" # Misc curator = "5.7.1" reflections = "0.10.2" +# swagger stays 1.6.2 in Phase A (javax→jakarta core); migrated to Swagger Core 2.x (io.swagger.core.v3) in Phase B swagger = "1.6.2" typetools = "0.5.0" jna = "5.18.1" @@ -128,12 +129,18 @@ snappy = "1.1.10.8" ipaddress = "5.5.0" zt-zip = "1.17" # Jakarta -jakarta-ws-rs = "2.1.6" -jakarta-annotation = "1.3.5" -jakarta-activation = "1.2.2" -jakarta-xml-bind = "2.3.3" -jakarta-validation = "2.0.2" +jakarta-ws-rs = "3.1.0" +jakarta-annotation = "2.1.1" +jakarta-activation = "2.1.3" +# Jakarta Activation 2.x reference implementation (the com.sun.activation:jakarta.activation impl was not +# republished past 2.0.x; Eclipse Angus is the EE10 impl of jakarta.activation-api 2.1.x) +angus-activation = "2.0.2" +jakarta-xml-bind = "4.0.2" +jakarta-validation = "3.0.2" +# javax-servlet (Servlet 3.1, ee8) is retained alongside jakarta-servlet (Servlet 6.0, ee10) +# so that the AdditionalServlet plugin SPI keeps supporting legacy javax.servlet handlers (PIP-472) javax-servlet = "3.1.0" +jakarta-servlet = "6.0.0" # Oxia / etcd oxia = "0.7.4" # Build plugins @@ -195,7 +202,7 @@ jackson-datatype-jsr310 = { module = "com.fasterxml.jackson.datatype:jackson-dat jackson-datatype-jdk8 = { module = "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", version.ref = "jackson" } jackson-dataformat-yaml = { module = "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", version.ref = "jackson" } jackson-module-jsonSchema = { module = "com.fasterxml.jackson.module:jackson-module-jsonSchema", version.ref = "jackson" } -jackson-jaxrs-json-provider = { module = "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider", version.ref = "jackson" } +jackson-jakarta-rs-json-provider = { module = "com.fasterxml.jackson.jakarta.rs:jackson-jakarta-rs-json-provider", version.ref = "jackson" } # Netty netty-bom = { module = "io.netty:netty-bom", version.ref = "netty" } netty-common = { module = "io.netty:netty-common", version.ref = "netty" } @@ -263,12 +270,18 @@ jetty-alpn-conscrypt-server = { module = "org.eclipse.jetty:jetty-alpn-conscrypt jetty-compression-server = { module = "org.eclipse.jetty.compression:jetty-compression-server", version.ref = "jetty" } jetty-compression-gzip = { module = "org.eclipse.jetty.compression:jetty-compression-gzip", version.ref = "jetty" } jetty-client = { module = "org.eclipse.jetty:jetty-client", version.ref = "jetty" } +# jetty-ee8-* is retained for the AdditionalServlet legacy javax.servlet environment (PIP-472) jetty-ee8-servlet = { module = "org.eclipse.jetty.ee8:jetty-ee8-servlet", version.ref = "jetty" } jetty-ee8-servlets = { module = "org.eclipse.jetty.ee8:jetty-ee8-servlets", version.ref = "jetty" } jetty-ee8-proxy = { module = "org.eclipse.jetty.ee8:jetty-ee8-proxy", version.ref = "jetty" } jetty-websocket-jetty-api = { module = "org.eclipse.jetty.websocket:jetty-websocket-jetty-api", version.ref = "jetty" } jetty-websocket-jetty-client = { module = "org.eclipse.jetty.websocket:jetty-websocket-jetty-client", version.ref = "jetty" } jetty-ee8-websocket-jetty-server = { module = "org.eclipse.jetty.ee8.websocket:jetty-ee8-websocket-jetty-server", version.ref = "jetty" } +# jetty-ee10-* is used by Pulsar's own broker/proxy/websocket Jetty wiring (jakarta.servlet, PIP-472) +jetty-ee10-servlet = { module = "org.eclipse.jetty.ee10:jetty-ee10-servlet", version.ref = "jetty" } +jetty-ee10-servlets = { module = "org.eclipse.jetty.ee10:jetty-ee10-servlets", version.ref = "jetty" } +jetty-ee10-proxy = { module = "org.eclipse.jetty.ee10:jetty-ee10-proxy", version.ref = "jetty" } +jetty-ee10-websocket-jetty-server = { module = "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jetty-server", version.ref = "jetty" } # Jersey jersey-server = { module = "org.glassfish.jersey.core:jersey-server", version.ref = "jersey" } jersey-container-servlet-core = { module = "org.glassfish.jersey.containers:jersey-container-servlet-core", version.ref = "jersey" } @@ -285,7 +298,7 @@ simpleclient = { module = "io.prometheus:simpleclient", version.ref = "prometheu simpleclient-hotspot = { module = "io.prometheus:simpleclient_hotspot", version.ref = "prometheus" } simpleclient-caffeine = { module = "io.prometheus:simpleclient_caffeine", version.ref = "prometheus" } simpleclient-httpserver = { module = "io.prometheus:simpleclient_httpserver", version.ref = "prometheus" } -simpleclient-servlet = { module = "io.prometheus:simpleclient_servlet", version.ref = "prometheus" } +simpleclient-servlet = { module = "io.prometheus:simpleclient_servlet_jakarta", version.ref = "prometheus" } simpleclient-common = { module = "io.prometheus:simpleclient_common", version.ref = "prometheus" } simpleclient-log4j2 = { module = "io.prometheus:simpleclient_log4j2", version.ref = "prometheus" } prometheus-jmx-collector = { module = "io.prometheus.jmx:collector", version.ref = "prometheus-jmx" } @@ -381,9 +394,11 @@ auth0-jwks-rsa = { module = "com.auth0:jwks-rsa", version.ref = "auth0-jwks-rsa" # Jakarta jakarta-ws-rs-api = { module = "jakarta.ws.rs:jakarta.ws.rs-api", version.ref = "jakarta-ws-rs" } jakarta-activation-api = { module = "jakarta.activation:jakarta.activation-api", version.ref = "jakarta-activation" } -jakarta-activation = { module = "com.sun.activation:jakarta.activation", version.ref = "jakarta-activation" } +angus-activation = { module = "org.eclipse.angus:angus-activation", version.ref = "angus-activation" } jakarta-xml-bind-api = { module = "jakarta.xml.bind:jakarta.xml.bind-api", version.ref = "jakarta-xml-bind" } javax-servlet-api = { module = "javax.servlet:javax.servlet-api", version.ref = "javax-servlet" } +jakarta-servlet-api = { module = "jakarta.servlet:jakarta.servlet-api", version.ref = "jakarta-servlet" } +jakarta-validation-api = { module = "jakarta.validation:jakarta.validation-api", version.ref = "jakarta-validation" } zt-zip = { module = "org.zeroturnaround:zt-zip", version.ref = "zt-zip" } ipaddress = { module = "com.github.seancfoley:ipaddress", version.ref = "ipaddress" } # Oxia / etcd diff --git a/pip/pip-472-notes.md b/pip/pip-472-notes.md new file mode 100644 index 0000000000000..83c7563a7bc1b --- /dev/null +++ b/pip/pip-472-notes.md @@ -0,0 +1,151 @@ +# PIP-472 Implementation Notes (javax.* → jakarta.* migration) + +These are working notes for the implementation of [PIP-472](pip-472.md). They record the +**actual discovered state** of the codebase (which differs significantly from the PIP's +estimates), decisions made during implementation, and deviations from the PIP. + +Branch: `lh-javax-to-jakarta-migration` → pushed to `forked` remote (`lhotari/pulsar`). +PR opened against `lhotari/pulsar` (NOT `apache/pulsar`) purely to exercise GitHub Actions CI. + +## Decision: single coordinated branch (big-bang) instead of the PIP's 4 phases + +The PIP describes 4 mergeable phases and explicitly *rejects* a single big-bang branch for +the upstream contribution workflow. For this CI-validation exercise on a personal fork we +implement everything on one branch so the whole migration can be validated end-to-end by CI +in one shot. The phased structure is still followed conceptually within the single branch. +When this is eventually contributed upstream it should be split back into the phased PRs. + +## Discovered state (2026-05-31) — much smaller than the PIP estimated + +Counts are from the current `master` (`a6af80198f2`). A large part of the migration the PIP +anticipated has already happened in git history. + +| Surface | PIP estimate | Actual now | Notes | +|---|---|---|---| +| `javax.ws.rs` | ~660 | **169 files** | broker 90, client-admin 30, functions/worker 28, proxy 7, broker-common 7, websocket 4, common 2, client-auth-sasl 1 | +| `javax.servlet` | ~368 | **94 files** | broker 36, broker-common 19, websocket 15, proxy 9, functions/worker 5, + jetty-upgrade/test-plugins/auth-sasl (out of scope) | +| `javax.annotation` (JSR-250) | ~48 | **0 files** | all 12 `javax.annotation` imports are JSR-305 `concurrent.NotThreadSafe`/`ThreadSafe` — out of scope, no jakarta equivalent | +| `javax.validation` | in scope | **0** | already migrated / unused | +| `javax.xml.bind` | in scope | **0** | already migrated / unused | +| `javax.activation` | in scope | **0** | | +| `javax.inject` | in scope | **0** | | +| `javax.websocket` | in scope | **0** | Pulsar uses Jetty's native WebSocket API, not JSR-356 | +| Swagger 1.x (`io.swagger.annotations`) | n/a | **61 files** | broker 36, functions/worker 9, common 9, client 4, websocket 1, proxy 1, docs-tools 1 | + +**Conclusion:** the real migration surface is `javax.ws.rs` (169), `javax.servlet` (94, minus +AdditionalServlet retention), and the Swagger 1→2 annotation transform (61). The annotation / +validation / xml.bind parts the PIP describes are already done or never existed. + +### Important correction vs PIP CI-lint section + +The PIP's Checkstyle ban list includes `javax.annotation` (excluding `javax.annotation.processing`). +But `javax.annotation.concurrent.*` and `javax.annotation.Nonnull`/`Nullable` are **JSR-305** +(findbugs), not Jakarta EE JSR-250, and have **no jakarta counterpart**. They must NOT be banned +and must NOT be migrated. The Checkstyle rule bans only the JSR-250 subset +(`javax.annotation.PostConstruct|PreDestroy|Resource|Generated|Priority|ManagedBean|Resources`), +not `javax.annotation.concurrent` / `javax.annotation.Nonnull` etc. + +## Out of scope / left on javax (confirmed) + +- `jetty-upgrade/zookeeper-with-patched-admin`, `jetty-upgrade/*-prometheus-metrics*` — these are + compat shims that re-host ZooKeeper/BookKeeper admin & metrics servlets on patched Jetty; they + intentionally stay on ee8/`javax.servlet`. Not Pulsar's own REST/servlet code. +- `tests/docker-images/java-test-plugins` AdditionalServlet test plugin — exercises the legacy + `javax.servlet` registration path on purpose; kept on javax. +- `pulsar-broker-auth-sasl` `javax.security.*` — JAAS/SASL JDK APIs, stay javax. + +## Build facts + +- Gradle, Kotlin DSL (`*.gradle.kts`), version catalog `gradle/libs.versions.toml`. +- Current: `jetty = 12.1.9`, `jersey = 2.42`, `swagger = 1.6.2`, `jackson = 2.21.3`. +- Convention plugins under `build-logic/conventions/src/main/kotlin/`, incl. + `pulsar.client-shade-conventions.gradle.kts` (shading rules). + +## Subsystem blueprint (from parallel mapping, 2026-05-31) + +- **AdditionalServlet SPI already pre-generalized** (commit 39dbbf01a26): `AdditionalServletType` enum + (only `JAVAX_SERVLET`) + `getServletInstance():Object`. Extension = add `JAKARTA_SERVLET` + route in + `PulsarService.addBrokerAdditionalServlets` (switch ~L1281) and `ProxyServiceStarter` (switch ~L416): + `JAVAX_SERVLET`→ee8 `ServletHolder`/`ServletContextHandler`, `JAKARTA_SERVLET`→ee10. +- **Jersey**: only `javax.ws.rs`→`jakarta.ws.rs`; all `org.glassfish.jersey.*` packages unchanged + (multipart, client, server, servlet, test). `ServletContainer` is `jakarta.servlet` in 3.1 → must run + in ee10 container (couples Jersey↔Jetty). `jclouds-shaded` already forces `jakarta.ws.rs-api:3.1.0`. +- **Jetty ee8→ee10** for Pulsar's own wiring: `WebService` (broker), `WebServer` (proxy), + `ProxyServer`+WS handlers (websocket), `WorkerServer` (functions). Key API diffs: + ee8 `ServletContextHandler.get()` (bridge to core Handler) → ee10 `ServletContextHandler` IS a core + Handler (drop `.get()`); `org.eclipse.jetty.ee8.nested.Request.getBaseRequest(...)` (WebService + AddListenerAttributeFilter) has no ee10 equivalent — must port to core Request connector lookup; + ee8.websocket.api.{Session,WebSocketAdapter,WriteCallback,JettyServerUpgradeResponse} → ee10.websocket.api. +- **Swagger**: annotations ONLY, no runtime bootstrap, no in-repo swagger.json (generated out-of-tree in + pulsar-site). 61 files. `BaseGenerateDocumentation` reflects over `@ApiModelProperty.value()/name()/required()` + → must hand-fix to `@Schema.description()/name()/requiredMode()`. +- **Shading** (`pulsar.client-shade-conventions`, `localrun-shaded`): relocations of `javax.{ws,annotation, + inject,xml.bind,activation,servlet,validation}` → must become `jakarta.*`. Rename checked-in service files + `pulsar-client-admin-shaded`/`pulsar-client-all` `META-INF/services/org.apache.pulsar.shade.javax.ws.rs.*` + → `...jakarta.ws.rs.*`. +- **Activation impl gotcha**: `com.sun.activation:jakarta.activation` has no 2.1.3 → use + `org.eclipse.angus:angus-activation:2.0.2` as the EE10 impl (API stays `jakarta.activation:jakarta.activation-api:2.1.3`). +- **tiered-storage/file-system** pins Jetty 9 (Hadoop MiniDFSCluster) — leave as-is, exempt from lint. + +## Execution plan (phased within the single branch) + +- **Phase A — core jakarta** (must compile): catalog (jersey 3.1.10, jakarta 3.x/4.x, jetty-ee10 aliases, + jakarta-servlet, jackson-jakarta-rs, angus-activation, simpleclient_servlet_jakarta); per-module build files + (ee8→ee10, retain ee8 in broker+proxy for legacy AdditionalServlet; javax-servlet→jakarta-servlet); source + renames (ws.rs blanket; servlet selective); manual Jetty/Jersey/AdditionalServlet wiring; shading. **Keep + swagger 1.6.2** in Phase A (decoupled). Compile broker/proxy/websocket/client-admin/functions-worker, fix. +- **Phase B — Swagger 1→2** (workflow, 61 per-file agents + BaseGenerateDocumentation + catalog v3 + shade + group filters). Compile, fix. +- **Phase C** — Checkstyle import ban + OpenRewrite tooling (Phase-0 deliverable) + LICENSE/NOTICE. +- Push to `forked`, open PR to `lhotari/pulsar`, monitor CI, iterate. + +## Compile milestone (2026-05-31) + +All **main** source compiles: `pulsar-broker-common`, `pulsar-broker`, `pulsar-proxy`, `pulsar-websocket`, +`pulsar-functions-worker`, `pulsar-client-admin`, `pulsar-client`, `pulsar-broker-auth-sasl`, +`tiered-storage-jcloud`. Remaining: test sources (the reverted ee8.nested mock servers + AdditionalServlet +SPI tests need attention), shaded client jars (verify relocations), Phase B (Swagger), Phase C (import order, +checkstyle lint, LICENSE/NOTICE). + +## Local validation (2026-05-31, before first push) + +- ✅ All main source compiles (broker, broker-common, proxy, websocket, functions-worker, client-admin, + client, auth-sasl, jcloud). +- ✅ All changed-module test source compiles. +- ✅ Checkstyle green across changed modules (import order: `jakarta.*` sorts before `java.*`; fixed 175 files). +- ✅ Spotless green. +- ✅ Shaded client jars build (`pulsar-client-shaded`, `pulsar-client-admin-shaded`, `pulsar-client-all`). +- ✅ Runtime tests pass: `BrokerAdditionalServletTest` (web tier + jakarta AdditionalServlet end-to-end), + `ProducerHandlerTest` (modern Jetty 12 WebSocket API), `AuthenticationFilterTest` (jakarta auth filter). + +Pushed to `forked` (lhotari/pulsar); PR opened to exercise full CI. Remaining known follow-ups for the CI loop: +some AdditionalServlet unit tests / `CounterBrokerInterceptor` may need runtime tweaks; Swagger 1→2 (Phase B); +Checkstyle import-ban lint + LICENSE/NOTICE (Phase C). + +## Decisions log + +- **D1 (swagger sequencing):** Swagger 1→2 deferred to Phase B (separate commits) so the javax→jakarta core + validates independently. Swagger is `io.swagger` (not javax), compile-only + doc-only, fully decoupled. +- **D2 (filters / dual env):** Pulsar's own filter chain (AuthenticationFilter, RateLimitingFilter, etc.) + migrates to jakarta.servlet (ee10). Legacy javax AdditionalServlet (ee8) path filter handling decided after + inspecting the AdditionalServlet tests (auth coverage). [resolve during wiring] +- **D3 (activation):** impl → `org.eclipse.angus:angus-activation` (EE10). +- **D4 (websocket endpoints stay ee8):** Jetty 12's ee10 websocket environment exposes only the *redesigned* + Jetty 12 WebSocket API (`org.eclipse.jetty.websocket.api.Session.Listener`, `Callback`); the legacy + `WebSocketAdapter`/`WriteCallback`/`RemoteEndpoint`/`Session.getRemote()` API that Pulsar's WS handlers are + written against exists **only** in the ee8 environment (`org.eclipse.jetty.ee8.websocket.api.*`). Rewriting + the handlers to the modern API is behaviorally sensitive, so the WS **endpoint layer** (the 4 `WebSocket*Servlet` + classes + `AbstractWebSocketHandler`/`Consumer`/`Producer`/`Reader`/`MultiTopicConsumerHandler` + + `WebSocketHttpServletRequestWrapper`) is **kept on ee8 + javax.servlet**, registered via `addWebSocketServlet` + into an ee8 Jetty context. The WS **REST/admin tier** (`WebSocketWebResource`, `WebSocketProxyStats*`) still + moves to jakarta.ws.rs/Jersey 3 (ee10). Both run in the same Jetty 12 server (multi-environment). Modernizing + the WS endpoint API to Jetty 12's native API is a separate follow-up. WS wire protocol/behavior unchanged. +- **D4 REVISED:** The ee8-endpoint approach was abandoned: the WS handlers call the **shared jakarta auth SPI** + (`AuthenticationService`/`AuthenticationProvider.newHttpAuthState`/`AuthenticationDataHttps`, also used by the + ee10 REST `AuthenticationFilter`), which takes a `jakarta.servlet.http.HttpServletRequest`. An ee8 (javax) + WS upgrade request can't be passed to it, and the auth SPI must stay jakarta because the REST tier is jakarta. + So the WS **endpoints are migrated to ee10 + the modern Jetty 12 WebSocket API** + (`org.eclipse.jetty.websocket.api.Session.Listener` / `Callback`): `WebSocketAdapter`→`Session.Listener` + (store Session in `onWebSocketOpen`), `getRemote().sendString(s, WriteCallback)`→`session.sendText(s, Callback)`, + `sendPing(buf)`→`session.sendPing(buf, Callback)`, `getRemoteAddress()`→`session.getRemoteSocketAddress()`, + `close(code,reason)`→`session.close(code,reason,Callback)`. WS wire protocol unchanged. diff --git a/pip/pip-472.md b/pip/pip-472.md index 19d68eec8190c..ff20e3f675b20 100644 --- a/pip/pip-472.md +++ b/pip/pip-472.md @@ -1,5 +1,13 @@ # PIP-472: Migrate from javax.* to jakarta.* APIs +> **Implementation status / notes:** An implementation of this PIP lives on branch +> `lh-javax-to-jakarta-migration`. Working notes, the *actual* discovered migration surface (which is +> considerably smaller than the estimates below — the partial migration described under *Apache Pulsar's +> current state* has progressed further than the PIP assumed), and the design decisions/deviations made +> during implementation (e.g. Swagger 1→2 split into a later phase, the Eclipse Angus activation impl, and +> the websocket endpoint move to Jetty 12's native WebSocket API) are recorded in +> [`pip-472-notes.md`](pip-472-notes.md). + ## Background Knowledge In 2017, Oracle transferred Java EE to the Eclipse Foundation, where it was renamed Jakarta EE. As part of that transfer, Oracle did not grant Eclipse the right to evolve the `javax.*` namespace; from Jakarta EE 9 onward (released 2020), every Jakarta EE specification moved its package prefix from `javax.*` to `jakarta.*`. The two namespaces are source- and binary-incompatible: an application can use either, but not both, for the same specification. diff --git a/pulsar-broker-auth-sasl/build.gradle.kts b/pulsar-broker-auth-sasl/build.gradle.kts index a55aa3f980aeb..e5477b5a2327f 100644 --- a/pulsar-broker-auth-sasl/build.gradle.kts +++ b/pulsar-broker-auth-sasl/build.gradle.kts @@ -37,7 +37,7 @@ dependencies { implementation(libs.caffeine) implementation(libs.commons.lang3) implementation(libs.commons.codec) - implementation(libs.javax.servlet.api) + implementation(libs.jakarta.servlet.api) implementation(libs.simpleclient.caffeine) testImplementation(libs.commons.io) diff --git a/pulsar-broker-auth-sasl/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationProviderSasl.java b/pulsar-broker-auth-sasl/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationProviderSasl.java index e952e5ca14d89..6dc2ad0293306 100644 --- a/pulsar-broker-auth-sasl/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationProviderSasl.java +++ b/pulsar-broker-auth-sasl/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationProviderSasl.java @@ -35,6 +35,8 @@ import static org.apache.pulsar.common.sasl.SaslConstants.SASL_STATE_SERVER_CHECK_TOKEN; import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.SocketAddress; import java.net.URI; @@ -49,8 +51,6 @@ import javax.naming.AuthenticationException; import javax.net.ssl.SSLSession; import javax.security.auth.login.LoginException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.CustomLog; import org.apache.commons.lang3.StringUtils; import org.apache.pulsar.broker.ServiceConfiguration; diff --git a/pulsar-broker-auth-sasl/src/test/java/org/apache/pulsar/broker/authentication/SaslAuthenticateTest.java b/pulsar-broker-auth-sasl/src/test/java/org/apache/pulsar/broker/authentication/SaslAuthenticateTest.java index 62a48c502ec5b..bb8595dacedd8 100644 --- a/pulsar-broker-auth-sasl/src/test/java/org/apache/pulsar/broker/authentication/SaslAuthenticateTest.java +++ b/pulsar-broker-auth-sasl/src/test/java/org/apache/pulsar/broker/authentication/SaslAuthenticateTest.java @@ -27,6 +27,8 @@ import static org.testng.Assert.fail; import com.github.benmanes.caffeine.cache.Cache; import com.google.common.collect.ImmutableSet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileWriter; import java.io.IOException; @@ -42,8 +44,6 @@ import java.util.Set; import java.util.concurrent.TimeUnit; import javax.security.auth.login.Configuration; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.Cleanup; import lombok.CustomLog; import org.apache.commons.io.FileUtils; diff --git a/pulsar-broker-common/build.gradle.kts b/pulsar-broker-common/build.gradle.kts index 6e2bc73feba8f..db0ebf68c4c80 100644 --- a/pulsar-broker-common/build.gradle.kts +++ b/pulsar-broker-common/build.gradle.kts @@ -32,14 +32,14 @@ dependencies { implementation(libs.opentelemetry.api) implementation(libs.simpleclient) implementation(libs.caffeine) - implementation(libs.javax.servlet.api) + implementation(libs.jakarta.servlet.api) implementation(libs.jakarta.ws.rs.api) implementation(libs.jjwt.impl) implementation(libs.jjwt.jackson) implementation(libs.jetty.server) implementation(libs.jetty.compression.server) implementation(libs.jetty.compression.gzip) - implementation(libs.jetty.ee8.servlet) + implementation(libs.jetty.ee10.servlet) testImplementation(libs.bc.fips) testImplementation(libs.awaitility) diff --git a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationDataHttp.java b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationDataHttp.java index 876dfb87fc582..e27410f200a6f 100644 --- a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationDataHttp.java +++ b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationDataHttp.java @@ -18,9 +18,9 @@ */ package org.apache.pulsar.broker.authentication; +import jakarta.servlet.http.HttpServletRequest; import java.net.InetSocketAddress; import java.net.SocketAddress; -import javax.servlet.http.HttpServletRequest; public class AuthenticationDataHttp implements AuthenticationDataSource { diff --git a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationDataHttps.java b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationDataHttps.java index 31328df35d2eb..599d3865a93e4 100644 --- a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationDataHttps.java +++ b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationDataHttps.java @@ -18,8 +18,8 @@ */ package org.apache.pulsar.broker.authentication; +import jakarta.servlet.http.HttpServletRequest; import java.security.cert.X509Certificate; -import javax.servlet.http.HttpServletRequest; public class AuthenticationDataHttps extends AuthenticationDataHttp { @@ -27,7 +27,7 @@ public class AuthenticationDataHttps extends AuthenticationDataHttp { public AuthenticationDataHttps(HttpServletRequest request) { super(request); - certificates = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate"); + certificates = (X509Certificate[]) request.getAttribute("jakarta.servlet.request.X509Certificate"); } /* diff --git a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationProvider.java b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationProvider.java index 7443ca228e274..c9f1bd5b4d932 100644 --- a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationProvider.java +++ b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationProvider.java @@ -21,6 +21,8 @@ import static org.apache.pulsar.broker.web.AuthenticationFilter.AuthenticatedDataAttributeName; import static org.apache.pulsar.broker.web.AuthenticationFilter.AuthenticatedRoleAttributeName; import io.opentelemetry.api.OpenTelemetry; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.Closeable; import java.io.IOException; import java.net.SocketAddress; @@ -28,8 +30,6 @@ import java.util.concurrent.ExecutionException; import javax.naming.AuthenticationException; import javax.net.ssl.SSLSession; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.Builder; import lombok.Value; import org.apache.pulsar.broker.ServiceConfiguration; diff --git a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationProviderList.java b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationProviderList.java index c43018cef98f7..1bd527a26099c 100644 --- a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationProviderList.java +++ b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationProviderList.java @@ -18,6 +18,8 @@ */ package org.apache.pulsar.broker.authentication; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.SocketAddress; import java.util.ArrayList; @@ -25,8 +27,6 @@ import java.util.concurrent.CompletableFuture; import javax.naming.AuthenticationException; import javax.net.ssl.SSLSession; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.CustomLog; import org.apache.pulsar.broker.ServiceConfiguration; import org.apache.pulsar.broker.authentication.metrics.AuthenticationMetrics; diff --git a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationProviderToken.java b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationProviderToken.java index 0d40dfa85a6d2..b7c733d185511 100644 --- a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationProviderToken.java +++ b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationProviderToken.java @@ -30,6 +30,8 @@ import io.jsonwebtoken.RequiredTypeException; import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.security.SignatureException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.SocketAddress; import java.security.Key; @@ -38,8 +40,6 @@ import java.util.Optional; import javax.naming.AuthenticationException; import javax.net.ssl.SSLSession; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; import org.apache.pulsar.broker.ServiceConfiguration; import org.apache.pulsar.broker.authentication.metrics.AuthenticationMetricsToken; @@ -432,7 +432,7 @@ public boolean isExpired() { } } - private static final class HttpServletRequestWrapper extends javax.servlet.http.HttpServletRequestWrapper { + private static final class HttpServletRequestWrapper extends jakarta.servlet.http.HttpServletRequestWrapper { private final HttpServletRequest request; public HttpServletRequestWrapper(HttpServletRequest request) { diff --git a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationService.java b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationService.java index 9ce8abfb81c6f..b2736b193147c 100644 --- a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationService.java +++ b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationService.java @@ -21,6 +21,8 @@ import static org.apache.pulsar.broker.web.AuthenticationFilter.AuthenticatedDataAttributeName; import static org.apache.pulsar.broker.web.AuthenticationFilter.AuthenticatedRoleAttributeName; import io.opentelemetry.api.OpenTelemetry; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.Closeable; import java.io.IOException; import java.util.ArrayList; @@ -30,8 +32,6 @@ import java.util.Optional; import java.util.stream.Collectors; import javax.naming.AuthenticationException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.CustomLog; import org.apache.commons.lang3.StringUtils; import org.apache.pulsar.broker.PulsarServerException; diff --git a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/OneStageAuthenticationState.java b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/OneStageAuthenticationState.java index 242564a8d1f5a..e83c9e3d657ca 100644 --- a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/OneStageAuthenticationState.java +++ b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/OneStageAuthenticationState.java @@ -19,12 +19,12 @@ package org.apache.pulsar.broker.authentication; import static java.nio.charset.StandardCharsets.UTF_8; +import jakarta.servlet.http.HttpServletRequest; import java.net.SocketAddress; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import javax.naming.AuthenticationException; import javax.net.ssl.SSLSession; -import javax.servlet.http.HttpServletRequest; import org.apache.pulsar.common.api.AuthData; /** diff --git a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/AuthorizationService.java b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/AuthorizationService.java index 255d6c0379779..c134ffcd553b2 100644 --- a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/AuthorizationService.java +++ b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/AuthorizationService.java @@ -19,6 +19,7 @@ package org.apache.pulsar.broker.authorization; import static java.util.concurrent.TimeUnit.SECONDS; +import jakarta.ws.rs.core.Response; import java.net.SocketAddress; import java.util.List; import java.util.Map; @@ -26,7 +27,6 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; -import javax.ws.rs.core.Response; import lombok.CustomLog; import org.apache.commons.lang3.StringUtils; import org.apache.pulsar.broker.PulsarServerException; diff --git a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/MultiRolesTokenAuthorizationProvider.java b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/MultiRolesTokenAuthorizationProvider.java index 2dbab4e6b0dff..841b34e0e6a93 100644 --- a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/MultiRolesTokenAuthorizationProvider.java +++ b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/MultiRolesTokenAuthorizationProvider.java @@ -23,6 +23,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import io.jsonwebtoken.JwtParser; import io.jsonwebtoken.Jwts; +import jakarta.ws.rs.core.Response; import java.io.IOException; import java.io.UncheckedIOException; import java.util.ArrayList; @@ -34,7 +35,6 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.function.Function; -import javax.ws.rs.core.Response; import lombok.CustomLog; import org.apache.commons.lang3.StringUtils; import org.apache.pulsar.broker.ServiceConfiguration; diff --git a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/PulsarAuthorizationProvider.java b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/PulsarAuthorizationProvider.java index bf0164879e275..0624b85abf5fe 100644 --- a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/PulsarAuthorizationProvider.java +++ b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/PulsarAuthorizationProvider.java @@ -21,6 +21,7 @@ import static java.util.Objects.requireNonNull; import static org.apache.commons.lang3.StringUtils.isNotBlank; import com.google.common.collect.Sets; +import jakarta.ws.rs.core.Response; import java.io.IOException; import java.util.Collections; import java.util.HashMap; @@ -29,7 +30,6 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.stream.Stream; -import javax.ws.rs.core.Response; import lombok.CustomLog; import org.apache.pulsar.broker.PulsarServerException; import org.apache.pulsar.broker.ServiceConfiguration; diff --git a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/stats/prometheus/PrometheusMetricsServlet.java b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/stats/prometheus/PrometheusMetricsServlet.java index b342f66e5ab47..cb73d3d20b838 100644 --- a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/stats/prometheus/PrometheusMetricsServlet.java +++ b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/stats/prometheus/PrometheusMetricsServlet.java @@ -19,6 +19,13 @@ package org.apache.pulsar.broker.stats.prometheus; import io.netty.util.concurrent.DefaultThreadFactory; +import jakarta.servlet.AsyncContext; +import jakarta.servlet.AsyncEvent; +import jakarta.servlet.AsyncListener; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.EOFException; import java.io.IOException; import java.util.LinkedList; @@ -28,13 +35,6 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; -import javax.servlet.AsyncContext; -import javax.servlet.AsyncEvent; -import javax.servlet.AsyncListener; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.CustomLog; @CustomLog diff --git a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/AuthenticationFilter.java b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/AuthenticationFilter.java index 4dc6f1bd401b2..54816151b81f3 100644 --- a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/AuthenticationFilter.java +++ b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/AuthenticationFilter.java @@ -18,16 +18,16 @@ */ package org.apache.pulsar.broker.web; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import javax.naming.AuthenticationException; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.CustomLog; import org.apache.pulsar.broker.authentication.AuthenticationService; diff --git a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/DisableDebugHttpMethodFilter.java b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/DisableDebugHttpMethodFilter.java index 52804457e35b2..8008e29bdcb87 100644 --- a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/DisableDebugHttpMethodFilter.java +++ b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/DisableDebugHttpMethodFilter.java @@ -18,15 +18,15 @@ */ package org.apache.pulsar.broker.web; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.CustomLog; import org.apache.pulsar.broker.ServiceConfiguration; diff --git a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/JsonMapperProvider.java b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/JsonMapperProvider.java index 0aa2d01adf11e..fa91666c3d053 100644 --- a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/JsonMapperProvider.java +++ b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/JsonMapperProvider.java @@ -21,8 +21,8 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.deser.DeserializationProblemHandler; -import javax.ws.rs.ext.ContextResolver; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.ext.ContextResolver; +import jakarta.ws.rs.ext.Provider; import org.apache.pulsar.common.util.ObjectMapperFactory; @Provider diff --git a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/RateLimitingFilter.java b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/RateLimitingFilter.java index 0618df6609c49..08e35101d6f5a 100644 --- a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/RateLimitingFilter.java +++ b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/RateLimitingFilter.java @@ -24,14 +24,14 @@ import io.opentelemetry.api.metrics.LongCounter; import io.opentelemetry.api.metrics.Meter; import io.prometheus.client.Counter; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletResponse; public class RateLimitingFilter implements Filter { diff --git a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/UnrecognizedPropertyExceptionMapper.java b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/UnrecognizedPropertyExceptionMapper.java index 6badf31bb1969..287556b5eb80f 100644 --- a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/UnrecognizedPropertyExceptionMapper.java +++ b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/UnrecognizedPropertyExceptionMapper.java @@ -19,9 +19,9 @@ package org.apache.pulsar.broker.web; import com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.ext.ExceptionMapper; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.ext.ExceptionMapper; public class UnrecognizedPropertyExceptionMapper implements ExceptionMapper { diff --git a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/plugin/servlet/AdditionalServlet.java b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/plugin/servlet/AdditionalServlet.java index 6d817bfb9bd47..b2d95b1dd381e 100644 --- a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/plugin/servlet/AdditionalServlet.java +++ b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/plugin/servlet/AdditionalServlet.java @@ -28,10 +28,15 @@ public interface AdditionalServlet extends AutoCloseable { /** * The servlet implementation type enum. - * Currently, only {@link AdditionalServletType#JAVAX_SERVLET} is supported. + *

+ * {@link AdditionalServletType#JAVAX_SERVLET} servlets implement {@code javax.servlet.Servlet} and are + * routed to Jetty's ee8 environment (legacy compatibility path). {@link AdditionalServletType#JAKARTA_SERVLET} + * servlets implement {@code jakarta.servlet.Servlet} and are routed to Jetty's ee10 environment (the preferred + * path going forward). Both styles can coexist within a single broker/proxy. See PIP-472. */ enum AdditionalServletType { - JAVAX_SERVLET + JAVAX_SERVLET, + JAKARTA_SERVLET } /** @@ -61,7 +66,9 @@ default AdditionalServletType getServletType() { * The returned object's type must be compatible with the servlet interface class * specified by the {@link AdditionalServletType} returned from {@link #getServletType()}. * For example, if {@link #getServletType()} returns {@link AdditionalServletType#JAVAX_SERVLET}, - * the returned object must implement {@code javax.servlet.Servlet}. + * the returned object must implement {@code javax.servlet.Servlet}; if it returns + * {@link AdditionalServletType#JAKARTA_SERVLET}, the returned object must implement + * {@code jakarta.servlet.Servlet}. *

* * @return the servlet instance implementing the appropriate servlet interface diff --git a/pulsar-broker-common/src/main/java/org/apache/pulsar/common/configuration/VipStatus.java b/pulsar-broker-common/src/main/java/org/apache/pulsar/common/configuration/VipStatus.java index fe1d41c81d207..1f7d905353a35 100644 --- a/pulsar-broker-common/src/main/java/org/apache/pulsar/common/configuration/VipStatus.java +++ b/pulsar-broker-common/src/main/java/org/apache/pulsar/common/configuration/VipStatus.java @@ -19,6 +19,12 @@ package org.apache.pulsar.common.configuration; import com.google.common.annotations.VisibleForTesting; +import jakarta.servlet.ServletContext; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Response.Status; import java.io.File; import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; @@ -27,12 +33,6 @@ import java.util.Arrays; import java.util.function.Supplier; import java.util.stream.Collectors; -import javax.servlet.ServletContext; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response.Status; import lombok.CustomLog; import org.apache.pulsar.common.util.ThreadDumpUtil; diff --git a/pulsar-broker-common/src/test/java/org/apache/pulsar/broker/authentication/AuthenticationDataSubscriptionTest.java b/pulsar-broker-common/src/test/java/org/apache/pulsar/broker/authentication/AuthenticationDataSubscriptionTest.java index 8af7b87fd221b..2d94f2bf60fc7 100644 --- a/pulsar-broker-common/src/test/java/org/apache/pulsar/broker/authentication/AuthenticationDataSubscriptionTest.java +++ b/pulsar-broker-common/src/test/java/org/apache/pulsar/broker/authentication/AuthenticationDataSubscriptionTest.java @@ -22,7 +22,7 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.testng.AssertJUnit.assertEquals; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.testng.annotations.Test; public class AuthenticationDataSubscriptionTest { diff --git a/pulsar-broker-common/src/test/java/org/apache/pulsar/broker/authentication/AuthenticationProviderListTest.java b/pulsar-broker-common/src/test/java/org/apache/pulsar/broker/authentication/AuthenticationProviderListTest.java index ac3fd0f55a5a9..83d84958e5fe0 100644 --- a/pulsar-broker-common/src/test/java/org/apache/pulsar/broker/authentication/AuthenticationProviderListTest.java +++ b/pulsar-broker-common/src/test/java/org/apache/pulsar/broker/authentication/AuthenticationProviderListTest.java @@ -34,6 +34,7 @@ import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.io.Decoders; import io.jsonwebtoken.security.Keys; +import jakarta.servlet.http.HttpServletRequest; import java.security.KeyPair; import java.security.PrivateKey; import java.util.Date; @@ -43,7 +44,6 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import javax.naming.AuthenticationException; -import javax.servlet.http.HttpServletRequest; import org.apache.pulsar.broker.ServiceConfiguration; import org.apache.pulsar.broker.authentication.utils.AuthTokenUtils; import org.apache.pulsar.common.api.AuthData; diff --git a/pulsar-broker-common/src/test/java/org/apache/pulsar/broker/authentication/AuthenticationProviderTokenTest.java b/pulsar-broker-common/src/test/java/org/apache/pulsar/broker/authentication/AuthenticationProviderTokenTest.java index e5be41035f95d..7377c8fc3823a 100644 --- a/pulsar-broker-common/src/test/java/org/apache/pulsar/broker/authentication/AuthenticationProviderTokenTest.java +++ b/pulsar-broker-common/src/test/java/org/apache/pulsar/broker/authentication/AuthenticationProviderTokenTest.java @@ -37,6 +37,7 @@ import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.io.Decoders; import io.jsonwebtoken.security.Keys; +import jakarta.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -53,7 +54,6 @@ import java.util.concurrent.TimeUnit; import javax.crypto.SecretKey; import javax.naming.AuthenticationException; -import javax.servlet.http.HttpServletRequest; import lombok.Cleanup; import org.apache.commons.lang3.reflect.FieldUtils; import org.apache.pulsar.broker.ServiceConfiguration; diff --git a/pulsar-broker-common/src/test/java/org/apache/pulsar/broker/authentication/OneStageAuthenticationStateTest.java b/pulsar-broker-common/src/test/java/org/apache/pulsar/broker/authentication/OneStageAuthenticationStateTest.java index 07a0ccf639acd..907380f5d146e 100644 --- a/pulsar-broker-common/src/test/java/org/apache/pulsar/broker/authentication/OneStageAuthenticationStateTest.java +++ b/pulsar-broker-common/src/test/java/org/apache/pulsar/broker/authentication/OneStageAuthenticationStateTest.java @@ -28,11 +28,11 @@ import static org.testng.Assert.assertSame; import static org.testng.Assert.assertThrows; import static org.testng.Assert.assertTrue; +import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.LongAdder; import javax.naming.AuthenticationException; -import javax.servlet.http.HttpServletRequest; import org.apache.pulsar.broker.ServiceConfiguration; import org.apache.pulsar.common.api.AuthData; import org.testng.annotations.Test; diff --git a/pulsar-broker-common/src/test/java/org/apache/pulsar/broker/web/AuthenticationFilterTest.java b/pulsar-broker-common/src/test/java/org/apache/pulsar/broker/web/AuthenticationFilterTest.java index 744f4a1d18975..43d9938e79a6e 100644 --- a/pulsar-broker-common/src/test/java/org/apache/pulsar/broker/web/AuthenticationFilterTest.java +++ b/pulsar-broker-common/src/test/java/org/apache/pulsar/broker/web/AuthenticationFilterTest.java @@ -22,10 +22,10 @@ import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; +import jakarta.servlet.FilterChain; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import javax.naming.AuthenticationException; -import javax.servlet.FilterChain; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import org.apache.pulsar.broker.authentication.AuthenticationService; import org.testng.annotations.Test; diff --git a/pulsar-broker-common/src/test/java/org/apache/pulsar/common/configuration/VipStatusTest.java b/pulsar-broker-common/src/test/java/org/apache/pulsar/common/configuration/VipStatusTest.java index 21d9697ed212c..965910222304b 100644 --- a/pulsar-broker-common/src/test/java/org/apache/pulsar/common/configuration/VipStatusTest.java +++ b/pulsar-broker-common/src/test/java/org/apache/pulsar/common/configuration/VipStatusTest.java @@ -19,6 +19,9 @@ package org.apache.pulsar.common.configuration; import static org.testng.Assert.assertEquals; +import jakarta.servlet.ServletContext; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Response; import java.io.Closeable; import java.io.File; import java.io.IOException; @@ -28,9 +31,6 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Supplier; -import javax.servlet.ServletContext; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response; import lombok.CustomLog; import lombok.SneakyThrows; import org.assertj.core.util.Files; diff --git a/pulsar-broker/build.gradle.kts b/pulsar-broker/build.gradle.kts index 5fdd16c30c5ab..80c9ade313695 100644 --- a/pulsar-broker/build.gradle.kts +++ b/pulsar-broker/build.gradle.kts @@ -59,15 +59,18 @@ dependencies { implementation(libs.snappy.java) implementation(libs.jetty.server) implementation(libs.jetty.alpn.conscrypt.server) + implementation(libs.jetty.ee10.servlet) + implementation(libs.jetty.ee10.servlets) + // ee8 + javax.servlet retained for the legacy AdditionalServlet javax.servlet path (PIP-472) implementation(libs.jetty.ee8.servlet) - implementation(libs.jetty.ee8.servlets) + implementation(libs.javax.servlet.api) implementation(libs.jersey.server) implementation(libs.jersey.container.servlet.core) implementation(libs.jersey.container.servlet) implementation(libs.jersey.media.json.jackson) implementation(libs.jersey.hk2) implementation(libs.jakarta.activation.api) - implementation(libs.jackson.jaxrs.json.provider) + implementation(libs.jackson.jakarta.rs.json.provider) implementation(libs.jackson.module.jsonSchema) implementation(libs.jcl.over.slf4j) implementation(libs.guava) @@ -84,14 +87,14 @@ dependencies { implementation(libs.roaringbitmap) implementation(libs.oshi.core) implementation(libs.jakarta.xml.bind.api) - implementation(libs.jakarta.activation) + implementation(libs.angus.activation) implementation(libs.bookkeeper.server) implementation(libs.bookkeeper.circe.checksum) implementation(libs.caffeine) implementation(libs.sketches.core) implementation(libs.netty.codec.haproxy) implementation(libs.opentelemetry.sdk.extension.autoconfigure) - implementation(libs.jetty.ee8.websocket.jetty.server) + implementation(libs.jetty.ee10.websocket.jetty.server) implementation(libs.jersey.media.multipart) implementation(libs.bookkeeper.stream.storage.java.client) implementation(libs.bookkeeper.stream.storage.service.api) @@ -129,7 +132,7 @@ dependencies { testImplementation(libs.restassured) testImplementation(libs.jersey.test.framework.core) testImplementation(libs.jersey.test.framework.grizzly2) - testImplementation(libs.jetty.ee8.proxy) + testImplementation(libs.jetty.ee10.proxy) testImplementation(libs.jetty.websocket.jetty.client) testImplementation(libs.opentelemetry.sdk.testing) testImplementation(libs.oxia.testcontainers) diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/PulsarService.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/PulsarService.java index 1af1d3a39f5e3..acf79195a3f62 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/PulsarService.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/PulsarService.java @@ -32,6 +32,8 @@ import io.netty.util.concurrent.DefaultThreadFactory; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder; +import jakarta.servlet.ServletException; +import jakarta.ws.rs.core.Response; import java.io.IOException; import java.lang.reflect.Constructor; import java.net.InetSocketAddress; @@ -66,9 +68,6 @@ import java.util.function.Consumer; import java.util.function.Supplier; import java.util.regex.Pattern; -import javax.servlet.Servlet; -import javax.servlet.ServletException; -import javax.ws.rs.core.Response; import lombok.AccessLevel; import lombok.CustomLog; import lombok.Getter; @@ -207,8 +206,8 @@ import org.apache.pulsar.websocket.WebSocketReaderServlet; import org.apache.pulsar.websocket.WebSocketService; import org.apache.pulsar.zookeeper.DefaultMetadataNodeSizeStats; -import org.eclipse.jetty.ee8.servlet.ServletHolder; -import org.eclipse.jetty.ee8.websocket.server.JettyWebSocketServlet; +import org.eclipse.jetty.ee10.servlet.ServletHolder; +import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServlet; /** * Main class for Pulsar broker service. @@ -1280,6 +1279,7 @@ private void addBrokerAdditionalServlets(WebService webService, } switch (servletWithClassLoader.getServletType()) { case JAVAX_SERVLET -> { + // Legacy javax.servlet handlers are routed to Jetty's ee8 environment (PIP-472). Object servletInstance = servletWithClassLoader.getServletInstance(); if (!(servletInstance instanceof javax.servlet.Servlet)) { log.error() @@ -1298,8 +1298,37 @@ private void addBrokerAdditionalServlets(WebService webService, } continue; } + org.eclipse.jetty.ee8.servlet.ServletHolder servletHolder = + new org.eclipse.jetty.ee8.servlet.ServletHolder( + (javax.servlet.Servlet) servletInstance); + webService.addServletEe8(servletWithClassLoader.getBasePath(), servletHolder, + config.isAuthenticationEnabled(), attributeMap); + log.info() + .attr("basePath", servletWithClassLoader.getBasePath()) + .log("Broker add additional servlet basePath"); + } + case JAKARTA_SERVLET -> { + // jakarta.servlet handlers are routed to Jetty's ee10 environment (PIP-472). + Object servletInstance = servletWithClassLoader.getServletInstance(); + if (!(servletInstance instanceof jakarta.servlet.Servlet)) { + log.error() + .attr("servlet", servletWithClassLoader) + .attr("type", servletInstance.getClass().getName()) + .attr("match", servletWithClassLoader.getServletType()) + .log("AdditionalServletWithClassLoader has invalid servlet instance type which" + + " doesn't match . Skipping."); + try { + servletWithClassLoader.close(); + } catch (Exception e) { + log.error() + .attr("servlet", servletWithClassLoader) + .exception(e) + .log("Failed to close servlet ."); + } + continue; + } ServletHolder servletHolder = - new ServletHolder((Servlet) servletInstance); + new ServletHolder((jakarta.servlet.Servlet) servletInstance); webService.addServlet(servletWithClassLoader.getBasePath(), servletHolder, config.isAuthenticationEnabled(), attributeMap); log.info() diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/AdminResource.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/AdminResource.java index b43f17e9cb8b8..b8214962324fe 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/AdminResource.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/AdminResource.java @@ -21,6 +21,11 @@ import com.fasterxml.jackson.databind.ObjectReader; import com.fasterxml.jackson.databind.ObjectWriter; import com.google.errorprone.annotations.CanIgnoreReturnValue; +import jakarta.servlet.ServletContext; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -34,11 +39,6 @@ import java.util.concurrent.CompletionException; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import javax.servlet.ServletContext; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; import org.apache.bookkeeper.client.BookKeeper; import org.apache.bookkeeper.mledger.ManagedLedgerException; import org.apache.commons.lang3.StringUtils; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/BrokerStatsBase.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/BrokerStatsBase.java index c97238e28464e..9bdfad4d457e5 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/BrokerStatsBase.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/BrokerStatsBase.java @@ -21,15 +21,15 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Response.Status; +import jakarta.ws.rs.core.StreamingOutput; import java.io.OutputStream; import java.util.Collection; import java.util.Map; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response.Status; -import javax.ws.rs.core.StreamingOutput; import org.apache.bookkeeper.mledger.proto.PendingBookieOpsStats; import org.apache.pulsar.broker.admin.AdminResource; import org.apache.pulsar.broker.loadbalance.LoadManager; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/BrokersBase.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/BrokersBase.java index 07a423d61d842..e4774932ab56e 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/BrokersBase.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/BrokersBase.java @@ -23,6 +23,17 @@ import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.container.Suspended; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; @@ -32,17 +43,6 @@ import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; -import javax.ws.rs.DELETE; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.QueryParam; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.container.Suspended; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; import org.apache.commons.lang3.StringUtils; import org.apache.pulsar.PulsarVersion; import org.apache.pulsar.broker.PulsarService.State; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/ClustersBase.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/ClustersBase.java index 7b5111442640b..8b9c8f9e0bb64 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/ClustersBase.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/ClustersBase.java @@ -18,13 +18,26 @@ */ package org.apache.pulsar.broker.admin.impl; -import static javax.ws.rs.core.Response.Status.PRECONDITION_FAILED; +import static jakarta.ws.rs.core.Response.Status.PRECONDITION_FAILED; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import io.swagger.annotations.Example; import io.swagger.annotations.ExampleProperty; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.container.Suspended; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; @@ -37,19 +50,6 @@ import java.util.concurrent.CompletableFuture; import java.util.regex.Pattern; import java.util.stream.Collectors; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.QueryParam; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.container.Suspended; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; import org.apache.bookkeeper.common.util.JsonUtil; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.tuple.Pair; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/FunctionsBase.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/FunctionsBase.java index 42971ae231c05..106fc935d7d16 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/FunctionsBase.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/FunctionsBase.java @@ -24,20 +24,20 @@ import io.swagger.annotations.ApiResponses; import io.swagger.annotations.Example; import io.swagger.annotations.ExampleProperty; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.StreamingOutput; import java.io.IOException; import java.io.InputStream; import java.util.List; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.StreamingOutput; import org.apache.pulsar.broker.admin.AdminResource; import org.apache.pulsar.common.functions.FunctionConfig; import org.apache.pulsar.common.functions.FunctionDefinition; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/MetadataMigrationBase.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/MetadataMigrationBase.java index 8f225bc11c726..ee0e39ba2d7ee 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/MetadataMigrationBase.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/MetadataMigrationBase.java @@ -22,11 +22,11 @@ import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.Response; import org.apache.pulsar.broker.admin.AdminResource; import org.apache.pulsar.broker.web.RestException; import org.apache.pulsar.common.migration.MigrationState; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/NamespacesBase.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/NamespacesBase.java index 78cf5e6a5ec95..baff684bd08c8 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/NamespacesBase.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/NamespacesBase.java @@ -20,6 +20,12 @@ import static org.apache.pulsar.common.policies.data.PoliciesUtil.getBundles; import com.google.common.collect.Sets; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.container.CompletionCallback; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; +import jakarta.ws.rs.core.UriBuilder; import java.lang.reflect.Field; import java.net.MalformedURLException; import java.net.URI; @@ -43,12 +49,6 @@ import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.container.CompletionCallback; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; -import javax.ws.rs.core.UriBuilder; import org.apache.bookkeeper.mledger.LedgerOffloader; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.ListUtils; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PackagesBase.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PackagesBase.java index ea2868e259e82..a2fdfeafcb450 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PackagesBase.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PackagesBase.java @@ -18,14 +18,14 @@ */ package org.apache.pulsar.broker.admin.impl; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.StreamingOutput; import java.io.InputStream; import java.nio.file.FileAlreadyExistsException; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.StreamingOutput; import org.apache.pulsar.broker.admin.AdminResource; import org.apache.pulsar.broker.web.RestException; import org.apache.pulsar.common.naming.NamespaceName; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java index 5f110f503abb9..a991ca715d8a1 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java @@ -30,6 +30,12 @@ import com.google.common.collect.Sets; import com.google.gson.Gson; import io.netty.buffer.ByteBuf; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.ResponseBuilder; +import jakarta.ws.rs.core.Response.Status; +import jakarta.ws.rs.core.StreamingOutput; import java.io.IOException; import java.io.UncheckedIOException; import java.util.ArrayList; @@ -49,12 +55,6 @@ import java.util.function.BiConsumer; import java.util.stream.Collectors; import java.util.stream.IntStream; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.ResponseBuilder; -import javax.ws.rs.core.Response.Status; -import javax.ws.rs.core.StreamingOutput; import org.apache.bookkeeper.mledger.AsyncCallbacks; import org.apache.bookkeeper.mledger.AsyncCallbacks.ManagedLedgerInfoCallback; import org.apache.bookkeeper.mledger.Entry; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/ResourceGroupsBase.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/ResourceGroupsBase.java index 44138d9f16a20..cb9cbee111202 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/ResourceGroupsBase.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/ResourceGroupsBase.java @@ -18,8 +18,8 @@ */ package org.apache.pulsar.broker.admin.impl; +import jakarta.ws.rs.core.Response; import java.util.List; -import javax.ws.rs.core.Response; import org.apache.pulsar.broker.admin.AdminResource; import org.apache.pulsar.broker.web.RestException; import org.apache.pulsar.common.naming.NamespaceName; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/SchemasResourceBase.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/SchemasResourceBase.java index a9c50b3a7cffe..37f3c3a7675c6 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/SchemasResourceBase.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/SchemasResourceBase.java @@ -21,6 +21,7 @@ import static java.util.Objects.isNull; import static org.apache.commons.lang3.StringUtils.defaultIfEmpty; import com.google.common.annotations.VisibleForTesting; +import jakarta.ws.rs.core.Response; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; @@ -28,7 +29,6 @@ import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; -import javax.ws.rs.core.Response; import org.apache.commons.lang3.tuple.Pair; import org.apache.pulsar.broker.admin.AdminResource; import org.apache.pulsar.broker.service.schema.BookkeeperSchemaStorage; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/SinksBase.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/SinksBase.java index 0a76fe27e0a35..5250f9dfe76ec 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/SinksBase.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/SinksBase.java @@ -24,18 +24,18 @@ import io.swagger.annotations.ApiResponses; import io.swagger.annotations.Example; import io.swagger.annotations.ExampleProperty; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import java.io.IOException; import java.io.InputStream; import java.util.List; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; import org.apache.pulsar.broker.admin.AdminResource; import org.apache.pulsar.common.functions.UpdateOptionsImpl; import org.apache.pulsar.common.io.ConfigFieldDefinition; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/SourcesBase.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/SourcesBase.java index 0d037dd42362f..1295ea0cb6bd5 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/SourcesBase.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/SourcesBase.java @@ -24,18 +24,18 @@ import io.swagger.annotations.ApiResponses; import io.swagger.annotations.Example; import io.swagger.annotations.ExampleProperty; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import java.io.IOException; import java.io.InputStream; import java.util.List; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; import org.apache.pulsar.broker.admin.AdminResource; import org.apache.pulsar.common.functions.UpdateOptionsImpl; import org.apache.pulsar.common.io.ConfigFieldDefinition; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/TenantsBase.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/TenantsBase.java index 22df40292c113..36546c31a9cb1 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/TenantsBase.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/TenantsBase.java @@ -22,24 +22,24 @@ import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.container.Suspended; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; -import javax.ws.rs.DELETE; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.QueryParam; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.container.Suspended; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; import org.apache.commons.lang3.StringUtils; import org.apache.pulsar.broker.web.PulsarWebResource; import org.apache.pulsar.broker.web.RestException; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/TransactionsBase.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/TransactionsBase.java index e26bca04c6ca9..671e2d631c3d2 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/TransactionsBase.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/TransactionsBase.java @@ -18,10 +18,12 @@ */ package org.apache.pulsar.broker.admin.impl; -import static javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; -import static javax.ws.rs.core.Response.Status.METHOD_NOT_ALLOWED; -import static javax.ws.rs.core.Response.Status.NOT_FOUND; -import static javax.ws.rs.core.Response.Status.SERVICE_UNAVAILABLE; +import static jakarta.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; +import static jakarta.ws.rs.core.Response.Status.METHOD_NOT_ALLOWED; +import static jakarta.ws.rs.core.Response.Status.NOT_FOUND; +import static jakarta.ws.rs.core.Response.Status.SERVICE_UNAVAILABLE; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.core.Response; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -30,8 +32,6 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.core.Response; import org.apache.bookkeeper.mledger.ManagedLedger; import org.apache.bookkeeper.mledger.Position; import org.apache.pulsar.broker.PulsarServerException; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Bookies.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Bookies.java index a27fe599fb117..1a5512abf8abd 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Bookies.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Bookies.java @@ -23,22 +23,22 @@ import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.container.Suspended; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.Set; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.container.Suspended; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; import org.apache.bookkeeper.client.BookKeeper; import org.apache.bookkeeper.discover.RegistrationClient; import org.apache.bookkeeper.meta.MetadataClientDriver; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/BrokerStats.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/BrokerStats.java index 31b999c389430..e0b148a0c7fe4 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/BrokerStats.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/BrokerStats.java @@ -22,15 +22,15 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.StreamingOutput; import java.io.OutputStream; import java.util.Collection; import java.util.Map; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.StreamingOutput; import org.apache.pulsar.broker.admin.impl.BrokerStatsBase; import org.apache.pulsar.broker.loadbalance.ResourceUnit; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Brokers.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Brokers.java index 71edaef5b455d..0390f20e4baa9 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Brokers.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Brokers.java @@ -19,9 +19,9 @@ package org.apache.pulsar.broker.admin.v2; import io.swagger.annotations.Api; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import org.apache.pulsar.broker.admin.impl.BrokersBase; @Path("/brokers") diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Clusters.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Clusters.java index 617f85780af49..5b2b4f66a2f66 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Clusters.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Clusters.java @@ -19,9 +19,9 @@ package org.apache.pulsar.broker.admin.v2; import io.swagger.annotations.Api; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import org.apache.pulsar.broker.admin.impl.ClustersBase; @Path("/clusters") diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/ExtNonPersistentTopics.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/ExtNonPersistentTopics.java index 55aa9b62ab3c1..c9f30ceb194c4 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/ExtNonPersistentTopics.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/ExtNonPersistentTopics.java @@ -24,17 +24,17 @@ import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; -import javax.ws.rs.Consumes; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.Encoded; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.container.Suspended; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.Encoded; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.container.Suspended; +import jakarta.ws.rs.core.MediaType; import org.apache.pulsar.broker.admin.impl.PersistentTopicsBase; import org.apache.pulsar.common.partition.PartitionedTopicMetadata; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/ExtPersistentTopics.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/ExtPersistentTopics.java index 190bf3187a2b3..888c8e47270a8 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/ExtPersistentTopics.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/ExtPersistentTopics.java @@ -24,17 +24,17 @@ import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; -import javax.ws.rs.Consumes; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.Encoded; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.container.Suspended; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.Encoded; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.container.Suspended; +import jakarta.ws.rs.core.MediaType; import org.apache.pulsar.broker.admin.impl.PersistentTopicsBase; import org.apache.pulsar.common.partition.PartitionedTopicMetadata; import org.apache.pulsar.common.policies.data.PolicyName; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Functions.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Functions.java index cc7e056286ee3..9f510eef0dbc6 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Functions.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Functions.java @@ -22,20 +22,20 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.io.IOException; import java.io.InputStream; import java.util.List; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import org.apache.pulsar.broker.admin.AdminResource; import org.apache.pulsar.client.api.Message; import org.apache.pulsar.common.io.ConnectorDefinition; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/MetadataMigration.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/MetadataMigration.java index e86450ce60be2..53bf8b84371ac 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/MetadataMigration.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/MetadataMigration.java @@ -19,9 +19,9 @@ package org.apache.pulsar.broker.admin.v2; import io.swagger.annotations.Api; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import org.apache.pulsar.broker.admin.impl.MetadataMigrationBase; /** diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Namespaces.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Namespaces.java index e87c34ba7691f..75ac7cf79adcb 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Namespaces.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Namespaces.java @@ -25,28 +25,28 @@ import io.swagger.annotations.ApiResponses; import io.swagger.annotations.Example; import io.swagger.annotations.ExampleProperty; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.container.Suspended; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.StreamingOutput; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.container.Suspended; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.StreamingOutput; import org.apache.pulsar.broker.admin.AdminResource; import org.apache.pulsar.broker.admin.impl.NamespacesBase; import org.apache.pulsar.broker.admin.impl.OffloaderObjectsScannerUtils; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/NonPersistentTopics.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/NonPersistentTopics.java index 52c4addd9914e..d54a3698342c8 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/NonPersistentTopics.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/NonPersistentTopics.java @@ -23,6 +23,22 @@ import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.Encoded; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.container.Suspended; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -31,22 +47,6 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.stream.Collectors; -import javax.ws.rs.DELETE; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.Encoded; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.container.Suspended; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; import org.apache.commons.lang3.StringUtils; import org.apache.pulsar.broker.PulsarServerException; import org.apache.pulsar.broker.service.Topic; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/PersistentTopics.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/PersistentTopics.java index a1013ef8b6aa2..5903ceab3803a 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/PersistentTopics.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/PersistentTopics.java @@ -25,6 +25,21 @@ import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.Encoded; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.container.Suspended; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -32,21 +47,6 @@ import java.util.Optional; import java.util.Set; import java.util.concurrent.CompletableFuture; -import javax.ws.rs.DELETE; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.Encoded; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.container.Suspended; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import org.apache.bookkeeper.mledger.Position; import org.apache.bookkeeper.mledger.PositionFactory; import org.apache.commons.collections4.CollectionUtils; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/ResourceGroups.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/ResourceGroups.java index 396a77fee81c9..f0cef0f8edef3 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/ResourceGroups.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/ResourceGroups.java @@ -22,15 +22,15 @@ import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import java.util.List; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; import org.apache.pulsar.broker.admin.impl.ResourceGroupsBase; import org.apache.pulsar.common.policies.data.ResourceGroup; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/ResourceQuotas.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/ResourceQuotas.java index 88be1e0d84bc2..7ec64f3af51a0 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/ResourceQuotas.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/ResourceQuotas.java @@ -23,17 +23,17 @@ import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.container.Suspended; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.container.Suspended; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import org.apache.pulsar.broker.admin.impl.ResourceQuotasBase; import org.apache.pulsar.common.policies.data.ResourceQuota; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/ScalableTopics.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/ScalableTopics.java index 8c310c803ef10..3fdb7ff75d056 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/ScalableTopics.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/ScalableTopics.java @@ -23,6 +23,22 @@ import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.Encoded; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.container.Suspended; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriBuilder; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; @@ -31,22 +47,6 @@ import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.function.Function; -import javax.ws.rs.DELETE; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.Encoded; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.container.Suspended; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriBuilder; import lombok.CustomLog; import org.apache.pulsar.broker.admin.AdminResource; import org.apache.pulsar.broker.resources.ScalableTopicMetadata; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/SchemasResource.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/SchemasResource.java index 89a441b7c0a36..6c33de66ac317 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/SchemasResource.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/SchemasResource.java @@ -26,20 +26,20 @@ import io.swagger.annotations.ApiResponses; import io.swagger.annotations.Example; import io.swagger.annotations.ExampleProperty; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.Encoded; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.container.Suspended; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.Encoded; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.container.Suspended; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import org.apache.pulsar.broker.admin.impl.SchemasResourceBase; import org.apache.pulsar.broker.service.schema.exceptions.IncompatibleSchemaException; import org.apache.pulsar.broker.service.schema.exceptions.InvalidSchemaDataException; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Segments.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Segments.java index e8d4eeff65449..1a9c02778237c 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Segments.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Segments.java @@ -23,23 +23,23 @@ import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.Encoded; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.container.Suspended; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.util.List; import java.util.Optional; import java.util.concurrent.CompletableFuture; -import javax.ws.rs.DELETE; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.Encoded; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.container.Suspended; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import lombok.CustomLog; import org.apache.pulsar.broker.admin.AdminResource; import org.apache.pulsar.broker.service.Topic; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Tenants.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Tenants.java index 59525e6fe530c..6ebeb568e53d8 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Tenants.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Tenants.java @@ -19,10 +19,10 @@ package org.apache.pulsar.broker.admin.v2; import io.swagger.annotations.Api; -import javax.ws.rs.Consumes; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import org.apache.pulsar.broker.admin.impl.TenantsBase; @Path("/tenants") diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Worker.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Worker.java index b6cd370b832bd..a4e473d07770e 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Worker.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Worker.java @@ -21,17 +21,17 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.MediaType; import java.io.IOException; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.function.Supplier; -import javax.ws.rs.GET; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.MediaType; import org.apache.pulsar.broker.admin.AdminResource; import org.apache.pulsar.client.admin.LongRunningProcessStatus; import org.apache.pulsar.common.functions.WorkerInfo; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/WorkerStats.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/WorkerStats.java index 128a014c01777..0433d05885c01 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/WorkerStats.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/WorkerStats.java @@ -21,13 +21,13 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import java.io.IOException; import java.util.Collection; import java.util.List; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; import org.apache.pulsar.broker.admin.AdminResource; import org.apache.pulsar.common.policies.data.WorkerFunctionInstanceStats; import org.apache.pulsar.common.stats.Metrics; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Functions.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Functions.java index 78b581de0c06d..61d70f9e9f4a2 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Functions.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Functions.java @@ -19,10 +19,10 @@ package org.apache.pulsar.broker.admin.v3; import io.swagger.annotations.Api; -import javax.ws.rs.Consumes; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import org.apache.pulsar.broker.admin.impl.FunctionsBase; @Path("/functions") diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Packages.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Packages.java index 4ca7e3948ff5a..b69e451389489 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Packages.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Packages.java @@ -22,20 +22,20 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.container.Suspended; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.StreamingOutput; import java.io.InputStream; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.container.Suspended; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.StreamingOutput; import org.apache.pulsar.broker.admin.impl.PackagesBase; import org.apache.pulsar.broker.web.RestException; import org.apache.pulsar.packages.management.core.common.PackageMetadata; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Sink.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Sink.java index 59f2c698c8fb2..e5af5087dac6a 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Sink.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Sink.java @@ -19,10 +19,10 @@ package org.apache.pulsar.broker.admin.v3; import io.swagger.annotations.Api; -import javax.ws.rs.Consumes; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import org.apache.pulsar.broker.admin.impl.SinksBase; @Path("/sink") diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Sinks.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Sinks.java index 0eb077f2b117f..5beb33c6ffeae 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Sinks.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Sinks.java @@ -19,10 +19,10 @@ package org.apache.pulsar.broker.admin.v3; import io.swagger.annotations.Api; -import javax.ws.rs.Consumes; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import org.apache.pulsar.broker.admin.impl.SinksBase; @Path("/sinks") diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Source.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Source.java index 9b3ce2b4b516d..057696d693653 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Source.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Source.java @@ -19,10 +19,10 @@ package org.apache.pulsar.broker.admin.v3; import io.swagger.annotations.Api; -import javax.ws.rs.Consumes; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import org.apache.pulsar.broker.admin.impl.SourcesBase; @Path("/source") diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Sources.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Sources.java index 57aa223f44202..6b54331bd34c2 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Sources.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Sources.java @@ -19,10 +19,10 @@ package org.apache.pulsar.broker.admin.v3; import io.swagger.annotations.Api; -import javax.ws.rs.Consumes; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import org.apache.pulsar.broker.admin.impl.SourcesBase; @Path("/sources") diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Transactions.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Transactions.java index 4d845364a7eea..31f87d3ae491a 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Transactions.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Transactions.java @@ -18,26 +18,26 @@ */ package org.apache.pulsar.broker.admin.v3; -import static javax.ws.rs.core.Response.Status.METHOD_NOT_ALLOWED; -import static javax.ws.rs.core.Response.Status.NOT_FOUND; -import static javax.ws.rs.core.Response.Status.SERVICE_UNAVAILABLE; +import static jakarta.ws.rs.core.Response.Status.METHOD_NOT_ALLOWED; +import static jakarta.ws.rs.core.Response.Status.NOT_FOUND; +import static jakarta.ws.rs.core.Response.Status.SERVICE_UNAVAILABLE; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; -import javax.ws.rs.Consumes; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.Encoded; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.container.Suspended; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.Encoded; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.container.Suspended; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import org.apache.bookkeeper.mledger.Position; import org.apache.bookkeeper.mledger.PositionFactory; import org.apache.pulsar.broker.admin.impl.TransactionsBase; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/intercept/BrokerInterceptor.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/intercept/BrokerInterceptor.java index 0ade5e0b91bb3..0debde6cb01ca 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/intercept/BrokerInterceptor.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/intercept/BrokerInterceptor.java @@ -19,12 +19,12 @@ package org.apache.pulsar.broker.intercept; import io.netty.buffer.ByteBuf; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; import java.io.IOException; import java.util.Map; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; import org.apache.bookkeeper.mledger.Entry; import org.apache.pulsar.broker.PulsarService; import org.apache.pulsar.broker.service.Consumer; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/intercept/BrokerInterceptorWithClassLoader.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/intercept/BrokerInterceptorWithClassLoader.java index 231259c268dab..b030c5940bf6c 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/intercept/BrokerInterceptorWithClassLoader.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/intercept/BrokerInterceptorWithClassLoader.java @@ -20,12 +20,12 @@ import com.google.common.annotations.VisibleForTesting; import io.netty.buffer.ByteBuf; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; import java.io.IOException; import java.util.Map; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; import lombok.CustomLog; import lombok.Data; import lombok.RequiredArgsConstructor; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/intercept/BrokerInterceptors.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/intercept/BrokerInterceptors.java index c44a88f31f513..698f52ca9f6e8 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/intercept/BrokerInterceptors.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/intercept/BrokerInterceptors.java @@ -20,12 +20,12 @@ import com.google.common.annotations.VisibleForTesting; import io.netty.buffer.ByteBuf; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; import java.io.IOException; import java.util.LinkedHashMap; import java.util.Map; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; import lombok.CustomLog; import org.apache.bookkeeper.mledger.Entry; import org.apache.pulsar.broker.PulsarService; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/lookup/LookupResult.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/lookup/LookupResult.java index f27cf763a9622..58d33e53639d4 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/lookup/LookupResult.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/lookup/LookupResult.java @@ -19,14 +19,14 @@ package org.apache.pulsar.broker.lookup; import static org.apache.pulsar.broker.lookup.v2.TopicLookup.LISTENERNAME_PARAM; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriBuilder; import java.net.URI; import java.util.Map; import java.util.Objects; import java.util.function.Function; import java.util.function.Predicate; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriBuilder; import lombok.Builder; import lombok.Getter; import org.apache.commons.lang3.StringUtils; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/lookup/TopicLookupBase.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/lookup/TopicLookupBase.java index dd08fc10e91ae..adcb40efe0002 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/lookup/TopicLookupBase.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/lookup/TopicLookupBase.java @@ -21,15 +21,15 @@ import static org.apache.pulsar.common.protocol.Commands.newLookupErrorResponse; import static org.apache.pulsar.common.protocol.Commands.newLookupResponse; import io.netty.buffer.ByteBuf; +import jakarta.ws.rs.Encoded; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Response; import java.net.InetAddress; import java.net.URI; import java.util.Map; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Semaphore; -import javax.ws.rs.Encoded; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response; import org.apache.commons.lang3.StringUtils; import org.apache.pulsar.broker.PulsarServerException; import org.apache.pulsar.broker.PulsarService; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/lookup/v2/TopicLookup.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/lookup/v2/TopicLookup.java index f20aad596482b..3d0269dee2173 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/lookup/v2/TopicLookup.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/lookup/v2/TopicLookup.java @@ -22,17 +22,17 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.Encoded; -import javax.ws.rs.GET; -import javax.ws.rs.HeaderParam; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.container.Suspended; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.Encoded; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.HeaderParam; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.container.Suspended; +import jakarta.ws.rs.core.MediaType; import org.apache.commons.lang3.StringUtils; import org.apache.pulsar.broker.lookup.TopicLookupBase; import org.apache.pulsar.common.lookup.data.LookupData; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/rest/Topics.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/rest/Topics.java index e0a60a69725f4..6c8f88d4ce477 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/rest/Topics.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/rest/Topics.java @@ -23,17 +23,17 @@ import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; -import javax.ws.rs.Consumes; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.Encoded; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.container.Suspended; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.Encoded; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.container.Suspended; +import jakarta.ws.rs.core.MediaType; import org.apache.pulsar.websocket.data.ProducerMessages; @Path("/") diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/rest/TopicsBase.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/rest/TopicsBase.java index 8afd111c76dc7..d95b1c9324caa 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/rest/TopicsBase.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/rest/TopicsBase.java @@ -21,6 +21,9 @@ import static java.util.concurrent.TimeUnit.SECONDS; import com.fasterxml.jackson.databind.ObjectReader; import io.netty.buffer.ByteBuf; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; import java.io.IOException; import java.net.URI; import java.nio.ByteBuffer; @@ -41,9 +44,6 @@ import java.util.concurrent.Semaphore; import java.util.concurrent.TimeoutException; import java.util.stream.Collectors; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; import org.apache.avro.generic.GenericData; import org.apache.avro.generic.GenericDatumReader; import org.apache.avro.generic.GenericRecord; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/ServerCnx.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/ServerCnx.java index 11ce47e06dbcf..8b7ec2134fbc7 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/ServerCnx.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/ServerCnx.java @@ -19,8 +19,8 @@ package org.apache.pulsar.broker.service; import static com.google.common.base.Preconditions.checkArgument; -import static javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; -import static javax.ws.rs.core.Response.Status.NOT_FOUND; +import static jakarta.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; +import static jakarta.ws.rs.core.Response.Status.NOT_FOUND; import static org.apache.commons.lang3.StringUtils.EMPTY; import static org.apache.commons.lang3.StringUtils.isNotBlank; import static org.apache.pulsar.broker.admin.impl.PersistentTopicsBase.unsafeGetPartitionedTopicMetadataAsync; @@ -45,6 +45,8 @@ import io.netty.util.concurrent.FastThreadLocal; import io.netty.util.concurrent.Promise; import io.netty.util.concurrent.ScheduledFuture; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Response; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.ArrayList; @@ -66,8 +68,6 @@ import java.util.stream.Collectors; import javax.naming.AuthenticationException; import javax.net.ssl.SSLSession; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response; import lombok.Getter; import org.apache.bookkeeper.mledger.AsyncCallbacks; import org.apache.bookkeeper.mledger.Entry; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/stats/prometheus/PulsarPrometheusMetricsServlet.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/stats/prometheus/PulsarPrometheusMetricsServlet.java index 3429605e3d73c..f310e25ed78c9 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/stats/prometheus/PulsarPrometheusMetricsServlet.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/stats/prometheus/PulsarPrometheusMetricsServlet.java @@ -19,6 +19,12 @@ package org.apache.pulsar.broker.stats.prometheus; import static org.apache.pulsar.broker.web.GzipHandlerUtil.isGzipCompressionEnabledForEndpoint; +import jakarta.servlet.AsyncContext; +import jakarta.servlet.AsyncEvent; +import jakarta.servlet.AsyncListener; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.EOFException; import java.io.IOException; import java.nio.ByteBuffer; @@ -27,15 +33,9 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; -import javax.servlet.AsyncContext; -import javax.servlet.AsyncEvent; -import javax.servlet.AsyncListener; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.CustomLog; import org.apache.pulsar.broker.PulsarService; -import org.eclipse.jetty.ee8.nested.HttpOutput; +import org.eclipse.jetty.ee10.servlet.HttpOutput; @CustomLog public class PulsarPrometheusMetricsServlet extends PrometheusMetricsServlet { diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/ExceptionHandler.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/ExceptionHandler.java index 176e4fae1f105..5c2d1dfa971a7 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/ExceptionHandler.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/ExceptionHandler.java @@ -18,10 +18,10 @@ */ package org.apache.pulsar.broker.web; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.core.Response; import java.io.IOException; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.core.Response; import lombok.CustomLog; import org.apache.pulsar.common.intercept.InterceptException; import org.apache.pulsar.common.policies.data.ErrorData; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/MaxRequestSizeFilter.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/MaxRequestSizeFilter.java index 29411b7d273c3..7e2aafc621307 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/MaxRequestSizeFilter.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/MaxRequestSizeFilter.java @@ -18,15 +18,15 @@ */ package org.apache.pulsar.broker.web; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; public class MaxRequestSizeFilter implements Filter { diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/PreInterceptFilter.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/PreInterceptFilter.java index a3e97501c11c9..288071367752f 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/PreInterceptFilter.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/PreInterceptFilter.java @@ -18,17 +18,17 @@ */ package org.apache.pulsar.broker.web; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.MediaType; import java.io.IOException; import java.util.Locale; import java.util.Objects; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.MediaType; import lombok.CustomLog; import org.apache.pulsar.broker.intercept.BrokerInterceptor; import org.apache.pulsar.common.intercept.InterceptException; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/ProcessHandlerFilter.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/ProcessHandlerFilter.java index d2dae40056a70..e45e0386b8dbd 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/ProcessHandlerFilter.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/ProcessHandlerFilter.java @@ -18,16 +18,16 @@ */ package org.apache.pulsar.broker.web; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.ws.rs.core.MediaType; import java.io.IOException; import java.util.Locale; import java.util.Objects; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.ws.rs.core.MediaType; import org.apache.pulsar.broker.intercept.BrokerInterceptor; public class ProcessHandlerFilter implements Filter { diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/PulsarWebResource.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/PulsarWebResource.java index 5bf0ea14da777..e7aeff86ccc74 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/PulsarWebResource.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/PulsarWebResource.java @@ -28,6 +28,15 @@ import com.google.common.collect.BoundType; import com.google.common.collect.Range; import com.google.common.collect.Sets; +import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; +import jakarta.ws.rs.core.UriBuilder; +import jakarta.ws.rs.core.UriInfo; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; @@ -39,15 +48,6 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.function.Supplier; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; -import javax.ws.rs.core.UriBuilder; -import javax.ws.rs.core.UriInfo; import lombok.Setter; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/RequestWrapper.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/RequestWrapper.java index afebbd276eba8..2bd0d166d9953 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/RequestWrapper.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/RequestWrapper.java @@ -18,15 +18,15 @@ */ package org.apache.pulsar.broker.web; +import jakarta.servlet.ReadListener; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.Charset; -import javax.servlet.ReadListener; -import javax.servlet.ServletInputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; import org.apache.commons.io.IOUtils; /** diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/ResponseHandlerFilter.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/ResponseHandlerFilter.java index 46fca8ba33bb1..2a7f44fa5e9bc 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/ResponseHandlerFilter.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/ResponseHandlerFilter.java @@ -18,21 +18,21 @@ */ package org.apache.pulsar.broker.web; +import jakarta.servlet.AsyncEvent; +import jakarta.servlet.AsyncListener; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response.Status; import java.io.IOException; import java.util.Locale; import java.util.Objects; -import javax.servlet.AsyncEvent; -import javax.servlet.AsyncListener; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response.Status; import lombok.CustomLog; import org.apache.pulsar.broker.PulsarService; import org.apache.pulsar.broker.intercept.BrokerInterceptor; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/RestException.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/RestException.java index c3ae3a495cfd5..e7721c25bca6a 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/RestException.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/RestException.java @@ -18,12 +18,12 @@ */ package org.apache.pulsar.broker.web; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; import java.io.PrintWriter; import java.io.StringWriter; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; import org.apache.pulsar.client.admin.PulsarAdminException; import org.apache.pulsar.common.policies.data.ErrorData; diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/WebService.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/WebService.java index 96db579163922..27772fc827bfe 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/WebService.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/WebService.java @@ -18,8 +18,15 @@ */ package org.apache.pulsar.broker.web; -import static org.eclipse.jetty.ee8.nested.Request.getBaseRequest; import io.prometheus.client.CollectorRegistry; +import jakarta.servlet.DispatcherType; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URI; import java.util.ArrayList; @@ -32,14 +39,6 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; -import javax.servlet.DispatcherType; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletResponse; import lombok.CustomLog; import lombok.Getter; import org.apache.commons.lang3.StringUtils; @@ -54,13 +53,12 @@ import org.apache.pulsar.common.util.PulsarSslFactory; import org.apache.pulsar.jetty.metrics.JettyStatisticsCollector; import org.apache.pulsar.jetty.tls.JettySslContextFactory; -import org.eclipse.jetty.ee8.nested.ContextHandler; -import org.eclipse.jetty.ee8.nested.ResourceHandler; -import org.eclipse.jetty.ee8.servlet.FilterHolder; -import org.eclipse.jetty.ee8.servlet.ServletContextHandler; -import org.eclipse.jetty.ee8.servlet.ServletHolder; -import org.eclipse.jetty.ee8.websocket.server.JettyWebSocketServlet; -import org.eclipse.jetty.ee8.websocket.server.config.JettyWebSocketServletContainerInitializer; +import org.eclipse.jetty.ee10.servlet.FilterHolder; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; +import org.eclipse.jetty.ee10.servlet.ServletContextRequest; +import org.eclipse.jetty.ee10.servlet.ServletHolder; +import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServlet; +import org.eclipse.jetty.ee10.websocket.server.config.JettyWebSocketServletContainerInitializer; import org.eclipse.jetty.http.UriCompliance; import org.eclipse.jetty.server.ConnectionFactory; import org.eclipse.jetty.server.Connector; @@ -75,9 +73,11 @@ import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.SslConnectionFactory; +import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.server.handler.ContextHandlerCollection; import org.eclipse.jetty.server.handler.DefaultHandler; import org.eclipse.jetty.server.handler.QoSHandler; +import org.eclipse.jetty.server.handler.ResourceHandler; import org.eclipse.jetty.server.handler.StatisticsHandler; import org.eclipse.jetty.util.resource.ResourceFactory; import org.eclipse.jetty.util.ssl.SslContextFactory; @@ -390,7 +390,8 @@ public void init(FilterConfig filterConfig) throws ServletException { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - Connector connector = getBaseRequest(request).getHttpChannel().getConnector(); + Connector connector = ServletContextRequest.getServletContextRequest(request) + .getConnectionMetaData().getConnector(); BindAddress bindAddress = connectorToBindAddress.get(connector); if (bindAddress != null) { request.setAttribute(ATTRIBUTE_LISTENER_NAME, bindAddress.getListenerName()); @@ -415,6 +416,29 @@ public void addServlet(String path, ServletHolder servletHolder, boolean require } filterInitializer.addFilters(servletContextHandler, requiresAuthentication); + // The ee10 ServletContextHandler is itself an org.eclipse.jetty.server.Handler + handlers.add(servletContextHandler); + } + + /** + * Registers a legacy {@code javax.servlet}-based servlet in Jetty's ee8 environment. This path exists + * solely to keep existing {@code AdditionalServlet} plugins that report + * {@link org.apache.pulsar.broker.web.plugin.servlet.AdditionalServlet.AdditionalServletType#JAVAX_SERVLET} + * working without recompilation (PIP-472). Pulsar's own servlets and {@code jakarta.servlet} additional + * servlets use {@link #addServlet} (ee10). The broker filter chain is jakarta-typed (ee10) and is therefore + * not applied to the ee8 environment; legacy javax additional servlets run without the broker filter chain. + */ + public void addServletEe8(String path, org.eclipse.jetty.ee8.servlet.ServletHolder servletHolder, + boolean requiresAuthentication, Map attributeMap) { + org.eclipse.jetty.ee8.servlet.ServletContextHandler servletContextHandler = + new org.eclipse.jetty.ee8.servlet.ServletContextHandler( + org.eclipse.jetty.ee8.servlet.ServletContextHandler.SESSIONS); + servletContextHandler.setContextPath(path); + servletContextHandler.addServlet(servletHolder, MATCH_ALL); + if (attributeMap != null) { + attributeMap.forEach(servletContextHandler::setAttribute); + } + // The ee8 ServletContextHandler.get() bridges the ee8 context to a core org.eclipse.jetty.server.Handler handlers.add(servletContextHandler.get()); } @@ -425,7 +449,7 @@ public void addWebSocketServlet(String path, JettyWebSocketServlet webSocketServ JettyWebSocketServletContainerInitializer.configure(servletContextHandler, null); ServletHolder servletHolder = new ServletHolder(webSocketServlet); servletContextHandler.addServlet(servletHolder, MATCH_ALL); - handlers.add(servletContextHandler.get()); + handlers.add(servletContextHandler); } public void addStaticResources(String basePath, String resourcePath) { @@ -437,7 +461,7 @@ public void addStaticResources(String basePath, String resourcePath) { resHandler.setEtags(true); resHandler.setCacheControl(WebService.HANDLER_CACHE_CONTROL); capHandler.setHandler(resHandler); - handlers.add(capHandler.get()); + handlers.add(capHandler); } public void start() throws PulsarServerException { diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/BrokerAdditionalServletTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/BrokerAdditionalServletTest.java index 2e86cf44cd6b9..ae05762dfa23b 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/BrokerAdditionalServletTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/BrokerAdditionalServletTest.java @@ -18,15 +18,15 @@ */ package org.apache.pulsar.broker; +import jakarta.servlet.Servlet; +import jakarta.servlet.ServletConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; import java.io.IOException; import java.util.HashMap; import java.util.Map; -import javax.servlet.Servlet; -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletOutputStream; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; import lombok.CustomLog; import okhttp3.OkHttpClient; import okhttp3.Response; @@ -37,7 +37,6 @@ import org.apache.pulsar.broker.web.plugin.servlet.AdditionalServletWithPulsarService; import org.apache.pulsar.broker.web.plugin.servlet.AdditionalServlets; import org.apache.pulsar.common.configuration.PulsarConfiguration; -import org.eclipse.jetty.ee8.nested.Request; import org.mockito.Mockito; import org.testng.Assert; import org.testng.annotations.AfterClass; @@ -76,7 +75,7 @@ private void mockAdditionalServlet(PulsarService pulsar) { Mockito.when(brokerAdditionalServlet.getBasePath()).thenReturn(BASE_PATH); Mockito.when(brokerAdditionalServlet.getServletInstance()).thenReturn(servlet); Mockito.when(brokerAdditionalServlet.getServletType()) - .thenReturn(AdditionalServlet.AdditionalServletType.JAVAX_SERVLET); + .thenReturn(AdditionalServlet.AdditionalServletType.JAKARTA_SERVLET); AdditionalServletWithPulsarService brokerAdditionalServletWithPulsarService = new AdditionalServletWithPulsarService() { @@ -91,6 +90,11 @@ public void loadConfig(PulsarConfiguration pulsarConfiguration) { // No-op } + @Override + public AdditionalServletType getServletType() { + return AdditionalServletType.JAKARTA_SERVLET; + } + @Override public String getBasePath() { return WITH_PULSAR_SERVICE_BASE_PATH; @@ -148,7 +152,8 @@ public ServletConfig getServletConfig() { @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { - log.info().attr("path", ((Request) servletRequest).getHttpURI()).log("[service]"); + log.info().attr("path", + ((jakarta.servlet.http.HttpServletRequest) servletRequest).getRequestURI()).log("[service]"); String value = servletRequest.getParameterMap().get(QUERY_PARAM)[0]; ServletOutputStream servletOutputStream = servletResponse.getOutputStream(); servletResponse.setContentLength(value.getBytes().length); @@ -179,7 +184,8 @@ public WithPulsarServiceServlet(PulsarService pulsar) { @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { - log.info().attr("path", ((Request) servletRequest).getHttpURI()).log("[service]"); + log.info().attr("path", + ((jakarta.servlet.http.HttpServletRequest) servletRequest).getRequestURI()).log("[service]"); String value = pulsarService == null ? "null" : PulsarService.class.getName(); ServletOutputStream servletOutputStream = servletResponse.getOutputStream(); servletResponse.setContentLength(value.getBytes().length); diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApi2Test.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApi2Test.java index 9eb11d55cef1f..de2892b952780 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApi2Test.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApi2Test.java @@ -42,6 +42,8 @@ import com.google.common.collect.Lists; import com.google.common.collect.Sets; import io.grpc.netty.shaded.io.netty.util.concurrent.FastThreadLocal; +import jakarta.ws.rs.NotAcceptableException; +import jakarta.ws.rs.core.Response.Status; import java.lang.reflect.Field; import java.net.URI; import java.net.URL; @@ -65,8 +67,6 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import javax.ws.rs.NotAcceptableException; -import javax.ws.rs.core.Response.Status; import lombok.AllArgsConstructor; import lombok.Cleanup; import lombok.CustomLog; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiDynamicConfigurationsTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiDynamicConfigurationsTest.java index 92e5b103a58de..c7e3c2cc2be2e 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiDynamicConfigurationsTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiDynamicConfigurationsTest.java @@ -25,9 +25,9 @@ import static org.testng.Assert.assertNull; import static org.testng.Assert.assertThrows; import static org.testng.Assert.fail; +import jakarta.ws.rs.core.Response; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; -import javax.ws.rs.core.Response; import lombok.CustomLog; import org.apache.pulsar.broker.BrokerTestUtil; import org.apache.pulsar.broker.auth.MockedPulsarServiceBaseTest; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiGetLastMessageIdTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiGetLastMessageIdTest.java index 97b3cdd88da62..4be9cc8f33436 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiGetLastMessageIdTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiGetLastMessageIdTest.java @@ -22,6 +22,9 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; +import jakarta.servlet.ServletContext; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.container.TimeoutHandler; import java.util.Collection; import java.util.Date; import java.util.Map; @@ -29,9 +32,6 @@ import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; -import javax.servlet.ServletContext; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.container.TimeoutHandler; import org.apache.pulsar.broker.admin.v2.PersistentTopics; import org.apache.pulsar.broker.auth.MockedPulsarServiceBaseTest; import org.apache.pulsar.broker.authentication.AuthenticationDataHttps; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiOffloadTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiOffloadTest.java index 8966f4803dab6..74a3def92a273 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiOffloadTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiOffloadTest.java @@ -54,15 +54,15 @@ import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; import io.opentelemetry.api.common.Attributes; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.core.Response; import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.concurrent.CompletableFuture; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.core.Response; import org.apache.bookkeeper.mledger.LedgerOffloader; import org.apache.bookkeeper.mledger.ManagedLedgerInfo; import org.apache.pulsar.broker.auth.MockedPulsarServiceBaseTest; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiSubscriptionTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiSubscriptionTest.java index 24999cd69647b..8189fd284e9f4 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiSubscriptionTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiSubscriptionTest.java @@ -21,10 +21,10 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; import static org.testng.Assert.expectThrows; +import jakarta.ws.rs.core.Response; import java.util.HashMap; import java.util.Map; import java.util.UUID; -import javax.ws.rs.core.Response; import lombok.CustomLog; import org.apache.pulsar.broker.auth.MockedPulsarServiceBaseTest; import org.apache.pulsar.client.admin.PulsarAdminException; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTest.java index ce966b707aa87..c08cc1cc1626a 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTest.java @@ -36,6 +36,9 @@ import com.google.common.collect.Range; import com.google.common.hash.HashFunction; import com.google.common.hash.Hashing; +import jakarta.ws.rs.client.InvocationCallback; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.Response.Status; import java.lang.reflect.Field; import java.net.URL; import java.nio.charset.StandardCharsets; @@ -58,9 +61,6 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import javax.ws.rs.client.InvocationCallback; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.Response.Status; import lombok.Builder; import lombok.Cleanup; import lombok.CustomLog; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTlsAuthTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTlsAuthTest.java index 91f8cdae8a5bb..173e0557fb429 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTlsAuthTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTlsAuthTest.java @@ -18,6 +18,12 @@ */ package org.apache.pulsar.broker.admin; +import jakarta.ws.rs.NotAuthorizedException; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.GenericType; +import jakarta.ws.rs.core.MediaType; import java.io.File; import java.nio.file.Files; import java.nio.file.Path; @@ -29,12 +35,6 @@ import java.util.Set; import java.util.concurrent.TimeUnit; import javax.net.ssl.SSLContext; -import javax.ws.rs.NotAuthorizedException; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.GenericType; -import javax.ws.rs.core.MediaType; import lombok.Cleanup; import lombok.CustomLog; import org.apache.commons.lang3.mutable.MutableBoolean; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminResourceTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminResourceTest.java index d4980426f6830..9730c1563f0ab 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminResourceTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminResourceTest.java @@ -21,7 +21,7 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; -import javax.ws.rs.core.Response.Status; +import jakarta.ws.rs.core.Response.Status; import org.apache.pulsar.broker.service.BrokerTestBase; import org.apache.pulsar.broker.web.RestException; import org.apache.pulsar.common.util.Codec; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminRestTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminRestTest.java index f4372c36dbde5..b0abe7a855aba 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminRestTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminRestTest.java @@ -18,6 +18,12 @@ */ package org.apache.pulsar.broker.admin; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; @@ -25,12 +31,6 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import lombok.Cleanup; import lombok.CustomLog; import org.apache.pulsar.broker.auth.MockedPulsarServiceBaseTest; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminTest.java index f62002595bb11..735fafb9a8f84 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminTest.java @@ -35,6 +35,12 @@ import static org.testng.Assert.fail; import com.google.common.collect.Lists; import com.google.common.collect.Sets; +import jakarta.servlet.ServletContext; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; +import jakarta.ws.rs.core.StreamingOutput; +import jakarta.ws.rs.core.UriInfo; import java.lang.reflect.Field; import java.net.URI; import java.util.ArrayList; @@ -46,12 +52,6 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.CompletableFuture; -import javax.servlet.ServletContext; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; -import javax.ws.rs.core.StreamingOutput; -import javax.ws.rs.core.UriInfo; import lombok.AllArgsConstructor; import lombok.Data; import org.apache.bookkeeper.conf.ClientConfiguration; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/CreateSubscriptionTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/CreateSubscriptionTest.java index e8e9cc88f916d..bda0e32aefe5b 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/CreateSubscriptionTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/CreateSubscriptionTest.java @@ -22,14 +22,14 @@ import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; +import jakarta.ws.rs.ClientErrorException; +import jakarta.ws.rs.core.Response.Status; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; -import javax.ws.rs.ClientErrorException; -import javax.ws.rs.core.Response.Status; import lombok.Cleanup; import lombok.CustomLog; import org.apache.bookkeeper.mledger.impl.ManagedLedgerImpl; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/NamespacesTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/NamespacesTest.java index 0f93590858040..33f61a17b1b1a 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/NamespacesTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/NamespacesTest.java @@ -35,6 +35,15 @@ import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; import com.google.common.collect.Sets; +import jakarta.servlet.ServletContext; +import jakarta.ws.rs.BadRequestException; +import jakarta.ws.rs.ClientErrorException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; +import jakarta.ws.rs.core.UriBuilder; +import jakarta.ws.rs.core.UriInfo; import java.lang.reflect.Field; import java.net.URI; import java.time.Duration; @@ -56,15 +65,6 @@ import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.servlet.ServletContext; -import javax.ws.rs.BadRequestException; -import javax.ws.rs.ClientErrorException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; -import javax.ws.rs.core.UriBuilder; -import javax.ws.rs.core.UriInfo; import lombok.Cleanup; import lombok.CustomLog; import org.apache.bookkeeper.client.api.ReadHandle; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/NamespacesV2Test.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/NamespacesV2Test.java index 913e395c2bf46..1e7ecae9da8b9 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/NamespacesV2Test.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/NamespacesV2Test.java @@ -28,14 +28,14 @@ import static org.testng.Assert.assertNull; import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; +import jakarta.servlet.ServletContext; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriInfo; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Set; -import javax.servlet.ServletContext; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; import lombok.CustomLog; import org.apache.pulsar.broker.admin.v2.Namespaces; import org.apache.pulsar.broker.auth.MockedPulsarServiceBaseTest; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/PersistentTopicsTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/PersistentTopicsTest.java index 4f4a23ad26f10..ad9cb45e5aea3 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/PersistentTopicsTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/PersistentTopicsTest.java @@ -36,6 +36,12 @@ import static org.testng.Assert.assertSame; import static org.testng.Assert.assertThrows; import static org.testng.Assert.assertTrue; +import jakarta.servlet.ServletContext; +import jakarta.ws.rs.InternalServerErrorException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriInfo; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; @@ -48,12 +54,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; -import javax.servlet.ServletContext; -import javax.ws.rs.InternalServerErrorException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; import lombok.Cleanup; import lombok.CustomLog; import org.apache.bookkeeper.mledger.ManagedCursor; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/ResourceGroupsTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/ResourceGroupsTest.java index c1fa24ae87556..d9a58a71cb1e4 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/ResourceGroupsTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/ResourceGroupsTest.java @@ -23,12 +23,12 @@ import static org.mockito.Mockito.spy; import static org.testng.Assert.assertEquals; import static org.testng.Assert.fail; +import jakarta.servlet.ServletContext; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Set; -import javax.servlet.ServletContext; import org.apache.pulsar.broker.admin.v2.ResourceGroups; import org.apache.pulsar.broker.auth.MockedPulsarServiceBaseTest; import org.apache.pulsar.broker.web.RestException; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TopicPoliciesTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TopicPoliciesTest.java index 5ba979534ef55..f1e5d48f6115d 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TopicPoliciesTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TopicPoliciesTest.java @@ -30,6 +30,10 @@ import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; import com.fasterxml.jackson.databind.ObjectReader; +import jakarta.ws.rs.BadRequestException; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; @@ -46,10 +50,6 @@ import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; -import javax.ws.rs.BadRequestException; -import javax.ws.rs.client.Entity; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import lombok.Cleanup; import lombok.CustomLog; import org.apache.bookkeeper.mledger.ManagedLedgerConfig; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TopicsAuthTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TopicsAuthTest.java index cb2629d0684a8..cf93191c01e76 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TopicsAuthTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TopicsAuthTest.java @@ -22,18 +22,18 @@ import com.fasterxml.jackson.core.type.TypeReference; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.util.Base64; import java.util.EnumSet; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.crypto.SecretKey; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import org.apache.pulsar.broker.auth.MockedPulsarServiceBaseTest; import org.apache.pulsar.broker.authentication.AuthenticationProviderToken; import org.apache.pulsar.broker.authentication.utils.AuthTokenUtils; @@ -197,7 +197,7 @@ WebTarget buildWebClient() throws Exception { httpConfig.property(ClientProperties.ASYNC_THREADPOOL_SIZE, 8); httpConfig.register(MultiPartFeature.class); - javax.ws.rs.client.ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig(httpConfig); + jakarta.ws.rs.client.ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig(httpConfig); Client client = clientBuilder.build(); return client.target(brokerUrl.toString()); } diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TopicsTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TopicsTest.java index c3b6654ab44d9..650cc9f5fd046 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TopicsTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TopicsTest.java @@ -29,6 +29,10 @@ import static org.mockito.Mockito.verify; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriInfo; import java.io.ByteArrayOutputStream; import java.net.URI; import java.util.Arrays; @@ -38,10 +42,6 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; import lombok.AllArgsConstructor; import lombok.Cleanup; import lombok.Data; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TopicsWithoutTlsTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TopicsWithoutTlsTest.java index 904a90a291bd5..5d528d8cc6d51 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TopicsWithoutTlsTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TopicsWithoutTlsTest.java @@ -25,13 +25,13 @@ import static org.mockito.Mockito.verify; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriInfo; import java.net.URI; import java.util.List; import java.util.Optional; import java.util.Set; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; import lombok.Cleanup; import org.apache.commons.lang3.reflect.FieldUtils; import org.apache.pulsar.broker.PulsarService; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/v3/AsyncResponseTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/v3/AsyncResponseTest.java index 1536fb7fd0edb..65742967c7189 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/v3/AsyncResponseTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/v3/AsyncResponseTest.java @@ -38,12 +38,12 @@ * under the License. */ -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.container.Suspended; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.container.Suspended; +import jakarta.ws.rs.core.Response; import lombok.CustomLog; import org.apache.pulsar.broker.web.RestException; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/auth/AuthenticationServiceTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/auth/AuthenticationServiceTest.java index 916ab11128e03..31f96eb602433 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/auth/AuthenticationServiceTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/auth/AuthenticationServiceTest.java @@ -30,13 +30,13 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; import com.google.common.collect.Sets; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.LinkedHashSet; import java.util.Set; import java.util.concurrent.CompletableFuture; import javax.naming.AuthenticationException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.Cleanup; import org.apache.pulsar.broker.ServiceConfiguration; import org.apache.pulsar.broker.authentication.AuthenticationDataCommand; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/auth/MockedPulsarServiceBaseTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/auth/MockedPulsarServiceBaseTest.java index 6696076b83d64..d5cbb9ebece3d 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/auth/MockedPulsarServiceBaseTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/auth/MockedPulsarServiceBaseTest.java @@ -23,6 +23,8 @@ import static org.testng.Assert.assertEquals; import com.google.common.collect.Sets; import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.container.TimeoutHandler; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.net.InetSocketAddress; @@ -40,8 +42,6 @@ import java.util.concurrent.TimeUnit; import java.util.function.Consumer; import java.util.function.Predicate; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.container.TimeoutHandler; import lombok.AllArgsConstructor; import lombok.CustomLog; import lombok.Data; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/cache/PulsarLookupProxy.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/cache/PulsarLookupProxy.java index c493ee165a510..cfbf4379a3249 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/cache/PulsarLookupProxy.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/cache/PulsarLookupProxy.java @@ -18,15 +18,15 @@ */ package org.apache.pulsar.broker.cache; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.nio.charset.StandardCharsets; import java.util.Arrays; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.SneakyThrows; import org.eclipse.jetty.client.Response; -import org.eclipse.jetty.ee8.proxy.ProxyServlet; -import org.eclipse.jetty.ee8.servlet.ServletContextHandler; -import org.eclipse.jetty.ee8.servlet.ServletHolder; +import org.eclipse.jetty.ee10.proxy.ProxyServlet; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; +import org.eclipse.jetty.ee10.servlet.ServletHolder; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.util.Callback; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/BrokerInterceptorTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/BrokerInterceptorTest.java index 72f1c4f50094d..36b4d90b5879e 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/BrokerInterceptorTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/BrokerInterceptorTest.java @@ -278,7 +278,7 @@ public void onResponse(Call call, Response response) throws IOException { Assert.assertEquals(responseEvent.getRequestUri(), "/admin/v3/test/asyncGet/my-topic/1000"); Assert.assertEquals(responseEvent.getResponseStatus(), - javax.ws.rs.core.Response.noContent().build().getStatus()); + jakarta.ws.rs.core.Response.noContent().build().getStatus()); } public void requestInterceptorFailedTest() { diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/BrokerInterceptorWithClassLoaderTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/BrokerInterceptorWithClassLoaderTest.java index 6686cceb50795..1b363f858af4f 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/BrokerInterceptorWithClassLoaderTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/BrokerInterceptorWithClassLoaderTest.java @@ -24,11 +24,11 @@ import static org.mockito.Mockito.verify; import static org.testng.Assert.assertEquals; import io.netty.buffer.ByteBuf; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; import java.util.HashMap; import java.util.Map; -import javax.servlet.FilterChain; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; import org.apache.bookkeeper.mledger.Entry; import org.apache.pulsar.broker.PulsarService; import org.apache.pulsar.broker.service.Consumer; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/CounterBrokerInterceptor.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/CounterBrokerInterceptor.java index e7130c0fdd43b..4d70828b52ffb 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/CounterBrokerInterceptor.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/CounterBrokerInterceptor.java @@ -19,16 +19,16 @@ package org.apache.pulsar.broker.intercept; import io.netty.buffer.ByteBuf; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicInteger; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; import lombok.AllArgsConstructor; import lombok.CustomLog; import lombok.Data; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/ExceptionsBrokerInterceptor.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/ExceptionsBrokerInterceptor.java index f58d56c05a951..9d359cd88fa3f 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/ExceptionsBrokerInterceptor.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/ExceptionsBrokerInterceptor.java @@ -18,12 +18,12 @@ */ package org.apache.pulsar.broker.intercept; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; import java.io.IOException; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; import org.apache.pulsar.broker.PulsarService; import org.apache.pulsar.broker.service.Consumer; import org.apache.pulsar.broker.service.Producer; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/InterceptFilterOutTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/InterceptFilterOutTest.java index de71bde0f489d..5471e5fc65656 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/InterceptFilterOutTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/InterceptFilterOutTest.java @@ -20,17 +20,17 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ReadListener; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; +import jakarta.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.Charset; -import javax.servlet.FilterChain; -import javax.servlet.ReadListener; -import javax.servlet.ServletInputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; -import javax.servlet.http.HttpServletResponse; import org.apache.pulsar.broker.PulsarService; import org.apache.pulsar.broker.ServiceConfiguration; import org.apache.pulsar.broker.web.ExceptionHandler; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/MockBrokerInterceptor.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/MockBrokerInterceptor.java index 2c7ae11a75536..4e61f66a80925 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/MockBrokerInterceptor.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/MockBrokerInterceptor.java @@ -18,10 +18,10 @@ */ package org.apache.pulsar.broker.intercept; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; import java.io.IOException; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; import org.apache.pulsar.broker.PulsarService; import org.apache.pulsar.broker.service.ServerCnx; import org.apache.pulsar.common.api.proto.BaseCommand; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/LookupResultTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/LookupResultTest.java index 0571fa6915e2e..7b97ec5ed6152 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/LookupResultTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/LookupResultTest.java @@ -26,12 +26,12 @@ import static org.testng.Assert.assertThrows; import static org.testng.Assert.assertTrue; import static org.testng.Assert.expectThrows; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Response; import java.net.URI; import java.util.Collections; import java.util.HashMap; import java.util.Map; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response; import org.apache.pulsar.broker.loadbalance.extensions.data.BrokerLookupData; import org.apache.pulsar.broker.namespace.LookupOptions; import org.apache.pulsar.broker.namespace.NamespaceEphemeralData; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/HttpTopicLookupv2Test.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/HttpTopicLookupv2Test.java index 7ed70ed1701f5..e2a2537a9dfbf 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/HttpTopicLookupv2Test.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/HttpTopicLookupv2Test.java @@ -26,6 +26,10 @@ import static org.mockito.Mockito.when; import static org.testng.Assert.assertEquals; import com.google.common.collect.Sets; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.core.Response.Status; +import jakarta.ws.rs.core.UriInfo; import java.lang.reflect.Field; import java.net.URI; import java.util.LinkedHashSet; @@ -34,10 +38,6 @@ import java.util.TreeSet; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Semaphore; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.core.Response.Status; -import javax.ws.rs.core.UriInfo; import org.apache.pulsar.broker.PulsarService; import org.apache.pulsar.broker.ServiceConfiguration; import org.apache.pulsar.broker.authorization.AuthorizationService; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/v2/TopicLookupTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/v2/TopicLookupTest.java index 83029c7dc2576..914e37af74144 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/v2/TopicLookupTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/v2/TopicLookupTest.java @@ -20,8 +20,8 @@ import static org.mockito.Mockito.spy; import static org.testng.Assert.assertEquals; +import jakarta.ws.rs.core.Response; import java.util.concurrent.CompletableFuture; -import javax.ws.rs.core.Response; import org.apache.pulsar.broker.lookup.v2.TopicLookup; import org.apache.pulsar.broker.web.PulsarWebResourceTest; import org.apache.pulsar.common.lookup.data.LookupData; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BrokerEntryMetadataE2ETest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BrokerEntryMetadataE2ETest.java index 5c4c6cc5b061f..0835cb36fd8c0 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BrokerEntryMetadataE2ETest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BrokerEntryMetadataE2ETest.java @@ -19,13 +19,13 @@ package org.apache.pulsar.broker.service; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import jakarta.ws.rs.NotAllowedException; +import jakarta.ws.rs.NotFoundException; import java.time.Duration; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; -import javax.ws.rs.NotAllowedException; -import javax.ws.rs.NotFoundException; import lombok.Cleanup; import org.apache.bookkeeper.mledger.ManagedCursor; import org.apache.bookkeeper.mledger.impl.ManagedLedgerImpl; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentMessageFinderTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentMessageFinderTest.java index 5bf4e1f97d462..b7c910852ce3a 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentMessageFinderTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentMessageFinderTest.java @@ -33,6 +33,8 @@ import static org.testng.Assert.assertTrue; import io.netty.buffer.ByteBuf; import io.netty.buffer.UnpooledByteBufAllocator; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.core.MediaType; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; @@ -47,8 +49,6 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; -import javax.ws.rs.client.Entity; -import javax.ws.rs.core.MediaType; import lombok.CustomLog; import org.apache.bookkeeper.mledger.AsyncCallbacks; import org.apache.bookkeeper.mledger.Entry; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/stats/MetricsAuthenticationTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/stats/MetricsAuthenticationTest.java index 38ccb92c3edba..12af36b9521bc 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/stats/MetricsAuthenticationTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/stats/MetricsAuthenticationTest.java @@ -19,8 +19,8 @@ package org.apache.pulsar.broker.stats; import com.google.common.collect.Sets; -import javax.ws.rs.client.Client; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.core.Response; import lombok.Cleanup; import lombok.CustomLog; import org.apache.pulsar.broker.auth.MockedPulsarServiceBaseTest; @@ -54,7 +54,7 @@ void testGetMetricsByAuthenticate() throws Exception { conf.setAuthenticateMetricsEndpoint(true); super.internalSetup(); @Cleanup - Client client = javax.ws.rs.client.ClientBuilder.newClient(new ClientConfig().register(LoggingFeature.class)); + Client client = jakarta.ws.rs.client.ClientBuilder.newClient(new ClientConfig().register(LoggingFeature.class)); Response r = client.target(this.pulsar.getWebServiceAddress()).path("/metrics").request().get(); Assert.assertEquals(r.getStatus(), Response.Status.UNAUTHORIZED.getStatusCode()); } @@ -63,7 +63,7 @@ void testGetMetricsByAuthenticate() throws Exception { void testGetMetricsByDefault() throws Exception { super.internalSetup(); @Cleanup - Client client = javax.ws.rs.client.ClientBuilder.newClient(new ClientConfig().register(LoggingFeature.class)); + Client client = jakarta.ws.rs.client.ClientBuilder.newClient(new ClientConfig().register(LoggingFeature.class)); Response r = client.target(this.pulsar.getWebServiceAddress()).path("/metrics").request().get(); Assert.assertEquals(r.getStatus(), Response.Status.OK.getStatusCode()); } diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/stats/TransactionBatchWriterMetricsTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/stats/TransactionBatchWriterMetricsTest.java index 9ce36fc678499..40d3de0820c6e 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/stats/TransactionBatchWriterMetricsTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/stats/TransactionBatchWriterMetricsTest.java @@ -19,6 +19,11 @@ package org.apache.pulsar.broker.stats; import static org.apache.pulsar.common.policies.data.PoliciesUtil.getBundles; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; @@ -29,11 +34,6 @@ import java.util.Optional; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import lombok.Cleanup; import lombok.CustomLog; import org.apache.pulsar.broker.PulsarService; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/ExceptionHandlerTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/ExceptionHandlerTest.java index 660f4bce28c3e..9413b62dfab14 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/ExceptionHandlerTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/ExceptionHandlerTest.java @@ -20,7 +20,7 @@ import static org.eclipse.jetty.http.HttpStatus.INTERNAL_SERVER_ERROR_500; import static org.eclipse.jetty.http.HttpStatus.PRECONDITION_FAILED_412; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; import lombok.SneakyThrows; import org.apache.pulsar.common.intercept.InterceptException; import org.mockito.Mockito; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/MaxRequestSizeFilterTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/MaxRequestSizeFilterTest.java index 954e93db9e4c8..883d1fb970357 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/MaxRequestSizeFilterTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/MaxRequestSizeFilterTest.java @@ -18,15 +18,15 @@ */ package org.apache.pulsar.broker.web; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import org.mockito.Mockito; import org.testng.Assert; import org.testng.annotations.Test; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/ProcessHandlerFilterTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/ProcessHandlerFilterTest.java index 790ecfd2afb53..14d6d635bb4ea 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/ProcessHandlerFilterTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/ProcessHandlerFilterTest.java @@ -18,12 +18,12 @@ */ package org.apache.pulsar.broker.web; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.core.MediaType; import java.io.IOException; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.core.MediaType; import org.apache.pulsar.broker.PulsarService; import org.apache.pulsar.broker.ServiceConfiguration; import org.apache.pulsar.broker.intercept.BrokerInterceptor; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/PulsarWebResourceTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/PulsarWebResourceTest.java index c424ab8cdd020..ea5edc6820980 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/PulsarWebResourceTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/PulsarWebResourceTest.java @@ -20,10 +20,10 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; -import javax.servlet.ServletContext; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Feature; -import javax.ws.rs.core.FeatureContext; +import jakarta.servlet.ServletContext; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Feature; +import jakarta.ws.rs.core.FeatureContext; import org.apache.pulsar.broker.PulsarService; import org.apache.pulsar.broker.ServiceConfiguration; import org.glassfish.jersey.server.ResourceConfig; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/RestExceptionTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/RestExceptionTest.java index 33e857c8e3841..12646694b6c6c 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/RestExceptionTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/RestExceptionTest.java @@ -19,8 +19,8 @@ package org.apache.pulsar.broker.web; import static org.testng.Assert.assertEquals; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response.Status; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Response.Status; import org.apache.pulsar.common.policies.data.ErrorData; import org.testng.annotations.Test; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/plugin/servlet/AdditionalServletWithClassLoaderTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/plugin/servlet/AdditionalServletWithClassLoaderTest.java index 6f7879bda4f45..ad790b79dcf02 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/plugin/servlet/AdditionalServletWithClassLoaderTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/plugin/servlet/AdditionalServletWithClassLoaderTest.java @@ -25,7 +25,7 @@ import static org.mockito.Mockito.when; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNull; -import javax.servlet.Servlet; +import jakarta.servlet.Servlet; import org.apache.pulsar.broker.ServiceConfiguration; import org.apache.pulsar.common.configuration.PulsarConfiguration; import org.apache.pulsar.common.nar.NarClassLoader; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/AuthenticatedProducerConsumerTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/AuthenticatedProducerConsumerTest.java index ffb107807ad83..62b7c93770963 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/AuthenticatedProducerConsumerTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/AuthenticatedProducerConsumerTest.java @@ -23,6 +23,7 @@ import static org.testng.Assert.assertTrue; import com.google.common.collect.Sets; import io.jsonwebtoken.SignatureAlgorithm; +import jakarta.ws.rs.InternalServerErrorException; import java.util.Collections; import java.util.EnumSet; import java.util.HashMap; @@ -34,7 +35,6 @@ import java.util.concurrent.TimeUnit; import java.util.function.Supplier; import javax.crypto.SecretKey; -import javax.ws.rs.InternalServerErrorException; import lombok.Cleanup; import lombok.CustomLog; import org.apache.pulsar.broker.authentication.AuthenticationProviderBasic; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/client/impl/AdminApiKeyStoreTlsAuthTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/client/impl/AdminApiKeyStoreTlsAuthTest.java index 612c7ecd659fa..546e2751ab61d 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/client/impl/AdminApiKeyStoreTlsAuthTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/client/impl/AdminApiKeyStoreTlsAuthTest.java @@ -22,6 +22,11 @@ import static org.testng.AssertJUnit.fail; import com.google.common.collect.Sets; import io.jsonwebtoken.SignatureAlgorithm; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.GenericType; +import jakarta.ws.rs.core.MediaType; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -31,11 +36,6 @@ import java.util.Set; import javax.crypto.SecretKey; import javax.net.ssl.SSLContext; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.GenericType; -import javax.ws.rs.core.MediaType; import lombok.Cleanup; import lombok.CustomLog; import org.apache.pulsar.broker.authentication.AuthenticationProviderTls; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/stats/client/PulsarBrokerStatsClientTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/stats/client/PulsarBrokerStatsClientTest.java index ca0c4bfe49aee..b17e874ace7af 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/stats/client/PulsarBrokerStatsClientTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/stats/client/PulsarBrokerStatsClientTest.java @@ -23,12 +23,12 @@ import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; +import jakarta.ws.rs.ClientErrorException; +import jakarta.ws.rs.ServerErrorException; import java.lang.reflect.Method; import java.net.URL; import java.util.Map; import java.util.concurrent.TimeUnit; -import javax.ws.rs.ClientErrorException; -import javax.ws.rs.ServerErrorException; import lombok.Cleanup; import lombok.CustomLog; import org.apache.bookkeeper.mledger.ManagedLedger; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/websocket/proxy/ProxyAuthenticationTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/websocket/proxy/ProxyAuthenticationTest.java index 08dc7dd6554fe..c86e1065cccd6 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/websocket/proxy/ProxyAuthenticationTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/websocket/proxy/ProxyAuthenticationTest.java @@ -24,16 +24,16 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doReturn; import com.google.common.collect.Sets; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.Invocation; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.net.URI; import java.util.Optional; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.Invocation; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import lombok.Cleanup; import lombok.CustomLog; import org.apache.pulsar.client.api.ProducerConsumerBase; diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/websocket/proxy/ProxyPublishConsumeTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/websocket/proxy/ProxyPublishConsumeTest.java index c4aff0c56596c..a76ded987a123 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/websocket/proxy/ProxyPublishConsumeTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/websocket/proxy/ProxyPublishConsumeTest.java @@ -33,6 +33,13 @@ import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import com.google.gson.reflect.TypeToken; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.Invocation; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.net.URI; import java.nio.charset.StandardCharsets; import java.time.Duration; @@ -43,13 +50,6 @@ import java.util.UUID; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.Invocation; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import lombok.Cleanup; import lombok.CustomLog; import org.apache.pulsar.broker.BrokerTestUtil; diff --git a/pulsar-client-admin-shaded/src/main/resources/META-INF/services/org.apache.pulsar.shade.javax.ws.rs.client.ClientBuilder b/pulsar-client-admin-shaded/src/main/resources/META-INF/services/org.apache.pulsar.shade.jakarta.ws.rs.client.ClientBuilder similarity index 100% rename from pulsar-client-admin-shaded/src/main/resources/META-INF/services/org.apache.pulsar.shade.javax.ws.rs.client.ClientBuilder rename to pulsar-client-admin-shaded/src/main/resources/META-INF/services/org.apache.pulsar.shade.jakarta.ws.rs.client.ClientBuilder diff --git a/pulsar-client-admin-shaded/src/main/resources/META-INF/services/org.apache.pulsar.shade.javax.ws.rs.ext.RuntimeDelegate b/pulsar-client-admin-shaded/src/main/resources/META-INF/services/org.apache.pulsar.shade.jakarta.ws.rs.ext.RuntimeDelegate similarity index 100% rename from pulsar-client-admin-shaded/src/main/resources/META-INF/services/org.apache.pulsar.shade.javax.ws.rs.ext.RuntimeDelegate rename to pulsar-client-admin-shaded/src/main/resources/META-INF/services/org.apache.pulsar.shade.jakarta.ws.rs.ext.RuntimeDelegate diff --git a/pulsar-client-admin/build.gradle.kts b/pulsar-client-admin/build.gradle.kts index 75d79db6db523..0d95a6c443f0e 100644 --- a/pulsar-client-admin/build.gradle.kts +++ b/pulsar-client-admin/build.gradle.kts @@ -31,12 +31,12 @@ dependencies { implementation(libs.jersey.media.json.jackson) implementation(libs.jersey.media.multipart) implementation(libs.jersey.hk2) - implementation(libs.jackson.jaxrs.json.provider) + implementation(libs.jackson.jakarta.rs.json.provider) implementation(libs.jackson.databind) implementation(libs.jakarta.ws.rs.api) implementation(libs.jakarta.xml.bind.api) implementation(libs.jakarta.activation.api) - runtimeOnly(libs.jakarta.activation) + runtimeOnly(libs.angus.activation) implementation(libs.guava) implementation(libs.gson) implementation(libs.asynchttpclient) diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/BaseResource.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/BaseResource.java index 27a0db67d1b4b..5cfb785c58549 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/BaseResource.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/BaseResource.java @@ -18,6 +18,17 @@ */ package org.apache.pulsar.client.admin.internal; +import jakarta.ws.rs.ClientErrorException; +import jakarta.ws.rs.ServerErrorException; +import jakarta.ws.rs.ServiceUnavailableException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.Invocation.Builder; +import jakarta.ws.rs.client.InvocationCallback; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.GenericType; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.util.Map; import java.util.Map.Entry; import java.util.Set; @@ -27,17 +38,6 @@ import java.util.concurrent.TimeoutException; import java.util.function.Function; import java.util.function.Supplier; -import javax.ws.rs.ClientErrorException; -import javax.ws.rs.ServerErrorException; -import javax.ws.rs.ServiceUnavailableException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.Invocation.Builder; -import javax.ws.rs.client.InvocationCallback; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.GenericType; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import lombok.CustomLog; import org.apache.pulsar.client.admin.PulsarAdminException; import org.apache.pulsar.client.admin.PulsarAdminException.ConflictException; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/BookiesImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/BookiesImpl.java index 0bf92e0267791..e766b2975970e 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/BookiesImpl.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/BookiesImpl.java @@ -18,10 +18,10 @@ */ package org.apache.pulsar.client.admin.internal; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; import java.util.concurrent.CompletableFuture; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; import org.apache.pulsar.client.admin.Bookies; import org.apache.pulsar.client.admin.PulsarAdminException; import org.apache.pulsar.client.api.Authentication; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/BrokerStatsImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/BrokerStatsImpl.java index de158fbd80c7f..1fb5e8fb446c4 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/BrokerStatsImpl.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/BrokerStatsImpl.java @@ -20,8 +20,8 @@ import com.google.gson.Gson; import com.google.gson.JsonObject; +import jakarta.ws.rs.client.WebTarget; import java.util.concurrent.CompletableFuture; -import javax.ws.rs.client.WebTarget; import org.apache.pulsar.client.admin.BrokerStats; import org.apache.pulsar.client.admin.PulsarAdminException; import org.apache.pulsar.client.api.Authentication; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/BrokersImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/BrokersImpl.java index fe33eac4393fc..56046474d7c9c 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/BrokersImpl.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/BrokersImpl.java @@ -18,14 +18,14 @@ */ package org.apache.pulsar.client.admin.internal; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.InvocationCallback; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.concurrent.CompletableFuture; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.InvocationCallback; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; import org.apache.pulsar.client.admin.Brokers; import org.apache.pulsar.client.admin.PulsarAdminException; import org.apache.pulsar.client.api.Authentication; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/ClustersImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/ClustersImpl.java index 24048ea3c0a41..8a074b0057a71 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/ClustersImpl.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/ClustersImpl.java @@ -18,6 +18,9 @@ */ package org.apache.pulsar.client.admin.internal; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashSet; @@ -25,9 +28,6 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.CompletableFuture; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; import org.apache.pulsar.client.admin.Clusters; import org.apache.pulsar.client.admin.PulsarAdminException; import org.apache.pulsar.client.api.Authentication; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/ComponentResource.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/ComponentResource.java index 0301f0fc2ee2b..ae60c30b25cdc 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/ComponentResource.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/ComponentResource.java @@ -20,11 +20,11 @@ import com.fasterxml.jackson.databind.ObjectReader; import com.fasterxml.jackson.databind.ObjectWriter; +import jakarta.ws.rs.client.WebTarget; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.CompletableFuture; -import javax.ws.rs.client.WebTarget; import org.apache.pulsar.client.admin.PulsarAdminException; import org.apache.pulsar.client.api.Authentication; import org.apache.pulsar.client.api.AuthenticationDataProvider; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/FunctionsImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/FunctionsImpl.java index 68f89cdd1d67d..76e5c30acaa95 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/FunctionsImpl.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/FunctionsImpl.java @@ -22,6 +22,12 @@ import static org.asynchttpclient.Dsl.post; import static org.asynchttpclient.Dsl.put; import com.google.gson.Gson; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.InvocationCallback; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.GenericType; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -30,12 +36,6 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.InvocationCallback; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.GenericType; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import lombok.CustomLog; import org.apache.commons.lang3.StringUtils; import org.apache.pulsar.client.admin.Functions; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/JacksonConfigurator.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/JacksonConfigurator.java index ac1844ac079e5..119908565f5c1 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/JacksonConfigurator.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/JacksonConfigurator.java @@ -21,8 +21,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleAbstractTypeResolver; import com.fasterxml.jackson.databind.module.SimpleModule; -import javax.ws.rs.ext.ContextResolver; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.ext.ContextResolver; +import jakarta.ws.rs.ext.Provider; import org.apache.pulsar.client.admin.OffloadProcessStatus; import org.apache.pulsar.common.util.ObjectMapperFactory; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/LookupImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/LookupImpl.java index 94194aa0fb35e..43c8fb40dcea2 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/LookupImpl.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/LookupImpl.java @@ -18,12 +18,12 @@ */ package org.apache.pulsar.client.admin.internal; +import jakarta.ws.rs.client.WebTarget; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; -import javax.ws.rs.client.WebTarget; import org.apache.commons.lang3.StringUtils; import org.apache.pulsar.client.admin.Lookup; import org.apache.pulsar.client.admin.PulsarAdminException; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/MetadataMigrationImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/MetadataMigrationImpl.java index 8fa110e77a8fc..12043c52971d6 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/MetadataMigrationImpl.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/MetadataMigrationImpl.java @@ -18,8 +18,8 @@ */ package org.apache.pulsar.client.admin.internal; +import jakarta.ws.rs.client.WebTarget; import java.util.concurrent.CompletableFuture; -import javax.ws.rs.client.WebTarget; import org.apache.pulsar.client.admin.MetadataMigration; import org.apache.pulsar.client.api.Authentication; import org.apache.pulsar.common.migration.MigrationState; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/NamespacesImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/NamespacesImpl.java index c77e515f99014..75a331a45dbd6 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/NamespacesImpl.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/NamespacesImpl.java @@ -18,15 +18,15 @@ */ package org.apache.pulsar.client.admin.internal; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.InvocationCallback; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.InvocationCallback; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; import org.apache.commons.lang3.StringUtils; import org.apache.pulsar.client.admin.GrantTopicPermissionOptions; import org.apache.pulsar.client.admin.ListNamespaceTopicsOptions; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/NonPersistentTopicsImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/NonPersistentTopicsImpl.java index a27262f27262d..ebd332ab546b3 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/NonPersistentTopicsImpl.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/NonPersistentTopicsImpl.java @@ -19,11 +19,11 @@ package org.apache.pulsar.client.admin.internal; import static com.google.common.base.Preconditions.checkArgument; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; import java.util.List; import java.util.concurrent.CompletableFuture; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; import org.apache.pulsar.client.admin.NonPersistentTopics; import org.apache.pulsar.client.admin.PulsarAdminException; import org.apache.pulsar.client.api.Authentication; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/PackagesImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/PackagesImpl.java index 2b8efc3b97c8c..b9e7d780453ce 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/PackagesImpl.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/PackagesImpl.java @@ -20,6 +20,10 @@ import static org.asynchttpclient.Dsl.get; import com.google.gson.Gson; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -29,10 +33,6 @@ import java.nio.file.Paths; import java.util.List; import java.util.concurrent.CompletableFuture; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import org.apache.pulsar.client.admin.Packages; import org.apache.pulsar.client.admin.PulsarAdminException; import org.apache.pulsar.client.admin.internal.http.AsyncHttpRequestExecutor; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/ProxyStatsImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/ProxyStatsImpl.java index 7ed07a1a6ad54..bfc2b115688a9 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/ProxyStatsImpl.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/ProxyStatsImpl.java @@ -18,7 +18,7 @@ */ package org.apache.pulsar.client.admin.internal; -import javax.ws.rs.client.WebTarget; +import jakarta.ws.rs.client.WebTarget; import org.apache.pulsar.client.admin.ProxyStats; import org.apache.pulsar.client.admin.PulsarAdminException; import org.apache.pulsar.client.api.Authentication; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/PulsarAdminImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/PulsarAdminImpl.java index 8b175650d7964..f1f1cdbe35fea 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/PulsarAdminImpl.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/PulsarAdminImpl.java @@ -20,13 +20,13 @@ import static com.google.common.base.Preconditions.checkArgument; import com.google.common.annotations.VisibleForTesting; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.WebTarget; import java.io.IOException; import java.net.URL; import java.util.Map; import java.util.concurrent.TimeUnit; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; import lombok.CustomLog; import lombok.Getter; import org.apache.commons.lang3.StringUtils; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/ResourceGroupsImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/ResourceGroupsImpl.java index 4e7230eebd980..56bce7b609535 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/ResourceGroupsImpl.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/ResourceGroupsImpl.java @@ -18,11 +18,11 @@ */ package org.apache.pulsar.client.admin.internal; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; import java.util.List; import java.util.concurrent.CompletableFuture; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; import org.apache.pulsar.client.admin.PulsarAdminException; import org.apache.pulsar.client.admin.ResourceGroups; import org.apache.pulsar.client.api.Authentication; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/ResourceQuotasImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/ResourceQuotasImpl.java index 35d76c601e492..ea60a8040b44a 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/ResourceQuotasImpl.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/ResourceQuotasImpl.java @@ -18,10 +18,10 @@ */ package org.apache.pulsar.client.admin.internal; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; import java.util.concurrent.CompletableFuture; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; import org.apache.pulsar.client.admin.PulsarAdminException; import org.apache.pulsar.client.admin.ResourceQuotas; import org.apache.pulsar.client.api.Authentication; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/ScalableTopicsImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/ScalableTopicsImpl.java index 09a81ea26af1a..e11c6cfe74711 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/ScalableTopicsImpl.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/ScalableTopicsImpl.java @@ -18,13 +18,13 @@ */ package org.apache.pulsar.client.admin.internal; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.GenericType; +import jakarta.ws.rs.core.MediaType; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.GenericType; -import javax.ws.rs.core.MediaType; import org.apache.pulsar.client.admin.PulsarAdminException; import org.apache.pulsar.client.admin.ScalableTopics; import org.apache.pulsar.client.api.Authentication; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/SchemasImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/SchemasImpl.java index 72f8d62c0b4a3..6ae1768adcf0a 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/SchemasImpl.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/SchemasImpl.java @@ -19,13 +19,13 @@ package org.apache.pulsar.client.admin.internal; import static java.nio.charset.StandardCharsets.UTF_8; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.InvocationCallback; +import jakarta.ws.rs.client.WebTarget; import java.io.IOException; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.InvocationCallback; -import javax.ws.rs.client.WebTarget; import org.apache.pulsar.client.admin.PulsarAdminException; import org.apache.pulsar.client.admin.Schemas; import org.apache.pulsar.client.api.Authentication; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/SinksImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/SinksImpl.java index 4779bb405f624..564860087495c 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/SinksImpl.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/SinksImpl.java @@ -21,14 +21,14 @@ import static org.asynchttpclient.Dsl.post; import static org.asynchttpclient.Dsl.put; import com.google.gson.Gson; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.GenericType; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.io.File; import java.util.List; import java.util.concurrent.CompletableFuture; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.GenericType; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import lombok.CustomLog; import org.apache.commons.lang3.StringUtils; import org.apache.pulsar.client.admin.PulsarAdminException; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/SourcesImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/SourcesImpl.java index be550eab1eef2..e477d5649924f 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/SourcesImpl.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/SourcesImpl.java @@ -21,14 +21,14 @@ import static org.asynchttpclient.Dsl.post; import static org.asynchttpclient.Dsl.put; import com.google.gson.Gson; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.GenericType; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.io.File; import java.util.List; import java.util.concurrent.CompletableFuture; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.GenericType; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import lombok.CustomLog; import org.apache.pulsar.client.admin.PulsarAdminException; import org.apache.pulsar.client.admin.Source; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/TenantsImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/TenantsImpl.java index 41fdf05db0e45..f5202ebc2440a 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/TenantsImpl.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/TenantsImpl.java @@ -18,11 +18,11 @@ */ package org.apache.pulsar.client.admin.internal; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; import java.util.List; import java.util.concurrent.CompletableFuture; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; import org.apache.pulsar.client.admin.PulsarAdminException; import org.apache.pulsar.client.admin.Tenants; import org.apache.pulsar.client.api.Authentication; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/TopicPoliciesImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/TopicPoliciesImpl.java index 7dd91b8d26435..7c65d04419e7f 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/TopicPoliciesImpl.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/TopicPoliciesImpl.java @@ -18,14 +18,14 @@ */ package org.apache.pulsar.client.admin.internal; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.GenericType; +import jakarta.ws.rs.core.MediaType; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.CompletableFuture; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.GenericType; -import javax.ws.rs.core.MediaType; import org.apache.pulsar.client.admin.PulsarAdminException; import org.apache.pulsar.client.admin.TopicPolicies; import org.apache.pulsar.client.api.Authentication; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/TopicsImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/TopicsImpl.java index 1e03644a54e2e..c484a217bd2e0 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/TopicsImpl.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/TopicsImpl.java @@ -22,6 +22,14 @@ import com.google.gson.Gson; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.InvocationCallback; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.GenericType; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; import java.io.InputStream; import java.util.ArrayList; import java.util.Base64; @@ -40,14 +48,6 @@ import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.InvocationCallback; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.GenericType; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; import lombok.CustomLog; import org.apache.commons.lang3.StringUtils; import org.apache.pulsar.client.admin.GetStatsOptions; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/TransactionsImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/TransactionsImpl.java index a0b9dd234d920..44f19fd9f7113 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/TransactionsImpl.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/TransactionsImpl.java @@ -19,13 +19,13 @@ package org.apache.pulsar.client.admin.internal; import static com.google.common.base.Preconditions.checkArgument; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; import org.apache.pulsar.client.admin.PulsarAdminException; import org.apache.pulsar.client.admin.Transactions; import org.apache.pulsar.client.api.Authentication; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/WebTargets.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/WebTargets.java index 9e3dfb6267b40..1ddb14aeeec5f 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/WebTargets.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/WebTargets.java @@ -18,9 +18,9 @@ */ package org.apache.pulsar.client.admin.internal; +import jakarta.ws.rs.client.WebTarget; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; -import javax.ws.rs.client.WebTarget; import lombok.CustomLog; @CustomLog diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/WorkerImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/WorkerImpl.java index 41e79c14adb79..8b5675848b403 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/WorkerImpl.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/WorkerImpl.java @@ -18,14 +18,14 @@ */ package org.apache.pulsar.client.admin.internal; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.GenericType; +import jakarta.ws.rs.core.MediaType; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.GenericType; -import javax.ws.rs.core.MediaType; import lombok.CustomLog; import org.apache.pulsar.client.admin.PulsarAdminException; import org.apache.pulsar.client.admin.Worker; diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/http/AsyncHttpConnector.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/http/AsyncHttpConnector.java index fe79ee5152903..5e7bda363d1b9 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/http/AsyncHttpConnector.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/http/AsyncHttpConnector.java @@ -35,6 +35,10 @@ import io.netty.handler.codec.http.HttpResponse; import io.netty.resolver.NameResolver; import io.netty.util.concurrent.DefaultThreadFactory; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.Response.Status; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.net.InetAddress; @@ -53,10 +57,6 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.function.Supplier; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.client.Client; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.Response.Status; import lombok.CustomLog; import lombok.Data; import lombok.Getter; @@ -318,7 +318,7 @@ public Future apply(ClientRequest jerseyRequest, AsyncConnectorCallback callb } else { ClientResponse jerseyResponse = new ClientResponse(Status.fromStatusCode(response.getStatusCode()), jerseyRequest); - jerseyResponse.setStatusInfo(new javax.ws.rs.core.Response.StatusType() { + jerseyResponse.setStatusInfo(new jakarta.ws.rs.core.Response.StatusType() { @Override public int getStatusCode() { return response.getStatusCode(); diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/http/AsyncHttpConnectorProvider.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/http/AsyncHttpConnectorProvider.java index 2f1e8f798a6c6..bf5efe3ffd6d7 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/http/AsyncHttpConnectorProvider.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/http/AsyncHttpConnectorProvider.java @@ -19,8 +19,8 @@ package org.apache.pulsar.client.admin.internal.http; import com.google.common.annotations.VisibleForTesting; -import javax.ws.rs.client.Client; -import javax.ws.rs.core.Configuration; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.core.Configuration; import org.apache.pulsar.client.impl.PulsarClientSharedResourcesImpl; import org.apache.pulsar.client.impl.conf.ClientConfigurationData; import org.glassfish.jersey.client.spi.Connector; diff --git a/pulsar-client-admin/src/test/java/org/apache/pulsar/client/admin/internal/SinksImplTest.java b/pulsar-client-admin/src/test/java/org/apache/pulsar/client/admin/internal/SinksImplTest.java index 62ca5bd5acdab..d08d90138f78f 100644 --- a/pulsar-client-admin/src/test/java/org/apache/pulsar/client/admin/internal/SinksImplTest.java +++ b/pulsar-client-admin/src/test/java/org/apache/pulsar/client/admin/internal/SinksImplTest.java @@ -23,9 +23,9 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.mock; import static org.testng.Assert.fail; +import jakarta.ws.rs.client.WebTarget; import java.util.concurrent.ExecutionException; import java.util.function.Consumer; -import javax.ws.rs.client.WebTarget; import org.apache.commons.lang3.StringUtils; import org.apache.pulsar.client.admin.PulsarAdminException; import org.apache.pulsar.common.functions.UpdateOptionsImpl; diff --git a/pulsar-client-all/src/main/resources/META-INF/services/org.apache.pulsar.shade.javax.ws.rs.client.ClientBuilder b/pulsar-client-all/src/main/resources/META-INF/services/org.apache.pulsar.shade.jakarta.ws.rs.client.ClientBuilder similarity index 100% rename from pulsar-client-all/src/main/resources/META-INF/services/org.apache.pulsar.shade.javax.ws.rs.client.ClientBuilder rename to pulsar-client-all/src/main/resources/META-INF/services/org.apache.pulsar.shade.jakarta.ws.rs.client.ClientBuilder diff --git a/pulsar-client-all/src/main/resources/META-INF/services/org.apache.pulsar.shade.javax.ws.rs.ext.RuntimeDelegate b/pulsar-client-all/src/main/resources/META-INF/services/org.apache.pulsar.shade.jakarta.ws.rs.ext.RuntimeDelegate similarity index 100% rename from pulsar-client-all/src/main/resources/META-INF/services/org.apache.pulsar.shade.javax.ws.rs.ext.RuntimeDelegate rename to pulsar-client-all/src/main/resources/META-INF/services/org.apache.pulsar.shade.jakarta.ws.rs.ext.RuntimeDelegate diff --git a/pulsar-client-auth-sasl/src/main/java/org/apache/pulsar/client/impl/auth/AuthenticationSasl.java b/pulsar-client-auth-sasl/src/main/java/org/apache/pulsar/client/impl/auth/AuthenticationSasl.java index 7ccd94e9346cf..4c7fe9f2009fd 100644 --- a/pulsar-client-auth-sasl/src/main/java/org/apache/pulsar/client/impl/auth/AuthenticationSasl.java +++ b/pulsar-client-auth-sasl/src/main/java/org/apache/pulsar/client/impl/auth/AuthenticationSasl.java @@ -36,6 +36,13 @@ import static org.apache.pulsar.common.sasl.SaslConstants.SASL_STATE_SERVER; import static org.apache.pulsar.common.sasl.SaslConstants.SASL_STATE_SERVER_CHECK_TOKEN; import static org.apache.pulsar.common.sasl.SaslConstants.SASL_TYPE_VALUE; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.Invocation.Builder; +import jakarta.ws.rs.client.InvocationCallback; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.io.IOException; import java.net.HttpURLConnection; import java.util.Base64; @@ -45,13 +52,6 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; import javax.security.auth.login.LoginException; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.Invocation.Builder; -import javax.ws.rs.client.InvocationCallback; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import lombok.CustomLog; import lombok.SneakyThrows; import org.apache.pulsar.client.api.Authentication; diff --git a/pulsar-common/src/main/java/org/apache/pulsar/common/policies/data/PoliciesUtil.java b/pulsar-common/src/main/java/org/apache/pulsar/common/policies/data/PoliciesUtil.java index 08cc69f28c1b0..4cc738b85092b 100644 --- a/pulsar-common/src/main/java/org/apache/pulsar/common/policies/data/PoliciesUtil.java +++ b/pulsar-common/src/main/java/org/apache/pulsar/common/policies/data/PoliciesUtil.java @@ -20,9 +20,9 @@ import static org.apache.pulsar.common.policies.data.Policies.FIRST_BOUNDARY; import static org.apache.pulsar.common.policies.data.Policies.LAST_BOUNDARY; +import jakarta.ws.rs.core.Response; import java.util.ArrayList; import java.util.List; -import javax.ws.rs.core.Response; import org.apache.pulsar.common.util.RestException; /** diff --git a/pulsar-common/src/main/java/org/apache/pulsar/common/util/RestException.java b/pulsar-common/src/main/java/org/apache/pulsar/common/util/RestException.java index 079374f405b8b..f3d931a62f8d7 100644 --- a/pulsar-common/src/main/java/org/apache/pulsar/common/util/RestException.java +++ b/pulsar-common/src/main/java/org/apache/pulsar/common/util/RestException.java @@ -18,12 +18,12 @@ */ package org.apache.pulsar.common.util; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; import java.io.PrintWriter; import java.io.StringWriter; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; import org.apache.pulsar.common.policies.data.ErrorData; /** diff --git a/pulsar-common/src/main/java/org/apache/pulsar/common/util/collections/ConcurrentBitSetRecyclable.java b/pulsar-common/src/main/java/org/apache/pulsar/common/util/collections/ConcurrentBitSetRecyclable.java index df34acc668ec7..ee4d6c569b5f7 100644 --- a/pulsar-common/src/main/java/org/apache/pulsar/common/util/collections/ConcurrentBitSetRecyclable.java +++ b/pulsar-common/src/main/java/org/apache/pulsar/common/util/collections/ConcurrentBitSetRecyclable.java @@ -20,9 +20,8 @@ import io.netty.util.Recycler; import io.netty.util.Recycler.Handle; -import lombok.EqualsAndHashCode; - import java.util.BitSet; +import lombok.EqualsAndHashCode; /** * Safe multithreaded version of {@code BitSet} and leverage netty recycler. diff --git a/pulsar-functions/localrun-shaded/build.gradle.kts b/pulsar-functions/localrun-shaded/build.gradle.kts index f69c7cba62ebe..5777ed96b2ac8 100644 --- a/pulsar-functions/localrun-shaded/build.gradle.kts +++ b/pulsar-functions/localrun-shaded/build.gradle.kts @@ -44,14 +44,14 @@ tasks.shadowJar { include(dependency("io.netty:.*")) include(dependency("io.netty.incubator:.*")) include(dependency("com.google.*:.*")) - include(dependency("javax.servlet:.*")) + include(dependency("jakarta.servlet:.*")) include(dependency("org.reactivestreams:reactive-streams")) include(dependency("io.swagger:.*")) include(dependency("org.yaml:snakeyaml")) include(dependency("io.perfmark:.*")) include(dependency("io.prometheus:.*")) include(dependency("io.prometheus.jmx:.*")) - include(dependency("javax.ws.rs:.*")) + include(dependency("jakarta.ws.rs:.*")) include(dependency("org.tukaani:xz")) include(dependency("com.github.zafarkhaja:java-semver")) include(dependency("net.java.dev.jna:.*")) @@ -97,11 +97,11 @@ tasks.shadowJar { relocateWithPrefix(shadePrefix, "io.perfmark") relocateWithPrefix(shadePrefix, "io.prometheus") relocateWithPrefix(shadePrefix, "io.swagger") - relocateWithPrefix(shadePrefix, "javax.activation") - relocateWithPrefix(shadePrefix, "javax.annotation") - relocateWithPrefix(shadePrefix, "javax.servlet") - relocateWithPrefix(shadePrefix, "javax.validation") - relocateWithPrefix(shadePrefix, "javax.ws.rs") + relocateWithPrefix(shadePrefix, "jakarta.activation") + relocateWithPrefix(shadePrefix, "jakarta.annotation") + relocateWithPrefix(shadePrefix, "jakarta.servlet") + relocateWithPrefix(shadePrefix, "jakarta.validation") + relocateWithPrefix(shadePrefix, "jakarta.ws.rs") relocateWithPrefix(shadePrefix, "jline") relocateWithPrefix(shadePrefix, "net.java.dev.jna") relocateWithPrefix(shadePrefix, "net.jodah") diff --git a/pulsar-functions/proto/src/test/java/org/apache/pulsar/functions/proto/FunctionDetailsTest.java b/pulsar-functions/proto/src/test/java/org/apache/pulsar/functions/proto/FunctionDetailsTest.java index c9eb8733a3763..68ed3a1b0d6a4 100644 --- a/pulsar-functions/proto/src/test/java/org/apache/pulsar/functions/proto/FunctionDetailsTest.java +++ b/pulsar-functions/proto/src/test/java/org/apache/pulsar/functions/proto/FunctionDetailsTest.java @@ -19,7 +19,6 @@ package org.apache.pulsar.functions.proto; import static org.testng.Assert.assertEquals; - import org.apache.pulsar.functions.proto.FunctionDetails; import org.apache.pulsar.functions.proto.ProcessingGuarantees; import org.testng.annotations.Test; diff --git a/pulsar-functions/worker/build.gradle.kts b/pulsar-functions/worker/build.gradle.kts index 734dc9da0ae3d..d7455223757ca 100644 --- a/pulsar-functions/worker/build.gradle.kts +++ b/pulsar-functions/worker/build.gradle.kts @@ -73,8 +73,8 @@ dependencies { implementation(libs.jetty.server) implementation(libs.jetty.alpn.conscrypt.server) - implementation(libs.jetty.ee8.servlet) - implementation(libs.jetty.ee8.servlets) + implementation(libs.jetty.ee10.servlet) + implementation(libs.jetty.ee10.servlets) implementation(libs.jakarta.activation.api) implementation(libs.jakarta.ws.rs.api) diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/FunctionRuntimeManager.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/FunctionRuntimeManager.java index ad04a3161c591..89a1a83e3f988 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/FunctionRuntimeManager.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/FunctionRuntimeManager.java @@ -19,6 +19,11 @@ package org.apache.pulsar.functions.worker; import com.google.common.annotations.VisibleForTesting; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; +import jakarta.ws.rs.core.UriBuilder; import java.net.URI; import java.util.Arrays; import java.util.Collection; @@ -33,11 +38,6 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; -import javax.ws.rs.core.UriBuilder; import lombok.CustomLog; import lombok.Getter; import lombok.Setter; diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/PulsarWorkerService.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/PulsarWorkerService.java index a5c9930f1441d..5e3e008cc08f2 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/PulsarWorkerService.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/PulsarWorkerService.java @@ -23,6 +23,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Sets; import io.netty.util.concurrent.DefaultThreadFactory; +import jakarta.ws.rs.core.Response; import java.io.IOException; import java.net.URI; import java.util.Collections; @@ -31,7 +32,6 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.function.Supplier; -import javax.ws.rs.core.Response; import lombok.CustomLog; import lombok.Getter; import org.apache.commons.lang3.StringUtils; diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/ConfigurationResource.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/ConfigurationResource.java index 2218431770b66..4d929dadf07cb 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/ConfigurationResource.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/ConfigurationResource.java @@ -19,11 +19,11 @@ package org.apache.pulsar.functions.worker.rest; import com.fasterxml.jackson.core.JsonProcessingException; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import org.apache.pulsar.PulsarVersion; @Path("/") diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/FunctionApiResource.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/FunctionApiResource.java index cfce3d3e68912..59ac04412a0c2 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/FunctionApiResource.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/FunctionApiResource.java @@ -18,11 +18,11 @@ */ package org.apache.pulsar.functions.worker.rest; +import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.UriInfo; import java.util.function.Supplier; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.UriInfo; import org.apache.pulsar.broker.authentication.AuthenticationDataSource; import org.apache.pulsar.broker.authentication.AuthenticationParameters; import org.apache.pulsar.broker.web.AuthenticationFilter; diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/RestUtils.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/RestUtils.java index a2e938e1b2bc8..96087d0458398 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/RestUtils.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/RestUtils.java @@ -20,7 +20,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.core.Response; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.pulsar.common.util.ObjectMapperFactory; diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/WorkerReadinessResource.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/WorkerReadinessResource.java index 36fb89d6606aa..1ef8055ec80ad 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/WorkerReadinessResource.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/WorkerReadinessResource.java @@ -21,14 +21,14 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Response; import java.util.function.Supplier; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response; import org.apache.pulsar.functions.worker.WorkerService; @Path("/") diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/WorkerServer.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/WorkerServer.java index 39170fd3f9304..a397660067310 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/WorkerServer.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/WorkerServer.java @@ -19,6 +19,7 @@ package org.apache.pulsar.functions.worker.rest; import io.opentelemetry.api.OpenTelemetry; +import jakarta.servlet.DispatcherType; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; @@ -26,7 +27,6 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import javax.servlet.DispatcherType; import lombok.CustomLog; import org.apache.pulsar.broker.authentication.AuthenticationService; import org.apache.pulsar.broker.web.AuthenticationFilter; @@ -44,9 +44,9 @@ import org.apache.pulsar.functions.worker.rest.api.v2.WorkerStatsApiV2Resource; import org.apache.pulsar.jetty.metrics.JettyStatisticsCollector; import org.apache.pulsar.jetty.tls.JettySslContextFactory; -import org.eclipse.jetty.ee8.servlet.FilterHolder; -import org.eclipse.jetty.ee8.servlet.ServletContextHandler; -import org.eclipse.jetty.ee8.servlet.ServletHolder; +import org.eclipse.jetty.ee10.servlet.FilterHolder; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; +import org.eclipse.jetty.ee10.servlet.ServletHolder; import org.eclipse.jetty.http.UriCompliance; import org.eclipse.jetty.server.ConnectionFactory; import org.eclipse.jetty.server.ForwardedRequestCustomizer; @@ -129,15 +129,15 @@ private void init() { List handlers = new ArrayList<>(4); handlers.add(newServletContextHandler("/admin", - new ResourceConfig(Resources.getApiV2Resources()), workerService, filterInitializer).get()); + new ResourceConfig(Resources.getApiV2Resources()), workerService, filterInitializer)); handlers.add(newServletContextHandler("/admin/v2", - new ResourceConfig(Resources.getApiV2Resources()), workerService, filterInitializer).get()); + new ResourceConfig(Resources.getApiV2Resources()), workerService, filterInitializer)); handlers.add(newServletContextHandler("/admin/v3", - new ResourceConfig(Resources.getApiV3Resources()), workerService, filterInitializer).get()); + new ResourceConfig(Resources.getApiV3Resources()), workerService, filterInitializer)); // don't require auth for metrics or config routes handlers.add(newServletContextHandler("/", new ResourceConfig(Resources.getRootResources()), workerService, - workerConfig.isAuthenticateMetricsEndpoint(), filterInitializer).get()); + workerConfig.isAuthenticateMetricsEndpoint(), filterInitializer)); boolean showDetailedAddresses = workerConfig.getWebServiceLogDetailedAddresses() != null ? workerConfig.getWebServiceLogDetailedAddresses() : diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/ComponentImpl.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/ComponentImpl.java index f74ccf4a26b8f..df045e53fbab0 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/ComponentImpl.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/ComponentImpl.java @@ -26,6 +26,11 @@ import static org.apache.pulsar.functions.utils.FunctionCommon.getUniquePackageName; import static org.apache.pulsar.functions.worker.rest.RestUtils.throwUnavailableException; import com.google.common.base.Utf8; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; +import jakarta.ws.rs.core.StreamingOutput; +import jakarta.ws.rs.core.UriBuilder; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -45,11 +50,6 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; -import javax.ws.rs.core.StreamingOutput; -import javax.ws.rs.core.UriBuilder; import lombok.CustomLog; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/FunctionsImpl.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/FunctionsImpl.java index 1c90516f21b3f..37c23efe2c715 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/FunctionsImpl.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/FunctionsImpl.java @@ -23,6 +23,9 @@ import static org.apache.pulsar.functions.auth.FunctionAuthUtils.getFunctionAuthData; import static org.apache.pulsar.functions.utils.FunctionCommon.isFunctionCodeBuiltin; import static org.apache.pulsar.functions.worker.rest.RestUtils.throwUnavailableException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriBuilder; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -32,9 +35,6 @@ import java.util.List; import java.util.Optional; import java.util.function.Supplier; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriBuilder; import lombok.CustomLog; import org.apache.commons.lang3.StringUtils; import org.apache.pulsar.broker.authentication.AuthenticationParameters; diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/FunctionsImplV2.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/FunctionsImplV2.java index 98547511fdb7f..f7f827ec962e5 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/FunctionsImplV2.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/FunctionsImplV2.java @@ -19,12 +19,12 @@ package org.apache.pulsar.functions.worker.rest.api; import com.google.gson.Gson; +import jakarta.ws.rs.core.Response; import java.io.InputStream; import java.net.URI; import java.util.Collection; import java.util.List; import java.util.function.Supplier; -import javax.ws.rs.core.Response; import lombok.CustomLog; import org.apache.pulsar.broker.authentication.AuthenticationParameters; import org.apache.pulsar.common.functions.FunctionConfig; diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/FunctionsMetricsResource.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/FunctionsMetricsResource.java index 43143c6791666..f72da6e8343ed 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/FunctionsMetricsResource.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/FunctionsMetricsResource.java @@ -21,16 +21,16 @@ import io.netty.buffer.ByteBuf; import io.prometheus.client.CollectorRegistry; import io.prometheus.client.exporter.common.TextFormat; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.StreamingOutput; import java.io.IOException; import java.io.Writer; import java.nio.CharBuffer; import java.nio.charset.StandardCharsets; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.StreamingOutput; import org.apache.pulsar.broker.stats.prometheus.PrometheusMetricsServlet; import org.apache.pulsar.common.allocator.PulsarByteBufAllocator; import org.apache.pulsar.common.util.SimpleTextOutputStream; diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/SinksImpl.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/SinksImpl.java index d468bf9538c40..c89848a7e8fdf 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/SinksImpl.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/SinksImpl.java @@ -23,6 +23,8 @@ import static org.apache.pulsar.functions.auth.FunctionAuthUtils.getFunctionAuthData; import static org.apache.pulsar.functions.utils.FunctionCommon.isFunctionCodeBuiltin; import static org.apache.pulsar.functions.worker.rest.RestUtils.throwUnavailableException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Response; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -33,8 +35,6 @@ import java.util.List; import java.util.Optional; import java.util.function.Supplier; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response; import lombok.CustomLog; import org.apache.commons.lang3.StringUtils; import org.apache.pulsar.broker.authentication.AuthenticationParameters; diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/SourcesImpl.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/SourcesImpl.java index 121f03948b45f..b0f629e2235c2 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/SourcesImpl.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/SourcesImpl.java @@ -23,6 +23,8 @@ import static org.apache.pulsar.functions.auth.FunctionAuthUtils.getFunctionAuthData; import static org.apache.pulsar.functions.utils.FunctionCommon.isFunctionCodeBuiltin; import static org.apache.pulsar.functions.worker.rest.RestUtils.throwUnavailableException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Response; import java.io.File; import java.io.InputStream; import java.net.URI; @@ -32,8 +34,6 @@ import java.util.List; import java.util.Optional; import java.util.function.Supplier; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response; import lombok.CustomLog; import org.apache.commons.lang3.StringUtils; import org.apache.pulsar.broker.authentication.AuthenticationParameters; diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/WorkerImpl.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/WorkerImpl.java index 0929ed861ed37..98bcb0b803e31 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/WorkerImpl.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/WorkerImpl.java @@ -20,6 +20,10 @@ import static java.util.concurrent.TimeUnit.SECONDS; import static org.apache.pulsar.functions.worker.rest.RestUtils.throwUnavailableException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; +import jakarta.ws.rs.core.UriBuilder; import java.io.IOException; import java.net.URI; import java.util.ArrayList; @@ -31,10 +35,6 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; import java.util.function.Supplier; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; -import javax.ws.rs.core.UriBuilder; import lombok.CustomLog; import org.apache.pulsar.broker.authentication.AuthenticationParameters; import org.apache.pulsar.client.admin.LongRunningProcessStatus; diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v2/FunctionsApiV2Resource.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v2/FunctionsApiV2Resource.java index 3518bcbbac3a5..36845a7489b7b 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v2/FunctionsApiV2Resource.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v2/FunctionsApiV2Resource.java @@ -21,19 +21,19 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.io.IOException; import java.io.InputStream; import java.util.List; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import lombok.CustomLog; import org.apache.pulsar.client.api.Message; import org.apache.pulsar.common.io.ConnectorDefinition; diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v2/WorkerApiV2Resource.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v2/WorkerApiV2Resource.java index 5a5748860f0fc..cd94ce528411d 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v2/WorkerApiV2Resource.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v2/WorkerApiV2Resource.java @@ -22,22 +22,22 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.UriInfo; import java.io.IOException; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.function.Supplier; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.Consumes; -import javax.ws.rs.GET; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.UriInfo; import lombok.CustomLog; import org.apache.pulsar.broker.authentication.AuthenticationDataSource; import org.apache.pulsar.broker.authentication.AuthenticationParameters; diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v2/WorkerStatsApiV2Resource.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v2/WorkerStatsApiV2Resource.java index 00faf9673d865..571d817630393 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v2/WorkerStatsApiV2Resource.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v2/WorkerStatsApiV2Resource.java @@ -22,17 +22,17 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; import java.io.IOException; import java.util.List; import java.util.function.Supplier; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.Consumes; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; import lombok.CustomLog; import org.apache.pulsar.broker.authentication.AuthenticationDataSource; import org.apache.pulsar.broker.authentication.AuthenticationParameters; diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v3/FunctionsApiV3Resource.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v3/FunctionsApiV3Resource.java index 63ad6a17ddb90..e1856c451189e 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v3/FunctionsApiV3Resource.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v3/FunctionsApiV3Resource.java @@ -22,20 +22,20 @@ import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.StreamingOutput; import java.io.IOException; import java.io.InputStream; import java.util.List; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.StreamingOutput; import lombok.CustomLog; import org.apache.pulsar.common.functions.FunctionConfig; import org.apache.pulsar.common.functions.FunctionDefinition; diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v3/SinkApiV3Resource.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v3/SinkApiV3Resource.java index e1032a9bbb815..5d088fdb44716 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v3/SinkApiV3Resource.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v3/SinkApiV3Resource.java @@ -19,10 +19,10 @@ package org.apache.pulsar.functions.worker.rest.api.v3; import io.swagger.annotations.Api; -import javax.ws.rs.Consumes; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; /** * @deprecated in favor of {@link SinksApiV3Resource} diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v3/SinksApiV3Resource.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v3/SinksApiV3Resource.java index 1e347d851104e..bdef639a491f8 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v3/SinksApiV3Resource.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v3/SinksApiV3Resource.java @@ -23,18 +23,18 @@ import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import java.io.IOException; import java.io.InputStream; import java.util.List; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; import lombok.CustomLog; import org.apache.pulsar.common.functions.UpdateOptionsImpl; import org.apache.pulsar.common.io.ConfigFieldDefinition; diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v3/SourceApiV3Resource.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v3/SourceApiV3Resource.java index c1c1a8c41737e..53b15d449c4d3 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v3/SourceApiV3Resource.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v3/SourceApiV3Resource.java @@ -19,10 +19,10 @@ package org.apache.pulsar.functions.worker.rest.api.v3; import io.swagger.annotations.Api; -import javax.ws.rs.Consumes; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; /** * @deprecated in favor of {@link SourcesApiV3Resource} diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v3/SourcesApiV3Resource.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v3/SourcesApiV3Resource.java index 8154779f64d01..80debc870d256 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v3/SourcesApiV3Resource.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/v3/SourcesApiV3Resource.java @@ -23,18 +23,18 @@ import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import java.io.IOException; import java.io.InputStream; import java.util.List; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; import lombok.CustomLog; import org.apache.pulsar.common.functions.UpdateOptionsImpl; import org.apache.pulsar.common.io.ConfigFieldDefinition; diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/service/api/Component.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/service/api/Component.java index 770cced1731da..1d7276a24caef 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/service/api/Component.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/service/api/Component.java @@ -18,10 +18,10 @@ */ package org.apache.pulsar.functions.worker.service.api; +import jakarta.ws.rs.core.StreamingOutput; import java.io.InputStream; import java.net.URI; import java.util.List; -import javax.ws.rs.core.StreamingOutput; import org.apache.pulsar.broker.authentication.AuthenticationParameters; import org.apache.pulsar.common.functions.FunctionConfig; import org.apache.pulsar.common.functions.FunctionState; diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/service/api/FunctionsV2.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/service/api/FunctionsV2.java index d78d241b3e6a0..9f8a4b7f16ca3 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/service/api/FunctionsV2.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/service/api/FunctionsV2.java @@ -18,11 +18,11 @@ */ package org.apache.pulsar.functions.worker.service.api; +import jakarta.ws.rs.core.Response; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.util.List; -import javax.ws.rs.core.Response; import org.apache.pulsar.broker.authentication.AuthenticationParameters; import org.apache.pulsar.common.io.ConnectorDefinition; import org.apache.pulsar.functions.worker.WorkerService; diff --git a/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/rest/api/v2/FunctionApiV2ResourceTest.java b/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/rest/api/v2/FunctionApiV2ResourceTest.java index 2b8286f35e7ce..62c5312828d8c 100644 --- a/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/rest/api/v2/FunctionApiV2ResourceTest.java +++ b/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/rest/api/v2/FunctionApiV2ResourceTest.java @@ -23,6 +23,8 @@ import static org.mockito.Mockito.when; import static org.testng.Assert.assertEquals; import com.google.gson.Gson; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.StreamingOutput; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -30,8 +32,6 @@ import java.io.OutputStream; import java.util.List; import java.util.Map; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.StreamingOutput; import org.apache.pulsar.broker.authentication.AuthenticationParameters; import org.apache.pulsar.common.functions.FunctionConfig; import org.apache.pulsar.common.functions.UpdateOptionsImpl; diff --git a/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/rest/api/v3/AbstractFunctionApiResourceTest.java b/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/rest/api/v3/AbstractFunctionApiResourceTest.java index 453e39e4132e8..db702e9281439 100644 --- a/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/rest/api/v3/AbstractFunctionApiResourceTest.java +++ b/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/rest/api/v3/AbstractFunctionApiResourceTest.java @@ -26,6 +26,7 @@ import static org.mockito.Mockito.when; import static org.testng.Assert.assertEquals; import com.google.common.collect.Lists; +import jakarta.ws.rs.core.Response; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -35,7 +36,6 @@ import java.util.List; import java.util.Map; import java.util.function.Consumer; -import javax.ws.rs.core.Response; import org.apache.distributedlog.api.namespace.Namespace; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.core.config.Configurator; diff --git a/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/rest/api/v3/FunctionApiV3ResourceTest.java b/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/rest/api/v3/FunctionApiV3ResourceTest.java index 265e1c4a6fd1c..4c0b27fc30c53 100644 --- a/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/rest/api/v3/FunctionApiV3ResourceTest.java +++ b/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/rest/api/v3/FunctionApiV3ResourceTest.java @@ -27,6 +27,8 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.StreamingOutput; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -34,8 +36,6 @@ import java.io.OutputStream; import java.util.List; import java.util.Map; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.StreamingOutput; import org.apache.distributedlog.api.namespace.Namespace; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.core.config.Configurator; diff --git a/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/rest/api/v3/SinkApiV3ResourceTest.java b/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/rest/api/v3/SinkApiV3ResourceTest.java index 7a8cd5ae5b6d6..dc3c2d667deac 100644 --- a/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/rest/api/v3/SinkApiV3ResourceTest.java +++ b/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/rest/api/v3/SinkApiV3ResourceTest.java @@ -32,6 +32,7 @@ import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; import com.google.common.collect.Lists; +import jakarta.ws.rs.core.Response; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -42,7 +43,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import javax.ws.rs.core.Response; import org.apache.distributedlog.api.namespace.Namespace; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.core.config.Configurator; diff --git a/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/rest/api/v3/SourceApiV3ResourceTest.java b/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/rest/api/v3/SourceApiV3ResourceTest.java index d22b70200d276..40b7bfa7c7281 100644 --- a/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/rest/api/v3/SourceApiV3ResourceTest.java +++ b/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/rest/api/v3/SourceApiV3ResourceTest.java @@ -30,6 +30,7 @@ import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; import com.google.common.collect.Lists; +import jakarta.ws.rs.core.Response; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -37,7 +38,6 @@ import java.lang.reflect.Method; import java.util.LinkedList; import java.util.List; -import javax.ws.rs.core.Response; import org.apache.distributedlog.api.namespace.Namespace; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.core.config.Configurator; diff --git a/pulsar-proxy/build.gradle.kts b/pulsar-proxy/build.gradle.kts index 82393b2e48648..12724d2ae7958 100644 --- a/pulsar-proxy/build.gradle.kts +++ b/pulsar-proxy/build.gradle.kts @@ -34,10 +34,13 @@ dependencies { implementation(libs.jetty.server) implementation(libs.jetty.alpn.conscrypt.server) implementation(libs.jetty.client) + implementation(libs.jetty.ee10.servlet) + implementation(libs.jetty.ee10.servlets) + implementation(libs.jetty.ee10.proxy) + implementation(libs.jetty.ee10.websocket.jetty.server) + // ee8 + javax.servlet retained for the legacy AdditionalServlet javax.servlet path (PIP-472) implementation(libs.jetty.ee8.servlet) - implementation(libs.jetty.ee8.servlets) - implementation(libs.jetty.ee8.proxy) - implementation(libs.jetty.ee8.websocket.jetty.server) + implementation(libs.javax.servlet.api) implementation(libs.jersey.server) implementation(libs.jersey.container.servlet.core) implementation(libs.jersey.container.servlet) @@ -47,7 +50,7 @@ dependencies { implementation(libs.simpleclient) implementation(libs.simpleclient.hotspot) implementation(libs.simpleclient.servlet) - implementation(libs.jackson.jaxrs.json.provider) + implementation(libs.jackson.jakarta.rs.json.provider) implementation(libs.picocli) implementation(libs.log4j.core) implementation(libs.log4j.api) diff --git a/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/AdminProxyHandler.java b/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/AdminProxyHandler.java index dd8d699da8572..39db258b6271d 100644 --- a/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/AdminProxyHandler.java +++ b/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/AdminProxyHandler.java @@ -19,6 +19,9 @@ package org.apache.pulsar.proxy.server; import static org.apache.commons.lang3.StringUtils.isBlank; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.net.URI; @@ -30,9 +33,6 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import javax.net.ssl.SSLContext; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.CustomLog; import org.apache.pulsar.broker.PulsarServerException; import org.apache.pulsar.broker.web.AuthenticationFilter; @@ -48,7 +48,7 @@ import org.eclipse.jetty.client.RedirectProtocolHandler; import org.eclipse.jetty.client.Request; import org.eclipse.jetty.client.transport.HttpClientTransportOverHTTP; -import org.eclipse.jetty.ee8.proxy.ProxyServlet; +import org.eclipse.jetty.ee10.proxy.ProxyServlet; import org.eclipse.jetty.http.HttpField; import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.io.Content; diff --git a/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/ProxyServiceStarter.java b/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/ProxyServiceStarter.java index 7dc9362ad5f7f..ab714d5761b2a 100644 --- a/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/ProxyServiceStarter.java +++ b/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/ProxyServiceStarter.java @@ -38,7 +38,6 @@ import java.util.Objects; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; -import javax.servlet.Servlet; import lombok.CustomLog; import lombok.Getter; import org.apache.logging.log4j.LogManager; @@ -64,10 +63,10 @@ import org.apache.pulsar.websocket.WebSocketProducerServlet; import org.apache.pulsar.websocket.WebSocketReaderServlet; import org.apache.pulsar.websocket.WebSocketService; -import org.eclipse.jetty.ee8.proxy.ProxyServlet; -import org.eclipse.jetty.ee8.servlet.ServletHolder; -import org.eclipse.jetty.ee8.websocket.server.JettyWebSocketServlet; -import org.eclipse.jetty.ee8.websocket.server.config.JettyWebSocketServletContainerInitializer; +import org.eclipse.jetty.ee10.proxy.ProxyServlet; +import org.eclipse.jetty.ee10.servlet.ServletHolder; +import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServlet; +import org.eclipse.jetty.ee10.websocket.server.config.JettyWebSocketServletContainerInitializer; import picocli.CommandLine; import picocli.CommandLine.Command; import picocli.CommandLine.Option; @@ -415,6 +414,7 @@ public static void addWebServerHandlers(WebServer server, servletWithClassLoader.loadConfig(config); switch (servletWithClassLoader.getServletType()) { case JAVAX_SERVLET -> { + // Legacy javax.servlet handlers are routed to Jetty's ee8 environment (PIP-472). Object servletInstance = servletWithClassLoader.getServletInstance(); if (!(servletInstance instanceof javax.servlet.Servlet)) { log.error() @@ -433,8 +433,37 @@ public static void addWebServerHandlers(WebServer server, } continue; } + org.eclipse.jetty.ee8.servlet.ServletHolder additionalServletHolder = + new org.eclipse.jetty.ee8.servlet.ServletHolder( + (javax.servlet.Servlet) servletInstance); + server.addServletEe8(servletWithClassLoader.getBasePath(), additionalServletHolder, + Collections.emptyList(), config.isAuthenticationEnabled()); + log.info() + .attr("servletWithClassLoader", servletWithClassLoader.getBasePath()) + .log("proxy add additional servlet basePath"); + } + case JAKARTA_SERVLET -> { + // jakarta.servlet handlers are routed to Jetty's ee10 environment (PIP-472). + Object servletInstance = servletWithClassLoader.getServletInstance(); + if (!(servletInstance instanceof jakarta.servlet.Servlet)) { + log.error() + .attr("servletWithClassLoader", servletWithClassLoader) + .attr("servletInstance", servletInstance.getClass().getName()) + .attr("servletWithClassLoader", servletWithClassLoader.getServletType()) + .log("AdditionalServletWithClassLoader has invalid" + + " servlet instance type. Skipping."); + try { + servletWithClassLoader.close(); + } catch (Exception e) { + log.error() + .attr("servletWithClassLoader", servletWithClassLoader) + .exception(e) + .log("Failed to close servlet"); + } + continue; + } ServletHolder additionalServletHolder = - new ServletHolder((Servlet) servletInstance); + new ServletHolder((jakarta.servlet.Servlet) servletInstance); server.addServlet(servletWithClassLoader.getBasePath(), additionalServletHolder, Collections.emptyList(), config.isAuthenticationEnabled()); log.info() diff --git a/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/WebServer.java b/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/WebServer.java index 8e679091b2fec..aaa931e6c8d99 100644 --- a/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/WebServer.java +++ b/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/WebServer.java @@ -21,6 +21,14 @@ import static org.apache.pulsar.proxy.server.AdminProxyHandler.INIT_PARAM_REQUEST_BUFFER_SIZE; import com.fasterxml.jackson.core.JsonProcessingException; import io.opentelemetry.api.OpenTelemetry; +import jakarta.servlet.DispatcherType; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URI; import java.util.ArrayList; @@ -34,14 +42,6 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import javax.servlet.DispatcherType; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletResponse; import lombok.CustomLog; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; @@ -58,9 +58,9 @@ import org.apache.pulsar.jetty.metrics.JettyStatisticsCollector; import org.apache.pulsar.jetty.tls.JettySslContextFactory; import org.apache.pulsar.proxy.stats.PulsarProxyOpenTelemetry; -import org.eclipse.jetty.ee8.servlet.FilterHolder; -import org.eclipse.jetty.ee8.servlet.ServletContextHandler; -import org.eclipse.jetty.ee8.servlet.ServletHolder; +import org.eclipse.jetty.ee10.servlet.FilterHolder; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; +import org.eclipse.jetty.ee10.servlet.ServletHolder; import org.eclipse.jetty.http.UriCompliance; import org.eclipse.jetty.server.ConnectionFactory; import org.eclipse.jetty.server.Connector; @@ -263,11 +263,38 @@ private ServletContextHandler addServlet(String basePath, ServletHolder servletH filterInitializer.addFilters(context, requireAuthentication); - handlers.add(context.get()); + // The ee10 ServletContextHandler is itself an org.eclipse.jetty.server.Handler + handlers.add(context); return context; } + /** + * Registers a legacy {@code javax.servlet}-based servlet in Jetty's ee8 environment, used to keep existing + * {@code AdditionalServlet} plugins reporting {@code JAVAX_SERVLET} working without recompilation (PIP-472). + * The proxy filter chain is jakarta-typed (ee10) and is therefore not applied to the ee8 environment. + */ + public void addServletEe8(String basePath, org.eclipse.jetty.ee8.servlet.ServletHolder servletHolder, + List> attributes, boolean requireAuthentication) { + Optional existingPath = servletPaths.stream().filter(p -> p.startsWith(basePath)).findFirst(); + if (existingPath.isPresent()) { + throw new IllegalArgumentException( + String.format("Cannot add servlet at %s, path %s already exists", basePath, existingPath.get())); + } + servletPaths.add(basePath); + + org.eclipse.jetty.ee8.servlet.ServletContextHandler context = + new org.eclipse.jetty.ee8.servlet.ServletContextHandler( + org.eclipse.jetty.ee8.servlet.ServletContextHandler.SESSIONS); + context.setContextPath(basePath); + context.addServlet(servletHolder, MATCH_ALL); + for (Pair attribute : attributes) { + context.setAttribute(attribute.getLeft(), attribute.getRight()); + } + // The ee8 ServletContextHandler.get() bridges the ee8 context to a core org.eclipse.jetty.server.Handler + handlers.add(context.get()); + } + private static void popularServletParams(ServletHolder servletHolder, ProxyConfiguration config) { int requestBufferSize = -1; try { diff --git a/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/stats/ProxyStats.java b/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/stats/ProxyStats.java index a5c7777448707..3fbf702bdcb2b 100644 --- a/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/stats/ProxyStats.java +++ b/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/stats/ProxyStats.java @@ -24,22 +24,22 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response.Status; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response.Status; import lombok.CustomLog; import org.apache.pulsar.broker.authentication.AuthenticationDataSource; import org.apache.pulsar.broker.authentication.AuthenticationParameters; diff --git a/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/stats/RestException.java b/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/stats/RestException.java index db2b301d4dc46..eb44cc7ceee76 100644 --- a/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/stats/RestException.java +++ b/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/stats/RestException.java @@ -18,11 +18,11 @@ */ package org.apache.pulsar.proxy.stats; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.io.PrintWriter; import java.io.StringWriter; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import org.apache.pulsar.common.policies.data.ErrorData; /** diff --git a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/AdminProxyHandlerKeystoreTLSTest.java b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/AdminProxyHandlerKeystoreTLSTest.java index f53dd0fea276b..3d2d7e5a676b1 100644 --- a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/AdminProxyHandlerKeystoreTLSTest.java +++ b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/AdminProxyHandlerKeystoreTLSTest.java @@ -37,7 +37,7 @@ import org.apache.pulsar.metadata.impl.ZKMetadataStore; import org.apache.pulsar.policies.data.loadbalancer.LoadManagerReport; import org.apache.pulsar.policies.data.loadbalancer.LoadReport; -import org.eclipse.jetty.ee8.servlet.ServletHolder; +import org.eclipse.jetty.ee10.servlet.ServletHolder; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; diff --git a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/AdminProxyHandlerTest.java b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/AdminProxyHandlerTest.java index c1eaeb1b171ed..82927d94bbf07 100644 --- a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/AdminProxyHandlerTest.java +++ b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/AdminProxyHandlerTest.java @@ -23,15 +23,15 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import static org.testng.Assert.assertEquals; +import jakarta.servlet.ServletConfig; +import jakarta.servlet.ServletContext; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.lang.reflect.Field; import java.nio.ByteBuffer; -import javax.servlet.ServletConfig; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import org.apache.pulsar.client.api.Authentication; import org.eclipse.jetty.client.HttpClient; import org.eclipse.jetty.client.Request; diff --git a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/AuthedAdminProxyHandlerTest.java b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/AuthedAdminProxyHandlerTest.java index 1af1c2d27610b..d093fffe7a760 100644 --- a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/AuthedAdminProxyHandlerTest.java +++ b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/AuthedAdminProxyHandlerTest.java @@ -39,7 +39,7 @@ import org.apache.pulsar.metadata.impl.ZKMetadataStore; import org.apache.pulsar.policies.data.loadbalancer.LoadManagerReport; import org.apache.pulsar.policies.data.loadbalancer.LoadReport; -import org.eclipse.jetty.ee8.servlet.ServletHolder; +import org.eclipse.jetty.ee10.servlet.ServletHolder; import org.testng.Assert; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; diff --git a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/FunctionWorkerRoutingTest.java b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/FunctionWorkerRoutingTest.java index 1188fc164cd2b..a2bcaec83738e 100644 --- a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/FunctionWorkerRoutingTest.java +++ b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/FunctionWorkerRoutingTest.java @@ -20,7 +20,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import lombok.Cleanup; import org.apache.pulsar.client.api.Authentication; import org.apache.pulsar.client.api.AuthenticationFactory; diff --git a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyAdditionalServletTest.java b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyAdditionalServletTest.java index 50984e46fb1ef..deddb6760566d 100644 --- a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyAdditionalServletTest.java +++ b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyAdditionalServletTest.java @@ -21,6 +21,12 @@ import static org.mockito.Mockito.doReturn; import static org.testng.Assert.assertEquals; import com.google.common.collect.Sets; +import jakarta.servlet.Servlet; +import jakarta.servlet.ServletConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; import java.io.IOException; import java.net.URL; import java.nio.file.Path; @@ -29,12 +35,6 @@ import java.util.Map; import java.util.Optional; import java.util.Properties; -import javax.servlet.Servlet; -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletOutputStream; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; import lombok.CustomLog; import okhttp3.OkHttpClient; import okhttp3.Response; @@ -49,7 +49,6 @@ import org.apache.pulsar.common.configuration.PulsarConfigurationLoader; import org.apache.pulsar.common.util.ObjectMapperFactory; import org.apache.pulsar.metadata.impl.ZKMetadataStore; -import org.eclipse.jetty.ee8.nested.Request; import org.mockito.Mockito; import org.testng.Assert; import org.testng.annotations.AfterClass; @@ -159,7 +158,7 @@ public ServletConfig getServletConfig() { public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { log.info() - .attr("path", ((Request) servletRequest).getOriginalURI()) + .attr("path", ((jakarta.servlet.http.HttpServletRequest) servletRequest).getRequestURI()) .log("service]"); String value = servletRequest.getParameterMap().get(QUERY_PARAM)[0]; ServletOutputStream servletOutputStream = servletResponse.getOutputStream(); @@ -184,7 +183,7 @@ public void destroy() { Mockito.when(proxyAdditionalServlet.getBasePath()).thenReturn(BASE_PATH); Mockito.when(proxyAdditionalServlet.getServletInstance()).thenReturn(servlet); Mockito.when(proxyAdditionalServlet.getServletType()).thenReturn( - AdditionalServlet.AdditionalServletType.JAVAX_SERVLET); + AdditionalServlet.AdditionalServletType.JAKARTA_SERVLET); AdditionalServlets proxyAdditionalServlets = Mockito.mock(AdditionalServlets.class); Map map = new HashMap<>(); diff --git a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyIsAHttpProxyTest.java b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyIsAHttpProxyTest.java index b31b663112e82..c5a5a483d3f74 100644 --- a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyIsAHttpProxyTest.java +++ b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyIsAHttpProxyTest.java @@ -19,20 +19,20 @@ package org.apache.pulsar.proxy.server; import static java.nio.charset.StandardCharsets.UTF_8; +import jakarta.servlet.AsyncContext; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.core.Response; import java.io.IOException; import java.util.Properties; import java.util.Queue; import java.util.concurrent.CompletableFuture; import java.util.concurrent.LinkedBlockingQueue; import java.util.function.BooleanSupplier; -import javax.servlet.AsyncContext; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.core.Response; import lombok.Cleanup; import lombok.CustomLog; import org.apache.pulsar.broker.auth.MockedPulsarServiceBaseTest; @@ -44,11 +44,8 @@ import org.apache.pulsar.metadata.impl.ZKMetadataStore; import org.eclipse.jetty.client.HttpClient; import org.eclipse.jetty.client.Result; -import org.eclipse.jetty.ee8.nested.AbstractHandler; -import org.eclipse.jetty.ee8.nested.ContextHandler; -import org.eclipse.jetty.ee8.nested.Request; -import org.eclipse.jetty.ee8.servlet.ServletContextHandler; -import org.eclipse.jetty.ee8.servlet.ServletHolder; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; +import org.eclipse.jetty.ee10.servlet.ServletHolder; import org.eclipse.jetty.http.UriCompliance; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Handler; @@ -102,20 +99,20 @@ protected void setup() throws Exception { } private static Handler newHandler(String text) { - AbstractHandler handler = new AbstractHandler() { + ServletContextHandler context = new ServletContextHandler(); + context.setContextPath("/"); + context.addServlet(new ServletHolder(new HttpServlet() { @Override - public void handle(String target, Request baseRequest, HttpServletRequest request, - HttpServletResponse response) - throws IOException, ServletException { + protected void service(HttpServletRequest request, HttpServletResponse response) + throws IOException { response.setContentType("text/plain;charset=utf-8"); response.setStatus(HttpServletResponse.SC_OK); - baseRequest.setHandled(true); String uri = request.getRequestURI(); response.getWriter().println(String.format("%s,%s", text, uri.substring(0, uri.length() > 1024 ? 1024 : uri.length()))); } - }; - return new ContextHandler("/", handler).get(); + }), "/"); + return context; } private static ServletContextHandler newStreamingHandler(LinkedBlockingQueue dataQueue) { diff --git a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyPackagesUploadTest.java b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyPackagesUploadTest.java index cf4cd1b189d4e..2abbba4272890 100644 --- a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyPackagesUploadTest.java +++ b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyPackagesUploadTest.java @@ -39,7 +39,7 @@ import org.asynchttpclient.Response; import org.asynchttpclient.request.body.multipart.FilePart; import org.asynchttpclient.request.body.multipart.StringPart; -import org.eclipse.jetty.ee8.servlet.ServletHolder; +import org.eclipse.jetty.ee10.servlet.ServletHolder; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; diff --git a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyPrometheusMetricsTest.java b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyPrometheusMetricsTest.java index d9a988eaef806..7dc715baac947 100644 --- a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyPrometheusMetricsTest.java +++ b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyPrometheusMetricsTest.java @@ -28,6 +28,9 @@ import io.prometheus.client.Collector; import io.prometheus.client.CollectorRegistry; import io.prometheus.client.Counter; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.core.Response; import java.time.Duration; import java.util.List; import java.util.Map; @@ -35,9 +38,6 @@ import java.util.TreeMap; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.core.Response; import lombok.Cleanup; import org.apache.pulsar.broker.ServiceConfiguration; import org.apache.pulsar.broker.auth.MockedPulsarServiceBaseTest; diff --git a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyStatsTest.java b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyStatsTest.java index 5f9ea70a5e52e..02b22bafacaf8 100644 --- a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyStatsTest.java +++ b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyStatsTest.java @@ -26,15 +26,15 @@ import static org.testng.Assert.assertTrue; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.concurrent.TimeUnit; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.Entity; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import lombok.Cleanup; import org.apache.pulsar.broker.ServiceConfiguration; import org.apache.pulsar.broker.auth.MockedPulsarServiceBaseTest; diff --git a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyWithJwtAuthorizationTest.java b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyWithJwtAuthorizationTest.java index 9c561ea69ad82..6c1b874f3c908 100644 --- a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyWithJwtAuthorizationTest.java +++ b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyWithJwtAuthorizationTest.java @@ -22,6 +22,8 @@ import com.google.common.collect.Sets; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.core.Response; import java.util.Base64; import java.util.Collections; import java.util.HashSet; @@ -29,8 +31,6 @@ import java.util.Set; import java.util.concurrent.TimeUnit; import javax.crypto.SecretKey; -import javax.ws.rs.client.Client; -import javax.ws.rs.core.Response; import lombok.Cleanup; import lombok.CustomLog; import org.apache.pulsar.broker.authentication.AuthenticationProviderToken; @@ -468,7 +468,7 @@ void testGetStatus() throws Exception { registerCloseable(new BrokerDiscoveryProvider(proxyConfig, resource)), proxyClientAuthentication); webServer.start(); @Cleanup - final Client client = javax.ws.rs.client.ClientBuilder + final Client client = jakarta.ws.rs.client.ClientBuilder .newClient(new ClientConfig().register(LoggingFeature.class)); try { final Response r = client.target(webServer.getServiceUri()).path("/status.html").request().get(); @@ -497,7 +497,7 @@ void testGetMetrics() throws Exception { registerCloseable(new BrokerDiscoveryProvider(proxyConfig, resource)), proxyClientAuthentication); webServer.start(); @Cleanup - Client client = javax.ws.rs.client.ClientBuilder.newClient(new ClientConfig().register(LoggingFeature.class)); + Client client = jakarta.ws.rs.client.ClientBuilder.newClient(new ClientConfig().register(LoggingFeature.class)); try { Response r = client.target(webServer.getServiceUri()).path("/metrics").request().get(); Assert.assertEquals(r.getStatus(), Response.Status.OK.getStatusCode()); diff --git a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/SuperUserAuthedAdminProxyHandlerTest.java b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/SuperUserAuthedAdminProxyHandlerTest.java index f7bb47cc3ad37..974fd5c1489e8 100644 --- a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/SuperUserAuthedAdminProxyHandlerTest.java +++ b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/SuperUserAuthedAdminProxyHandlerTest.java @@ -38,7 +38,7 @@ import org.apache.pulsar.metadata.impl.ZKMetadataStore; import org.apache.pulsar.policies.data.loadbalancer.LoadManagerReport; import org.apache.pulsar.policies.data.loadbalancer.LoadReport; -import org.eclipse.jetty.ee8.servlet.ServletHolder; +import org.eclipse.jetty.ee10.servlet.ServletHolder; import org.testng.Assert; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; diff --git a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/UnauthedAdminProxyHandlerTest.java b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/UnauthedAdminProxyHandlerTest.java index 8003047a8eed3..038a8485ad430 100644 --- a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/UnauthedAdminProxyHandlerTest.java +++ b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/UnauthedAdminProxyHandlerTest.java @@ -19,14 +19,14 @@ package org.apache.pulsar.proxy.server; import static org.mockito.Mockito.spy; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.WebTarget; import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Set; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; import lombok.Cleanup; import org.apache.pulsar.broker.auth.MockedPulsarServiceBaseTest; import org.apache.pulsar.broker.authentication.AuthenticationService; @@ -37,7 +37,7 @@ import org.apache.pulsar.common.configuration.PulsarConfigurationLoader; import org.apache.pulsar.common.configuration.VipStatus; import org.apache.pulsar.metadata.impl.ZKMetadataStore; -import org.eclipse.jetty.ee8.servlet.ServletHolder; +import org.eclipse.jetty.ee10.servlet.ServletHolder; import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.logging.LoggingFeature; import org.testng.Assert; diff --git a/pulsar-websocket/build.gradle.kts b/pulsar-websocket/build.gradle.kts index 2f8b76dbdecce..40b322787c468 100644 --- a/pulsar-websocket/build.gradle.kts +++ b/pulsar-websocket/build.gradle.kts @@ -32,16 +32,18 @@ dependencies { implementation(libs.jersey.container.servlet) implementation(libs.jersey.hk2) implementation(libs.gson) - implementation(libs.jackson.jaxrs.json.provider) + implementation(libs.jackson.jakarta.rs.json.provider) implementation(libs.jetty.server) - implementation(libs.jetty.ee8.servlet) - implementation(libs.jetty.ee8.servlets) + // ee10 + jakarta.servlet for the REST/admin tier (Jersey 3) and the WebSocket endpoint layer + implementation(libs.jetty.ee10.servlet) + implementation(libs.jetty.ee10.servlets) + implementation(libs.jakarta.servlet.api) + // Modern Jetty 12 WebSocket API on the ee10 stack (PIP-472) + implementation(libs.jetty.ee10.websocket.jetty.server) implementation(libs.jetty.websocket.jetty.api) - implementation(libs.jetty.ee8.websocket.jetty.server) implementation(libs.jetty.websocket.jetty.client) implementation(libs.hdrHistogram) implementation(libs.picocli) - implementation(libs.javax.servlet.api) implementation(libs.netty.common) implementation(libs.netty.buffer) diff --git a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/AbstractWebSocketHandler.java b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/AbstractWebSocketHandler.java index 6c219f5fd6af4..930cb4f571a1d 100644 --- a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/AbstractWebSocketHandler.java +++ b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/AbstractWebSocketHandler.java @@ -23,6 +23,8 @@ import com.fasterxml.jackson.databind.ObjectWriter; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Splitter; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.Closeable; import java.io.IOException; import java.nio.ByteBuffer; @@ -32,8 +34,6 @@ import java.util.TreeMap; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.CustomLog; import lombok.Getter; import org.apache.pulsar.broker.authentication.AuthenticationDataHttps; @@ -57,12 +57,12 @@ import org.apache.pulsar.common.util.Codec; import org.apache.pulsar.common.util.ObjectMapperFactory; import org.apache.pulsar.websocket.data.ConsumerCommand; -import org.eclipse.jetty.ee8.websocket.api.Session; -import org.eclipse.jetty.ee8.websocket.api.WebSocketAdapter; -import org.eclipse.jetty.ee8.websocket.server.JettyServerUpgradeResponse; +import org.eclipse.jetty.ee10.websocket.server.JettyServerUpgradeResponse; +import org.eclipse.jetty.websocket.api.Callback; +import org.eclipse.jetty.websocket.api.Session; @CustomLog -public abstract class AbstractWebSocketHandler extends WebSocketAdapter implements Closeable { +public abstract class AbstractWebSocketHandler extends Session.Listener.AbstractAutoDemanding implements Closeable { protected final WebSocketService service; protected final HttpServletRequest request; @@ -218,27 +218,26 @@ private void closePingFuture() { } @Override - public void onWebSocketConnect(Session session) { + public void onWebSocketOpen(Session session) { if (!allowConnect) { throw new IllegalStateException("allowConnect is false. " + "JettyWebSocketCreator should have returned null to prevent connecting."); } - super.onWebSocketConnect(session); + super.onWebSocketOpen(session); int webSocketPingDurationSeconds = service.getConfig().getWebSocketPingDurationSeconds(); if (webSocketPingDurationSeconds > 0) { pingFuture = service.getExecutor().scheduleAtFixedRate(() -> { - try { - session.getRemote().sendPing(ByteBuffer.wrap("PING".getBytes(StandardCharsets.UTF_8))); - } catch (IOException e) { - log.warn() - .attr("remoteAddress", getSession().getRemoteAddress()) - .exception(e) - .log("WebSocket send ping"); - } + session.sendPing(ByteBuffer.wrap("PING".getBytes(StandardCharsets.UTF_8)), + Callback.from(() -> { }, e -> { + log.warn() + .attr("remoteAddress", getSession().getRemoteSocketAddress()) + .exception(e) + .log("WebSocket send ping"); + })); }, webSocketPingDurationSeconds, webSocketPingDurationSeconds, TimeUnit.SECONDS); } log.info() - .attr("remoteAddress", session.getRemoteAddress()) + .attr("remoteAddress", session.getRemoteSocketAddress()) .attr("topic", topic) .log("New WebSocket session on topic"); } @@ -247,7 +246,7 @@ public void onWebSocketConnect(Session session) { public void onWebSocketError(Throwable cause) { super.onWebSocketError(cause); log.info() - .attr("remoteAddress", getSession().getRemoteAddress()) + .attr("remoteAddress", getSession().getRemoteSocketAddress()) .attr("topic", topic) .attr("message", cause.getMessage()) .log("WebSocket error on topic"); @@ -265,7 +264,7 @@ public void onWebSocketError(Throwable cause) { @Override public void onWebSocketClose(int statusCode, String reason) { log.info() - .attr("remoteAddress", getSession().getRemoteAddress()) + .attr("remoteAddress", getSession().getRemoteSocketAddress()) .attr("topic", topic) .attr("status", statusCode) .attr("reason", reason) @@ -275,7 +274,7 @@ public void onWebSocketClose(int statusCode, String reason) { close(); } catch (IOException e) { log.warn() - .attr("remoteAddress", getSession().getRemoteAddress()) + .attr("remoteAddress", getSession().getRemoteSocketAddress()) .attr("topic", topic) .exception(e) .log("Failed to close handler for topic"); @@ -284,22 +283,22 @@ public void onWebSocketClose(int statusCode, String reason) { public void close(WebSocketError error) { log.warn() - .attr("remoteAddress", getSession().getRemoteAddress()) + .attr("remoteAddress", getSession().getRemoteSocketAddress()) .attr("topic", topic) .attr("code", error.getCode()) .attr("reason", error.getDescription()) .log("Closing WebSocket session for topic - code: , reason"); - getSession().close(error.getCode(), error.getDescription()); + getSession().close(error.getCode(), error.getDescription(), Callback.NOOP); } public void close(WebSocketError error, String message) { log.warn() - .attr("remoteAddress", getSession().getRemoteAddress()) + .attr("remoteAddress", getSession().getRemoteSocketAddress()) .attr("topic", topic) .attr("code", error.getCode()) .attr("reason", error.getDescription() + ": " + message) .log("Closing WebSocket session for topic - code: , reason"); - getSession().close(error.getCode(), error.getDescription() + ": " + message); + getSession().close(error.getCode(), error.getDescription() + ": " + message, Callback.NOOP); } protected String checkAuthentication() { diff --git a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/ConsumerHandler.java b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/ConsumerHandler.java index 354b010d3ecae..b0ee29e48ec5e 100644 --- a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/ConsumerHandler.java +++ b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/ConsumerHandler.java @@ -25,6 +25,7 @@ import com.google.common.base.Splitter; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; +import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.Base64; import java.util.List; @@ -33,7 +34,6 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLongFieldUpdater; import java.util.concurrent.atomic.LongAdder; -import javax.servlet.http.HttpServletRequest; import lombok.CustomLog; import org.apache.pulsar.broker.authentication.AuthenticationDataSource; import org.apache.pulsar.broker.authentication.AuthenticationDataSubscription; @@ -55,9 +55,9 @@ import org.apache.pulsar.websocket.data.ConsumerCommand; import org.apache.pulsar.websocket.data.ConsumerMessage; import org.apache.pulsar.websocket.data.EndOfTopicResponse; -import org.eclipse.jetty.ee8.websocket.api.Session; -import org.eclipse.jetty.ee8.websocket.api.WriteCallback; -import org.eclipse.jetty.ee8.websocket.server.JettyServerUpgradeResponse; +import org.eclipse.jetty.ee10.websocket.server.JettyServerUpgradeResponse; +import org.eclipse.jetty.websocket.api.Callback; +import org.eclipse.jetty.websocket.api.Session; /** * @@ -173,7 +173,7 @@ private void receiveMessage() { consumer.receiveAsync().thenAccept(msg -> { log.debug() - .attr("remoteAddress", getSession().getRemoteAddress()) + .attr("remoteAddress", getSession().getRemoteSocketAddress()) .attr("topic", topic) .attr("subscription", subscription) .attr("message", msg.getMessageId()) @@ -197,32 +197,26 @@ private void receiveMessage() { messageIdCache.put(dm.messageId, msg.getMessageId()); try { - getSession().getRemote() - .sendString(objectWriter().writeValueAsString(dm), - new WriteCallback() { - @Override - public void writeFailed(Throwable th) { - log.warn() - .attr("topic", consumer.getTopic()) - .attr("subscription", subscription) - .attr("msg", getRemote().getRemoteAddress().toString()) - .attr("message", th.getMessage()) - .log("/ ] Failed to deliver msg to"); - pendingMessages.decrementAndGet(); - // schedule receive as one of the delivery failed - service.getExecutor().execute(() -> receiveMessage()); - } - - @Override - public void writeSuccess() { - log.debug() - .attr("topic", consumer.getTopic()) - .attr("subscription", subscription) - .attr("successfully", getRemote().getRemoteAddress().toString()) - .log("/ ] message is delivered successfully to"); - updateDeliverMsgStat(msgSize); - } - }); + getSession() + .sendText(objectWriter().writeValueAsString(dm), + Callback.from(() -> { + log.debug() + .attr("topic", consumer.getTopic()) + .attr("subscription", subscription) + .attr("successfully", getSession().getRemoteSocketAddress()) + .log("/ ] message is delivered successfully to"); + updateDeliverMsgStat(msgSize); + }, th -> { + log.warn() + .attr("topic", consumer.getTopic()) + .attr("subscription", subscription) + .attr("msg", getSession().getRemoteSocketAddress()) + .attr("message", th.getMessage()) + .log("/ ] Failed to deliver msg to"); + pendingMessages.decrementAndGet(); + // schedule receive as one of the delivery failed + service.getExecutor().execute(() -> receiveMessage()); + })); } catch (JsonProcessingException e) { close(WebSocketError.FailedToSerializeToJSON); } @@ -242,7 +236,7 @@ public void writeSuccess() { log.warn() .attr("topic", consumer.getTopic()) .attr("subscription", subscription) - .attr("msg", getRemote().getRemoteAddress().toString()) + .attr("msg", getSession().getRemoteSocketAddress()) .attr("message", exception.getMessage()) .log("/ ] Error occurred while consumer handler was delivering msg to"); } @@ -251,8 +245,8 @@ public void writeSuccess() { } @Override - public void onWebSocketConnect(Session session) { - super.onWebSocketConnect(session); + public void onWebSocketOpen(Session session) { + super.onWebSocketOpen(session); if (!pullMode) { receiveMessage(); } @@ -286,32 +280,26 @@ private void handleEndOfTopic() { log.debug() .attr("topic", consumer.getTopic()) .attr("subscription", subscription) - .attr("request", getRemote().getRemoteAddress().toString()) + .attr("request", getSession().getRemoteSocketAddress()) .log("/ ] Received check reach the end of topic request from"); try { String msg = objectWriter().writeValueAsString( new EndOfTopicResponse(consumer.hasReachedEndOfTopic())); - getSession().getRemote() - .sendString(msg, new WriteCallback() { - @Override - public void writeFailed(Throwable th) { - log.warn() - .attr("topic", consumer.getTopic()) - .attr("subscription", subscription) - .attr("msg", getRemote().getRemoteAddress().toString()) - .attr("due", th.getMessage()) - .log("/ ] Failed to send end of topic msg to due to"); - } - - @Override - public void writeSuccess() { - log.debug() - .attr("topic", consumer.getTopic()) - .attr("subscription", subscription) - .attr("successfully", getRemote().getRemoteAddress().toString()) - .log("/ ] End of topic message is delivered successfully to"); - } - }); + getSession() + .sendText(msg, Callback.from(() -> { + log.debug() + .attr("topic", consumer.getTopic()) + .attr("subscription", subscription) + .attr("successfully", getSession().getRemoteSocketAddress()) + .log("/ ] End of topic message is delivered successfully to"); + }, th -> { + log.warn() + .attr("topic", consumer.getTopic()) + .attr("subscription", subscription) + .attr("msg", getSession().getRemoteSocketAddress()) + .attr("due", th.getMessage()) + .log("/ ] Failed to send end of topic msg to due to"); + })); } catch (JsonProcessingException e) { log.warn() .attr("topic", consumer.getTopic()) @@ -329,7 +317,7 @@ private void handleUnsubscribe(ConsumerCommand command) throws PulsarClientExcep log.debug() .attr("topic", consumer.getTopic()) .attr("subscription", subscription) - .attr("request", getRemote().getRemoteAddress().toString()) + .attr("request", getSession().getRemoteSocketAddress()) .log("/ ] Received unsubscribe request from"); consumer.unsubscribe(); } @@ -351,7 +339,7 @@ private void handleAck(ConsumerCommand command) throws IOException { .attr("topic", consumer.getTopic()) .attr("subscription", subscription) .attr("message", msgId) - .attr("toString", getRemote().getRemoteAddress().toString()) + .attr("toString", getSession().getRemoteSocketAddress()) .log("/ ] Received ack request of message from"); MessageId originalMsgId = messageIdCache.asMap().remove(command.messageId); @@ -371,7 +359,7 @@ private void handleNack(ConsumerCommand command) throws IOException { .attr("topic", consumer.getTopic()) .attr("subscription", subscription) .attr("message", msgId) - .attr("toString", getRemote().getRemoteAddress().toString()) + .attr("toString", getSession().getRemoteSocketAddress()) .log("/ ] Received negative ack request of message from"); MessageId originalMsgId = messageIdCache.asMap().remove(command.messageId); @@ -388,7 +376,7 @@ private void handlePermit(ConsumerCommand command) throws IOException { .attr("topic", consumer.getTopic()) .attr("subscription", subscription) .attr("received", command.permitMessages) - .attr("request", getRemote().getRemoteAddress().toString()) + .attr("request", getSession().getRemoteSocketAddress()) .log("/ ] Received permits request from"); if (command.permitMessages == null) { throw new IOException("Missing required permitMessages field for 'permit' command"); diff --git a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/MultiTopicConsumerHandler.java b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/MultiTopicConsumerHandler.java index 82dea5b2acff5..7452d54f5d427 100644 --- a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/MultiTopicConsumerHandler.java +++ b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/MultiTopicConsumerHandler.java @@ -21,11 +21,11 @@ import static com.google.common.base.Preconditions.checkArgument; import static java.util.concurrent.TimeUnit.SECONDS; import com.google.common.base.Splitter; +import jakarta.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeoutException; -import javax.servlet.http.HttpServletRequest; import lombok.CustomLog; import org.apache.pulsar.broker.authentication.AuthenticationDataSource; import org.apache.pulsar.broker.authentication.AuthenticationDataSubscription; @@ -33,7 +33,7 @@ import org.apache.pulsar.common.policies.data.TopicOperation; import org.apache.pulsar.common.util.Codec; import org.apache.pulsar.common.util.FutureUtil; -import org.eclipse.jetty.ee8.websocket.server.JettyServerUpgradeResponse; +import org.eclipse.jetty.ee10.websocket.server.JettyServerUpgradeResponse; /** * Subscribing for multi-topic. diff --git a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/ProducerHandler.java b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/ProducerHandler.java index 4ca4676745772..2d1f46cc47427 100644 --- a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/ProducerHandler.java +++ b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/ProducerHandler.java @@ -29,6 +29,8 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectReader; import com.google.common.base.Enums; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.time.format.DateTimeParseException; import java.util.Arrays; @@ -41,8 +43,6 @@ import java.util.concurrent.atomic.AtomicLongFieldUpdater; import java.util.concurrent.atomic.LongAdder; import java.util.stream.Collectors; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.CustomLog; import org.apache.commons.lang3.StringUtils; import org.apache.pulsar.broker.authentication.AuthenticationDataSource; @@ -63,8 +63,8 @@ import org.apache.pulsar.websocket.data.ProducerMessage; import org.apache.pulsar.websocket.service.WSSDummyMessageCryptoImpl; import org.apache.pulsar.websocket.stats.StatsBuckets; -import org.eclipse.jetty.ee8.websocket.api.WriteCallback; -import org.eclipse.jetty.ee8.websocket.server.JettyServerUpgradeResponse; +import org.eclipse.jetty.ee10.websocket.server.JettyServerUpgradeResponse; +import org.eclipse.jetty.websocket.api.Callback; /** * Websocket end-point url handler to handle incoming message coming from client. Websocket end-point url handler to @@ -178,7 +178,7 @@ public void close() throws IOException { @Override public void onWebSocketText(String message) { log.debug(e -> e.attr("topic", producer.getTopic()) - .attr("producer", getRemote().getRemoteAddress().toString()) + .attr("producer", getSession().getRemoteSocketAddress()) .log("Received new message from producer")); ProducerMessage sendRequest; byte[] rawPayload = null; @@ -270,17 +270,17 @@ public void onWebSocketText(String message) { builder.sendAsync().thenAccept(msgId -> { log.debug(e -> e.attr("topic", producer.getTopic()) .attr("iD", msgId) - .attr("producer", getRemote().getRemoteAddress().toString()) + .attr("producer", getSession().getRemoteSocketAddress()) .log("Success fully write the message to broker with returned message ID from producer")); updateSentMsgStats(msgSize, TimeUnit.NANOSECONDS.toMicros(System.nanoTime() - now)); - if (isConnected()) { + if (getSession().isOpen()) { String messageId = Base64.getEncoder().encodeToString(msgId.toByteArray()); sendAckResponse(new ProducerAck(messageId, sendRequest.context)); } }).exceptionally(exception -> { log.warn() .attr("topic", producer.getTopic()) - .attr("msg", getRemote().getRemoteAddress().toString()) + .attr("msg", getSession().getRemoteSocketAddress()) .exception(exception) .log("Error occurred while producer handler was sending msg from"); numMsgsFailed.increment(); @@ -344,23 +344,17 @@ protected Boolean isAuthorized(String authRole, AuthenticationDataSource authent private void sendAckResponse(ProducerAck response) { try { String msg = objectWriter().writeValueAsString(response); - getSession().getRemote().sendString(msg, new WriteCallback() { - @Override - public void writeFailed(Throwable th) { - log.warn() - .attr("topic", producer.getTopic()) - .attr("ack", th.getMessage()) - .log("Failed to send ack"); - } - - @Override - public void writeSuccess() { - log.debug() - .attr("topic", producer.getTopic()) - .attr("successfully", getRemote().getRemoteAddress().toString()) - .log("Ack was sent successfully to"); - } - }); + getSession().sendText(msg, Callback.from(() -> { + log.debug() + .attr("topic", producer.getTopic()) + .attr("successfully", getSession().getRemoteSocketAddress()) + .log("Ack was sent successfully to"); + }, th -> { + log.warn() + .attr("topic", producer.getTopic()) + .attr("ack", th.getMessage()) + .log("Failed to send ack"); + })); } catch (JsonProcessingException e) { log.warn() .attr("topic", producer.getTopic()) diff --git a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/ReaderHandler.java b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/ReaderHandler.java index 1e28aa1c9758e..5419b369c9223 100644 --- a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/ReaderHandler.java +++ b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/ReaderHandler.java @@ -21,14 +21,14 @@ import static java.util.concurrent.TimeUnit.SECONDS; import static org.apache.commons.lang3.StringUtils.isNotBlank; import com.fasterxml.jackson.core.JsonProcessingException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Base64; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLongFieldUpdater; import java.util.concurrent.atomic.LongAdder; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.CustomLog; import org.apache.pulsar.broker.authentication.AuthenticationDataSource; import org.apache.pulsar.broker.authentication.AuthenticationDataSubscription; @@ -47,9 +47,9 @@ import org.apache.pulsar.websocket.data.ConsumerCommand; import org.apache.pulsar.websocket.data.ConsumerMessage; import org.apache.pulsar.websocket.data.EndOfTopicResponse; -import org.eclipse.jetty.ee8.websocket.api.Session; -import org.eclipse.jetty.ee8.websocket.api.WriteCallback; -import org.eclipse.jetty.ee8.websocket.server.JettyServerUpgradeResponse; +import org.eclipse.jetty.ee10.websocket.server.JettyServerUpgradeResponse; +import org.eclipse.jetty.websocket.api.Callback; +import org.eclipse.jetty.websocket.api.Session; /** * @@ -170,7 +170,7 @@ private void receiveMessage() { reader.readNextAsync().thenAccept(msg -> { log.debug() - .attr("remoteAddress", getSession().getRemoteAddress()) + .attr("remoteAddress", getSession().getRemoteSocketAddress()) .attr("topic", topic) .attr("subscription", subscription) .attr("message", msg.getMessageId()) @@ -191,32 +191,26 @@ private void receiveMessage() { final long msgSize = msg.getData().length; try { - getSession().getRemote() - .sendString(objectWriter().writeValueAsString(dm), - new WriteCallback() { - @Override - public void writeFailed(Throwable th) { - log.warn() - .attr("topic", reader.getTopic()) - .attr("subscription", subscription) - .attr("msg", getRemote().getRemoteAddress().toString()) - .attr("message", th.getMessage()) - .log("/ ] Failed to deliver msg to"); - pendingMessages.decrementAndGet(); - // schedule receive as one of the delivery failed - service.getExecutor().execute(() -> receiveMessage()); - } - - @Override - public void writeSuccess() { - log.debug() - .attr("topic", reader.getTopic()) - .attr("subscription", subscription) - .attr("successfully", getRemote().getRemoteAddress().toString()) - .log("/ ] message is delivered successfully to"); - updateDeliverMsgStat(msgSize); - } - }); + getSession() + .sendText(objectWriter().writeValueAsString(dm), + Callback.from(() -> { + log.debug() + .attr("topic", reader.getTopic()) + .attr("subscription", subscription) + .attr("successfully", getSession().getRemoteSocketAddress()) + .log("/ ] message is delivered successfully to"); + updateDeliverMsgStat(msgSize); + }, th -> { + log.warn() + .attr("topic", reader.getTopic()) + .attr("subscription", subscription) + .attr("msg", getSession().getRemoteSocketAddress()) + .attr("message", th.getMessage()) + .log("/ ] Failed to deliver msg to"); + pendingMessages.decrementAndGet(); + // schedule receive as one of the delivery failed + service.getExecutor().execute(() -> receiveMessage()); + })); } catch (JsonProcessingException e) { close(WebSocketError.FailedToSerializeToJSON); } @@ -236,7 +230,7 @@ public void writeSuccess() { log.warn() .attr("topic", reader.getTopic()) .attr("subscription", subscription) - .attr("msg", getRemote().getRemoteAddress().toString()) + .attr("msg", getSession().getRemoteSocketAddress()) .attr("message", exception.getMessage()) .log("/ ] Error occurred while reader handler was delivering msg to"); } @@ -245,8 +239,8 @@ public void writeSuccess() { } @Override - public void onWebSocketConnect(Session session) { - super.onWebSocketConnect(session); + public void onWebSocketOpen(Session session) { + super.onWebSocketOpen(session); receiveMessage(); } @@ -280,27 +274,21 @@ private void handleEndOfTopic() { try { String msg = objectWriter().writeValueAsString( new EndOfTopicResponse(reader.hasReachedEndOfTopic())); - getSession().getRemote() - .sendString(msg, new WriteCallback() { - @Override - public void writeFailed(Throwable th) { - log.warn() - .attr("topic", reader.getTopic()) - .attr("subscription", subscription) - .attr("msg", getRemote().getRemoteAddress().toString()) - .attr("due", th.getMessage()) - .log("/ ] Failed to send end of topic msg to due to"); - } - - @Override - public void writeSuccess() { - log.debug() - .attr("topic", reader.getTopic()) - .attr("subscription", subscription) - .attr("successfully", getRemote().getRemoteAddress().toString()) - .log("/ ] End of topic message is delivered successfully to"); - } - }); + getSession() + .sendText(msg, Callback.from(() -> { + log.debug() + .attr("topic", reader.getTopic()) + .attr("subscription", subscription) + .attr("successfully", getSession().getRemoteSocketAddress()) + .log("/ ] End of topic message is delivered successfully to"); + }, th -> { + log.warn() + .attr("topic", reader.getTopic()) + .attr("subscription", subscription) + .attr("msg", getSession().getRemoteSocketAddress()) + .attr("due", th.getMessage()) + .log("/ ] Failed to send end of topic msg to due to"); + })); } catch (JsonProcessingException e) { log.warn() .attr("topic", reader.getTopic()) diff --git a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/WebSocketConsumerServlet.java b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/WebSocketConsumerServlet.java index 4e6079b15a958..0fce28a42075f 100644 --- a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/WebSocketConsumerServlet.java +++ b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/WebSocketConsumerServlet.java @@ -19,8 +19,8 @@ package org.apache.pulsar.websocket; import java.time.Duration; -import org.eclipse.jetty.ee8.websocket.server.JettyWebSocketServlet; -import org.eclipse.jetty.ee8.websocket.server.JettyWebSocketServletFactory; +import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServlet; +import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServletFactory; public class WebSocketConsumerServlet extends JettyWebSocketServlet { private static final long serialVersionUID = 1L; diff --git a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/WebSocketHttpServletRequestWrapper.java b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/WebSocketHttpServletRequestWrapper.java index 6b8e6edb8a83c..3acf3bfece9d4 100644 --- a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/WebSocketHttpServletRequestWrapper.java +++ b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/WebSocketHttpServletRequestWrapper.java @@ -18,8 +18,8 @@ */ package org.apache.pulsar.websocket; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; /** * WebSocket HttpServletRequest wrapper. diff --git a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/WebSocketMultiTopicConsumerServlet.java b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/WebSocketMultiTopicConsumerServlet.java index 82f9c5e1d83c4..e68ca5e0328d0 100644 --- a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/WebSocketMultiTopicConsumerServlet.java +++ b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/WebSocketMultiTopicConsumerServlet.java @@ -19,8 +19,8 @@ package org.apache.pulsar.websocket; import java.time.Duration; -import org.eclipse.jetty.ee8.websocket.server.JettyWebSocketServlet; -import org.eclipse.jetty.ee8.websocket.server.JettyWebSocketServletFactory; +import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServlet; +import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServletFactory; public class WebSocketMultiTopicConsumerServlet extends JettyWebSocketServlet { private static final long serialVersionUID = 1L; diff --git a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/WebSocketProducerServlet.java b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/WebSocketProducerServlet.java index 8f87cf822864b..a47500f8d57f8 100644 --- a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/WebSocketProducerServlet.java +++ b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/WebSocketProducerServlet.java @@ -19,8 +19,8 @@ package org.apache.pulsar.websocket; import java.time.Duration; -import org.eclipse.jetty.ee8.websocket.server.JettyWebSocketServlet; -import org.eclipse.jetty.ee8.websocket.server.JettyWebSocketServletFactory; +import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServlet; +import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServletFactory; public class WebSocketProducerServlet extends JettyWebSocketServlet { private static final long serialVersionUID = 1L; diff --git a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/WebSocketReaderServlet.java b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/WebSocketReaderServlet.java index b0a399497bf5f..87656afb273ea 100644 --- a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/WebSocketReaderServlet.java +++ b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/WebSocketReaderServlet.java @@ -19,8 +19,8 @@ package org.apache.pulsar.websocket; import java.time.Duration; -import org.eclipse.jetty.ee8.websocket.server.JettyWebSocketServlet; -import org.eclipse.jetty.ee8.websocket.server.JettyWebSocketServletFactory; +import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServlet; +import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServletFactory; public class WebSocketReaderServlet extends JettyWebSocketServlet { private static final transient long serialVersionUID = 1L; diff --git a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/WebSocketService.java b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/WebSocketService.java index b173660c50a70..d05cc1247b1da 100644 --- a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/WebSocketService.java +++ b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/WebSocketService.java @@ -21,6 +21,7 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank; import static org.apache.pulsar.common.naming.Constants.WEBSOCKET_DUMMY_ORIGINAL_PRINCIPLE; import io.netty.util.concurrent.DefaultThreadFactory; +import jakarta.servlet.ServletException; import java.io.Closeable; import java.io.IOException; import java.net.MalformedURLException; @@ -31,7 +32,6 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import javax.servlet.ServletException; import lombok.CustomLog; import lombok.Getter; import org.apache.commons.lang3.StringUtils; diff --git a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/admin/WebSocketProxyStatsBase.java b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/admin/WebSocketProxyStatsBase.java index 3da7d9d0a75be..8d47b41150d6e 100644 --- a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/admin/WebSocketProxyStatsBase.java +++ b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/admin/WebSocketProxyStatsBase.java @@ -18,10 +18,10 @@ */ package org.apache.pulsar.websocket.admin; +import jakarta.ws.rs.core.Response.Status; import java.util.Collection; import java.util.HashMap; import java.util.Map; -import javax.ws.rs.core.Response.Status; import lombok.CustomLog; import org.apache.pulsar.common.naming.TopicName; import org.apache.pulsar.common.stats.Metrics; diff --git a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/admin/WebSocketWebResource.java b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/admin/WebSocketWebResource.java index 760f3f812ccda..bb5f767f9525e 100644 --- a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/admin/WebSocketWebResource.java +++ b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/admin/WebSocketWebResource.java @@ -19,12 +19,12 @@ package org.apache.pulsar.websocket.admin; import static org.apache.commons.lang3.StringUtils.isBlank; +import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Response.Status; +import jakarta.ws.rs.core.UriInfo; import javax.naming.AuthenticationException; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response.Status; -import javax.ws.rs.core.UriInfo; import lombok.CustomLog; import org.apache.pulsar.broker.authentication.AuthenticationDataHttps; import org.apache.pulsar.broker.authentication.AuthenticationDataSource; diff --git a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/admin/v2/WebSocketProxyStatsV2.java b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/admin/v2/WebSocketProxyStatsV2.java index 9cf1b6dd1fca8..3435ec6210400 100644 --- a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/admin/v2/WebSocketProxyStatsV2.java +++ b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/admin/v2/WebSocketProxyStatsV2.java @@ -23,14 +23,14 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import jakarta.ws.rs.Encoded; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import java.util.Collection; import java.util.Map; -import javax.ws.rs.Encoded; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; import org.apache.pulsar.common.naming.TopicName; import org.apache.pulsar.common.stats.Metrics; import org.apache.pulsar.websocket.admin.WebSocketProxyStatsBase; diff --git a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/service/ProxyServer.java b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/service/ProxyServer.java index c04fab358f280..66dfefd372d3c 100644 --- a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/service/ProxyServer.java +++ b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/service/ProxyServer.java @@ -18,6 +18,8 @@ */ package org.apache.pulsar.websocket.service; +import jakarta.servlet.Servlet; +import jakarta.servlet.ServletException; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.Arrays; @@ -27,8 +29,6 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import javax.servlet.Servlet; -import javax.servlet.ServletException; import lombok.CustomLog; import org.apache.pulsar.broker.PulsarServerException; import org.apache.pulsar.broker.web.JettyRequestLogFactory; @@ -40,9 +40,8 @@ import org.apache.pulsar.common.util.PulsarSslConfiguration; import org.apache.pulsar.common.util.PulsarSslFactory; import org.apache.pulsar.jetty.tls.JettySslContextFactory; -import org.eclipse.jetty.ee8.servlet.ServletContextHandler; -import org.eclipse.jetty.ee8.servlet.ServletHolder; -import org.eclipse.jetty.ee8.websocket.server.config.JettyWebSocketServletContainerInitializer; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; +import org.eclipse.jetty.ee10.servlet.ServletHolder; import org.eclipse.jetty.http.UriCompliance; import org.eclipse.jetty.server.ConnectionFactory; import org.eclipse.jetty.server.ForwardedRequestCustomizer; @@ -150,14 +149,17 @@ public ProxyServer(WebSocketProxyConfiguration config) server.setConnectors(connectors.toArray(new ServerConnector[connectors.size()])); } + // WebSocket endpoints use the modern Jetty 12 WebSocket API on the ee10 / jakarta.servlet stack + // (PIP-472), registered into an ee10 Jetty context that coexists with the ee10 REST contexts. public void addWebSocketServlet(String basePath, Servlet socketServlet) throws ServletException { ServletHolder servletHolder = new ServletHolder("ws-events", socketServlet); ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath(basePath); context.addServlet(servletHolder, MATCH_ALL); - JettyWebSocketServletContainerInitializer.configure(context, null); - handlers.add(context.get()); + org.eclipse.jetty.ee10.websocket.server.config.JettyWebSocketServletContainerInitializer + .configure(context, null); + handlers.add(context); } public void addRestResource(String basePath, String attribute, Object attributeValue, Class resourceClass) { @@ -170,7 +172,7 @@ public void addRestResource(String basePath, String attribute, Object attributeV context.setContextPath(basePath); context.addServlet(servletHolder, MATCH_ALL); context.setAttribute(attribute, attributeValue); - handlers.add(context.get()); + handlers.add(context); } public void start() throws PulsarServerException { diff --git a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/stats/ProxyTopicStat.java b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/stats/ProxyTopicStat.java index 0c8651eb3f9e8..a4bf01d2cb16e 100644 --- a/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/stats/ProxyTopicStat.java +++ b/pulsar-websocket/src/main/java/org/apache/pulsar/websocket/stats/ProxyTopicStat.java @@ -45,7 +45,7 @@ public ProducerStats() { } public ProducerStats(ProducerHandler handler) { - this.remoteConnection = handler.getRemote().getRemoteAddress().toString(); + this.remoteConnection = handler.getSession().getRemoteSocketAddress().toString(); this.numberOfMsgPublished = handler.getMsgPublishedCounter(); } @@ -62,14 +62,14 @@ public ConsumerStats(ConsumerHandler handler) { this.subscriptionName = handler.getSubscription(); this.subscriptionType = handler.getSubscriptionType(); this.subscriptionMode = handler.getSubscriptionMode(); - this.remoteConnection = handler.getRemote().getRemoteAddress().toString(); + this.remoteConnection = handler.getSession().getRemoteSocketAddress().toString(); this.numberOfMsgDelivered = handler.getMsgDeliveredCounter(); } public ConsumerStats(ReaderHandler handler) { this.subscriptionName = handler.getSubscription(); this.subscriptionType = handler.getSubscriptionType(); - this.remoteConnection = handler.getRemote().getRemoteAddress().toString(); + this.remoteConnection = handler.getSession().getRemoteSocketAddress().toString(); this.numberOfMsgDelivered = handler.getMsgDeliveredCounter(); } diff --git a/pulsar-websocket/src/test/java/org/apache/pulsar/websocket/AbstractWebSocketHandlerTest.java b/pulsar-websocket/src/test/java/org/apache/pulsar/websocket/AbstractWebSocketHandlerTest.java index 2d75bc187b8cd..aa0ed89c72cb7 100644 --- a/pulsar-websocket/src/test/java/org/apache/pulsar/websocket/AbstractWebSocketHandlerTest.java +++ b/pulsar-websocket/src/test/java/org/apache/pulsar/websocket/AbstractWebSocketHandlerTest.java @@ -26,6 +26,7 @@ import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; import com.google.common.base.Splitter; +import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; @@ -37,7 +38,6 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import javax.servlet.http.HttpServletRequest; import lombok.Cleanup; import lombok.Getter; import org.apache.pulsar.broker.authentication.AuthenticationDataSource; @@ -55,10 +55,9 @@ import org.apache.pulsar.common.naming.TopicName; import org.apache.pulsar.common.util.Codec; import org.apache.pulsar.websocket.service.WebSocketProxyConfiguration; -import org.eclipse.jetty.ee8.websocket.api.RemoteEndpoint; -import org.eclipse.jetty.ee8.websocket.api.Session; -import org.eclipse.jetty.ee8.websocket.server.JettyServerUpgradeResponse; +import org.eclipse.jetty.ee10.websocket.server.JettyServerUpgradeResponse; import org.eclipse.jetty.http.HttpStatus; +import org.eclipse.jetty.websocket.api.Session; import org.mockito.Answers; import org.mockito.Mock; import org.testng.annotations.AfterClass; @@ -388,11 +387,9 @@ public void testPingFuture() throws IOException { new WebSocketHandlerImpl(webSocketService, httpServletRequest, response); Session session = mock(Session.class); - RemoteEndpoint remoteEndpoint = mock(RemoteEndpoint.class); - when(session.getRemote()).thenReturn(remoteEndpoint); // onWebSocketClose - webSocketHandler.onWebSocketConnect(session); + webSocketHandler.onWebSocketOpen(session); ScheduledFuture pingFuture = webSocketHandler.getPingFuture(); assertNotNull(pingFuture); @@ -403,7 +400,7 @@ public void testPingFuture() throws IOException { // onWebSocketError - webSocketHandler.onWebSocketConnect(session); + webSocketHandler.onWebSocketOpen(session); pingFuture = webSocketHandler.getPingFuture(); assertNotNull(pingFuture); diff --git a/pulsar-websocket/src/test/java/org/apache/pulsar/websocket/PingPongSupportTest.java b/pulsar-websocket/src/test/java/org/apache/pulsar/websocket/PingPongSupportTest.java index b40f4784e4ea3..ead50634cc7a0 100644 --- a/pulsar-websocket/src/test/java/org/apache/pulsar/websocket/PingPongSupportTest.java +++ b/pulsar-websocket/src/test/java/org/apache/pulsar/websocket/PingPongSupportTest.java @@ -21,24 +21,24 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.testng.Assert.assertTrue; +import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; import java.net.URI; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; -import javax.servlet.http.HttpServletRequest; import lombok.Cleanup; import org.apache.pulsar.broker.ServiceConfiguration; import org.apache.pulsar.broker.authentication.AuthenticationDataSource; import org.apache.pulsar.broker.web.WebExecutorThreadPool; import org.eclipse.jetty.client.HttpClient; -import org.eclipse.jetty.ee8.servlet.ServletContextHandler; -import org.eclipse.jetty.ee8.servlet.ServletHolder; -import org.eclipse.jetty.ee8.websocket.server.JettyServerUpgradeResponse; -import org.eclipse.jetty.ee8.websocket.server.JettyWebSocketServlet; -import org.eclipse.jetty.ee8.websocket.server.JettyWebSocketServletFactory; -import org.eclipse.jetty.ee8.websocket.server.config.JettyWebSocketServletContainerInitializer; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; +import org.eclipse.jetty.ee10.servlet.ServletHolder; +import org.eclipse.jetty.ee10.websocket.server.JettyServerUpgradeResponse; +import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServlet; +import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServletFactory; +import org.eclipse.jetty.ee10.websocket.server.config.JettyWebSocketServletContainerInitializer; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.util.BufferUtil; diff --git a/pulsar-websocket/src/test/java/org/apache/pulsar/websocket/ProducerHandlerTest.java b/pulsar-websocket/src/test/java/org/apache/pulsar/websocket/ProducerHandlerTest.java index 540d8e45f9381..b36ff621b78df 100644 --- a/pulsar-websocket/src/test/java/org/apache/pulsar/websocket/ProducerHandlerTest.java +++ b/pulsar-websocket/src/test/java/org/apache/pulsar/websocket/ProducerHandlerTest.java @@ -25,13 +25,13 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.Base64; import java.util.HashMap; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; -import javax.servlet.http.HttpServletRequest; import org.apache.pulsar.client.api.Producer; import org.apache.pulsar.client.api.ProducerBuilder; import org.apache.pulsar.client.api.PulsarClient; @@ -40,7 +40,7 @@ import org.apache.pulsar.client.impl.TypedMessageBuilderImpl; import org.apache.pulsar.common.util.ObjectMapperFactory; import org.apache.pulsar.websocket.data.ProducerMessage; -import org.eclipse.jetty.ee8.websocket.server.JettyServerUpgradeResponse; +import org.eclipse.jetty.ee10.websocket.server.JettyServerUpgradeResponse; import org.testng.annotations.Test; public class ProducerHandlerTest { diff --git a/pulsar-websocket/src/test/java/org/apache/pulsar/websocket/ReaderHandlerTest.java b/pulsar-websocket/src/test/java/org/apache/pulsar/websocket/ReaderHandlerTest.java index 9db1561ec5a9a..1760a68b7ee4a 100644 --- a/pulsar-websocket/src/test/java/org/apache/pulsar/websocket/ReaderHandlerTest.java +++ b/pulsar-websocket/src/test/java/org/apache/pulsar/websocket/ReaderHandlerTest.java @@ -27,6 +27,8 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Base64; import java.util.HashMap; @@ -35,8 +37,6 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.function.Function; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import org.apache.pulsar.client.api.Message; import org.apache.pulsar.client.api.MessageId; import org.apache.pulsar.client.api.PulsarClient; @@ -49,7 +49,7 @@ import org.apache.pulsar.client.impl.MultiTopicsReaderImpl; import org.apache.pulsar.client.impl.ReaderImpl; import org.apache.pulsar.common.api.proto.MessageIdData; -import org.eclipse.jetty.ee8.websocket.server.JettyServerUpgradeResponse; +import org.eclipse.jetty.ee10.websocket.server.JettyServerUpgradeResponse; import org.testng.Assert; import org.testng.annotations.Test; diff --git a/pulsar-websocket/src/test/java/org/apache/pulsar/websocket/WebSocketHttpServletRequestWrapperTest.java b/pulsar-websocket/src/test/java/org/apache/pulsar/websocket/WebSocketHttpServletRequestWrapperTest.java index 684f9a2fdd92b..67330b0640e4e 100644 --- a/pulsar-websocket/src/test/java/org/apache/pulsar/websocket/WebSocketHttpServletRequestWrapperTest.java +++ b/pulsar-websocket/src/test/java/org/apache/pulsar/websocket/WebSocketHttpServletRequestWrapperTest.java @@ -18,7 +18,7 @@ */ package org.apache.pulsar.websocket; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import lombok.Cleanup; import org.apache.pulsar.common.configuration.PulsarConfigurationLoader; import org.apache.pulsar.websocket.service.WebSocketProxyConfiguration; diff --git a/pulsar-websocket/src/test/java/org/apache/pulsar/websocket/admin/WebSocketWebResourceTest.java b/pulsar-websocket/src/test/java/org/apache/pulsar/websocket/admin/WebSocketWebResourceTest.java index 5ab806a63008f..123bba0d22b4d 100644 --- a/pulsar-websocket/src/test/java/org/apache/pulsar/websocket/admin/WebSocketWebResourceTest.java +++ b/pulsar-websocket/src/test/java/org/apache/pulsar/websocket/admin/WebSocketWebResourceTest.java @@ -25,12 +25,12 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import com.google.common.collect.Sets; +import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.Response.Status; +import jakarta.ws.rs.core.UriInfo; import java.lang.reflect.Method; import javax.naming.AuthenticationException; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.Response.Status; -import javax.ws.rs.core.UriInfo; import org.apache.pulsar.broker.ServiceConfiguration; import org.apache.pulsar.broker.authentication.AuthenticationDataHttps; import org.apache.pulsar.broker.authentication.AuthenticationDataSource; diff --git a/tests/docker-images/java-test-plugins/build.gradle.kts b/tests/docker-images/java-test-plugins/build.gradle.kts index 80fd48e25e631..bb6f3af9813c4 100644 --- a/tests/docker-images/java-test-plugins/build.gradle.kts +++ b/tests/docker-images/java-test-plugins/build.gradle.kts @@ -28,4 +28,5 @@ dependencies { compileOnly(project(":pulsar-broker")) compileOnly(libs.netty.transport) compileOnly(libs.javax.servlet.api) + compileOnly(libs.jakarta.servlet.api) } diff --git a/tests/docker-images/java-test-plugins/src/main/java/org/apache/pulsar/tests/integration/plugins/LoggingBrokerInterceptor.java b/tests/docker-images/java-test-plugins/src/main/java/org/apache/pulsar/tests/integration/plugins/LoggingBrokerInterceptor.java index 20bb6036ed500..cfd52e304f566 100644 --- a/tests/docker-images/java-test-plugins/src/main/java/org/apache/pulsar/tests/integration/plugins/LoggingBrokerInterceptor.java +++ b/tests/docker-images/java-test-plugins/src/main/java/org/apache/pulsar/tests/integration/plugins/LoggingBrokerInterceptor.java @@ -19,12 +19,12 @@ package org.apache.pulsar.tests.integration.plugins; import io.netty.buffer.ByteBuf; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; import java.io.IOException; import java.util.Map; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; import lombok.CustomLog; import org.apache.bookkeeper.mledger.Entry; import org.apache.pulsar.broker.PulsarService; diff --git a/tiered-storage/jcloud/build.gradle.kts b/tiered-storage/jcloud/build.gradle.kts index b16d7bb32c9e0..2b449f780f840 100644 --- a/tiered-storage/jcloud/build.gradle.kts +++ b/tiered-storage/jcloud/build.gradle.kts @@ -35,7 +35,7 @@ dependencies { implementation(libs.aws.java.sdk.core) implementation(libs.aws.java.sdk.sts) runtimeOnly(libs.jakarta.xml.bind.api) - runtimeOnly(libs.jakarta.activation) + runtimeOnly(libs.angus.activation) testImplementation(project(":managed-ledger")) testImplementation(project(":testmocks")) From 79dc4119690438851cc688e8ecf427d72095d415 Mon Sep 17 00:00:00 2001 From: Lari Hotari Date: Sun, 31 May 2026 02:07:29 +0300 Subject: [PATCH 02/10] [fix] Keep io.prometheus:simpleclient_servlet (javax) for out-of-scope jetty-upgrade modules The global swap to simpleclient_servlet_jakarta broke jetty-upgrade/*-prometheus-metrics (io.prometheus.client.exporter.MetricsServlet), which legitimately stay on the javax Prometheus servlet. No Pulsar code uses the jakarta variant. Assisted-by: Claude Code (Opus 4.8) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d9c1d0bdbb2c2..444b2cb8ec1f2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -298,7 +298,7 @@ simpleclient = { module = "io.prometheus:simpleclient", version.ref = "prometheu simpleclient-hotspot = { module = "io.prometheus:simpleclient_hotspot", version.ref = "prometheus" } simpleclient-caffeine = { module = "io.prometheus:simpleclient_caffeine", version.ref = "prometheus" } simpleclient-httpserver = { module = "io.prometheus:simpleclient_httpserver", version.ref = "prometheus" } -simpleclient-servlet = { module = "io.prometheus:simpleclient_servlet_jakarta", version.ref = "prometheus" } +simpleclient-servlet = { module = "io.prometheus:simpleclient_servlet", version.ref = "prometheus" } simpleclient-common = { module = "io.prometheus:simpleclient_common", version.ref = "prometheus" } simpleclient-log4j2 = { module = "io.prometheus:simpleclient_log4j2", version.ref = "prometheus" } prometheus-jmx-collector = { module = "io.prometheus.jmx:collector", version.ref = "prometheus-jmx" } From f8db303799b96acd863b4e31a26e43d0a677b7ce Mon Sep 17 00:00:00 2001 From: Lari Hotari Date: Sun, 31 May 2026 02:30:31 +0300 Subject: [PATCH 03/10] [fix] Update binary LICENSE for jakarta deps; fix jakarta test runtime - distribution/{server,shell} LICENSE.bin.txt: jersey 2.42->3.1.10, hk2 2.6.1->3.0.6, jackson-jaxrs->jackson-jakarta-rs, jakarta API version bumps, Angus activation impl, hk2.external jakarta.inject -> jakarta.inject:jakarta.inject-api, jetty ee8->ee10 jars (ee8-servlet retained), + jakarta.servlet/CDI/interceptor API jars. - BrokerAdditionalServletTest / ProxyAdditionalServletTest: declare JAKARTA_SERVLET so the jakarta servlets route to the ee10 environment; drop ee8.nested.Request casts. - CounterBrokerInterceptor: read path/status via the jakarta servlet API instead of casting to Jetty's Response/ee8.nested.Response. Assisted-by: Claude Code (Opus 4.8) --- .../server/src/assemble/LICENSE.bin.txt | 75 ++++++++++--------- .../shell/src/assemble/LICENSE.bin.txt | 39 +++++----- .../intercept/CounterBrokerInterceptor.java | 12 +-- 3 files changed, 62 insertions(+), 64 deletions(-) diff --git a/distribution/server/src/assemble/LICENSE.bin.txt b/distribution/server/src/assemble/LICENSE.bin.txt index 5cb6438d7c810..785bb44bb70d3 100644 --- a/distribution/server/src/assemble/LICENSE.bin.txt +++ b/distribution/server/src/assemble/LICENSE.bin.txt @@ -253,9 +253,9 @@ The Apache Software License, Version 2.0 - com.fasterxml.jackson.core-jackson-core-2.21.3.jar - com.fasterxml.jackson.core-jackson-databind-2.21.3.jar - com.fasterxml.jackson.dataformat-jackson-dataformat-yaml-2.21.3.jar - - com.fasterxml.jackson.jaxrs-jackson-jaxrs-base-2.21.3.jar - - com.fasterxml.jackson.jaxrs-jackson-jaxrs-json-provider-2.21.3.jar - - com.fasterxml.jackson.module-jackson-module-jaxb-annotations-2.21.3.jar + - com.fasterxml.jackson.jakarta.rs-jackson-jakarta-rs-base-2.21.3.jar + - com.fasterxml.jackson.jakarta.rs-jackson-jakarta-rs-json-provider-2.21.3.jar + - com.fasterxml.jackson.module-jackson-module-jakarta-xmlbind-annotations-2.21.3.jar - com.fasterxml.jackson.module-jackson-module-jsonSchema-2.21.3.jar - com.fasterxml.jackson.datatype-jackson-datatype-jdk8-2.21.3.jar - com.fasterxml.jackson.datatype-jackson-datatype-jsr310-2.21.3.jar @@ -344,7 +344,7 @@ The Apache Software License, Version 2.0 - io.prometheus-prometheus-metrics-exposition-textformats-1.5.1.jar - io.prometheus-prometheus-metrics-model-1.5.1.jar * Jakarta Bean Validation API - - jakarta.validation-jakarta.validation-api-2.0.2.jar + - jakarta.validation-jakarta.validation-api-3.0.2.jar - javax.validation-validation-api-1.1.0.Final.jar * Log4J - org.apache.logging.log4j-log4j-api-2.25.4.jar @@ -410,18 +410,17 @@ The Apache Software License, Version 2.0 - org.eclipse.jetty.compression-jetty-compression-gzip-12.1.9.jar - org.eclipse.jetty.compression-jetty-compression-server-12.1.9.jar - org.eclipse.jetty.ee-jetty-ee-webapp-12.1.9.jar - - org.eclipse.jetty.ee8-jetty-ee8-annotations-12.1.9.jar - org.eclipse.jetty.ee8-jetty-ee8-nested-12.1.9.jar - - org.eclipse.jetty.ee8-jetty-ee8-plus-12.1.9.jar - - org.eclipse.jetty.ee8-jetty-ee8-proxy-12.1.9.jar - org.eclipse.jetty.ee8-jetty-ee8-security-12.1.9.jar - org.eclipse.jetty.ee8-jetty-ee8-servlet-12.1.9.jar - - org.eclipse.jetty.ee8-jetty-ee8-servlets-12.1.9.jar - - org.eclipse.jetty.ee8-jetty-ee8-webapp-12.1.9.jar - - org.eclipse.jetty.ee8.websocket-jetty-ee8-websocket-jetty-api-12.1.9.jar - - org.eclipse.jetty.ee8.websocket-jetty-ee8-websocket-jetty-common-12.1.9.jar - - org.eclipse.jetty.ee8.websocket-jetty-ee8-websocket-jetty-server-12.1.9.jar - - org.eclipse.jetty.ee8.websocket-jetty-ee8-websocket-servlet-12.1.9.jar + - org.eclipse.jetty.ee10-jetty-ee10-annotations-12.1.9.jar + - org.eclipse.jetty.ee10-jetty-ee10-plus-12.1.9.jar + - org.eclipse.jetty.ee10-jetty-ee10-proxy-12.1.9.jar + - org.eclipse.jetty.ee10-jetty-ee10-servlet-12.1.9.jar + - org.eclipse.jetty.ee10-jetty-ee10-servlets-12.1.9.jar + - org.eclipse.jetty.ee10-jetty-ee10-webapp-12.1.9.jar + - org.eclipse.jetty.ee10.websocket-jetty-ee10-websocket-jetty-server-12.1.9.jar + - org.eclipse.jetty.ee10.websocket-jetty-ee10-websocket-servlet-12.1.9.jar - org.eclipse.jetty.toolchain-jetty-servlet-api-4.0.9.jar - org.eclipse.jetty.websocket-jetty-websocket-core-client-12.1.9.jar - org.eclipse.jetty.websocket-jetty-websocket-core-common-12.1.9.jar @@ -429,6 +428,7 @@ The Apache Software License, Version 2.0 - org.eclipse.jetty.websocket-jetty-websocket-jetty-api-12.1.9.jar - org.eclipse.jetty.websocket-jetty-websocket-jetty-client-12.1.9.jar - org.eclipse.jetty.websocket-jetty-websocket-jetty-common-12.1.9.jar + - org.eclipse.jetty.websocket-jetty-websocket-jetty-server-12.1.9.jar * SnakeYaml -- org.yaml-snakeyaml-2.0.jar * RocksDB - org.rocksdb-rocksdbjni-7.9.2.jar * Google Error Prone Annotations - com.google.errorprone-error_prone_annotations-2.45.0.jar @@ -590,37 +590,42 @@ Protocol Buffers License - com.google.protobuf-protobuf-java-util-3.25.5.jar -- ../licenses/LICENSE-protobuf.txt CDDL-1.1 -- ../licenses/LICENSE-CDDL-1.1.txt - * Java Annotations API - - com.sun.activation-jakarta.activation-1.2.2.jar - * Java Servlet API -- javax.servlet-javax.servlet-api-3.1.0.jar + * Java Servlet API + - javax.servlet-javax.servlet-api-3.1.0.jar + - jakarta.servlet-jakarta.servlet-api-6.0.0.jar * HK2 - Dependency Injection Kernel - - org.glassfish.hk2-hk2-api-2.6.1.jar - - org.glassfish.hk2-hk2-locator-2.6.1.jar - - org.glassfish.hk2-hk2-utils-2.6.1.jar + - org.glassfish.hk2-hk2-api-3.0.6.jar + - org.glassfish.hk2-hk2-locator-3.0.6.jar + - org.glassfish.hk2-hk2-utils-3.0.6.jar - org.glassfish.hk2-osgi-resource-locator-1.0.3.jar - - org.glassfish.hk2.external-aopalliance-repackaged-2.6.1.jar + - org.glassfish.hk2.external-aopalliance-repackaged-3.0.6.jar * Jersey - - org.glassfish.jersey.containers-jersey-container-servlet-2.42.jar - - org.glassfish.jersey.containers-jersey-container-servlet-core-2.42.jar - - org.glassfish.jersey.core-jersey-client-2.42.jar - - org.glassfish.jersey.core-jersey-common-2.42.jar - - org.glassfish.jersey.core-jersey-server-2.42.jar - - org.glassfish.jersey.ext-jersey-entity-filtering-2.42.jar - - org.glassfish.jersey.media-jersey-media-json-jackson-2.42.jar - - org.glassfish.jersey.media-jersey-media-multipart-2.42.jar - - org.glassfish.jersey.inject-jersey-hk2-2.42.jar + - org.glassfish.jersey.containers-jersey-container-servlet-3.1.10.jar + - org.glassfish.jersey.containers-jersey-container-servlet-core-3.1.10.jar + - org.glassfish.jersey.core-jersey-client-3.1.10.jar + - org.glassfish.jersey.core-jersey-common-3.1.10.jar + - org.glassfish.jersey.core-jersey-server-3.1.10.jar + - org.glassfish.jersey.ext-jersey-entity-filtering-3.1.10.jar + - org.glassfish.jersey.media-jersey-media-json-jackson-3.1.10.jar + - org.glassfish.jersey.media-jersey-media-multipart-3.1.10.jar + - org.glassfish.jersey.inject-jersey-hk2-3.1.10.jar * Mimepull -- org.jvnet.mimepull-mimepull-1.9.15.jar Eclipse Distribution License 1.0 -- ../licenses/LICENSE-EDL-1.0.txt * Jakarta Activation - - jakarta.activation-jakarta.activation-api-1.2.2.jar - * Jakarta XML Binding -- jakarta.xml.bind-jakarta.xml.bind-api-2.3.3.jar + - jakarta.activation-jakarta.activation-api-2.1.3.jar + - org.eclipse.angus-angus-activation-2.0.2.jar + * Jakarta XML Binding -- jakarta.xml.bind-jakarta.xml.bind-api-4.0.2.jar Eclipse Public License - v2.0 -- ../licenses/LICENSE-EPL-2.0.txt - * Jakarta Annotations API -- jakarta.annotation-jakarta.annotation-api-1.3.5.jar - * Jakarta RESTful Web Services -- jakarta.ws.rs-jakarta.ws.rs-api-2.1.6.jar - * Jakarta Injection -- org.glassfish.hk2.external-jakarta.inject-2.6.1.jar - * Jakarta Transactions API -- jakarta.transaction-jakarta.transaction-api-1.3.3.jar + * Jakarta Annotations API -- jakarta.annotation-jakarta.annotation-api-2.1.1.jar + * Jakarta RESTful Web Services -- jakarta.ws.rs-jakarta.ws.rs-api-3.1.0.jar + * Jakarta Injection -- jakarta.inject-jakarta.inject-api-2.0.1.jar + * Jakarta Transactions API -- jakarta.transaction-jakarta.transaction-api-2.0.1.jar + * Jakarta CDI API + - jakarta.enterprise-jakarta.enterprise.cdi-api-4.0.1.jar + - jakarta.enterprise-jakarta.enterprise.lang-model-4.0.1.jar + * Jakarta Interceptors API -- jakarta.interceptor-jakarta.interceptor-api-2.1.0.jar Public Domain (CC0) -- ../licenses/LICENSE-CC0.txt * Reactive Streams -- org.reactivestreams-reactive-streams-1.0.4.jar diff --git a/distribution/shell/src/assemble/LICENSE.bin.txt b/distribution/shell/src/assemble/LICENSE.bin.txt index a56e6b5f20c6a..8ebc33c245100 100644 --- a/distribution/shell/src/assemble/LICENSE.bin.txt +++ b/distribution/shell/src/assemble/LICENSE.bin.txt @@ -317,9 +317,9 @@ The Apache Software License, Version 2.0 - jackson-core-2.21.3.jar - jackson-databind-2.21.3.jar - jackson-dataformat-yaml-2.21.3.jar - - jackson-jaxrs-base-2.21.3.jar - - jackson-jaxrs-json-provider-2.21.3.jar - - jackson-module-jaxb-annotations-2.21.3.jar + - jackson-jakarta-rs-base-2.21.3.jar + - jackson-jakarta-rs-json-provider-2.21.3.jar + - jackson-module-jakarta-xmlbind-annotations-2.21.3.jar - jackson-module-jsonSchema-2.21.3.jar - jackson-datatype-jdk8-2.21.3.jar - jackson-datatype-jsr310-2.21.3.jar @@ -436,33 +436,32 @@ MIT License - slf4j-api-2.0.17.jar CDDL-1.1 -- ../licenses/LICENSE-CDDL-1.1.txt - * Java Annotations API - - jakarta.activation-1.2.2.jar * HK2 - Dependency Injection Kernel - - hk2-api-2.6.1.jar - - hk2-locator-2.6.1.jar - - hk2-utils-2.6.1.jar - - aopalliance-repackaged-2.6.1.jar + - hk2-api-3.0.6.jar + - hk2-locator-3.0.6.jar + - hk2-utils-3.0.6.jar + - aopalliance-repackaged-3.0.6.jar - osgi-resource-locator-1.0.3.jar * Jersey - - jersey-client-2.42.jar - - jersey-common-2.42.jar - - jersey-entity-filtering-2.42.jar - - jersey-media-json-jackson-2.42.jar - - jersey-media-multipart-2.42.jar - - jersey-hk2-2.42.jar + - jersey-client-3.1.10.jar + - jersey-common-3.1.10.jar + - jersey-entity-filtering-3.1.10.jar + - jersey-media-json-jackson-3.1.10.jar + - jersey-media-multipart-3.1.10.jar + - jersey-hk2-3.1.10.jar * Mimepull -- mimepull-1.9.15.jar Eclipse Distribution License 1.0 -- ../licenses/LICENSE-EDL-1.0.txt * Jakarta Activation - - jakarta.activation-api-1.2.2.jar + - jakarta.activation-api-2.1.3.jar + - angus-activation-2.0.2.jar - validation-api-1.1.0.Final.jar - * Jakarta XML Binding -- jakarta.xml.bind-api-2.3.3.jar + * Jakarta XML Binding -- jakarta.xml.bind-api-4.0.2.jar Eclipse Public License - v2.0 -- ../licenses/LICENSE-EPL-2.0.txt - * Jakarta Annotations API -- jakarta.annotation-api-1.3.5.jar - * Jakarta RESTful Web Services -- jakarta.ws.rs-api-2.1.6.jar - * Jakarta Injection -- jakarta.inject-2.6.1.jar + * Jakarta Annotations API -- jakarta.annotation-api-2.1.1.jar + * Jakarta RESTful Web Services -- jakarta.ws.rs-api-3.1.0.jar + * Jakarta Injection -- jakarta.inject-api-2.0.1.jar Public Domain (CC0) -- ../licenses/LICENSE-CC0.txt * Reactive Streams -- reactive-streams-1.0.4.jar diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/CounterBrokerInterceptor.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/CounterBrokerInterceptor.java index 4d70828b52ffb..b8f85ff250bda 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/CounterBrokerInterceptor.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/intercept/CounterBrokerInterceptor.java @@ -24,6 +24,7 @@ import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; import java.util.Map; @@ -46,7 +47,6 @@ import org.apache.pulsar.common.api.proto.MessageMetadata; import org.apache.pulsar.common.api.proto.TxnAction; import org.apache.pulsar.common.intercept.InterceptException; -import org.eclipse.jetty.server.Response; @CustomLog @@ -229,14 +229,8 @@ public void onWebserviceResponse(ServletRequest request, ServletResponse respons log.debug().attr("count", count) .attr("url", ((HttpServletRequest) request).getRequestURL().toString()) .attr("response", response).log("On Webservice response"); - if (response instanceof Response) { - Response res = (Response) response; - responseList.add(new ResponseEvent(res.getRequest().getHttpURI().getPath(), res.getStatus())); - } else if (response instanceof org.eclipse.jetty.ee8.nested.Response) { - org.eclipse.jetty.ee8.nested.Response res = (org.eclipse.jetty.ee8.nested.Response) response; - responseList.add( - new ResponseEvent(res.getHttpChannel().getRequest().getHttpURI().getPath(), res.getStatus())); - } + responseList.add(new ResponseEvent(((HttpServletRequest) request).getRequestURI(), + ((HttpServletResponse) response).getStatus())); } From 05294517c7b9ce85cac6f8094cde98c5b430ae28 Mon Sep 17 00:00:00 2001 From: Lari Hotari Date: Sun, 31 May 2026 02:42:53 +0300 Subject: [PATCH 04/10] [fix] Re-add com.sun.activation:jakarta.activation:1.2.2 to binary LICENSE It is still bundled transitively (the javax.activation JAF impl) alongside the new org.eclipse.angus:angus-activation; both must be listed. Assisted-by: Claude Code (Opus 4.8) --- distribution/server/src/assemble/LICENSE.bin.txt | 1 + distribution/shell/src/assemble/LICENSE.bin.txt | 1 + pip/pip-472-notes.md | 16 ++++++++++++++++ 3 files changed, 18 insertions(+) diff --git a/distribution/server/src/assemble/LICENSE.bin.txt b/distribution/server/src/assemble/LICENSE.bin.txt index 785bb44bb70d3..e6e607c3637df 100644 --- a/distribution/server/src/assemble/LICENSE.bin.txt +++ b/distribution/server/src/assemble/LICENSE.bin.txt @@ -615,6 +615,7 @@ Eclipse Distribution License 1.0 -- ../licenses/LICENSE-EDL-1.0.txt * Jakarta Activation - jakarta.activation-jakarta.activation-api-2.1.3.jar - org.eclipse.angus-angus-activation-2.0.2.jar + - com.sun.activation-jakarta.activation-1.2.2.jar * Jakarta XML Binding -- jakarta.xml.bind-jakarta.xml.bind-api-4.0.2.jar Eclipse Public License - v2.0 -- ../licenses/LICENSE-EPL-2.0.txt diff --git a/distribution/shell/src/assemble/LICENSE.bin.txt b/distribution/shell/src/assemble/LICENSE.bin.txt index 8ebc33c245100..2ac49e6e73307 100644 --- a/distribution/shell/src/assemble/LICENSE.bin.txt +++ b/distribution/shell/src/assemble/LICENSE.bin.txt @@ -455,6 +455,7 @@ Eclipse Distribution License 1.0 -- ../licenses/LICENSE-EDL-1.0.txt * Jakarta Activation - jakarta.activation-api-2.1.3.jar - angus-activation-2.0.2.jar + - jakarta.activation-1.2.2.jar - validation-api-1.1.0.Final.jar * Jakarta XML Binding -- jakarta.xml.bind-api-4.0.2.jar diff --git a/pip/pip-472-notes.md b/pip/pip-472-notes.md index 83c7563a7bc1b..0cef3f188d688 100644 --- a/pip/pip-472-notes.md +++ b/pip/pip-472-notes.md @@ -122,6 +122,22 @@ Pushed to `forked` (lhotari/pulsar); PR opened to exercise full CI. Remaining kn some AdditionalServlet unit tests / `CounterBrokerInterceptor` may need runtime tweaks; Swagger 1→2 (Phase B); Checkstyle import-ban lint + LICENSE/NOTICE (Phase C). +## CI iteration log + +- **Run 1** (`cb35f7ed5bd`): build failed — `jetty-upgrade/*-prometheus-metrics` compile error from the global + `simpleclient_servlet`→jakarta swap. Reverted that alias to the javax variant (`fa3b0c45f86`). +- **Run 2** (`fa3b0c45f86`): build **compiled** + checkstyle + spotless **passed**; only `checkBinaryLicense` + failed (server + shell). Updated both `LICENSE.bin.txt` for the jersey-3.1/hk2-3.x/jakarta jar set; also fixed + `CounterBrokerInterceptor` runtime (jakarta servlet API) (`b3c153c5120`). +- **Run 3** (`b3c153c5120`): in progress. + +### Extra local runtime validation (high-risk Jersey 3 / Jetty ee10 areas) +- `FunctionApiV3ResourceTest` (Jersey 3 multipart `FormDataParam`): **71 pass, 0 fail**. +- `AsyncHttpConnectorTest` (custom Jersey Connector SPI + internal `*PropertiesDelegate`): 7 pass; the one + failure `testShouldStopRetriesWhenTimeoutOccurs` is a **pre-existing timing-flaky test** (`Thread.sleep` + + WireMock scenario-state race, already carries a flaky-retry analyzer) — unrelated to the namespace migration, + which does not change the retry/timeout logic. Left for CI flaky-test handling. + ## Decisions log - **D1 (swagger sequencing):** Swagger 1→2 deferred to Phase B (separate commits) so the javax→jakarta core From 83a776119615185d3081b37f163f76b27f998a9c Mon Sep 17 00:00:00 2001 From: Lari Hotari Date: Sun, 31 May 2026 03:33:59 +0300 Subject: [PATCH 05/10] [fix] Jetty 12 ee10 ambiguous-URI decoding + Athenz javax.xml.bind runtime dep - Allow %2F-encoded path separators in admin/REST URLs: Jetty 12 ee10 rejects ambiguous URIs at the servlet layer (independent of the connector UriCompliance), which broke admin operations on topics whose names contain encoded separators. Enable ServletHandler.setDecodeAmbiguousURIs(true) in broker WebService, proxy WebServer and functions WorkerServer. - Provide javax.xml.bind:jaxb-api at runtime for pulsar-client-auth-athenz and pulsar-broker-auth-athenz: the Athenz ZTS client shades jackson-module-jaxb-annotations which needs the javax.xml.bind package that jakarta.xml.bind-api 2.3.3 used to ship; the bump to 4.0.2 (real jakarta.xml.bind) removed it. Pulsar's own code uses jakarta.xml.bind. See pip/pip-472-notes.md for the full CI-failure triage (incl. the open transaction-unit-test server-side request-body over-read under Jetty 12 ee10). Assisted-by: Claude Code (Opus 4.8) --- gradle/libs.versions.toml | 3 ++ pip/pip-472-notes.md | 37 ++++++++++++++++++- pulsar-broker-auth-athenz/build.gradle.kts | 2 + .../apache/pulsar/broker/web/WebService.java | 4 ++ pulsar-client-auth-athenz/build.gradle.kts | 2 + .../functions/worker/rest/WorkerServer.java | 3 ++ .../apache/pulsar/proxy/server/WebServer.java | 3 ++ 7 files changed, 53 insertions(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 444b2cb8ec1f2..799c8cfffbbcf 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -398,6 +398,9 @@ angus-activation = { module = "org.eclipse.angus:angus-activation", version.ref jakarta-xml-bind-api = { module = "jakarta.xml.bind:jakarta.xml.bind-api", version.ref = "jakarta-xml-bind" } javax-servlet-api = { module = "javax.servlet:javax.servlet-api", version.ref = "javax-servlet" } jakarta-servlet-api = { module = "jakarta.servlet:jakarta.servlet-api", version.ref = "jakarta-servlet" } +# javax.xml.bind:jaxb-api is required at runtime by third-party libraries (Athenz ZTS client shades +# jackson-module-jaxb-annotations which references javax.xml.bind); Pulsar's own code uses jakarta.xml.bind (PIP-472) +jaxb-api = "javax.xml.bind:jaxb-api:2.3.1" jakarta-validation-api = { module = "jakarta.validation:jakarta.validation-api", version.ref = "jakarta-validation" } zt-zip = { module = "org.zeroturnaround:zt-zip", version.ref = "zt-zip" } ipaddress = { module = "com.github.seancfoley:ipaddress", version.ref = "ipaddress" } diff --git a/pip/pip-472-notes.md b/pip/pip-472-notes.md index 0cef3f188d688..6626b25e83b17 100644 --- a/pip/pip-472-notes.md +++ b/pip/pip-472-notes.md @@ -129,7 +129,13 @@ Checkstyle import-ban lint + LICENSE/NOTICE (Phase C). - **Run 2** (`fa3b0c45f86`): build **compiled** + checkstyle + spotless **passed**; only `checkBinaryLicense` failed (server + shell). Updated both `LICENSE.bin.txt` for the jersey-3.1/hk2-3.x/jakarta jar set; also fixed `CounterBrokerInterceptor` runtime (jakarta servlet API) (`b3c153c5120`). -- **Run 3** (`b3c153c5120`): in progress. +- **Run 3** (`b3c153c5120`): `checkBinaryLicense` failed on 2 residual entries — `com.sun.activation:jakarta.activation:1.2.2` + (the javax.activation JAF impl) is still bundled transitively alongside Angus; my agent prompt wrongly said it was + replaced, so it was removed. Re-added it to both LICENSE files (`7a93fa09cd4`). +- **Run 4** (`7a93fa09cd4`): **Build and License check job PASSED** ✅ — full multi-module build + checkstyle + spotless + + binary LICENSE/NOTICE all green. The deterministic build gate is fully cleared. The Pulsar CI **unit + integration + test matrix** is now running (Broker Groups 1–5, Client Api/Impl, Proxy, Pulsar IO/Client/Metadata, Other, + docker + images, MacOS build) — hours of runtime; monitoring for failures and iterating. ### Extra local runtime validation (high-risk Jersey 3 / Jetty ee10 areas) - `FunctionApiV3ResourceTest` (Jersey 3 multipart `FormDataParam`): **71 pass, 0 fail**. @@ -138,6 +144,35 @@ Checkstyle import-ban lint + LICENSE/NOTICE (Phase C). WireMock scenario-state race, already carries a flaky-retry analyzer) — unrelated to the namespace migration, which does not change the retry/timeout logic. Left for CI flaky-test handling. +## Test-job failures triaged (run `26698057762`) + +ALL **integration tests passed** (Standalone, Transaction, Upgrade, Backwards-Compat, Kubernetes, Metrics, +Shade on Java 17/21/25, etc.) and most unit groups passed. Three unit-tier issues found: + +1. **Ambiguous URI (FIXED).** `AMBIGUOUS_PATH_SEPARATOR` HTTP 400 for `%2F`-encoded path segments (topic names). + Jetty 12 ee10's `ServletHandler` rejects ambiguous URIs at the servlet layer independent of the connector's + `UriCompliance.LEGACY`. Fix: `servletContextHandler.getServletHandler().setDecodeAmbiguousURIs(true)` in the + broker `WebService`, proxy `WebServer`, and functions `WorkerServer`. (Affected `AdminApiDynamicConfigurationsTest`, + `PartitionedProducerConsumerTest.testPartitionedTopicNameWithSpecialCharacter`, and similar.) +2. **Athenz `javax.xml.bind` (FIXED).** `NoClassDefFoundError: javax/xml/bind/annotation/XmlElement` — the Athenz + ZTS client shades `jackson-module-jaxb-annotations`, which needs the `javax.xml.bind` package that the old + `jakarta.xml.bind-api:2.3.3` happened to ship; the bump to 4.0.2 (real `jakarta.xml.bind`) removed it. Fix: add + `javax.xml.bind:jaxb-api:2.3.1` (`runtimeOnly`) to `pulsar-client-auth-athenz` + `pulsar-broker-auth-athenz` for + the third-party transitive need (Pulsar's own code uses jakarta.xml.bind). +3. **Transaction unit tests — server-side request-body over-read (OPEN, documented).** All `TransactionTestBase` + subclasses fail in `setup` at `admin.clusters().createCluster(...)` with `HTTP 400 Trailing token (START_OBJECT) + after value bound as ClusterDataImpl ... column 310`. Root-caused with a debug log: the **client serialises a + correct single 309-byte body** (`len=309`, one JSON object) and `prepareRequest` runs **once** (no client-side + doubling — ruled out `new ClientRequest(request)`+`writeEntity` and `enableBuffering` as causes). The broker + reads **one byte past** the 309-byte body (column 310 = a `{`), i.e. Jetty 12 ee10 over-reads the request entity + `InputStream` past Content-Length, picking up a re-sent request on the keep-alive connection. The custom + `AsyncHttpConnector` reuses async-http-client whose internal retry (`maxRequestRetry`, default 5; see its own + `TODO` at line ~364) can re-send on the same connection. **Only the in-process multi-broker UNIT setup trips + this — the Transaction *integration* test passes**, so production is unaffected. Fix direction for follow-up: + either bound/replace the ee10 servlet request stream, or set async-http-client `maxRequestRetry(0)` while keeping + the connector's own failover retries (decoupling `maxRetries` from `getMaxRequestRetry()`), validated against + `TransactionStablePositionTest`. + ## Decisions log - **D1 (swagger sequencing):** Swagger 1→2 deferred to Phase B (separate commits) so the javax→jakarta core diff --git a/pulsar-broker-auth-athenz/build.gradle.kts b/pulsar-broker-auth-athenz/build.gradle.kts index 1d40a2c6e40b5..7a97e535da9ca 100644 --- a/pulsar-broker-auth-athenz/build.gradle.kts +++ b/pulsar-broker-auth-athenz/build.gradle.kts @@ -28,6 +28,8 @@ dependencies { implementation(project(":pulsar-broker-common")) implementation(project(":pulsar-common")) implementation(libs.athenz.zts.java.client) + // Athenz shades jackson-module-jaxb-annotations which needs the javax.xml.bind API at runtime (PIP-472) + runtimeOnly(libs.jaxb.api) implementation(libs.athenz.zpe.java.client) implementation(libs.athenz.cert.refresher) implementation(libs.athenz.auth.core) diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/WebService.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/WebService.java index 27772fc827bfe..7f576e7d19b1a 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/WebService.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/WebService.java @@ -411,6 +411,10 @@ public void addServlet(String path, ServletHolder servletHolder, boolean require // Notice: each context path should be unique, but there's nothing here to verify that servletContextHandler.setContextPath(path); servletContextHandler.addServlet(servletHolder, MATCH_ALL); + // Jetty 12 ee10 rejects ambiguous URIs (e.g. %2F-encoded path separators) at the servlet layer by + // default, independent of the connector's UriCompliance. Pulsar admin paths embed encoded separators + // (e.g. topic names), so the servlet handler must be allowed to decode them (PIP-472 / Jetty 12). + servletContextHandler.getServletHandler().setDecodeAmbiguousURIs(true); if (attributeMap != null) { attributeMap.forEach(servletContextHandler::setAttribute); } diff --git a/pulsar-client-auth-athenz/build.gradle.kts b/pulsar-client-auth-athenz/build.gradle.kts index eea4f829ecf0d..61d35d04fc90f 100644 --- a/pulsar-client-auth-athenz/build.gradle.kts +++ b/pulsar-client-auth-athenz/build.gradle.kts @@ -25,6 +25,8 @@ dependencies { implementation(project(":pulsar-client-api")) implementation(project(":pulsar-client-original")) implementation(libs.athenz.zts.java.client) + // Athenz shades jackson-module-jaxb-annotations which needs the javax.xml.bind API at runtime (PIP-472) + runtimeOnly(libs.jaxb.api) implementation(libs.athenz.cert.refresher) implementation(libs.athenz.auth.core) implementation(libs.guava) diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/WorkerServer.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/WorkerServer.java index a397660067310..e9ef62a250c43 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/WorkerServer.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/WorkerServer.java @@ -265,6 +265,9 @@ static ServletContextHandler newServletContextHandler(String contextPath, final ServletHolder apiServlet = new ServletHolder(new ServletContainer(config)); contextHandler.addServlet(apiServlet, MATCH_ALL); + // Allow %2F-encoded path separators; Jetty 12 ee10 rejects ambiguous URIs at the servlet layer by + // default (PIP-472 / Jetty 12). + contextHandler.getServletHandler().setDecodeAmbiguousURIs(true); filterInitializer.addFilters(contextHandler, requireAuthentication); diff --git a/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/WebServer.java b/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/WebServer.java index aaa931e6c8d99..5bec85c8d39c9 100644 --- a/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/WebServer.java +++ b/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/WebServer.java @@ -256,6 +256,9 @@ private ServletContextHandler addServlet(String basePath, ServletHolder servletH ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath(basePath); context.addServlet(servletHolder, MATCH_ALL); + // Allow %2F-encoded path separators (admin paths embed encoded topic names); Jetty 12 ee10 rejects + // ambiguous URIs at the servlet layer by default (PIP-472 / Jetty 12). + context.getServletHandler().setDecodeAmbiguousURIs(true); context.addFilter(new FilterHolder(new CustomHeaderFilter(config)), "/*", null); for (Pair attribute : attributes) { context.setAttribute(attribute.getLeft(), attribute.getRight()); From 8d3c25b43483e82aabbdf29f367eb98e5b2f6236 Mon Sep 17 00:00:00 2001 From: Lari Hotari Date: Sun, 31 May 2026 04:12:12 +0300 Subject: [PATCH 06/10] [fix][offload] PIP-472: restore legacy javax APIs for tiered-storage offloader tests Motivation: The javax.* -> jakarta.* migration (PIP-472) removed the legacy javax EE APIs from the transitive classpath, breaking the tiered-storage offloader unit tests that exercise pre-jakarta third-party libraries (jclouds 2.6.0 and Hadoop): - BlobStoreBackedInputStreamTest: NoClassDefFoundError javax.xml.bind.JAXBException (jclouds ContextBuilder.build()). - FileSystemManagedLedgerOffloaderTest: Hadoop MiniDFSCluster's fully-javax NameNode web UI failed because the migration force-upgraded its jersey-*:2.46 -> 3.1.10 (jakarta), so org.glassfish.jersey.servlet.ServletContainer stopped being a javax.servlet.Servlet; cascading NoClassDefFoundErrors for javax.ws.rs, javax.annotation.Priority and javax.validation.Validator. Modifications: - tiered-storage/jcloud: runtimeOnly javax.xml.bind:jaxb-api:2.3.1 (jclouds needs the legacy javax.xml.bind at runtime). - tiered-storage/file-system: pin the legacy javax web stack for test configs only (mirrors the existing Jetty-9 force) - Jersey 2.46 + hk2 2.6.1, plus testRuntimeOnly legacy javax.ws.rs/annotation/validation APIs; runtimeOnly jaxb-api for Hadoop. - libs.versions.toml: add javax-ws-rs-api (javax.ws.rs:javax.ws.rs-api:2.1.1) alias. - pip-472-notes.md: document this fix and the definitive server-side root-cause of the remaining transaction multi-broker over-read. Production offloaders are NARs that bundle their own deps and use HDFS RPC (no web UI), so they are unaffected; these forces are scoped to test configurations. All tiered-storage offloader tests (90) pass locally. Assisted-by: Claude Code (Opus 4.8) --- gradle/libs.versions.toml | 6 ++- pip/pip-472-notes.md | 45 ++++++++++++++++----- tiered-storage/file-system/build.gradle.kts | 32 +++++++++++++-- tiered-storage/jcloud/build.gradle.kts | 3 ++ 4 files changed, 71 insertions(+), 15 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 799c8cfffbbcf..7e89f6d68c384 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -399,8 +399,12 @@ jakarta-xml-bind-api = { module = "jakarta.xml.bind:jakarta.xml.bind-api", versi javax-servlet-api = { module = "javax.servlet:javax.servlet-api", version.ref = "javax-servlet" } jakarta-servlet-api = { module = "jakarta.servlet:jakarta.servlet-api", version.ref = "jakarta-servlet" } # javax.xml.bind:jaxb-api is required at runtime by third-party libraries (Athenz ZTS client shades -# jackson-module-jaxb-annotations which references javax.xml.bind); Pulsar's own code uses jakarta.xml.bind (PIP-472) +# jackson-module-jaxb-annotations which references javax.xml.bind, jclouds and Hadoop reference it +# too); Pulsar's own code uses jakarta.xml.bind (PIP-472) jaxb-api = "javax.xml.bind:jaxb-api:2.3.1" +# javax.ws.rs:javax.ws.rs-api is required at runtime only by Hadoop's MiniDFSCluster web UI in +# tiered-storage tests; Pulsar's own code uses jakarta.ws.rs (PIP-472) +javax-ws-rs-api = "javax.ws.rs:javax.ws.rs-api:2.1.1" jakarta-validation-api = { module = "jakarta.validation:jakarta.validation-api", version.ref = "jakarta-validation" } zt-zip = { module = "org.zeroturnaround:zt-zip", version.ref = "zt-zip" } ipaddress = { module = "com.github.seancfoley:ipaddress", version.ref = "ipaddress" } diff --git a/pip/pip-472-notes.md b/pip/pip-472-notes.md index 6626b25e83b17..7dd97f2d16fc8 100644 --- a/pip/pip-472-notes.md +++ b/pip/pip-472-notes.md @@ -161,17 +161,40 @@ Shade on Java 17/21/25, etc.) and most unit groups passed. Three unit-tier issue the third-party transitive need (Pulsar's own code uses jakarta.xml.bind). 3. **Transaction unit tests — server-side request-body over-read (OPEN, documented).** All `TransactionTestBase` subclasses fail in `setup` at `admin.clusters().createCluster(...)` with `HTTP 400 Trailing token (START_OBJECT) - after value bound as ClusterDataImpl ... column 310`. Root-caused with a debug log: the **client serialises a - correct single 309-byte body** (`len=309`, one JSON object) and `prepareRequest` runs **once** (no client-side - doubling — ruled out `new ClientRequest(request)`+`writeEntity` and `enableBuffering` as causes). The broker - reads **one byte past** the 309-byte body (column 310 = a `{`), i.e. Jetty 12 ee10 over-reads the request entity - `InputStream` past Content-Length, picking up a re-sent request on the keep-alive connection. The custom - `AsyncHttpConnector` reuses async-http-client whose internal retry (`maxRequestRetry`, default 5; see its own - `TODO` at line ~364) can re-send on the same connection. **Only the in-process multi-broker UNIT setup trips - this — the Transaction *integration* test passes**, so production is unaffected. Fix direction for follow-up: - either bound/replace the ee10 servlet request stream, or set async-http-client `maxRequestRetry(0)` while keeping - the connector's own failover retries (decoupling `maxRetries` from `getMaxRequestRetry()`), validated against - `TransactionStablePositionTest`. + after value bound as ClusterDataImpl ... column 310`. **Definitively root-caused as server-side** (5 ruled-out + fixes, see below). A `prepareRequest` diagnostic prints `body=309 jerseyCL=null`: the client serialises a single + **309-byte** body and sets **no** Content-Length header itself, so async-http-client computes `Content-Length: 309` + from the actual bytes — i.e. the wire request is correct (one 309-byte object, framed at 309). The broker still + reads **one byte past** (column 310 = a `{`, the START_OBJECT of the *next* pipelined request on the keep-alive + connection). This is a Jetty 12.1.9 / Jersey-ee10 server-side over-read of the request entity `InputStream` past + Content-Length, **below the handler layer**. Ruled out (each reverted): (a) no-copy in `prepareRequest` + (`new ClientRequest`+`writeEntity`); (b) `enableBuffering`; (c) async-http-client `maxRequestRetry(0)`; + (d) bypassing the Jetty 12.1 `CompressionHandler` (`GzipHandlerUtil`) entirely — still fails, so it is not the + compression layer; (e) stripping a stale/duplicate `Content-Length` in the header-copy loop — no-op because + `jerseyCL` is null. **Only the in-process multi-broker UNIT setup trips this — the Transaction *integration* test + passes**, so production is unaffected. Fix direction for follow-up: this is a Jetty-internals issue (HTTP/1.1 + request-body framing / connection reuse in `org.eclipse.jetty.server.internal.HttpConnection` or the + ee10 `ServletApiRequest` input stream); candidate remedies are a Jetty patch/version bump (verify against + 12.1.10+), forcing `Connection: close` for admin writes in the test path, or wrapping the ee10 servlet input + stream to hard-stop at Content-Length. Validate against `TransactionStablePositionTest`. + +4. **Tiered-storage offloader unit tests — legacy javax APIs dropped from the classpath (FIXED).** + `BlobStoreBackedInputStreamTest` (jcloud) and `FileSystemManagedLedgerOffloaderTest` (file-system) failed in + `start` with `NoClassDefFoundError` for `javax.xml.bind.JAXBException`, `javax.ws.rs.ext.ExceptionMapper`, + `javax.annotation.Priority`, and `javax.validation.Validator`. jclouds 2.6.0 and Hadoop are pre-jakarta libraries + that reference the legacy `javax.*` EE APIs which the migration removed from the transitive classpath. Fixes: + - **jcloud:** `runtimeOnly(libs.jaxb.api)` (`javax.xml.bind:jaxb-api:2.3.1`) — jclouds' `ContextBuilder.build()` + references `javax.xml.bind`. (Production + test path, hence `runtimeOnly`, not test-only.) + - **file-system:** Hadoop's `MiniDFSCluster` NameNode web UI is a **fully-javax** stack (already forced to Jetty 9 + in this module). The migration force-upgraded its `jersey-*:2.46`→`3.1.10` (jakarta), so its + `org.glassfish.jersey.servlet.ServletContainer` stopped being a `javax.servlet.Servlet` + (`UnavailableException`). Pinned the legacy stack **for test configs only** (mirrors the existing Jetty-9 force): + Jersey `2.46` (client/common/server/container-servlet/container-servlet-core/jersey-hk2) + hk2 `2.6.1` + (api/locator/utils/aopalliance-repackaged/jakarta.inject), plus `testRuntimeOnly` legacy + `javax.ws.rs:javax.ws.rs-api:2.1.1`, `javax.annotation:javax.annotation-api:1.3.2`, + `javax.validation:validation-api:2.0.1.Final`, and `runtimeOnly(libs.jaxb.api)` (Hadoop common needs + `javax.xml.bind` at runtime). All `FileSystemManagedLedgerOffloaderTest` (3) + jcloud tests pass locally. + Production offloaders are NARs that bundle their own deps and use HDFS RPC (no web UI), so they are unaffected. ## Decisions log diff --git a/tiered-storage/file-system/build.gradle.kts b/tiered-storage/file-system/build.gradle.kts index fb873873751fc..57982d4522251 100644 --- a/tiered-storage/file-system/build.gradle.kts +++ b/tiered-storage/file-system/build.gradle.kts @@ -22,9 +22,13 @@ plugins { id("pulsar.nar-conventions") } -// Force Jetty 9 for this module. Hadoop MiniDFSCluster requires Jetty 9 classes -// (e.g., HandlerWrapper) that were removed in Jetty 12. The version catalog constraints -// would otherwise upgrade Jetty to 12.x. +// Force the legacy javax web stack for this module's tests. Hadoop's MiniDFSCluster is a fully +// javax-based component: it requires Jetty 9 classes (e.g., HandlerWrapper) removed in Jetty 12, +// and its NameNode web UI registers Jersey 2.x's ServletContainer (a javax.servlet.Servlet). +// The version catalog constraints from the jakarta migration (PIP-472) would otherwise upgrade +// Jetty to 12.x and Jersey to 3.x (jakarta), which MiniDFSCluster's Jetty 9 web app rejects with +// "org.glassfish.jersey.servlet.ServletContainer is not a javax.servlet.Servlet". These forces are +// scoped to test configurations only; production code uses Jetty 12 / Jersey 3 (jakarta). configurations.matching { it.name.startsWith("test") }.all { resolutionStrategy.force( "org.eclipse.jetty:jetty-server:9.4.58.v20250814", @@ -35,6 +39,19 @@ configurations.matching { it.name.startsWith("test") }.all { "org.eclipse.jetty:jetty-io:9.4.58.v20250814", "org.eclipse.jetty:jetty-webapp:9.4.58.v20250814", "org.eclipse.jetty:jetty-xml:9.4.58.v20250814", + // Jersey 2.x (javax) — the version Hadoop 3.4 declares; the migration would force these to 3.x. + "org.glassfish.jersey.core:jersey-client:2.46", + "org.glassfish.jersey.core:jersey-common:2.46", + "org.glassfish.jersey.core:jersey-server:2.46", + "org.glassfish.jersey.containers:jersey-container-servlet:2.46", + "org.glassfish.jersey.containers:jersey-container-servlet-core:2.46", + "org.glassfish.jersey.inject:jersey-hk2:2.46", + // hk2 2.6.1 — the version Jersey 2.x depends on (the migration would force these to 3.x). + "org.glassfish.hk2:hk2-api:2.6.1", + "org.glassfish.hk2:hk2-locator:2.6.1", + "org.glassfish.hk2:hk2-utils:2.6.1", + "org.glassfish.hk2.external:aopalliance-repackaged:2.6.1", + "org.glassfish.hk2.external:jakarta.inject:2.6.1", ) } @@ -63,6 +80,9 @@ dependencies { implementation(libs.avro) implementation(libs.json.smart) implementation(libs.protobuf.java) + // Hadoop references the legacy javax.xml.bind API at runtime; it is no longer on the classpath + // after the jakarta migration (PIP-472), so restore it for this module's Hadoop dependency. + runtimeOnly(libs.jaxb.api) testImplementation(project(":managed-ledger")) testImplementation(project(":testmocks")) @@ -77,6 +97,12 @@ dependencies { testImplementation(libs.simpleclient) testImplementation(libs.bcpkix.jdk18on) testImplementation(libs.netty.codec.http) + // Hadoop's MiniDFSCluster embeds a Jetty 9 web UI that needs the legacy javax.ws.rs, + // javax.annotation (Jersey 2.x's @Priority) and javax.validation APIs, which are no longer on + // the classpath after the jakarta migration (PIP-472). Only the tests need them. + testRuntimeOnly(libs.javax.ws.rs.api) + testRuntimeOnly("javax.annotation:javax.annotation-api:1.3.2") + testRuntimeOnly("javax.validation:validation-api:2.0.1.Final") // Jetty 9 dependencies needed by Hadoop MiniDFSCluster (version forced above). testImplementation("org.eclipse.jetty:jetty-server:9.4.58.v20250814") testImplementation("org.eclipse.jetty:jetty-servlet:9.4.58.v20250814") diff --git a/tiered-storage/jcloud/build.gradle.kts b/tiered-storage/jcloud/build.gradle.kts index 2b449f780f840..6ae9ead2bd138 100644 --- a/tiered-storage/jcloud/build.gradle.kts +++ b/tiered-storage/jcloud/build.gradle.kts @@ -36,6 +36,9 @@ dependencies { implementation(libs.aws.java.sdk.sts) runtimeOnly(libs.jakarta.xml.bind.api) runtimeOnly(libs.angus.activation) + // jclouds 2.6.0's ContextBuilder references the legacy javax.xml.bind API, which is no longer on + // the classpath after the jakarta migration (PIP-472); restore it for the jclouds dependency. + runtimeOnly(libs.jaxb.api) testImplementation(project(":managed-ledger")) testImplementation(project(":testmocks")) From da571d3c94af10542b7dc7e69abda9e9bfd1854a Mon Sep 17 00:00:00 2001 From: Lari Hotari Date: Sun, 31 May 2026 04:48:28 +0300 Subject: [PATCH 07/10] [fix][broker] PIP-472: fix interceptor request-body "Trailing token" under Jetty 12 ee10 Motivation: After the javax->jakarta migration moved the broker web layer to Jetty 12 ee10 / Jersey 3, every request whose broker enables a BrokerInterceptor failed admin calls that have a body (e.g. clusters().createCluster(...)) with: HTTP 400 Trailing token (of type START_OBJECT) found after value bound as ClusterDataImpl This broke all TransactionTestBase subclasses (TransactionStablePositionTest, TransactionBufferCloseTest, AdminApiTransactionMultiBrokerTest, TransactionEndToEndTest), ExceptionsBrokerInterceptorTest, and the TestBrokerInterceptors integration test. The Client Api unit group passed because it enables no interceptor - the key clue. Root cause: Enabling an interceptor activates PreInterceptFilter, which wraps the request in RequestWrapper. RequestWrapper.getInputStream() returned a NEW ByteArrayInputStream on every call. Under Jetty 12 ee10 + Jersey 3 the entity reader fetches getInputStream() more than once; after consuming the body and reaching EOF, a later call returned a fresh stream positioned at byte 0, so the next read yielded the body's own leading '{' again - a START_OBJECT that the stricter Jackson jakarta-rs provider rejects (FAIL_ON_TRAILING_TOKENS). The extra byte is the body's own first byte, never a real next-request byte, so on-the-wire framing was never corrupted; the wrapper was simply not Servlet-contract-compliant. Modifications (RequestWrapper): - Return a single, stable ServletInputStream from getInputStream() (cache it), as required by the Servlet contract; re-fetching after EOF now yields EOF, not the body again. - Buffer the body lazily, so an interceptor that does not read the body (the common case) never causes the body to be buffered and the underlying stream is consumed once, by Jersey. - Bound the buffered read to Content-Length and report isFinished() correctly. Verified locally: TransactionStablePositionTest (6), TransactionBufferCloseTest (4), ExceptionsBrokerInterceptorTest, BrokerInterceptorTest and InterceptFilterOutTest all pass; checkstyle + spotless clean. Assisted-by: Claude Code (Opus 4.8) --- pip/pip-472-notes.md | 39 ++++++----- .../pulsar/broker/web/RequestWrapper.java | 69 +++++++++++++------ 2 files changed, 69 insertions(+), 39 deletions(-) diff --git a/pip/pip-472-notes.md b/pip/pip-472-notes.md index 7dd97f2d16fc8..7f815de8d75a2 100644 --- a/pip/pip-472-notes.md +++ b/pip/pip-472-notes.md @@ -159,24 +159,27 @@ Shade on Java 17/21/25, etc.) and most unit groups passed. Three unit-tier issue `jakarta.xml.bind-api:2.3.3` happened to ship; the bump to 4.0.2 (real `jakarta.xml.bind`) removed it. Fix: add `javax.xml.bind:jaxb-api:2.3.1` (`runtimeOnly`) to `pulsar-client-auth-athenz` + `pulsar-broker-auth-athenz` for the third-party transitive need (Pulsar's own code uses jakarta.xml.bind). -3. **Transaction unit tests — server-side request-body over-read (OPEN, documented).** All `TransactionTestBase` - subclasses fail in `setup` at `admin.clusters().createCluster(...)` with `HTTP 400 Trailing token (START_OBJECT) - after value bound as ClusterDataImpl ... column 310`. **Definitively root-caused as server-side** (5 ruled-out - fixes, see below). A `prepareRequest` diagnostic prints `body=309 jerseyCL=null`: the client serialises a single - **309-byte** body and sets **no** Content-Length header itself, so async-http-client computes `Content-Length: 309` - from the actual bytes — i.e. the wire request is correct (one 309-byte object, framed at 309). The broker still - reads **one byte past** (column 310 = a `{`, the START_OBJECT of the *next* pipelined request on the keep-alive - connection). This is a Jetty 12.1.9 / Jersey-ee10 server-side over-read of the request entity `InputStream` past - Content-Length, **below the handler layer**. Ruled out (each reverted): (a) no-copy in `prepareRequest` - (`new ClientRequest`+`writeEntity`); (b) `enableBuffering`; (c) async-http-client `maxRequestRetry(0)`; - (d) bypassing the Jetty 12.1 `CompressionHandler` (`GzipHandlerUtil`) entirely — still fails, so it is not the - compression layer; (e) stripping a stale/duplicate `Content-Length` in the header-copy loop — no-op because - `jerseyCL` is null. **Only the in-process multi-broker UNIT setup trips this — the Transaction *integration* test - passes**, so production is unaffected. Fix direction for follow-up: this is a Jetty-internals issue (HTTP/1.1 - request-body framing / connection reuse in `org.eclipse.jetty.server.internal.HttpConnection` or the - ee10 `ServletApiRequest` input stream); candidate remedies are a Jetty patch/version bump (verify against - 12.1.10+), forcing `Connection: close` for admin writes in the test path, or wrapping the ee10 servlet input - stream to hard-stop at Content-Length. Validate against `TransactionStablePositionTest`. +3. **Broker-interceptor request bodies — phantom "Trailing token" (FIXED).** Every test whose broker enables a + `BrokerInterceptor` (all `TransactionTestBase` subclasses — `TransactionStablePositionTest`, + `TransactionBufferCloseTest`, `AdminApiTransactionMultiBrokerTest`, `TransactionEndToEndTest` — plus + `ExceptionsBrokerInterceptorTest`, and the `TestBrokerInterceptors` *integration* test) failed in `setup` at + `admin.clusters().createCluster(...)` with `HTTP 400 Trailing token (of type START_OBJECT) found after value bound + as ClusterDataImpl ... column 310`. The **`CI - Unit - Brokers - Client Api` group passed** because its tests do + not enable an interceptor — that was the key clue. Root cause: enabling an interceptor activates the broker's + `PreInterceptFilter`, which wraps the request in `RequestWrapper` (so the body can be read more than once). The + old `RequestWrapper.getInputStream()` returned a **fresh `ByteArrayInputStream` on every call**. Under Jetty 12 + ee10 + Jersey 3, the entity reader calls `getInputStream()` more than once; after consuming the 309-byte body and + hitting EOF, a later call returned a brand-new stream positioned at byte 0, so the next read produced the body's + own first byte `{` again — a START_OBJECT at "column 310" that the (now stricter) Jackson jakarta-rs provider + rejects via FAIL_ON_TRAILING_TOKENS. The "310th byte" was never a real next-request byte (it is the body's own + leading `{`), so production framing was never corrupted; only the read-twice wrapper was non-compliant. Fix + (`RequestWrapper`): return a **single, stable** `ServletInputStream` from `getInputStream()` (cache it, per the + Servlet contract), buffer the body **lazily** (so an interceptor that never reads the body — the common case — + does not cause the filter to consume the core stream at all), bound the read to `Content-Length`, and report + `isFinished()` correctly. Verified: `TransactionStablePositionTest` now passes all 6 tests (was failing in + `setup`). This is a real, contract-compliant fix, not a leniency mask. Earlier dead-ends (all reverted) that + pointed at the client/Jetty before the interceptor was identified as the trigger: client no-copy/`enableBuffering`/ + `maxRequestRetry(0)`, bypassing the `CompressionHandler`, and stripping a (null) duplicate `Content-Length`. 4. **Tiered-storage offloader unit tests — legacy javax APIs dropped from the classpath (FIXED).** `BlobStoreBackedInputStreamTest` (jcloud) and `FileSystemManagedLedgerOffloaderTest` (file-system) failed in diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/RequestWrapper.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/RequestWrapper.java index 2bd0d166d9953..bc4d0ecfe75d7 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/RequestWrapper.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/RequestWrapper.java @@ -36,36 +36,63 @@ */ public class RequestWrapper extends HttpServletRequestWrapper { - private final byte[] body; + private byte[] body; + private ServletInputStream inputStream; public RequestWrapper(HttpServletRequest request) throws IOException { super(request); - body = IOUtils.toByteArray(new InputStreamReader(request.getInputStream()), Charset.defaultCharset()); + } + + /** + * Buffers the request body on first access. Buffering is lazy on purpose: an interceptor that + * does not read the body (the common case) must not cause the body to be buffered at all, so the + * underlying request stream is consumed only once, by the downstream resource (Jersey). The read + * is bounded to Content-Length so it never reads past the request body. + */ + private byte[] body() throws IOException { + if (body == null) { + HttpServletRequest request = (HttpServletRequest) getRequest(); + int contentLength = request.getContentLength(); + if (contentLength >= 0) { + body = IOUtils.toByteArray(request.getInputStream(), contentLength); + } else { + body = IOUtils.toByteArray(request.getInputStream()); + } + } + return body; } @Override public ServletInputStream getInputStream() throws IOException { - final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body); - return new ServletInputStream() { - @Override - public boolean isFinished() { - return false; - } + if (inputStream == null) { + // Return a single, stable stream over the buffered body. Repeated getInputStream() calls + // must return the same stream (per the Servlet contract); returning a fresh stream each + // time lets a reader that re-fetches the stream after EOF read the body's first byte + // again, surfacing as a spurious "Trailing token" error. + final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body()); + inputStream = new ServletInputStream() { + @Override + public boolean isFinished() { + return byteArrayInputStream.available() == 0; + } - @Override - public boolean isReady() { - return true; - } + @Override + public boolean isReady() { + return true; + } - @Override - public void setReadListener(ReadListener readListener) { + @Override + public void setReadListener(ReadListener readListener) { - } + } - public int read() { - return byteArrayInputStream.read(); - } - }; + @Override + public int read() { + return byteArrayInputStream.read(); + } + }; + } + return inputStream; } @Override @@ -74,7 +101,7 @@ public BufferedReader getReader() throws IOException { } //Use this method to read the request body N times - public byte[] getBody() { - return this.body; + public byte[] getBody() throws IOException { + return body(); } } From 24648d38d68fd1ffbb7c971c4e846947e5431dd7 Mon Sep 17 00:00:00 2001 From: Lari Hotari Date: Sun, 31 May 2026 05:41:35 +0300 Subject: [PATCH 08/10] [doc] PIP-472: record fully-green CI run (39/39 jobs) Update the implementation notes CI iteration log: run 26700351491 (commit 8c70136da16) is fully green across all 39 jobs, completing Phase A of the javax->jakarta migration with end-to-end validation on lhotari/pulsar. Assisted-by: Claude Code (Opus 4.8) --- pip/pip-472-notes.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pip/pip-472-notes.md b/pip/pip-472-notes.md index 7f815de8d75a2..f8a6ca5fdb3e1 100644 --- a/pip/pip-472-notes.md +++ b/pip/pip-472-notes.md @@ -136,6 +136,15 @@ Checkstyle import-ban lint + LICENSE/NOTICE (Phase C). + binary LICENSE/NOTICE all green. The deterministic build gate is fully cleared. The Pulsar CI **unit + integration test matrix** is now running (Broker Groups 1–5, Client Api/Impl, Proxy, Pulsar IO/Client/Metadata, Other, + docker images, MacOS build) — hours of runtime; monitoring for failures and iterating. +- **Run 5** (`3e1a39f3a31`): ambiguous-URI + Athenz fixes landed (Client Api group green). Surfaced the remaining + failures: the offloader tests (issue 4) and the broker-interceptor "Trailing token" (issue 3) across Broker Groups + 1/2/3, Client Impl, and System-Plugin. +- **Run 6** (`a01c58ad258`): offloader legacy-javax fix (issue 4) cleared `CI - Unit - Other` and + `CI - System - Tiered JCloud` ✅. Remaining red was only the interceptor "Trailing token" (issue 3). +- **Run 7** (`8c70136da16`): RequestWrapper single-stream/lazy fix (issue 3) landed. **ENTIRE CI RUN GREEN** ✅✅ — + run `26700351491`, **39/39 jobs success**, zero failures. All previously-failing jobs (Broker Group 1–5, Client + Impl, Unit - Other, System - Plugin, System - Tiered JCloud) pass. The PIP-472 core migration (Phase A) is + **complete and fully validated end-to-end** on `lhotari/pulsar`. ### Extra local runtime validation (high-risk Jersey 3 / Jetty ee10 areas) - `FunctionApiV3ResourceTest` (Jersey 3 multipart `FormDataParam`): **71 pass, 0 fail**. From 81e9250e091518e5e354c899758d4ab3945372c6 Mon Sep 17 00:00:00 2001 From: Lari Hotari Date: Mon, 1 Jun 2026 10:42:03 +0300 Subject: [PATCH 09/10] [fix][build] PIP-472: drop Athenz javax.xml.bind workaround (Athenz 1.12.42 uses jakarta.xml.bind) Motivation: Earlier in this PR a temporary `runtimeOnly(libs.jaxb.api)` (javax.xml.bind:jaxb-api:2.3.1) was added to pulsar-client-auth-athenz and pulsar-broker-auth-athenz to satisfy Athenz 1.10.62, whose shaded jackson-module-jaxb-annotations referenced the legacy javax.xml.bind package (which the jakarta.xml.bind-api 4.0.2 bump no longer ships). master has since upgraded Athenz to 1.12.42 (#25905, 14e228cf726), which itself migrated to jakarta.xml.bind: athenz-auth-core now pulls org.glassfish.jaxb:jaxb-runtime:4.0.8. The legacy javax.xml.bind classes are therefore no longer needed on the Athenz runtime classpath, so the workaround is obsolete. Modifications: - Remove `runtimeOnly(libs.jaxb.api)` from pulsar-client-auth-athenz and pulsar-broker-auth-athenz (both build files revert to their pre-PR state). - De-Athenz the gradle/libs.versions.toml jaxb-api comment: the alias is retained because it is now used only by the tiered-storage offloaders (jclouds/Hadoop), which still reference legacy javax.xml.bind. - Update pip/pip-472-notes.md (issue 2, the CI iteration log) to record the upstream resolution. Verified: AuthenticationAthenzTest (8) and AuthenticationProviderAthenzTest (4) pass, and javax.xml.bind:jaxb-api is no longer on the Athenz runtimeClasspath (only the jakarta stack: jakarta.xml.bind-api 4.0.5 + org.glassfish.jaxb:jaxb-runtime 4.0.8). Assisted-by: Claude Code (Opus 4.8) --- gradle/libs.versions.toml | 6 ++--- pip/pip-472-notes.md | 29 ++++++++++++++++------ pulsar-broker-auth-athenz/build.gradle.kts | 2 -- pulsar-client-auth-athenz/build.gradle.kts | 2 -- 4 files changed, 24 insertions(+), 15 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7e89f6d68c384..9c0e30339be9b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -398,9 +398,9 @@ angus-activation = { module = "org.eclipse.angus:angus-activation", version.ref jakarta-xml-bind-api = { module = "jakarta.xml.bind:jakarta.xml.bind-api", version.ref = "jakarta-xml-bind" } javax-servlet-api = { module = "javax.servlet:javax.servlet-api", version.ref = "javax-servlet" } jakarta-servlet-api = { module = "jakarta.servlet:jakarta.servlet-api", version.ref = "jakarta-servlet" } -# javax.xml.bind:jaxb-api is required at runtime by third-party libraries (Athenz ZTS client shades -# jackson-module-jaxb-annotations which references javax.xml.bind, jclouds and Hadoop reference it -# too); Pulsar's own code uses jakarta.xml.bind (PIP-472) +# javax.xml.bind:jaxb-api is required at runtime by third-party libraries that still reference the +# legacy javax.xml.bind API (jclouds and Hadoop in the tiered-storage offloaders); Pulsar's own code +# uses jakarta.xml.bind (PIP-472) jaxb-api = "javax.xml.bind:jaxb-api:2.3.1" # javax.ws.rs:javax.ws.rs-api is required at runtime only by Hadoop's MiniDFSCluster web UI in # tiered-storage tests; Pulsar's own code uses jakarta.ws.rs (PIP-472) diff --git a/pip/pip-472-notes.md b/pip/pip-472-notes.md index f8a6ca5fdb3e1..d218f532c8387 100644 --- a/pip/pip-472-notes.md +++ b/pip/pip-472-notes.md @@ -136,15 +136,21 @@ Checkstyle import-ban lint + LICENSE/NOTICE (Phase C). + binary LICENSE/NOTICE all green. The deterministic build gate is fully cleared. The Pulsar CI **unit + integration test matrix** is now running (Broker Groups 1–5, Client Api/Impl, Proxy, Pulsar IO/Client/Metadata, Other, + docker images, MacOS build) — hours of runtime; monitoring for failures and iterating. -- **Run 5** (`3e1a39f3a31`): ambiguous-URI + Athenz fixes landed (Client Api group green). Surfaced the remaining - failures: the offloader tests (issue 4) and the broker-interceptor "Trailing token" (issue 3) across Broker Groups - 1/2/3, Client Impl, and System-Plugin. +- **Run 5** (`3e1a39f3a31`): ambiguous-URI fix + the (now-removed) temporary Athenz `javax.xml.bind` workaround + landed (Client Api group green). Surfaced the remaining failures: the offloader tests (issue 4) and the + broker-interceptor "Trailing token" (issue 3) across Broker Groups 1/2/3, Client Impl, and System-Plugin. - **Run 6** (`a01c58ad258`): offloader legacy-javax fix (issue 4) cleared `CI - Unit - Other` and `CI - System - Tiered JCloud` ✅. Remaining red was only the interceptor "Trailing token" (issue 3). - **Run 7** (`8c70136da16`): RequestWrapper single-stream/lazy fix (issue 3) landed. **ENTIRE CI RUN GREEN** ✅✅ — run `26700351491`, **39/39 jobs success**, zero failures. All previously-failing jobs (Broker Group 1–5, Client Impl, Unit - Other, System - Plugin, System - Tiered JCloud) pass. The PIP-472 core migration (Phase A) is **complete and fully validated end-to-end** on `lhotari/pulsar`. +- **Rebase onto `master` + Athenz cleanup (2026-06-01):** rebased the branch onto current `master`, which now + includes the **Athenz 1.12.42** upgrade (#25905, `14e228cf726`). Athenz 1.12.42 migrated to `jakarta.xml.bind` + (its `athenz-auth-core` pulls `org.glassfish.jaxb:jaxb-runtime:4.0.8`), so the temporary + `runtimeOnly(libs.jaxb.api)` workaround on the two `*-auth-athenz` modules (issue 2) was **removed**. The + `jaxb-api` catalog alias is retained for the tiered-storage offloaders only (issue 4). Athenz unit tests pass and + the Athenz `runtimeClasspath` no longer contains `javax.xml.bind:jaxb-api`. ### Extra local runtime validation (high-risk Jersey 3 / Jetty ee10 areas) - `FunctionApiV3ResourceTest` (Jersey 3 multipart `FormDataParam`): **71 pass, 0 fail**. @@ -163,11 +169,18 @@ Shade on Java 17/21/25, etc.) and most unit groups passed. Three unit-tier issue `UriCompliance.LEGACY`. Fix: `servletContextHandler.getServletHandler().setDecodeAmbiguousURIs(true)` in the broker `WebService`, proxy `WebServer`, and functions `WorkerServer`. (Affected `AdminApiDynamicConfigurationsTest`, `PartitionedProducerConsumerTest.testPartitionedTopicNameWithSpecialCharacter`, and similar.) -2. **Athenz `javax.xml.bind` (FIXED).** `NoClassDefFoundError: javax/xml/bind/annotation/XmlElement` — the Athenz - ZTS client shades `jackson-module-jaxb-annotations`, which needs the `javax.xml.bind` package that the old - `jakarta.xml.bind-api:2.3.3` happened to ship; the bump to 4.0.2 (real `jakarta.xml.bind`) removed it. Fix: add - `javax.xml.bind:jaxb-api:2.3.1` (`runtimeOnly`) to `pulsar-client-auth-athenz` + `pulsar-broker-auth-athenz` for - the third-party transitive need (Pulsar's own code uses jakarta.xml.bind). +2. **Athenz `javax.xml.bind` (RESOLVED UPSTREAM — workaround removed).** `NoClassDefFoundError: + javax/xml/bind/annotation/XmlElement` — the Athenz ZTS client (v1.10.62) shaded `jackson-module-jaxb-annotations`, + which needed the `javax.xml.bind` package that the old `jakarta.xml.bind-api:2.3.3` happened to ship; the bump to + 4.0.2 (real `jakarta.xml.bind`) removed it. This was first worked around by adding + `javax.xml.bind:jaxb-api:2.3.1` (`runtimeOnly`) to `pulsar-client-auth-athenz` + `pulsar-broker-auth-athenz`. + **That workaround has since been removed:** `master` upgraded Athenz to **1.12.42** (#25905, commit + `14e228cf726`), which itself migrated to `jakarta.xml.bind` — its `athenz-auth-core` now pulls + `org.glassfish.jaxb:jaxb-runtime:4.0.8`, so the legacy `javax.xml.bind` classes are no longer on (or needed on) + the Athenz runtime classpath. After rebasing on that commit, both `runtimeOnly(libs.jaxb.api)` lines were dropped + (verified: `AuthenticationAthenzTest` + `AuthenticationProviderAthenzTest` pass and `javax.xml.bind:jaxb-api` is + gone from the Athenz `runtimeClasspath`). The `jaxb-api` catalog alias itself stays — it is now used only by the + tiered-storage offloaders (jclouds/Hadoop), see issue 4. 3. **Broker-interceptor request bodies — phantom "Trailing token" (FIXED).** Every test whose broker enables a `BrokerInterceptor` (all `TransactionTestBase` subclasses — `TransactionStablePositionTest`, `TransactionBufferCloseTest`, `AdminApiTransactionMultiBrokerTest`, `TransactionEndToEndTest` — plus diff --git a/pulsar-broker-auth-athenz/build.gradle.kts b/pulsar-broker-auth-athenz/build.gradle.kts index 7a97e535da9ca..1d40a2c6e40b5 100644 --- a/pulsar-broker-auth-athenz/build.gradle.kts +++ b/pulsar-broker-auth-athenz/build.gradle.kts @@ -28,8 +28,6 @@ dependencies { implementation(project(":pulsar-broker-common")) implementation(project(":pulsar-common")) implementation(libs.athenz.zts.java.client) - // Athenz shades jackson-module-jaxb-annotations which needs the javax.xml.bind API at runtime (PIP-472) - runtimeOnly(libs.jaxb.api) implementation(libs.athenz.zpe.java.client) implementation(libs.athenz.cert.refresher) implementation(libs.athenz.auth.core) diff --git a/pulsar-client-auth-athenz/build.gradle.kts b/pulsar-client-auth-athenz/build.gradle.kts index 61d35d04fc90f..eea4f829ecf0d 100644 --- a/pulsar-client-auth-athenz/build.gradle.kts +++ b/pulsar-client-auth-athenz/build.gradle.kts @@ -25,8 +25,6 @@ dependencies { implementation(project(":pulsar-client-api")) implementation(project(":pulsar-client-original")) implementation(libs.athenz.zts.java.client) - // Athenz shades jackson-module-jaxb-annotations which needs the javax.xml.bind API at runtime (PIP-472) - runtimeOnly(libs.jaxb.api) implementation(libs.athenz.cert.refresher) implementation(libs.athenz.auth.core) implementation(libs.guava) From c2834002b82dd35e5d922a5fe678d59867a8386f Mon Sep 17 00:00:00 2001 From: Lari Hotari Date: Mon, 1 Jun 2026 11:01:10 +0300 Subject: [PATCH 10/10] [improve][misc] PIP-472: remove internal working notes from the PR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drop pip/pip-472-notes.md (internal implementation working notes — not part of the upstream contribution) and the pip/pip-472.md "Implementation status / notes" pointer that referenced it, so the accepted PIP design document is left unchanged by this implementation PR. Assisted-by: Claude Code (Opus 4.8) --- pip/pip-472-notes.md | 250 ------------------------------------------- pip/pip-472.md | 8 -- 2 files changed, 258 deletions(-) delete mode 100644 pip/pip-472-notes.md diff --git a/pip/pip-472-notes.md b/pip/pip-472-notes.md deleted file mode 100644 index d218f532c8387..0000000000000 --- a/pip/pip-472-notes.md +++ /dev/null @@ -1,250 +0,0 @@ -# PIP-472 Implementation Notes (javax.* → jakarta.* migration) - -These are working notes for the implementation of [PIP-472](pip-472.md). They record the -**actual discovered state** of the codebase (which differs significantly from the PIP's -estimates), decisions made during implementation, and deviations from the PIP. - -Branch: `lh-javax-to-jakarta-migration` → pushed to `forked` remote (`lhotari/pulsar`). -PR opened against `lhotari/pulsar` (NOT `apache/pulsar`) purely to exercise GitHub Actions CI. - -## Decision: single coordinated branch (big-bang) instead of the PIP's 4 phases - -The PIP describes 4 mergeable phases and explicitly *rejects* a single big-bang branch for -the upstream contribution workflow. For this CI-validation exercise on a personal fork we -implement everything on one branch so the whole migration can be validated end-to-end by CI -in one shot. The phased structure is still followed conceptually within the single branch. -When this is eventually contributed upstream it should be split back into the phased PRs. - -## Discovered state (2026-05-31) — much smaller than the PIP estimated - -Counts are from the current `master` (`a6af80198f2`). A large part of the migration the PIP -anticipated has already happened in git history. - -| Surface | PIP estimate | Actual now | Notes | -|---|---|---|---| -| `javax.ws.rs` | ~660 | **169 files** | broker 90, client-admin 30, functions/worker 28, proxy 7, broker-common 7, websocket 4, common 2, client-auth-sasl 1 | -| `javax.servlet` | ~368 | **94 files** | broker 36, broker-common 19, websocket 15, proxy 9, functions/worker 5, + jetty-upgrade/test-plugins/auth-sasl (out of scope) | -| `javax.annotation` (JSR-250) | ~48 | **0 files** | all 12 `javax.annotation` imports are JSR-305 `concurrent.NotThreadSafe`/`ThreadSafe` — out of scope, no jakarta equivalent | -| `javax.validation` | in scope | **0** | already migrated / unused | -| `javax.xml.bind` | in scope | **0** | already migrated / unused | -| `javax.activation` | in scope | **0** | | -| `javax.inject` | in scope | **0** | | -| `javax.websocket` | in scope | **0** | Pulsar uses Jetty's native WebSocket API, not JSR-356 | -| Swagger 1.x (`io.swagger.annotations`) | n/a | **61 files** | broker 36, functions/worker 9, common 9, client 4, websocket 1, proxy 1, docs-tools 1 | - -**Conclusion:** the real migration surface is `javax.ws.rs` (169), `javax.servlet` (94, minus -AdditionalServlet retention), and the Swagger 1→2 annotation transform (61). The annotation / -validation / xml.bind parts the PIP describes are already done or never existed. - -### Important correction vs PIP CI-lint section - -The PIP's Checkstyle ban list includes `javax.annotation` (excluding `javax.annotation.processing`). -But `javax.annotation.concurrent.*` and `javax.annotation.Nonnull`/`Nullable` are **JSR-305** -(findbugs), not Jakarta EE JSR-250, and have **no jakarta counterpart**. They must NOT be banned -and must NOT be migrated. The Checkstyle rule bans only the JSR-250 subset -(`javax.annotation.PostConstruct|PreDestroy|Resource|Generated|Priority|ManagedBean|Resources`), -not `javax.annotation.concurrent` / `javax.annotation.Nonnull` etc. - -## Out of scope / left on javax (confirmed) - -- `jetty-upgrade/zookeeper-with-patched-admin`, `jetty-upgrade/*-prometheus-metrics*` — these are - compat shims that re-host ZooKeeper/BookKeeper admin & metrics servlets on patched Jetty; they - intentionally stay on ee8/`javax.servlet`. Not Pulsar's own REST/servlet code. -- `tests/docker-images/java-test-plugins` AdditionalServlet test plugin — exercises the legacy - `javax.servlet` registration path on purpose; kept on javax. -- `pulsar-broker-auth-sasl` `javax.security.*` — JAAS/SASL JDK APIs, stay javax. - -## Build facts - -- Gradle, Kotlin DSL (`*.gradle.kts`), version catalog `gradle/libs.versions.toml`. -- Current: `jetty = 12.1.9`, `jersey = 2.42`, `swagger = 1.6.2`, `jackson = 2.21.3`. -- Convention plugins under `build-logic/conventions/src/main/kotlin/`, incl. - `pulsar.client-shade-conventions.gradle.kts` (shading rules). - -## Subsystem blueprint (from parallel mapping, 2026-05-31) - -- **AdditionalServlet SPI already pre-generalized** (commit 39dbbf01a26): `AdditionalServletType` enum - (only `JAVAX_SERVLET`) + `getServletInstance():Object`. Extension = add `JAKARTA_SERVLET` + route in - `PulsarService.addBrokerAdditionalServlets` (switch ~L1281) and `ProxyServiceStarter` (switch ~L416): - `JAVAX_SERVLET`→ee8 `ServletHolder`/`ServletContextHandler`, `JAKARTA_SERVLET`→ee10. -- **Jersey**: only `javax.ws.rs`→`jakarta.ws.rs`; all `org.glassfish.jersey.*` packages unchanged - (multipart, client, server, servlet, test). `ServletContainer` is `jakarta.servlet` in 3.1 → must run - in ee10 container (couples Jersey↔Jetty). `jclouds-shaded` already forces `jakarta.ws.rs-api:3.1.0`. -- **Jetty ee8→ee10** for Pulsar's own wiring: `WebService` (broker), `WebServer` (proxy), - `ProxyServer`+WS handlers (websocket), `WorkerServer` (functions). Key API diffs: - ee8 `ServletContextHandler.get()` (bridge to core Handler) → ee10 `ServletContextHandler` IS a core - Handler (drop `.get()`); `org.eclipse.jetty.ee8.nested.Request.getBaseRequest(...)` (WebService - AddListenerAttributeFilter) has no ee10 equivalent — must port to core Request connector lookup; - ee8.websocket.api.{Session,WebSocketAdapter,WriteCallback,JettyServerUpgradeResponse} → ee10.websocket.api. -- **Swagger**: annotations ONLY, no runtime bootstrap, no in-repo swagger.json (generated out-of-tree in - pulsar-site). 61 files. `BaseGenerateDocumentation` reflects over `@ApiModelProperty.value()/name()/required()` - → must hand-fix to `@Schema.description()/name()/requiredMode()`. -- **Shading** (`pulsar.client-shade-conventions`, `localrun-shaded`): relocations of `javax.{ws,annotation, - inject,xml.bind,activation,servlet,validation}` → must become `jakarta.*`. Rename checked-in service files - `pulsar-client-admin-shaded`/`pulsar-client-all` `META-INF/services/org.apache.pulsar.shade.javax.ws.rs.*` - → `...jakarta.ws.rs.*`. -- **Activation impl gotcha**: `com.sun.activation:jakarta.activation` has no 2.1.3 → use - `org.eclipse.angus:angus-activation:2.0.2` as the EE10 impl (API stays `jakarta.activation:jakarta.activation-api:2.1.3`). -- **tiered-storage/file-system** pins Jetty 9 (Hadoop MiniDFSCluster) — leave as-is, exempt from lint. - -## Execution plan (phased within the single branch) - -- **Phase A — core jakarta** (must compile): catalog (jersey 3.1.10, jakarta 3.x/4.x, jetty-ee10 aliases, - jakarta-servlet, jackson-jakarta-rs, angus-activation, simpleclient_servlet_jakarta); per-module build files - (ee8→ee10, retain ee8 in broker+proxy for legacy AdditionalServlet; javax-servlet→jakarta-servlet); source - renames (ws.rs blanket; servlet selective); manual Jetty/Jersey/AdditionalServlet wiring; shading. **Keep - swagger 1.6.2** in Phase A (decoupled). Compile broker/proxy/websocket/client-admin/functions-worker, fix. -- **Phase B — Swagger 1→2** (workflow, 61 per-file agents + BaseGenerateDocumentation + catalog v3 + shade - group filters). Compile, fix. -- **Phase C** — Checkstyle import ban + OpenRewrite tooling (Phase-0 deliverable) + LICENSE/NOTICE. -- Push to `forked`, open PR to `lhotari/pulsar`, monitor CI, iterate. - -## Compile milestone (2026-05-31) - -All **main** source compiles: `pulsar-broker-common`, `pulsar-broker`, `pulsar-proxy`, `pulsar-websocket`, -`pulsar-functions-worker`, `pulsar-client-admin`, `pulsar-client`, `pulsar-broker-auth-sasl`, -`tiered-storage-jcloud`. Remaining: test sources (the reverted ee8.nested mock servers + AdditionalServlet -SPI tests need attention), shaded client jars (verify relocations), Phase B (Swagger), Phase C (import order, -checkstyle lint, LICENSE/NOTICE). - -## Local validation (2026-05-31, before first push) - -- ✅ All main source compiles (broker, broker-common, proxy, websocket, functions-worker, client-admin, - client, auth-sasl, jcloud). -- ✅ All changed-module test source compiles. -- ✅ Checkstyle green across changed modules (import order: `jakarta.*` sorts before `java.*`; fixed 175 files). -- ✅ Spotless green. -- ✅ Shaded client jars build (`pulsar-client-shaded`, `pulsar-client-admin-shaded`, `pulsar-client-all`). -- ✅ Runtime tests pass: `BrokerAdditionalServletTest` (web tier + jakarta AdditionalServlet end-to-end), - `ProducerHandlerTest` (modern Jetty 12 WebSocket API), `AuthenticationFilterTest` (jakarta auth filter). - -Pushed to `forked` (lhotari/pulsar); PR opened to exercise full CI. Remaining known follow-ups for the CI loop: -some AdditionalServlet unit tests / `CounterBrokerInterceptor` may need runtime tweaks; Swagger 1→2 (Phase B); -Checkstyle import-ban lint + LICENSE/NOTICE (Phase C). - -## CI iteration log - -- **Run 1** (`cb35f7ed5bd`): build failed — `jetty-upgrade/*-prometheus-metrics` compile error from the global - `simpleclient_servlet`→jakarta swap. Reverted that alias to the javax variant (`fa3b0c45f86`). -- **Run 2** (`fa3b0c45f86`): build **compiled** + checkstyle + spotless **passed**; only `checkBinaryLicense` - failed (server + shell). Updated both `LICENSE.bin.txt` for the jersey-3.1/hk2-3.x/jakarta jar set; also fixed - `CounterBrokerInterceptor` runtime (jakarta servlet API) (`b3c153c5120`). -- **Run 3** (`b3c153c5120`): `checkBinaryLicense` failed on 2 residual entries — `com.sun.activation:jakarta.activation:1.2.2` - (the javax.activation JAF impl) is still bundled transitively alongside Angus; my agent prompt wrongly said it was - replaced, so it was removed. Re-added it to both LICENSE files (`7a93fa09cd4`). -- **Run 4** (`7a93fa09cd4`): **Build and License check job PASSED** ✅ — full multi-module build + checkstyle + spotless - + binary LICENSE/NOTICE all green. The deterministic build gate is fully cleared. The Pulsar CI **unit + integration - test matrix** is now running (Broker Groups 1–5, Client Api/Impl, Proxy, Pulsar IO/Client/Metadata, Other, + docker - images, MacOS build) — hours of runtime; monitoring for failures and iterating. -- **Run 5** (`3e1a39f3a31`): ambiguous-URI fix + the (now-removed) temporary Athenz `javax.xml.bind` workaround - landed (Client Api group green). Surfaced the remaining failures: the offloader tests (issue 4) and the - broker-interceptor "Trailing token" (issue 3) across Broker Groups 1/2/3, Client Impl, and System-Plugin. -- **Run 6** (`a01c58ad258`): offloader legacy-javax fix (issue 4) cleared `CI - Unit - Other` and - `CI - System - Tiered JCloud` ✅. Remaining red was only the interceptor "Trailing token" (issue 3). -- **Run 7** (`8c70136da16`): RequestWrapper single-stream/lazy fix (issue 3) landed. **ENTIRE CI RUN GREEN** ✅✅ — - run `26700351491`, **39/39 jobs success**, zero failures. All previously-failing jobs (Broker Group 1–5, Client - Impl, Unit - Other, System - Plugin, System - Tiered JCloud) pass. The PIP-472 core migration (Phase A) is - **complete and fully validated end-to-end** on `lhotari/pulsar`. -- **Rebase onto `master` + Athenz cleanup (2026-06-01):** rebased the branch onto current `master`, which now - includes the **Athenz 1.12.42** upgrade (#25905, `14e228cf726`). Athenz 1.12.42 migrated to `jakarta.xml.bind` - (its `athenz-auth-core` pulls `org.glassfish.jaxb:jaxb-runtime:4.0.8`), so the temporary - `runtimeOnly(libs.jaxb.api)` workaround on the two `*-auth-athenz` modules (issue 2) was **removed**. The - `jaxb-api` catalog alias is retained for the tiered-storage offloaders only (issue 4). Athenz unit tests pass and - the Athenz `runtimeClasspath` no longer contains `javax.xml.bind:jaxb-api`. - -### Extra local runtime validation (high-risk Jersey 3 / Jetty ee10 areas) -- `FunctionApiV3ResourceTest` (Jersey 3 multipart `FormDataParam`): **71 pass, 0 fail**. -- `AsyncHttpConnectorTest` (custom Jersey Connector SPI + internal `*PropertiesDelegate`): 7 pass; the one - failure `testShouldStopRetriesWhenTimeoutOccurs` is a **pre-existing timing-flaky test** (`Thread.sleep` + - WireMock scenario-state race, already carries a flaky-retry analyzer) — unrelated to the namespace migration, - which does not change the retry/timeout logic. Left for CI flaky-test handling. - -## Test-job failures triaged (run `26698057762`) - -ALL **integration tests passed** (Standalone, Transaction, Upgrade, Backwards-Compat, Kubernetes, Metrics, -Shade on Java 17/21/25, etc.) and most unit groups passed. Three unit-tier issues found: - -1. **Ambiguous URI (FIXED).** `AMBIGUOUS_PATH_SEPARATOR` HTTP 400 for `%2F`-encoded path segments (topic names). - Jetty 12 ee10's `ServletHandler` rejects ambiguous URIs at the servlet layer independent of the connector's - `UriCompliance.LEGACY`. Fix: `servletContextHandler.getServletHandler().setDecodeAmbiguousURIs(true)` in the - broker `WebService`, proxy `WebServer`, and functions `WorkerServer`. (Affected `AdminApiDynamicConfigurationsTest`, - `PartitionedProducerConsumerTest.testPartitionedTopicNameWithSpecialCharacter`, and similar.) -2. **Athenz `javax.xml.bind` (RESOLVED UPSTREAM — workaround removed).** `NoClassDefFoundError: - javax/xml/bind/annotation/XmlElement` — the Athenz ZTS client (v1.10.62) shaded `jackson-module-jaxb-annotations`, - which needed the `javax.xml.bind` package that the old `jakarta.xml.bind-api:2.3.3` happened to ship; the bump to - 4.0.2 (real `jakarta.xml.bind`) removed it. This was first worked around by adding - `javax.xml.bind:jaxb-api:2.3.1` (`runtimeOnly`) to `pulsar-client-auth-athenz` + `pulsar-broker-auth-athenz`. - **That workaround has since been removed:** `master` upgraded Athenz to **1.12.42** (#25905, commit - `14e228cf726`), which itself migrated to `jakarta.xml.bind` — its `athenz-auth-core` now pulls - `org.glassfish.jaxb:jaxb-runtime:4.0.8`, so the legacy `javax.xml.bind` classes are no longer on (or needed on) - the Athenz runtime classpath. After rebasing on that commit, both `runtimeOnly(libs.jaxb.api)` lines were dropped - (verified: `AuthenticationAthenzTest` + `AuthenticationProviderAthenzTest` pass and `javax.xml.bind:jaxb-api` is - gone from the Athenz `runtimeClasspath`). The `jaxb-api` catalog alias itself stays — it is now used only by the - tiered-storage offloaders (jclouds/Hadoop), see issue 4. -3. **Broker-interceptor request bodies — phantom "Trailing token" (FIXED).** Every test whose broker enables a - `BrokerInterceptor` (all `TransactionTestBase` subclasses — `TransactionStablePositionTest`, - `TransactionBufferCloseTest`, `AdminApiTransactionMultiBrokerTest`, `TransactionEndToEndTest` — plus - `ExceptionsBrokerInterceptorTest`, and the `TestBrokerInterceptors` *integration* test) failed in `setup` at - `admin.clusters().createCluster(...)` with `HTTP 400 Trailing token (of type START_OBJECT) found after value bound - as ClusterDataImpl ... column 310`. The **`CI - Unit - Brokers - Client Api` group passed** because its tests do - not enable an interceptor — that was the key clue. Root cause: enabling an interceptor activates the broker's - `PreInterceptFilter`, which wraps the request in `RequestWrapper` (so the body can be read more than once). The - old `RequestWrapper.getInputStream()` returned a **fresh `ByteArrayInputStream` on every call**. Under Jetty 12 - ee10 + Jersey 3, the entity reader calls `getInputStream()` more than once; after consuming the 309-byte body and - hitting EOF, a later call returned a brand-new stream positioned at byte 0, so the next read produced the body's - own first byte `{` again — a START_OBJECT at "column 310" that the (now stricter) Jackson jakarta-rs provider - rejects via FAIL_ON_TRAILING_TOKENS. The "310th byte" was never a real next-request byte (it is the body's own - leading `{`), so production framing was never corrupted; only the read-twice wrapper was non-compliant. Fix - (`RequestWrapper`): return a **single, stable** `ServletInputStream` from `getInputStream()` (cache it, per the - Servlet contract), buffer the body **lazily** (so an interceptor that never reads the body — the common case — - does not cause the filter to consume the core stream at all), bound the read to `Content-Length`, and report - `isFinished()` correctly. Verified: `TransactionStablePositionTest` now passes all 6 tests (was failing in - `setup`). This is a real, contract-compliant fix, not a leniency mask. Earlier dead-ends (all reverted) that - pointed at the client/Jetty before the interceptor was identified as the trigger: client no-copy/`enableBuffering`/ - `maxRequestRetry(0)`, bypassing the `CompressionHandler`, and stripping a (null) duplicate `Content-Length`. - -4. **Tiered-storage offloader unit tests — legacy javax APIs dropped from the classpath (FIXED).** - `BlobStoreBackedInputStreamTest` (jcloud) and `FileSystemManagedLedgerOffloaderTest` (file-system) failed in - `start` with `NoClassDefFoundError` for `javax.xml.bind.JAXBException`, `javax.ws.rs.ext.ExceptionMapper`, - `javax.annotation.Priority`, and `javax.validation.Validator`. jclouds 2.6.0 and Hadoop are pre-jakarta libraries - that reference the legacy `javax.*` EE APIs which the migration removed from the transitive classpath. Fixes: - - **jcloud:** `runtimeOnly(libs.jaxb.api)` (`javax.xml.bind:jaxb-api:2.3.1`) — jclouds' `ContextBuilder.build()` - references `javax.xml.bind`. (Production + test path, hence `runtimeOnly`, not test-only.) - - **file-system:** Hadoop's `MiniDFSCluster` NameNode web UI is a **fully-javax** stack (already forced to Jetty 9 - in this module). The migration force-upgraded its `jersey-*:2.46`→`3.1.10` (jakarta), so its - `org.glassfish.jersey.servlet.ServletContainer` stopped being a `javax.servlet.Servlet` - (`UnavailableException`). Pinned the legacy stack **for test configs only** (mirrors the existing Jetty-9 force): - Jersey `2.46` (client/common/server/container-servlet/container-servlet-core/jersey-hk2) + hk2 `2.6.1` - (api/locator/utils/aopalliance-repackaged/jakarta.inject), plus `testRuntimeOnly` legacy - `javax.ws.rs:javax.ws.rs-api:2.1.1`, `javax.annotation:javax.annotation-api:1.3.2`, - `javax.validation:validation-api:2.0.1.Final`, and `runtimeOnly(libs.jaxb.api)` (Hadoop common needs - `javax.xml.bind` at runtime). All `FileSystemManagedLedgerOffloaderTest` (3) + jcloud tests pass locally. - Production offloaders are NARs that bundle their own deps and use HDFS RPC (no web UI), so they are unaffected. - -## Decisions log - -- **D1 (swagger sequencing):** Swagger 1→2 deferred to Phase B (separate commits) so the javax→jakarta core - validates independently. Swagger is `io.swagger` (not javax), compile-only + doc-only, fully decoupled. -- **D2 (filters / dual env):** Pulsar's own filter chain (AuthenticationFilter, RateLimitingFilter, etc.) - migrates to jakarta.servlet (ee10). Legacy javax AdditionalServlet (ee8) path filter handling decided after - inspecting the AdditionalServlet tests (auth coverage). [resolve during wiring] -- **D3 (activation):** impl → `org.eclipse.angus:angus-activation` (EE10). -- **D4 (websocket endpoints stay ee8):** Jetty 12's ee10 websocket environment exposes only the *redesigned* - Jetty 12 WebSocket API (`org.eclipse.jetty.websocket.api.Session.Listener`, `Callback`); the legacy - `WebSocketAdapter`/`WriteCallback`/`RemoteEndpoint`/`Session.getRemote()` API that Pulsar's WS handlers are - written against exists **only** in the ee8 environment (`org.eclipse.jetty.ee8.websocket.api.*`). Rewriting - the handlers to the modern API is behaviorally sensitive, so the WS **endpoint layer** (the 4 `WebSocket*Servlet` - classes + `AbstractWebSocketHandler`/`Consumer`/`Producer`/`Reader`/`MultiTopicConsumerHandler` + - `WebSocketHttpServletRequestWrapper`) is **kept on ee8 + javax.servlet**, registered via `addWebSocketServlet` - into an ee8 Jetty context. The WS **REST/admin tier** (`WebSocketWebResource`, `WebSocketProxyStats*`) still - moves to jakarta.ws.rs/Jersey 3 (ee10). Both run in the same Jetty 12 server (multi-environment). Modernizing - the WS endpoint API to Jetty 12's native API is a separate follow-up. WS wire protocol/behavior unchanged. -- **D4 REVISED:** The ee8-endpoint approach was abandoned: the WS handlers call the **shared jakarta auth SPI** - (`AuthenticationService`/`AuthenticationProvider.newHttpAuthState`/`AuthenticationDataHttps`, also used by the - ee10 REST `AuthenticationFilter`), which takes a `jakarta.servlet.http.HttpServletRequest`. An ee8 (javax) - WS upgrade request can't be passed to it, and the auth SPI must stay jakarta because the REST tier is jakarta. - So the WS **endpoints are migrated to ee10 + the modern Jetty 12 WebSocket API** - (`org.eclipse.jetty.websocket.api.Session.Listener` / `Callback`): `WebSocketAdapter`→`Session.Listener` - (store Session in `onWebSocketOpen`), `getRemote().sendString(s, WriteCallback)`→`session.sendText(s, Callback)`, - `sendPing(buf)`→`session.sendPing(buf, Callback)`, `getRemoteAddress()`→`session.getRemoteSocketAddress()`, - `close(code,reason)`→`session.close(code,reason,Callback)`. WS wire protocol unchanged. diff --git a/pip/pip-472.md b/pip/pip-472.md index ff20e3f675b20..19d68eec8190c 100644 --- a/pip/pip-472.md +++ b/pip/pip-472.md @@ -1,13 +1,5 @@ # PIP-472: Migrate from javax.* to jakarta.* APIs -> **Implementation status / notes:** An implementation of this PIP lives on branch -> `lh-javax-to-jakarta-migration`. Working notes, the *actual* discovered migration surface (which is -> considerably smaller than the estimates below — the partial migration described under *Apache Pulsar's -> current state* has progressed further than the PIP assumed), and the design decisions/deviations made -> during implementation (e.g. Swagger 1→2 split into a later phase, the Eclipse Angus activation impl, and -> the websocket endpoint move to Jetty 12's native WebSocket API) are recorded in -> [`pip-472-notes.md`](pip-472-notes.md). - ## Background Knowledge In 2017, Oracle transferred Java EE to the Eclipse Foundation, where it was renamed Jakarta EE. As part of that transfer, Oracle did not grant Eclipse the right to evolve the `javax.*` namespace; from Jakarta EE 9 onward (released 2020), every Jakarta EE specification moved its package prefix from `javax.*` to `jakarta.*`. The two namespaces are source- and binary-incompatible: an application can use either, but not both, for the same specification.