|                                                                                                              1   package org.columba.mail.spam;
 19
 20  import java.io.File
  ; 21  import java.io.IOException
  ; 22  import java.io.InputStream
  ; 23  import java.security.NoSuchAlgorithmException
  ; 24  import java.util.ArrayList
  ; 25  import java.util.Enumeration
  ; 26  import java.util.List
  ; 27  import java.util.logging.Logger
  ; 28
 29  import javax.swing.JOptionPane
  ; 30
 31  import org.columba.core.config.DefaultConfigDirectory;
 32  import org.columba.core.gui.frame.FrameManager;
 33  import org.columba.core.io.CloneStreamMaster;
 34  import org.columba.core.logging.Logging;
 35  import org.columba.mail.folder.IMailbox;
 36  import org.columba.mail.spam.command.CommandHelper;
 37  import org.columba.mail.spam.rules.RuleList;
 38  import org.columba.ristretto.message.Header;
 39  import org.macchiato.DBWrapper;
 40  import org.macchiato.Message;
 41  import org.macchiato.SpamFilter;
 42  import org.macchiato.SpamFilterImpl;
 43  import org.macchiato.db.FrequencyDB;
 44  import org.macchiato.db.MD5SumHelper;
 45  import org.macchiato.db.berkleydb.BerkleyFrequencyDBImpl;
 46  import org.macchiato.log.MacchiatoLogger;
 47  import org.macchiato.maps.ProbabilityMap;
 48
 49
 61  public class MacchiatoPlugin implements ISpamPlugin {
 62
 63
 64      private static final Logger
  LOG = Logger 65              .getLogger("org.columba.core.gui.htmlviewer");
 66
 67
 70      public final static int THRESHOLD = 200000;
 71
 72
 76      public final static int AGE = 7;
 77
 78
 81      private SpamFilter filter;
 82
 83
 86      private FrequencyDB db;
 87
 88
 91      private File
  file; 92
 93
 96      private boolean hasChanged = false;
 97
 98
 101     private boolean alreadyLoaded = false;
 102
 103
 106     public MacchiatoPlugin() {
 107                 File
  configDirectory = DefaultConfigDirectory.getInstance().getCurrentPath(); 109         File
  mailDirectory = new File  (configDirectory, "mail"); 110         file = new File
  (mailDirectory, "spamdb"); 111         if (!file.exists())
 112             file.mkdir();
 113         db = new DBWrapper(new BerkleyFrequencyDBImpl(file));
 114
 115         filter = new SpamFilterImpl(db);
 116
 117                 MacchiatoLogger.setParentLogger(Logger
 119                 .getLogger("org.columba.mail.spam"));
 120
 121     }
 122
 123
 130     public boolean scoreMessage(IMailbox mailbox, Object
  uid) throws Exception  { 131                 load();
 133
 134                 InputStream
  istream = CommandHelper.getBodyPart(mailbox, uid); 136
 137                         CloneStreamMaster master = new CloneStreamMaster(istream);
 140
 141                 istream = master.getClone();
 143
 144                 ProbabilityMap map = RuleList.getInstance().getProbabilities(mailbox,
 146                 uid);
 147
 148         float score = filter.scoreMessage(new Message(istream), map);
 149
 150         return score >= 0.9f;
 151     }
 152
 153
 157     public void trainMessageAsSpam(IMailbox mailbox, Object
  uid) 158             throws Exception
  { 159                 InputStream
  istream = CommandHelper.getBodyPart(mailbox, uid); 161
 162                 Header h = mailbox.getHeaderFields(uid, Message.HEADERFIELDS);
 164
 165                 Enumeration
  e = h.getKeys(); 167         List
  list = new ArrayList  (); 168
 169         while (e.hasMoreElements()) {
 170             String
  key = (String  ) e.nextElement(); 171             list.add(h.get(key));
 172         }
 173
 174                 load();
 176
 177         try {
 178             CloneStreamMaster master = new CloneStreamMaster(istream);
 179             InputStream
  inputStream = master.getClone(); 180
 181             byte[] md5sum = MD5SumHelper.createMD5(inputStream);
 182                         inputStream.close();
 184
 185                         inputStream = master.getClone();
 187
 188             Message message = new Message(inputStream, list, md5sum);
 189                                     if (db.MD5SumExists(md5sum)) {
 192                                                 filter.correctMessageAsSpam(message);
 195             } else {
 196                                 filter.trainMessageAsSpam(message);
 198             }
 199
 200                         inputStream.close();
 202
 203                         hasChanged = true;
 205         } catch (IOException
  e1) { 206             LOG.severe(e1.getMessage());
 207             if (Logging.DEBUG)
 208                 e1.printStackTrace();
 209         } catch (NoSuchAlgorithmException
  nsae) { 210         }
 212     }
 213
 214
 218     public void trainMessageAsHam(IMailbox mailbox, Object
  uid) 219             throws Exception
  { 220                 InputStream
  istream = CommandHelper.getBodyPart(mailbox, uid); 222
 223                 Header h = mailbox.getHeaderFields(uid, Message.HEADERFIELDS);
 225
 226                 Enumeration
  e = h.getKeys(); 228         List
  list = new ArrayList  (); 229
 230         while (e.hasMoreElements()) {
 231             String
  key = (String  ) e.nextElement(); 232             list.add(h.get(key));
 233         }
 234
 235                 load();
 237
 238         try {
 239             CloneStreamMaster master = new CloneStreamMaster(istream);
 240             InputStream
  inputStream = master.getClone(); 241
 242             byte[] md5sum = MD5SumHelper.createMD5(inputStream);
 243                         inputStream.close();
 245
 246                         inputStream = master.getClone();
 248             Message message = new Message(inputStream, list, md5sum);
 249
 250                         if (db.MD5SumExists(md5sum)) {
 252
 254                                 filter.correctMessageAsHam(message);
 256             } else {
 257
 259                 filter.trainMessageAsHam(message);
 260             }
 261
 262                         inputStream.close();
 264
 265                         hasChanged = true;
 267         } catch (IOException
  e1) { 268             LOG.severe(e1.getMessage());
 269             if (Logging.DEBUG)
 270                 e1.printStackTrace();
 271         } catch (NoSuchAlgorithmException
  nsae) { 272         }
 274     }
 275
 276
 279     public void save() {
 280         try {
 281                         if (alreadyLoaded && hasChanged) {
 283                                 db.cleanupDB(THRESHOLD);
 285
 286                                 db.close();
 288             }
 289         } catch (Exception
  e) { 290             if (Logging.DEBUG) {
 291                 e.printStackTrace();
 292             }
 293                         int value = JOptionPane.showConfirmDialog(FrameManager.getInstance()
 295                     .getActiveFrame(),
 296                     "An error occured while saving the spam database.\n"
 297                             + "Try again?", "Error saving database",
 298                     JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
 299             if (value == JOptionPane.YES_OPTION) {
 300                 save();
 301             }
 302         }
 303
 304     }
 305
 306
 309     public void load() {
 310
 324     }
 325
 326 }
 327
                                                                                                                                                                                                             |                                                                       
 
 
 
 
 
                                                                                   Popular Tags                                                                                                                                                                                              |