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 17:45:58 UTC

[tomcat] branch 9.0.x updated: Refactor. Replace custom Comparators with Comparator.comparing...

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

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


The following commit(s) were added to refs/heads/9.0.x by this push:
     new 88cf93b458 Refactor. Replace custom Comparators with Comparator.comparing...
88cf93b458 is described below

commit 88cf93b458c86ab9f7aa4e0fc002e5e51b6b7dbd
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Wed Sep 21 18:10:48 2022 +0100

    Refactor. Replace custom Comparators with Comparator.comparing...
    
    Simplifies existing code. No functional change.
---
 .../apache/catalina/servlets/DefaultServlet.java   | 107 ++++++---------------
 1 file changed, 30 insertions(+), 77 deletions(-)

diff --git a/java/org/apache/catalina/servlets/DefaultServlet.java b/java/org/apache/catalina/servlets/DefaultServlet.java
index 311137963c..b5a72fa09c 100644
--- a/java/org/apache/catalina/servlets/DefaultServlet.java
+++ b/java/org/apache/catalina/servlets/DefaultServlet.java
@@ -38,12 +38,12 @@ import java.nio.charset.StandardCharsets;
 import java.security.AccessController;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.Comparator;
 import java.util.Enumeration;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
+import java.util.function.Function;
 
 import javax.servlet.DispatcherType;
 import javax.servlet.RequestDispatcher;
@@ -2852,20 +2852,23 @@ public class DefaultServlet extends HttpServlet {
         protected Comparator<WebResource> resourceLastModifiedComparatorAsc;
 
         public SortManager(boolean directoriesFirst) {
-            resourceNameComparator = new ResourceNameComparator();
-            resourceNameComparatorAsc = Collections.reverseOrder(resourceNameComparator);
-            resourceSizeComparator = new ResourceSizeComparator(resourceNameComparator);
-            resourceSizeComparatorAsc = Collections.reverseOrder(resourceSizeComparator);
-            resourceLastModifiedComparator = new ResourceLastModifiedDateComparator(resourceNameComparator);
-            resourceLastModifiedComparatorAsc = Collections.reverseOrder(resourceLastModifiedComparator);
-
-            if(directoriesFirst) {
-                resourceNameComparator = new DirsFirstComparator(resourceNameComparator);
-                resourceNameComparatorAsc = new DirsFirstComparator(resourceNameComparatorAsc);
-                resourceSizeComparator = new DirsFirstComparator(resourceSizeComparator);
-                resourceSizeComparatorAsc = new DirsFirstComparator(resourceSizeComparatorAsc);
-                resourceLastModifiedComparator = new DirsFirstComparator(resourceLastModifiedComparator);
-                resourceLastModifiedComparatorAsc = new DirsFirstComparator(resourceLastModifiedComparatorAsc);
+            resourceNameComparator = Comparator.comparing(WebResource::getName);
+            resourceNameComparatorAsc = resourceNameComparator.reversed();
+            resourceSizeComparator =
+                    Comparator.comparing(WebResource::getContentLength).thenComparing(resourceNameComparator);
+            resourceSizeComparatorAsc = resourceSizeComparator.reversed();
+            resourceLastModifiedComparator =
+                    Comparator.comparing(WebResource::getLastModified).thenComparing(resourceNameComparator);
+            resourceLastModifiedComparatorAsc = resourceLastModifiedComparator.reversed();
+
+            if (directoriesFirst) {
+                Comparator<WebResource> dirsFirst = comparingTrueFirst(WebResource::isDirectory);
+                resourceNameComparator = dirsFirst.thenComparing(resourceNameComparator);
+                resourceNameComparatorAsc = dirsFirst.thenComparing(resourceNameComparatorAsc);
+                resourceSizeComparator = dirsFirst.thenComparing(resourceSizeComparator);
+                resourceSizeComparatorAsc = dirsFirst.thenComparing(resourceSizeComparatorAsc);
+                resourceLastModifiedComparator = dirsFirst.thenComparing(resourceLastModifiedComparator);
+                resourceLastModifiedComparatorAsc = dirsFirst.thenComparing(resourceLastModifiedComparatorAsc);
             }
 
             defaultResourceComparator = resourceNameComparator;
@@ -3009,74 +3012,24 @@ public class DefaultServlet extends HttpServlet {
     }
 
 
-    private static class DirsFirstComparator implements Comparator<WebResource> {
-        private final Comparator<WebResource> base;
-
-        public DirsFirstComparator(Comparator<WebResource> core) {
-            this.base = core;
-        }
-
-        @Override
-        public int compare(WebResource r1, WebResource r2) {
-            if(r1.isDirectory()) {
-                if(r2.isDirectory()) {
-                    return base.compare(r1, r2);
+    private static Comparator<WebResource> comparingTrueFirst(Function<WebResource,Boolean> keyExtractor) {
+        return (s1, s2) -> {
+            Boolean r1 = keyExtractor.apply(s1);
+            Boolean r2 = keyExtractor.apply(s2);
+            if (r1.booleanValue()) {
+                if (r2.booleanValue()) {
+                    return 0;
                 } else {
-                    return -1; // r1, directory, first
+                    return -1; // r1 (property is true) first
                 }
-            } else if(r2.isDirectory()) {
-                return 1; // r2, directory, first
+            } else if (r2.booleanValue()) {
+                return 1; // r2 (property is true) first
             } else {
-                return base.compare(r1, r2);
+                return 0;
             }
-        }
+        };
     }
 
-    private static class ResourceNameComparator implements Comparator<WebResource> {
-        @Override
-        public int compare(WebResource r1, WebResource r2) {
-            return r1.getName().compareTo(r2.getName());
-        }
-    }
-
-
-    private static class ResourceSizeComparator implements Comparator<WebResource> {
-        private Comparator<WebResource> base;
-
-        public ResourceSizeComparator(Comparator<WebResource> base) {
-            this.base = base;
-        }
-
-        @Override
-        public int compare(WebResource r1, WebResource r2) {
-            int c = Long.compare(r1.getContentLength(), r2.getContentLength());
-
-            if(0 == c) {
-                return base.compare(r1, r2);
-            } else {
-                return c;
-            }
-        }
-    }
-
-    private static class ResourceLastModifiedDateComparator implements Comparator<WebResource> {
-        private Comparator<WebResource> base;
-
-        public ResourceLastModifiedDateComparator(Comparator<WebResource> base) {
-            this.base = base;
-        }
-
-        @Override
-        public int compare(WebResource r1, WebResource r2) {
-            int c = Long.compare(r1.getLastModified(), r2.getLastModified());
-
-            if(0 == c) {
-                return base.compare(r1, r2);
-            } else {
-                return c;
-            }
-        }
-    }
 
     static enum BomConfig {
         /**


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