From 67bef3e1c03facba9602bd40820ac68b4365cac2 Mon Sep 17 00:00:00 2001 From: Thierry Boileau Date: Sun, 8 Mar 2026 17:22:27 +0100 Subject: [PATCH 1/2] Issue #1487: reuse Random instance --- changes.md | 5 +++-- .../main/java/org/restlet/routing/Router.java | 2 +- .../main/java/org/restlet/util/RouteList.java | 16 +++++++++------- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/changes.md b/changes.md index 2a8afd36f4..b21c80536e 100644 --- a/changes.md +++ b/changes.md @@ -1,8 +1,9 @@ Changes log =========== -- 2.6.1 (??-??-2025) - +- 2.6.1 (??-??-2026) + - Bugs fixed + - Reuse an instance of Random class in RandomUtils. Issue #1487. - 2.6.0 (29-06-2025) - 2.6 Release Candidate 2 (21-06-2025) diff --git a/org.restlet.java/org.restlet/src/main/java/org/restlet/routing/Router.java b/org.restlet.java/org.restlet/src/main/java/org/restlet/routing/Router.java index a35b73a990..ac3159808b 100644 --- a/org.restlet.java/org.restlet/src/main/java/org/restlet/routing/Router.java +++ b/org.restlet.java/org.restlet/src/main/java/org/restlet/routing/Router.java @@ -94,7 +94,7 @@ public class Router extends Restlet { /** * Each call will be randomly routed to one of the routes that reached the - * required score. If the random route selected is not a match then the + * required score. If the random route selected is not a match, then the * immediate next route is evaluated until one matching route is found. If we * get back to the initial random route selected with no match, then we return * null. Unless all the routes score above the required score, this mode will diff --git a/org.restlet.java/org.restlet/src/main/java/org/restlet/util/RouteList.java b/org.restlet.java/org.restlet/src/main/java/org/restlet/util/RouteList.java index d46f478162..ebc215e09a 100644 --- a/org.restlet.java/org.restlet/src/main/java/org/restlet/util/RouteList.java +++ b/org.restlet.java/org.restlet/src/main/java/org/restlet/util/RouteList.java @@ -34,14 +34,16 @@ * @see java.util.List */ public final class RouteList extends WrapperList { - /** The index of the last route used in the round robin mode. */ + /** The index of the last route used in the round-robin mode. */ private volatile int lastIndex; + /** Used when asked to return a random route. */ + private final Random random = new Random(); /** * Constructor. */ public RouteList() { - super(new CopyOnWriteArrayList()); + super(new CopyOnWriteArrayList<>()); this.lastIndex = -1; } @@ -51,7 +53,7 @@ public RouteList() { * @param delegate The delegate list. */ public RouteList(List delegate) { - super(new CopyOnWriteArrayList(delegate)); + super(new CopyOnWriteArrayList<>(delegate)); this.lastIndex = -1; } @@ -120,7 +122,7 @@ public synchronized Route getLast(Request request, Response response, float requ } /** - * Returns a next route match in a round robin mode for a given call. + * Returns a next route match in a round-robin mode for a given call. * * @param request The request to score. * @param response The response to score. @@ -159,7 +161,7 @@ public synchronized Route getRandom(Request request, Response response, float re int length = size(); if (length > 0) { - int j = new Random().nextInt(length); + int j = random.nextInt(length); Route route = get(j); if (route.score(request, response) >= requiredScore) { @@ -169,7 +171,7 @@ public synchronized Route getRandom(Request request, Response response, float re boolean loopedAround = false; do { - if ((j == length) && (loopedAround == false)) { + if ((j == length) && !loopedAround) { j = 0; loopedAround = true; } @@ -187,7 +189,7 @@ public synchronized Route getRandom(Request request, Response response, float re } /** - * Removes all routes routing to a given target. + * Removes all routes to a given target. * * @param target The target Restlet to detach. */ From 63aa104ee8f6a7100eea04f075df136755131b3f Mon Sep 17 00:00:00 2001 From: Thierry Boileau Date: Sun, 8 Mar 2026 17:32:55 +0100 Subject: [PATCH 2/2] Issue #1487: reuse Random instance --- .../org.restlet/src/main/java/org/restlet/util/RouteList.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/org.restlet.java/org.restlet/src/main/java/org/restlet/util/RouteList.java b/org.restlet.java/org.restlet/src/main/java/org/restlet/util/RouteList.java index ebc215e09a..d010aa51a2 100644 --- a/org.restlet.java/org.restlet/src/main/java/org/restlet/util/RouteList.java +++ b/org.restlet.java/org.restlet/src/main/java/org/restlet/util/RouteList.java @@ -14,9 +14,9 @@ import org.restlet.Restlet; import org.restlet.routing.Route; +import java.security.SecureRandom; import java.util.Collections; import java.util.List; -import java.util.Random; import java.util.concurrent.CopyOnWriteArrayList; /** @@ -37,7 +37,7 @@ public final class RouteList extends WrapperList { /** The index of the last route used in the round-robin mode. */ private volatile int lastIndex; /** Used when asked to return a random route. */ - private final Random random = new Random(); + private final SecureRandom random = new SecureRandom(); /** * Constructor.