mailing list improvements
[org.ibex.mail.git] / src / org / ibex / mail / target / FileBasedMailbox.java
index e5a420a..0e7c6f9 100644 (file)
@@ -21,17 +21,22 @@ public class FileBasedMailbox extends Mailbox.Default {
 
     public static final long MAGIC_DATE = 0;
     private static final char slash = File.separatorChar;
-    private static final WeakHashMap<String,FileBasedMailbox> instances = new WeakHashMap<String,FileBasedMailbox>();
+    private static final WeakHashMap<String,Mailbox> instances = new WeakHashMap<String,Mailbox>();
     public String toString() { return "[FileBasedMailbox " + path.getAbsolutePath() + "]"; }
     public Mailbox slash(String name, boolean create) { return getFileBasedMailbox(path.getAbsolutePath()+slash+name, create); }
 
     // FIXME: should be a File()
-    public static synchronized FileBasedMailbox getFileBasedMailbox(String path, boolean create) {
+    public static synchronized Mailbox getFileBasedMailbox(String path, boolean create) {
         try {
-            FileBasedMailbox ret = instances.get(path);
+            Mailbox ret = instances.get(path);
             if (ret == null) {
                 if (!create && !(new File(path).exists())) return null;
-                instances.put(path, ret = new FileBasedMailbox(new File(path)));
+                if (new File(new File(path)+"/subscribers").exists()) {
+                    ret = new MailingList(new File(path), new FileBasedMailbox(new File(path)));
+                } else {
+                    ret = new FileBasedMailbox(new File(path));
+                }
+                instances.put(path, ret);
             }
             return ret;
         } catch (Exception e) {
@@ -69,19 +74,41 @@ public class FileBasedMailbox extends Mailbox.Default {
         String[] files = path.list();
         for(int i=0; i<files.length; i++) {
             try {
-                if (files[i].indexOf('.') != -1) files[i] = files[i].substring(0, files[i].indexOf('.'));
+                if (files[i].indexOf('.') == -1) continue;
+                if (files[i].charAt(0) == '.') continue;
+                files[i] = files[i].substring(0, files[i].indexOf('.'));
                 int n = Integer.parseInt(files[i]);
                 if (n>=uidNext) uidNext = n;
-            } catch(Exception e) { /* DELIBERATE */ }
+            } catch(Exception e) { Log.error(this, e); }
         }
     }
 
+    public String[] sort(String[] s) {
+        Arrays.sort(s);
+        return s;
+    }
+
+    public String[] files() {
+        String[] s = path.list(filter);
+        Arrays.sort(s, comparator);
+        return s;
+    }
+    
+    private static Comparator<String> comparator = new Comparator<String>() {
+        public int compare(String a, String b) {
+            if (a.indexOf('.')==-1) return a.compareTo(b);
+            if (b.indexOf('.')==-1) return a.compareTo(a);
+            int ai = Integer.parseInt(a.substring(0, a.indexOf('.')));
+            int bi = Integer.parseInt(b.substring(0, b.indexOf('.')));
+            return ai<bi ? -1 : ai>bi ? 1 : 0;
+        }
+    };
 
     public Mailbox.Iterator  iterator()           { return new Iterator(); }
     public synchronized void add(Message message) { add(message, Mailbox.Flag.RECENT); }
     public String[] children() {
         Vec vec = new Vec();
-        String[] list = path.list();
+        String[] list = sort(path.list());
         for(int i=0; i<list.length; i++) {
             File f = new File(path.getAbsolutePath() + slash + list[i]);
             if (f.isDirectory() && f.getName().charAt(0) != '.') vec.addElement(list[i]);
@@ -113,11 +140,14 @@ public class FileBasedMailbox extends Mailbox.Default {
         Log.info(this, path + " <= " + message.summary());
     }
 
+    private static FilenameFilter filter =
+        new FilenameFilter() { public boolean accept(File dir, String name) {
+            return name.endsWith(".");
+        } };
+
     private class Iterator extends Mailbox.Default.Iterator {
         int cur = -1;
-        String[] files = path.list(new FilenameFilter() { public boolean accept(File dir, String name) {
-            return name.endsWith(".");
-        } });
+        String[] files = files();
         private File file() { return new File(path.getAbsolutePath() + slash + files[cur]); }
         public boolean done() { return cur >= files.length; }
         public boolean next() { cur++; return !done(); }
@@ -261,8 +291,11 @@ public class FileBasedMailbox extends Mailbox.Default {
         private void banner(HttpServletRequest request, HttpServletResponse response) throws IOException {
             String basename = request.getServletPath();
             String realpath = getServletContext().getRealPath(basename);
+            /*
             MailingList list = MailingList.getMailingList(realpath);
             list.banner(request, response);
+            */
+            banner(request, response);
         }
 
         private void topright(HttpServletRequest request, HttpServletResponse response, String[][] messages) throws IOException {