KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > mail > folder > command > CreateFilterOnMessageCommand


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.folder.command;
17
18 import java.util.logging.Logger JavaDoc;
19
20 import org.columba.api.command.ICommandReference;
21 import org.columba.api.command.IWorkerStatusController;
22 import org.columba.api.gui.frame.IFrameMediator;
23 import org.columba.core.command.Command;
24 import org.columba.core.command.StatusObservableImpl;
25 import org.columba.core.command.Worker;
26 import org.columba.core.filter.Filter;
27 import org.columba.core.filter.FilterFactory;
28 import org.columba.mail.command.IMailFolderCommandReference;
29 import org.columba.mail.filter.MailFilterFactory;
30 import org.columba.mail.folder.IMailbox;
31 import org.columba.mail.gui.config.filter.FilterDialog;
32 import org.columba.ristretto.message.Header;
33
34 /**
35  * This class is used to create a filter based on the currently selected message
36  * (if multiple selected, the first one in the selection array is used) - either
37  * using Subject, To or From.
38  *
39  * @author Karl Peder Olesen (karlpeder), 20030620
40  */

41 public class CreateFilterOnMessageCommand extends Command {
42
43     /** JDK 1.4+ logging framework logger, used for logging. */
44     private static final Logger JavaDoc LOG = Logger
45             .getLogger("org.columba.mail.folder.command");
46
47     /** Used for creating a filter based on Subject */
48     public static final String JavaDoc FILTER_ON_SUBJECT = "Subject";
49
50     /** Used for creating a filter based on From */
51     public static final String JavaDoc FILTER_ON_FROM = "From";
52
53     /** Used for creating a filter based on To */
54     public static final String JavaDoc FILTER_ON_TO = "To";
55
56     /** Type of filter to create */
57     private String JavaDoc filterType;
58
59     /** Filter created */
60     private Filter filter = null;
61
62     private IFrameMediator mediator;
63
64     /** The source folder where the filter should be added to. */
65     private IMailbox srcFolder;
66
67     /**
68      * Constructor for CreateFilterOnMessageCommand. Calls super constructor and
69      * saves flag for which kind of filter to create. Default for filter type is
70      * FILTER_ON_SUBJECT.
71      *
72      * @param references
73      * @param filterType
74      * Which type of filter to create. Used defined constants
75      */

76     public CreateFilterOnMessageCommand(IFrameMediator mediator,
77             ICommandReference reference, String JavaDoc filterType) {
78         super(reference);
79         this.filterType = filterType;
80
81         this.mediator = mediator;
82     }
83
84     /**
85      * Displays filter dialog for user modifications after creation of the
86      * filter in execute. If the user cancels the dialog then the filter is not
87      * stored into the filter list in the source folder.
88      *
89      * @see org.columba.api.command.Command#updateGUI()
90      */

91     public void updateGUI() throws Exception JavaDoc {
92         if ((filter != null) && (srcFolder != null)) {
93             FilterDialog dialog = new FilterDialog(mediator, filter);
94
95             if (!dialog.wasCancelled()) {
96                 srcFolder.getFilterList().add(filter);
97             }
98         }
99     }
100
101     /**
102      * This method generates filter based on Subject, From or To (depending on
103      * parameter transferred to constructor) of the currently selected message.
104      *
105      * @param worker
106      * @see org.columba.api.command.Command#execute(Worker)
107      */

108     public void execute(IWorkerStatusController worker) throws Exception JavaDoc {
109         // get references to selected folder and message
110
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
111         Object JavaDoc[] uids = r.getUids(); // uid for messages to save
112

113         if (uids.length == 0) {
114             LOG.fine("No filter created since no message was selected");
115
116             return; // no message selected.
117
}
118
119         Object JavaDoc uid = uids[0];
120         srcFolder = (IMailbox) r.getSourceFolder();
121
122         // register for status events
123
((StatusObservableImpl) srcFolder.getObservable()).setWorker(worker);
124
125         // get value of Subject, From or To header
126
Header header = srcFolder.getHeaderFields(uid, new String JavaDoc[] {
127                 "Subject", "From", "To" });
128         String JavaDoc headerValue = (String JavaDoc) header.get(filterType);
129
130         if (headerValue == null) {
131             LOG.warning("Error getting " + filterType
132                     + " header. No filter created");
133
134             return;
135         }
136
137         // create filter
138
String JavaDoc descr = filterType + " contains [" + headerValue + "]";
139         filter = createFilter(descr, filterType, headerValue);
140     }
141
142     /**
143      * Private utility for creating a filter on a given headerfield. The
144      * criteria used is "contains" and the action is set to "Mark as Read".
145      *
146      * @param filterDescr
147      * Name / description to assign to filter
148      * @param headerField
149      * The header field to base filter on
150      * @param pattern
151      * The pattern to use in the filter
152      * @return The filter created
153      */

154     public Filter createFilter(String JavaDoc filterDescr, String JavaDoc headerField,
155             String JavaDoc pattern) {
156
157         Filter filter = FilterFactory.createEmptyFilter();
158         filter.setName(filterDescr);
159
160         if (headerField.equals(FILTER_ON_SUBJECT)) {
161             filter.getFilterRule().add(
162                     MailFilterFactory.createSubjectContains(pattern));
163         } else if (headerField.equals(FILTER_ON_FROM)) {
164             filter.getFilterRule().add(
165                     MailFilterFactory.createFromContains(pattern));
166         } else if (headerField.equals(FILTER_ON_TO)) {
167             filter.getFilterRule().add(
168                     MailFilterFactory.createToContains(pattern));
169         } else
170             throw new IllegalArgumentException JavaDoc("unsupported operation");
171
172         filter.getFilterActionList().addEmptyAction();
173
174         return filter;
175     }
176 }
177
Popular Tags