From 4ad869ca65409a2d6a2f3230dfc0405c1b35d5f9 Mon Sep 17 00:00:00 2001 From: adam Date: Mon, 18 Oct 2004 07:12:54 +0000 Subject: [PATCH] lots of fixes to FileBasedMailbox darcs-hash:20041018071254-5007d-da0cd1fdae2718c1b94786e2f6f66974616e938b.gz --- src/org/ibex/mail/Main.java | 4 +- src/org/ibex/mail/target/FileBasedMailbox.java | 80 ++++++++++++++++-------- 2 files changed, 55 insertions(+), 29 deletions(-) diff --git a/src/org/ibex/mail/Main.java b/src/org/ibex/mail/Main.java index 7a58382..821bff5 100644 --- a/src/org/ibex/mail/Main.java +++ b/src/org/ibex/mail/Main.java @@ -26,11 +26,11 @@ public class Main implements Listener { private static class Auth implements Login { public Account anonymous() { return null; } public Object login(String user, String pass, Class protocol) { - if (protocol == IMAP.class && user.endsWith("@gmail.com")) return GMail.getGMail(user, pass).getIMAP(); + //if (protocol == IMAP.class && user.endsWith("@gmail.com")) return GMail.getGMail(user, pass).getIMAP(); return login(user, pass); } public Account login(String user, String pass) { - if (user.indexOf("@gmail.com") != -1) return GMail.getGMail(user, pass); + //if (user.indexOf("@gmail.com") != -1) return GMail.getGMail(user, pass); if (!EtcPasswd.verify(user, pass)) return null; final Mailbox root = FileBasedMailbox.getFileBasedMailbox(Mailbox.STORAGE_ROOT + "/user", true); diff --git a/src/org/ibex/mail/target/FileBasedMailbox.java b/src/org/ibex/mail/target/FileBasedMailbox.java index 43a21c8..10dd7f9 100644 --- a/src/org/ibex/mail/target/FileBasedMailbox.java +++ b/src/org/ibex/mail/target/FileBasedMailbox.java @@ -20,7 +20,7 @@ public class FileBasedMailbox extends Mailbox.Default implements Serializable { private static final char slash = File.separatorChar; private static final WeakHashMap instances = new WeakHashMap(); public Mailbox slash(String name, boolean create) { return getFileBasedMailbox(path + slash + name, create); } - public static FileBasedMailbox getFileBasedMailbox(String path, boolean create) { + public static synchronized FileBasedMailbox getFileBasedMailbox(String path, boolean create) { try { FileBasedMailbox ret = instances.get(path); if (ret == null) { @@ -38,10 +38,11 @@ public class FileBasedMailbox extends Mailbox.Default implements Serializable { // Instance ////////////////////////////////////////////////////////////////////////////// private String path; - private FileLock lock; - private Prevayler prevayler; - private LinkedList cache; - private int uidNext; + private transient FileLock lock; + private transient Prevayler prevayler; + private transient ArrayList cache; + private transient int uidValidity; + private transient int uidNext; public static class CacheEntry implements Serializable { public MIME.Headers headers; @@ -64,34 +65,53 @@ public class FileBasedMailbox extends Mailbox.Default implements Serializable { private FileBasedMailbox(String path) throws MailException, IOException, ClassNotFoundException { new File(this.path = path).mkdirs(); new File(path + slash + ".cache").mkdirs(); + File uidValidityFile = new File(path + slash + ".uidValidity"); + if (!uidValidityFile.exists()) uidValidityFile.createNewFile(); + uidValidity = (int)(uidValidityFile.lastModified() & 0xffffffff); lock = new RandomAccessFile(this.path + slash + ".cache" + slash + "lock", "rw").getChannel().tryLock(); if (lock == null) throw new IOException("unable to lock FileBasedMailbox"); - prevayler = PrevaylerFactory.createPrevayler(new LinkedList(), path + slash + ".cache"); - cache = (LinkedList)prevayler.prevalentSystem(); - for(int i=0; i 0) return; - - Log.warn(this, "rebuilding cache for " + path); - String[] files = new File(path).list(new FilenameFilter() { - public boolean accept(File f, String s) { - return s.substring(1).indexOf('.') != -1 && !s.equals(".."); - } }); - for(int i=0; i(), path + slash + ".cache"); + cache = (ArrayList)prevayler.prevalentSystem(); + for(int i=0; i 1000 * 1) { + Log.warn(this, "rebuilding cache for " + path + ": " + Math.ceil((((float)i)/((float)files.length)) * 100)+ "%"); + last = System.currentTimeMillis(); + } + CacheEntry ce = new CacheEntry(new File(path + slash + files[i])); + entries[i] = ce; + uidNext = Math.max(uidNext, ce.uid()+1); + } + prevayler.execute(new Rebuild(entries)); } + Log.warn(this, "taking snapshot for " + path); prevayler.takeSnapshot(); } private static class Rebuild implements Transaction { - public final CacheEntry entry; - public Rebuild(CacheEntry entry) { this.entry = entry; } - public void executeOn(Object c, Date now) { synchronized(c) { ((LinkedList)c).add(entry); } } + public final CacheEntry[] entries; + public Rebuild(CacheEntry entry) { this.entries = new CacheEntry[] { entry }; } + public Rebuild(CacheEntry[] entries) { this.entries = entries; } + public void executeOn(Object c, Date now) { + synchronized(c) { + for(int i=0; i)c).add(entries[i]); + } + } } } public Mailbox.Iterator iterator() { return new Iterator(); } - public int uidValidity() { return (int)(new File(path).lastModified() & 0xffffffL); } + + public int uidValidity() { return uidValidity; } + public int uidNext() { return uidNext(false); } public int uidNext(boolean inc) { return inc ? uidNext++ : uidNext; } public synchronized void add(Message message) { add(message, Mailbox.Flag.RECENT); } @@ -99,7 +119,11 @@ public class FileBasedMailbox extends Mailbox.Default implements Serializable { public String[] children() { Vec vec = new Vec(); String[] list = new File(path).list(); - for(int i=0; i)c).get(ptr).seen(on); } }); } public void delete() { if (done()) return; -- 1.7.10.4