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.*;
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<String,Mailbox> instances = new WeakHashMap<String,Mailbox>();
+ private static final WeakHashMap<String,FileBasedMailbox> instances = new WeakHashMap<String,FileBasedMailbox>();
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) {
// 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);
// 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 {
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();