KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > mail > folder > headercache > SyncHeaderList


1 package org.columba.mail.folder.headercache;
2
3 import java.io.IOException JavaDoc;
4 import java.util.ArrayList JavaDoc;
5 import java.util.Arrays JavaDoc;
6 import java.util.Calendar JavaDoc;
7 import java.util.Date JavaDoc;
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     /**
27      * @param worker
28      * @throws Exception
29      */

30     public static void sync(AbstractMessageFolder folder, IHeaderList headerList)
31             throws IOException JavaDoc {
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 JavaDoc[] uids = ds.getMessageUids();
41         Object JavaDoc[] headerlistUids = headerList.getUids();
42         
43         // First remove all headers that are in the headerlist but
44
// not the Folder
45
ArrayList JavaDoc uidsToRemove = new ArrayList JavaDoc(Arrays.asList(headerlistUids));
46         ListTools.substract(uidsToRemove, Arrays.asList(uids));
47         for( Object JavaDoc u : uidsToRemove) {
48             headerList.remove(u);
49         }
50         
51         Date JavaDoc today = Calendar.getInstance().getTime();
52
53         // parse all message files to recreate the header cache
54
IColumbaHeader header = null;
55         IMailboxInfo messageFolderInfo = folder.getMessageFolderInfo();
56         messageFolderInfo.setExists(0);
57         messageFolderInfo.setRecent(0);
58         messageFolderInfo.setUnseen(0);
59         // headerList.clear();
60

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                     // make sure that we have a Message-ID
87
String JavaDoc messageID = (String JavaDoc) 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 JavaDoc) header
94                             .getAttributes().get("columba.date")))) {
95                         header.getFlags().set(Flags.SEEN);
96                     }
97
98                     // message size should be at least 1 KB
99
int size = Math.max(source.length() / 1024, 1);
100                     header.getAttributes().put("columba.size",
101                             new Integer JavaDoc(size));
102
103                     // set the attachment flag
104
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 JavaDoc 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                 // Can't happen
130
}
131
132
133             ((AbstractLocalFolder) folder)
134                     .setNextMessageUid(((Integer JavaDoc) 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         // we are done
143
if (folder.getObservable() != null) {
144             folder.getObservable().resetCurrent();
145         }
146     }
147
148     private static boolean isOlderThanOneWeek(Date JavaDoc arg0, Date JavaDoc arg1) {
149         return (arg0.getTime() - WEEK) > arg1.getTime();
150     }
151
152 }
153
Popular Tags