1 19 package org.columba.mail.folder.imap; 20 21 import java.io.ByteArrayInputStream ; 22 import java.io.ByteArrayOutputStream ; 23 import java.io.File ; 24 import java.io.IOException ; 25 import java.io.InputStream ; 26 import java.io.ObjectInputStream ; 27 import java.io.ObjectOutputStream ; 28 29 import org.columba.core.config.DefaultConfigDirectory; 30 import org.columba.core.io.StreamCache; 31 import org.columba.core.shutdown.ShutdownManager; 32 import org.columba.ristretto.message.MimeTree; 33 34 public class IMAPCache implements Runnable { 35 36 38 private StreamCache cache; 39 private static IMAPCache instance = new IMAPCache(); 40 41 protected IMAPCache() { 42 File configDir = DefaultConfigDirectory.getInstance().getCurrentPath(); 43 cache = new StreamCache(new File (configDir, "imap_cache")); 44 45 ShutdownManager.getInstance().register(this); 46 } 47 48 public static IMAPCache getInstance() { 49 return instance; 50 } 51 52 public void addMimeTree(IMAPFolder folder, Object uid, MimeTree mimeTree) throws IOException { 53 cache.activeAdd(createMimeTreeKey(folder, uid), convertToStream(mimeTree)); 54 } 55 56 public MimeTree getMimeTree(IMAPFolder folder, Object uid) throws IOException { 57 InputStream in = cache.get(createMimeTreeKey(folder, uid)); 58 if( in != null ) { 59 try { 60 return (MimeTree) new ObjectInputStream (in).readObject(); 61 } catch (Exception e) { 62 return null; 63 } 64 65 } else { 66 return null; 67 } 68 } 69 70 private InputStream convertToStream(Object o) throws IOException { 71 ByteArrayOutputStream out = new ByteArrayOutputStream (1024); 72 new ObjectOutputStream (out).writeObject(o); 73 74 return new ByteArrayInputStream (out.toByteArray()); 75 76 } 77 78 79 public InputStream addMimeBody(IMAPFolder folder, Object uid, Integer [] address, InputStream data ) throws IOException { 80 81 return cache.passiveAdd(createMimeBodyKey(folder, uid, address), data); 82 } 83 84 public InputStream getMimeBody(IMAPFolder folder, Object uid, Integer [] address) { 85 return cache.get(createMimeBodyKey(folder, uid, address)); 86 } 87 88 protected String createMimeBodyKey(IMAPFolder folder, Object uid, Integer [] address) { 89 return folder.getId() + uid.toString() + addressToString(address); 90 } 91 92 protected String createMimeTreeKey(IMAPFolder folder, Object uid) { 93 return folder.getId() + uid.toString(); 94 } 95 96 protected String addressToString(Integer [] address) { 97 String result = address[0].toString(); 98 for(int i=1; i<address.length; i++) { 99 result += "." + address[i]; 100 } 101 102 return result; 103 } 104 105 public void run() { 106 try { 108 cache.persist(); 109 } catch (IOException e) { 110 cache.clear(); 111 } 112 } 113 } 114 | Popular Tags |