KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > mail > gui > message > command > OpenAttachmentCommand


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.gui.message.command;
17
18 import java.io.File JavaDoc;
19 import java.io.FileOutputStream JavaDoc;
20 import java.io.InputStream JavaDoc;
21 import java.util.Enumeration JavaDoc;
22 import java.util.logging.Level JavaDoc;
23 import java.util.logging.Logger JavaDoc;
24
25 import javax.swing.JFileChooser JavaDoc;
26 import javax.swing.JOptionPane JavaDoc;
27
28 import org.columba.api.command.ICommandReference;
29 import org.columba.api.command.IWorkerStatusController;
30 import org.columba.api.plugin.IExtension;
31 import org.columba.api.plugin.IExtensionHandler;
32 import org.columba.api.plugin.PluginException;
33 import org.columba.api.plugin.PluginHandlerNotFoundException;
34 import org.columba.core.base.cFileChooser;
35 import org.columba.core.base.cFileFilter;
36 import org.columba.core.command.Command;
37 import org.columba.core.command.CommandProcessor;
38 import org.columba.core.command.ProgressObservedInputStream;
39 import org.columba.core.command.Worker;
40 import org.columba.core.desktop.ColumbaDesktop;
41 import org.columba.core.gui.frame.DefaultContainer;
42 import org.columba.core.gui.frame.FrameManager;
43 import org.columba.core.io.StreamUtils;
44 import org.columba.core.logging.Logging;
45 import org.columba.core.plugin.PluginManager;
46 import org.columba.core.util.TempFileStore;
47 import org.columba.mail.command.IMailFolderCommandReference;
48 import org.columba.mail.command.MailFolderCommandReference;
49 import org.columba.mail.folder.IMailbox;
50 import org.columba.mail.folder.temp.TempFolder;
51 import org.columba.mail.gui.attachment.IAttachmentHandler;
52 import org.columba.mail.gui.message.util.AttachmentContext;
53 import org.columba.mail.gui.messageframe.MessageFrameController;
54 import org.columba.mail.gui.tree.FolderTreeModel;
55 import org.columba.mail.plugin.IExtensionHandlerKeys;
56 import org.columba.ristretto.coder.Base64DecoderInputStream;
57 import org.columba.ristretto.coder.QuotedPrintableDecoderInputStream;
58 import org.columba.ristretto.message.MimeHeader;
59
60 /**
61  * @author freddy
62  */

63 public class OpenAttachmentCommand extends SaveAttachmentCommand {
64     private static final Logger JavaDoc LOG = Logger
65             .getLogger("org.columba.mail.gui.message.attachment.command");
66
67     private File JavaDoc tempFile;
68
69     private TempFolder tempFolder;
70
71     private Object JavaDoc tempMessageUid;
72
73     private MimeHeader header;
74
75     /**
76      * Constructor for OpenAttachmentCommand.
77      *
78      * @param references
79      * command parameters
80      */

81     public OpenAttachmentCommand(ICommandReference reference) {
82         super(reference);
83
84         priority = Command.REALTIME_PRIORITY;
85         commandType = Command.NORMAL_OPERATION;
86     }
87
88     /**
89      * @see org.columba.api.command.Command#updateGUI()
90      */

91     public void updateGUI() throws Exception JavaDoc {
92
93         if (header.getMimeType().getType().toLowerCase().indexOf("message") != -1) {
94             MessageFrameController c = new MessageFrameController();
95             new DefaultContainer(c);
96
97             Object JavaDoc[] uidList = new Object JavaDoc[1];
98             uidList[0] = tempMessageUid;
99
100             IMailFolderCommandReference r = new MailFolderCommandReference(
101                     tempFolder, uidList);
102
103             c.setTreeSelection(r);
104             c.setTableSelection(r);
105
106             CommandProcessor.getInstance().addOp(new ViewMessageCommand(c, r));
107
108         } else {
109
110             boolean attachmentHandlerExecuted = false;
111             try {
112                 IExtensionHandler handler = PluginManager
113                         .getInstance()
114                         .getExtensionHandler(
115                                 IExtensionHandlerKeys.ORG_COLUMBA_ATTACHMENT_HANDLER);
116
117                 Enumeration JavaDoc<IExtension> e = handler.getExtensionEnumeration();
118                 while (e.hasMoreElements()) {
119                     IExtension extension = e.nextElement();
120                     try {
121                         IAttachmentHandler attachmentHandler = (IAttachmentHandler) extension
122                                 .instanciateExtension(null);
123
124                         attachmentHandler.execute(new AttachmentContext(
125                                 tempFile, header));
126                         attachmentHandlerExecuted &= true;
127                     } catch (PluginException e1) {
128                         LOG.severe("Error while loading plugin: "
129                                 + e1.getMessage());
130                         if (Logging.DEBUG)
131                             e1.printStackTrace();
132                     }
133                 }
134
135             } catch (PluginHandlerNotFoundException e2) {
136                 LOG.severe("Error while loading plugin: " + e2.getMessage());
137                 if (Logging.DEBUG)
138                     e2.printStackTrace();
139             }
140
141             // in case no attachment handler was executed correctly
142
// -> fall back to default handler
143
if (!attachmentHandlerExecuted) {
144                 boolean success = ColumbaDesktop.getInstance().open(tempFile);
145
146                 // if attachment can't be opened, save it only
147
if (!success) {
148                     File JavaDoc saveToFile = getDestinationFile(header);
149
150                     if (saveToFile.exists())
151                         saveToFile.delete();
152                     tempFile.renameTo(saveToFile);
153                 }
154             }
155         }
156     }
157
158     /**
159      * @see org.columba.api.command.Command#execute(Worker)
160      */

161     public void execute(IWorkerStatusController worker) throws Exception JavaDoc {
162         IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
163         IMailbox folder = (IMailbox) r.getSourceFolder();
164         Object JavaDoc[] uids = r.getUids();
165
166         Integer JavaDoc[] address = r.getAddress();
167
168         header = folder.getMimePartTree(uids[0]).getFromAddress(address)
169                 .getHeader();
170
171         worker.setDisplayText("Opening " + header.getFileName());
172
173         InputStream JavaDoc bodyStream = folder.getMimePartBodyStream(uids[0], address);
174         // wrap with observable stream for progress bar updates
175
bodyStream = new ProgressObservedInputStream(bodyStream, worker);
176
177         if (header.getMimeType().getType().equals("message")) {
178
179             tempFolder = FolderTreeModel.getInstance().getTempFolder();
180             try {
181                 tempMessageUid = tempFolder.addMessage(bodyStream);
182             } catch (Exception JavaDoc e) {
183                 LOG
184                         .warning("Could not create temporary email from the attachment.");
185             }
186
187         } else {
188
189             String JavaDoc filename = header.getFileName();
190             if (filename != null) {
191                 tempFile = TempFileStore.createTempFile(filename);
192             } else {
193                 tempFile = TempFileStore.createTempFile();
194             }
195
196             int encoding = header.getContentTransferEncoding();
197
198             switch (encoding) {
199             case MimeHeader.QUOTED_PRINTABLE:
200                 bodyStream = new QuotedPrintableDecoderInputStream(bodyStream);
201                 break;
202
203             case MimeHeader.BASE64:
204                 bodyStream = new Base64DecoderInputStream(bodyStream);
205                 break;
206             default:
207             }
208
209             if (LOG.isLoggable(Level.FINE)) {
210                 LOG.fine("Storing the attachment to :" + tempFile);
211             }
212
213             FileOutputStream JavaDoc fileStream = new FileOutputStream JavaDoc(tempFile);
214             StreamUtils.streamCopy(bodyStream, fileStream);
215             fileStream.close();
216             bodyStream.close();
217         }
218     }
219
220     protected File JavaDoc getDestinationFile(MimeHeader header) {
221         cFileChooser fileChooser;
222
223         if (lastDir == null) {
224             fileChooser = new cFileChooser();
225         } else {
226             fileChooser = new cFileChooser(lastDir);
227         }
228
229         cFileFilter fileFilter = new cFileFilter();
230         fileFilter.acceptFilesWithProperty(cFileFilter.FILEPROPERTY_FILE);
231
232         fileChooser.setDialogTitle("Save Attachment as ...");
233
234         String JavaDoc fileName = getFilename(header);
235         if (fileName != null) {
236             fileChooser.forceSelectedFile(new File JavaDoc(fileName));
237         }
238
239         fileChooser.setSelectFilter(fileFilter);
240         File JavaDoc tempFile = null;
241
242         while (true) {
243             if (fileChooser.showSaveDialog(null) != JFileChooser.APPROVE_OPTION) {
244                 return null;
245             }
246
247             tempFile = fileChooser.getSelectedFile();
248             lastDir = tempFile.getParentFile();
249
250             if (tempFile.exists()) {
251                 if (JOptionPane.showConfirmDialog(FrameManager.getInstance()
252                         .getActiveFrame(), "Overwrite File?",
253                         "Warning", JOptionPane.YES_NO_OPTION,
254                         JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION) {
255                     break;
256                 }
257             } else {
258                 break;
259             }
260         }
261         return tempFile;
262     }
263 }
Popular Tags