1 package org.columba.mail.folder.headercache; 2 3 import java.io.IOException ; 4 import java.util.ArrayList ; 5 import java.util.Arrays ; 6 import java.util.Calendar ; 7 import java.util.Date ; 8 9 import org.columba.core.base.ListTools; 10 import org.columba.mail.folder.AbstractLocalFolder; 11 import org.columba.mail.folder.AbstractMessageFolder; 12 import org.columba.mail.folder.IDataStorage; 13 import org.columba.mail.folder.IMailboxInfo; 14 import org.columba.mail.folder.MailboxInfoInvalidException; 15 import org.columba.mail.message.ColumbaHeader; 16 import org.columba.mail.message.IColumbaHeader; 17 import org.columba.mail.message.IHeaderList; 18 import org.columba.ristretto.io.Source; 19 import org.columba.ristretto.message.Flags; 20 import org.columba.ristretto.parser.HeaderParser; 21 22 public class SyncHeaderList { 23 24 private static final int WEEK = 1000 * 60 * 60 * 24 * 7; 25 26 30 public static void sync(AbstractMessageFolder folder, IHeaderList headerList) 31 throws IOException { 32 if (folder.getObservable() != null) { 33 folder.getObservable().setMessage( 34 folder.getName() + ": Syncing headercache..."); 35 } 36 37 IDataStorage ds = ((AbstractLocalFolder) folder) 38 .getDataStorageInstance(); 39 40 Object [] uids = ds.getMessageUids(); 41 Object [] headerlistUids = headerList.getUids(); 42 43 ArrayList uidsToRemove = new ArrayList (Arrays.asList(headerlistUids)); 46 ListTools.substract(uidsToRemove, Arrays.asList(uids)); 47 for( Object u : uidsToRemove) { 48 headerList.remove(u); 49 } 50 51 Date today = Calendar.getInstance().getTime(); 52 53 IColumbaHeader header = null; 55 IMailboxInfo messageFolderInfo = folder.getMessageFolderInfo(); 56 messageFolderInfo.setExists(0); 57 messageFolderInfo.setRecent(0); 58 messageFolderInfo.setUnseen(0); 59 61 folder.setChanged(true); 62 63 if (folder.getObservable() != null) { 64 folder.getObservable().setMax(uids.length); 65 folder.getObservable().resetCurrent(); 66 } 67 68 for (int i = 0; i < uids.length; i++) { 69 70 if ((folder.getObservable() != null) && ((i % 100) == 0)) { 71 folder.getObservable().setCurrent(i); 72 } 73 74 if (!headerList.exists(uids[i])) { 75 try { 76 Source source = ds.getMessageSource(uids[i]); 77 78 if (source.length() == 0) { 79 ds.removeMessage(uids[i]); 80 81 continue; 82 } 83 84 header = new ColumbaHeader(HeaderParser.parse(source)); 85 86 String messageID = (String ) header.get("Message-Id"); 88 if (messageID != null) 89 header.set("Message-ID", header.get("Message-Id")); 90 91 header = CachedHeaderfields.stripHeaders(header); 92 93 if (isOlderThanOneWeek(today, ((Date ) header 94 .getAttributes().get("columba.date")))) { 95 header.getFlags().set(Flags.SEEN); 96 } 97 98 int size = Math.max(source.length() / 1024, 1); 100 header.getAttributes().put("columba.size", 101 new Integer (size)); 102 103 header.getAttributes().put("columba.attachment", 105 header.hasAttachments()); 106 107 header.getAttributes().put("columba.uid", uids[i]); 108 109 headerList.add(header, uids[i]); 110 source.close(); 111 source = null; 112 } catch (Exception ex) { 113 ex.printStackTrace(); 114 } 115 } else { 116 header = headerList.get(uids[i]); 117 } 118 119 try { 120 messageFolderInfo.incExists(); 121 if (header.getFlags().getRecent()) { 122 messageFolderInfo.incRecent(); 123 } 124 125 if (!header.getFlags().getSeen()) { 126 messageFolderInfo.incUnseen(); 127 } 128 } catch (MailboxInfoInvalidException e) { 129 } 131 132 133 ((AbstractLocalFolder) folder) 134 .setNextMessageUid(((Integer ) uids[uids.length - 1]) 135 .intValue() + 1); 136 137 if ((folder.getObservable() != null) && ((i % 100) == 0)) { 138 folder.getObservable().setCurrent(i); 139 } 140 } 141 142 if (folder.getObservable() != null) { 144 folder.getObservable().resetCurrent(); 145 } 146 } 147 148 private static boolean isOlderThanOneWeek(Date arg0, Date arg1) { 149 return (arg0.getTime() - WEEK) > arg1.getTime(); 150 } 151 152 } 153 | Popular Tags |