KickJava   Java API By Example, From Geeks To Geeks.

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


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.nio.charset.UnsupportedCharsetException JavaDoc;
24 import java.text.DateFormat JavaDoc;
25 import java.util.Arrays JavaDoc;
26 import java.util.Iterator JavaDoc;
27
28 import org.columba.api.command.ICommandReference;
29 import org.columba.api.command.IWorkerStatusController;
30 import org.columba.core.io.StreamUtils;
31 import org.columba.core.xml.XmlElement;
32 import org.columba.mail.command.MailFolderCommandReference;
33 import org.columba.mail.composer.MessageBuilderHelper;
34 import org.columba.mail.config.MailConfig;
35 import org.columba.mail.folder.IMailbox;
36 import org.columba.mail.gui.composer.ComposerModel;
37 import org.columba.mail.gui.composer.util.QuoteFilterInputStream;
38 import org.columba.mail.gui.util.AddressListRenderer;
39 import org.columba.mail.parser.text.HtmlParser;
40 import org.columba.mail.util.MailResourceLoader;
41 import org.columba.ristretto.coder.Base64DecoderInputStream;
42 import org.columba.ristretto.coder.CharsetDecoderInputStream;
43 import org.columba.ristretto.coder.QuotedPrintableDecoderInputStream;
44 import org.columba.ristretto.message.Address;
45 import org.columba.ristretto.message.BasicHeader;
46 import org.columba.ristretto.message.Header;
47 import org.columba.ristretto.message.InputStreamMimePart;
48 import org.columba.ristretto.message.MimeHeader;
49 import org.columba.ristretto.message.MimePart;
50 import org.columba.ristretto.message.MimeTree;
51
52 /**
53  * Forward message inline, which is the same as replying to someone who is not
54  * the original sender.
55  *
56  * @author fdietz
57  */

58 public class ForwardInlineCommand extends ForwardCommand {
59
60     protected final String JavaDoc[] headerfields = new String JavaDoc[] { "Subject", "Date",
61             "From", "To" };
62
63     /**
64      * Constructor for ForwardInlineCommand.
65      *
66      * @param frameMediator
67      * @param references
68      */

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

121             if (bodyPart.getHeader().getMimeType().getSubtype().equals("html")) {
122                 quotedBodyText = HtmlParser.removeComments(quotedBodyText);
123             }
124
125             model.setBodyText(quotedBodyText);
126         }
127
128         // add all attachments
129
MimeTree mt = folder.getMimePartTree(uids[0]);
130         Iterator JavaDoc it = mt.getAllLeafs().iterator();
131         while (it.hasNext()) {
132             MimePart mp = (MimePart) it.next();
133             Integer JavaDoc[] address = mp.getAddress();
134             // skip if bodypart (already added as quoted text)
135
if (Arrays.equals(address, bodyPartAddress))
136                 continue;
137
138             // add attachment
139
InputStream JavaDoc bodyStream = folder.getMimePartBodyStream(uids[0], address);
140             int encoding = mp.getHeader().getContentTransferEncoding();
141
142             switch (encoding) {
143                 case MimeHeader.QUOTED_PRINTABLE:
144                     bodyStream = new QuotedPrintableDecoderInputStream(bodyStream);
145                     break;
146
147                 case MimeHeader.BASE64:
148                     bodyStream = new Base64DecoderInputStream(bodyStream);
149                     break;
150                 default:
151             }
152
153             model.addMimePart(new InputStreamMimePart(mp.getHeader(), bodyStream));
154         }
155
156     }
157
158     private void initMimeHeader(MimePart bodyPart) {
159         MimeHeader bodyHeader = bodyPart.getHeader();
160
161         if (bodyHeader.getMimeType().getSubtype().equals("html")) {
162             model.setHtml(true);
163         } else {
164             model.setHtml(false);
165         }
166
167         // Select the charset of the original message
168
String JavaDoc charset = bodyHeader.getContentParameter("charset");
169
170         if (charset != null) {
171             try {
172                 model.setCharset(Charset.forName(charset));
173             } catch( UnsupportedCharsetException JavaDoc e ) {
174                 // Stick with the default charset
175
}
176         }
177     }
178
179     private void initHeader(IMailbox folder, Object JavaDoc[] uids)
180             throws Exception JavaDoc {
181         // get headerfields
182
Header header = folder.getHeaderFields(uids[0],
183                 new String JavaDoc[] { "Subject" });
184
185         BasicHeader rfcHeader = new BasicHeader(header);
186
187         // set subject
188
model.setSubject(MessageBuilderHelper.createForwardSubject(rfcHeader
189                 .getSubject()));
190     }
191
192     protected String JavaDoc createQuotedBody(MimeHeader header, IMailbox folder,
193             Object JavaDoc[] uids, Integer JavaDoc[] address) throws IOException JavaDoc, Exception JavaDoc {
194         InputStream JavaDoc bodyStream = folder.getMimePartBodyStream(uids[0], address);
195
196         // Do decoding stuff
197
switch (header.getContentTransferEncoding()) {
198         case MimeHeader.QUOTED_PRINTABLE: {
199             bodyStream = new QuotedPrintableDecoderInputStream(bodyStream);
200             break;
201         }
202
203         case MimeHeader.BASE64: {
204             bodyStream = new Base64DecoderInputStream(bodyStream);
205         }
206         }
207         String JavaDoc charset = header.getContentParameter("charset");
208         if (charset != null) {
209             bodyStream = new CharsetDecoderInputStream(bodyStream, Charset
210                     .forName(charset));
211         }
212
213         String JavaDoc quotedBody;
214         // Quote original message - different methods for text and html
215
if (model.isHtml()) {
216             // Html: Insertion of text before and after original message
217
// get necessary headerfields
218
BasicHeader rfcHeader = new BasicHeader(folder.getHeaderFields(
219                     uids[0], headerfields));
220             String JavaDoc subject = rfcHeader.getSubject();
221             String JavaDoc date = DateFormat.getDateTimeInstance(DateFormat.LONG,
222                     DateFormat.MEDIUM).format(rfcHeader.getDate());
223             String JavaDoc from = AddressListRenderer.renderToHTMLWithLinks(
224                     new Address[] { rfcHeader.getFrom() }).toString();
225             String JavaDoc to = AddressListRenderer.renderToHTMLWithLinks(
226                     rfcHeader.getTo()).toString();
227
228             // build "quoted" message
229
StringBuffer JavaDoc buf = new StringBuffer JavaDoc();
230             buf.append("<html><body><p>");
231             buf.append(MailResourceLoader.getString("dialog", "composer",
232                     "original_message_start"));
233             buf.append("<br>"
234                     + MailResourceLoader.getString("header", "header",
235                             "subject") + ": " + subject);
236             buf.append("<br>"
237                     + MailResourceLoader.getString("header", "header", "date")
238                     + ": " + date);
239             buf.append("<br>"
240                     + MailResourceLoader.getString("header", "header", "from")
241                     + ": " + from);
242             buf.append("<br>"
243                     + MailResourceLoader.getString("header", "header", "to")
244                     + ": " + to);
245             buf.append("</p>");
246             buf.append(HtmlParser.removeComments( // comments are not displayed
247
// correctly in composer
248
HtmlParser.getHtmlBody(StreamUtils.readCharacterStream(bodyStream)
249                             .toString())));
250             buf.append("<p>");
251             buf.append(MailResourceLoader.getString("dialog", "composer",
252                     "original_message_end"));
253             buf.append("</p></body></html>");
254
255             quotedBody = buf.toString();
256         } else {
257             BasicHeader rfcHeader = new BasicHeader(folder.getHeaderFields(
258                     uids[0], headerfields));
259             String JavaDoc date = DateFormat.getDateTimeInstance(DateFormat.LONG,
260                     DateFormat.MEDIUM).format(rfcHeader.getDate());
261             String JavaDoc from = rfcHeader.getFrom().toString();
262         
263             // Text: Addition of > before each line
264
StringBuffer JavaDoc buf = StreamUtils.readCharacterStream(
265                     new QuoteFilterInputStream(bodyStream));
266             
267             buf.insert(0, ">\n");
268             buf.insert(0, "> Date: " + date + "\n");
269             buf.insert(0, "> From: " + from + "\n");
270                     
271             quotedBody = buf.toString();
272         }
273
274         bodyStream.close();
275         return quotedBody;
276     }
277 }
Popular Tags