1 19 package org.columba.mail.folder.virtual; 20 21 import java.io.InputStream ; 22 import java.util.ArrayList ; 23 import java.util.Arrays ; 24 import java.util.Collections ; 25 import java.util.Comparator ; 26 import java.util.Enumeration ; 27 import java.util.Iterator ; 28 import java.util.List ; 29 import java.util.logging.Logger ; 30 31 import javax.swing.JDialog ; 32 33 import org.columba.api.command.IWorkerStatusController; 34 import org.columba.core.filter.Filter; 35 import org.columba.core.filter.FilterCriteria; 36 import org.columba.core.filter.FilterRule; 37 import org.columba.core.filter.IFilter; 38 import org.columba.core.filter.IFilterCriteria; 39 import org.columba.core.filter.IFilterRule; 40 import org.columba.core.xml.XmlElement; 41 import org.columba.mail.config.FolderItem; 42 import org.columba.mail.config.IFolderItem; 43 import org.columba.mail.filter.MailFilterCriteria; 44 import org.columba.mail.folder.AbstractLocalFolder; 45 import org.columba.mail.folder.AbstractMessageFolder; 46 import org.columba.mail.folder.FolderChildrenIterator; 47 import org.columba.mail.folder.FolderFactory; 48 import org.columba.mail.folder.IMailFolder; 49 import org.columba.mail.folder.IMailbox; 50 import org.columba.mail.folder.event.FolderListener; 51 import org.columba.mail.folder.event.IFolderEvent; 52 import org.columba.mail.folder.headercache.CachedHeaderfields; 53 import org.columba.mail.folder.headercache.MemoryHeaderList; 54 import org.columba.mail.folder.imap.IMAPFolder; 55 import org.columba.mail.folder.mh.CachedMHFolder; 56 import org.columba.mail.folder.search.DefaultSearchEngine; 57 import org.columba.mail.gui.config.search.SearchFrame; 58 import org.columba.mail.gui.frame.AbstractMailFrameController; 59 import org.columba.mail.gui.tree.FolderTreeModel; 60 import org.columba.mail.message.ColumbaHeader; 61 import org.columba.mail.message.ICloseableIterator; 62 import org.columba.mail.message.IHeaderList; 63 import org.columba.ristretto.message.Attributes; 64 import org.columba.ristretto.message.Flags; 65 import org.columba.ristretto.message.Header; 66 import org.columba.ristretto.message.MimeTree; 67 68 80 public class VirtualFolder extends AbstractMessageFolder implements 81 FolderListener { 82 83 private static final Logger LOG = Logger 84 .getLogger("org.columba.mail.folder.virtual"); 86 protected int nextUid; 87 88 protected IHeaderList headerList; 89 90 private boolean active; 91 92 private IMailFolder sourceFolder; 93 94 public VirtualFolder(FolderItem item, String path) { 96 super(item); 97 98 headerList = new MemoryHeaderList(); 99 100 ensureValidFilterElement(); 101 } 102 103 111 112 public VirtualFolder(String name) { 113 super(name, "VirtualFolder"); 114 115 IFolderItem item = getConfiguration(); 116 item.setString("property", "accessrights", "user"); 117 item.setString("property", "subfolder", "true"); 118 item.setString("property", "include_subfolders", "true"); 119 item.setString("property", "source_uid", "101"); 120 121 headerList = new MemoryHeaderList(); 122 123 ensureValidFilterElement(); 124 } 125 126 public VirtualFolder(String name, IMailFolder sourceFolder) { 127 this(name); 128 129 this.sourceFolder = sourceFolder; 130 } 131 132 133 134 private void registerWithSource() { 135 IMailFolder folder = getSourceFolder(); 136 137 folder.addFolderListener(this); 138 139 if (isRecursive()) { 140 FolderChildrenIterator it = new FolderChildrenIterator(folder); 141 142 while (it.hasMoreChildren()) { 143 IMailFolder next = it.nextChild(); 144 145 if (!(next instanceof VirtualFolder) 146 && (next instanceof IMailbox)) { 147 next.addFolderListener(this); 148 } 149 } 150 } 151 } 152 153 private void unregisterWithSource() { 154 IMailFolder folder = getSourceFolder(); 155 156 folder.removeFolderListener(this); 157 158 if (isRecursive()) { 159 FolderChildrenIterator it = new FolderChildrenIterator(folder); 160 161 while (it.hasMoreChildren()) { 162 IMailFolder next = it.nextChild(); 163 164 if (!(next instanceof VirtualFolder)) { 165 next.removeFolderListener(this); 166 } 167 } 168 } 169 } 170 171 174 private void ensureValidFilterElement() { 175 XmlElement filter = getConfiguration().getRoot().getElement("filter"); 176 177 if (filter == null) { 178 filter = new XmlElement("filter"); 179 filter.addAttribute("description", "new filter"); 180 filter.addAttribute("enabled", "true"); 181 getConfiguration().getRoot().addElement(filter); 182 } 183 184 if (filter.count() == 0) { 185 XmlElement rules = new XmlElement("rules"); 186 rules.addAttribute("condition", "matchall"); 187 188 XmlElement criteria = new XmlElement("criteria"); 189 criteria.addAttribute("type", "Subject"); 190 criteria.addAttribute("headerfield", "Subject"); 191 criteria.addAttribute("criteria", "contains"); 192 criteria.addAttribute("pattern", "pattern"); 193 rules.addElement(criteria); 194 filter.addElement(rules); 195 } 196 } 197 198 protected Object generateNextUid() { 199 return new Integer (nextUid++); 200 } 201 202 public void setNextUid(int next) { 203 nextUid = next; 204 } 205 206 public JDialog showFilterDialog(AbstractMailFrameController frameController) { 207 return new SearchFrame(frameController, this); 208 } 209 210 public boolean exists(Object uid) throws Exception { 211 return headerList.exists(uid); 212 } 213 214 public IHeaderList getHeaderList() throws Exception { 215 if (!active) { 216 activate(); 217 } else { 218 revalidateSearch(); 219 } 220 221 return headerList; 222 } 223 224 227 private void revalidateSearch() { 228 VirtualHeader h; 229 230 IFilter filter = (Filter) getFilter().clone(); 232 IFilterRule rule = filter.getFilterRule(); 233 for (int i = 0; i < rule.count(); i++) { 234 IFilterCriteria c = rule.get(i); 235 if (!c.getTypeString().equalsIgnoreCase("flags")) { 236 rule.remove(i); 237 i--; 238 } 239 } 240 241 if (rule.count() == 0) { 243 return; 244 } 245 246 ICloseableIterator it = headerList.headerIterator(); 248 while (it.hasNext()) { 249 h = (VirtualHeader) it.next(); 250 251 try { 252 if (h.getSrcFolder().searchMessages(filter, 253 new Object [] { h.getSrcUid() }).length == 0) { 254 it.remove(); 255 256 fireMessageRemoved(h.getVirtualUid(), h.getFlags()); 258 259 } 260 } catch (Exception e) { 261 e.printStackTrace(); 262 } 263 } 264 it.close(); 265 266 } 267 268 public void addSearchToHistory() throws Exception { 269 VirtualFolder searchFolder = (VirtualFolder) FolderTreeModel 270 .getInstance().getFolder("106"); 271 272 if (!searchFolder.equals(this)) { 274 return; 275 } 276 277 if (searchFolder.getChildCount() >= 3) { 282 AbstractMessageFolder child = (AbstractMessageFolder) searchFolder 283 .getChildAt(0); 284 child.removeFolder(); 285 } 286 287 String name = "search result"; 289 VirtualFolder newFolder = null; 290 291 try { 292 newFolder = (VirtualFolder) FolderFactory.getInstance() 293 .createChild(searchFolder, name, "VirtualFolder"); 294 } catch (Exception ex) { 295 ex.printStackTrace(); 296 297 return; 298 } 299 300 if (newFolder == null) { 302 return; 303 } 304 305 int uid = getConfiguration().getInteger("property", "source_uid"); 307 boolean includes = getConfiguration().getBoolean("property", 308 "include_subfolders"); 309 310 IFolderItem newFolderItem = newFolder.getConfiguration(); 311 newFolderItem.setInteger("property", "source_uid", uid); 312 newFolderItem.setBoolean("property", "include_subfolders", includes); 313 314 newFolderItem.getElement("filter").removeFromParent(); 315 newFolderItem.getRoot().addElement( 316 (XmlElement) getConfiguration().getElement("filter").clone()); 317 318 MailFilterCriteria newc = new MailFilterCriteria(new Filter( 319 getConfiguration().getElement("filter")).getFilterRule().get(0)); 320 321 332 333 StringBuffer buf = new StringBuffer (); 335 336 if (newc.getTypeString().equalsIgnoreCase("flags")) { 337 LOG.info("flags found"); 339 buf.append(newc.getTypeString()); 340 buf.append(" ("); 341 buf.append(newc.getCriteriaString()); 342 buf.append(" "); 343 buf.append(newc.getPatternString()); 344 buf.append(")"); 345 } else if (newc.getTypeString().equalsIgnoreCase("custom headerfield")) { 346 buf.append(newc.getHeaderfieldString()); 347 buf.append(" ("); 348 buf.append(newc.getCriteriaString()); 349 buf.append(" "); 350 buf.append(newc.getPatternString()); 351 buf.append(")"); 352 } else { 353 buf.append(newc.getTypeString()); 354 buf.append(" ("); 355 buf.append(newc.getCriteriaString()); 356 buf.append(" "); 357 buf.append(newc.getPatternString()); 358 buf.append(")"); 359 } 360 361 newFolder.setName(buf.toString()); 362 363 FolderTreeModel.getInstance().nodeStructureChanged(searchFolder); 365 366 FolderTreeModel.getInstance().nodeChanged(newFolder); 368 } 369 370 protected void applySearch() throws Exception { 371 IMailFolder srcFolder = getSourceFolder(); 372 373 XmlElement filter = getConfiguration().getRoot().getElement("filter"); 374 375 if (filter == null) { 376 filter = new XmlElement("filter"); 377 filter.addAttribute("description", "new filter"); 378 filter.addAttribute("enabled", "true"); 379 380 XmlElement rules = new XmlElement("rules"); 381 rules.addAttribute("condition", "match_all"); 382 383 XmlElement criteria = new XmlElement("criteria"); 384 criteria.addAttribute("type", "Subject"); 385 criteria.addAttribute("headerfield", "Subject"); 386 criteria.addAttribute("criteria", "contains"); 387 criteria.addAttribute("pattern", "pattern"); 388 rules.addElement(criteria); 389 filter.addElement(rules); 390 getConfiguration().getRoot().addElement(filter); 391 } 392 393 Filter f = new Filter(getConfiguration().getRoot().getElement("filter")); 394 395 applySearch(srcFolder, f); 396 } 397 398 401 IMailFolder getSourceFolder() { 402 403 String uid = getConfiguration().getString("property", "source_uid"); 404 405 if (sourceFolder != null && sourceFolder.getId().equals(uid)) return sourceFolder; 406 407 IMailFolder folder = (IMailFolder) FolderTreeModel.getInstance() 408 .getFolder(uid); 409 410 return folder; 411 } 412 413 protected void applySearch(IMailFolder parent, Filter filter) 414 throws Exception { 415 416 if (parent instanceof IMailbox) { 417 418 IMailbox folder = (IMailbox) parent; 419 420 423 Object [] resultUids = null; 424 425 if (folder instanceof VirtualFolder) 426 resultUids = folder.searchMessages(filter, folder.getUids()); 427 else 428 resultUids = folder.searchMessages(filter); 429 430 String [] headerfields = CachedHeaderfields.getDefaultHeaderfields(); 431 432 if (resultUids != null) { 433 for (int i = 0; i < resultUids.length; i++) { 434 ColumbaHeader header = null; 435 436 if (folder instanceof VirtualFolder) { 437 VirtualHeader virtualHeader = ((VirtualFolder) folder) 439 .getVirtualHeader(resultUids[i]); 440 IMailbox sourceFolder = virtualHeader.getSrcFolder(); 441 Object sourceUid = virtualHeader.getSrcUid(); 442 443 Header h = sourceFolder.getHeaderFields(sourceUid, 444 headerfields); 445 header = new ColumbaHeader(h); 446 header.setAttributes(sourceFolder 447 .getAttributes(sourceUid)); 448 header.setFlags(sourceFolder.getFlags(sourceUid)); 449 Object uid = add((ColumbaHeader) header, sourceFolder, 450 sourceUid); 451 fireMessageAdded(uid, getFlags(uid)); 452 } else { 453 if (!folder.exists(resultUids[i])) 454 continue; 455 456 Header h = folder.getHeaderFields(resultUids[i], 457 headerfields); 458 header = new ColumbaHeader(h); 459 header.setAttributes(folder 460 .getAttributes(resultUids[i])); 461 header.setFlags(folder.getFlags(resultUids[i])); 462 Object uid = add(header, folder, resultUids[i]); 463 fireMessageAdded(uid, getFlags(uid)); 464 465 } 466 467 } 468 } 469 470 } 471 472 if (isRecursive()) { 473 for (Enumeration e = parent.children(); e.hasMoreElements();) { 474 IMailFolder folder = (IMailFolder) e.nextElement(); 475 476 if (folder instanceof VirtualFolder) { 477 continue; 478 } 479 480 applySearch(folder, filter); 481 } 482 } 483 } 484 485 private boolean isRecursive() { 486 return Boolean.valueOf( 487 getConfiguration().getString("property", "include_subfolders")) 488 .booleanValue(); 489 } 490 491 public DefaultSearchEngine getSearchEngine() { 492 return null; 493 } 494 495 public Filter getFilter() { 496 return new Filter(getConfiguration().getRoot().getElement("filter")); 497 } 498 499 public Object add(ColumbaHeader header, IMailbox source, Object uid) 500 throws Exception { 501 Object newUid = generateNextUid(); 502 503 VirtualHeader virtualHeader = new VirtualHeader((ColumbaHeader) header, 505 source, uid); 506 virtualHeader.setVirtualUid(newUid); 507 508 headerList.add(virtualHeader, newUid); 509 510 return newUid; 511 } 512 513 517 public void markMessage(Object [] uids, int variant) throws Exception { 518 List list = new ArrayList (); 519 520 for (Object uid : uids) { 522 if (exists(uid)) { 523 list.add(uid); 524 } 525 } 526 if (list.size() == 0) 527 return; 528 529 Collections.sort(list, new Comparator () { 530 531 public int compare(Object o1, Object o2) { 532 VirtualHeader h = (VirtualHeader) headerList.get(o1); 533 String oV1 = h.getSrcFolder().getId(); 534 535 h = (VirtualHeader) headerList.get(o2); 536 String oV2 = h.getSrcFolder().getId(); 537 538 return oV1.compareTo(oV2); 539 } 540 }); 541 542 List folderUids = new ArrayList (uids.length); 543 Iterator it = list.iterator(); 544 545 VirtualHeader h = (VirtualHeader) headerList.get(it.next()); 546 ; 547 folderUids.add(h.getSrcUid()); 548 IMailbox srcFolder = h.getSrcFolder(); 549 550 while (it.hasNext()) { 551 h = (VirtualHeader) headerList.get(it.next()); 552 553 if (h.getSrcFolder() == srcFolder) { 554 folderUids.add(h.getSrcUid()); 555 } else { 556 srcFolder.markMessage(folderUids.toArray(), variant); 557 558 srcFolder = h.getSrcFolder(); 560 folderUids.clear(); 561 folderUids.add(h.getSrcUid()); 562 } 563 } 564 565 srcFolder.markMessage(folderUids.toArray(), variant); 566 } 567 568 571 public void removeMessage(Object uid) throws Exception { 572 573 VirtualHeader h = (VirtualHeader) headerList.get(uid); 575 IMailbox sourceFolder = h.getSrcFolder(); 576 Object sourceUid = h.getSrcUid(); 577 578 sourceFolder.removeMessage(sourceUid); 580 581 headerList.remove(uid); 583 584 fireMessageRemoved(uid, getFlags(uid)); 586 } 587 588 592 public MimeTree getMimePartTree(Object uid) throws Exception { 593 if (!exists(uid)) 594 return null; 595 596 VirtualHeader h = (VirtualHeader) headerList.get(uid); 597 IMailbox sourceFolder = h.getSrcFolder(); 598 Object sourceUid = h.getSrcUid(); 599 600 return sourceFolder.getMimePartTree(sourceUid); 601 } 602 603 610 public VirtualHeader getVirtualHeader(Object virtualUid) { 611 return (VirtualHeader) headerList.get(virtualUid); 612 } 613 614 618 public Object [] searchMessages(Filter filter, Object [] uids) 619 throws Exception { 620 if (!active) { 621 activate(); 622 } else { 623 revalidateSearch(); 624 } 625 626 if (uids.length == 0) 627 return new Object [0]; 628 629 List list = new ArrayList (Arrays.asList(uids)); 630 631 Collections.sort(list, new Comparator () { 632 633 public int compare(Object o1, Object o2) { 634 VirtualHeader h = (VirtualHeader) headerList.get(o1); 635 String oV1 = h.getSrcFolder().getId(); 636 637 h = (VirtualHeader) headerList.get(o2); 638 String oV2 = h.getSrcFolder().getId(); 639 640 return oV1.compareTo(oV2); 641 } 642 }); 643 644 List resultList = new ArrayList (); 645 646 List virtualHeader = new ArrayList (); 647 VirtualHeader h = (VirtualHeader) headerList.get(list.get(0)); 648 IMailbox sourceFolder = h.getSrcFolder(); 649 virtualHeader.add(h); 650 651 for (int i = 1; i < uids.length; i++) { 652 h = (VirtualHeader) headerList.get(list.get(i)); 653 654 if (h.getSrcFolder() != sourceFolder || i == uids.length - 1) { 655 658 Object [] srcUids = new Object [virtualHeader.size()]; 659 660 for (int j = 0; j < virtualHeader.size(); j++) { 662 srcUids[j] = ((VirtualHeader) virtualHeader.get(j)) 663 .getSrcUid(); 664 } 665 666 Object [] resultUids = sourceFolder.searchMessages(filter, 668 srcUids); 669 670 if ((resultUids != null) && (resultUids.length > 0)) { 672 Object [] virtualUids = new Object [resultUids.length]; 673 for (int j = 0; j < resultUids.length; j++) { 674 virtualUids[j] = srcUidToVirtualUid(sourceFolder, 675 resultUids[j]); 676 } 677 678 resultList.addAll(Arrays.asList(virtualUids)); 680 } 681 682 virtualHeader.clear(); 683 } 684 685 virtualHeader.add(h); 687 sourceFolder = h.getSrcFolder(); 688 } 689 if (virtualHeader.size() > 0) { 690 693 Object [] srcUids = new Object [virtualHeader.size()]; 694 695 for (int j = 0; j < virtualHeader.size(); j++) { 697 srcUids[j] = ((VirtualHeader) virtualHeader.get(j)).getSrcUid(); 698 } 699 700 Object [] resultUids = sourceFolder.searchMessages(filter, srcUids); 702 703 if ((resultUids != null) && (resultUids.length > 0)) { 705 Object [] virtualUids = new Object [resultUids.length]; 706 for (int j = 0; j < resultUids.length; j++) { 707 virtualUids[j] = srcUidToVirtualUid(sourceFolder, 708 resultUids[j]); 709 } 710 711 resultList.addAll(Arrays.asList(virtualUids)); 713 } 714 715 virtualHeader.clear(); 716 } 717 718 return resultList.toArray(); 719 } 720 721 public Object [] searchMessages(Filter filter) throws Exception { 722 723 return searchMessages(filter, getUids()); 724 } 725 726 730 public String getDefaultChild() { 731 return null; 732 } 733 734 public static XmlElement getDefaultProperties() { 735 XmlElement props = new XmlElement("property"); 736 props.addAttribute("accessrights", "user"); 737 props.addAttribute("subfolder", "true"); 738 props.addAttribute("include_subfolders", "true"); 739 props.addAttribute("source_uid", "101"); 740 741 return props; 742 } 743 744 793 794 797 public boolean tryToGetLock(Object locker) { 798 boolean success = super.tryToGetLock(locker); 800 if (!success) 801 return false; 802 803 IMailFolder folder = getSourceFolder(); 805 806 success &= folder.tryToGetLock(locker); 807 808 if (success && isRecursive()) { 809 FolderChildrenIterator it = new FolderChildrenIterator(folder); 810 811 while (success && it.hasMoreChildren()) { 812 IMailFolder next = it.nextChild(); 813 814 if (!(next instanceof VirtualFolder) 815 && (next instanceof IMailbox)) { 816 success &= next.tryToGetLock(locker); 817 } 818 } 819 } 820 821 if (!success) { 822 releaseLock(locker); 823 } 824 825 return success; 826 } 827 828 831 public void releaseLock(Object locker) { 832 super.releaseLock(locker); 833 834 IMailFolder folder = getSourceFolder(); 835 836 folder.releaseLock(locker); 837 838 if (isRecursive()) { 839 FolderChildrenIterator it = new FolderChildrenIterator(folder); 840 841 while (it.hasMoreChildren()) { 842 IMailFolder next = it.nextChild(); 843 844 if (!(next instanceof VirtualFolder) 845 && (next instanceof IMailbox)) { 846 next.releaseLock(locker); 847 } 848 } 849 } 850 851 } 852 853 858 public Object [] getUids() throws Exception { 859 if (!active) { 860 activate(); 861 } 862 863 return headerList.getUids(); 864 } 865 866 protected Object srcUidToVirtualUid(IMailFolder srcFolder, Object uid) { 867 ICloseableIterator it = headerList.headerIterator(); 868 869 while (it.hasNext()) { 870 VirtualHeader h = (VirtualHeader) it.next(); 871 if (h.getSrcUid().equals(uid) && h.getSrcFolder().equals(srcFolder)) { 872 it.close(); 873 return h.getVirtualUid(); 874 } 875 876 } 877 it.close(); 878 879 return null; 880 } 881 882 887 public Object addMessage(InputStream in) throws Exception { 888 return null; 890 } 891 892 898 public Object getAttribute(Object uid, String key) throws Exception { 899 VirtualHeader h = (VirtualHeader) headerList.get(uid); 900 IMailbox sourceFolder = h.getSrcFolder(); 901 Object sourceUid = h.getSrcUid(); 902 903 return sourceFolder.getAttribute(sourceUid, key); 904 } 905 906 911 public Flags getFlags(Object uid) throws Exception { 912 913 VirtualHeader h = (VirtualHeader) headerList.get(uid); 914 IMailbox sourceFolder = h.getSrcFolder(); 915 916 Object sourceUid = h.getSrcUid(); 917 918 return sourceFolder.getFlags(sourceUid); 919 } 920 921 927 public Header getHeaderFields(Object uid, String [] keys) throws Exception { 928 929 VirtualHeader h = (VirtualHeader) headerList.get(uid); 930 IMailbox sourceFolder = h.getSrcFolder(); 931 Object sourceUid = h.getSrcUid(); 932 933 return sourceFolder.getHeaderFields(sourceUid, keys); 934 } 935 936 941 public InputStream getMessageSourceStream(Object uid) throws Exception { 942 943 VirtualHeader h = (VirtualHeader) headerList.get(uid); 944 IMailbox sourceFolder = h.getSrcFolder(); 945 Object sourceUid = h.getSrcUid(); 946 947 return sourceFolder.getMessageSourceStream(sourceUid); 948 } 949 950 956 public InputStream getMimePartBodyStream(Object uid, Integer [] address) 957 throws Exception { 958 959 VirtualHeader h = (VirtualHeader) headerList.get(uid); 960 IMailbox sourceFolder = h.getSrcFolder(); 961 Object sourceUid = h.getSrcUid(); 962 963 return sourceFolder.getMimePartBodyStream(sourceUid, address); 964 } 965 966 972 public InputStream getMimePartSourceStream(Object uid, Integer [] address) 973 throws Exception { 974 975 VirtualHeader h = (VirtualHeader) headerList.get(uid); 976 IMailbox sourceFolder = h.getSrcFolder(); 977 Object sourceUid = h.getSrcUid(); 978 979 return sourceFolder.getMimePartSourceStream(sourceUid, address); 980 } 981 982 989 public boolean supportsAddMessage() { 990 return false; 991 } 992 993 1000 public boolean supportsAddFolder(String newFolderType) { 1001 return (newFolderType.equals(getType())); 1002 } 1003 1004 public void innerCopy(IMailbox destFolder, Object [] uids) throws Exception { 1005 List list = new ArrayList (); 1006 1007 for (Object uid : uids) { 1009 if (exists(uid)) { 1010 list.add(uid); 1011 } 1012 } 1013 if (list.size() == 0) 1014 return; 1015 1016 Collections.sort(list, new Comparator () { 1017 1018 public int compare(Object o1, Object o2) { 1019 VirtualHeader h = (VirtualHeader) headerList.get(o1); 1020 String oV1 = h.getSrcFolder().getId(); 1021 1022 h = (VirtualHeader) headerList.get(o2); 1023 String oV2 = h.getSrcFolder().getId(); 1024 1025 return oV1.compareTo(oV2); 1026 } 1027 }); 1028 1029 List folderUids = new ArrayList (uids.length); 1030 Iterator it = list.iterator(); 1031 1032 VirtualHeader h = (VirtualHeader) headerList.get(it.next()); 1033 ; 1034 folderUids.add(h.getSrcUid()); 1035 IMailbox srcFolder = h.getSrcFolder(); 1036 1037 while (it.hasNext()) { 1038 h = (VirtualHeader) headerList.get(it.next()); 1039 1040 if (h.getSrcFolder() == srcFolder) { 1041 folderUids.add(h.getSrcUid()); 1042 } else { 1043 srcFolder.innerCopy(destFolder, folderUids.toArray()); 1044 1045 srcFolder = h.getSrcFolder(); 1047 folderUids.clear(); 1048 folderUids.add(h.getSrcUid()); 1049 } 1050 } 1051 1052 srcFolder.innerCopy(destFolder, folderUids.toArray()); 1054 } 1055 1056 public void setAttribute(Object uid, String key, Object value) 1057 throws Exception { 1058 1063 1064 VirtualHeader h = (VirtualHeader) headerList.get(uid); 1065 h.getAttributes().put(key, value); 1066 IMailbox sourceFolder = h.getSrcFolder(); 1067 Object sourceUid = h.getSrcUid(); 1068 1069 sourceFolder.setAttribute(sourceUid, key, value); 1070 } 1071 1072 public Attributes getAttributes(Object uid) throws Exception { 1073 VirtualHeader h = (VirtualHeader) headerList.get(uid); 1074 IMailbox sourceFolder = h.getSrcFolder(); 1075 Object sourceUid = h.getSrcUid(); 1076 1077 return sourceFolder.getAttributes(sourceUid); 1078 1079 1083 } 1084 1085 1091 public Object addMessage(InputStream in, Attributes attributes, Flags flags) 1092 throws Exception { 1093 1094 1096 return null; 1097 } 1098 1099 1102 public boolean supportsMove() { 1103 return true; 1104 } 1105 1106 1109 public Header getAllHeaderFields(Object uid) throws Exception { 1110 VirtualHeader h = (VirtualHeader) headerList.get(uid); 1111 IMailbox sourceFolder = h.getSrcFolder(); 1112 Object sourceUid = h.getSrcUid(); 1113 1114 return sourceFolder.getAllHeaderFields(sourceUid); 1115 } 1116 1117 1120 public void expungeFolder() throws Exception { 1121 IMailFolder srcFolder = getSourceFolder(); 1122 1123 boolean isInclude = Boolean.valueOf( 1124 getConfiguration().getString("property", "include_subfolders")) 1125 .booleanValue(); 1126 1127 if (isInclude) { 1128 recursiveExpunge(srcFolder); 1129 } else { 1130 if (srcFolder instanceof IMailbox) 1131 ((IMailbox) srcFolder).expungeFolder(); 1132 } 1133 } 1134 1135 private void recursiveExpunge(IMailFolder srcFolder) throws Exception { 1136 IMailFolder folder; 1137 1138 if (srcFolder instanceof IMailbox) 1139 ((IMailbox) srcFolder).expungeFolder(); 1140 1141 for (Enumeration e = srcFolder.children(); e.hasMoreElements();) { 1142 folder = (IMailFolder) e.nextElement(); 1143 1144 if (folder instanceof VirtualFolder) { 1145 continue; 1146 } 1147 1148 recursiveExpunge(folder); 1149 } 1150 1151 } 1152 1153 1158 public IMailFolder getRootFolder() { 1159 return getSourceFolder().getRootFolder(); 1160 } 1161 1162 1167 public void messageAdded(IFolderEvent e) { 1168 deactivate(); 1170 return; 1171 1188 } 1189 1190 1195 public void messageRemoved(IFolderEvent e) { 1196 Object srcUid = e.getChanges(); 1197 1198 Object vUid = srcUidToVirtualUid((IMailFolder) e.getSource(), srcUid); 1199 if (vUid != null) { 1200 headerList.remove(vUid); 1201 1202 fireMessageRemoved(vUid, null); 1204 } 1205 } 1206 1207 protected boolean hasFlagsCriteria() { 1208 boolean result = false; 1209 1210 IFilterRule rule = getFilter().getFilterRule(); 1211 1212 for (int i = 0; i < rule.count() && !result; i++) { 1213 result = rule.get(i).getTypeString().equalsIgnoreCase("FLAGS"); 1214 } 1215 1216 return result; 1217 } 1218 1219 1224 public void messageFlagChanged(IFolderEvent e) { 1225 Object virtualUid = srcUidToVirtualUid((IMailFolder) e.getSource(), e 1226 .getChanges()); 1227 1228 if (virtualUid == null && hasFlagsCriteria()) { 1229 1230 AbstractMessageFolder folder = (AbstractMessageFolder) e 1231 .getSource(); 1232 try { 1233 Object [] resultUids = folder.searchMessages(getFilter(), 1234 new Object [] { e.getChanges() }); 1235 1236 if (resultUids.length > 0) { 1237 Header h = folder.getHeaderFields(resultUids[0], 1238 CachedHeaderfields.getDefaultHeaderfields()); 1239 ColumbaHeader header = new ColumbaHeader(h); 1240 header.setAttributes(folder.getAttributes(resultUids[0])); 1241 header.setFlags(folder.getFlags(resultUids[0])); 1242 1243 Object uid = add(header, folder, resultUids[0]); 1244 fireMessageAdded(uid, getFlags(uid)); 1245 } 1246 } catch (Exception e1) { 1247 e1.printStackTrace(); 1248 } 1249 } 1250 1251 if (virtualUid != null) { 1252 1254 VirtualHeader h = (VirtualHeader) headerList.get(virtualUid); 1255 AbstractMessageFolder folder = (AbstractMessageFolder) e 1256 .getSource(); 1257 try { 1258 h.setAttributes(folder.getAttributes(e.getChanges())); 1259 h.setFlags(folder.getFlags(e.getChanges())); 1260 1261 updateMailFolderInfo(e.getOldFlags(), e.getParameter()); 1262 } catch (Exception e1) { 1263 } 1264 1265 fireMessageFlagChanged(virtualUid, e.getOldFlags(), e 1267 .getParameter()); 1268 } 1269 } 1270 1271 1276 public void folderPropertyChanged(IFolderEvent e) { 1277 } 1279 1280 1285 public void folderAdded(IFolderEvent e) { 1286 if (isRecursive() && !(e.getChanges() instanceof VirtualFolder)) { 1287 AbstractMessageFolder folder = (AbstractMessageFolder) e 1288 .getChanges(); 1289 folder.addFolderListener(this); 1290 } 1291 } 1292 1293 1298 public void folderRemoved(IFolderEvent e) { 1299 AbstractMessageFolder folder = (AbstractMessageFolder) e.getChanges(); 1300 folder.removeFolderListener(this); 1301 } 1302 1303 1306 public void activate() throws Exception { 1307 if (active) 1308 return; 1309 1310 LOG.fine("Activating virtual folder " + getName()); 1311 getMessageFolderInfo().reset(); 1312 applySearch(); 1313 registerWithSource(); 1314 active = true; 1315 } 1316 1317 public void deactivate() { 1318 active = false; 1319 headerList.clear(); 1320 getMessageFolderInfo().reset(); 1321 1322 unregisterWithSource(); 1323 } 1324 1325 1330 public void removeFolder() throws Exception { 1331 if (active) { 1332 deactivate(); 1333 } 1334 super.removeFolder(); 1335 } 1336 1337 1340 public Object getLastSelection() { 1341 return null; 1343 } 1344 1345} | Popular Tags |