KickJava   Java API By Example, From Geeks To Geeks.

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


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.io.IOException JavaDoc;
19 import java.io.InputStream JavaDoc;
20 import java.text.MessageFormat JavaDoc;
21 import java.util.logging.Logger JavaDoc;
22
23 import javax.swing.JOptionPane JavaDoc;
24
25 import org.columba.api.command.ICommandReference;
26 import org.columba.api.command.IWorkerStatusController;
27 import org.columba.core.command.Command;
28 import org.columba.core.command.StatusObservableImpl;
29 import org.columba.core.command.Worker;
30 import org.columba.core.gui.frame.FrameManager;
31 import org.columba.mail.command.IMailFolderCommandReference;
32 import org.columba.mail.folder.IMailbox;
33 import org.columba.mail.util.MailResourceLoader;
34 import org.columba.ristretto.message.Attributes;
35 import org.columba.ristretto.message.Flags;
36
37 /**
38  * Copy a set of messages from a source to a destination folder.
39  * <p>
40  * A dialog asks the user the destination folder.
41  *
42  * @author fdietz
43  *
44  */

45 public class CopyMessageCommand extends Command {
46
47     /** JDK 1.4+ logging framework logger, used for logging. */
48     private static final Logger JavaDoc LOG = Logger
49             .getLogger("org.columba.mail.folder.command");
50
51     protected IMailbox destFolder;
52
53     protected IMailFolderCommandReference r;
54
55     /**
56      * Constructor for CopyMessageCommand.
57      *
58      * @param frameMediator
59      * @param references
60      */

61     public CopyMessageCommand(ICommandReference reference) {
62         super(reference);
63     }
64
65     protected void doExecute(IWorkerStatusController worker,
66             String JavaDoc statusMessage, String JavaDoc errorRetryMessage,
67             String JavaDoc errorIgnoreMessage, String JavaDoc errorCopyMessage,
68             String JavaDoc errorTitle, String JavaDoc canceledMessage) throws Exception JavaDoc {
69         // get references
70
r = (IMailFolderCommandReference) getReference();
71
72         // get destination foldedr
73
destFolder = (IMailbox) r.getDestinationFolder();
74
75         Object JavaDoc[] uids = r.getUids();
76
77         // get source folder
78
IMailbox srcFolder = (IMailbox) r.getSourceFolder();
79
80         // register for status events
81
((StatusObservableImpl) srcFolder.getObservable()).setWorker(worker);
82
83         // setting lastSelection for srcFolder to null
84
srcFolder.setLastSelection(null);
85
86         LOG.fine("src=" + srcFolder + " dest=" + destFolder);
87
88         // update status message
89
worker.setDisplayText(MessageFormat.format(MailResourceLoader
90                 .getString("statusbar", "message", statusMessage),
91                 new Object JavaDoc[] { destFolder.getName() }));
92
93         // initialize progress bar with total number of messages
94
worker.setProgressBarMaximum(uids.length);
95
96         if (srcFolder.getRootFolder().equals(destFolder.getRootFolder())) {
97             // folders have same root folder
98
// -> for example: two IMAP folders on the same server
99
// -----> this means we use server-side copying which
100
// -----> is much faster than using inputstreams here
101
//
102
// also used for local folders, which saves some parsing work
103
srcFolder.innerCopy(destFolder, uids);
104         } else {
105             // two different root folders
106
// -> get inputstream from source-folder and add it to
107
// -> destination-folder as inputstream
108
// -----> moving of raw message source
109
// (works also for copying from local to IMAP folders, etc.
110
for (int j = 0; (j < uids.length) && !worker.cancelled(); j++) {
111                 if (!srcFolder.exists(uids[j])) {
112                     continue;
113                 }
114
115                 try {
116                     // add source to destination folder
117
Attributes attributes = srcFolder.getAttributes(uids[j]);
118                     Flags flags = srcFolder.getFlags(uids[j]);
119                     InputStream JavaDoc messageSourceStream = srcFolder
120                             .getMessageSourceStream(uids[j]);
121                     destFolder.addMessage(messageSourceStream, attributes,
122                             flags);
123                     messageSourceStream.close();
124                 } catch (IOException JavaDoc ioe) {
125                     String JavaDoc[] options = new String JavaDoc[] {
126                             MailResourceLoader.getString("statusbar",
127                                     "message", errorRetryMessage),
128                             MailResourceLoader.getString("statusbar",
129                                     "message", errorIgnoreMessage),
130                             MailResourceLoader
131                                     .getString("", "global", "cancel") };
132
133                     int result = JOptionPane.showOptionDialog(FrameManager.getInstance()
134                             .getActiveFrame(),
135                             MailResourceLoader.getString("statusbar",
136                                     "message", errorCopyMessage),
137                             MailResourceLoader.getString("statusbar",
138                                     "message", errorTitle),
139                             JOptionPane.YES_NO_CANCEL_OPTION,
140                             JOptionPane.ERROR_MESSAGE, null, options,
141                             options[0]);
142                     switch (result) {
143                     case JOptionPane.YES_OPTION:
144
145                         //retry copy
146
j--;
147
148                         break;
149
150                     case JOptionPane.CANCEL_OPTION:
151                         worker.cancel();
152
153                     default:
154
155                         continue;
156                     }
157                 }
158
159                 // update progress bar
160
worker.setProgressBarValue(j);
161             }
162         }
163
164         //reset progress bar
165
worker.setProgressBarValue(0);
166
167         if (worker.cancelled()) {
168             worker.setDisplayText(MailResourceLoader.getString("statusbar",
169                     "message", canceledMessage));
170         } else {
171             // We are done - clear the status message with a delay
172
worker.clearDisplayTextWithDelay();
173         }
174
175     }
176
177     /**
178      * @see org.columba.api.command.Command#execute(Worker)
179      */

180     public void execute(IWorkerStatusController worker) throws Exception JavaDoc {
181         doExecute(worker, "copy_messages", "err_copy_messages_retry",
182                 "err_copy_messages_ignore", "err_copy_messages_msg",
183                 "err_copy_messages_title", "copy_messages_cancelled");
184     }
185 }
Popular Tags