X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Fmail%2FFileBasedMailbox.java;h=48e085350ae131dad75199c7a84d5e6cda3c1d71;hb=3530e2f2db09da8afef86fe06ae57510893e4a48;hp=2a614d7bab19c9c536b56622f3b7abd8f4821f0b;hpb=fa298f03c3a9f2b666970a528f30bac7e3bbf089;p=org.ibex.mail.git diff --git a/src/org/ibex/mail/FileBasedMailbox.java b/src/org/ibex/mail/FileBasedMailbox.java index 2a614d7..48e0853 100644 --- a/src/org/ibex/mail/FileBasedMailbox.java +++ b/src/org/ibex/mail/FileBasedMailbox.java @@ -6,7 +6,9 @@ package org.ibex.mail; import org.prevayler.*; import org.ibex.mail.*; import org.ibex.util.*; +import org.ibex.js.*; import org.ibex.io.*; +import org.ibex.io.Fountain; import java.io.*; import java.nio.*; import java.nio.channels.*; @@ -17,26 +19,41 @@ import javax.servlet.*; import javax.servlet.http.*; /** An exceptionally crude implementation of Mailbox relying on POSIXy filesystem semantics */ -public class FileBasedMailbox extends Mailbox.Default { +public class FileBasedMailbox extends Mailbox.Default implements MailTree { - public static final long MAGIC_DATE = 0; + public static final long MAGIC_DATE = 0; private static final char slash = File.separatorChar; - private static final WeakHashMap instances = new WeakHashMap(); + + // FIXME: ideally this should be weak, but we end up getting duplicates of SqliteMailboxes + private static final HashMap instances = new HashMap(); + public String toString() { return "[FileBasedMailbox " + path.getAbsolutePath() + "]"; } - public Mailbox slash(String name, boolean create) { return getFileBasedMailbox(path.getAbsolutePath()+slash+name, create); } + + public MailTree slash(String name, boolean create) { return getFileBasedMailbox(path.getAbsolutePath()+slash+name, create); } + + public void rmdir(String subdir) { throw new RuntimeException("FIXME not implemented"); } + public void rename(String subdir, MailTree newParent, String newName) { throw new RuntimeException("FIXME not implemented"); } + public Mailbox getMailbox() { return this; } + + public JS get(JS key) throws JSExn { + return (JS)slash(JSU.toString(key), true); + } // FIXME: should be a File() - public static synchronized Mailbox getFileBasedMailbox(String path, boolean create) { + public static synchronized MailTree getFileBasedMailbox(String path, boolean create) { + if (path.endsWith(".sqlite")) path = path.substring(0, path.length()-".sqlite".length()); try { - Mailbox ret = instances.get(path); + MailTree ret = instances.get(path); if (ret == null) { - if (!create && !(new File(path).exists())) return null; - if (new File(new File(path)+"/subscribers").exists()) { - ret = new MailingList(new File(path), new FileBasedMailbox(new File(path))); - } else { + Log.error("n", "no match for " + path + " in " + instances.hashCode()); + if (new File(path+".sqlite").exists()) + ret = new SqliteMailbox(path+".sqlite"); + else { + if (!create && !(new File(path).exists())) return null; ret = new FileBasedMailbox(new File(path)); } - instances.put(path, ret); + instances.put(path, (MailTree)ret); + Log.error("n", "filling " + path + " with " + instances.get(path)); } return ret; } catch (Exception e) { @@ -68,6 +85,7 @@ public class FileBasedMailbox extends Mailbox.Default { // acquire lock File lockfile = new File(this.path.getAbsolutePath() + slash + ".lock"); lock = new RandomAccessFile(lockfile, "rw").getChannel().tryLock(); + // FIXME!!! /* if (lock == null) { Log.warn(this, "warning: blocking waiting for a lock on " + path); @@ -118,6 +136,8 @@ public class FileBasedMailbox extends Mailbox.Default { for(int i=0; i