This is an automated email from the ASF dual-hosted git repository.
mattyb149 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/main by this push:
new c08560447f NIFI-11518 Upgraded Jetty from 9.4.51 to 10.0.15
c08560447f is described below
commit c08560447fe2990c9d244731a09ed27ca770cb50
Author: exceptionfactory <[email protected]>
AuthorDate: Tue May 2 21:06:47 2023 -0500
NIFI-11518 Upgraded Jetty from 9.4.51 to 10.0.15
- Updated Jetty WebSocket components using Jetty 10 components
- Upgraded Solr components from 8.11.2 to 9.2.1 to align with Jetty 10
dependencies
Signed-off-by: Matt Burgess <[email protected]>
This closes #7622
---
.../src/main/resources/conf/webdefault.xml | 8 -
.../apache/nifi/minifi/c2/jetty/JettyServer.java | 8 -
.../org/apache/nifi/web/server/JettyServer.java | 12 -
.../apache/nifi/web/server/util/StoreScanner.java | 11 +-
.../resources/org/apache/nifi/web/webdefault.xml | 8 -
.../nifi/integration/util/NiFiTestServer.java | 3 +-
.../nifi-hadoop-libraries-nar/pom.xml | 11 +
.../nifi-hive-bundle/nifi-hive-test-utils/pom.xml | 11 +
.../nifi-hive-bundle/nifi-hive3-processors/pom.xml | 16 +
.../nifi-iceberg-common/pom.xml | 11 +
.../nifi-parquet-processors/pom.xml | 5 +
.../nifi-prometheus-reporting-task/pom.xml | 6 -
.../reporting/prometheus/PrometheusServer.java | 4 +-
.../nifi-ranger-bundle/nifi-ranger-plugin/pom.xml | 11 +
.../nifi-solr-bundle/nifi-solr-processors/pom.xml | 64 +-
.../processors/solr/KerberosHttpClientBuilder.java | 14 +-
.../org/apache/nifi/processors/solr/SolrUtils.java | 24 +-
.../processors/solr/EmbeddedSolrServerFactory.java | 10 +-
.../apache/nifi/processors/solr/QuerySolrIT.java | 664 ---------------------
.../processors/standard/HandleHttpRequest.java | 2 +-
.../standard/servlets/ListenHTTPServlet.java | 2 +-
.../nifi-websocket-services-jetty/pom.xml | 12 +-
.../jetty/AbstractJettyWebSocketService.java | 43 --
.../nifi/websocket/jetty/JettyWebSocketClient.java | 36 +-
.../nifi/websocket/jetty/JettyWebSocketServer.java | 138 ++---
.../websocket/jetty/JettyWebSocketSession.java | 6 +-
.../apache/nifi/registry/jetty/JettyServer.java | 7 -
.../org/apache/nifi-registry/web/webdefault.xml | 8 -
.../nifi/registry/web/JettyITServerCustomizer.java | 2 +-
.../server/TlsCertificateAuthorityService.java | 2 +-
pom.xml | 8 +-
31 files changed, 217 insertions(+), 950 deletions(-)
diff --git
a/minifi/minifi-c2/minifi-c2-assembly/src/main/resources/conf/webdefault.xml
b/minifi/minifi-c2/minifi-c2-assembly/src/main/resources/conf/webdefault.xml
index 811eeb2f6e..de5f1c1b13 100644
--- a/minifi/minifi-c2/minifi-c2-assembly/src/main/resources/conf/webdefault.xml
+++ b/minifi/minifi-c2/minifi-c2-assembly/src/main/resources/conf/webdefault.xml
@@ -42,14 +42,6 @@
Default web.xml file.
This file is applied to a Web application before it's own
WEB_INF/web.xml file
</description>
-
- <!-- ====================================================================
-->
- <!-- Removes static references to beans from javax.el.BeanELResolver to
-->
- <!-- ensure webapp classloader can be released on undeploy
-->
- <!-- ====================================================================
-->
- <listener>
-
<listener-class>org.eclipse.jetty.servlet.listener.ELContextCleaner</listener-class>
- </listener>
<!-- ====================================================================
-->
<!-- Removes static configurationCache of Methods from
java.beans.Introspector to -->
diff --git
a/minifi/minifi-c2/minifi-c2-jetty/src/main/java/org/apache/nifi/minifi/c2/jetty/JettyServer.java
b/minifi/minifi-c2/minifi-c2-jetty/src/main/java/org/apache/nifi/minifi/c2/jetty/JettyServer.java
index 7002a19e0c..3f7d5f559e 100644
---
a/minifi/minifi-c2/minifi-c2-jetty/src/main/java/org/apache/nifi/minifi/c2/jetty/JettyServer.java
+++
b/minifi/minifi-c2/minifi-c2-jetty/src/main/java/org/apache/nifi/minifi/c2/jetty/JettyServer.java
@@ -34,9 +34,6 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.KeyStore;
import java.security.Security;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
import java.util.stream.Stream;
import javax.net.ssl.SSLContext;
import
org.apache.nifi.jetty.configuration.connector.StandardServerConnectorFactory;
@@ -155,11 +152,6 @@ public class JettyServer {
// instruction jetty to examine these jars for tlds, web-fragments, etc
webappContext.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
".*/[^/]*servlet-api-[^/]*\\.jar$|.*/javax.servlet.jsp.jstl-.*\\\\.jar$|.*/[^/]*taglibs.*\\.jar$"
);
-
- // remove slf4j server class to allow WAR files to have slf4j
dependencies in WEB-INF/lib
- List<String> serverClasses = new
ArrayList<>(Arrays.asList(webappContext.getServerClasses()));
- serverClasses.remove("org.slf4j.");
- webappContext.setServerClasses(serverClasses.toArray(new String[0]));
webappContext.setDefaultsDescriptor(WEB_DEFAULTS_XML);
// get the temp directory for this webapp
diff --git
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-jetty/src/main/java/org/apache/nifi/web/server/JettyServer.java
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-jetty/src/main/java/org/apache/nifi/web/server/JettyServer.java
index 5db019eb1b..aef55ebbb4 100644
---
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-jetty/src/main/java/org/apache/nifi/web/server/JettyServer.java
+++
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-jetty/src/main/java/org/apache/nifi/web/server/JettyServer.java
@@ -64,7 +64,6 @@ import
org.apache.nifi.web.server.filter.RestApiRequestFilterProvider;
import org.apache.nifi.web.server.filter.StandardRequestFilterProvider;
import org.apache.nifi.web.server.log.RequestLogProvider;
import org.apache.nifi.web.server.log.StandardRequestLogProvider;
-import org.eclipse.jetty.annotations.AnnotationConfiguration;
import org.eclipse.jetty.deploy.App;
import org.eclipse.jetty.deploy.DeploymentManager;
import org.eclipse.jetty.server.Connector;
@@ -81,8 +80,6 @@ import org.eclipse.jetty.servlet.ErrorPageErrorHandler;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
-import org.eclipse.jetty.webapp.Configuration;
-import org.eclipse.jetty.webapp.JettyWebXmlConfiguration;
import org.eclipse.jetty.webapp.WebAppClassLoader;
import org.eclipse.jetty.webapp.WebAppContext;
import org.slf4j.Logger;
@@ -107,7 +104,6 @@ import java.net.NetworkInterface;
import java.net.SocketException;
import java.nio.file.Paths;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.EnumSet;
@@ -197,10 +193,6 @@ public class JettyServer implements NiFiServer,
ExtensionUiLoader {
// create the server
this.server = new Server(threadPool);
- // enable the annotation based configuration to ensure the jsp
container is initialized properly
- final Configuration.ClassList classlist =
Configuration.ClassList.setServerDefault(server);
- classlist.addBefore(JettyWebXmlConfiguration.class.getName(),
AnnotationConfiguration.class.getName());
-
// configure server
configureConnectors(server);
@@ -593,10 +585,6 @@ public class JettyServer implements NiFiServer,
ExtensionUiLoader {
// instruction jetty to examine these jars for tlds, web-fragments, etc
webappContext.setAttribute(CONTAINER_INCLUDE_PATTERN_KEY,
CONTAINER_INCLUDE_PATTERN_VALUE);
- // remove slf4j server class to allow WAR files to have slf4j
dependencies in WEB-INF/lib
- List<String> serverClasses = new
ArrayList<>(Arrays.asList(webappContext.getServerClasses()));
- serverClasses.remove("org.slf4j.");
- webappContext.setServerClasses(serverClasses.toArray(new String[0]));
webappContext.setDefaultsDescriptor(WEB_DEFAULTS_XML);
webappContext.getMimeTypes().addMimeMapping("ttf", "font/ttf");
webappContext.setErrorHandler(getErrorHandler());
diff --git
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-jetty/src/main/java/org/apache/nifi/web/server/util/StoreScanner.java
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-jetty/src/main/java/org/apache/nifi/web/server/util/StoreScanner.java
index daf7c02db4..132bf598da 100644
---
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-jetty/src/main/java/org/apache/nifi/web/server/util/StoreScanner.java
+++
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-jetty/src/main/java/org/apache/nifi/web/server/util/StoreScanner.java
@@ -18,14 +18,15 @@ package org.apache.nifi.web.server.util;
import org.apache.nifi.security.util.TlsConfiguration;
import org.apache.nifi.security.util.TlsException;
+import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.Scanner;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedOperation;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import javax.net.ssl.SSLContext;
import java.io.File;
@@ -38,7 +39,7 @@ import static
org.apache.nifi.security.util.SslContextFactory.createSslContext;
* File Scanner for Keystore or Truststore reloading using provided TLS
Configuration
*/
public class StoreScanner extends ContainerLifeCycle implements
Scanner.DiscreteListener {
- private static final Logger LOG = Log.getLogger(StoreScanner.class);
+ private static final Logger LOG =
LoggerFactory.getLogger(StoreScanner.class);
private final SslContextFactory sslContextFactory;
private final TlsConfiguration tlsConfiguration;
@@ -114,8 +115,8 @@ public class StoreScanner extends ContainerLifeCycle
implements Scanner.Discrete
public void scan() {
LOG.debug("Resource [{}] scanning started", resourceName);
- this.scanner.scan();
- this.scanner.scan();
+ this.scanner.scan(new Callback.Completable());
+ this.scanner.scan(new Callback.Completable());
}
@ManagedOperation(
diff --git
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-jetty/src/main/resources/org/apache/nifi/web/webdefault.xml
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-jetty/src/main/resources/org/apache/nifi/web/webdefault.xml
index 74a1059eb2..acc67d8733 100644
---
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-jetty/src/main/resources/org/apache/nifi/web/webdefault.xml
+++
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-jetty/src/main/resources/org/apache/nifi/web/webdefault.xml
@@ -42,14 +42,6 @@
Default web.xml file.
This file is applied to a Web application before it's own
WEB_INF/web.xml file
</description>
-
- <!-- ====================================================================
-->
- <!-- Removes static references to beans from javax.el.BeanELResolver to
-->
- <!-- ensure webapp classloader can be released on undeploy
-->
- <!-- ====================================================================
-->
- <listener>
-
<listener-class>org.eclipse.jetty.servlet.listener.ELContextCleaner</listener-class>
- </listener>
<!-- ====================================================================
-->
<!-- Removes static cache of Methods from java.beans.Introspector to
-->
diff --git
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/integration/util/NiFiTestServer.java
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/integration/util/NiFiTestServer.java
index 1ef38b5a08..c9bdac47c0 100644
---
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/integration/util/NiFiTestServer.java
+++
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/integration/util/NiFiTestServer.java
@@ -33,6 +33,7 @@ import org.eclipse.jetty.server.SecureRequestCustomizer;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.SslConnectionFactory;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.eclipse.jetty.webapp.WebAppContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -77,7 +78,7 @@ public class NiFiTestServer {
// TODO: Refactor this method to use proper factory methods
private void createSecureConnector() {
- org.eclipse.jetty.util.ssl.SslContextFactory contextFactory = new
org.eclipse.jetty.util.ssl.SslContextFactory.Server();
+ SslContextFactory.Server contextFactory = new
SslContextFactory.Server();
// require client auth when not supporting login or anonymous access
if
(StringUtils.isBlank(properties.getProperty(NiFiProperties.SECURITY_USER_LOGIN_IDENTITY_PROVIDER)))
{
diff --git
a/nifi-nar-bundles/nifi-hadoop-libraries-bundle/nifi-hadoop-libraries-nar/pom.xml
b/nifi-nar-bundles/nifi-hadoop-libraries-bundle/nifi-hadoop-libraries-nar/pom.xml
index 511215801e..e3a730493e 100644
---
a/nifi-nar-bundles/nifi-hadoop-libraries-bundle/nifi-hadoop-libraries-nar/pom.xml
+++
b/nifi-nar-bundles/nifi-hadoop-libraries-bundle/nifi-hadoop-libraries-nar/pom.xml
@@ -28,6 +28,12 @@
<version>2.0.0-SNAPSHOT</version>
<type>nar</type>
</dependency>
+ <!-- Add Jetty 10 websocket for Hadoop YarnClientImpl.shellToContainer
-->
+ <dependency>
+ <groupId>org.eclipse.jetty.websocket</groupId>
+ <artifactId>websocket-jetty-client</artifactId>
+ <version>${jetty.version}</version>
+ </dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
@@ -49,6 +55,11 @@
<groupId>org.slf4j</groupId>
<artifactId>slf4j-reload4j</artifactId>
</exclusion>
+ <!-- Exclude Jetty 9.4 -->
+ <exclusion>
+ <groupId>org.eclipse.jetty.websocket</groupId>
+ <artifactId>websocket-client</artifactId>
+ </exclusion>
</exclusions>
</dependency>
<dependency>
diff --git a/nifi-nar-bundles/nifi-hive-bundle/nifi-hive-test-utils/pom.xml
b/nifi-nar-bundles/nifi-hive-bundle/nifi-hive-test-utils/pom.xml
index 2b3328f454..6265d6f6ca 100644
--- a/nifi-nar-bundles/nifi-hive-bundle/nifi-hive-test-utils/pom.xml
+++ b/nifi-nar-bundles/nifi-hive-bundle/nifi-hive-test-utils/pom.xml
@@ -59,6 +59,12 @@
</exclusion>
</exclusions>
</dependency>
+ <!-- Add Jetty 10 websocket for Hadoop
YarnClientImpl.shellToContainer -->
+ <dependency>
+ <groupId>org.eclipse.jetty.websocket</groupId>
+ <artifactId>websocket-jetty-client</artifactId>
+ <version>${jetty.version}</version>
+ </dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
@@ -80,6 +86,11 @@
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
+ <!-- Exclude Jetty 9.4 -->
+ <exclusion>
+ <groupId>org.eclipse.jetty.websocket</groupId>
+ <artifactId>websocket-client</artifactId>
+ </exclusion>
</exclusions>
</dependency>
<!-- Override Guava 27 -->
diff --git a/nifi-nar-bundles/nifi-hive-bundle/nifi-hive3-processors/pom.xml
b/nifi-nar-bundles/nifi-hive-bundle/nifi-hive3-processors/pom.xml
index 7629db7eaa..822fafa035 100644
--- a/nifi-nar-bundles/nifi-hive-bundle/nifi-hive3-processors/pom.xml
+++ b/nifi-nar-bundles/nifi-hive-bundle/nifi-hive3-processors/pom.xml
@@ -83,6 +83,12 @@
<groupId>org.apache.nifi</groupId>
<artifactId>nifi-kerberos-user-service-api</artifactId>
</dependency>
+ <!-- Add Jetty 10 websocket for Hadoop YarnClientImpl.shellToContainer
-->
+ <dependency>
+ <groupId>org.eclipse.jetty.websocket</groupId>
+ <artifactId>websocket-jetty-client</artifactId>
+ <version>${jetty.version}</version>
+ </dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
@@ -133,6 +139,11 @@
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
+ <!-- Exclude Jetty 9.4 -->
+ <exclusion>
+ <groupId>org.eclipse.jetty.websocket</groupId>
+ <artifactId>websocket-client</artifactId>
+ </exclusion>
</exclusions>
</dependency>
<dependency>
@@ -285,6 +296,11 @@
<groupId>org.slf4j</groupId>
<artifactId>slf4j-reload4j</artifactId>
</exclusion>
+ <!-- Exclude Jetty 9.4 -->
+ <exclusion>
+ <groupId>org.eclipse.jetty.websocket</groupId>
+ <artifactId>websocket-client</artifactId>
+ </exclusion>
</exclusions>
</dependency>
<dependency>
diff --git a/nifi-nar-bundles/nifi-iceberg-bundle/nifi-iceberg-common/pom.xml
b/nifi-nar-bundles/nifi-iceberg-bundle/nifi-iceberg-common/pom.xml
index 2d1b987b18..373c49fddc 100644
--- a/nifi-nar-bundles/nifi-iceberg-bundle/nifi-iceberg-common/pom.xml
+++ b/nifi-nar-bundles/nifi-iceberg-bundle/nifi-iceberg-common/pom.xml
@@ -92,6 +92,12 @@
<artifactId>iceberg-orc</artifactId>
<version>${iceberg.version}</version>
</dependency>
+ <!-- Add Jetty 10 websocket for Hadoop YarnClientImpl.shellToContainer
-->
+ <dependency>
+ <groupId>org.eclipse.jetty.websocket</groupId>
+ <artifactId>websocket-jetty-client</artifactId>
+ <version>${jetty.version}</version>
+ </dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
@@ -117,6 +123,11 @@
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</exclusion>
+ <!-- Exclude Jetty 9.4 -->
+ <exclusion>
+ <groupId>org.eclipse.jetty.websocket</groupId>
+ <artifactId>websocket-client</artifactId>
+ </exclusion>
</exclusions>
</dependency>
<dependency>
diff --git
a/nifi-nar-bundles/nifi-parquet-bundle/nifi-parquet-processors/pom.xml
b/nifi-nar-bundles/nifi-parquet-bundle/nifi-parquet-processors/pom.xml
index 8353ceb402..79e54a6b10 100644
--- a/nifi-nar-bundles/nifi-parquet-bundle/nifi-parquet-processors/pom.xml
+++ b/nifi-nar-bundles/nifi-parquet-bundle/nifi-parquet-processors/pom.xml
@@ -68,6 +68,11 @@
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
+ <!-- Exclude Jetty 9.4 -->
+ <exclusion>
+ <groupId>org.eclipse.jetty.websocket</groupId>
+ <artifactId>websocket-client</artifactId>
+ </exclusion>
</exclusions>
</dependency>
<dependency>
diff --git
a/nifi-nar-bundles/nifi-prometheus-bundle/nifi-prometheus-reporting-task/pom.xml
b/nifi-nar-bundles/nifi-prometheus-bundle/nifi-prometheus-reporting-task/pom.xml
index 0d071f1ea7..1fef5db996 100644
---
a/nifi-nar-bundles/nifi-prometheus-bundle/nifi-prometheus-reporting-task/pom.xml
+++
b/nifi-nar-bundles/nifi-prometheus-bundle/nifi-prometheus-reporting-task/pom.xml
@@ -52,12 +52,6 @@
<artifactId>nifi-ssl-context-service-api</artifactId>
<version>2.0.0-SNAPSHOT</version>
</dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-continuation</artifactId>
- <version>${jetty.version}</version>
- <scope>test</scope>
- </dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-http</artifactId>
diff --git
a/nifi-nar-bundles/nifi-prometheus-bundle/nifi-prometheus-reporting-task/src/main/java/org/apache/nifi/reporting/prometheus/PrometheusServer.java
b/nifi-nar-bundles/nifi-prometheus-bundle/nifi-prometheus-reporting-task/src/main/java/org/apache/nifi/reporting/prometheus/PrometheusServer.java
index 6af7bec28a..c1b813691e 100644
---
a/nifi-nar-bundles/nifi-prometheus-bundle/nifi-prometheus-reporting-task/src/main/java/org/apache/nifi/reporting/prometheus/PrometheusServer.java
+++
b/nifi-nar-bundles/nifi-prometheus-bundle/nifi-prometheus-reporting-task/src/main/java/org/apache/nifi/reporting/prometheus/PrometheusServer.java
@@ -103,7 +103,7 @@ public class PrometheusServer {
this.handler = new ServletContextHandler(server, "/metrics");
this.handler.addServlet(new ServletHolder(new MetricsServlet()), "/");
- SslContextFactory sslFactory = createSslFactory(sslContextService,
needClientAuth, wantClientAuth);
+ SslContextFactory.Server sslFactory =
createSslFactory(sslContextService, needClientAuth, wantClientAuth);
HttpConfiguration httpsConfiguration = new HttpConfiguration();
httpsConfiguration.setSecureScheme("https");
httpsConfiguration.setSecurePort(addr);
@@ -123,7 +123,7 @@ public class PrometheusServer {
}
}
- private SslContextFactory createSslFactory(final SSLContextService
sslService, boolean needClientAuth, boolean wantClientAuth) {
+ private SslContextFactory.Server createSslFactory(final SSLContextService
sslService, boolean needClientAuth, boolean wantClientAuth) {
final SslContextFactory.Server sslFactory = new
SslContextFactory.Server();
sslFactory.setNeedClientAuth(needClientAuth);
diff --git a/nifi-nar-bundles/nifi-ranger-bundle/nifi-ranger-plugin/pom.xml
b/nifi-nar-bundles/nifi-ranger-bundle/nifi-ranger-plugin/pom.xml
index e77ace3a6e..f7d3b2311a 100644
--- a/nifi-nar-bundles/nifi-ranger-bundle/nifi-ranger-plugin/pom.xml
+++ b/nifi-nar-bundles/nifi-ranger-bundle/nifi-ranger-plugin/pom.xml
@@ -121,6 +121,12 @@
<version>1.3.9-1</version>
</dependency>
<!-- hadoop-client is needed for auditing to HDFS -->
+ <!-- Add Jetty 10 websocket for Hadoop YarnClientImpl.shellToContainer
-->
+ <dependency>
+ <groupId>org.eclipse.jetty.websocket</groupId>
+ <artifactId>websocket-jetty-client</artifactId>
+ <version>${jetty.version}</version>
+ </dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
@@ -138,6 +144,11 @@
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
+ <!-- Exclude Jetty 9.4 -->
+ <exclusion>
+ <groupId>org.eclipse.jetty.websocket</groupId>
+ <artifactId>websocket-client</artifactId>
+ </exclusion>
</exclusions>
</dependency>
<!-- hadoop-common and hadoop-auth are transitive dependencies of
ranger client, but we need to make sure they
diff --git a/nifi-nar-bundles/nifi-solr-bundle/nifi-solr-processors/pom.xml
b/nifi-nar-bundles/nifi-solr-bundle/nifi-solr-processors/pom.xml
index 38afac0341..3dacb20ee9 100755
--- a/nifi-nar-bundles/nifi-solr-bundle/nifi-solr-processors/pom.xml
+++ b/nifi-nar-bundles/nifi-solr-bundle/nifi-solr-processors/pom.xml
@@ -23,7 +23,7 @@
<artifactId>nifi-solr-processors</artifactId>
<packaging>jar</packaging>
<properties>
- <solr.version>8.11.2</solr.version>
+ <solr.version>9.2.1</solr.version>
</properties>
<dependencies>
<dependency>
@@ -39,22 +39,10 @@
<groupId>org.apache.nifi</groupId>
<artifactId>nifi-schema-registry-service-api</artifactId>
</dependency>
- <!-- Override woodstox-core 6.2.4 from Solr 8.11.1 -->
- <dependency>
- <groupId>com.fasterxml.woodstox</groupId>
- <artifactId>woodstox-core</artifactId>
- <version>6.5.1</version>
- </dependency>
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>${solr.version}</version>
- <exclusions>
- <exclusion>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-core</artifactId>
- </exclusion>
- </exclusions>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
@@ -64,6 +52,10 @@
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ </dependency>
<dependency>
<groupId>org.apache.nifi</groupId>
<artifactId>nifi-api</artifactId>
@@ -98,61 +90,33 @@
<artifactId>gson</artifactId>
</dependency>
<!-- test dependencies -->
- <dependency>
- <groupId>org.apache.nifi</groupId>
- <artifactId>nifi-record-serialization-services</artifactId>
- <version>2.0.0-SNAPSHOT</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.nifi</groupId>
- <artifactId>nifi-mock</artifactId>
- <version>2.0.0-SNAPSHOT</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.nifi</groupId>
- <artifactId>nifi-mock-record-utils</artifactId>
- <version>2.0.0-SNAPSHOT</version>
- <scope>test</scope>
- </dependency>
- <!-- Need to declare the newer versions of these b/c NiFi uses Lucene
4.10.3 -->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-core</artifactId>
<version>${solr.version}</version>
<exclusions>
- <exclusion>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-core</artifactId>
- </exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</exclusion>
- <exclusion>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-slf4j-impl</artifactId>
- </exclusion>
</exclusions>
- <scope>test</scope>
</dependency>
<dependency>
- <groupId>org.apache.lucene</groupId>
- <artifactId>lucene-core</artifactId>
- <version>${solr.version}</version>
+ <groupId>org.apache.nifi</groupId>
+ <artifactId>nifi-record-serialization-services</artifactId>
+ <version>2.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
- <groupId>org.apache.lucene</groupId>
- <artifactId>lucene-analyzers-common</artifactId>
- <version>${solr.version}</version>
+ <groupId>org.apache.nifi</groupId>
+ <artifactId>nifi-mock</artifactId>
+ <version>2.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
- <groupId>org.apache.lucene</groupId>
- <artifactId>lucene-queryparser</artifactId>
- <version>${solr.version}</version>
+ <groupId>org.apache.nifi</groupId>
+ <artifactId>nifi-mock-record-utils</artifactId>
+ <version>2.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
diff --git
a/nifi-nar-bundles/nifi-solr-bundle/nifi-solr-processors/src/main/java/org/apache/nifi/processors/solr/KerberosHttpClientBuilder.java
b/nifi-nar-bundles/nifi-solr-bundle/nifi-solr-processors/src/main/java/org/apache/nifi/processors/solr/KerberosHttpClientBuilder.java
index 8f2f10c0f5..48ef1c49f0 100644
---
a/nifi-nar-bundles/nifi-solr-bundle/nifi-solr-processors/src/main/java/org/apache/nifi/processors/solr/KerberosHttpClientBuilder.java
+++
b/nifi-nar-bundles/nifi-solr-bundle/nifi-solr-processors/src/main/java/org/apache/nifi/processors/solr/KerberosHttpClientBuilder.java
@@ -16,9 +16,7 @@
*/
package org.apache.nifi.processors.solr;
-import java.lang.invoke.MethodHandles;
import java.security.Principal;
-import java.util.Optional;
import org.apache.http.HttpEntity;
import org.apache.http.HttpEntityEnclosingRequest;
@@ -38,8 +36,6 @@ import
org.apache.solr.client.solrj.impl.HttpClientBuilderFactory;
import org.apache.solr.client.solrj.impl.HttpClientUtil;
import org.apache.solr.client.solrj.impl.SolrHttpClientBuilder;
import org.apache.solr.client.solrj.impl.SolrPortAwareCookieSpecFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
* This class is a modified version of Krb5HttpClientBuilder that is part of
SolrJ.
@@ -49,23 +45,17 @@ import org.slf4j.LoggerFactory;
*/
public class KerberosHttpClientBuilder implements HttpClientBuilderFactory {
- private static final Logger logger =
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
public KerberosHttpClientBuilder() {
}
- public SolrHttpClientBuilder getBuilder() {
- return getBuilder(HttpClientUtil.getHttpClientBuilder());
- }
-
public void close() {
HttpClientUtil.removeRequestInterceptor(bufferedEntityInterceptor);
}
@Override
- public SolrHttpClientBuilder
getHttpClientBuilder(Optional<SolrHttpClientBuilder> builder) {
- return builder.isPresent() ? getBuilder(builder.get()) : getBuilder();
+ public SolrHttpClientBuilder getHttpClientBuilder(SolrHttpClientBuilder
builder) {
+ return getBuilder(builder);
}
public SolrHttpClientBuilder getBuilder(SolrHttpClientBuilder builder) {
diff --git
a/nifi-nar-bundles/nifi-solr-bundle/nifi-solr-processors/src/main/java/org/apache/nifi/processors/solr/SolrUtils.java
b/nifi-nar-bundles/nifi-solr-bundle/nifi-solr-processors/src/main/java/org/apache/nifi/processors/solr/SolrUtils.java
index 03dcb6924b..7b73901ff3 100644
---
a/nifi-nar-bundles/nifi-solr-bundle/nifi-solr-processors/src/main/java/org/apache/nifi/processors/solr/SolrUtils.java
+++
b/nifi-nar-bundles/nifi-solr-bundle/nifi-solr-processors/src/main/java/org/apache/nifi/processors/solr/SolrUtils.java
@@ -50,9 +50,10 @@ import
org.apache.nifi.serialization.record.type.ChoiceDataType;
import org.apache.nifi.serialization.record.util.DataTypeUtils;
import org.apache.nifi.ssl.SSLContextService;
import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.impl.CloudSolrClient;
+import org.apache.solr.client.solrj.impl.CloudLegacySolrClient;
import org.apache.solr.client.solrj.impl.HttpClientUtil;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
+import org.apache.solr.client.solrj.impl.SolrHttpClientBuilder;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.util.ClientUtils;
import org.apache.solr.common.SolrDocument;
@@ -238,9 +239,10 @@ public class SolrUtils {
public static final String REPEATING_PARAM_PATTERN = "[\\w\\.]+\\.\\d+$";
private static final String ROOT_PATH = "/";
+ @SuppressWarnings("deprecation")
public static synchronized SolrClient createSolrClient(final
PropertyContext context, final String solrLocation) {
- final Integer socketTimeout =
context.getProperty(SOLR_SOCKET_TIMEOUT).asTimePeriod(TimeUnit.MILLISECONDS).intValue();
- final Integer connectionTimeout =
context.getProperty(SOLR_CONNECTION_TIMEOUT).asTimePeriod(TimeUnit.MILLISECONDS).intValue();
+ final int socketTimeout =
context.getProperty(SOLR_SOCKET_TIMEOUT).asTimePeriod(TimeUnit.MILLISECONDS).intValue();
+ final int connectionTimeout =
context.getProperty(SOLR_CONNECTION_TIMEOUT).asTimePeriod(TimeUnit.MILLISECONDS).intValue();
final Integer maxConnections =
context.getProperty(SOLR_MAX_CONNECTIONS).asInteger();
final Integer maxConnectionsPerHost =
context.getProperty(SOLR_MAX_CONNECTIONS_PER_HOST).asInteger();
final SSLContextService sslContextService =
context.getProperty(SSL_CONTEXT_SERVICE).asControllerService(SSLContextService.class);
@@ -253,7 +255,7 @@ public class SolrUtils {
// has to happen before the client is created below so that correct
configurer would be set if needed
if (kerberosCredentialsService != null ||
(!StringUtils.isBlank(kerberosPrincipal) &&
!StringUtils.isBlank(kerberosPassword))) {
- HttpClientUtil.setHttpClientBuilder(new
KerberosHttpClientBuilder().getHttpClientBuilder(Optional.empty()));
+ HttpClientUtil.setHttpClientBuilder(new
KerberosHttpClientBuilder().getHttpClientBuilder(SolrHttpClientBuilder.create()));
}
if (sslContextService != null) {
@@ -287,13 +289,15 @@ public class SolrUtils {
String zkChrootPath = getZooKeeperChrootPathSuffix(solrLocation);
final String collection =
context.getProperty(COLLECTION).evaluateAttributeExpressions().getValue();
- final Integer zkClientTimeout =
context.getProperty(ZK_CLIENT_TIMEOUT).asTimePeriod(TimeUnit.MILLISECONDS).intValue();
- final Integer zkConnectionTimeout =
context.getProperty(ZK_CONNECTION_TIMEOUT).asTimePeriod(TimeUnit.MILLISECONDS).intValue();
-
- CloudSolrClient cloudSolrClient = new
CloudSolrClient.Builder(zkList,
Optional.of(zkChrootPath)).withHttpClient(httpClient).build();
+ final int zkClientTimeout =
context.getProperty(ZK_CLIENT_TIMEOUT).asTimePeriod(TimeUnit.MILLISECONDS).intValue();
+ final int zkConnectionTimeout =
context.getProperty(ZK_CONNECTION_TIMEOUT).asTimePeriod(TimeUnit.MILLISECONDS).intValue();
+
+ final CloudLegacySolrClient cloudSolrClient = new
CloudLegacySolrClient.Builder(zkList, Optional.of(zkChrootPath))
+ .withConnectionTimeout(zkConnectionTimeout,
TimeUnit.MILLISECONDS)
+ .withSocketTimeout(zkClientTimeout, TimeUnit.MILLISECONDS)
+ .withHttpClient(httpClient)
+ .build();
cloudSolrClient.setDefaultCollection(collection);
- cloudSolrClient.setZkClientTimeout(zkClientTimeout);
- cloudSolrClient.setZkConnectTimeout(zkConnectionTimeout);
return cloudSolrClient;
}
}
diff --git
a/nifi-nar-bundles/nifi-solr-bundle/nifi-solr-processors/src/test/java/org/apache/nifi/processors/solr/EmbeddedSolrServerFactory.java
b/nifi-nar-bundles/nifi-solr-bundle/nifi-solr-processors/src/test/java/org/apache/nifi/processors/solr/EmbeddedSolrServerFactory.java
index 7f001cc7bd..16bc20a727 100644
---
a/nifi-nar-bundles/nifi-solr-bundle/nifi-solr-processors/src/test/java/org/apache/nifi/processors/solr/EmbeddedSolrServerFactory.java
+++
b/nifi-nar-bundles/nifi-solr-bundle/nifi-solr-processors/src/test/java/org/apache/nifi/processors/solr/EmbeddedSolrServerFactory.java
@@ -23,9 +23,11 @@ import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
import org.apache.solr.core.CoreContainer;
import org.apache.solr.core.NodeConfig;
+import org.apache.solr.logging.LogWatcherConfig;
import java.io.File;
import java.io.IOException;
+import java.nio.file.Path;
import java.nio.file.Paths;
/**
@@ -60,7 +62,8 @@ public class EmbeddedSolrServerFactory {
public static SolrClient create(String solrHome, String coreName, String
dataDir)
throws IOException {
- NodeConfig.NodeConfigBuilder nodeConfig = new
NodeConfig.NodeConfigBuilder(coreName, Paths.get(solrHome));
+ final Path homePath = Paths.get(solrHome).toAbsolutePath();
+ NodeConfig.NodeConfigBuilder nodeConfig = new
NodeConfig.NodeConfigBuilder(coreName, homePath);
if (dataDir != null) {
File coreDataDir = new File(dataDir + "/" + coreName);
@@ -70,7 +73,10 @@ public class EmbeddedSolrServerFactory {
nodeConfig.setSolrDataHome(coreDataDir.getPath());
}
- final CoreContainer coreContainer = new CoreContainer(new
NodeConfig.NodeConfigBuilder(coreName, Paths.get(solrHome)).build());
+ final LogWatcherConfig logWatcherConfig = new LogWatcherConfig(false,
EmbeddedSolrServerFactory.class.getSimpleName(), "ERROR", 0);
+ final CoreContainer coreContainer = new CoreContainer(new
NodeConfig.NodeConfigBuilder(coreName, homePath)
+ .setLogWatcherConfig(logWatcherConfig)
+ .build());
coreContainer.load();
return new EmbeddedSolrServer(coreContainer, coreName);
diff --git
a/nifi-nar-bundles/nifi-solr-bundle/nifi-solr-processors/src/test/java/org/apache/nifi/processors/solr/QuerySolrIT.java
b/nifi-nar-bundles/nifi-solr-bundle/nifi-solr-processors/src/test/java/org/apache/nifi/processors/solr/QuerySolrIT.java
deleted file mode 100644
index fb74df0c2f..0000000000
---
a/nifi-nar-bundles/nifi-solr-bundle/nifi-solr-processors/src/test/java/org/apache/nifi/processors/solr/QuerySolrIT.java
+++ /dev/null
@@ -1,664 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.nifi.processors.solr;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-
-import com.google.gson.stream.JsonReader;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.text.SimpleDateFormat;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Optional;
-import java.util.TimeZone;
-import org.apache.nifi.json.JsonRecordSetWriter;
-import org.apache.nifi.processor.ProcessContext;
-import org.apache.nifi.reporting.InitializationException;
-import org.apache.nifi.schema.access.SchemaAccessUtils;
-import org.apache.nifi.ssl.SSLContextService;
-import org.apache.nifi.util.MockFlowFile;
-import org.apache.nifi.util.TestRunner;
-import org.apache.nifi.util.TestRunners;
-import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.impl.CloudSolrClient;
-import org.apache.solr.client.solrj.impl.ZkClientClusterStateProvider;
-import org.apache.solr.client.solrj.request.CollectionAdminRequest;
-import org.apache.solr.common.SolrInputDocument;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Test;
-import org.mockito.Mockito;
-import org.xmlunit.matchers.CompareMatcher;
-
-public class QuerySolrIT {
- /*
-
- This integration test expects a Solr instance running locally in SolrCloud
mode, coordinated by a single ZooKeeper
- instance accessible with the ZooKeeper-Connect-String "localhost:2181".
-
- */
-
- private static final SimpleDateFormat DATE_FORMAT = new
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
- private static final SimpleDateFormat DATE_FORMAT_SOLR_COLLECTION = new
SimpleDateFormat("yyyy_MM_dd_HH_mm_ss", Locale.US);
- private static String SOLR_COLLECTION;
- private static String ZK_CONFIG_PATH;
- private static String ZK_CONFIG_NAME;
- private static String SOLR_LOCATION = "localhost:2181";
-
- static {
- DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("GMT"));
- Date date = new Date();
- SOLR_COLLECTION = DATE_FORMAT_SOLR_COLLECTION.format(date) +
"_QuerySolrIT";
- ZK_CONFIG_PATH = "src/test/resources/solr/testCollection/conf";
- ZK_CONFIG_NAME = "QuerySolrIT_config";
- }
-
- @BeforeAll
- public static void setup() throws IOException, SolrServerException {
- CloudSolrClient solrClient = createSolrClient();
- Path currentDir = Paths.get(ZK_CONFIG_PATH);
- ZkClientClusterStateProvider stateProvider = new
ZkClientClusterStateProvider(SOLR_LOCATION);
- stateProvider.uploadConfig(currentDir, ZK_CONFIG_NAME);
- solrClient.setDefaultCollection(SOLR_COLLECTION);
-
- if
(!solrClient.getZkStateReader().getClusterState().hasCollection(SOLR_COLLECTION))
{
- CollectionAdminRequest.Create createCollection =
CollectionAdminRequest.createCollection(SOLR_COLLECTION, ZK_CONFIG_NAME, 1, 1);
- createCollection.process(solrClient);
- } else {
- solrClient.deleteByQuery("*:*");
- }
-
- for (int i = 0; i < 10; i++) {
- SolrInputDocument doc = new SolrInputDocument();
- doc.addField("id", "doc" + i);
- Date date = new Date();
- doc.addField("created", DATE_FORMAT.format(date));
- doc.addField("string_single", "single" + i + ".1");
- doc.addField("string_multi", "multi" + i + ".1");
- doc.addField("string_multi", "multi" + i + ".2");
- doc.addField("integer_single", i);
- doc.addField("integer_multi", 1);
- doc.addField("integer_multi", 2);
- doc.addField("integer_multi", 3);
- doc.addField("double_single", 0.5 + i);
-
- solrClient.add(doc);
- }
- solrClient.commit();
- }
-
- public static CloudSolrClient createSolrClient() {
- CloudSolrClient solrClient = null;
-
- try {
- solrClient = new
CloudSolrClient.Builder(Collections.singletonList(SOLR_LOCATION),
Optional.empty()).build();
- solrClient.setDefaultCollection(SOLR_COLLECTION);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return solrClient;
- }
-
- @AfterAll
- public static void teardown() {
- try {
- CloudSolrClient solrClient = createSolrClient();
- CollectionAdminRequest.Delete deleteCollection =
CollectionAdminRequest.deleteCollection(SOLR_COLLECTION);
- deleteCollection.process(solrClient);
- solrClient.close();
- } catch (Exception e) {
- }
- }
-
- private TestRunner createRunnerWithSolrClient(SolrClient solrClient) {
- final TestableProcessor proc = new TestableProcessor(solrClient);
-
- TestRunner runner = TestRunners.newTestRunner(proc);
- runner.setProperty(SolrUtils.SOLR_TYPE,
SolrUtils.SOLR_TYPE_CLOUD.getValue());
- runner.setProperty(SolrUtils.SOLR_LOCATION, SOLR_LOCATION);
- runner.setProperty(SolrUtils.COLLECTION, SOLR_COLLECTION);
-
- return runner;
- }
-
- @Test
- public void testAllFacetCategories() throws IOException {
- SolrClient solrClient = createSolrClient();
- TestRunner runner = createRunnerWithSolrClient(solrClient);
-
- runner.setProperty("facet", "true");
- runner.setProperty("facet.field", "integer_multi");
- runner.setProperty("facet.interval", "integer_single");
- runner.setProperty("facet.interval.set.1", "[4,7]");
- runner.setProperty("facet.interval.set.2", "[5,7]");
- runner.setProperty("facet.range", "created");
- runner.setProperty("facet.range.start", "NOW/MINUTE");
- runner.setProperty("facet.range.end", "NOW/MINUTE+1MINUTE");
- runner.setProperty("facet.range.gap", "+20SECOND");
- runner.setProperty("facet.query.1", "*:*");
- runner.setProperty("facet.query.2", "integer_multi:2");
- runner.setProperty("facet.query.3", "integer_multi:3");
-
- runner.enqueue(new ByteArrayInputStream(new byte[0]));
- runner.run();
- runner.assertTransferCount(QuerySolr.FACETS, 1);
-
- JsonReader reader = new JsonReader(new InputStreamReader(new
ByteArrayInputStream(
-
runner.getContentAsByteArray(runner.getFlowFilesForRelationship(QuerySolr.FACETS).get(0)))));
- reader.beginObject();
- while (reader.hasNext()) {
- String name = reader.nextName();
- if (name.equals("facet_queries")) {
- assertEquals(30, returnCheckSumForArrayOfJsonObjects(reader));
- } else if (name.equals("facet_fields")) {
- reader.beginObject();
- assertEquals(reader.nextName(), "integer_multi");
- assertEquals(returnCheckSumForArrayOfJsonObjects(reader), 30);
- reader.endObject();
- } else if (name.equals("facet_ranges")) {
- reader.beginObject();
- assertEquals(reader.nextName(), "created");
- assertEquals(returnCheckSumForArrayOfJsonObjects(reader), 10);
- reader.endObject();
- } else if (name.equals("facet_intervals")) {
- reader.beginObject();
- assertEquals(reader.nextName(), "integer_single");
- assertEquals(returnCheckSumForArrayOfJsonObjects(reader), 7);
- reader.endObject();
- }
- }
- reader.endObject();
- reader.close();
- solrClient.close();
- }
-
- private int returnCheckSumForArrayOfJsonObjects(JsonReader reader) throws
IOException {
- int checkSum = 0;
- reader.beginArray();
- while (reader.hasNext()) {
- reader.beginObject();
- while (reader.hasNext()) {
- if (reader.nextName().equals("count")) {
- checkSum += reader.nextInt();
- } else {
- reader.skipValue();
- }
- }
- reader.endObject();
- }
- reader.endArray();
- return checkSum;
- }
-
- @Test
- public void testFacetTrueButNull() throws IOException {
- SolrClient solrClient = createSolrClient();
- TestRunner runner = createRunnerWithSolrClient(solrClient);
-
- runner.setProperty("facet", "true");
- runner.setProperty("stats", "true");
-
- runner.enqueue(new ByteArrayInputStream(new byte[0]));
- runner.run();
-
- runner.assertTransferCount(QuerySolr.RESULTS, 1);
- runner.assertTransferCount(QuerySolr.FACETS, 1);
- runner.assertTransferCount(QuerySolr.STATS, 1);
-
- // Check for empty nestet Objects in JSON
- JsonReader reader = new JsonReader(new InputStreamReader(new
ByteArrayInputStream(
-
runner.getContentAsByteArray(runner.getFlowFilesForRelationship(QuerySolr.FACETS).get(0)))));
- reader.beginObject();
- while (reader.hasNext()) {
- if (reader.nextName().equals("facet_queries")) {
- reader.beginArray();
- assertFalse(reader.hasNext());
- reader.endArray();
- } else {
- reader.beginObject();
- assertFalse(reader.hasNext());
- reader.endObject();
- }
- }
- reader.endObject();
-
- JsonReader reader_stats = new JsonReader(new InputStreamReader(new
ByteArrayInputStream(
-
runner.getContentAsByteArray(runner.getFlowFilesForRelationship(QuerySolr.STATS).get(0)))));
- reader_stats.beginObject();
- assertEquals(reader_stats.nextName(), "stats_fields");
- reader_stats.beginObject();
- assertFalse(reader_stats.hasNext());
- reader_stats.endObject();
- reader_stats.endObject();
-
- reader.close();
- reader_stats.close();
- solrClient.close();
- }
-
- @Test
- public void testStats() throws IOException {
- SolrClient solrClient = createSolrClient();
- TestRunner runner = createRunnerWithSolrClient(solrClient);
-
- runner.setProperty("stats", "true");
- runner.setProperty("stats.field", "integer_single");
-
- runner.enqueue(new ByteArrayInputStream(new byte[0]));
- runner.run();
-
- runner.assertTransferCount(QuerySolr.STATS, 1);
- JsonReader reader = new JsonReader(new InputStreamReader(new
ByteArrayInputStream(
-
runner.getContentAsByteArray(runner.getFlowFilesForRelationship(QuerySolr.STATS).get(0)))));
- reader.beginObject();
- assertEquals(reader.nextName(), "stats_fields");
- reader.beginObject();
- assertEquals(reader.nextName(), "integer_single");
- reader.beginObject();
- while (reader.hasNext()) {
- String name = reader.nextName();
- switch (name) {
- case "min": assertEquals(reader.nextString(), "0.0"); break;
- case "max": assertEquals(reader.nextString(), "9.0"); break;
- case "count": assertEquals(reader.nextInt(), 10); break;
- case "sum": assertEquals(reader.nextString(), "45.0"); break;
- default: reader.skipValue(); break;
- }
- }
- reader.endObject();
- reader.endObject();
- reader.endObject();
-
- reader.close();
- solrClient.close();
- }
-
- @Test
- public void testRelationshipRoutings() throws IOException {
- SolrClient solrClient = createSolrClient();
- TestRunner runner = createRunnerWithSolrClient(solrClient);
-
- runner.setProperty("facet", "true");
- runner.setProperty("stats", "true");
-
- // Set request handler for request failure
- runner.setProperty(QuerySolr.SOLR_PARAM_REQUEST_HANDLER,
"/nonexistentrequesthandler");
-
- // Processor has no input connection and fails
- runner.setNonLoopConnection(false);
- runner.run(1, false);
- runner.assertAllFlowFilesTransferred(QuerySolr.FAILURE, 1);
-
- MockFlowFile flowFile =
runner.getFlowFilesForRelationship(QuerySolr.FAILURE).get(0);
- flowFile.assertAttributeExists(QuerySolr.EXCEPTION);
- flowFile.assertAttributeExists(QuerySolr.EXCEPTION_MESSAGE);
- runner.clearTransferState();
-
- // Processor has an input connection and fails
- runner.setNonLoopConnection(true);
- runner.enqueue(new byte[0]);
- runner.run(1, false);
- runner.assertAllFlowFilesTransferred(QuerySolr.FAILURE, 1);
-
- flowFile =
runner.getFlowFilesForRelationship(QuerySolr.FAILURE).get(0);
- flowFile.assertAttributeExists(QuerySolr.EXCEPTION);
- flowFile.assertAttributeExists(QuerySolr.EXCEPTION_MESSAGE);
- runner.clearTransferState();
-
- // Set request handler for successful request
- runner.setProperty(QuerySolr.SOLR_PARAM_REQUEST_HANDLER, "/select");
-
- // Processor has no input connection and succeeds
- runner.setNonLoopConnection(false);
- runner.run(1, false);
- runner.assertTransferCount(QuerySolr.RESULTS, 1);
- runner.assertTransferCount(QuerySolr.FACETS, 1);
- runner.assertTransferCount(QuerySolr.STATS, 1);
-
- flowFile =
runner.getFlowFilesForRelationship(QuerySolr.RESULTS).get(0);
- flowFile.assertAttributeExists(QuerySolr.ATTRIBUTE_SOLR_CONNECT);
- flowFile.assertAttributeExists(QuerySolr.ATTRIBUTE_SOLR_STATUS);
- flowFile.assertAttributeExists(QuerySolr.ATTRIBUTE_CURSOR_MARK);
- flowFile.assertAttributeExists(QuerySolr.ATTRIBUTE_QUERY_TIME);
- runner.clearTransferState();
-
- // Processor has an input connection and succeeds
- runner.setNonLoopConnection(true);
- runner.enqueue(new byte[0]);
- runner.run(1, true);
- runner.assertTransferCount(QuerySolr.RESULTS, 1);
- runner.assertTransferCount(QuerySolr.FACETS, 1);
- runner.assertTransferCount(QuerySolr.STATS, 1);
- runner.assertTransferCount(QuerySolr.ORIGINAL, 1);
-
runner.assertAllFlowFilesContainAttribute(QuerySolr.ATTRIBUTE_SOLR_CONNECT);
-
- flowFile =
runner.getFlowFilesForRelationship(QuerySolr.RESULTS).get(0);
- flowFile.assertAttributeExists(QuerySolr.ATTRIBUTE_SOLR_CONNECT);
- flowFile.assertAttributeExists(QuerySolr.ATTRIBUTE_SOLR_STATUS);
- flowFile.assertAttributeExists(QuerySolr.ATTRIBUTE_CURSOR_MARK);
- flowFile.assertAttributeExists(QuerySolr.ATTRIBUTE_QUERY_TIME);
- flowFile = runner.getFlowFilesForRelationship(QuerySolr.FACETS).get(0);
- flowFile.assertAttributeExists(QuerySolr.ATTRIBUTE_SOLR_CONNECT);
- flowFile.assertAttributeExists(QuerySolr.ATTRIBUTE_SOLR_STATUS);
- flowFile.assertAttributeExists(QuerySolr.ATTRIBUTE_CURSOR_MARK);
- flowFile.assertAttributeExists(QuerySolr.ATTRIBUTE_QUERY_TIME);
- flowFile = runner.getFlowFilesForRelationship(QuerySolr.STATS).get(0);
- flowFile.assertAttributeExists(QuerySolr.ATTRIBUTE_SOLR_CONNECT);
- flowFile.assertAttributeExists(QuerySolr.ATTRIBUTE_SOLR_STATUS);
- flowFile.assertAttributeExists(QuerySolr.ATTRIBUTE_CURSOR_MARK);
- flowFile.assertAttributeExists(QuerySolr.ATTRIBUTE_QUERY_TIME);
- runner.clearTransferState();
-
- solrClient.close();
- }
-
- @Test
- public void testExpressionLanguageForProperties() throws IOException {
- SolrClient solrClient = createSolrClient();
- TestRunner runner = createRunnerWithSolrClient(solrClient);
-
- runner.setProperty(SolrUtils.SOLR_TYPE,
SolrUtils.SOLR_TYPE_CLOUD.getValue());
- runner.setProperty(QuerySolr.SOLR_PARAM_QUERY, "${query}");
- runner.setProperty(QuerySolr.SOLR_PARAM_REQUEST_HANDLER, "${handler}");
- runner.setProperty(QuerySolr.SOLR_PARAM_FIELD_LIST, "${fields}");
- runner.setProperty(QuerySolr.SOLR_PARAM_SORT, "${sort}");
- runner.setProperty(QuerySolr.SOLR_PARAM_START, "${start}");
- runner.setProperty(QuerySolr.SOLR_PARAM_ROWS, "${rows}");
-
- runner.enqueue(new byte[0], new HashMap<String,String>(){{
- put("query", "id:(doc0 OR doc1 OR doc2 OR doc3)");
- put("handler", "/select");
- put("fields", "id");
- put("sort", "id desc");
- put("start", "1");
- put("rows", "2");
- }});
- runner.run();
- runner.assertTransferCount(QuerySolr.RESULTS, 1);
-
- String expectedXml = "<docs><doc boost=\"1.0\"><field
name=\"id\">doc2</field></doc><doc boost=\"1.0\"><field
name=\"id\">doc1</field></doc></docs>";
- assertThat(expectedXml, CompareMatcher.isIdenticalTo(new
String(runner.getContentAsByteArray(runner.getFlowFilesForRelationship(QuerySolr.RESULTS).get(0)))));
-
- solrClient.close();
- }
-
- @Test
- public void testSingleFilterQuery() throws IOException {
- SolrClient solrClient = createSolrClient();
- TestRunner runner = createRunnerWithSolrClient(solrClient);
- runner.setProperty(QuerySolr.SOLR_PARAM_SORT, "id asc");
- runner.setProperty(QuerySolr.SOLR_PARAM_FIELD_LIST, "id");
-
- runner.setProperty("fq", "id:(doc2 OR doc3)");
-
- runner.enqueue(new byte[0]);
- runner.run();
- runner.assertTransferCount(QuerySolr.RESULTS, 1);
-
- String expectedXml = "<docs><doc boost=\"1.0\"><field
name=\"id\">doc2</field></doc><doc boost=\"1.0\"><field
name=\"id\">doc3</field></doc></docs>";
- assertThat(expectedXml, CompareMatcher.isIdenticalTo(new
String(runner.getContentAsByteArray(runner.getFlowFilesForRelationship(QuerySolr.RESULTS).get(0)))));
-
- solrClient.close();
- }
-
-
- @Test
- public void testMultipleFilterQueries() throws IOException {
- SolrClient solrClient = createSolrClient();
- TestRunner runner = createRunnerWithSolrClient(solrClient);
- runner.setProperty(QuerySolr.SOLR_PARAM_SORT, "id asc");
- runner.setProperty(QuerySolr.SOLR_PARAM_FIELD_LIST, "id");
-
- runner.setProperty("fq.1", "id:(doc0 OR doc1 OR doc2 OR doc3)");
- runner.setProperty("fq.2", "id:(doc1 OR doc2 OR doc3 OR doc4)");
- runner.setProperty("fq.3", "id:(doc2 OR doc3 OR doc4 OR doc5)");
-
- runner.enqueue(new byte[0]);
- runner.run();
- runner.assertTransferCount(QuerySolr.RESULTS, 1);
-
- String expectedXml = "<docs><doc boost=\"1.0\"><field
name=\"id\">doc2</field></doc><doc boost=\"1.0\"><field
name=\"id\">doc3</field></doc></docs>";
- assertThat(expectedXml, CompareMatcher.isIdenticalTo(new
String(runner.getContentAsByteArray(runner.getFlowFilesForRelationship(QuerySolr.RESULTS).get(0)))));
-
- solrClient.close();
- }
-
- @Test
- public void testStandardResponse() throws IOException {
- SolrClient solrClient = createSolrClient();
- TestRunner runner = createRunnerWithSolrClient(solrClient);
-
- runner.setProperty(QuerySolr.SOLR_PARAM_QUERY, "id:(doc0 OR doc1)");
- runner.setProperty(QuerySolr.SOLR_PARAM_FIELD_LIST, "id");
- runner.setProperty(QuerySolr.SOLR_PARAM_SORT, "id desc");
-
- runner.setNonLoopConnection(false);
- runner.run();
- runner.assertAllFlowFilesTransferred(QuerySolr.RESULTS, 1);
-
- MockFlowFile flowFile =
runner.getFlowFilesForRelationship(QuerySolr.RESULTS).get(0);
- flowFile.assertAttributeExists(QuerySolr.ATTRIBUTE_CURSOR_MARK);
- flowFile.assertAttributeExists(QuerySolr.ATTRIBUTE_SOLR_STATUS);
- flowFile.assertAttributeExists(QuerySolr.ATTRIBUTE_QUERY_TIME);
-
- String expectedXml = "<docs><doc boost=\"1.0\"><field
name=\"id\">doc1</field></doc><doc boost=\"1.0\"><field
name=\"id\">doc0</field></doc></docs>";
- assertThat(expectedXml, CompareMatcher.isIdenticalTo(new
String(runner.getContentAsByteArray(flowFile))));
-
- solrClient.close();
- }
-
- @Test
- public void testPreserveOriginalContent() throws IOException {
- SolrClient solrClient = createSolrClient();
- TestRunner runner = createRunnerWithSolrClient(solrClient);
-
- runner.setProperty(QuerySolr.SOLR_PARAM_QUERY, "id:doc0");
- runner.setProperty(QuerySolr.SOLR_PARAM_FIELD_LIST, "id");
-
- String content = "test content 123";
-
- runner.enqueue(content);
- runner.run();
- runner.assertTransferCount(QuerySolr.RESULTS, 1);
- runner.assertTransferCount(QuerySolr.ORIGINAL, 1);
-
- String expectedXml = "<docs><doc boost=\"1.0\"><field
name=\"id\">doc0</field></doc></docs>";
- assertThat(expectedXml, CompareMatcher.isIdenticalTo(new
String(runner.getContentAsByteArray(runner.getFlowFilesForRelationship(QuerySolr.RESULTS).get(0)))));
- assertEquals(content, new
String(runner.getContentAsByteArray(runner.getFlowFilesForRelationship(QuerySolr.ORIGINAL).get(0))));
-
- solrClient.close();
- }
-
- @Test
- public void testRetrievalOfFullResults() throws IOException {
- SolrClient solrClient = createSolrClient();
- TestRunner runner = createRunnerWithSolrClient(solrClient);
-
- runner.setProperty(QuerySolr.SOLR_PARAM_FIELD_LIST, "id");
- runner.setProperty(QuerySolr.SOLR_PARAM_SORT, "id asc");
- runner.setProperty(QuerySolr.SOLR_PARAM_ROWS, "2");
- runner.setProperty(QuerySolr.AMOUNT_DOCUMENTS_TO_RETURN,
QuerySolr.RETURN_ALL_RESULTS);
-
- runner.enqueue(new byte[0]);
- runner.run();
- runner.assertTransferCount(QuerySolr.RESULTS, 5);
- runner.assertTransferCount(QuerySolr.ORIGINAL, 1);
- runner.assertTransferCount(QuerySolr.STATS, 0);
- runner.assertTransferCount(QuerySolr.FACETS, 0);
-
- List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(QuerySolr.RESULTS);
- Integer documentCounter = 0;
- Integer startParam = 0;
-
- for (MockFlowFile flowFile : flowFiles) {
- Map<String,String> attributes = flowFile.getAttributes();
- assertEquals(attributes.get(QuerySolr.ATTRIBUTE_SOLR_START),
startParam.toString());
- startParam += 2;
-
- StringBuffer expectedXml = new StringBuffer()
- .append("<docs><doc boost=\"1.0\"><field name=\"id\">doc")
- .append(documentCounter++)
- .append("</field></doc><doc boost=\"1.0\"><field
name=\"id\">doc")
- .append(documentCounter++)
- .append("</field></doc></docs>");
- assertThat(expectedXml.toString(),
CompareMatcher.isIdenticalTo(new
String(runner.getContentAsByteArray(flowFile))));
- }
-
- solrClient.close();
- }
-
- @Test
- public void testRetrievalOfFullResults2() throws IOException {
- SolrClient solrClient = createSolrClient();
- TestRunner runner = createRunnerWithSolrClient(solrClient);
-
- runner.setProperty(QuerySolr.SOLR_PARAM_FIELD_LIST, "id");
- runner.setProperty(QuerySolr.SOLR_PARAM_SORT, "id asc");
- runner.setProperty(QuerySolr.SOLR_PARAM_ROWS, "3");
- runner.setProperty(QuerySolr.AMOUNT_DOCUMENTS_TO_RETURN,
QuerySolr.RETURN_ALL_RESULTS);
- runner.setProperty("facet", "true");
- runner.setProperty("stats", "true");
-
- runner.enqueue(new byte[0]);
- runner.run();
-
- runner.assertTransferCount(QuerySolr.RESULTS, 4);
- runner.assertTransferCount(QuerySolr.ORIGINAL, 1);
- runner.assertTransferCount(QuerySolr.FACETS, 1);
- runner.assertTransferCount(QuerySolr.STATS, 1);
-
- solrClient.close();
- }
-
- @Test
- public void testRetrievalOfFullResults3() throws IOException {
- SolrClient solrClient = createSolrClient();
- TestRunner runner = createRunnerWithSolrClient(solrClient);
-
- runner.setProperty(QuerySolr.SOLR_PARAM_FIELD_LIST, "id");
- runner.setProperty(QuerySolr.SOLR_PARAM_SORT, "id asc");
- runner.setProperty(QuerySolr.SOLR_PARAM_ROWS, "3");
- runner.setProperty(QuerySolr.AMOUNT_DOCUMENTS_TO_RETURN,
QuerySolr.RETURN_ALL_RESULTS);
- runner.setProperty("facet", "true");
- runner.setProperty("stats", "true");
-
- runner.setNonLoopConnection(false);
- runner.run();
-
- runner.assertTransferCount(QuerySolr.RESULTS, 4);
- runner.assertTransferCount(QuerySolr.ORIGINAL, 0);
- runner.assertTransferCount(QuerySolr.FACETS, 1);
- runner.assertTransferCount(QuerySolr.STATS, 1);
-
- solrClient.close();
- }
-
-
- @Test
- public void testRecordResponse() throws IOException,
InitializationException {
- SolrClient solrClient = createSolrClient();
- TestRunner runner = createRunnerWithSolrClient(solrClient);
-
- runner.setProperty(QuerySolr.RETURN_TYPE,
QuerySolr.MODE_REC.getValue());
- runner.setProperty(QuerySolr.SOLR_PARAM_FIELD_LIST,
"id,created,integer_single");
- runner.setProperty(QuerySolr.SOLR_PARAM_ROWS, "10");
-
- final String outputSchemaText = new
String(Files.readAllBytes(Paths.get("src/test/resources/test-schema.avsc")));
-
- final JsonRecordSetWriter jsonWriter = new JsonRecordSetWriter();
- runner.addControllerService("writer", jsonWriter);
- runner.setProperty(jsonWriter,
SchemaAccessUtils.SCHEMA_ACCESS_STRATEGY,
SchemaAccessUtils.SCHEMA_TEXT_PROPERTY);
- runner.setProperty(jsonWriter, SchemaAccessUtils.SCHEMA_TEXT,
outputSchemaText);
- runner.setProperty(jsonWriter, "Pretty Print JSON", "true");
- runner.setProperty(jsonWriter, "Schema Write Strategy",
"full-schema-attribute");
- runner.enableControllerService(jsonWriter);
- runner.setProperty(SolrUtils.RECORD_WRITER, "writer");
-
- runner.setNonLoopConnection(false);
-
- runner.run(1);
- runner.assertQueueEmpty();
- runner.assertTransferCount(QuerySolr.RESULTS, 1);
-
- JsonReader reader = new JsonReader(new InputStreamReader(new
ByteArrayInputStream(
-
runner.getContentAsByteArray(runner.getFlowFilesForRelationship(QuerySolr.RESULTS).get(0)))));
- reader.beginArray();
- int controlScore = 0;
- while (reader.hasNext()) {
- reader.beginObject();
- while (reader.hasNext()) {
- if (reader.nextName().equals("integer_single")) {
- controlScore += reader.nextInt();
- } else {
- reader.skipValue();
- }
- }
- reader.endObject();
- }
- reader.close();
- solrClient.close();
-
- assertEquals(controlScore, 45);
- }
-
- @Test
- public void testSslContextService() throws IOException,
InitializationException {
- final QuerySolr proc = Mockito.mock(QuerySolr.class);
- TestRunner runner = TestRunners.newTestRunner(proc);
- runner.setProperty(SolrUtils.SOLR_TYPE,
SolrUtils.SOLR_TYPE_CLOUD.getValue());
- runner.setProperty(SolrUtils.SOLR_LOCATION, SOLR_LOCATION);
- runner.setProperty(SolrUtils.COLLECTION, SOLR_COLLECTION);
-
- final SSLContextService sslContextService =
Mockito.mock(SSLContextService.class);
-
Mockito.when(sslContextService.getIdentifier()).thenReturn("ssl-context");
- runner.addControllerService("ssl-context", sslContextService);
- runner.enableControllerService(sslContextService);
-
- runner.setProperty(SolrUtils.SSL_CONTEXT_SERVICE, "ssl-context");
- proc.onScheduled(runner.getProcessContext());
- Mockito.verify(proc,
Mockito.times(1)).createSolrClient(Mockito.any(ProcessContext.class),
Mockito.eq(SOLR_LOCATION));
-
- }
-
- // Override createSolrClient and return the passed in SolrClient
- private class TestableProcessor extends QuerySolr {
- private SolrClient solrClient;
-
- public TestableProcessor(SolrClient solrClient) {
- this.solrClient = solrClient;
- }
- @Override
- protected SolrClient createSolrClient(ProcessContext context, String
solrLocation) {
- return solrClient;
- }
- }
-}
diff --git
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/HandleHttpRequest.java
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/HandleHttpRequest.java
index 20c06f1305..2dd47c6bb4 100644
---
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/HandleHttpRequest.java
+++
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/HandleHttpRequest.java
@@ -598,7 +598,7 @@ public class HandleHttpRequest extends AbstractProcessor {
final long requestMaxSize =
context.getProperty(MULTIPART_REQUEST_MAX_SIZE).asDataSize(DataUnit.B).longValue();
final int readBufferSize =
context.getProperty(MULTIPART_READ_BUFFER_SIZE).asDataSize(DataUnit.B).intValue();
String tempDir = System.getProperty("java.io.tmpdir");
- request.setAttribute(Request.MULTIPART_CONFIG_ELEMENT, new
MultipartConfigElement(tempDir, requestMaxSize, requestMaxSize,
readBufferSize));
+ request.setAttribute(Request.__MULTIPART_CONFIG_ELEMENT, new
MultipartConfigElement(tempDir, requestMaxSize, requestMaxSize,
readBufferSize));
List<Part> parts = null;
try {
parts = Collections.unmodifiableList(new
ArrayList<>(request.getParts()));
diff --git
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/servlets/ListenHTTPServlet.java
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/servlets/ListenHTTPServlet.java
index eee9471f8f..6c6e4e4c7f 100644
---
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/servlets/ListenHTTPServlet.java
+++
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/servlets/ListenHTTPServlet.java
@@ -288,7 +288,7 @@ public class ListenHTTPServlet extends HttpServlet {
throws IOException, IllegalStateException, ServletException {
Set<FlowFile> flowFileSet = new HashSet<>();
String tempDir = System.getProperty("java.io.tmpdir");
- request.setAttribute(Request.MULTIPART_CONFIG_ELEMENT, new
MultipartConfigElement(tempDir, multipartRequestMaxSize,
multipartRequestMaxSize, multipartReadBufferSize));
+ request.setAttribute(Request.__MULTIPART_CONFIG_ELEMENT, new
MultipartConfigElement(tempDir, multipartRequestMaxSize,
multipartRequestMaxSize, multipartReadBufferSize));
int i = 0;
final Collection<Part> requestParts = request.getParts();
for (final Part part : requestParts) {
diff --git
a/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/pom.xml
b/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/pom.xml
index e6ffe470c0..c9e2e6d7ec 100644
---
a/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/pom.xml
+++
b/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/pom.xml
@@ -32,9 +32,19 @@
<artifactId>nifi-utils</artifactId>
<version>2.0.0-SNAPSHOT</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.nifi</groupId>
+ <artifactId>nifi-jetty-configuration</artifactId>
+ <version>2.0.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty.websocket</groupId>
+ <artifactId>websocket-jetty-server</artifactId>
+ <version>${jetty.version}</version>
+ </dependency>
<dependency>
<groupId>org.eclipse.jetty.websocket</groupId>
- <artifactId>websocket-server</artifactId>
+ <artifactId>websocket-jetty-client</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
diff --git
a/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/src/main/java/org/apache/nifi/websocket/jetty/AbstractJettyWebSocketService.java
b/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/src/main/java/org/apache/nifi/websocket/jetty/AbstractJettyWebSocketService.java
index abff7856cc..6d97673ba9 100644
---
a/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/src/main/java/org/apache/nifi/websocket/jetty/AbstractJettyWebSocketService.java
+++
b/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/src/main/java/org/apache/nifi/websocket/jetty/AbstractJettyWebSocketService.java
@@ -17,13 +17,8 @@
package org.apache.nifi.websocket.jetty;
import org.apache.nifi.components.PropertyDescriptor;
-import org.apache.nifi.controller.ConfigurationContext;
-import org.apache.nifi.processor.DataUnit;
import org.apache.nifi.processor.util.StandardValidators;
-import org.apache.nifi.ssl.SSLContextService;
import org.apache.nifi.websocket.AbstractWebSocketService;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.eclipse.jetty.websocket.api.WebSocketPolicy;
import java.util.ArrayList;
import java.util.List;
@@ -64,42 +59,4 @@ public abstract class AbstractJettyWebSocketService extends
AbstractWebSocketSer
descriptors.add(MAX_BINARY_MESSAGE_SIZE);
return descriptors;
}
-
-
- protected SslContextFactory createSslFactory(final SSLContextService
sslService, final boolean needClientAuth, final boolean wantClientAuth, final
String endpointIdentificationAlgorithm) {
- final SslContextFactory sslFactory = new SslContextFactory.Server();
-
- sslFactory.setNeedClientAuth(needClientAuth);
- sslFactory.setWantClientAuth(wantClientAuth);
-
- // Need to set SslContextFactory's endpointIdentificationAlgorithm.
- // For clients, hostname verification should be enabled.
- // For servers, hostname verification should be disabled.
- // Previous to Jetty 9.4.15.v20190215, this defaulted to null, and now
defaults to "HTTPS".
-
sslFactory.setEndpointIdentificationAlgorithm(endpointIdentificationAlgorithm);
-
- if (sslService.isKeyStoreConfigured()) {
- sslFactory.setKeyStorePath(sslService.getKeyStoreFile());
- sslFactory.setKeyStorePassword(sslService.getKeyStorePassword());
- sslFactory.setKeyStoreType(sslService.getKeyStoreType());
- }
-
- if (sslService.isTrustStoreConfigured()) {
- sslFactory.setTrustStorePath(sslService.getTrustStoreFile());
-
sslFactory.setTrustStorePassword(sslService.getTrustStorePassword());
- sslFactory.setTrustStoreType(sslService.getTrustStoreType());
- }
-
- return sslFactory;
- }
-
- protected void configurePolicy(final ConfigurationContext context, final
WebSocketPolicy policy) {
- final int inputBufferSize =
context.getProperty(INPUT_BUFFER_SIZE).asDataSize(DataUnit.B).intValue();
- final int maxTextMessageSize =
context.getProperty(MAX_TEXT_MESSAGE_SIZE).asDataSize(DataUnit.B).intValue();
- final int maxBinaryMessageSize =
context.getProperty(MAX_BINARY_MESSAGE_SIZE).asDataSize(DataUnit.B).intValue();
- policy.setInputBufferSize(inputBufferSize);
- policy.setMaxTextMessageSize(maxTextMessageSize);
- policy.setMaxBinaryMessageSize(maxBinaryMessageSize);
- }
-
}
diff --git
a/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/src/main/java/org/apache/nifi/websocket/jetty/JettyWebSocketClient.java
b/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/src/main/java/org/apache/nifi/websocket/jetty/JettyWebSocketClient.java
index 712b2c1ce6..4ac1371280 100644
---
a/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/src/main/java/org/apache/nifi/websocket/jetty/JettyWebSocketClient.java
+++
b/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/src/main/java/org/apache/nifi/websocket/jetty/JettyWebSocketClient.java
@@ -28,6 +28,7 @@ import org.apache.nifi.components.ValidationResult;
import org.apache.nifi.controller.ConfigurationContext;
import org.apache.nifi.expression.ExpressionLanguageScope;
import org.apache.nifi.logging.ComponentLog;
+import org.apache.nifi.processor.DataUnit;
import org.apache.nifi.processor.exception.ProcessException;
import org.apache.nifi.processor.util.StandardValidators;
import org.apache.nifi.ssl.SSLContextService;
@@ -37,13 +38,17 @@ import
org.apache.nifi.websocket.WebSocketConfigurationException;
import org.apache.nifi.websocket.WebSocketMessageRouter;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.client.HttpProxy;
+import org.eclipse.jetty.client.dynamic.HttpClientTransportDynamic;
import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.io.ClientConnector;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.eclipse.jetty.websocket.api.Session;
+import org.eclipse.jetty.websocket.api.WebSocketPolicy;
import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
import org.eclipse.jetty.websocket.client.WebSocketClient;
import org.apache.nifi.websocket.jetty.util.HeaderMapExtractor;
+import javax.net.ssl.SSLContext;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
@@ -223,25 +228,31 @@ public class JettyWebSocketClient extends
AbstractJettyWebSocketService implemen
@Override
public void startClient(final ConfigurationContext context) throws
Exception {
configurationContext = context;
- final SSLContextService sslService =
context.getProperty(SSL_CONTEXT).asControllerService(SSLContextService.class);
- SslContextFactory sslContextFactory = null;
- if (sslService != null) {
- sslContextFactory = createSslFactory(sslService, false, false,
null);
- }
- HttpClient httpClient = new HttpClient(sslContextFactory);
+ final HttpClient httpClient;
+ final SSLContextService sslContextService =
context.getProperty(SSL_CONTEXT).asControllerService(SSLContextService.class);
+ if (sslContextService == null) {
+ httpClient = new HttpClient();
+ } else {
+ final SslContextFactory.Client sslContextFactory = new
SslContextFactory.Client();
+ final SSLContext sslContext = sslContextService.createContext();
+ sslContextFactory.setSslContext(sslContext);
+ final ClientConnector clientConnector = new ClientConnector();
+ clientConnector.setSslContextFactory(sslContextFactory);
+ httpClient = new HttpClient(new
HttpClientTransportDynamic(clientConnector));
+ }
final String proxyHost =
context.getProperty(PROXY_HOST).evaluateAttributeExpressions().getValue();
final Integer proxyPort =
context.getProperty(PROXY_PORT).evaluateAttributeExpressions().asInteger();
if (proxyHost != null && proxyPort != null) {
HttpProxy httpProxy = new HttpProxy(proxyHost, proxyPort);
- httpClient.getProxyConfiguration().getProxies().add(httpProxy);
+ httpClient.getProxyConfiguration().addProxy(httpProxy);
}
client = new WebSocketClient(httpClient);
- configurePolicy(context, client.getPolicy());
+ configurePolicy(context, client);
final String userName =
context.getProperty(USER_NAME).evaluateAttributeExpressions().getValue();
final String userPassword =
context.getProperty(USER_PASSWORD).evaluateAttributeExpressions().getValue();
final String customAuth =
context.getProperty(CUSTOM_AUTH).evaluateAttributeExpressions().getValue();
@@ -433,4 +444,13 @@ public class JettyWebSocketClient extends
AbstractJettyWebSocketService implemen
public String getTargetUri() {
return webSocketUri.toString();
}
+
+ private void configurePolicy(final ConfigurationContext context, final
WebSocketPolicy policy) {
+ final int inputBufferSize =
context.getProperty(INPUT_BUFFER_SIZE).asDataSize(DataUnit.B).intValue();
+ final int maxTextMessageSize =
context.getProperty(MAX_TEXT_MESSAGE_SIZE).asDataSize(DataUnit.B).intValue();
+ final int maxBinaryMessageSize =
context.getProperty(MAX_BINARY_MESSAGE_SIZE).asDataSize(DataUnit.B).intValue();
+ policy.setInputBufferSize(inputBufferSize);
+ policy.setMaxTextMessageSize(maxTextMessageSize);
+ policy.setMaxBinaryMessageSize(maxBinaryMessageSize);
+ }
}
diff --git
a/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/src/main/java/org/apache/nifi/websocket/jetty/JettyWebSocketServer.java
b/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/src/main/java/org/apache/nifi/websocket/jetty/JettyWebSocketServer.java
index 5361209cf3..116eb2536c 100644
---
a/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/src/main/java/org/apache/nifi/websocket/jetty/JettyWebSocketServer.java
+++
b/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/src/main/java/org/apache/nifi/websocket/jetty/JettyWebSocketServer.java
@@ -29,6 +29,8 @@ import
org.apache.nifi.components.resource.ResourceCardinality;
import org.apache.nifi.components.resource.ResourceType;
import org.apache.nifi.controller.ConfigurationContext;
import org.apache.nifi.expression.ExpressionLanguageScope;
+import
org.apache.nifi.jetty.configuration.connector.StandardServerConnectorFactory;
+import org.apache.nifi.processor.DataUnit;
import org.apache.nifi.processor.util.StandardValidators;
import org.apache.nifi.ssl.SSLContextService;
import org.apache.nifi.websocket.WebSocketConfigurationException;
@@ -41,25 +43,22 @@ import org.eclipse.jetty.security.HashLoginService;
import org.eclipse.jetty.security.LoginService;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Handler;
-import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.server.HttpConnectionFactory;
-import org.eclipse.jetty.server.SecureRequestCustomizer;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.server.SslConnectionFactory;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.security.Constraint;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.eclipse.jetty.websocket.api.Session;
-import org.eclipse.jetty.websocket.api.WebSocketPolicy;
-import org.eclipse.jetty.websocket.servlet.ServletUpgradeRequest;
-import org.eclipse.jetty.websocket.servlet.ServletUpgradeResponse;
-import org.eclipse.jetty.websocket.servlet.WebSocketCreator;
-import org.eclipse.jetty.websocket.servlet.WebSocketServlet;
-import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
-
+import org.eclipse.jetty.websocket.server.JettyServerUpgradeRequest;
+import org.eclipse.jetty.websocket.server.JettyServerUpgradeResponse;
+import org.eclipse.jetty.websocket.server.JettyWebSocketCreator;
+import org.eclipse.jetty.websocket.server.JettyWebSocketServlet;
+import org.eclipse.jetty.websocket.server.JettyWebSocketServletFactory;
+import
org.eclipse.jetty.websocket.server.config.JettyWebSocketServletContainerInitializer;
+
+import javax.net.ssl.SSLContext;
+import java.net.InetSocketAddress;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
@@ -166,8 +165,7 @@ public class JettyWebSocketServer extends
AbstractJettyWebSocketService implemen
private static final List<PropertyDescriptor> properties;
static {
- final List<PropertyDescriptor> props = new ArrayList<>();
- props.addAll(getAbstractPropertyDescriptors());
+ final List<PropertyDescriptor> props = new
ArrayList<>(getAbstractPropertyDescriptors());
props.add(LISTEN_PORT);
props.add(SSL_CONTEXT);
props.add(CLIENT_AUTH);
@@ -177,14 +175,11 @@ public class JettyWebSocketServer extends
AbstractJettyWebSocketService implemen
props.add(LOGIN_SERVICE);
props.add(USERS_PROPERTIES_FILE);
-
properties = Collections.unmodifiableList(props);
}
- private WebSocketPolicy configuredPolicy;
private Server server;
private Integer listenPort;
- private ServletHandler servletHandler;
@Override
protected List<PropertyDescriptor> getSupportedPropertyDescriptors() {
@@ -198,7 +193,7 @@ public class JettyWebSocketServer extends
AbstractJettyWebSocketService implemen
final List<ValidationResult> results = new ArrayList<>();
if (validationContext.getProperty(BASIC_AUTH).asBoolean()) {
final String loginServiceValue =
validationContext.getProperty(LOGIN_SERVICE).getValue();
- if (LOGIN_SERVICE_HASH.equals(loginServiceValue)) {
+ if (LOGIN_SERVICE_HASH.getValue().equals(loginServiceValue)) {
if
(!validationContext.getProperty(USERS_PROPERTIES_FILE).isSet()) {
results.add(new
ValidationResult.Builder().subject(USERS_PROPERTIES_FILE.getDisplayName())
.explanation("it is required by
HashLoginService").valid(false).build());
@@ -209,16 +204,28 @@ public class JettyWebSocketServer extends
AbstractJettyWebSocketService implemen
return results;
}
- public static class JettyWebSocketServlet extends WebSocketServlet
implements WebSocketCreator {
+ public static class StandardJettyWebSocketServlet extends
JettyWebSocketServlet implements JettyWebSocketCreator {
+ private final ConfigurationContext context;
+
+ public StandardJettyWebSocketServlet(final ConfigurationContext
context) {
+ this.context = context;
+ }
+
@Override
- public void configure(WebSocketServletFactory webSocketServletFactory)
{
+ public void configure(final JettyWebSocketServletFactory
webSocketServletFactory) {
+ final int inputBufferSize =
context.getProperty(INPUT_BUFFER_SIZE).asDataSize(DataUnit.B).intValue();
+ final int maxTextMessageSize =
context.getProperty(MAX_TEXT_MESSAGE_SIZE).asDataSize(DataUnit.B).intValue();
+ final int maxBinaryMessageSize =
context.getProperty(MAX_BINARY_MESSAGE_SIZE).asDataSize(DataUnit.B).intValue();
+ webSocketServletFactory.setInputBufferSize(inputBufferSize);
+ webSocketServletFactory.setMaxTextMessageSize(maxTextMessageSize);
+
webSocketServletFactory.setMaxBinaryMessageSize(maxBinaryMessageSize);
webSocketServletFactory.setCreator(this);
}
@Override
- public Object createWebSocket(ServletUpgradeRequest
servletUpgradeRequest, ServletUpgradeResponse servletUpgradeResponse) {
+ public Object createWebSocket(JettyServerUpgradeRequest
servletUpgradeRequest, JettyServerUpgradeResponse servletUpgradeResponse) {
final URI requestURI = servletUpgradeRequest.getRequestURI();
- final int port = servletUpgradeRequest.getLocalPort();
+ final int port = ((InetSocketAddress)
servletUpgradeRequest.getLocalSocketAddress()).getPort();
final JettyWebSocketServer service =
portToControllerService.get(port);
if (service == null) {
@@ -233,33 +240,18 @@ public class JettyWebSocketServer extends
AbstractJettyWebSocketService implemen
throw new IllegalStateException("Failed to get router due to:
" + e, e);
}
- final RoutingWebSocketListener listener = new
RoutingWebSocketListener(router) {
- @Override
- public void onWebSocketConnect(Session session) {
- final WebSocketPolicy currentPolicy = session.getPolicy();
-
currentPolicy.setInputBufferSize(service.configuredPolicy.getInputBufferSize());
-
currentPolicy.setMaxTextMessageSize(service.configuredPolicy.getMaxTextMessageSize());
-
currentPolicy.setMaxBinaryMessageSize(service.configuredPolicy.getMaxBinaryMessageSize());
- super.onWebSocketConnect(session);
- }
- };
-
- return listener;
+ return new RoutingWebSocketListener(router);
}
}
@OnEnabled
@Override
public void startServer(final ConfigurationContext context) throws
Exception {
-
if (server != null && server.isRunning()) {
- getLogger().info("A WebSocket server is already running. {}", new
Object[]{server});
+ getLogger().info("Jetty WebSocket Server running {}", server);
return;
}
- configuredPolicy = WebSocketPolicy.newServerPolicy();
- configurePolicy(context, configuredPolicy);
-
server = new Server();
final ContextHandlerCollection handlerCollection = new
ContextHandlerCollection();
@@ -292,7 +284,7 @@ public class JettyWebSocketServer extends
AbstractJettyWebSocketService implemen
final LoginService loginService;
final String loginServiceValue =
context.getProperty(LOGIN_SERVICE).getValue();
- if (LOGIN_SERVICE_HASH.equals(loginServiceValue)) {
+ if (LOGIN_SERVICE_HASH.getValue().equals(loginServiceValue)) {
final String usersFilePath =
context.getProperty(USERS_PROPERTIES_FILE).evaluateAttributeExpressions().getValue();
loginService = new HashLoginService("HashLoginService",
usersFilePath);
} else {
@@ -303,23 +295,22 @@ public class JettyWebSocketServer extends
AbstractJettyWebSocketService implemen
securityHandler.setLoginService(loginService);
}
- servletHandler = new ServletHandler();
+ ServletHandler servletHandler = new ServletHandler();
+ JettyWebSocketServletContainerInitializer.configure(contextHandler,
null);
contextHandler.insertHandler(servletHandler);
handlerCollection.setHandlers(new Handler[]{contextHandler});
server.setHandler(handlerCollection);
-
listenPort =
context.getProperty(LISTEN_PORT).evaluateAttributeExpressions().asInteger();
- final SslContextFactory sslContextFactory = createSslFactory(context);
-
- final ServerConnector serverConnector =
createConnector(sslContextFactory, listenPort);
+ final ServerConnector serverConnector = getServerConnector(context);
server.setConnectors(new Connector[] {serverConnector});
- servletHandler.addServletWithMapping(JettyWebSocketServlet.class,
"/*");
+ final StandardJettyWebSocketServlet webSocketServlet = new
StandardJettyWebSocketServlet(context);
+ servletHandler.addServletWithMapping(new
ServletHolder(webSocketServlet), "/*");
- getLogger().info("Starting JettyWebSocketServer on port {}.", new
Object[]{listenPort});
+ getLogger().info("Starting Jetty WebSocket Server on Port {}",
listenPort);
server.start();
listenPort = serverConnector.getLocalPort();
@@ -330,42 +321,28 @@ public class JettyWebSocketServer extends
AbstractJettyWebSocketService implemen
return listenPort;
}
- private ServerConnector createConnector(final SslContextFactory
sslContextFactory, final Integer listenPort) {
-
+ private ServerConnector getServerConnector(final ConfigurationContext
context) {
+ final StandardServerConnectorFactory serverConnectorFactory = new
StandardServerConnectorFactory(server, listenPort);
final ServerConnector serverConnector;
- if (sslContextFactory == null) {
- serverConnector = new ServerConnector(server);
- } else {
- final HttpConfiguration httpsConfiguration = new
HttpConfiguration();
- httpsConfiguration.setSecureScheme("https");
- httpsConfiguration.addCustomizer(new SecureRequestCustomizer());
- serverConnector = new ServerConnector(server,
- new SslConnectionFactory(sslContextFactory, "http/1.1"),
- new HttpConnectionFactory(httpsConfiguration));
- }
- serverConnector.setPort(listenPort);
- return serverConnector;
- }
- private SslContextFactory createSslFactory(final ConfigurationContext
context) {
- final SSLContextService sslService =
context.getProperty(SSL_CONTEXT).asControllerService(SSLContextService.class);
-
- final String clientAuthValue =
context.getProperty(CLIENT_AUTH).getValue();
- final boolean need;
- final boolean want;
- if (CLIENT_NEED.equals(clientAuthValue)) {
- need = true;
- want = false;
- } else if (CLIENT_WANT.equals(clientAuthValue)) {
- need = false;
- want = true;
+ final SSLContextService sslContextService =
context.getProperty(SSL_CONTEXT).asControllerService(SSLContextService.class);
+ if (sslContextService == null) {
+ serverConnector = serverConnectorFactory.getServerConnector();
} else {
- need = false;
- want = false;
+ final SSLContext sslContext = sslContextService.createContext();
+ serverConnectorFactory.setSslContext(sslContext);
+
+ final String clientAuthValue =
context.getProperty(CLIENT_AUTH).getValue();
+ if (CLIENT_NEED.getValue().equals(clientAuthValue)) {
+ serverConnectorFactory.setNeedClientAuth(true);
+ } else if (CLIENT_WANT.getValue().equals(clientAuthValue)) {
+ serverConnectorFactory.setWantClientAuth(true);
+ }
+
+ serverConnector = serverConnectorFactory.getServerConnector();
}
- final SslContextFactory sslFactory = (sslService == null) ? null :
createSslFactory(sslService, need, want, null);
- return sslFactory;
+ return serverConnector;
}
@OnDisabled
@@ -376,12 +353,11 @@ public class JettyWebSocketServer extends
AbstractJettyWebSocketService implemen
return;
}
- getLogger().info("Stopping JettyWebSocketServer.");
+ getLogger().info("Stopping Jetty WebSocket Server");
server.stop();
if (portToControllerService.containsKey(listenPort)
&&
this.getIdentifier().equals(portToControllerService.get(listenPort).getIdentifier()))
{
portToControllerService.remove(listenPort);
}
}
-
}
diff --git
a/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/src/main/java/org/apache/nifi/websocket/jetty/JettyWebSocketSession.java
b/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/src/main/java/org/apache/nifi/websocket/jetty/JettyWebSocketSession.java
index d1da779f21..74bc9dd986 100644
---
a/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/src/main/java/org/apache/nifi/websocket/jetty/JettyWebSocketSession.java
+++
b/nifi-nar-bundles/nifi-websocket-bundle/nifi-websocket-services-jetty/src/main/java/org/apache/nifi/websocket/jetty/JettyWebSocketSession.java
@@ -50,18 +50,18 @@ public class JettyWebSocketSession extends
AbstractWebSocketSession {
}
@Override
- public void close(final String reason) throws IOException {
+ public void close(final String reason) {
session.close(StatusCode.NORMAL, reason);
}
@Override
public InetSocketAddress getRemoteAddress() {
- return session.getRemoteAddress();
+ return (InetSocketAddress) session.getRemoteAddress();
}
@Override
public InetSocketAddress getLocalAddress() {
- return session.getLocalAddress();
+ return (InetSocketAddress) session.getLocalAddress();
}
@Override
diff --git
a/nifi-registry/nifi-registry-core/nifi-registry-jetty/src/main/java/org/apache/nifi/registry/jetty/JettyServer.java
b/nifi-registry/nifi-registry-core/nifi-registry-jetty/src/main/java/org/apache/nifi/registry/jetty/JettyServer.java
index 8b582a8daa..c625dddbfb 100644
---
a/nifi-registry/nifi-registry-core/nifi-registry-jetty/src/main/java/org/apache/nifi/registry/jetty/JettyServer.java
+++
b/nifi-registry/nifi-registry-core/nifi-registry-jetty/src/main/java/org/apache/nifi/registry/jetty/JettyServer.java
@@ -21,14 +21,11 @@ import
org.apache.nifi.jetty.configuration.connector.ServerConnectorFactory;
import
org.apache.nifi.registry.jetty.connector.ApplicationServerConnectorFactory;
import org.apache.nifi.registry.jetty.handler.HandlerProvider;
import org.apache.nifi.registry.properties.NiFiRegistryProperties;
-import org.eclipse.jetty.annotations.AnnotationConfiguration;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.SslConnectionFactory;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
-import org.eclipse.jetty.webapp.Configuration;
-import org.eclipse.jetty.webapp.JettyWebXmlConfiguration;
import org.eclipse.jetty.webapp.WebAppContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -75,10 +72,6 @@ public class JettyServer {
this.properties = properties;
this.server = new Server(threadPool);
- // enable the annotation based configuration to ensure the jsp
container is initialized properly
- final Configuration.ClassList classlist =
Configuration.ClassList.setServerDefault(server);
- classlist.addBefore(JettyWebXmlConfiguration.class.getName(),
AnnotationConfiguration.class.getName());
-
try {
configureConnectors();
final Handler handler = handlerProvider.getHandler(properties);
diff --git
a/nifi-registry/nifi-registry-core/nifi-registry-jetty/src/main/resources/org/apache/nifi-registry/web/webdefault.xml
b/nifi-registry/nifi-registry-core/nifi-registry-jetty/src/main/resources/org/apache/nifi-registry/web/webdefault.xml
index f686689977..eddd34ed7c 100644
---
a/nifi-registry/nifi-registry-core/nifi-registry-jetty/src/main/resources/org/apache/nifi-registry/web/webdefault.xml
+++
b/nifi-registry/nifi-registry-core/nifi-registry-jetty/src/main/resources/org/apache/nifi-registry/web/webdefault.xml
@@ -42,14 +42,6 @@
Default web.xml file.
This file is applied to a Web application before it's own
WEB_INF/web.xml file
</description>
-
- <!-- ====================================================================
-->
- <!-- Removes static references to beans from javax.el.BeanELResolver to
-->
- <!-- ensure webapp classloader can be released on undeploy
-->
- <!-- ====================================================================
-->
- <listener>
-
<listener-class>org.eclipse.jetty.servlet.listener.ELContextCleaner</listener-class>
- </listener>
<!-- ====================================================================
-->
<!-- Removes static cache of Methods from java.beans.Introspector to
-->
diff --git
a/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/test/java/org/apache/nifi/registry/web/JettyITServerCustomizer.java
b/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/test/java/org/apache/nifi/registry/web/JettyITServerCustomizer.java
index 15bc848eff..655cbb8866 100644
---
a/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/test/java/org/apache/nifi/registry/web/JettyITServerCustomizer.java
+++
b/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/test/java/org/apache/nifi/registry/web/JettyITServerCustomizer.java
@@ -81,7 +81,7 @@ public class JettyITServerCustomizer implements
WebServerFactoryCustomizer<Jetty
LOGGER.info("JettyServer is customized");
}
- private SslContextFactory createSslContextFactory(Ssl properties) {
+ private SslContextFactory.Server createSslContextFactory(Ssl properties) {
// Calling SslContextFactory.Server() calls
setEndpointIdentificationAlgorithm(null).
// This ensures that Jetty server does not attempt to validate a
hostname in the client certificate's SAN.
final SslContextFactory.Server contextFactory = new
SslContextFactory.Server();
diff --git
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/server/TlsCertificateAuthorityService.java
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/server/TlsCertificateAuthorityService.java
index b181d41295..921400feb2 100644
---
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/server/TlsCertificateAuthorityService.java
+++
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/server/TlsCertificateAuthorityService.java
@@ -62,7 +62,7 @@ public class TlsCertificateAuthorityService {
}
private static ServerConnector createSSLConnector(Server server, int port,
KeyStore keyStore, String keyPassword) {
- SslContextFactory sslContextFactory = new SslContextFactory.Server();
+ SslContextFactory.Server sslContextFactory = new
SslContextFactory.Server();
sslContextFactory.setIncludeProtocols(TlsPlatform.getLatestProtocol());
sslContextFactory.setKeyStore(keyStore);
sslContextFactory.setKeyManagerPassword(keyPassword);
diff --git a/pom.xml b/pom.xml
index 887ff5a059..5ac9ab25fa 100644
--- a/pom.xml
+++ b/pom.xml
@@ -122,7 +122,7 @@
<org.slf4j.version>2.0.7</org.slf4j.version>
<derby.version>10.16.1.1</derby.version>
<ranger.version>2.4.0</ranger.version>
- <jetty.version>9.4.51.v20230217</jetty.version>
+ <jetty.version>10.0.15</jetty.version>
<jackson.bom.version>2.15.2</jackson.bom.version>
<avro.version>1.11.2</avro.version>
<jaxb.runtime.version>2.3.5</jaxb.runtime.version>
@@ -454,7 +454,6 @@
<version>${jetty.version}</version>
<scope>provided</scope>
</dependency>
-
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-alpn-client</artifactId>
@@ -465,11 +464,6 @@
<artifactId>jetty-alpn-java-client</artifactId>
<version>${jetty.version}</version>
</dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-continuation</artifactId>
- <version>${jetty.version}</version>
- </dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-client</artifactId>