From fd6219356dda304f8ce6688b5bffcd914041046c Mon Sep 17 00:00:00 2001
From: zzz <zzz@i2pmail.org>
Date: Sun, 20 Jun 2021 09:28:10 -0400
Subject: [PATCH] Jetty: Case-insensitive sort on directory listing, put
 directories first

---
 .../net/i2p/servlet/I2PDefaultServlet.java    | 36 ++++++++++++++++++-
 1 file changed, 35 insertions(+), 1 deletion(-)

diff --git a/apps/jetty/java/src/net/i2p/servlet/I2PDefaultServlet.java b/apps/jetty/java/src/net/i2p/servlet/I2PDefaultServlet.java
index a85eb1acb4..1d839cba51 100644
--- a/apps/jetty/java/src/net/i2p/servlet/I2PDefaultServlet.java
+++ b/apps/jetty/java/src/net/i2p/servlet/I2PDefaultServlet.java
@@ -21,9 +21,11 @@
 package net.i2p.servlet;
 
 import java.io.IOException;
+import java.text.Collator;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Arrays;
+import java.util.Comparator;
 import java.util.Date;
 import java.util.Locale;
 import java.util.TimeZone;
@@ -40,6 +42,7 @@ import org.eclipse.jetty.util.URIUtil;
 import org.eclipse.jetty.util.resource.Resource;
 import org.eclipse.jetty.util.resource.ResourceCollection;
 
+import net.i2p.data.DataHelper;
 
 
 /**
@@ -192,7 +195,7 @@ public class I2PDefaultServlet extends DefaultServlet
         String[] ls = res.list();
         if (ls==null)
             return null;
-        Arrays.sort(ls);
+        DataHelper.sort(ls, new FileComparator(res));
         
         String decodedBase = URIUtil.decodePath(base);
         String title = "Directory: "+deTag(decodedBase);
@@ -270,6 +273,37 @@ public class I2PDefaultServlet extends DefaultServlet
         return buf.toString();
     }
     
+    /**
+     *  I2P
+     *
+     *  @since 0.9.51
+     */
+    private static class FileComparator implements Comparator<String> {
+        private final Comparator<Object> _coll;
+        private final Resource _base;
+
+        public FileComparator(Resource base) {
+            _base = base;
+            _coll = Collator.getInstance(Locale.US);
+        }
+
+        public int compare(String a, String b) {
+            Resource ra, rb;
+            try {
+                ra = _base.addPath(a);
+                rb = _base.addPath(b);
+            } catch (Exception e) { 
+                // see above
+                return 0;
+            }
+            boolean da = ra.isDirectory();
+            boolean db = rb.isDirectory();
+            if (da && !db) return -1;
+            if (!da && db) return 1;
+            return _coll.compare(a, b);
+        }
+    }
+
     /**
      * Copied unchanged from Resource.java
      *
-- 
GitLab