You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2022/09/21 16:32:18 UTC

[tomcat] branch 10.0.x updated: Refactor. Replace BaseSessionComparator with Comparator.comparing...

This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch 10.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/10.0.x by this push:
     new 2fe9e5f515 Refactor. Replace BaseSessionComparator with Comparator.comparing...
2fe9e5f515 is described below

commit 2fe9e5f5154a59e876bab932bd63e1a37603229f
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Wed Sep 21 17:31:58 2022 +0100

    Refactor. Replace BaseSessionComparator with Comparator.comparing...
    
    Simplifies existing code. No functional change.
---
 .../catalina/manager/HTMLManagerServlet.java       | 98 ++++++++--------------
 .../manager/util/BaseSessionComparator.java        |  3 +
 2 files changed, 39 insertions(+), 62 deletions(-)

diff --git a/java/org/apache/catalina/manager/HTMLManagerServlet.java b/java/org/apache/catalina/manager/HTMLManagerServlet.java
index 5e83630f5d..4e6de299bd 100644
--- a/java/org/apache/catalina/manager/HTMLManagerServlet.java
+++ b/java/org/apache/catalina/manager/HTMLManagerServlet.java
@@ -28,10 +28,10 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
-import java.util.Date;
 import java.util.List;
 import java.util.Locale;
 import java.util.Set;
+import java.util.function.Function;
 
 import jakarta.servlet.ServletException;
 import jakarta.servlet.http.HttpServletRequest;
@@ -44,7 +44,6 @@ import org.apache.catalina.Context;
 import org.apache.catalina.DistributedManager;
 import org.apache.catalina.Manager;
 import org.apache.catalina.Session;
-import org.apache.catalina.manager.util.BaseSessionComparator;
 import org.apache.catalina.manager.util.SessionUtils;
 import org.apache.catalina.util.ContextName;
 import org.apache.catalina.util.ServerInfo;
@@ -1079,79 +1078,54 @@ public final class HTMLManagerServlet extends ManagerServlet {
     protected Comparator<Session> getComparator(String sortBy) {
         Comparator<Session> comparator = null;
         if ("CreationTime".equalsIgnoreCase(sortBy)) {
-            comparator = new BaseSessionComparator<Date>() {
-                @Override
-                public Comparable<Date> getComparableObject(Session session) {
-                    return new Date(session.getCreationTime());
-                }
-            };
+            return Comparator.comparingLong(Session::getCreationTime);
+
         } else if ("id".equalsIgnoreCase(sortBy)) {
-            comparator = new BaseSessionComparator<String>() {
-                @Override
-                public Comparable<String> getComparableObject(Session session) {
-                    return session.getId();
-                }
-            };
+            return comparingNullable(Session::getId);
+
         } else if ("LastAccessedTime".equalsIgnoreCase(sortBy)) {
-            comparator = new BaseSessionComparator<Date>() {
-                @Override
-                public Comparable<Date> getComparableObject(Session session) {
-                    return new Date(session.getLastAccessedTime());
-                }
-            };
+            return Comparator.comparingLong(Session::getLastAccessedTime);
+
         } else if ("MaxInactiveInterval".equalsIgnoreCase(sortBy)) {
-            comparator = new BaseSessionComparator<Integer>() {
-                @Override
-                public Comparable<Integer> getComparableObject(Session session) {
-                    return Integer.valueOf(session.getMaxInactiveInterval());
-                }
-            };
+            return Comparator.comparingInt(Session::getMaxInactiveInterval);
+
         } else if ("new".equalsIgnoreCase(sortBy)) {
-            comparator = new BaseSessionComparator<Boolean>() {
-                @Override
-                public Comparable<Boolean> getComparableObject(Session session) {
-                    return Boolean.valueOf(session.getSession().isNew());
-                }
-            };
+            return Comparator.comparing(s -> Boolean.valueOf(s.getSession().isNew()));
+
         } else if ("locale".equalsIgnoreCase(sortBy)) {
-            comparator = new BaseSessionComparator<String>() {
-                @Override
-                public Comparable<String> getComparableObject(Session session) {
-                    return JspHelper.guessDisplayLocaleFromSession(session);
-                }
-            };
+            return Comparator.comparing(JspHelper::guessDisplayLocaleFromSession);
+
         } else if ("user".equalsIgnoreCase(sortBy)) {
-            comparator = new BaseSessionComparator<String>() {
-                @Override
-                public Comparable<String> getComparableObject(Session session) {
-                    return JspHelper.guessDisplayUserFromSession(session);
-                }
-            };
+            return comparingNullable(JspHelper::guessDisplayUserFromSession);
+
         } else if ("UsedTime".equalsIgnoreCase(sortBy)) {
-            comparator = new BaseSessionComparator<Date>() {
-                @Override
-                public Comparable<Date> getComparableObject(Session session) {
-                    return new Date(SessionUtils.getUsedTimeForSession(session));
-                }
-            };
+            return Comparator.comparingLong(SessionUtils::getUsedTimeForSession);
+
         } else if ("InactiveTime".equalsIgnoreCase(sortBy)) {
-            comparator = new BaseSessionComparator<Date>() {
-                @Override
-                public Comparable<Date> getComparableObject(Session session) {
-                    return new Date(SessionUtils.getInactiveTimeForSession(session));
-                }
-            };
+            return Comparator.comparingLong(SessionUtils::getInactiveTimeForSession);
+
         } else if ("TTL".equalsIgnoreCase(sortBy)) {
-            comparator = new BaseSessionComparator<Date>() {
-                @Override
-                public Comparable<Date> getComparableObject(Session session) {
-                    return new Date(SessionUtils.getTTLForSession(session));
-                }
-            };
+            return Comparator.comparingLong(SessionUtils::getTTLForSession);
+
         }
         return comparator;
     }
 
+
+    /*
+     * Like Comparator.comparing() but allows objects being compared to be null.
+     * null values are ordered before all other values.
+     */
+    private static <U extends Comparable<? super U>> Comparator<Session> comparingNullable(
+            Function<Session, ? extends U> keyExtractor) {
+        return (s1, s2) -> {
+            U c1 = keyExtractor.apply(s1);
+            U c2 = keyExtractor.apply(s2);
+            return c1 == null ? (c2 == null ? 0 : -1) : (c2 == null ? 1 : c1.compareTo(c2));
+        };
+    }
+
+
     // ------------------------------------------------------ Private Constants
 
     // These HTML sections are broken in relatively small sections, because of
diff --git a/java/org/apache/catalina/manager/util/BaseSessionComparator.java b/java/org/apache/catalina/manager/util/BaseSessionComparator.java
index 30f674ae0e..83ab783acb 100644
--- a/java/org/apache/catalina/manager/util/BaseSessionComparator.java
+++ b/java/org/apache/catalina/manager/util/BaseSessionComparator.java
@@ -26,7 +26,10 @@ import org.apache.catalina.Session;
  * @param <T> The type of the session content to be compared
  *
  * @author C&eacute;drik LIME
+ *
+ * @deprecated Unused. Will be removed in Tomcat 10.1.x
  */
+@Deprecated
 public abstract class BaseSessionComparator<T> implements Comparator<Session> {
 
     public abstract Comparable<T> getComparableObject(Session session);


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org