1 18 package org.columba.mail.spam.command; 19 20 import java.io.IOException ; 21 import java.util.ArrayList ; 22 23 import org.columba.api.command.ICommandReference; 24 import org.columba.api.command.IWorkerStatusController; 25 import org.columba.core.command.Command; 26 import org.columba.core.command.StatusObservableImpl; 27 import org.columba.core.logging.Logging; 28 import org.columba.mail.command.IMailFolderCommandReference; 29 import org.columba.mail.command.MailFolderCommandReference; 30 import org.columba.mail.config.AccountItem; 31 import org.columba.mail.filter.plugins.AddressbookFilter; 32 import org.columba.mail.folder.IMailbox; 33 import org.columba.mail.folder.command.MarkMessageCommand; 34 import org.columba.mail.spam.SpamController; 35 36 42 public class ScoreMessageCommand extends Command { 43 44 private Object [] uids; 45 46 private IMailbox srcFolder; 47 48 private MarkMessageCommand markAsSpamCommand; 49 50 private MarkMessageCommand markAsNotSpamCommand; 51 52 55 public ScoreMessageCommand(ICommandReference reference) { 56 super(reference); 57 } 58 59 public void updateGUI() throws Exception { 60 if (markAsSpamCommand != null) { 62 markAsSpamCommand.updateGUI(); 63 } 64 if (markAsNotSpamCommand != null) { 65 markAsNotSpamCommand.updateGUI(); 66 } 67 } 68 69 72 public void execute(IWorkerStatusController worker) throws Exception { 73 IMailFolderCommandReference r = (IMailFolderCommandReference) getReference(); 75 76 uids = r.getUids(); 78 79 srcFolder = (IMailbox) r.getSourceFolder(); 81 82 ((StatusObservableImpl) srcFolder.getObservable()).setWorker(worker); 84 85 worker.setDisplayText("Scoring messages ..."); 88 worker.setProgressBarMaximum(uids.length); 89 90 ArrayList spamList = new ArrayList (); 91 ArrayList nonspamList = new ArrayList (); 92 93 for (int j = 0; j < uids.length; j++) { 94 if (worker.cancelled()) { 95 return; 96 } 97 98 try { 99 100 boolean result = scoreMessage(j); 102 103 if (result) { 105 spamList.add(uids[j]); 107 } else { 108 nonspamList.add(uids[j]); 110 } 111 112 trainMessage(j, result); 114 115 worker.setProgressBarValue(j); 116 117 if (worker.cancelled()) { 118 break; 119 } 120 } catch (Exception e) { 121 if (Logging.DEBUG) { 122 e.printStackTrace(); 123 } 124 } 125 } 126 127 if (spamList.size() != 0) { 129 MailFolderCommandReference ref = new MailFolderCommandReference( 130 srcFolder, spamList.toArray()); 131 ref.setMarkVariant(MarkMessageCommand.MARK_AS_SPAM); 132 markAsSpamCommand = new MarkMessageCommand(ref); 133 markAsSpamCommand.execute(worker); 134 } 135 136 if (nonspamList.size() != 0) { 138 MailFolderCommandReference ref = new MailFolderCommandReference( 139 srcFolder, nonspamList.toArray()); 140 ref.setMarkVariant(MarkMessageCommand.MARK_AS_NOTSPAM); 141 markAsNotSpamCommand = new MarkMessageCommand(ref); 142 markAsNotSpamCommand.execute(worker); 143 } 144 145 } 146 147 156 private boolean scoreMessage(int j) throws Exception , IOException { 157 158 boolean result = SpamController.getInstance().scoreMessage(srcFolder, 160 uids[j]); 161 162 AccountItem item = CommandHelper 164 .retrieveAccountItem(srcFolder, uids[j]); 165 166 if (item.getSpamItem().checkAddressbook()) { 167 boolean isInAddressbook = new AddressbookFilter().process( 169 srcFolder, uids[j]); 170 result = result && !isInAddressbook; 171 } 172 173 return result; 174 } 175 176 185 private void trainMessage(int j, boolean result) throws Exception { 186 187 if (result) { 189 SpamController.getInstance().trainMessageAsSpam(srcFolder, uids[j]); 190 } else { 191 SpamController.getInstance().trainMessageAsHam(srcFolder, uids[j]); 192 } 193 194 } 195 } | Popular Tags |