KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > mail > gui > composer > command > RedirectCommand


1 // The contents of this file are subject to the Mozilla Public License Version
2
// 1.1
3
//(the "License"); you may not use this file except in compliance with the
4
//License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
5
//
6
//Software distributed under the License is distributed on an "AS IS" basis,
7
//WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
8
//for the specific language governing rights and
9
//limitations under the License.
10
//
11
//The Original Code is "The Columba Project"
12
//
13
//The Initial Developers of the Original Code are Frederik Dietz and Timo
14
// Stich.
15
//Portions created by Frederik Dietz and Timo Stich are Copyright (C) 2003.
16
//
17
//All Rights Reserved.
18
package org.columba.mail.gui.composer.command;
19
20 import java.io.IOException JavaDoc;
21 import java.io.InputStream JavaDoc;
22 import java.nio.charset.Charset JavaDoc;
23 import java.util.Arrays JavaDoc;
24 import java.util.Iterator JavaDoc;
25
26 import org.columba.api.command.ICommandReference;
27 import org.columba.api.command.IWorkerStatusController;
28 import org.columba.core.io.StreamUtils;
29 import org.columba.core.xml.XmlElement;
30 import org.columba.mail.command.MailFolderCommandReference;
31 import org.columba.mail.config.MailConfig;
32 import org.columba.mail.folder.IMailbox;
33 import org.columba.mail.gui.composer.ComposerModel;
34 import org.columba.mail.parser.text.HtmlParser;
35 import org.columba.ristretto.message.BasicHeader;
36 import org.columba.ristretto.message.Header;
37 import org.columba.ristretto.message.InputStreamMimePart;
38 import org.columba.ristretto.message.MimeHeader;
39 import org.columba.ristretto.message.MimePart;
40 import org.columba.ristretto.message.MimeTree;
41
42 /**
43  * Redirect message, which is the same as forwarding without Quotationsmarks and
44  * the orginal sender is the new sender.
45  *
46  * This is modified ForwardInlineCommand.
47  *
48  * @author fdietz modified by switt
49  */

50 public class RedirectCommand extends ForwardCommand {
51
52     protected final String JavaDoc[] headerfields = new String JavaDoc[] { "Subject", "Date",
53             "From", "To" };
54
55     /**
56      * Constructor for RedirectCommand.
57      *
58      * @param frameMediator
59      * @param references
60      */

61     public RedirectCommand(ICommandReference reference) {
62         super(reference);
63     }
64
65     public void execute(IWorkerStatusController worker) throws Exception JavaDoc {
66         // create composer model
67
model = new ComposerModel();
68
69         // get selected folder
70
IMailbox folder = (IMailbox) ((MailFolderCommandReference) getReference())
71                 .getSourceFolder();
72
73         // get first selected message
74
Object JavaDoc[] uids = ((MailFolderCommandReference) getReference()).getUids();
75
76         // ->set source reference in composermodel
77
// when replying this is the original sender's message
78
// you selected and replied to
79
MailFolderCommandReference ref = new MailFolderCommandReference(folder,
80                 uids);
81         model.setSourceReference(ref);
82
83         // setup to, references and account
84
initHeader(folder, uids);
85
86         // get mimeparts
87
MimeTree mimePartTree = folder.getMimePartTree(uids[0]);
88
89         XmlElement html = MailConfig.getInstance().getMainFrameOptionsConfig()
90                 .getRoot().getElement("/options/html");
91
92         // Which Bodypart shall be shown? (html/plain)
93
MimePart bodyPart = null;
94         Integer JavaDoc[] bodyPartAddress = null;
95         if (Boolean.valueOf(html.getAttribute("prefer")).booleanValue()) {
96             bodyPart = mimePartTree.getFirstTextPart("html");
97         } else {
98             bodyPart = mimePartTree.getFirstTextPart("plain");
99         }
100
101         if (bodyPart != null) {
102             // setup charset and html
103
initMimeHeader(bodyPart);
104
105             bodyPartAddress = bodyPart.getAddress();
106
107             String JavaDoc quotedBodyText = createQuotedBody(folder, uids,
108                     bodyPartAddress);
109
110             /*
111              * *20040210, karlpeder* Remove html comments - they are not
112              * displayed properly in the composer
113              */

114             if (bodyPart.getHeader().getMimeType().getSubtype().equals("html")) {
115                 quotedBodyText = HtmlParser.removeComments(quotedBodyText);
116             }
117
118             model.setBodyText(quotedBodyText);
119         }
120
121         // add all attachments
122
MimeTree mt = folder.getMimePartTree(uids[0]);
123         Iterator JavaDoc it = mt.getAllLeafs().iterator();
124         while (it.hasNext()) {
125             MimePart mp = (MimePart) it.next();
126             Integer JavaDoc[] address = mp.getAddress();
127             // skip if bodypart (already added as quoted text)
128
if (Arrays.equals(address, bodyPartAddress))
129                 continue;
130
131             // add attachment
132
InputStream JavaDoc stream = folder.getMimePartBodyStream(uids[0], address);
133             model.addMimePart(new InputStreamMimePart(mp.getHeader(), stream));
134         }
135
136     }
137
138     private void initMimeHeader(MimePart bodyPart) {
139         MimeHeader bodyHeader = bodyPart.getHeader();
140
141         if (bodyHeader.getMimeType().getSubtype().equals("html")) {
142             model.setHtml(true);
143         } else {
144             model.setHtml(false);
145         }
146
147         // Select the charset of the original message
148
String JavaDoc charset = bodyHeader.getContentParameter("charset");
149
150         if (charset != null) {
151             model.setCharset(Charset.forName(charset));
152         }
153     }
154
155     private void initHeader(IMailbox folder, Object JavaDoc[] uids) throws Exception JavaDoc {
156         // get headerfields
157
Header header = folder.getHeaderFields(uids[0], new String JavaDoc[] {
158                 "Subject", "To", "From" });
159
160         BasicHeader rfcHeader = new BasicHeader(header);
161
162         // set subject ; mod:20040629 SWITT
163
model.setSubject(rfcHeader.getSubject());
164
165         // set From for redirecting; new: 20040629 SWITT
166
model.setHeaderField("From", rfcHeader.getFrom().toString()
167                 + " (by way of " + rfcHeader.get("To") + ")");
168     }
169
170     protected String JavaDoc createQuotedBody(IMailbox folder, Object JavaDoc[] uids,
171             Integer JavaDoc[] address) throws IOException JavaDoc, Exception JavaDoc {
172         InputStream JavaDoc bodyStream = folder.getMimePartBodyStream(uids[0], address);
173
174         String JavaDoc quotedBody;
175         // Quote original message - different methods for text and html
176
if (model.isHtml()) {
177             // Html: Insertion of text before and after original message
178

179             // build message orginal ; mod:2004629 SWITT
180
StringBuffer JavaDoc buf = new StringBuffer JavaDoc();
181             buf.append("<html><body>");
182             buf.append(HtmlParser.removeComments( // comments are not
183
// displayed
184
// correctly in composer
185
HtmlParser.getHtmlBody(StreamUtils.readCharacterStream(
186                             bodyStream).toString())));
187             buf.append("</body></html>");
188
189             quotedBody = buf.toString();
190         } else {
191             // Text: take org. message; mod:20040629 SWITT
192
quotedBody = StreamUtils.readCharacterStream(bodyStream).toString();
193
194         }
195
196         bodyStream.close();
197         return quotedBody;
198     }
199 }
Popular Tags