1 17 package org.columba.mail.folder.temp; 18 19 import java.io.File ; 20 import java.io.InputStream ; 21 import java.util.Hashtable ; 22 import java.util.logging.Logger ; 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 51 public class TempFolder extends AbstractMessageFolder { 52 53 54 private static final Logger LOG = Logger.getLogger("org.columba.mail.folder.temp"); 55 56 protected IHeaderList headerList; 57 protected Hashtable messageList; 58 protected int nextUid = 0; 59 protected IColumbaMessage aktMessage; 60 61 66 public TempFolder(String path) { 67 super("temp-folder-name", "temp", path); 68 69 String dir = path + "temp"; 70 71 if (DiskIO.ensureDirectory(dir)) { 72 directoryFile = new File (dir); 73 } 74 75 headerList = new MemoryHeaderList(); 76 messageList = new Hashtable (); 77 78 setSearchEngine(new DefaultSearchEngine(this)); 79 } 80 81 public void clear() { 82 headerList.clear(); 83 messageList.clear(); 84 } 85 86 public Object [] getUids() throws Exception { 87 return messageList.keySet().toArray(); 88 } 89 90 protected Object generateNextUid() { 91 return new Integer (nextUid++); 92 } 93 94 public void setNextUid(int next) { 95 nextUid = next; 96 } 97 98 101 public boolean exists(Object uid) throws Exception { 102 return messageList.containsKey(uid); 103 } 104 105 108 public IHeaderList getHeaderList() throws Exception { 109 return headerList; 110 } 111 112 113 116 public void removeMessage(Object uid) throws Exception { 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 134 public MimeTree getMimePartTree(Object uid) throws Exception { 135 return ((IColumbaMessage) messageList.get(uid)).getMimePartTree(); 136 } 137 138 143 public IColumbaHeader getMessageHeader(Object uid) throws Exception { 144 ColumbaHeader header = (ColumbaHeader) headerList.get(uid); 145 146 return header; 147 } 148 149 153 public IColumbaMessage getMessage(Object uid) throws Exception { 154 IColumbaMessage message = (IColumbaMessage) messageList.get(uid); 155 156 return message; 157 } 158 159 163 public Object [] searchMessages(Filter filter, Object [] uids) 164 throws Exception { 165 return getSearchEngine().searchMessages(filter, uids); 166 } 167 168 172 public Object [] searchMessages(Filter filter) throws Exception { 173 return getSearchEngine().searchMessages(filter); 174 } 175 176 180 public String getDefaultChild() { 181 return null; 182 } 183 184 public String getName() { 185 return toString(); 186 } 187 188 public String toString() { 189 return (String ) getUserObject(); 190 } 191 192 public void innerCopy(IMailbox destFolder, Object [] uids) 195 throws Exception { 196 for (int i = 0; i < uids.length; i++) { 197 198 InputStream messageSourceStream = getMessageSourceStream(uids[i]); 199 destFolder.addMessage(messageSourceStream); 200 messageSourceStream.close(); 201 } 202 } 203 204 public Object addMessage(InputStream in, Attributes attributes, Flags flags) 205 throws Exception { 206 207 Message message = MessageParser.parse( 208 TempSourceFactory.createTempSource(in, -1)); 209 210 Object 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 240 public Object getAttribute(Object uid, String key) 241 throws Exception { 242 return ((ColumbaHeader) headerList.get(uid)).getAttributes().get(key); 243 } 244 245 250 public Flags getFlags(Object uid) throws Exception { 251 return ((ColumbaHeader) headerList.get(uid)).getFlags(); 252 } 253 254 public Attributes getAttributes(Object uid) throws Exception { 255 if (getHeaderList().exists(uid)) { 256 return getHeaderList().get(uid).getAttributes(); 257 } else { 258 return null; 259 } 260 } 261 262 268 public Header getHeaderFields(Object uid, String [] keys) 269 throws Exception { 270 IColumbaHeader header = ((IColumbaMessage) messageList.get(uid)).getHeader(); 271 272 Header subHeader = new Header(); 273 String value; 274 275 for (int i = 0; i < keys.length; i++) { 276 value = (String ) header.get(keys[i]); 277 278 if (value != null) { 279 subHeader.set(keys[i], value); 280 } 281 } 282 283 return subHeader; 284 } 285 286 291 public InputStream getMessageSourceStream(Object uid) 292 throws Exception { 293 return new SourceInputStream(((IColumbaMessage) messageList.get(uid)).getSource()); 294 } 295 296 302 public InputStream getMimePartBodyStream(Object uid, Integer [] address) 303 throws Exception { 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 318 public InputStream getMimePartSourceStream(Object uid, Integer [] address) 319 throws Exception { 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 uid, String key, Object value) 329 throws Exception { 330 ColumbaHeader header = (ColumbaHeader) getHeaderList().get(uid); 332 333 header.getAttributes().put(key, value); 334 } 335 336 339 public Object addMessage(InputStream in) throws Exception { 340 return addMessage(in, null, null); 341 } 342 343 347 public Object addMessage(IColumbaMessage message) throws Exception { 348 Object 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 364 public void removeFolder() throws Exception { 365 } 368 369 372 public Header getAllHeaderFields(Object uid) throws Exception { 373 IColumbaHeader header = ((IColumbaMessage) messageList.get(uid)).getHeader(); 374 375 return header.getHeader(); 376 } 377 } 378 | Popular Tags |