KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > mail > pop3 > command > AddPOP3MessageCommand


1 //The contents of this file are subject to the Mozilla Public License Version 1.1
2
//(the "License"); you may not use this file except in compliance with the
3
//License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
4
//
5
//Software distributed under the License is distributed on an "AS IS" basis,
6
//WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
7
//for the specific language governing rights and
8
//limitations under the License.
9
//
10
//The Original Code is "The Columba Project"
11
//
12
//The Initial Developers of the Original Code are Frederik Dietz and Timo Stich.
13
//Portions created by Frederik Dietz and Timo Stich are Copyright (C) 2003.
14
//
15
//All Rights Reserved.
16
package org.columba.mail.pop3.command;
17
18 import org.columba.api.command.ICommandReference;
19 import org.columba.api.command.IWorkerStatusController;
20 import org.columba.core.command.Command;
21 import org.columba.core.command.CommandProcessor;
22 import org.columba.core.command.CompoundCommand;
23 import org.columba.core.filter.Filter;
24 import org.columba.core.filter.FilterList;
25 import org.columba.core.filter.IFilter;
26 import org.columba.core.filter.IFilterList;
27 import org.columba.mail.command.IMailFolderCommandReference;
28 import org.columba.mail.command.MailFolderCommandReference;
29 import org.columba.mail.config.AccountItem;
30 import org.columba.mail.filter.FilterCompoundCommand;
31 import org.columba.mail.folder.IMailbox;
32 import org.columba.mail.folder.RootFolder;
33 import org.columba.mail.folder.command.MarkMessageCommand;
34 import org.columba.mail.folder.command.MoveMessageCommand;
35 import org.columba.mail.gui.tree.FolderTreeModel;
36 import org.columba.mail.mailchecking.MailCheckingManager;
37 import org.columba.mail.message.IColumbaMessage;
38 import org.columba.mail.spam.command.CommandHelper;
39 import org.columba.mail.spam.command.ScoreMessageCommand;
40 import org.columba.ristretto.io.SourceInputStream;
41
42 /**
43  * After downloading the message from the POP3 server, its added to the Inbox
44  * folder.
45  * <p>
46  * The spam filter is executed on this message.
47  * <p>
48  * The Inbox filters are applied to the message.
49  *
50  * @author fdietz
51  */

52 public class AddPOP3MessageCommand extends Command {
53
54     private IMailbox inboxFolder;
55
56     /**
57      * @param references
58      * command arguments
59      */

60     public AddPOP3MessageCommand(ICommandReference reference) {
61         super(reference);
62     }
63
64     /** {@inheritDoc} */
65     public void execute(IWorkerStatusController worker) throws Exception JavaDoc {
66         IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
67
68         inboxFolder = (IMailbox) r.getSourceFolder();
69
70         IColumbaMessage message = (IColumbaMessage) r.getMessage();
71
72         // add message to folder
73
SourceInputStream messageStream = new SourceInputStream(message
74                 .getSource());
75         Object JavaDoc uid = inboxFolder.addMessage(messageStream);
76         messageStream.close();
77
78         // mark message as recent
79
r.setSourceFolder(inboxFolder);
80         r.setUids(new Object JavaDoc[] { uid });
81         r.setMarkVariant(MarkMessageCommand.MARK_AS_RECENT);
82         new MarkMessageCommand(r).execute(worker);
83
84         
85
86         // apply spam filter
87
boolean messageWasMoved = applySpamFilter(uid, worker);
88
89         if (messageWasMoved == false) {
90             // apply filter on message
91
applyFilters(uid);
92         }
93     }
94
95     /**
96      * Apply spam filter engine on message.
97      * <p>
98      * Message is marked as ham or spam.
99      *
100      * @param uid
101      * message uid.
102      * @throws Exception
103      */

104     private boolean applySpamFilter(Object JavaDoc uid, IWorkerStatusController worker)
105             throws Exception JavaDoc {
106         // message belongs to which account?
107
AccountItem item = CommandHelper.retrieveAccountItem(inboxFolder, uid);
108         if ( item == null ) return false;
109
110         // if spam filter is not enabled -> return
111
if (!item.getSpamItem().isEnabled()) {
112             return false;
113         }
114
115         // create reference
116
IMailFolderCommandReference r = new MailFolderCommandReference(
117                 inboxFolder, new Object JavaDoc[] { uid });
118
119         // score message and mark as "spam" or "not spam"
120
new ScoreMessageCommand(r).execute(worker);
121
122         // is message marked as spam
123
boolean spam = ((Boolean JavaDoc) inboxFolder.getAttribute(uid, "columba.spam"))
124                 .booleanValue();
125         if (spam == false)
126             return false;
127
128         if (item.getSpamItem().isMoveIncomingJunkMessagesEnabled()) {
129             if (item.getSpamItem().isIncomingTrashSelected()) {
130                 // move message to trash
131
IMailbox trash = (IMailbox) ((RootFolder) inboxFolder
132                         .getRootFolder()).getTrashFolder();
133
134                 // create reference
135
MailFolderCommandReference ref2 = new MailFolderCommandReference(
136                         inboxFolder, trash, new Object JavaDoc[] { uid });
137
138                 CommandProcessor.getInstance().addOp(
139                         new MoveMessageCommand(ref2));
140             } else {
141                 // move message to user-configured folder (generally "Junk"
142
// folder)
143
IMailbox destFolder = (IMailbox) FolderTreeModel
144                         .getInstance()
145                         .getFolder(item.getSpamItem().getIncomingCustomFolder());
146
147                 // create reference
148
MailFolderCommandReference ref2 = new MailFolderCommandReference(
149                         inboxFolder, destFolder, new Object JavaDoc[] { uid });
150
151                 CommandProcessor.getInstance().addOp(
152                         new MoveMessageCommand(ref2));
153
154             }
155
156             return true;
157         }
158
159         return false;
160     }
161
162     /**
163      * Apply filters on new message.
164      *
165      * @param uid
166      * message uid
167      */

168     private void applyFilters(Object JavaDoc uid) throws Exception JavaDoc {
169         IFilterList list = inboxFolder.getFilterList();
170
171         for (int j = 0; j < list.count(); j++) {
172             IFilter filter = list.get(j);
173
174             Object JavaDoc[] result = inboxFolder.searchMessages(filter,
175                     new Object JavaDoc[] { uid });
176
177             if (result.length != 0) {
178                 CompoundCommand command = new FilterCompoundCommand(filter,
179                         inboxFolder, result);
180
181                 CommandProcessor.getInstance().addOp(command);
182             }
183         }
184     }
185
186 }
Popular Tags