1 package org.columba.mail.gui.config.subscribe; 19 20 import java.util.ArrayList ; 21 import java.util.Arrays ; 22 import java.util.Enumeration ; 23 import java.util.Iterator ; 24 import java.util.List ; 25 26 import javax.swing.tree.DefaultMutableTreeNode ; 27 import javax.swing.tree.DefaultTreeModel ; 28 import javax.swing.tree.TreeNode ; 29 30 import org.columba.api.command.IWorkerStatusController; 31 import org.columba.core.base.ListTools; 32 import org.columba.core.command.Command; 33 import org.columba.mail.folder.imap.IMAPRootFolder; 34 import org.columba.mail.imap.IImapServer; 35 import org.columba.ristretto.imap.ListInfo; 36 import org.columba.ristretto.imap.Namespace; 37 import org.columba.ristretto.imap.NamespaceCollection; 38 import org.frapuccino.checkabletree.CheckableItemImpl; 39 40 public class SynchronizeFolderListCommand extends Command { 41 42 private IMAPRootFolder root; 43 44 private IImapServer store; 45 46 private TreeNode node; 47 48 51 public SynchronizeFolderListCommand(SubscribeCommandReference reference) { 52 super(reference); 53 } 54 55 60 public void execute(IWorkerStatusController worker) throws Exception { 61 root = (IMAPRootFolder) ((SubscribeCommandReference) getReference()) 62 .getSourceFolder(); 63 64 store = root.getServer(); 65 66 node = createTreeStructure(); 67 } 68 69 private List fetchUnsubscribedFolders(String reference) throws Exception { 70 NamespaceCollection namespaces; 71 72 if (store.isSupported("NAMESPACE")) { 74 namespaces = store.fetchNamespaces(); 75 } else { 76 namespaces = new NamespaceCollection(); 78 namespaces.addPersonalNamespace(new Namespace("", "/")); 79 } 80 81 ArrayList result = new ArrayList (); 82 Iterator it; 83 84 if (namespaces.getPersonalNamespaceSize() > 0) { 86 it = namespaces.getPersonalIterator(); 87 while (it.hasNext()) { 88 Namespace pN = (Namespace) it.next(); 89 90 ListInfo[] list = store.list("", pN.getPrefix() + '%'); 91 result.addAll(Arrays.asList(list)); 92 } 93 } 94 95 if (namespaces.getOtherUserNamespaceSize() > 0) { 97 it = namespaces.getOtherUserIterator(); 98 while (it.hasNext()) { 99 Namespace pN = (Namespace) it.next(); 100 101 ListInfo[] list = store.list("", pN.getPrefix() + '%'); 102 result.addAll(Arrays.asList(list)); 103 } 104 } 105 106 if (namespaces.getSharedNamespaceSize() > 0) { 108 it = namespaces.getSharedIterator(); 109 while (it.hasNext()) { 110 Namespace pN = (Namespace) it.next(); 111 112 ListInfo[] list = store.list("", pN.getPrefix() + '%'); 113 result.addAll(Arrays.asList(list)); 114 } 115 } 116 117 for(int i=0; i<result.size(); i++ ) { 118 ListInfo info = (ListInfo) result.get(i); 119 if (info.getName().equalsIgnoreCase("INBOX") && info.getDelimiter() == null) { 122 result.addAll(Arrays.asList(store.list("", "INBOX" 123 + store.getDelimiter() + '%'))); 124 break; 125 } 126 127 if( info.getParameter(ListInfo.HASCHILDREN)) { 131 result.addAll(Arrays.asList(store.list("", info.getName() 132 + store.getDelimiter() + '%'))); 133 } 134 } 135 136 return result; 137 } 138 139 private TreeNode createTreeStructure() throws Exception { 140 ListInfo[] lsub = store.fetchSubscribedFolders(); 141 142 List subscribedFolders = new ArrayList (Arrays.asList(lsub)); 144 subscribedFolders.add(new ListInfo("INBOX", null, 0)); 146 147 List unsubscribedFolders = fetchUnsubscribedFolders(""); 148 ListTools.substract(unsubscribedFolders, subscribedFolders); 149 150 CheckableItemImpl rootNode = new CheckableItemImpl(root.getName()); 154 155 Iterator it = unsubscribedFolders.iterator(); 156 157 while (it.hasNext()) { 158 ListInfoTreeNode node = insertTreeNode((ListInfo) it.next(), 159 rootNode); 160 node.setSelected(false); 161 } 162 163 it = subscribedFolders.iterator(); 164 165 while (it.hasNext()) { 166 ListInfoTreeNode node = insertTreeNode((ListInfo) it.next(), 167 rootNode); 168 node.setSelected(true); 169 } 170 return rootNode; 171 } 172 173 private ListInfoTreeNode insertTreeNode(ListInfo listInfo, 174 DefaultMutableTreeNode parent) { 175 String [] hierarchy = listInfo.getName().split( 177 "\\" + listInfo.getDelimiter()); 178 179 DefaultMutableTreeNode actParent = parent; 180 StringBuffer mailboxName = new StringBuffer (); 181 182 mailboxName.append(hierarchy[0]); 183 actParent = ensureChild(hierarchy[0], mailboxName.toString(), actParent); 184 185 for (int i = 1; i < hierarchy.length; i++) { 186 mailboxName.append(listInfo.getDelimiter()); 187 mailboxName.append(hierarchy[i]); 188 actParent = ensureChild(hierarchy[i], mailboxName.toString(), 189 actParent); 190 } 191 192 return (ListInfoTreeNode) actParent; 193 } 194 195 private DefaultMutableTreeNode ensureChild(String name, String mailbox, 196 DefaultMutableTreeNode parent) { 197 Enumeration children = parent.children(); 198 ListInfoTreeNode node; 199 200 while (children.hasMoreElements()) { 201 node = (ListInfoTreeNode) children.nextElement(); 202 203 if (node.toString().equals(name)) { 204 return node; 205 } 206 } 207 208 node = new ListInfoTreeNode(name, mailbox); 209 parent.add(node); 210 211 return node; 212 } 213 214 219 public void updateGUI() throws Exception { 220 SubscribeDialog dialog = ((SubscribeCommandReference) getReference()) 221 .getDialog(); 222 223 dialog.syncFolderListDone(new DefaultTreeModel (node)); 224 } 225 } | Popular Tags |