From 0b3f7ddd66080f3f3bd62e39859f87e2a876e414 Mon Sep 17 00:00:00 2001 From: Puja Jagani Date: Wed, 20 Aug 2025 15:13:51 +0530 Subject: [PATCH 1/3] [grid] Replace Guava set and maps with Java equivalent for remaining Grid packages --- .../grid/sessionmap/AddToSessionMap.java | 4 +-- .../grid/sessionmap/GetFromSessionMap.java | 4 +-- .../httpd/DefaultSessionMapConfig.java | 10 +++---- .../sessionmap/httpd/SessionMapServer.java | 9 +++---- .../redis/RedisBackedSessionMap.java | 4 +-- .../grid/sessionqueue/ClearSessionQueue.java | 8 +++--- .../httpd/DefaultNewSessionQueueConfig.java | 4 +-- .../httpd/NewSessionQueueServer.java | 9 +++---- .../local/LocalNewSessionQueue.java | 8 +++--- .../grid/web/CheckContentTypeHeader.java | 14 +++++----- .../selenium/grid/web/CheckOriginHeader.java | 12 ++++----- .../selenium/grid/web/JarFileResource.java | 6 ++--- .../selenium/grid/web/MergedResource.java | 8 +++--- .../openqa/selenium/grid/web/NoHandler.java | 3 +-- .../selenium/grid/web/PathResource.java | 8 +++--- .../grid/web/ReverseProxyHandler.java | 27 +++++++++---------- .../grid/web/RoutableHttpClientFactory.java | 4 +-- 17 files changed, 67 insertions(+), 75 deletions(-) diff --git a/java/src/org/openqa/selenium/grid/sessionmap/AddToSessionMap.java b/java/src/org/openqa/selenium/grid/sessionmap/AddToSessionMap.java index b3a9989f6a759..ee7e0243ce539 100644 --- a/java/src/org/openqa/selenium/grid/sessionmap/AddToSessionMap.java +++ b/java/src/org/openqa/selenium/grid/sessionmap/AddToSessionMap.java @@ -24,7 +24,7 @@ import static org.openqa.selenium.remote.tracing.HttpTracing.newSpanAsChildOf; import static org.openqa.selenium.remote.tracing.Tags.HTTP_REQUEST; -import com.google.common.collect.ImmutableMap; +import java.util.Map; import java.util.Objects; import org.openqa.selenium.grid.data.Session; import org.openqa.selenium.internal.Require; @@ -61,7 +61,7 @@ public HttpResponse execute(HttpRequest req) { sessions.add(session); - return new HttpResponse().setContent(asJson(ImmutableMap.of("value", true))); + return new HttpResponse().setContent(asJson(Map.of("value", true))); } } } diff --git a/java/src/org/openqa/selenium/grid/sessionmap/GetFromSessionMap.java b/java/src/org/openqa/selenium/grid/sessionmap/GetFromSessionMap.java index 44928d516edf5..6210794391212 100644 --- a/java/src/org/openqa/selenium/grid/sessionmap/GetFromSessionMap.java +++ b/java/src/org/openqa/selenium/grid/sessionmap/GetFromSessionMap.java @@ -23,7 +23,7 @@ import static org.openqa.selenium.remote.tracing.HttpTracing.newSpanAsChildOf; import static org.openqa.selenium.remote.tracing.Tags.HTTP_REQUEST; -import com.google.common.collect.ImmutableMap; +import java.util.Map; import org.openqa.selenium.grid.data.Session; import org.openqa.selenium.internal.Require; import org.openqa.selenium.remote.SessionId; @@ -56,7 +56,7 @@ public HttpResponse execute(HttpRequest req) { CAPABILITIES.accept(span, session.getCapabilities()); span.setAttribute("session.uri", session.getUri().toString()); - return new HttpResponse().setContent(asJson(ImmutableMap.of("value", session))); + return new HttpResponse().setContent(asJson(Map.of("value", session))); } } } diff --git a/java/src/org/openqa/selenium/grid/sessionmap/httpd/DefaultSessionMapConfig.java b/java/src/org/openqa/selenium/grid/sessionmap/httpd/DefaultSessionMapConfig.java index bf530dec0d3b7..9b5fece2fd98b 100644 --- a/java/src/org/openqa/selenium/grid/sessionmap/httpd/DefaultSessionMapConfig.java +++ b/java/src/org/openqa/selenium/grid/sessionmap/httpd/DefaultSessionMapConfig.java @@ -17,21 +17,21 @@ package org.openqa.selenium.grid.sessionmap.httpd; -import com.google.common.collect.ImmutableMap; +import java.util.Map; import org.openqa.selenium.grid.config.MapConfig; class DefaultSessionMapConfig extends MapConfig { public DefaultSessionMapConfig() { super( - ImmutableMap.of( + Map.of( "events", - ImmutableMap.of( + Map.of( "publish", "tcp://*:4442", "subscribe", "tcp://*:4443"), "sessions", - ImmutableMap.of( + Map.of( "implementation", "org.openqa.selenium.grid.sessionmap.local.LocalSessionMap"), - "server", ImmutableMap.of("port", 5556))); + "server", Map.of("port", 5556))); } } diff --git a/java/src/org/openqa/selenium/grid/sessionmap/httpd/SessionMapServer.java b/java/src/org/openqa/selenium/grid/sessionmap/httpd/SessionMapServer.java index 64b07b11abbbf..91689f57f9ef2 100644 --- a/java/src/org/openqa/selenium/grid/sessionmap/httpd/SessionMapServer.java +++ b/java/src/org/openqa/selenium/grid/sessionmap/httpd/SessionMapServer.java @@ -26,12 +26,11 @@ import static org.openqa.selenium.remote.http.Route.get; import com.google.auto.service.AutoService; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; import java.io.Closeable; import java.io.IOException; import java.io.UncheckedIOException; import java.util.Collections; +import java.util.Map; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; @@ -64,7 +63,7 @@ public String getDescription() { @Override public Set getConfigurableRoles() { - return ImmutableSet.of(EVENT_BUS_ROLE, HTTPD_ROLE, SESSION_MAP_ROLE); + return Set.of(EVENT_BUS_ROLE, HTTPD_ROLE, SESSION_MAP_ROLE); } @Override @@ -100,9 +99,9 @@ protected Handlers createHandlers(Config config) { .addHeader("Content-Type", JSON_UTF_8) .setContent( asJson( - ImmutableMap.of( + Map.of( "value", - ImmutableMap.of( + Map.of( "ready", true, "message", diff --git a/java/src/org/openqa/selenium/grid/sessionmap/redis/RedisBackedSessionMap.java b/java/src/org/openqa/selenium/grid/sessionmap/redis/RedisBackedSessionMap.java index 62b1220edb21a..3c0cfc37da93f 100644 --- a/java/src/org/openqa/selenium/grid/sessionmap/redis/RedisBackedSessionMap.java +++ b/java/src/org/openqa/selenium/grid/sessionmap/redis/RedisBackedSessionMap.java @@ -23,12 +23,12 @@ import static org.openqa.selenium.remote.RemoteTags.SESSION_ID_EVENT; import static org.openqa.selenium.remote.tracing.Tags.EXCEPTION; -import com.google.common.collect.ImmutableMap; import io.lettuce.core.KeyValue; import java.net.URI; import java.net.URISyntaxException; import java.time.Instant; import java.util.List; +import java.util.Map; import java.util.logging.Logger; import org.openqa.selenium.Capabilities; import org.openqa.selenium.ImmutableCapabilities; @@ -139,7 +139,7 @@ public boolean add(Session session) { span.addEvent("Inserted into the database", attributeMap); connection.mset( - ImmutableMap.of( + Map.of( uriKey, uriValue, stereotypeKey, stereotypeJson, capabilitiesKey, capabilitiesJson, diff --git a/java/src/org/openqa/selenium/grid/sessionqueue/ClearSessionQueue.java b/java/src/org/openqa/selenium/grid/sessionqueue/ClearSessionQueue.java index 5f1cabc65a0d7..917201172e7de 100644 --- a/java/src/org/openqa/selenium/grid/sessionqueue/ClearSessionQueue.java +++ b/java/src/org/openqa/selenium/grid/sessionqueue/ClearSessionQueue.java @@ -23,7 +23,7 @@ import static org.openqa.selenium.remote.tracing.Tags.HTTP_REQUEST; import static org.openqa.selenium.remote.tracing.Tags.HTTP_RESPONSE; -import com.google.common.collect.ImmutableMap; +import java.util.Map; import org.openqa.selenium.internal.Require; import org.openqa.selenium.remote.http.HttpHandler; import org.openqa.selenium.remote.http.HttpRequest; @@ -56,14 +56,14 @@ public HttpResponse execute(HttpRequest req) { if (value != 0) { response.setContent( asJson( - ImmutableMap.of( + Map.of( "value", value, "message", "Cleared the new session request queue", "cleared_requests", value))); } else { response.setContent( asJson( - ImmutableMap.of( + Map.of( "value", value, "message", @@ -81,7 +81,7 @@ public HttpResponse execute(HttpRequest req) { .setStatus((HTTP_INTERNAL_ERROR)) .setContent( asJson( - ImmutableMap.of( + Map.of( "value", 0, "message", diff --git a/java/src/org/openqa/selenium/grid/sessionqueue/httpd/DefaultNewSessionQueueConfig.java b/java/src/org/openqa/selenium/grid/sessionqueue/httpd/DefaultNewSessionQueueConfig.java index 4b8fccaa867b8..aeb939a0ac9e9 100644 --- a/java/src/org/openqa/selenium/grid/sessionqueue/httpd/DefaultNewSessionQueueConfig.java +++ b/java/src/org/openqa/selenium/grid/sessionqueue/httpd/DefaultNewSessionQueueConfig.java @@ -17,12 +17,12 @@ package org.openqa.selenium.grid.sessionqueue.httpd; -import com.google.common.collect.ImmutableMap; +import java.util.Map; import org.openqa.selenium.grid.config.MapConfig; class DefaultNewSessionQueueConfig extends MapConfig { DefaultNewSessionQueueConfig() { - super(ImmutableMap.of("server", ImmutableMap.of("port", 5559))); + super(Map.of("server", Map.of("port", 5559))); } } diff --git a/java/src/org/openqa/selenium/grid/sessionqueue/httpd/NewSessionQueueServer.java b/java/src/org/openqa/selenium/grid/sessionqueue/httpd/NewSessionQueueServer.java index e02eeeb2aa29e..8b0ac89044350 100644 --- a/java/src/org/openqa/selenium/grid/sessionqueue/httpd/NewSessionQueueServer.java +++ b/java/src/org/openqa/selenium/grid/sessionqueue/httpd/NewSessionQueueServer.java @@ -25,12 +25,11 @@ import static org.openqa.selenium.remote.http.Route.get; import com.google.auto.service.AutoService; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; import java.io.Closeable; import java.io.IOException; import java.io.UncheckedIOException; import java.util.Collections; +import java.util.Map; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; @@ -65,7 +64,7 @@ public String getDescription() { @Override public Set getConfigurableRoles() { - return ImmutableSet.of(HTTPD_ROLE, SESSION_QUEUE_ROLE); + return Set.of(HTTPD_ROLE, SESSION_QUEUE_ROLE); } @Override @@ -100,9 +99,9 @@ protected Handlers createHandlers(Config config) { .addHeader("Content-Type", JSON_UTF_8) .setContent( asJson( - ImmutableMap.of( + Map.of( "value", - ImmutableMap.of( + Map.of( "ready", true, "message", diff --git a/java/src/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueue.java b/java/src/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueue.java index 66be16397885e..a225ca3e5386c 100644 --- a/java/src/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueue.java +++ b/java/src/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueue.java @@ -22,8 +22,6 @@ import static org.openqa.selenium.concurrent.ExecutorServices.shutdownGracefully; import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; import java.io.Closeable; import java.time.Duration; import java.time.Instant; @@ -180,7 +178,7 @@ private void timeoutSessions() { sessionRequest.getRequestId().equals(entry.getKey()))) .filter(entry -> isTimedOut(now, entry.getValue())) .map(Map.Entry::getKey) - .collect(ImmutableSet.toImmutableSet()); + .collect(Collectors.toSet()); } finally { readLock.unlock(); } @@ -258,9 +256,9 @@ public HttpResponse addToQueue(SessionRequest request) { res.setStatus(HTTP_INTERNAL_ERROR) .setContent( Contents.asJson( - ImmutableMap.of( + Map.of( "value", - ImmutableMap.of( + Map.of( "error", "session not created", "message", result.left().getMessage(), "stacktrace", result.left().getStackTrace())))); diff --git a/java/src/org/openqa/selenium/grid/web/CheckContentTypeHeader.java b/java/src/org/openqa/selenium/grid/web/CheckContentTypeHeader.java index 347b477a311ae..1621b8a3a64c2 100644 --- a/java/src/org/openqa/selenium/grid/web/CheckContentTypeHeader.java +++ b/java/src/org/openqa/selenium/grid/web/CheckContentTypeHeader.java @@ -19,9 +19,8 @@ import static java.net.HttpURLConnection.HTTP_INTERNAL_ERROR; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; import com.google.common.net.MediaType; +import java.util.Map; import java.util.Set; import org.openqa.selenium.internal.Require; import org.openqa.selenium.remote.http.Contents; @@ -36,9 +35,9 @@ public class CheckContentTypeHeader implements Filter { .setStatus(HTTP_INTERNAL_ERROR) .setContent( Contents.asJson( - ImmutableMap.of( + Map.of( "value", - ImmutableMap.of( + Map.of( "error", "unknown error", "message", "Content-Type header is missing", "stacktrace", "")))); @@ -46,8 +45,7 @@ public class CheckContentTypeHeader implements Filter { private final Set skipChecksOn; public CheckContentTypeHeader(Set skipChecksOn) { - this.skipChecksOn = - ImmutableSet.copyOf(Require.nonNull("URLs where checks are skipped", skipChecksOn)); + this.skipChecksOn = Set.copyOf(Require.nonNull("URLs where checks are skipped", skipChecksOn)); } @Override @@ -81,9 +79,9 @@ private HttpResponse badType(String type) { .setStatus(HTTP_INTERNAL_ERROR) .setContent( Contents.asJson( - ImmutableMap.of( + Map.of( "value", - ImmutableMap.of( + Map.of( "error", "unknown error", "message", "Content-Type header does not indicate utf-8 encoded json: " + type, diff --git a/java/src/org/openqa/selenium/grid/web/CheckOriginHeader.java b/java/src/org/openqa/selenium/grid/web/CheckOriginHeader.java index de36bf546769a..238c6f5c4b016 100644 --- a/java/src/org/openqa/selenium/grid/web/CheckOriginHeader.java +++ b/java/src/org/openqa/selenium/grid/web/CheckOriginHeader.java @@ -20,9 +20,8 @@ import static java.net.HttpURLConnection.HTTP_INTERNAL_ERROR; import static org.openqa.selenium.json.Json.JSON_UTF_8; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; import java.util.Collection; +import java.util.Map; import java.util.Set; import org.openqa.selenium.internal.Require; import org.openqa.selenium.remote.http.Contents; @@ -37,9 +36,8 @@ public class CheckOriginHeader implements Filter { public CheckOriginHeader(Collection allowedOriginHosts, Set skipChecksOn) { Require.nonNull("Allowed origins list", allowedOriginHosts); - allowedHosts = ImmutableSet.copyOf(allowedOriginHosts); - this.skipChecksOn = - ImmutableSet.copyOf(Require.nonNull("URLs where checks are skipped", skipChecksOn)); + allowedHosts = Set.copyOf(allowedOriginHosts); + this.skipChecksOn = Set.copyOf(Require.nonNull("URLs where checks are skipped", skipChecksOn)); } @Override @@ -58,9 +56,9 @@ public HttpHandler apply(HttpHandler httpHandler) { .addHeader("Content-Type", JSON_UTF_8) .setContent( Contents.asJson( - ImmutableMap.of( + Map.of( "value", - ImmutableMap.of( + Map.of( "error", "unknown error", "message", "Origin not allowed: " + origin, "stacktrace", "")))); diff --git a/java/src/org/openqa/selenium/grid/web/JarFileResource.java b/java/src/org/openqa/selenium/grid/web/JarFileResource.java index bee53ef725e55..a3577f2fc5a41 100644 --- a/java/src/org/openqa/selenium/grid/web/JarFileResource.java +++ b/java/src/org/openqa/selenium/grid/web/JarFileResource.java @@ -17,7 +17,6 @@ package org.openqa.selenium.grid.web; -import com.google.common.collect.ImmutableSet; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; @@ -25,6 +24,7 @@ import java.util.Optional; import java.util.Set; import java.util.jar.JarFile; +import java.util.stream.Collectors; import java.util.zip.ZipEntry; import org.openqa.selenium.internal.Require; @@ -88,7 +88,7 @@ public boolean isDirectory() { @Override public Set list() { if (!isDirectory()) { - return ImmutableSet.of(); + return Set.of(); } String prefix = entryName.endsWith("/") ? entryName : entryName + "/"; @@ -100,7 +100,7 @@ public Set list() { .filter(e -> !e.getName().equals(prefix)) .filter(e -> e.getName().split("/").length == count) .map(e -> new JarFileResource(jarFile, e.getName(), prefix)) - .collect(ImmutableSet.toImmutableSet()); + .collect(Collectors.toUnmodifiableSet()); } @Override diff --git a/java/src/org/openqa/selenium/grid/web/MergedResource.java b/java/src/org/openqa/selenium/grid/web/MergedResource.java index 6cae14aa04a73..7e43268f4811f 100644 --- a/java/src/org/openqa/selenium/grid/web/MergedResource.java +++ b/java/src/org/openqa/selenium/grid/web/MergedResource.java @@ -17,7 +17,8 @@ package org.openqa.selenium.grid.web; -import com.google.common.collect.ImmutableSet; +import java.util.Collections; +import java.util.HashSet; import java.util.Optional; import java.util.Set; import org.openqa.selenium.internal.Require; @@ -66,10 +67,9 @@ public boolean isDirectory() { @Override public Set list() { - ImmutableSet.Builder resources = ImmutableSet.builder(); - resources.addAll(base.list()); + Set resources = new HashSet<>(base.list()); next.ifPresent(res -> resources.addAll(res.list())); - return resources.build(); + return Collections.unmodifiableSet(resources); } @Override diff --git a/java/src/org/openqa/selenium/grid/web/NoHandler.java b/java/src/org/openqa/selenium/grid/web/NoHandler.java index 744884606bd4a..f8e18fa6fa881 100644 --- a/java/src/org/openqa/selenium/grid/web/NoHandler.java +++ b/java/src/org/openqa/selenium/grid/web/NoHandler.java @@ -22,7 +22,6 @@ import static java.nio.charset.StandardCharsets.UTF_8; import static org.openqa.selenium.remote.http.Contents.bytes; -import com.google.common.collect.ImmutableMap; import java.io.UncheckedIOException; import java.util.Collections; import java.util.HashMap; @@ -48,7 +47,7 @@ public HttpResponse execute(HttpRequest req) throws UncheckedIOException { responseMap.put("sessionId", null); responseMap.put( "value", - ImmutableMap.of( + Map.of( "error", "unknown command", "message", String.format( diff --git a/java/src/org/openqa/selenium/grid/web/PathResource.java b/java/src/org/openqa/selenium/grid/web/PathResource.java index 9172c91244c33..0cf5f2f9442bd 100644 --- a/java/src/org/openqa/selenium/grid/web/PathResource.java +++ b/java/src/org/openqa/selenium/grid/web/PathResource.java @@ -17,8 +17,6 @@ package org.openqa.selenium.grid.web; -import static com.google.common.collect.ImmutableSet.toImmutableSet; - import java.io.IOException; import java.io.UncheckedIOException; import java.nio.file.Files; @@ -27,6 +25,7 @@ import java.util.Optional; import java.util.Set; import java.util.function.Predicate; +import java.util.stream.Collectors; import java.util.stream.Stream; import org.openqa.selenium.internal.Require; @@ -86,7 +85,10 @@ public boolean isDirectory() { @Override public Set list() { try (Stream files = Files.list(base)) { - return files.filter(allowedSubpaths).map(PathResource::new).collect(toImmutableSet()); + return files + .filter(allowedSubpaths) + .map(PathResource::new) + .collect(Collectors.toUnmodifiableSet()); } catch (IOException e) { throw new UncheckedIOException(e); } diff --git a/java/src/org/openqa/selenium/grid/web/ReverseProxyHandler.java b/java/src/org/openqa/selenium/grid/web/ReverseProxyHandler.java index 8fb0b91eb3bd8..edf7d574f38a3 100644 --- a/java/src/org/openqa/selenium/grid/web/ReverseProxyHandler.java +++ b/java/src/org/openqa/selenium/grid/web/ReverseProxyHandler.java @@ -21,9 +21,9 @@ import static org.openqa.selenium.remote.tracing.Tags.HTTP_REQUEST; import static org.openqa.selenium.remote.tracing.Tags.HTTP_RESPONSE; -import com.google.common.collect.ImmutableSet; import java.io.UncheckedIOException; import java.util.Locale; +import java.util.Set; import java.util.logging.Logger; import org.openqa.selenium.internal.Require; import org.openqa.selenium.remote.http.HttpClient; @@ -37,19 +37,18 @@ public class ReverseProxyHandler implements HttpHandler, AutoCloseable { private static final Logger LOG = Logger.getLogger(ReverseProxyHandler.class.getName()); - private static final ImmutableSet IGNORED_REQ_HEADERS = - ImmutableSet.builder() - .add("connection") - .add("http2-settings") - .add("keep-alive") - .add("proxy-authorization") - .add("proxy-authenticate") - .add("proxy-connection") - .add("te") - .add("trailer") - .add("transfer-encoding") - .add("upgrade") - .build(); + private static final Set IGNORED_REQ_HEADERS = + Set.of( + "connection", + "http2-settings", + "keep-alive", + "proxy-authorization", + "proxy-authenticate", + "proxy-connection", + "te", + "trailer", + "transfer-encoding", + "upgrade"); private final Tracer tracer; private final HttpClient upstream; diff --git a/java/src/org/openqa/selenium/grid/web/RoutableHttpClientFactory.java b/java/src/org/openqa/selenium/grid/web/RoutableHttpClientFactory.java index d3576bd9f922e..e65ee82dccc35 100644 --- a/java/src/org/openqa/selenium/grid/web/RoutableHttpClientFactory.java +++ b/java/src/org/openqa/selenium/grid/web/RoutableHttpClientFactory.java @@ -19,10 +19,10 @@ import static org.openqa.selenium.remote.http.Contents.asJson; -import com.google.common.collect.ImmutableMap; import java.io.UncheckedIOException; import java.net.URI; import java.net.URL; +import java.util.Map; import org.openqa.selenium.UnsupportedCommandException; import org.openqa.selenium.internal.Require; import org.openqa.selenium.remote.http.ClientConfig; @@ -61,7 +61,7 @@ public HttpResponse execute(HttpRequest request) throws UncheckedIOException { response.setStatus(404); response.setContent( asJson( - ImmutableMap.of( + Map.of( "value", request.getUri(), "message", "Unable to route " + request, "error", UnsupportedCommandException.class.getName()))); From 2a3b3af1947121f3cb38a6355a2a43686ea4112c Mon Sep 17 00:00:00 2001 From: Puja Jagani Date: Fri, 22 Aug 2025 15:12:41 +0530 Subject: [PATCH 2/3] Ensure sets maintain insertion order --- .../grid/sessionqueue/local/LocalNewSessionQueue.java | 7 ++++++- java/src/org/openqa/selenium/grid/web/JarFileResource.java | 7 ++++++- java/src/org/openqa/selenium/grid/web/MergedResource.java | 5 +++-- java/src/org/openqa/selenium/grid/web/PathResource.java | 7 ++++++- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/java/src/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueue.java b/java/src/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueue.java index a225ca3e5386c..0c76b00cc762c 100644 --- a/java/src/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueue.java +++ b/java/src/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueue.java @@ -25,8 +25,10 @@ import java.io.Closeable; import java.time.Duration; import java.time.Instant; +import java.util.Collections; import java.util.Deque; import java.util.Iterator; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Optional; @@ -178,7 +180,10 @@ private void timeoutSessions() { sessionRequest.getRequestId().equals(entry.getKey()))) .filter(entry -> isTimedOut(now, entry.getValue())) .map(Map.Entry::getKey) - .collect(Collectors.toSet()); + .collect( + Collectors.collectingAndThen( + Collectors.toCollection(LinkedHashSet::new), + set -> Collections.unmodifiableSet(new LinkedHashSet<>(set)))); } finally { readLock.unlock(); } diff --git a/java/src/org/openqa/selenium/grid/web/JarFileResource.java b/java/src/org/openqa/selenium/grid/web/JarFileResource.java index a3577f2fc5a41..29642bea52dbc 100644 --- a/java/src/org/openqa/selenium/grid/web/JarFileResource.java +++ b/java/src/org/openqa/selenium/grid/web/JarFileResource.java @@ -21,6 +21,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.UncheckedIOException; +import java.util.Collections; +import java.util.LinkedHashSet; import java.util.Optional; import java.util.Set; import java.util.jar.JarFile; @@ -100,7 +102,10 @@ public Set list() { .filter(e -> !e.getName().equals(prefix)) .filter(e -> e.getName().split("/").length == count) .map(e -> new JarFileResource(jarFile, e.getName(), prefix)) - .collect(Collectors.toUnmodifiableSet()); + .collect( + Collectors.collectingAndThen( + Collectors.toCollection(LinkedHashSet::new), + set -> Collections.unmodifiableSet(new LinkedHashSet<>(set)))); } @Override diff --git a/java/src/org/openqa/selenium/grid/web/MergedResource.java b/java/src/org/openqa/selenium/grid/web/MergedResource.java index 7e43268f4811f..136c1a3892604 100644 --- a/java/src/org/openqa/selenium/grid/web/MergedResource.java +++ b/java/src/org/openqa/selenium/grid/web/MergedResource.java @@ -19,6 +19,7 @@ import java.util.Collections; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.Optional; import java.util.Set; import org.openqa.selenium.internal.Require; @@ -67,9 +68,9 @@ public boolean isDirectory() { @Override public Set list() { - Set resources = new HashSet<>(base.list()); + Set resources = new LinkedHashSet<>(base.list()); next.ifPresent(res -> resources.addAll(res.list())); - return Collections.unmodifiableSet(resources); + return Collections.unmodifiableSet(new LinkedHashSet<>(resources)); } @Override diff --git a/java/src/org/openqa/selenium/grid/web/PathResource.java b/java/src/org/openqa/selenium/grid/web/PathResource.java index 0cf5f2f9442bd..672c48a120881 100644 --- a/java/src/org/openqa/selenium/grid/web/PathResource.java +++ b/java/src/org/openqa/selenium/grid/web/PathResource.java @@ -22,6 +22,8 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashSet; import java.util.Optional; import java.util.Set; import java.util.function.Predicate; @@ -88,7 +90,10 @@ public Set list() { return files .filter(allowedSubpaths) .map(PathResource::new) - .collect(Collectors.toUnmodifiableSet()); + .collect( + Collectors.collectingAndThen( + Collectors.toCollection(LinkedHashSet::new), + set -> Collections.unmodifiableSet(new LinkedHashSet<>(set)))); } catch (IOException e) { throw new UncheckedIOException(e); } From 0cd818ea13564b98c41e515e5094908df843e5b4 Mon Sep 17 00:00:00 2001 From: Puja Jagani Date: Fri, 22 Aug 2025 16:16:59 +0530 Subject: [PATCH 3/3] Fix formatting --- .../grid/sessionqueue/local/LocalNewSessionQueue.java | 6 +++--- java/src/org/openqa/selenium/grid/web/MergedResource.java | 1 - java/src/org/openqa/selenium/grid/web/PathResource.java | 6 +++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/java/src/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueue.java b/java/src/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueue.java index 0c76b00cc762c..f9b506236948d 100644 --- a/java/src/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueue.java +++ b/java/src/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueue.java @@ -181,9 +181,9 @@ private void timeoutSessions() { .filter(entry -> isTimedOut(now, entry.getValue())) .map(Map.Entry::getKey) .collect( - Collectors.collectingAndThen( - Collectors.toCollection(LinkedHashSet::new), - set -> Collections.unmodifiableSet(new LinkedHashSet<>(set)))); + Collectors.collectingAndThen( + Collectors.toCollection(LinkedHashSet::new), + set -> Collections.unmodifiableSet(new LinkedHashSet<>(set)))); } finally { readLock.unlock(); } diff --git a/java/src/org/openqa/selenium/grid/web/MergedResource.java b/java/src/org/openqa/selenium/grid/web/MergedResource.java index 136c1a3892604..0a79342bc0b83 100644 --- a/java/src/org/openqa/selenium/grid/web/MergedResource.java +++ b/java/src/org/openqa/selenium/grid/web/MergedResource.java @@ -18,7 +18,6 @@ package org.openqa.selenium.grid.web; import java.util.Collections; -import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Optional; import java.util.Set; diff --git a/java/src/org/openqa/selenium/grid/web/PathResource.java b/java/src/org/openqa/selenium/grid/web/PathResource.java index 672c48a120881..ba1e507a1612d 100644 --- a/java/src/org/openqa/selenium/grid/web/PathResource.java +++ b/java/src/org/openqa/selenium/grid/web/PathResource.java @@ -91,9 +91,9 @@ public Set list() { .filter(allowedSubpaths) .map(PathResource::new) .collect( - Collectors.collectingAndThen( - Collectors.toCollection(LinkedHashSet::new), - set -> Collections.unmodifiableSet(new LinkedHashSet<>(set)))); + Collectors.collectingAndThen( + Collectors.toCollection(LinkedHashSet::new), + set -> Collections.unmodifiableSet(new LinkedHashSet<>(set)))); } catch (IOException e) { throw new UncheckedIOException(e); }