KickJava   Java API By Example, From Geeks To Geeks.

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


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.FilterRule;
27 import org.columba.core.filter.IFilterRule;
28 import org.columba.mail.command.IMailFolderCommandReference;
29 import org.columba.mail.filter.MailFilterCriteria;
30 import org.columba.mail.folder.FolderFactory;
31 import org.columba.mail.folder.IMailbox;
32 import org.columba.mail.folder.virtual.VirtualFolder;
33 import org.columba.mail.gui.config.filter.ConfigFrame;
34 import org.columba.mail.gui.tree.FolderTreeModel;
35 import org.columba.ristretto.message.Header;
36
37
38 /**
39  * This class is used to create a virtual folder based on the currently
40  * selected message (if multiple selected, the first one in the selection array
41  * is used) - either using Subject, To or From.
42  *
43  * @author Karl Peder Olesen (karlpeder), 20030621
44  */

45 public class CreateVFolderOnMessageCommand extends Command {
46
47     /** JDK 1.4+ logging framework logger, used for logging. */
48     private static final Logger JavaDoc LOG = Logger.getLogger("org.columba.mail.folder.command");
49
50     /** Used for creating a virtual folder based on Subject */
51     public static final String JavaDoc VFOLDER_ON_SUBJECT = "Subject";
52
53     /** Used for creating a virtual folder based on From */
54     public static final String JavaDoc VFOLDER_ON_FROM = "From";
55
56     /** Used for creating a virtual folder based on To */
57     public static final String JavaDoc VFOLDER_ON_TO = "To";
58
59     /** Type of virtual folder to create (Subject/From/To) */
60     private String JavaDoc vfolderType;
61
62     /** Parent for the virtual folder */
63     private IMailbox parentFolder = null;
64
65     /** Virtual folder created created */
66     private VirtualFolder vfolder = null;
67
68     private IFrameMediator mediator;
69     
70     /**
71      * Constructor for CreateVFolderOnMessageCommand. Calls super constructor
72      * and saves flag for which kind of virtual folder to create. Default for
73      * filter type is FILTER_ON_SUBJECT.
74      *
75      * @param frameMediator
76      * @param references
77      * @param vfolderType
78      * Which type of filter to create. Used defined constants
79      */

80     public CreateVFolderOnMessageCommand(IFrameMediator frameController,
81             ICommandReference reference, String JavaDoc vfolderType) {
82         super(reference);
83         this.vfolderType = vfolderType;
84         this.mediator = frameController;
85     }
86
87     /**
88      * Displays search dialog for user modifications after creation of the
89      * virtual folder in execute. Also refreshes the tree view.
90      *
91      * @see org.columba.api.command.Command#updateGUI()
92      */

93     public void updateGUI() throws Exception JavaDoc {
94         FolderTreeModel.getInstance().nodeStructureChanged(parentFolder);
95
96         if (vfolder != null) {
97             //vfolder.showFilterDialog((AbstractMailFrameController) getFrameMediator());
98
new ConfigFrame(mediator, vfolder);
99         }
100     }
101
102     /**
103      * This method generates a virtual folder based on Subject, From or To
104      * (depending on parameter transferred to constructor) of the currently
105      * selected message.
106      *
107      * @param worker
108      * @see org.columba.api.command.Command#execute(Worker)
109      */

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

116         if (uids.length == 0) {
117             LOG.fine(
118                 "No virtual folder created since no message was selected");
119
120             return; // no message selected.
121
}
122
123         Object JavaDoc uid = uids[0];
124         parentFolder = (IMailbox) r.getSourceFolder();
125
126         //register for status events
127
((StatusObservableImpl) parentFolder.getObservable()).setWorker(worker);
128
129         // get value of Subject, From or To header
130
Header header = parentFolder.getHeaderFields(uid,
131                 new String JavaDoc[] {"Subject", "From", "To"});
132         String JavaDoc headerValue = (String JavaDoc) header.get(vfolderType);
133
134         if (headerValue == null) {
135             LOG.warning("Error getting " + vfolderType
136                     + " header. No virtual folder created");
137
138             return;
139         }
140
141         // create virtual folder (is attached to parentFolder)
142
String JavaDoc name = vfolderType + " contains [" + headerValue + "]";
143         vfolder = createVirtualFolder(name, vfolderType, headerValue,
144                 parentFolder);
145     }
146
147     /**
148      * Private utility for creating a virtual folder on a given headerfield.
149      * The criteria used is "contains".
150      *
151      * @param folderName
152      * Name of virtual folder
153      * @param headerField
154      * The header field to base virtual folder on
155      * @param pattern
156      * The pattern to use in the virtual folder
157      * @param parent
158      * Parent folder
159      * @return The filter created
160      */

161     public VirtualFolder createVirtualFolder(String JavaDoc folderName,
162         String JavaDoc headerField, String JavaDoc pattern, IMailbox parent) {
163         // create virtual folder
164
VirtualFolder vfolder;
165
166         try {
167             vfolder = (VirtualFolder) FolderFactory.getInstance().createChild(parent,
168                     folderName, "VirtualFolder");
169         } catch (Exception JavaDoc e) {
170             LOG.warning("Error creating new virtual folder: "
171                     + e.getMessage());
172
173             return null;
174         }
175
176         // set properties for virtual folder
177
String JavaDoc parentUid = "101"; // default is inbox if parent is null
178

179         if (parent != null) {
180             parentUid = parent.getId();
181         }
182
183         vfolder.getConfiguration().setString("property", "source_uid", parentUid);
184         vfolder.getConfiguration().setBoolean("property", "include_subfolders", false);
185
186         // define filter rule
187
IFilterRule rule = vfolder.getFilter().getFilterRule();
188         rule.setCondition("matchall");
189         rule.removeAll();
190         rule.addEmptyCriteria();
191
192         // define criteria
193
MailFilterCriteria c = new MailFilterCriteria(rule.get(0));
194         c.setCriteriaString("contains");
195         c.setHeaderfieldString(headerField);
196         c.setTypeString(headerField);
197         c.setPatternString(pattern);
198
199         return vfolder;
200     }
201 }
202
Popular Tags