KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > mail > folder > temp > TempFolder


1 //The contents of this file are subject to the Mozilla Public License Version 1.1
2
//(the "License"); you may not use this file except in compliance with the
3
//License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
4
//
5
//Software distributed under the License is distributed on an "AS IS" basis,
6
//WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
7
//for the specific language governing rights and
8
//limitations under the License.
9
//
10
//The Original Code is "The Columba Project"
11
//
12
//The Initial Developers of the Original Code are Frederik Dietz and Timo Stich.
13
//Portions created by Frederik Dietz and Timo Stich are Copyright (C) 2003.
14
//
15
//All Rights Reserved.
16

17 package org.columba.mail.folder.temp;
18
19 import java.io.File JavaDoc;
20 import java.io.InputStream JavaDoc;
21 import java.util.Hashtable JavaDoc;
22 import java.util.logging.Logger JavaDoc;
23
24 import org.columba.api.command.IWorkerStatusController;
25 import org.columba.core.filter.Filter;
26 import org.columba.core.io.DiskIO;
27 import org.columba.mail.config.FolderItem;
28 import org.columba.mail.folder.AbstractMessageFolder;
29 import org.columba.mail.folder.IMailbox;
30 import org.columba.mail.folder.headercache.MemoryHeaderList;
31 import org.columba.mail.folder.imap.IMAPFolder;
32 import org.columba.mail.folder.search.DefaultSearchEngine;
33 import org.columba.mail.message.ColumbaHeader;
34 import org.columba.mail.message.ColumbaMessage;
35 import org.columba.mail.message.IColumbaHeader;
36 import org.columba.mail.message.IColumbaMessage;
37 import org.columba.mail.message.IHeaderList;
38 import org.columba.ristretto.io.SourceInputStream;
39 import org.columba.ristretto.io.TempSourceFactory;
40 import org.columba.ristretto.message.Attributes;
41 import org.columba.ristretto.message.Flags;
42 import org.columba.ristretto.message.Header;
43 import org.columba.ristretto.message.LocalMimePart;
44 import org.columba.ristretto.message.Message;
45 import org.columba.ristretto.message.MimeTree;
46 import org.columba.ristretto.parser.MessageParser;
47
48 /**
49  * @author freddy
50  */

51 public class TempFolder extends AbstractMessageFolder {
52
53     /** JDK 1.4+ logging framework logger, used for logging. */
54     private static final Logger JavaDoc LOG = Logger.getLogger("org.columba.mail.folder.temp");
55
56     protected IHeaderList headerList;
57     protected Hashtable JavaDoc messageList;
58     protected int nextUid = 0;
59     protected IColumbaMessage aktMessage;
60
61     /**
62      * Constructor for TempFolder.
63      *
64      * @param path example: /home/donald/mail/
65      */

66     public TempFolder(String JavaDoc path) {
67         super("temp-folder-name", "temp", path);
68
69         String JavaDoc dir = path + "temp";
70
71         if (DiskIO.ensureDirectory(dir)) {
72             directoryFile = new File JavaDoc(dir);
73         }
74
75         headerList = new MemoryHeaderList();
76         messageList = new Hashtable JavaDoc();
77         
78         setSearchEngine(new DefaultSearchEngine(this));
79     }
80
81     public void clear() {
82         headerList.clear();
83         messageList.clear();
84     }
85
86     public Object JavaDoc[] getUids() throws Exception JavaDoc {
87         return messageList.keySet().toArray();
88     }
89
90     protected Object JavaDoc generateNextUid() {
91         return new Integer JavaDoc(nextUid++);
92     }
93
94     public void setNextUid(int next) {
95         nextUid = next;
96     }
97
98     /**
99      * @see org.columba.modules.mail.folder.Folder#exists(Object)
100      */

101     public boolean exists(Object JavaDoc uid) throws Exception JavaDoc {
102         return messageList.containsKey(uid);
103     }
104
105     /**
106      * @see org.columba.modules.mail.folder.Folder#getHeaderList(IWorkerStatusController)
107      */

108     public IHeaderList getHeaderList() throws Exception JavaDoc {
109         return headerList;
110     }
111
112
113     /**
114      * @see org.columba.modules.mail.folder.Folder#remove(Object)
115      */

116     public void removeMessage(Object JavaDoc uid) throws Exception JavaDoc {
117         
118         Flags flags = getFlags(uid);
119         
120         fireMessageRemoved(uid, flags);
121                
122         headerList.remove(uid);
123         messageList.remove(uid);
124        
125         
126     }
127
128    
129
130     /**
131      * @see org.columba.modules.mail.folder.Folder#getMimeTree(Object,
132      * IMAPFolder)
133      */

134     public MimeTree getMimePartTree(Object JavaDoc uid) throws Exception JavaDoc {
135         return ((IColumbaMessage) messageList.get(uid)).getMimePartTree();
136     }
137
138     /**
139      * @see org.columba.modules.mail.folder.Folder#getMessageHeader(Object,
140      * IWorkerStatusController)
141      * @TODO dont use deprecated method
142      */

143     public IColumbaHeader getMessageHeader(Object JavaDoc uid) throws Exception JavaDoc {
144         ColumbaHeader header = (ColumbaHeader) headerList.get(uid);
145
146         return header;
147     }
148
149     /**
150      * @see org.columba.modules.mail.folder.Folder#getMessage(Object,
151      * IWorkerStatusController)
152      */

153     public IColumbaMessage getMessage(Object JavaDoc uid) throws Exception JavaDoc {
154         IColumbaMessage message = (IColumbaMessage) messageList.get(uid);
155
156         return message;
157     }
158
159     /**
160      * @see org.columba.modules.mail.folder.Folder#searchMessages(Filter,
161      * Object[], IWorkerStatusController)
162      */

163     public Object JavaDoc[] searchMessages(Filter filter, Object JavaDoc[] uids)
164         throws Exception JavaDoc {
165         return getSearchEngine().searchMessages(filter, uids);
166     }
167
168     /**
169      * @see org.columba.modules.mail.folder.Folder#searchMessages(Filter,
170      * IWorkerStatusController)
171      */

172     public Object JavaDoc[] searchMessages(Filter filter) throws Exception JavaDoc {
173         return getSearchEngine().searchMessages(filter);
174     }
175
176     /**
177      * @see org.columba.modules.mail.folder.FolderTreeNode#instanceNewChildNode(AdapterNode,
178      * FolderItem)
179      */

180     public String JavaDoc getDefaultChild() {
181         return null;
182     }
183
184     public String JavaDoc getName() {
185         return toString();
186     }
187
188     public String JavaDoc toString() {
189         return (String JavaDoc) getUserObject();
190     }
191
192     // FIXME (@author fdietz): Do we need this implementation in a TempFolder?
193
// If not, just put an empty method here, just like in VirtualFolder.
194
public void innerCopy(IMailbox destFolder, Object JavaDoc[] uids)
195         throws Exception JavaDoc {
196         for (int i = 0; i < uids.length; i++) {
197
198             InputStream JavaDoc messageSourceStream = getMessageSourceStream(uids[i]);
199             destFolder.addMessage(messageSourceStream);
200             messageSourceStream.close();
201         }
202     }
203
204     public Object JavaDoc addMessage(InputStream JavaDoc in, Attributes attributes, Flags flags)
205         throws Exception JavaDoc {
206
207         Message message = MessageParser.parse(
208                 TempSourceFactory.createTempSource(in, -1));
209
210         Object JavaDoc newUid = generateNextUid();
211
212         LOG.info("new UID=" + newUid);
213
214         ColumbaHeader h = new ColumbaHeader(message.getHeader());
215
216         if (attributes != null) {
217             h.setAttributes((Attributes) attributes.clone());
218         }
219         
220         if ( flags != null ) {
221             h.setFlags((Flags) flags.clone());
222         }
223
224         h.getAttributes().put("columba.uid", newUid);
225
226         headerList.add(h, newUid);
227
228         messageList.put(newUid, new ColumbaMessage(h, message));
229
230         fireMessageAdded(newUid, getFlags(newUid));
231         return newUid;
232     }
233
234     /*
235      * (non-Javadoc)
236      *
237      * @see org.columba.mail.folder.IMailbox#getAttribute(java.lang.Object,
238      * java.lang.String)
239      */

240     public Object JavaDoc getAttribute(Object JavaDoc uid, String JavaDoc key)
241         throws Exception JavaDoc {
242         return ((ColumbaHeader) headerList.get(uid)).getAttributes().get(key);
243     }
244
245     /*
246      * (non-Javadoc)
247      *
248      * @see org.columba.mail.folder.IMailbox#getFlags(java.lang.Object)
249      */

250     public Flags getFlags(Object JavaDoc uid) throws Exception JavaDoc {
251         return ((ColumbaHeader) headerList.get(uid)).getFlags();
252     }
253
254     public Attributes getAttributes(Object JavaDoc uid) throws Exception JavaDoc {
255         if (getHeaderList().exists(uid)) {
256             return getHeaderList().get(uid).getAttributes();
257         } else {
258             return null;
259         }
260     }
261
262     /*
263      * (non-Javadoc)
264      *
265      * @see org.columba.mail.folder.IMailbox#getHeaderFields(java.lang.Object,
266      * java.lang.String[])
267      */

268     public Header getHeaderFields(Object JavaDoc uid, String JavaDoc[] keys)
269         throws Exception JavaDoc {
270         IColumbaHeader header = ((IColumbaMessage) messageList.get(uid)).getHeader();
271
272         Header subHeader = new Header();
273         String JavaDoc value;
274
275         for (int i = 0; i < keys.length; i++) {
276             value = (String JavaDoc) header.get(keys[i]);
277
278             if (value != null) {
279                 subHeader.set(keys[i], value);
280             }
281         }
282
283         return subHeader;
284     }
285
286     /*
287      * (non-Javadoc)
288      *
289      * @see org.columba.mail.folder.IMailbox#getMessageSourceStream(java.lang.Object)
290      */

291     public InputStream JavaDoc getMessageSourceStream(Object JavaDoc uid)
292         throws Exception JavaDoc {
293         return new SourceInputStream(((IColumbaMessage) messageList.get(uid)).getSource());
294     }
295
296     /*
297      * (non-Javadoc)
298      *
299      * @see org.columba.mail.folder.IMailbox#getMimePartBodyStream(java.lang.Object,
300      * java.lang.Integer[])
301      */

302     public InputStream JavaDoc getMimePartBodyStream(Object JavaDoc uid, Integer JavaDoc[] address)
303         throws Exception JavaDoc {
304         IColumbaMessage message = (IColumbaMessage) messageList.get(uid);
305
306         LocalMimePart mimepart = (LocalMimePart) message.getMimePartTree()
307                                                         .getFromAddress(address);
308
309         return mimepart.getInputStream();
310     }
311
312     /*
313      * (non-Javadoc)
314      *
315      * @see org.columba.mail.folder.IMailbox#getMimePartSourceStream(java.lang.Object,
316      * java.lang.Integer[])
317      */

318     public InputStream JavaDoc getMimePartSourceStream(Object JavaDoc uid, Integer JavaDoc[] address)
319         throws Exception JavaDoc {
320         IColumbaMessage message = (IColumbaMessage) messageList.get(uid);
321
322         LocalMimePart mimepart = (LocalMimePart) message.getMimePartTree()
323                                                         .getFromAddress(address);
324
325         return new SourceInputStream(mimepart.getSource());
326     }
327
328     public void setAttribute(Object JavaDoc uid, String JavaDoc key, Object JavaDoc value)
329         throws Exception JavaDoc {
330         // get header with UID
331
ColumbaHeader header = (ColumbaHeader) getHeaderList().get(uid);
332
333         header.getAttributes().put(key, value);
334     }
335
336     /* (non-Javadoc)
337      * @see org.columba.mail.folder.IMailbox#addMessage(java.io.InputStream, org.columba.ristretto.message.Attributes)
338      */

339     public Object JavaDoc addMessage(InputStream JavaDoc in) throws Exception JavaDoc {
340         return addMessage(in, null, null);
341     }
342     
343     /**
344      * @see org.columba.modules.mail.folder.Folder#addMessage(AbstractMessage,
345      * IWorkerStatusController)
346      */

347     public Object JavaDoc addMessage(IColumbaMessage message) throws Exception JavaDoc {
348         Object JavaDoc newUid = generateNextUid();
349
350         ColumbaHeader h = (ColumbaHeader) ((ColumbaHeader) message.getHeader());
351
352         h.getAttributes().put("columba.uid", newUid);
353
354         headerList.add(h, newUid);
355
356         messageList.put(newUid, message);
357
358         return newUid;
359     }
360     
361     /**
362      * @see org.columba.mail.folder.AbstractFolder#removeFolder()
363      */

364     public void removeFolder() throws Exception JavaDoc {
365         //super.removeFolder();
366
// do nothing
367
}
368
369     /**
370      * @see org.columba.mail.folder.IMailbox#getAllHeaderFields(java.lang.Object)
371      */

372     public Header getAllHeaderFields(Object JavaDoc uid) throws Exception JavaDoc {
373         IColumbaHeader header = ((IColumbaMessage) messageList.get(uid)).getHeader();
374         
375         return header.getHeader();
376     }
377 }
378
Popular Tags