X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Fmail%2FFileBasedMailbox.java;h=4c9d4a59398accbf6f092f607a710a0f866cd7a5;hb=40e53cd3c7abe25902add4c97b8bc9202f3c8931;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..4c9d4a5 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,31 @@ 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; private static final char slash = File.separatorChar; - private static final WeakHashMap instances = new WeakHashMap(); + private static final WeakHashMap instances = new WeakHashMap(); 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) { 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 { - ret = new FileBasedMailbox(new File(path)); - } - instances.put(path, ret); + ret = new FileBasedMailbox(new File(path)); + instances.put(path, (FileBasedMailbox)ret); } return ret; } catch (Exception e) { @@ -68,6 +75,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); @@ -169,35 +177,20 @@ public class FileBasedMailbox extends Mailbox.Default { // UGLY: Apple Mail doesn't like UID=0, so we add one public int uid() { return done() ? -1 : 1+Integer.parseInt(files[cur].substring(0, files[cur].length()-1)); } - public void delete() { File f = file(); if (f != null && f.exists()) f.delete(); } - public int getFlags() { - return file().lastModified()==MAGIC_DATE ? 0 : Flag.SEEN; - } - public void setFlags(int flags) { + public int getFlags() { return file().lastModified()==MAGIC_DATE ? 0 : Flag.SEEN; } + public void setFlags(int flags) { File f = file(); if ((flags & Mailbox.Flag.SEEN) == 0) f.setLastModified(MAGIC_DATE); else if (f.lastModified()==MAGIC_DATE) f.setLastModified(System.currentTimeMillis()); - // FIXME - } - public Headers head() { - if (done()) return null; - FileInputStream fis = null; - try { - return new Headers.Original(new Stream(new FileInputStream(file()))); - } catch (IOException e) { throw new MailException.IOException(e); - } finally { if (fis != null) try { fis.close(); } catch (Exception e) { /* DELIBERATE */ } } - } - public Message cur() { - FileInputStream fis = null; - try { - return Message.newMessage(new Fountain.File(file())); - //} catch (IOException e) { throw new MailException.IOException(e); - } catch (Message.Malformed e) { throw new MailException(e.getMessage()); - } finally { if (fis != null) try { fis.close(); } catch (Exception e) { /* DELIBERATE */ } } + // FIXME: other flags? } + public Headers head() { return done() ? null : new Headers(new Fountain.File(file())); } + public Message cur() { return Message.newMessage(new Fountain.File(file())); } } + // there's no reason this has to operate on a FileBasedMailbox -- it could operate on arbitrary mailboxes! + // use this for file attachments: http://jakarta.apache.org/commons/fileupload/ public static class Servlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { doGet(request, response); } private void frames(HttpServletRequest request, HttpServletResponse response, boolean top) throws IOException { @@ -232,7 +225,7 @@ public class FileBasedMailbox extends Mailbox.Default { if (request.getServletPath().indexOf("..") != -1) throw new IOException(".. not allowed in image paths"); ServletContext cx = getServletContext(); String path = cx.getRealPath(request.getServletPath()); - Mailbox mbox = FileBasedMailbox.getFileBasedMailbox(path, false); + Mailbox mbox = FileBasedMailbox.getFileBasedMailbox(path, false).getMailbox(); if (mbox == null) throw new IOException("no such mailbox: " + path); Vec msgs = new Vec();