Merge remote-tracking branch 'origin/jetty-9.4.x' into jetty-9.4.x-websocketProxy

This commit is contained in:
Lachlan Roberts 2020-11-25 23:05:51 +11:00
commit ce11fb3e94
25 changed files with 163 additions and 282 deletions

6
Jenkinsfile vendored
View File

@ -12,7 +12,7 @@ pipeline {
steps { steps {
container('jetty-build') { container('jetty-build') {
timeout( time: 120, unit: 'MINUTES' ) { timeout( time: 120, unit: 'MINUTES' ) {
mavenBuild( "jdk8", "clean install -T3 -Premote-session-tests -Pgcloud", "maven3", mavenBuild( "jdk8", "clean install -T3", "maven3",
[[parserName: 'Maven'], [parserName: 'Java']]) [[parserName: 'Maven'], [parserName: 'Java']])
// Collect up the jacoco execution results (only on main build) // Collect up the jacoco execution results (only on main build)
jacoco inclusionPattern: '**/org/eclipse/jetty/**/*.class', jacoco inclusionPattern: '**/org/eclipse/jetty/**/*.class',
@ -42,7 +42,7 @@ pipeline {
steps { steps {
container( 'jetty-build' ) { container( 'jetty-build' ) {
timeout( time: 120, unit: 'MINUTES' ) { timeout( time: 120, unit: 'MINUTES' ) {
mavenBuild( "jdk11", "clean install -T3 -Djacoco.skip=true -Premote-session-tests -Pgcloud", "maven3", mavenBuild( "jdk11", "clean install -T3 -Djacoco.skip=true", "maven3",
[[parserName: 'Maven'], [parserName: 'Java']]) [[parserName: 'Maven'], [parserName: 'Java']])
} }
} }
@ -54,7 +54,7 @@ pipeline {
steps { steps {
container( 'jetty-build' ) { container( 'jetty-build' ) {
timeout( time: 120, unit: 'MINUTES' ) { timeout( time: 120, unit: 'MINUTES' ) {
mavenBuild( "jdk15", "clean install -T3 -Djacoco.skip=true -Premote-session-tests -Pgcloud", "maven3", mavenBuild( "jdk15", "clean install -T3 -Djacoco.skip=true", "maven3",
[[parserName: 'Maven'], [parserName: 'Java']]) [[parserName: 'Maven'], [parserName: 'Java']])
} }
} }

View File

@ -213,7 +213,6 @@ The `JMXServiceURL` above specifies that the RMI server binds to the wildcard ad
===== JMX Remote Access Authorization ===== JMX Remote Access Authorization
The standard `JMXConnectorServer` provides several options to authorize access. The standard `JMXConnectorServer` provides several options to authorize access.
For a complete guide to controlling authentication and authorization in JMX, see https://blogs.oracle.com/lmalventosa/entry/jmx_authentication_authorization[Authentication and Authorization in JMX RMI connectors].
To authorize access to the `JMXConnectorServer` you can use this configuration, where the `jmx.password` and `jmx.access` files have the format specified in the blog entry above: To authorize access to the `JMXConnectorServer` you can use this configuration, where the `jmx.password` and `jmx.access` files have the format specified in the blog entry above:

View File

@ -206,7 +206,7 @@ $ java -jar start.jar --module=websocket --write-module-graph=modules.dot
$ dot -Tpng -o modules.png modules.dot $ dot -Tpng -o modules.png modules.dot
---- ----
+ +
See http://graphviz.org/[graphviz.org] for details on http://graphviz.org/content/command-line-invocation[how to post-process this dotty file] into the output best suited for your needs. See http://graphviz.org/[graphviz.org] for details on how to post-process this dotty file into the output best suited for your needs.
--create-files:: --create-files::
Create any missing files that are required by initialized modules. Create any missing files that are required by initialized modules.

View File

@ -713,7 +713,7 @@ This is _not_ a recommended usage.
==== Conscrypt SSL ==== Conscrypt SSL
Jetty includes support for Google's https://github.com/google/conscrypt/[Conscrypt SSL], which is built on their fork of https://www.openssl.org/[OpenSSL], https://boringssl.googlesource.com/boringssl/[BoringSSL]. Jetty includes support for Google's https://github.com/google/conscrypt/[Conscrypt SSL], which is built on their fork of https://www.openssl.org/[OpenSSL], https://boringssl.googlesource.com/boringssl/[BoringSSL].
Implementing Conscrypt for the link:{GITBROWSEURL}/jetty-alpn/jetty-alpn-conscrypt-server/src/test/java/org/eclipse/jetty/alpn/conscrypt/server/ConscryptHTTP2Server.java[server] or link:{GITBROWSEURL}/jetty-alpn/jetty-alpn-conscrypt-client/src/test/java/org/eclipse/jetty/alpn/java/client/ConscryptHTTP2Client.java[client] is very straightforward process - simply instantiate an instance of Conscrypt's `OpenSSLProvider` and set `Conscrypt` as a provider for Jetty's `SslContextFactory`: Implementing Conscrypt for the link:{GITBROWSEURL}/jetty-alpn/jetty-alpn-conscrypt-server/src/test/java/org/eclipse/jetty/alpn/conscrypt/server/ConscryptHTTP2ServerTest.java[server] or link:{GITBROWSEURL}/jetty-alpn/jetty-alpn-conscrypt-client/src/test/java/org/eclipse/jetty/alpn/java/client/ConscryptHTTP2ClientTest.java[client] is very straightforward process - simply instantiate an instance of Conscrypt's `OpenSSLProvider` and set `Conscrypt` as a provider for Jetty's `SslContextFactory`:
[source, java] [source, java]
---- ----

View File

@ -239,7 +239,7 @@ The link:{GITBROWSEURL}/examples/embedded/src/main/java/org/eclipse/jetty/embedd
* link:{GITBROWSEURL}/jetty-server/src/main/config/etc/jetty-stats.xml[jetty-stats.xml] * link:{GITBROWSEURL}/jetty-server/src/main/config/etc/jetty-stats.xml[jetty-stats.xml]
* link:{GITBROWSEURL}/jetty-server/src/main/config/etc/jetty-requestlog.xml[jetty-requestlog.xml] * link:{GITBROWSEURL}/jetty-server/src/main/config/etc/jetty-requestlog.xml[jetty-requestlog.xml]
* link:{GITBROWSEURL}/jetty-server/src/main/config/etc/jetty-lowresources.xml[jetty-lowresources.xml] * link:{GITBROWSEURL}/jetty-server/src/main/config/etc/jetty-lowresources.xml[jetty-lowresources.xml]
* link:{GITBROWSEURL}/tests/test-webapps/test-jetty-webapp/src/main/config/etc/test-realm.xml[test-realm.xml] * link:{GITBROWSEURL}/tests/test-webapps/test-jetty-webapp/src/main/config/demo-base/etc/test-realm.xml[test-realm.xml]
[source, java] [source, java]
---- ----

View File

@ -1153,6 +1153,6 @@ In addition, as the feature group includes websocket, you will need to download
|======================================================================= |=======================================================================
|Jar |Bundle Symbolic Name |Location |Jar |Bundle Symbolic Name |Location
|javax.websocket-api |javax.websocket-api |javax.websocket-api |javax.websocket-api
|https://repo1.maven.org/maven2/javax/websocket/websocket-api[Maven |https://repo1.maven.org/maven2/javax/websocket/[Maven
central] central]
|======================================================================= |=======================================================================

View File

@ -67,7 +67,7 @@ Validator]
|http://jcp.org/en/jsr/detail?id=353[JSR 353] |Java API for JSON Processing 1.0 (JSON-P) |No |Yes, eg JSON-P https://java.net/projects/jsonp/[reference implementation] |http://jcp.org/en/jsr/detail?id=353[JSR 353] |Java API for JSON Processing 1.0 (JSON-P) |No |Yes, eg JSON-P https://java.net/projects/jsonp/[reference implementation]
|link:jcp.org/en/jsr/detail?id=318[JSR 318] |Interceptors 1.2 |No |Yes as part of a CDI implementation |http://jcp.org/en/jsr/detail?id=318[JSR 318] |Interceptors 1.2 |No |Yes as part of a CDI implementation
|======================================================================= |=======================================================================
[[jetty-javaee-6]] [[jetty-javaee-6]]
@ -102,7 +102,7 @@ Here is the matrix of JSRs for Java EE 6 Web Profile, and how they relate to Jet
|http://jcp.org/en/jsr/detail?id=250[JSR 250] |Common Annotations for the Java Platform |Yes |Partially (for non-core Servlet Spec annotations) |http://jcp.org/en/jsr/detail?id=250[JSR 250] |Common Annotations for the Java Platform |Yes |Partially (for non-core Servlet Spec annotations)
|http://jcp.org/en/jsr/detail?id=907[JSR 907] |Java Transaction API (JTA) |Yes |Implementations are pluggable, such as http://www.atomikos.com/[Atomikos], http://jotm.ow2.org/xwiki/bin/view/Main/WebHome[JOTM], http://jencks.codehaus.org/Transaction+Manager[Jencks (Geronimo Transaction Manager)] |http://jcp.org/en/jsr/detail?id=907[JSR 907] |Java Transaction API (JTA) |Yes |Implementations are pluggable, such as http://www.atomikos.com/[Atomikos], http://jotm.ow2.org/[JOTM], http://jencks.codehaus.org/Transaction+Manager[Jencks (Geronimo Transaction Manager)]
|http://jcp.org/en/jsr/detail?id=303[JSR 303] |Bean Validation 1.0 |No |Yes as part of another technology (JSF), or a stand-alone implementation such as http://www.hibernate.org/subprojects/validator/docs.html[Hiberate |http://jcp.org/en/jsr/detail?id=303[JSR 303] |Bean Validation 1.0 |No |Yes as part of another technology (JSF), or a stand-alone implementation such as http://www.hibernate.org/subprojects/validator/docs.html[Hiberate
Validator] Validator]

View File

@ -37,7 +37,7 @@ You can specify a custom configuration file to use for specific webapps, or for
==== ====
To ensure your `webdefault.xml` files are validated, you will need to set the `validateXml` attribute to true as described link:#jetty-xml-dtd[here.] To ensure your `webdefault.xml` files are validated, you will need to set the `validateXml` attribute to true as described link:#jetty-xml-dtd[here.]
==== ====
The `webdefault.xml` link:{GITBROWSURL}/jetty-webapp/src/main/config/etc/webdefault.xml[included with the Jetty Distribution] contains several configuration options, such as init params and servlet mappings, and is separated into sections for easy navigation. The `webdefault.xml` link:{GITBROWSEURLSURL}/jetty-webapp/src/main/config/etc/webdefault.xml[included with the Jetty Distribution] contains several configuration options, such as init params and servlet mappings, and is separated into sections for easy navigation.
Some of the more common options include, but are not limited to: Some of the more common options include, but are not limited to:
dirAllowed:: dirAllowed::

View File

@ -23,4 +23,4 @@ As of Fedora 19, Jetty 9 is the version of Jetty available.
This distribution of Jetty is not created or maintained by the Jetty project though we have had a fair amount of communication with the folks behind it and we are very pleased with how this Linux distribution has stayed current. This distribution of Jetty is not created or maintained by the Jetty project though we have had a fair amount of communication with the folks behind it and we are very pleased with how this Linux distribution has stayed current.
Releases are kept largely in sync with our releases as there is a wonderful automatic notification mechanism in place for Fedora that detects our releases and immediately opens an issue for them to update. Releases are kept largely in sync with our releases as there is a wonderful automatic notification mechanism in place for Fedora that detects our releases and immediately opens an issue for them to update.
* https://admin.fedoraproject.org/pkgdb/acls/name/jetty[Jetty on Fedora] * https://src.fedoraproject.org/rpms/jetty[Jetty on Fedora]

View File

@ -90,7 +90,9 @@
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId> <artifactId>maven-surefire-plugin</artifactId>
<configuration> <configuration>
<skipTests>true</skipTests> <systemPropertyVariables>
<infinispan.docker.image.version>${infinispan.docker.image.version}</infinispan.docker.image.version>
</systemPropertyVariables>
</configuration> </configuration>
</plugin> </plugin>
</plugins> </plugins>
@ -137,29 +139,4 @@
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
</dependencies> </dependencies>
<profiles>
<profile>
<id>remote-session-tests</id>
<activation>
<property>
<name>hotrod.enabled</name>
<value>true</value>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>false</skipTests>
<systemPropertyVariables>
<infinispan.docker.image.version>${infinispan.docker.image.version}</infinispan.docker.image.version>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project> </project>

View File

@ -15,7 +15,7 @@
<assembly-directory>target/distribution</assembly-directory> <assembly-directory>target/distribution</assembly-directory>
<exam.version>4.13.1</exam.version> <exam.version>4.13.1</exam.version>
<url.version>2.6.1</url.version> <url.version>2.6.1</url.version>
<injection.bundle.version>1.0</injection.bundle.version> <injection.bundle.version>1.2</injection.bundle.version>
</properties> </properties>
<dependencies> <dependencies>
<!-- Pax Exam Dependencies --> <!-- Pax Exam Dependencies -->

View File

@ -35,6 +35,7 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;
import org.eclipse.jetty.util.ClassLoadingObjectInputStream; import org.eclipse.jetty.util.ClassLoadingObjectInputStream;
import org.eclipse.jetty.util.MultiException; import org.eclipse.jetty.util.MultiException;
@ -153,7 +154,7 @@ public class FileSessionDataStore extends AbstractSessionDataStore
public Set<String> doGetExpired(final Set<String> candidates) public Set<String> doGetExpired(final Set<String> candidates)
{ {
final long now = System.currentTimeMillis(); final long now = System.currentTimeMillis();
HashSet<String> expired = new HashSet<String>(); HashSet<String> expired = new HashSet<>();
//iterate over the files and work out which have expired //iterate over the files and work out which have expired
for (String filename : _sessionFileMap.values()) for (String filename : _sessionFileMap.values())
@ -206,23 +207,12 @@ public class FileSessionDataStore extends AbstractSessionDataStore
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
if (LOG.isDebugEnabled()) if (LOG.isDebugEnabled())
LOG.debug("Sweeping {} for old session files", _storeDir); LOG.debug("Sweeping {} for old session files", _storeDir);
try try (Stream<Path> stream = Files.walk(_storeDir.toPath(), 1, FileVisitOption.FOLLOW_LINKS))
{ {
Files.walk(_storeDir.toPath(), 1, FileVisitOption.FOLLOW_LINKS) stream
.filter(p -> !Files.isDirectory(p)).filter(p -> !isOurContextSessionFilename(p.getFileName().toString())) .filter(p -> !Files.isDirectory(p)).filter(p -> !isOurContextSessionFilename(p.getFileName().toString()))
.filter(p -> isSessionFilename(p.getFileName().toString())) .filter(p -> isSessionFilename(p.getFileName().toString()))
.forEach(p -> .forEach(p -> sweepFile(now, p));
{
try
{
sweepFile(now, p);
}
catch (Exception e)
{
LOG.warn(e);
}
});
} }
catch (Exception e) catch (Exception e)
{ {
@ -237,29 +227,35 @@ public class FileSessionDataStore extends AbstractSessionDataStore
* *
* @param now the time now in msec * @param now the time now in msec
* @param p the file to check * @param p the file to check
* @throws Exception indicating error in sweep
*/ */
public void sweepFile(long now, Path p) public void sweepFile(long now, Path p)
throws Exception
{ {
if (p == null) if (p != null)
return;
try
{ {
long expiry = getExpiryFromFilename(p.getFileName().toString()); try
//files with 0 expiry never expire
if (expiry > 0 && ((now - expiry) >= (5 * TimeUnit.SECONDS.toMillis(_gracePeriodSec))))
{ {
Files.deleteIfExists(p); long expiry = getExpiryFromFilename(p.getFileName().toString());
if (LOG.isDebugEnabled()) //files with 0 expiry never expire
LOG.debug("Sweep deleted {}", p.getFileName()); if (expiry > 0 && ((now - expiry) >= (5 * TimeUnit.SECONDS.toMillis(_gracePeriodSec))))
{
try
{
if (!Files.deleteIfExists(p))
LOG.warn("Could not delete {}", p.getFileName());
else if (LOG.isDebugEnabled())
LOG.debug("Deleted {}", p.getFileName());
}
catch (IOException e)
{
LOG.warn("Could not delete {}", p.getFileName(), e);
}
}
}
catch (NumberFormatException e)
{
LOG.warn("Not valid session filename {}", p.getFileName());
LOG.warn(e);
} }
}
catch (NumberFormatException e)
{
LOG.warn("Not valid session filename {}", p.getFileName());
LOG.warn(e);
} }
} }
@ -311,7 +307,7 @@ public class FileSessionDataStore extends AbstractSessionDataStore
@Override @Override
public void doStore(String id, SessionData data, long lastSaveTime) throws Exception public void doStore(String id, SessionData data, long lastSaveTime) throws Exception
{ {
File file = null; File file;
if (_storeDir != null) if (_storeDir != null)
{ {
delete(id); delete(id);
@ -328,8 +324,9 @@ public class FileSessionDataStore extends AbstractSessionDataStore
} }
catch (Exception e) catch (Exception e)
{ {
if (file != null) // No point keeping the file if we didn't save the whole session
file.delete(); // No point keeping the file if we didn't save the whole session if (!file.delete())
e.addSuppressed(new IOException("Could not delete " + file));
throw new UnwriteableSessionDataException(id, _context, e); throw new UnwriteableSessionDataException(id, _context, e);
} }
} }
@ -353,7 +350,10 @@ public class FileSessionDataStore extends AbstractSessionDataStore
throw new IllegalStateException("No file store specified"); throw new IllegalStateException("No file store specified");
if (!_storeDir.exists()) if (!_storeDir.exists())
_storeDir.mkdirs(); {
if (!_storeDir.mkdirs())
throw new IllegalStateException("Could not create " + _storeDir);
}
else else
{ {
if (!(_storeDir.isDirectory() && _storeDir.canWrite() && _storeDir.canRead())) if (!(_storeDir.isDirectory() && _storeDir.canWrite() && _storeDir.canRead()))
@ -365,70 +365,67 @@ public class FileSessionDataStore extends AbstractSessionDataStore
MultiException me = new MultiException(); MultiException me = new MultiException();
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
Files.walk(_storeDir.toPath(), 1, FileVisitOption.FOLLOW_LINKS) // Build session file map by walking directory
.filter(p -> !Files.isDirectory(p)).filter(p -> isSessionFilename(p.getFileName().toString())) try (Stream<Path> stream = Files.walk(_storeDir.toPath(), 1, FileVisitOption.FOLLOW_LINKS))
.forEach(p -> {
{ stream
//first get rid of all ancient files, regardless of which .filter(p -> !Files.isDirectory(p))
//context they are for .filter(p -> isSessionFilename(p.getFileName().toString()))
try .forEach(p ->
{ {
// first get rid of all ancient files
sweepFile(now, p); sweepFile(now, p);
}
catch (Exception x)
{
me.add(x);
}
String filename = p.getFileName().toString(); String filename = p.getFileName().toString();
String context = getContextFromFilename(filename); String context = getContextFromFilename(filename);
//now process it if it wasn't deleted, and it is for our context //now process it if it wasn't deleted, and it is for our context
if (Files.exists(p) && _contextString.equals(context)) if (Files.exists(p) && _contextString.equals(context))
{
//the session is for our context, populate the map with it
String sessionIdWithContext = getIdWithContextFromFilename(filename);
if (sessionIdWithContext != null)
{ {
//handle multiple session files existing for the same session: remove all //the session is for our context, populate the map with it
//but the file with the most recent expiry time String sessionIdWithContext = getIdWithContextFromFilename(filename);
String existing = _sessionFileMap.putIfAbsent(sessionIdWithContext, filename); if (sessionIdWithContext != null)
if (existing != null)
{ {
//if there was a prior filename, work out which has the most //handle multiple session files existing for the same session: remove all
//recent modify time //but the file with the most recent expiry time
try String existing = _sessionFileMap.putIfAbsent(sessionIdWithContext, filename);
if (existing != null)
{ {
long existingExpiry = getExpiryFromFilename(existing); //if there was a prior filename, work out which has the most
long thisExpiry = getExpiryFromFilename(filename); //recent modify time
try
{
long existingExpiry = getExpiryFromFilename(existing);
long thisExpiry = getExpiryFromFilename(filename);
if (thisExpiry > existingExpiry) if (thisExpiry > existingExpiry)
{ {
//replace with more recent file //replace with more recent file
Path existingPath = _storeDir.toPath().resolve(existing); Path existingPath = _storeDir.toPath().resolve(existing);
//update the file we're keeping //update the file we're keeping
_sessionFileMap.put(sessionIdWithContext, filename); _sessionFileMap.put(sessionIdWithContext, filename);
//delete the old file //delete the old file
Files.delete(existingPath); Files.delete(existingPath);
if (LOG.isDebugEnabled()) if (LOG.isDebugEnabled())
LOG.debug("Replaced {} with {}", existing, filename); LOG.debug("Replaced {} with {}", existing, filename);
}
else
{
//we found an older file, delete it
Files.delete(p);
if (LOG.isDebugEnabled())
LOG.debug("Deleted expired session file {}", filename);
}
} }
else catch (IOException e)
{ {
//we found an older file, delete it me.add(e);
Files.delete(p);
if (LOG.isDebugEnabled())
LOG.debug("Deleted expired session file {}", filename);
} }
} }
catch (IOException e)
{
me.add(e);
}
} }
} }
} });
}); me.ifExceptionThrow();
me.ifExceptionThrow(); }
} }
} }
@ -511,11 +508,11 @@ public class FileSessionDataStore extends AbstractSessionDataStore
protected long getExpiryFromFilename(String filename) protected long getExpiryFromFilename(String filename)
{ {
if (StringUtil.isBlank(filename) || filename.indexOf("_") < 0) if (StringUtil.isBlank(filename) || !filename.contains("_"))
throw new IllegalStateException("Invalid or missing filename"); throw new IllegalStateException("Invalid or missing filename");
String s = filename.substring(0, filename.indexOf('_')); String s = filename.substring(0, filename.indexOf('_'));
return (s == null ? 0 : Long.parseLong(s)); return Long.parseLong(s);
} }
protected String getContextFromFilename(String filename) protected String getContextFromFilename(String filename)
@ -592,11 +589,11 @@ public class FileSessionDataStore extends AbstractSessionDataStore
protected SessionData load(InputStream is, String expectedId) protected SessionData load(InputStream is, String expectedId)
throws Exception throws Exception
{ {
String id = null; //the actual id from inside the file String id; //the actual id from inside the file
try try
{ {
SessionData data = null; SessionData data;
DataInputStream di = new DataInputStream(is); DataInputStream di = new DataInputStream(is);
id = di.readUTF(); id = di.readUTF();

View File

@ -146,9 +146,8 @@ public class CustomResourcesMonitorTest
@Override @Override
public boolean isLowOnResources() public boolean isLowOnResources()
{ {
try try (Stream<Path> paths = Files.list(_pathToMonitor))
{ {
Stream<Path> paths = Files.list(_pathToMonitor);
List<Path> content = paths.collect(Collectors.toList()); List<Path> content = paths.collect(Collectors.toList());
if (!content.isEmpty()) if (!content.isEmpty())
{ {

View File

@ -36,6 +36,7 @@ import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Stream;
import javax.servlet.DispatcherType; import javax.servlet.DispatcherType;
import javax.servlet.MultipartConfigElement; import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletException; import javax.servlet.ServletException;
@ -1837,9 +1838,9 @@ public class RequestTest
private static long getFileCount(Path path) private static long getFileCount(Path path)
{ {
try try (Stream<Path> s = Files.list(path))
{ {
return Files.list(path).count(); return s.count();
} }
catch (IOException e) catch (IOException e)
{ {

View File

@ -31,7 +31,7 @@ import java.time.temporal.TemporalAccessor;
import java.util.Arrays; import java.util.Arrays;
import java.util.TimeZone; import java.util.TimeZone;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Stream;
import org.eclipse.jetty.toolchain.test.FS; import org.eclipse.jetty.toolchain.test.FS;
import org.eclipse.jetty.toolchain.test.jupiter.WorkDir; import org.eclipse.jetty.toolchain.test.jupiter.WorkDir;
@ -379,6 +379,9 @@ public class RolloverFileOutputStreamTest
private String[] ls(Path path) throws IOException private String[] ls(Path path) throws IOException
{ {
return Files.list(path).map(p -> p.getFileName().toString()).collect(Collectors.toList()).toArray(new String[0]); try (Stream<Path> s = Files.list(path))
{
return s.map(p -> p.getFileName().toString()).toArray(String[]::new);
}
} }
} }

View File

@ -30,6 +30,7 @@ import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.zip.ZipFile; import java.util.zip.ZipFile;
import org.eclipse.jetty.toolchain.test.FS; import org.eclipse.jetty.toolchain.test.FS;
@ -264,7 +265,10 @@ public class JarResourceTest
private List<Path> listFiles(Path dir) throws IOException private List<Path> listFiles(Path dir) throws IOException
{ {
return Files.list(dir).collect(Collectors.toList()); try (Stream<Path> s = Files.list(dir))
{
return s.collect(Collectors.toList());
}
} }
private List<Path> listFiles(Path dir, DirectoryStream.Filter<? super Path> filter) throws IOException private List<Path> listFiles(Path dir, DirectoryStream.Filter<? super Path> filter) throws IOException

View File

@ -65,6 +65,7 @@ import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.MethodSource;
@ -73,6 +74,7 @@ import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.is;
@Tag("large-disk-resource")
public class HugeResourceTest public class HugeResourceTest
{ {
private static final long KB = 1024; private static final long KB = 1024;

View File

@ -365,10 +365,14 @@ public class WebAppContextTest
WebAppClassLoader webAppClassLoader = (WebAppClassLoader)contextClassLoader; WebAppClassLoader webAppClassLoader = (WebAppClassLoader)contextClassLoader;
Path extLibsDir = MavenTestingUtils.getTestResourcePathDir("ext"); Path extLibsDir = MavenTestingUtils.getTestResourcePathDir("ext");
extLibsDir = extLibsDir.toAbsolutePath(); extLibsDir = extLibsDir.toAbsolutePath();
List<Path> expectedPaths = Files.list(extLibsDir) List<Path> expectedPaths;
.filter(Files::isRegularFile) try (Stream<Path> s = Files.list(extLibsDir))
.filter((path) -> path.toString().endsWith(".jar")) {
.collect(Collectors.toList()); expectedPaths = s
.filter(Files::isRegularFile)
.filter((path) -> path.toString().endsWith(".jar"))
.collect(Collectors.toList());
}
List<Path> actualPaths = new ArrayList<>(); List<Path> actualPaths = new ArrayList<>();
for (URL url : webAppClassLoader.getURLs()) for (URL url : webAppClassLoader.getURLs())
{ {

View File

@ -595,7 +595,7 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jxr-plugin</artifactId> <artifactId>maven-jxr-plugin</artifactId>
<version>2.5</version> <version>3.0.0</version>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
@ -605,7 +605,7 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId> <artifactId>maven-pmd-plugin</artifactId>
<version>3.13.0</version> <version>3.14.0</version>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
@ -1448,7 +1448,7 @@
<artifactId>maven-surefire-plugin</artifactId> <artifactId>maven-surefire-plugin</artifactId>
<version>${maven.surefire.version}</version> <version>${maven.surefire.version}</version>
<configuration> <configuration>
<excludedGroups>external</excludedGroups> <excludedGroups>external, large-disk-resource</excludedGroups>
</configuration> </configuration>
</plugin> </plugin>
</plugins> </plugins>

View File

@ -27,10 +27,10 @@ import java.io.ObjectOutputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.eclipse.jetty.toolchain.test.FS; import org.eclipse.jetty.toolchain.test.FS;
import org.eclipse.jetty.toolchain.test.jupiter.WorkDir; import org.eclipse.jetty.toolchain.test.jupiter.WorkDir;
@ -49,23 +49,28 @@ public class FileTestHelper
public static File getFile(WorkDir workDir, String sessionId) throws IOException public static File getFile(WorkDir workDir, String sessionId) throws IOException
{ {
Optional<Path> sessionPath = Files.list(workDir.getPath()) try (Stream<Path> s = Files.list(workDir.getPath()))
.filter((path) -> path.getFileName().toString().contains(sessionId)) {
.findFirst(); return s
if (sessionPath.isPresent()) .filter((path) -> path.getFileName().toString().contains(sessionId))
return sessionPath.get().toFile(); .findFirst()
return null; .map(Path::toFile)
.orElse(null);
}
} }
public static void assertSessionExists(WorkDir workDir, String sessionId, boolean exists) throws IOException public static void assertSessionExists(WorkDir workDir, String sessionId, boolean exists) throws IOException
{ {
Optional<Path> sessionPath = Files.list(workDir.getPath()) try (Stream<Path> s = Files.list(workDir.getPath()))
.filter((path) -> path.getFileName().toString().contains(sessionId)) {
.findFirst(); Optional<Path> sessionPath = s
if (exists) .filter((path) -> path.getFileName().toString().contains(sessionId))
assertTrue(sessionPath.isPresent()); .findFirst();
else if (exists)
assertFalse(sessionPath.isPresent()); assertTrue(sessionPath.isPresent());
else
assertFalse(sessionPath.isPresent());
}
} }
public static void assertFileExists(WorkDir workDir, String filename, boolean exists) public static void assertFileExists(WorkDir workDir, String filename, boolean exists)
@ -170,14 +175,11 @@ public class FileTestHelper
public static void deleteFile(WorkDir workDir, String sessionId) throws IOException public static void deleteFile(WorkDir workDir, String sessionId) throws IOException
{ {
// Collect // Collect
List<Path> matches = Files.list(workDir.getPath()) try (Stream<Path> s = Files.list(workDir.getPath()))
.filter((path) -> path.getFileName().toString().contains(sessionId))
.collect(Collectors.toList());
// Delete outside of lambda
for (Path path : matches)
{ {
FS.deleteFile(path); s.filter((path) -> path.getFileName().toString().contains(sessionId))
.collect(Collectors.toList()) // Delete outside of list stream
.forEach(FS::deleteFile);
} }
} }

View File

@ -21,13 +21,6 @@
<skip>true</skip> <skip>true</skip>
</configuration> </configuration>
</plugin> </plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins> </plugins>
</build> </build>
<dependencies> <dependencies>
@ -83,26 +76,4 @@
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
</dependencies> </dependencies>
<profiles>
<profile>
<id>gcloud</id>
<activation>
<property>
<name>gcloud.enabled</name>
<value>true</value>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>false</skipTests>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project> </project>

View File

@ -30,8 +30,12 @@
<artifactId>maven-surefire-plugin</artifactId> <artifactId>maven-surefire-plugin</artifactId>
<configuration> <configuration>
<includes> <includes>
<include>org/eclipse/jetty/server/session/*.java</include> <include>**/*.java</include>
</includes> </includes>
<systemPropertyVariables>
<infinispan.docker.image.version>${infinispan.docker.image.version}</infinispan.docker.image.version>
<infinispan.docker.image.name>${infinispan.docker.image.name}</infinispan.docker.image.name>
</systemPropertyVariables>
</configuration> </configuration>
</plugin> </plugin>
<plugin> <plugin>
@ -151,33 +155,4 @@
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
</dependencies> </dependencies>
<profiles>
<!-- to test hotrod, configure a cache called "remote-session-test" -->
<profile>
<id>remote-session-tests</id>
<activation>
<property>
<name>hotrod.enabled</name>
<value>true</value>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<includes>
<include>**/*.java</include>
</includes>
<systemPropertyVariables>
<infinispan.docker.image.version>${infinispan.docker.image.version}</infinispan.docker.image.version>
<infinispan.docker.image.name>${infinispan.docker.image.name}</infinispan.docker.image.name>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project> </project>

View File

@ -22,13 +22,6 @@
<skip>true</skip> <skip>true</skip>
</configuration> </configuration>
</plugin> </plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins> </plugins>
</build> </build>
<dependencies> <dependencies>
@ -78,27 +71,4 @@
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
</dependencies> </dependencies>
<profiles>
<profile>
<id>remote-session-tests</id>
<activation>
<property>
<name>memcached.enabled</name>
<value>true</value>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>false</skipTests>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project> </project>

View File

@ -28,7 +28,9 @@
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId> <artifactId>maven-surefire-plugin</artifactId>
<configuration> <configuration>
<skipTests>true</skipTests> <systemPropertyVariables>
<mongo.docker.version>${mongo.docker.version}</mongo.docker.version>
</systemPropertyVariables>
</configuration> </configuration>
</plugin> </plugin>
<plugin> <plugin>
@ -112,29 +114,4 @@
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
</dependencies> </dependencies>
<profiles>
<profile>
<id>remote-session-tests</id>
<activation>
<property>
<name>mongo.enabled</name>
<value>true</value>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<systemPropertyVariables>
<mongo.docker.version>${mongo.docker.version}</mongo.docker.version>
</systemPropertyVariables>
<skipTests>false</skipTests>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project> </project>

View File

@ -50,7 +50,7 @@
<dependency> <dependency>
<groupId>org.apache.geronimo.specs</groupId> <groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-atinject_1.0_spec</artifactId> <artifactId>geronimo-atinject_1.0_spec</artifactId>
<version>1.1</version> <version>1.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.geronimo.specs</groupId> <groupId>org.apache.geronimo.specs</groupId>