361
// in java/org/columba/mail/gui/message/MessageController.java
public IMailFolderCommandReference filterMessage(IMailbox folder, Object uid)
throws Exception {
return pgpFilter.filter(folder, uid);
}
// in java/org/columba/mail/gui/message/MessageController.java
public void showMessage(IMailbox folder, Object uid) throws Exception {
this.folder = folder;
this.uid = uid;
// if necessary decrypt/verify message
IMailFolderCommandReference newRefs = filterMessage(folder, uid);
// map to new reference
if (newRefs != null) {
folder = (IMailbox) newRefs.getSourceFolder();
uid = newRefs.getUids()[0];
}
MimeTree mimePartTree = folder.getMimePartTree(uid);
if (mimePartTree == null)
throw new CommandCancelledException(
"Message does not exist anymore.");
XmlElement html = MailConfig.getInstance().getMainFrameOptionsConfig()
.getRoot().getElement("/options/html");
// Which Bodypart shall be shown? (html/plain)
String preferedSubtype;
if ((Boolean.valueOf(html.getAttribute("prefer")).booleanValue())) {
preferedSubtype = "html";
} else {
preferedSubtype = "plain";
}
List parts = mimePartTree.getInlineParts(mimePartTree.getRootMimeNode(),
"text", preferedSubtype);
bodytextViewer.view(folder, uid, parts, this
.getFrameController());
spamStatusViewer.view(folder, uid, this.getFrameController());
securityStatusViewer.view(folder, uid, this.getFrameController());
headerController.view(folder, uid, this.getFrameController());
// notify all interested listeners
fireMessageSelectionChangedEvent(folder, uid.toString());
}
// in java/org/columba/mail/gui/message/MessageController.java
public void updateGUI() throws Exception {
bodytextViewer.updateGUI();
spamStatusViewer.updateGUI();
securityStatusViewer.updateGUI();
headerController.updateGUI();
}
// in java/org/columba/mail/gui/message/filter/PGPMessageFilter.java
public IMailFolderCommandReference filter(IMailbox folder, Object uid)
throws Exception {
mimePartTree = folder.getMimePartTree(uid);
// Check if the message still exists
// or has been moved by e.g. a filter
if (mimePartTree == null)
return null;
// TODO (@author waffel): encrypt AND sign dosN#t work. The message is
// always only
// encrypted. We need a function that knows, here
// is an encrypted AND signed Message. Thus first encyrpt and then
// verifySign the message
// if this message is signed/encrypted we have to use
// GnuPG to extract the decrypted bodypart
// - multipart/encrypted
// - multipart/signed
MimeType firstPartMimeType = mimePartTree.getRootMimeNode().getHeader()
.getMimeType();
AccountItem defAccount = MailConfig.getInstance().getAccountList()
.getDefaultAccount();
boolean pgpActive = false;
if (defAccount != null) {
SecurityItem pgpItem = defAccount.getPGPItem();
LOG.fine("pgp activated: " + pgpItem.get("enabled"));
pgpActive = new Boolean((pgpItem.get("enabled"))).booleanValue();
}
IMailFolderCommandReference result = null;
LOG.fine("pgp is true");
if (firstPartMimeType.getSubtype().equals("signed")) {
result = verify(folder, uid, pgpActive);
} else if (firstPartMimeType.getSubtype().equals("encrypted")) {
LOG.fine("Mimepart type encrypted found");
result = decrypt(folder, uid, pgpActive);
} else {
pgpMode = SecurityStatusViewer.NOOP;
}
// notify listeners
fireSecurityStatusEvent(new SecurityStatusEvent(this, pgpMessage,
pgpMode));
return result;
}
// in java/org/columba/mail/gui/message/filter/PGPMessageFilter.java
private IMailFolderCommandReference decrypt(IMailbox folder, Object uid,
boolean pgpActive) throws Exception, IOException {
InputStream decryptedStream = null;
LOG.fine("start decrypting");
if (!pgpActive) {
pgpMessage = "";
pgpMode = SecurityStatusViewer.NO_KEY;
} else {
MimePart encryptedMultipart = mimePartTree.getRootMimeNode();
// the second child must be the encrypted message
InputStream encryptedPart = folder.getMimePartBodyStream(uid,
encryptedMultipart.getChild(1).getAddress());
try {
JSCFController controller = JSCFController.getInstance();
JSCFConnection con = controller.getConnection();
LOG.fine("new JSCConnection");
JSCFStatement stmt = con.createStatement();
LOG.fine("new Statement");
PGPPassChecker passCheck = PGPPassChecker.getInstance();
boolean check = passCheck.checkPassphrase(con);
LOG.fine("after pass check, check is " + check);
if (!check) {
pgpMode = SecurityStatusViewer.DECRYPTION_FAILURE;
// TODO (@author fdietz): make i18n!
pgpMessage = "wrong passphrase";
return null;
}
LOG.fine("encrypted is != null?: " + (encryptedPart != null));
JSCFResultSet res = stmt.executeDecrypt(encryptedPart);
LOG.fine("after calling decrypting");
if (res.isError()) {
LOG.fine("the result set contains errors ");
pgpMode = SecurityStatusViewer.DECRYPTION_FAILURE;
pgpMessage = StreamUtils.readCharacterStream(
res.getErrorStream()).toString();
LOG.fine("error message: " + pgpMessage);
decryptedStream = res.getResultStream();
// return null;
} else {
decryptedStream = res.getResultStream();
pgpMode = SecurityStatusViewer.DECRYPTION_SUCCESS;
}
} catch (JSCFException e) {
e.printStackTrace();
LOG.severe(e.getMessage());
pgpMode = SecurityStatusViewer.DECRYPTION_FAILURE;
pgpMessage = e.getMessage();
// just show the encrypted raw message
decryptedStream = encryptedPart;
}
}
try {
LOG.fine("decrypted Stream is: " + decryptedStream);
CharSequence decryptedBodyPart = "";
// if the pgp mode is active we should get the decrypted part
if (pgpActive) {
// TODO (@author fdietz): should be removed if we only use
// Streams!
decryptedBodyPart = StreamUtils
.readCharacterStream(decryptedStream);
// check if the returned String is has a length != 0
if (decryptedBodyPart.length() == 0) {
LOG
.fine("decrypted body part has a 0 length ... fixing it");
decryptedBodyPart = new StringBuffer(
"Content-Type: text/plain; charset=\"ISO-8859-15\"\n\n");
}
}
// else we set the body to the i18n String
else {
decryptedBodyPart = new StringBuffer(
"Content-Type: text/plain; charset=\"ISO-8859-15\"\n\n"
+ MailResourceLoader.getString("menu",
"mainframe",
"security_decrypt_encrypted") + "\n");
}
LOG.fine("the decrypted Body part: " + decryptedBodyPart);
// construct new Message from decrypted string
message = new ColumbaMessage(folder.getAllHeaderFields(uid));
Source decryptedSource = new CharSequenceSource(decryptedBodyPart);
MimeHeader mimeHeader = new MimeHeader(HeaderParser
.parse(decryptedSource));
mimePartTree = new MimeTree(BodyParser.parseMimePart(mimeHeader,
decryptedSource));
message.setMimePartTree(mimePartTree);
InputStream messageSourceStream = folder
.getMessageSourceStream(uid);
message.setSource(new CharSequenceSource(StreamUtils
.readCharacterStream(messageSourceStream)));
messageSourceStream.close();
// call AbstractFilter to do the tricky part
return filter(folder, uid, message);
// header = (ColumbaHeader) message.getHeaderInterface();
} catch (ParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
/*
* controlPart.close(); encryptedPart.close(); if (decryptedStream !=
* null) { decryptedStream.close(); }
*/
return null;
}
// in java/org/columba/mail/gui/message/filter/PGPMessageFilter.java
private MailFolderCommandReference verify(IMailbox folder, Object uid,
boolean pgpActive) throws Exception, IOException {
if (!pgpActive) {
pgpMessage = "";
pgpMode = SecurityStatusViewer.NO_KEY;
return null;
}
MimePart signedMultipart = mimePartTree.getRootMimeNode();
// the first child must be the signed part
InputStream signedPart = folder.getMimePartSourceStream(uid,
signedMultipart.getChild(0).getAddress());
// the second child must be the pgp-signature
InputStream signature = folder.getMimePartBodyStream(uid,
signedMultipart.getChild(1).getAddress());
try {
JSCFController controller = JSCFController.getInstance();
JSCFConnection con = controller.getConnection();
JSCFStatement stmt = con.createStatement();
String micalg = signedMultipart.getHeader().getContentParameter(
"micalg").substring(4);
JSCFResultSet res = stmt.executeVerify(signedPart, signature,
micalg);
if (res.isError()) {
pgpMode = SecurityStatusViewer.VERIFICATION_FAILURE;
pgpMessage = StreamUtils.readCharacterStream(
res.getErrorStream()).toString();
} else {
pgpMode = SecurityStatusViewer.VERIFICATION_SUCCESS;
pgpMessage = StreamUtils.readCharacterStream(
res.getResultStream()).toString();
}
} catch (JSCFException e) {
if (Logging.DEBUG)
e.printStackTrace();
pgpMode = SecurityStatusViewer.VERIFICATION_FAILURE;
pgpMessage = e.getMessage();
// something really got wrong here -> show error dialog
// JOptionPane.showMessageDialog(null, e.getMessage());
pgpMode = SecurityStatusViewer.VERIFICATION_FAILURE;
}
signedPart.close();
signature.close();
return null;
}
// in java/org/columba/mail/gui/message/filter/AbstractFilter.java
public IMailFolderCommandReference filter(IMailbox folder, Object uid, IColumbaMessage message) throws Exception {
// map selection to this temporary message
TempFolder tempFolder = FolderTreeModel.getInstance().getTempFolder();
// add message to temporary folder
uid = tempFolder.addMessage(message);
// create reference to this message
MailFolderCommandReference local = new MailFolderCommandReference(tempFolder,
new Object[] {uid});
// if we don't use this here - actions like reply would only work
// on the
// the encrypted message
TableSelectionHandler h1 = ((TableSelectionHandler) mediator
.getSelectionManager().getHandler(TableSelectionHandler.HANDLER_ID));
h1.setLocalReference(local);
// this is needed to be able to open attachments of the decrypted
// message
// TODO check if we have to manually set the folder/uid in
// message controller to make this work
//messageController.setAttachmentSelectionReference(local);
return local;
}
// in java/org/columba/mail/gui/message/command/ViewMessageCommand.java
public void updateGUI() throws Exception {
((MailFrameMediator) mediator).removeTableSelectionListener(this);
// Update only if the selection did not change
if (updateGui) {
IMessageController messageController = ((MessageViewOwner) mediator)
.getMessageController();
// display changes
messageController.updateGUI();
fillContext();
}
}
// in java/org/columba/mail/gui/message/command/ViewMessageCommand.java
public void execute(IWorkerStatusController wsc) throws Exception {
if (!updateGui)
return;
// get command reference
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
// get selected folder
srcFolder = (IMailbox) r.getSourceFolder();
// register for status events
((StatusObservableImpl) srcFolder.getObservable()).setWorker(wsc);
// get selected message UID
uid = r.getUids()[0];
if (!srcFolder.exists(uid)) {
return;
}
try {
// get flags
flags = srcFolder.getFlags(uid);
// get messagecontroller of frame
IMessageController messageController = ((MessageViewOwner) mediator)
.getMessageController();
messageController.showMessage(srcFolder, uid);
restartMarkAsReadTimer(flags, messageController, r);
// fill semantic context
prepareContextData();
} catch (FolderInconsistentException e) {
Object[] options = new String[] { MailResourceLoader.getString("",
"global", "ok").replaceAll("&", ""), };
int result = JOptionPane.showOptionDialog(FrameManager.getInstance()
.getActiveFrame(), MailResourceLoader
.getString("dialog", "error", "message_deleted"), "Error",
JOptionPane.YES_NO_OPTION, JOptionPane.ERROR_MESSAGE, null,
null, null);
if (result == JOptionPane.YES_OPTION) {
// Synchronize the complete folder
SyncHeaderList.sync((AbstractMessageFolder) srcFolder,
srcFolder.getHeaderList());
}
throw new CommandCancelledException();
}
}
// in java/org/columba/mail/gui/message/command/ViewMessageCommand.java
private void prepareContextData() throws Exception {
// create empty value
value = mediator.getSemanticContext().createValue();
// from email address
Object fromObj = srcFolder.getAttribute(uid, "columba.from");
if (fromObj instanceof Address) {
name = NameParser.getInstance().parseDisplayName(((Address)fromObj).getDisplayName());
from = (Address) fromObj;
} else if ( fromObj instanceof String){
name = NameParser.getInstance().parseDisplayName((String) fromObj);
}
subject = (String) srcFolder.getAttribute(uid, "columba.subject");
date = (Date) srcFolder.getAttribute(uid, "columba.date");
}
// in java/org/columba/mail/gui/message/command/ViewMessageCommand.java
private void restartMarkAsReadTimer(Flags flags,
IMessageController messageController, IMailFolderCommandReference r)
throws Exception {
if (flags == null)
return;
// if the message it not yet seen
if (!flags.getSeen() && !srcFolder.isReadOnly()) {
MarkAsReadTimer.getInstance().start(messageController, r);
}
}
// in java/org/columba/mail/gui/message/command/OpenAttachmentCommand.java
public void updateGUI() throws Exception {
if (header.getMimeType().getType().toLowerCase().indexOf("message") != -1) {
MessageFrameController c = new MessageFrameController();
new DefaultContainer(c);
Object[] uidList = new Object[1];
uidList[0] = tempMessageUid;
IMailFolderCommandReference r = new MailFolderCommandReference(
tempFolder, uidList);
c.setTreeSelection(r);
c.setTableSelection(r);
CommandProcessor.getInstance().addOp(new ViewMessageCommand(c, r));
} else {
boolean attachmentHandlerExecuted = false;
try {
IExtensionHandler handler = PluginManager
.getInstance()
.getExtensionHandler(
IExtensionHandlerKeys.ORG_COLUMBA_ATTACHMENT_HANDLER);
Enumeration<IExtension> e = handler.getExtensionEnumeration();
while (e.hasMoreElements()) {
IExtension extension = e.nextElement();
try {
IAttachmentHandler attachmentHandler = (IAttachmentHandler) extension
.instanciateExtension(null);
attachmentHandler.execute(new AttachmentContext(
tempFile, header));
attachmentHandlerExecuted &= true;
} catch (PluginException e1) {
LOG.severe("Error while loading plugin: "
+ e1.getMessage());
if (Logging.DEBUG)
e1.printStackTrace();
}
}
} catch (PluginHandlerNotFoundException e2) {
LOG.severe("Error while loading plugin: " + e2.getMessage());
if (Logging.DEBUG)
e2.printStackTrace();
}
// in case no attachment handler was executed correctly
// -> fall back to default handler
if (!attachmentHandlerExecuted) {
boolean success = ColumbaDesktop.getInstance().open(tempFile);
// if attachment can't be opened, save it only
if (!success) {
File saveToFile = getDestinationFile(header);
if (saveToFile.exists())
saveToFile.delete();
tempFile.renameTo(saveToFile);
}
}
}
}
// in java/org/columba/mail/gui/message/command/OpenAttachmentCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
IMailbox folder = (IMailbox) r.getSourceFolder();
Object[] uids = r.getUids();
Integer[] address = r.getAddress();
header = folder.getMimePartTree(uids[0]).getFromAddress(address)
.getHeader();
worker.setDisplayText("Opening " + header.getFileName());
InputStream bodyStream = folder.getMimePartBodyStream(uids[0], address);
// wrap with observable stream for progress bar updates
bodyStream = new ProgressObservedInputStream(bodyStream, worker);
if (header.getMimeType().getType().equals("message")) {
tempFolder = FolderTreeModel.getInstance().getTempFolder();
try {
tempMessageUid = tempFolder.addMessage(bodyStream);
} catch (Exception e) {
LOG
.warning("Could not create temporary email from the attachment.");
}
} else {
String filename = header.getFileName();
if (filename != null) {
tempFile = TempFileStore.createTempFile(filename);
} else {
tempFile = TempFileStore.createTempFile();
}
int encoding = header.getContentTransferEncoding();
switch (encoding) {
case MimeHeader.QUOTED_PRINTABLE:
bodyStream = new QuotedPrintableDecoderInputStream(bodyStream);
break;
case MimeHeader.BASE64:
bodyStream = new Base64DecoderInputStream(bodyStream);
break;
default:
}
if (LOG.isLoggable(Level.FINE)) {
LOG.fine("Storing the attachment to :" + tempFile);
}
FileOutputStream fileStream = new FileOutputStream(tempFile);
StreamUtils.streamCopy(bodyStream, fileStream);
fileStream.close();
bodyStream.close();
}
}
// in java/org/columba/mail/gui/message/command/SaveAttachmentTemporaryCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
super.execute(worker);
commandSemaphore.release();
}
// in java/org/columba/mail/gui/message/command/ViewMessageSourceCommand.java
public void updateGUI() throws Exception {
ColumbaDesktop.getInstance().open(tempFile);
}
// in java/org/columba/mail/gui/message/command/ViewMessageSourceCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
Object[] uids = r.getUids();
IMailbox folder = (IMailbox) r.getSourceFolder();
// register for status events
((StatusObservableImpl) folder.getObservable()).setWorker(worker);
Object uid = uids[0];
InputStream in = null;
OutputStream out = null;
try {
in = new BufferedInputStream(folder.getMessageSourceStream(uid));
tempFile = TempFileStore.createTempFileWithSuffix("txt");
out = new BufferedOutputStream(new FileOutputStream(tempFile));
byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer, 0, buffer.length)) > 0) {
out.write(buffer, 0, read);
}
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException ioe) {
}
}
if (out != null) {
try {
out.close();
} catch (IOException ioe) {
}
}
}
}
// in java/org/columba/mail/gui/message/command/SaveAttachmentCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
IMailbox folder = (IMailbox) r.getSourceFolder();
Object[] uids = r.getUids();
Integer[] address = r.getAddress();
MimeHeader header = folder.getMimePartTree(uids[0]).getFromAddress(
address).getHeader();
InputStream bodyStream = folder.getMimePartBodyStream(uids[0], address);
// wrap with observable stream for progress bar updates
bodyStream = new ProgressObservedInputStream(bodyStream, worker);
File destFile = getDestinationFile(header);
if ( destFile == null ) return;
worker.setDisplayText("Saving " + destFile.getName());
// write to temporary file
File tempFile = new File(destFile.getAbsoluteFile() + ".part");
if (tempFile == null)
return;
int encoding = header.getContentTransferEncoding();
switch (encoding) {
case MimeHeader.QUOTED_PRINTABLE:
bodyStream = new QuotedPrintableDecoderInputStream(bodyStream);
break;
case MimeHeader.BASE64:
bodyStream = new Base64DecoderInputStream(bodyStream);
break;
default:
}
if (LOG.isLoggable(Level.FINE)) {
LOG.fine("Storing the attachment to :" + tempFile);
}
FileOutputStream fileStream = new FileOutputStream(tempFile);
StreamUtils.streamCopy(bodyStream, fileStream);
fileStream.close();
bodyStream.close();
// rename "*.part" file to destination file
tempFile.renameTo(destFile);
// reset progress bar
worker.setProgressBarValue(0);
// We are done - clear the status message with a delay
worker.clearDisplayTextWithDelay();
}
// in java/org/columba/mail/gui/message/viewer/HeaderViewer.java
public void view(IMailbox folder, Object uid, MailFrameMediator mediator)
throws Exception {
// add headerfields which are about to show up
XmlElement headerviewerElement = MailConfig.getInstance()
.get("options").getElement("/options/headerviewer");
IDefaultItem item = new DefaultItem(headerviewerElement);
int style = item.getIntegerWithDefault("style", 0);
map = new LinkedHashMap();
Header header = null;
String[] headers = null;
switch (style) {
case 0:
// default
headers = new String[] { "Subject", "Date", "From", "To", "Cc" };
// get header from folder
header = folder.getHeaderFields(uid, headers);
// transform headers if necessary
for (int i = 0; i < headers.length; i++) {
String key = headers[i];
JComponent[] value = transformHeaderField(header, key);
JButton trailingItem = new JButton("more...");
trailingItem = createLinkButton(trailingItem);
trailingItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
showAddressListDialog();
}
});
DynamicItemListPanel p = new DynamicItemListPanel(2,
trailingItem, true);
p.setOpaque(false);
for (int j = 0; j < value.length; j++) {
p.addItem(value[j]);
}
if (value.length > 0)
map.put(key, p);
}
break;
case 1:
// custom headers
String list = headerviewerElement.getAttribute("headerfields");
StringTokenizer tok = new StringTokenizer(list, " ");
headers = new String[tok.countTokens()];
for (int i = 0; i < headers.length; i++) {
headers[i] = tok.nextToken();
}
// get header from folder
header = folder.getHeaderFields(uid, headers);
// transform headers if necessary
for (int i = 0; i < headers.length; i++) {
String key = headers[i];
JComponent[] value = transformHeaderField(header, key);
if (value.length > 0)
map.put(key, value);
}
break;
case 2:
// default
headers = new String[] { "From" };
// get header from folder
header = folder.getHeaderFields(uid, headers);
// transform headers if necessary
for (int i = 0; i < headers.length; i++) {
String key = headers[i];
JComponent[] value = transformHeaderField(header, key);
JButton trailingItem = new JButton("more...");
trailingItem = createLinkButton(trailingItem);
trailingItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
showAddressListDialog();
}
});
DynamicItemListPanel p = new DynamicItemListPanel(2,
trailingItem, true);
p.setOpaque(false);
for (int j = 0; j < value.length; j++) {
p.addItem(value[j]);
}
if (value.length > 0)
map.put(key, p);
}
break;
}
hasAttachment = ((Boolean) folder.getAttribute(uid,
"columba.attachment")).booleanValue();
if (hasAttachment) {
JComponent[] value = createAttachmentComponentArray(folder, uid);
// create a view more button, responsible for
// opening the attachment viewer popup
JButton moreButton = createAttachmentMoreButton();
DynamicItemListPanel p = new DynamicItemListPanel(2, null, true);
p.setShowLastSeparator(false);
p.setOpaque(false);
for (int j = 0; j < value.length; j++) {
p.addItem(value[j]);
}
p.addItem(moreButton);
// TODO i18n "attachments" label
if (value.length > 0)
map.put("Attachments", p);
}
headerTextPane.setHeader(map);
attachmentViewer.view(folder, uid, mediator);
// hack to support dockable view title update
// TODO replace with listener pattern
if (mediator instanceof ThreePaneMailFrameController) {
final ThreePaneMailFrameController c = (ThreePaneMailFrameController) mediator;
// get header from folder
final String title = (String) folder.getAttribute(uid,
"columba.subject");
// awt-event-thread
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
c.getMessageViewerDockable().setTitle(title);
}
});
}
// in java/org/columba/mail/gui/message/viewer/HeaderViewer.java
private JComponent[] createAttachmentComponentArray(final IMailbox folder,
final Object uid) throws Exception {
Vector vector = new Vector();
MimeTree model = folder.getMimePartTree(uid);
List displayedMimeParts = model.getAllLeafs();
// remove body part if already shown in text viewer
removeBodyParts(model, displayedMimeParts);
// Display resulting MimeParts
for (int i = 0; i < displayedMimeParts.size(); i++) {
final StreamableMimePart mp = (StreamableMimePart) displayedMimeParts
.get(i);
// create attachment component with text, icon
// tooltip, context menu and double-click action
JButton button = createAttachmentItem(mp);
vector.add(button);
}
// // create a view more button, responsible for
// // opening the attachment viewer popup
// JButton moreButton = createAttachmentMoreButton();
// vector.add(moreButton);
return (JComponent[]) vector.toArray(new JComponent[0]);
}
// in java/org/columba/mail/gui/message/viewer/HeaderViewer.java
public void updateGUI() throws Exception {
headerTextPane.updateGUI();
layoutComponents();
revalidate();
repaint();
attachmentViewer.updateGUI();
}
// in java/org/columba/mail/gui/message/viewer/SpamStatusViewer.java
public void view(IMailbox folder, Object uid, MailFrameMediator mediator)
throws Exception {
Boolean spam = (Boolean) folder.getAttribute(uid, "columba.spam");
visible = spam.booleanValue();
}
// in java/org/columba/mail/gui/message/viewer/SpamStatusViewer.java
public void updateGUI() throws Exception {
setSpam(visible);
}
// in java/org/columba/mail/gui/message/viewer/TextViewer.java
public void view(IMailbox folder, Object uid, List bodyParts,
MailFrameMediator mediator) throws Exception {
this.folder = folder;
this.uid = uid;
InputStream bodyStream;
MimeTree mimePartTree = folder.getMimePartTree(uid);
if (bodyParts.size() == 0) {
body = MessageParser.transformTextToHTML("<No Message-Text>", css,
enableSmilies, true);
} else {
body = "";
for (int i = 0; i < bodyParts.size(); i++) {
MimePart bodyPart = (MimePart) bodyParts.get(i);
htmlMessage = bodyPart.getHeader().getMimeType().getSubtype()
.equals("html");
bodyStream = folder.getMimePartBodyStream(uid, bodyPart
.getAddress());
bodyStream = MessageParser.decodeBodyStream(bodyPart, bodyStream);
// Which Charset shall we use ?
Charset charset = ((CharsetOwnerInterface) mediator).getCharset();
charset = MessageParser.extractCharset(charset, bodyPart);
bodyStream = new FallbackCharsetDecoderInputStream(bodyStream,
charset);
// Read Stream in String
StringBuffer text = StreamUtils.readCharacterStream(bodyStream);
// if HTML stripping is enabled
if (isHTMLStrippingEnabled()) {
// strip HTML message -> remove all HTML tags
text = new StringBuffer(HtmlParser.stripHtmlTags(text.toString(),
true));
htmlMessage = false;
}
if (htmlMessage) {
// Download any CIDs in the html mail
body += HtmlParser.getHtmlBody(downloadCIDParts(text.toString(), mimePartTree));
} else {
body += MessageParser.transformTextToHTML(text.toString(), css,
enableSmilies, false);
}
}
body = MessageParser.transformToHTML(new StringBuffer(body), css);
}
}
// in java/org/columba/mail/gui/message/viewer/TextViewer.java
public void updateGUI() throws Exception {
viewerPlugin.view(body);
}
// in java/org/columba/mail/gui/message/viewer/TextViewer.java
private void downloadMimePart(MimePart part, File destFile)
throws Exception {
MimeHeader header = part.getHeader();
InputStream bodyStream = folder.getMimePartBodyStream(uid, part
.getAddress());
int encoding = header.getContentTransferEncoding();
switch (encoding) {
case MimeHeader.QUOTED_PRINTABLE:
bodyStream = new QuotedPrintableDecoderInputStream(bodyStream);
break;
case MimeHeader.BASE64:
bodyStream = new Base64DecoderInputStream(bodyStream);
break;
default:
}
FileOutputStream fileStream = new FileOutputStream(destFile);
StreamUtils.streamCopy(bodyStream, fileStream);
fileStream.close();
bodyStream.close();
}
// in java/org/columba/mail/gui/message/viewer/AttachmentsViewer.java
public void view(IMailbox folder, Object uid, MailFrameMediator mediator)
throws Exception {
setLocalReference(new MailFolderCommandReference(folder,
new Object[] { uid }));
mimePartTree = folder.getMimePartTree(uid);
}
// in java/org/columba/mail/gui/message/viewer/AttachmentsViewer.java
public void updateGUI() throws Exception {
if (mimePartTree == null)
return;
setMimePartTree(mimePartTree);
}
// in java/org/columba/mail/gui/message/viewer/SecurityStatusViewer.java
public void view(IMailbox folder, Object uid, MailFrameMediator mediator)
throws Exception {
}
// in java/org/columba/mail/gui/message/viewer/SecurityStatusViewer.java
public void updateGUI() throws Exception {
}
// in java/org/columba/mail/gui/message/viewer/MessageParser.java
public static String transformTextToHTML(String bodyText, String css,
boolean enableSmilies, boolean encapsulate) throws Exception {
String body = null;
// substitute special characters like:
// <,>,&,\t,\n
body = HtmlParser.substituteSpecialCharacters(bodyText);
// parse for urls and substite with HTML-code
body = HtmlParser.substituteURL(body);
// parse for email addresses and substite with HTML-code
body = HtmlParser.substituteEmailAddress(body);
// parse for quotings and color the darkgray
body = DocumentParser.markQuotings(body);
// add smilies
if (enableSmilies == true) {
body = DocumentParser.addSmilies(body);
}
body = "<P>" + body + "</P>";
// encapsulate bodytext in html-code
if (encapsulate)
body = transformToHTML(new StringBuffer(body), css);
return body;
}
// in java/org/columba/mail/gui/message/viewer/MessageParser.java
public static InputStream decodeBodyStream(MimePart bodyPart,
InputStream bodyStream) throws Exception {
// default encoding is plain
int encoding = MimeHeader.PLAIN;
if (bodyPart != null) {
encoding = bodyPart.getHeader().getContentTransferEncoding();
}
switch (encoding) {
case MimeHeader.QUOTED_PRINTABLE: {
bodyStream = new QuotedPrintableDecoderInputStream(bodyStream);
break;
}
case MimeHeader.BASE64: {
bodyStream = new Base64DecoderInputStream(bodyStream);
break;
}
}
return bodyStream;
}
// in java/org/columba/mail/gui/message/util/DocumentParser.java
public static String markQuotings(String input) throws Exception {
Matcher matcher = markQuotingsPattern.matcher(input);
return matcher.replaceAll("\n<font class=\"quoting\">$1$3</font>");
}
// in java/org/columba/mail/gui/message/util/DocumentParser.java
public static String addSmilies(String input) throws Exception {
Matcher matcher;
for (int i = 0; i < smilyPattern.length; i++) {
matcher = smilyPattern[i].matcher(input);
input = matcher.replaceAll(" <IMG SRC=\"" + smilyImage[i] +
"\">");
}
return input;
}
// in java/org/columba/mail/gui/tree/command/CreateSubFolderCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
parentFolder = (IMailFolder) ((IMailFolderCommandReference) getReference())
.getSourceFolder();
String name = ((IMailFolderCommandReference) getReference())
.getFolderName();
String type = ((IMailFolderCommandReference) getReference())
.getFolderType();
try {
if (type == null) {
FolderFactory.getInstance()
.createDefaultChild(parentFolder, name);
} else {
FolderFactory.getInstance()
.createChild(parentFolder, name, type);
}
} catch (FolderCreationException ex) {
// show error message
JOptionPane.showMessageDialog(FrameManager.getInstance()
.getActiveFrame(), MessageFormat.format(
MailResourceLoader.getString("dialog", "folder",
"error_no_subfolder_allowed"),
new String[] { parentFolder.getName() }),
MailResourceLoader.getString("dialog", "folder",
"error_title"), JOptionPane.ERROR_MESSAGE);
}
}
// in java/org/columba/mail/gui/tree/command/CreateAndSelectSubFolderCommand.java
public void updateGUI() throws Exception {
if (success) {
/*
* MailInterface.treeModel.nodeStructureChanged(parentFolder);
*/
// select node in JTree
TreeNode[] nodes = childFolder.getPath();
tree.setSelectionPath(new TreePath(nodes));
}
}
// in java/org/columba/mail/gui/tree/command/CreateAndSelectSubFolderCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
parentFolder = (IMailFolder) ((IMailFolderCommandReference) getReference())
.getSourceFolder();
String name = ((IMailFolderCommandReference) getReference())
.getFolderName();
try {
childFolder = FolderFactory.getInstance().createDefaultChild(
parentFolder, name);
// if folder creation failed
// -> don't update tree ui
if (childFolder == null) {
success = false;
}
} catch (Exception ex) {
success = false;
throw ex;
}
}
// in java/org/columba/mail/gui/tree/command/MailboxSizeCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
IMailFolder folder = (IMailFolder) ((IMailFolderCommandReference) getReference())
.getSourceFolder();
total = 0;
if (folder instanceof IMailbox) {
IHeaderList headerList = ((IMailbox) folder).getHeaderList();
ICloseableIterator it = headerList.headerIterator();
while (it.hasNext()) {
IColumbaHeader header = (IColumbaHeader) it.next();
Integer sizeInt = (Integer) header.getAttributes().get(
"columba.size");
if (sizeInt != null) {
total += sizeInt.intValue();
}
}
it.close();
}
}
// in java/org/columba/mail/gui/tree/command/MailboxSizeCommand.java
public void updateGUI() throws Exception {
dialog.setMailboxSize(total);
}
// in java/org/columba/mail/gui/config/subscribe/UnsubscribeFolderCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
SubscribeCommandReference subscribeReference = (SubscribeCommandReference) getReference();
root = (IMAPRootFolder) subscribeReference.getSourceFolder();
store = root.getServer();
store.unsubscribeFolder(subscribeReference.getMailbox());
}
// in java/org/columba/mail/gui/config/subscribe/UnsubscribeFolderCommand.java
public void updateGUI() throws Exception {
SubscribeDialog dialog = ((SubscribeCommandReference) getReference())
.getDialog();
dialog.unsubscribeDone();
}
// in java/org/columba/mail/gui/config/subscribe/SynchronizeFolderListCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
root = (IMAPRootFolder) ((SubscribeCommandReference) getReference())
.getSourceFolder();
store = root.getServer();
node = createTreeStructure();
}
// in java/org/columba/mail/gui/config/subscribe/SynchronizeFolderListCommand.java
private List fetchUnsubscribedFolders(String reference) throws Exception {
NamespaceCollection namespaces;
// Does the server support the namespace extension?
if (store.isSupported("NAMESPACE")) {
namespaces = store.fetchNamespaces();
} else {
// create default namespace
namespaces = new NamespaceCollection();
namespaces.addPersonalNamespace(new Namespace("", "/"));
}
ArrayList result = new ArrayList();
Iterator it;
// Process personal namespaces
if (namespaces.getPersonalNamespaceSize() > 0) {
it = namespaces.getPersonalIterator();
while (it.hasNext()) {
Namespace pN = (Namespace) it.next();
ListInfo[] list = store.list("", pN.getPrefix() + '%');
result.addAll(Arrays.asList(list));
}
}
// Process other users namespaces
if (namespaces.getOtherUserNamespaceSize() > 0) {
it = namespaces.getOtherUserIterator();
while (it.hasNext()) {
Namespace pN = (Namespace) it.next();
ListInfo[] list = store.list("", pN.getPrefix() + '%');
result.addAll(Arrays.asList(list));
}
}
// Process shared namespaces
if (namespaces.getSharedNamespaceSize() > 0) {
it = namespaces.getSharedIterator();
while (it.hasNext()) {
Namespace pN = (Namespace) it.next();
ListInfo[] list = store.list("", pN.getPrefix() + '%');
result.addAll(Arrays.asList(list));
}
}
for(int i=0; i<result.size(); i++ ) {
ListInfo info = (ListInfo) result.get(i);
// Handle special case in which INBOX has a NIL delimiter
// -> there might exist a pseudo hierarchy under INBOX+delimiter
if (info.getName().equalsIgnoreCase("INBOX") && info.getDelimiter() == null) {
result.addAll(Arrays.asList(store.list("", "INBOX"
+ store.getDelimiter() + '%')));
break;
}
// If this folder has children add them
// TODO: In the future we should try to fetch additional children on demand
// when the tree of the dialog is opened
if (store.isSupported("CHILDREN")) {
if( info.getParameter(ListInfo.HASCHILDREN)) {
result.addAll(Arrays.asList(store.list("", info.getName()
+ store.getDelimiter() + '%')));
}
} else {
ListInfo[] childlist = store.list("", info.getName() + store.getDelimiter() + '%');
if (childlist.length > 0)
result.addAll(Arrays.asList(childlist));
}
}
return result;
}
// in java/org/columba/mail/gui/config/subscribe/SynchronizeFolderListCommand.java
private TreeNode createTreeStructure() throws Exception {
ListInfo[] lsub = store.fetchSubscribedFolders();
// Create list of unsubscribed folders
List subscribedFolders = new ArrayList(Arrays.asList(lsub));
// INBOX is always subscribed
subscribedFolders.add(new ListInfo("INBOX", null, 0));
List unsubscribedFolders = fetchUnsubscribedFolders("");
ListTools.substract(unsubscribedFolders, subscribedFolders);
// Now we have the subscribed folders in subscribedFolders
// and the unsubscribed folders in unsubscribedFolders
// Next step: Create a treestructure
CheckableItemImpl rootNode = new CheckableItemImpl(root.getName());
Iterator it = unsubscribedFolders.iterator();
while (it.hasNext()) {
ListInfoTreeNode node = insertTreeNode((ListInfo) it.next(),
rootNode);
node.setSelected(false);
}
it = subscribedFolders.iterator();
while (it.hasNext()) {
ListInfoTreeNode node = insertTreeNode((ListInfo) it.next(),
rootNode);
node.setSelected(true);
}
return rootNode;
}
// in java/org/columba/mail/gui/config/subscribe/SynchronizeFolderListCommand.java
public void updateGUI() throws Exception {
SubscribeDialog dialog = ((SubscribeCommandReference) getReference())
.getDialog();
dialog.syncFolderListDone(new DefaultTreeModel(node));
}
// in java/org/columba/mail/gui/config/subscribe/SubscribeFolderCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
SubscribeCommandReference subscribeReference = (SubscribeCommandReference) getReference();
root = (IMAPRootFolder) subscribeReference.getSourceFolder();
store = root.getServer();
store.subscribeFolder(subscribeReference.getMailbox());
}
// in java/org/columba/mail/gui/config/subscribe/SubscribeFolderCommand.java
public void updateGUI() throws Exception {
SubscribeDialog dialog = ((SubscribeCommandReference) getReference())
.getDialog();
dialog.subscribeDone();
}
// in java/org/columba/mail/gui/contact/list/ContactListModel.java
public void setPatternString(String s) throws Exception {
patternString = s;
// manipulateModel(TableModelPlugin.STRUCTURE_CHANGE);
}
// in java/org/columba/mail/gui/tagging/TagFolderFactory.java
public static VirtualFolder createTagFolder(ITag tag, IMailFolder folder)
throws Exception {
// get search folder
VirtualFolder tagFolder = new VirtualFolder("Tag Folder", folder);
// TODO: @author hubms check what is neccessary
// remove old filters
// searchFolder.getFilter().getFilterRule().removeAll();
// add filter criteria
// searchFolder.getFilter().getFilterRule().add(c);
// search in subfolders recursively
tagFolder.getConfiguration().setString("property",
"include_subfolders", "true");
String uid = folder.getId();
// set source folder UID
tagFolder.getConfiguration().setString("property", "source_uid", uid);
return tagFolder;
}
// in java/org/columba/mail/gui/composer/html/HtmlToolbar.java
protected void initComponents() throws Exception {
// CellConstraints cc = new CellConstraints();
// we generate most buttons using the actions already instanciated
paragraphComboBox = new JComboBox(ParagraphMenu.STYLE_TAGS);
paragraphComboBox.setRenderer(new ParagraphTagRenderer());
paragraphComboBox.setActionCommand("PARA");
paragraphComboBox.addActionListener(this);
paragraphComboBox.setFocusable(false);
LabelWithMnemonic sizeLabel = new LabelWithMnemonic(MailResourceLoader
.getString("dialog", "composer", "size"));
sizeComboBox = new JComboBox(FontSizeMenu.SIZES);
sizeComboBox.setActionCommand("SIZE");
sizeComboBox.addActionListener(this);
sizeComboBox.setSelectedIndex(2);
sizeComboBox.setFocusable(false);
// set initial enabled state of combo boxes
// XmlElement optionsElement = MailConfig.getInstance().get(
// "composer_options").getElement("/options");
// XmlElement htmlElement = optionsElement.getElement("html");
// String s = htmlElement.getAttribute("enable", "false");
// boolean enableHtml = Boolean.valueOf(s).booleanValue();
// paragraphComboBox.setEnabled(enableHtml);
// TODO (@author javaprog):sizeComboBox can be enabled as
// paragraphComboBox when implemented
sizeComboBox.setEnabled(false);
ToggleToolbarButton boldFormatButton = new ToggleToolbarButton(
(AbstractSelectableAction) getAction("BoldFormatAction",
getFrameController()));
ToggleToolbarButton italicFormatButton = new ToggleToolbarButton(
(AbstractSelectableAction) getAction("ItalicFormatAction",
getFrameController()));
ToggleToolbarButton underlineFormatButton = new ToggleToolbarButton(
(AbstractSelectableAction) getAction("UnderlineFormatAction",
getFrameController()));
ToggleToolbarButton strikeoutFormatButton = new ToggleToolbarButton(
(AbstractSelectableAction) getAction("StrikeoutFormatAction",
getFrameController()));
ToggleToolbarButton leftJustifyButton = new ToggleToolbarButton(
(AbstractSelectableAction) getAction("LeftJustifyAction",
getFrameController()));
ToggleToolbarButton centerJustifyButton = new ToggleToolbarButton(
(AbstractSelectableAction) getAction("CenterJustifyAction",
getFrameController()));
ToggleToolbarButton rightJustifyButton = new ToggleToolbarButton(
(AbstractSelectableAction) getAction("RightJustifyAction",
getFrameController()));
// builder.add(paraLabel, cc.xy(1, 7));
add(paragraphComboBox);
addSeparator();
add(sizeLabel);
add(sizeComboBox);
addSeparator();
add(boldFormatButton);
add(italicFormatButton);
add(underlineFormatButton);
add(strikeoutFormatButton);
addSeparator();
add(leftJustifyButton);
add(centerJustifyButton);
add(rightJustifyButton);
add(Box.createHorizontalGlue());
// FormLayout layout = new FormLayout(
// "default, 3dlu, default, 3dlu, default, 3dlu, "
// + "default, 3dlu, default, 3dlu, default, 3dlu, "
// + "default, 6dlu, default, 3dlu, default, 3dlu, "
// + "default, 3dlu", "fill:default");
// PanelBuilder b = new PanelBuilder(this, layout);
//
// CellConstraints c = new CellConstraints();
//
// b.add(paragraphComboBox, cc.xy(1, 1));
// b.add(sizeLabel, cc.xy(3, 1));
// b.add(sizeComboBox, cc.xy(5, 1));
// b.add(boldFormatButton, cc.xy(7, 1));
// b.add(italicFormatButton, cc.xy(9, 1));
// b.add(underlineFormatButton, cc.xy(11, 1));
// b.add(strikeoutFormatButton, cc.xy(13, 1));
// b.add(leftJustifyButton, cc.xy(15, 1));
// b.add(centerJustifyButton, cc.xy(17, 1));
// b.add(rightJustifyButton, cc.xy(19, 1));
// builder.add(panel, cc.xy(1, 7));
}
// in java/org/columba/mail/gui/composer/command/ReplyToMailingListCommand.java
protected void initHeader(IMailbox folder, Object[] uids)
throws Exception {
// get headerfields
Header header = folder.getHeaderFields(uids[0], headerfields);
BasicHeader rfcHeader = new BasicHeader(header);
// set subject
model.setSubject(MessageBuilderHelper.createReplySubject(
rfcHeader.getSubject()));
// Use reply-to field if given, else use from
Address to = rfcHeader.getBeenThere();
if (to == null) {
Address[] replyTo = rfcHeader.getReplyTo();
if (replyTo.length > 0) {
to = replyTo[0];
}
}
if (to == null) {
to = rfcHeader.getFrom();
}
MessageBuilderHelper.addAddressesToAddressbook(new Address[] { to });
model.setTo(new Address[] { to });
// create In-Reply-To:, References: headerfields
MessageBuilderHelper.createMailingListHeaderItems(header, model);
// select the account this mail was received from
Integer accountUid = (Integer) folder.getAttribute(uids[0],
"columba.accountuid");
AccountItem accountItem = MessageBuilderHelper.getAccountItem(accountUid);
model.setAccountItem(accountItem);
}
// in java/org/columba/mail/gui/composer/command/RedirectCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// create composer model
model = new ComposerModel();
// get selected folder
IMailbox folder = (IMailbox) ((MailFolderCommandReference) getReference())
.getSourceFolder();
// get first selected message
Object[] uids = ((MailFolderCommandReference) getReference()).getUids();
// ->set source reference in composermodel
// when replying this is the original sender's message
// you selected and replied to
MailFolderCommandReference ref = new MailFolderCommandReference(folder,
uids);
model.setSourceReference(ref);
// setup to, references and account
initHeader(folder, uids);
// get mimeparts
MimeTree mimePartTree = folder.getMimePartTree(uids[0]);
XmlElement html = MailConfig.getInstance().getMainFrameOptionsConfig()
.getRoot().getElement("/options/html");
// Which Bodypart shall be show? (html/plain)
MimePart bodyPart = null;
Integer[] bodyPartAddress = null;
if (Boolean.valueOf(html.getAttribute("prefer")).booleanValue()) {
bodyPart = mimePartTree.getFirstTextPart("html");
} else {
bodyPart = mimePartTree.getFirstTextPart("plain");
}
if (bodyPart != null) {
// setup charset and html
initMimeHeader(bodyPart);
bodyPartAddress = bodyPart.getAddress();
String quotedBodyText = createQuotedBody(bodyPart.getHeader(),
folder, uids, bodyPartAddress);
model.setBodyText(quotedBodyText);
}
// add all attachments
MimeTree mt = folder.getMimePartTree(uids[0]);
Iterator it = mt.getAllLeafs().iterator();
while (it.hasNext()) {
MimePart mp = (MimePart) it.next();
Integer[] address = mp.getAddress();
// skip if bodypart (already added as quoted text)
if (Arrays.equals(address, bodyPartAddress))
continue;
// add attachment
InputStream stream = folder.getMimePartBodyStream(uids[0], address);
model.addMimePart(new InputStreamMimePart(mp.getHeader(), stream));
}
// select the account this mail was received from
Integer accountUid = (Integer) folder.getAttribute(uids[0],
"columba.accountuid");
AccountItem accountItem = MessageBuilderHelper
.getAccountItem(accountUid);
model.setAccountItem(accountItem);
}
// in java/org/columba/mail/gui/composer/command/RedirectCommand.java
private void initHeader(IMailbox folder, Object[] uids) throws Exception {
// get headerfields
Header header = folder.getHeaderFields(uids[0], new String[] {
"Subject", "To", "From" });
BasicHeader rfcHeader = new BasicHeader(header);
// set subject ; mod:20040629 SWITT
model.setSubject(rfcHeader.getSubject());
// set From for redirecting; new: 20040629 SWITT
model.setHeaderField("From", rfcHeader.getFrom().toString()
+ " (by way of " + rfcHeader.get("To") + ")");
}
// in java/org/columba/mail/gui/composer/command/RedirectCommand.java
protected String createQuotedBody(MimeHeader header, IMailbox folder,
Object[] uids, Integer[] address) throws IOException, Exception {
InputStream bodyStream = folder.getMimePartBodyStream(uids[0], address);
// Do decoding stuff
switch( header.getContentTransferEncoding() ) {
case MimeHeader.QUOTED_PRINTABLE : {
bodyStream = new QuotedPrintableDecoderInputStream(bodyStream);
break;
}
case MimeHeader.BASE64 : {
bodyStream = new Base64DecoderInputStream(bodyStream);
}
}
String charset = header.getContentParameter("charset");
if( charset != null ) {
try {
bodyStream = new CharsetDecoderInputStream(bodyStream, Charset.forName(charset));
} catch( UnsupportedCharsetException e ) {
// Stick with the default charset
}
}
String quotedBody;
// Quote original message - different methods for text and html
if (model.isHtml()) {
// Html: Insertion of text before and after original message
// build message orginal ; mod:2004629 SWITT
StringBuffer buf = new StringBuffer();
buf.append("<html><body>");
buf.append(HtmlParser.removeComments(// comments are not displayed
// correctly in composer
HtmlParser.getHtmlBody(StreamUtils.readCharacterStream(
bodyStream).toString())));
buf.append("</body></html>");
quotedBody = buf.toString();
} else {
// Text: take org. message; mod:20040629 SWITT
quotedBody = StreamUtils.readCharacterStream(bodyStream).toString();
}
bodyStream.close();
return quotedBody;
}
// in java/org/columba/mail/gui/composer/command/SaveMessageCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
ComposerCommandReference r = (ComposerCommandReference) getReference();
ComposerController composerController = r.getComposerController();
SendableMessage message = (SendableMessage) r.getMessage();
if (message == null) {
message = new MessageComposer(((ComposerModel) composerController
.getModel())).compose(worker, r.isAppendSignature());
}
folder = (IMailbox) r.getSourceFolder();
worker.setDisplayText(MailResourceLoader.getString("statusbar",
"message", "save_message"));
InputStream sourceStream = new ProgressObservedInputStream(message
.getSourceStream(), worker);
folder.addMessage(sourceStream, message.getHeader().getAttributes(),
message.getHeader().getFlags());
sourceStream.close();
// Add all recipients to the collected addresses
List recipients = message.getRecipients();
if (recipients != null && recipients.size() > 0) {
Address[] addresses = new Address[recipients.size()];
for (int i = 0; i < recipients.size(); i++) {
try {
addresses[i] = AddressParser
.parseAddress((String) recipients.get(i));
} catch (ParserException e) {
addresses[i] = addresses[i - 1];
}
}
MessageBuilderHelper.addAddressesToAddressbook(addresses);
}
}
// in java/org/columba/mail/gui/composer/command/OpenMessageWithComposerCommand.java
public void updateGUI() throws Exception {
// open composer frame
controller = new ComposerController();
new DefaultContainer(controller);
// apply model
controller.setComposerModel(model);
// model->view update
controller.updateComponents(true);
}
// in java/org/columba/mail/gui/composer/command/OpenMessageWithComposerCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
model = new ComposerModel();
// get selected folder
folder = (IMailbox) ((MailFolderCommandReference) getReference())
.getSourceFolder();
// get selected messages
Object[] uids = ((MailFolderCommandReference) getReference()).getUids();
// we only need the first message
uid = uids[0];
//TODO (@author fdietz): keep track of progress here
InputStream messageSourceStream = folder.getMessageSourceStream(uid);
Source tempSource = TempSourceFactory.createTempSource(
messageSourceStream, -1);
messageSourceStream.close();
Message message = MessageParser.parse(tempSource);
initHeader(message);
// get message flags
Flags flags = folder.getFlags(uid);
model.getMessage().getHeader().setFlags(flags);
// select the account this mail was received from
Integer accountUid = (Integer) folder.getAttribute(uids[0],
"columba.accountuid");
AccountItem accountItem = MessageBuilderHelper
.getAccountItem(accountUid);
model.setAccountItem(accountItem);
XmlElement html = MailConfig.getInstance().getMainFrameOptionsConfig()
.getRoot().getElement("/options/html");
boolean preferHtml = Boolean.valueOf(html.getAttribute("prefer"))
.booleanValue();
initBody(message, preferHtml);
// store reference to source message
model.setSourceReference(new MailFolderCommandReference(folder, new Object[] {uid}));
}
// in java/org/columba/mail/gui/composer/command/OpenMessageWithComposerCommand.java
private void initBody(Message message, boolean preferHtml) throws Exception {
MimeTree mimeTree = message.getMimePartTree();
// Which Bodypart shall be shown? (html/plain)
LocalMimePart bodyPart = null;
if (preferHtml) {
bodyPart = (LocalMimePart) mimeTree.getFirstTextPart("html");
} else {
bodyPart = (LocalMimePart) mimeTree.getFirstTextPart("plain");
}
if (bodyPart != null) {
MimeHeader header = bodyPart.getHeader();
if (header.getMimeType().getSubtype().equals("html")) {
// html
model.setHtml(true);
} else {
model.setHtml(false);
}
InputStream bodyStream = folder.getMimePartBodyStream(uid, bodyPart.getAddress());
// Do decoding stuff
switch( header.getContentTransferEncoding() ) {
case MimeHeader.QUOTED_PRINTABLE : {
bodyStream = new QuotedPrintableDecoderInputStream(bodyStream);
break;
}
case MimeHeader.BASE64 : {
bodyStream = new Base64DecoderInputStream(bodyStream);
}
}
String charset = header.getContentParameter("charset");
if (charset != null) {
try {
bodyStream = new CharsetDecoderInputStream(bodyStream, Charset.forName(charset));
model.setCharset(Charset.forName(charset));
} catch( UnsupportedCharsetException e ) {
// Stick with the default charset
}
}
model.setBodyText(StreamUtils.readCharacterStream(
bodyStream)
.toString());
}
initAttachments(mimeTree, bodyPart);
}
// in java/org/columba/mail/gui/composer/command/ReplyToAllCommand.java
protected void initHeader(IMailbox folder, Object[] uids)
throws Exception {
// get headerfields
Header header = folder.getHeaderFields(uids[0], headerfields);
// From which account is this mail?
Integer accountUid = (Integer) folder.getAttribute(uids[0], "columba.accountuid");
AccountItem accountItem = MessageBuilderHelper.getAccountItem(accountUid);
Address accountAddress = null;
if ( accountItem != null)
accountAddress = MailConfig.getInstance().getAccountList().uidGet(accountUid.intValue()).getIdentity().getAddress();
BasicHeader rfcHeader = new BasicHeader(header);
// set subject
model.setSubject(MessageBuilderHelper.createReplySubject(
rfcHeader.getSubject()));
LinkedList toList = new LinkedList();
toList.addAll(Arrays.asList(rfcHeader.getReplyTo()));
toList.add(rfcHeader.getFrom());
toList.addAll(Arrays.asList(rfcHeader.getTo()));
// bug #997560 (fdietz): CC: should be in Cc:, instead of To:
//toList.addAll(Arrays.asList(rfcHeader.getCc()));
// remove duplicates
Collections.sort(toList);
Iterator it = toList.iterator();
Address last = (Address) it.next();
while (it.hasNext()) {
Address act = (Address) it.next();
// Remove duplicates or the mail address from the receiver account
if (last.equals(act) || (accountAddress != null && accountAddress.equals(act)) ) {
it.remove();
} else {
last = act;
}
}
Address[] to = (Address[]) toList.toArray(new Address[] { });
// Add addresses to the addressbook
MessageBuilderHelper.addAddressesToAddressbook(to);
model.setTo(to);
// bug #997560 (fdietz): CC: should be in Cc:, instead of To:
LinkedList ccList = new LinkedList();
ccList.addAll(Arrays.asList(rfcHeader.getCc()));
it = ccList.iterator();
while (it.hasNext()) {
Address act = (Address) it.next();
// Remove the mail address from the receiver account
if (accountAddress != null && accountAddress.equals(act)) {
it.remove();
}
}
Address[] cc = (Address[]) ccList.toArray(new Address[] { });
model.setCc(cc);
// create In-Reply-To:, References: headerfields
MessageBuilderHelper.createMailingListHeaderItems(header, model);
// select the account this mail was received from
model.setAccountItem(accountItem);
}
// in java/org/columba/mail/gui/composer/command/ReplyCommand.java
public void updateGUI() throws Exception {
// open composer frame
controller = new ComposerController();
new DefaultContainer(controller);
// apply model
controller.setComposerModel(model);
// model->view update
controller.updateComponents(true);
// Set the focus to the editor pane and set cursor to the top
controller.getCurrentEditor().getViewUIComponent().requestFocus();
controller.getCurrentEditor().getViewUIComponent().moveCaretPosition(0);
controller.getCurrentEditor().getViewUIComponent().select(0,0);
}
// in java/org/columba/mail/gui/composer/command/ReplyCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// create composer model
model = new ComposerModel();
// get selected folder
IMailbox folder = (IMailbox) ((MailFolderCommandReference) getReference())
.getSourceFolder();
// get first selected message
Object[] uids = ((MailFolderCommandReference) getReference()).getUids();
// ->set source reference in composermodel
// when replying this is the original sender's message
// you selected and replied to
MailFolderCommandReference ref = new MailFolderCommandReference(folder, uids);
model.setSourceReference(ref);
// setup to, references and account
initHeader(folder, uids);
// get mimeparts
MimeTree mimePartTree = folder.getMimePartTree(uids[0]);
XmlElement html = MailConfig.getInstance().getMainFrameOptionsConfig()
.getRoot().getElement("/options/html");
// Which Bodypart shall be used? (html/plain)
MimePart bodyPart = null;
if (Boolean.valueOf(html.getAttribute("prefer")).booleanValue()) {
bodyPart = mimePartTree.getFirstTextPart("html");
} else {
bodyPart = mimePartTree.getFirstTextPart("plain");
}
if (bodyPart != null) {
// setup charset and html
initMimeHeader(bodyPart);
Integer[] address = bodyPart.getAddress();
String quotedBodyText = createQuotedBody(bodyPart.getHeader(), folder, uids, address);
// debug output
LOG.fine("Quoted body text:\n" + quotedBodyText);
model.setBodyText(quotedBodyText);
}
}
// in java/org/columba/mail/gui/composer/command/ReplyCommand.java
protected void initHeader(IMailbox folder, Object[] uids) throws Exception {
// get headerfields
Header header = folder.getHeaderFields(uids[0], headerfields);
BasicHeader rfcHeader = new BasicHeader(header);
// set subject
model.setSubject(MessageBuilderHelper.createReplySubject(rfcHeader
.getSubject()));
// Use reply-to field if given, else use from
Address[] to = rfcHeader.getReplyTo();
if (to.length == 0) {
to = new Address[] { rfcHeader.getFrom()};
}
// Add addresses to the addressbook
MessageBuilderHelper.addAddressesToAddressbook(to);
model.setTo(to);
// create In-Reply-To:, References: headerfields
MessageBuilderHelper.createMailingListHeaderItems(header, model);
// select the account this mail was received from
Integer accountUid = (Integer) folder.getAttribute(uids[0],
"columba.accountuid");
AccountItem accountItem = MessageBuilderHelper
.getAccountItem(accountUid);
model.setAccountItem(accountItem);
}
// in java/org/columba/mail/gui/composer/command/ReplyCommand.java
protected String createQuotedBody(MimeHeader header, IMailbox folder, Object[] uids,
Integer[] address) throws IOException, Exception {
MimeTree mimePartTree = folder.getMimePartTree(uids[0]);
MimePart bodyPart = mimePartTree.getFromAddress(address);
InputStream bodyStream = folder.getMimePartBodyStream(uids[0], address);
String bodyText = MessageBuilderHelper.createBodyText(bodyPart, bodyStream);
boolean wasHtml;
if (header.getMimeType().getSubtype().equals("html"))
wasHtml = true;
else
wasHtml = false;
String quotedBody;
// Quote original message - different methods for text and html
if (model.isHtml()) {
// Html: Insertion of text before and after original message
// get necessary headerfields
BasicHeader rfcHeader = new BasicHeader(folder.getHeaderFields(
uids[0], headerfields));
String subject = rfcHeader.getSubject();
String date = DateFormat.getDateTimeInstance(DateFormat.LONG,
DateFormat.MEDIUM).format(rfcHeader.getDate());
String from = AddressListRenderer.renderToHTMLWithLinks(
new Address[] { rfcHeader.getFrom()}).toString();
String to = AddressListRenderer.renderToHTMLWithLinks(
rfcHeader.getTo()).toString();
// build "quoted" message
StringBuffer buf = new StringBuffer();
buf.append("<html><body><p>");
buf.append(MailResourceLoader.getString("dialog", "composer",
"original_message_start"));
buf.append("<br>"
+ MailResourceLoader.getString("header", "header",
"subject") + ": " + subject);
buf.append("<br>"
+ MailResourceLoader.getString("header", "header", "date")
+ ": " + date);
buf.append("<br>"
+ MailResourceLoader.getString("header", "header", "from")
+ ": " + from);
buf.append("<br>"
+ MailResourceLoader.getString("header", "header", "to")
+ ": " + to);
buf.append("</p>");
String htmlbody;
if (wasHtml) {
htmlbody = HtmlParser.removeComments(// comments are not displayed
// correctly in composer
HtmlParser.getHtmlBody(bodyText));
} else {
htmlbody = HtmlParser.substituteSpecialCharacters(bodyText);
}
buf.append(htmlbody);
buf.append("<p>");
buf.append(MailResourceLoader.getString("dialog", "composer",
"original_message_end"));
buf.append("</p></body></html>");
quotedBody = buf.toString();
} else {
if (wasHtml) {
bodyText = HtmlParser.htmlToText(bodyText);
}
// Text: Addition of > before each line
quotedBody = StreamUtils.readReader(new QuoteFilterReader(
new StringReader(bodyText))).toString();
}
return quotedBody;
}
// in java/org/columba/mail/gui/composer/command/ReplyWithTemplateCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// create composer model
model = new ComposerModel();
// get selected folder
IMailbox folder = (IMailbox) ((MailFolderCommandReference) getReference())
.getSourceFolder();
// get first selected message
Object[] uids = ((MailFolderCommandReference) getReference()).getUids();
// ->set source reference in composermodel
// when replying this is the original sender's message
// you selected and replied to
MailFolderCommandReference ref = new MailFolderCommandReference(folder,
uids);
model.setSourceReference(ref);
// setup to, references and account
initHeader(folder, uids);
// get mimeparts
MimeTree mimePartTree = folder.getMimePartTree(uids[0]);
XmlElement html = MailConfig.getInstance().getMainFrameOptionsConfig()
.getRoot().getElement("/options/html");
// Which Bodypart shall be used? (html/plain)
MimePart bodyPart = null;
if (Boolean.valueOf(html.getAttribute("prefer")).booleanValue()) {
bodyPart = mimePartTree.getFirstTextPart("html");
} else {
bodyPart = mimePartTree.getFirstTextPart("plain");
}
if (bodyPart != null) {
// setup charset and html
initMimeHeader(bodyPart);
Integer[] address = bodyPart.getAddress();
String quotedBodyText = createQuotedBody(bodyPart.getHeader(),
folder, uids, address);
// get answer from template
String templateBody = getTemplateBody();
String bodytext;
if (model.isHtml()) {
bodytext = "<html><body>" + HtmlParser.getHtmlBody(quotedBodyText) +
"<br>" + templateBody + "</body></html>";
} else {
bodytext = quotedBodyText + "\n" + templateBody;
}
model.setBodyText(bodytext);
} else {
String bodytext = getTemplateBody();
if (model.isHtml())
bodytext = "<html><body>" + bodytext + "</body></html>";
model.setBodyText(bodytext);
}
}
// in java/org/columba/mail/gui/composer/command/ReplyWithTemplateCommand.java
private String getTemplateBody() throws Exception,
CommandCancelledException, IOException {
// template folder has uid=107
IMailbox templateFolder = (IMailbox) FolderTreeModel
.getInstance().getFolder("107");
// retrieve headerlist of tempate folder
IHeaderList list = templateFolder.getHeaderList();
// choose template
ChooseTemplateDialog d = new ChooseTemplateDialog(mediator.getView()
.getFrame(), list);
Object uid = null;
if (d.isResult()) {
// user pressed OK
uid = d.getUid();
} else {
throw new CommandCancelledException();
}
// get bodytext of template message
MimeTree tree = templateFolder.getMimePartTree(uid);
XmlElement html = MailConfig.getInstance().getMainFrameOptionsConfig()
.getRoot().getElement("/options/html");
// Which Bodypart shall be used? (html/plain)
MimePart bodyPart = null;
if (Boolean.valueOf(html.getAttribute("prefer")).booleanValue()) {
bodyPart = tree.getFirstTextPart("html");
} else {
bodyPart = tree.getFirstTextPart("plain");
}
InputStream bodyStream = templateFolder.getMimePartBodyStream(uid, bodyPart
.getAddress());
boolean wasHtml;
if (bodyPart.getHeader().getMimeType().getSubtype().equals("html"))
wasHtml = true;
else
wasHtml = false;
String body;
if (model.isHtml()) {
if (wasHtml) {
body = HtmlParser.removeComments(// comments are not displayed
// correctly in composer
HtmlParser.getHtmlBody(StreamUtils.readCharacterStream(bodyStream)
.toString()));
} else {
body = HtmlParser.substituteSpecialCharacters(
StreamUtils.readCharacterStream(bodyStream).toString());
}
} else {
if (wasHtml) {
body = HtmlParser.htmlToText(StreamUtils.readCharacterStream(bodyStream).
toString());
} else {
body = StreamUtils.readCharacterStream(bodyStream).toString();
}
}
bodyStream.close();
return body;
}
// in java/org/columba/mail/gui/composer/command/ForwardCommand.java
public void updateGUI() throws Exception {
// open composer frame
controller = new ComposerController();
new DefaultContainer(controller);
// apply model
controller.setComposerModel(model);
// model->view update
controller.updateComponents(true);
}
// in java/org/columba/mail/gui/composer/command/ForwardCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// get selected folder
IMailbox folder = (IMailbox) ((MailFolderCommandReference) getReference())
.getSourceFolder();
// get first selected message
Object[] uids = ((MailFolderCommandReference) getReference()).getUids();
// get headerfields
Header header = folder.getHeaderFields(uids[0],
new String[] { "Subject" });
// create composer model
model = new ComposerModel();
// ->set source reference in composermodel
// when replying this is the original sender's message
// you selected and replied to
MailFolderCommandReference ref = new MailFolderCommandReference(folder, uids);
model.setSourceReference(ref);
// set subject
model.setSubject(MessageBuilderHelper
.createForwardSubject(new BasicHeader(header).getSubject()));
// initialize MimeHeader as RFC822-compliant-message
MimeHeader mimeHeader = new MimeHeader();
mimeHeader.setMimeType(new MimeType("message", "rfc822"));
mimeHeader.setContentDescription((String)folder.getAttribute(uids[0],"columba.subject"));
// add mimepart to model
InputStream messageSourceStream = folder
.getMessageSourceStream(uids[0]);
model.addMimePart(new InputStreamMimePart(mimeHeader,
messageSourceStream));
// select the account this mail was received from
Integer accountUid = (Integer) folder.getAttribute(uids[0],
"columba.accountuid");
AccountItem accountItem = MessageBuilderHelper
.getAccountItem(accountUid);
model.setAccountItem(accountItem);
}
// in java/org/columba/mail/gui/composer/command/ForwardInlineCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// create composer model
model = new ComposerModel();
// get selected folder
IMailbox folder = (IMailbox) ((MailFolderCommandReference) getReference())
.getSourceFolder();
// get first selected message
Object[] uids = ((MailFolderCommandReference) getReference()).getUids();
// ->set source reference in composermodel
// when replying this is the original sender's message
// you selected and replied to
MailFolderCommandReference ref = new MailFolderCommandReference(folder, uids);
model.setSourceReference(ref);
// setup to, references and account
initHeader(folder, uids);
// get mimeparts
MimeTree mimePartTree = folder.getMimePartTree(uids[0]);
XmlElement html = MailConfig.getInstance().getMainFrameOptionsConfig()
.getRoot().getElement("/options/html");
// Which Bodypart shall be used? (html/plain)
MimePart bodyPart = null;
Integer[] bodyPartAddress = null;
if (Boolean.valueOf(html.getAttribute("prefer")).booleanValue()) {
bodyPart = mimePartTree.getFirstTextPart("html");
} else {
bodyPart = mimePartTree.getFirstTextPart("plain");
}
if (bodyPart != null) {
// setup charset and html
initMimeHeader(bodyPart);
bodyPartAddress = bodyPart.getAddress();
String quotedBodyText = createQuotedBody(bodyPart.getHeader(),
folder, uids, bodyPartAddress);
model.setBodyText(quotedBodyText);
}
// add all attachments
MimeTree mt = folder.getMimePartTree(uids[0]);
Iterator it = mt.getAllLeafs().iterator();
while (it.hasNext()) {
MimePart mp = (MimePart) it.next();
Integer[] address = mp.getAddress();
// skip if bodypart (already added as quoted text)
if (Arrays.equals(address, bodyPartAddress))
continue;
// add attachment
InputStream bodyStream = folder.getMimePartBodyStream(uids[0], address);
int encoding = mp.getHeader().getContentTransferEncoding();
switch (encoding) {
case MimeHeader.QUOTED_PRINTABLE:
bodyStream = new QuotedPrintableDecoderInputStream(bodyStream);
break;
case MimeHeader.BASE64:
bodyStream = new Base64DecoderInputStream(bodyStream);
break;
default:
}
model.addMimePart(new InputStreamMimePart(mp.getHeader(), bodyStream));
}
// select the account this mail was received from
Integer accountUid = (Integer) folder.getAttribute(uids[0],
"columba.accountuid");
AccountItem accountItem = MessageBuilderHelper
.getAccountItem(accountUid);
model.setAccountItem(accountItem);
}
// in java/org/columba/mail/gui/composer/command/ForwardInlineCommand.java
private void initHeader(IMailbox folder, Object[] uids)
throws Exception {
// get headerfields
Header header = folder.getHeaderFields(uids[0],
new String[] { "Subject" });
BasicHeader rfcHeader = new BasicHeader(header);
// set subject
model.setSubject(MessageBuilderHelper.createForwardSubject(rfcHeader
.getSubject()));
}
// in java/org/columba/mail/gui/composer/command/ForwardInlineCommand.java
protected String createQuotedBody(MimeHeader header, IMailbox folder,
Object[] uids, Integer[] address) throws IOException, Exception {
MimeTree mimePartTree = folder.getMimePartTree(uids[0]);
MimePart bodyPart = mimePartTree.getFromAddress(address);
InputStream bodyStream = folder.getMimePartBodyStream(uids[0], address);
String bodyText = MessageBuilderHelper.createBodyText(bodyPart, bodyStream);
boolean wasHtml;
if (header.getMimeType().getSubtype().equals("html"))
wasHtml = true;
else
wasHtml = false;
String quotedBody;
// Quote original message - different methods for text and html
if (model.isHtml()) {
// Html: Insertion of text before and after original message
// get necessary headerfields
BasicHeader rfcHeader = new BasicHeader(folder.getHeaderFields(
uids[0], headerfields));
String subject = rfcHeader.getSubject();
String date = DateFormat.getDateTimeInstance(DateFormat.LONG,
DateFormat.MEDIUM).format(rfcHeader.getDate());
String from = AddressListRenderer.renderToHTMLWithLinks(
new Address[] { rfcHeader.getFrom() }).toString();
String to = AddressListRenderer.renderToHTMLWithLinks(
rfcHeader.getTo()).toString();
// build "quoted" message
StringBuffer buf = new StringBuffer();
buf.append("<html><body><p>");
buf.append(MailResourceLoader.getString("dialog", "composer",
"original_message_start"));
buf.append("<br>"
+ MailResourceLoader.getString("header", "header",
"subject") + ": " + subject);
buf.append("<br>"
+ MailResourceLoader.getString("header", "header", "date")
+ ": " + date);
buf.append("<br>"
+ MailResourceLoader.getString("header", "header", "from")
+ ": " + from);
buf.append("<br>"
+ MailResourceLoader.getString("header", "header", "to")
+ ": " + to);
buf.append("</p>");
String htmlbody;
if (wasHtml) {
htmlbody = HtmlParser.removeComments(// comments are not displayed
// correctly in composer
HtmlParser.getHtmlBody(bodyText));
} else {
htmlbody = HtmlParser.substituteSpecialCharacters(bodyText);
}
buf.append(htmlbody);
buf.append("<p>");
buf.append(MailResourceLoader.getString("dialog", "composer",
"original_message_end"));
buf.append("</p></body></html>");
quotedBody = buf.toString();
} else {
BasicHeader rfcHeader = new BasicHeader(folder.getHeaderFields(
uids[0], headerfields));
String date = DateFormat.getDateTimeInstance(DateFormat.LONG,
DateFormat.MEDIUM).format(rfcHeader.getDate());
String from = rfcHeader.getFrom().toString();
if (wasHtml) {
bodyText = HtmlParser.htmlToText(bodyText);
}
// Text: Addition of > before each line
StringBuffer buf = StreamUtils.readReader(new QuoteFilterReader(
new StringReader(bodyText)));
buf.insert(0, ">\n");
buf.insert(0, "> Date: " + date + "\n");
buf.insert(0, "> From: " + from + "\n");
quotedBody = buf.toString();
}
return quotedBody;
}
// in java/org/columba/mail/gui/composer/command/ReplyAsAttachmentCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// create composer model
model = new ComposerModel();
// get selected folder
IMailbox folder = (IMailbox) ((MailFolderCommandReference) getReference())
.getSourceFolder();
// get first selected message
Object[] uids = ((MailFolderCommandReference) getReference()).getUids();
// ->set source reference in composermodel
// when replying this is the original sender's message
// you selected and replied to
MailFolderCommandReference ref = new MailFolderCommandReference(folder, uids);
model.setSourceReference(ref);
// setup to, references and account
initHeader(folder, uids);
// initialize MimeHeader as RFC822-compliant-message
MimeHeader mimeHeader = new MimeHeader();
mimeHeader.setMimeType(new MimeType("message", "rfc822"));
mimeHeader.setContentDescription((String)folder.getAttribute(uids[0],"columba.subject"));
// add mimepart to model
InputStream messageSourceStream = folder
.getMessageSourceStream(uids[0]);
model.addMimePart(new InputStreamMimePart(mimeHeader,
messageSourceStream));
messageSourceStream.close();
}
// in java/org/columba/mail/gui/util/WelcomeMessage.java
private static String createMessage(String to, String accountUid)
throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("Subject: Welcome to Columba\r\n");
buf.append("From: columba-users@lists.sourceforge.net\r\n");
buf.append("To: "+to+"\r\n");
buf.append("\r\n");
InputStream is = DiskIO
.getResourceStream("org/columba/mail/welcome_message_body.txt");
String body = StreamUtils.readCharacterStream(is).toString();
buf.append(body);
return buf.toString();
}
// in java/org/columba/mail/gui/util/WelcomeMessage.java
public static void addWelcomeMessage(IMailFolder folder, String to, String accountUid)
throws Exception {
if ( folder == null) throw new IllegalArgumentException("folder == null");
if ( to == null || to.length() == 0) throw new IllegalArgumentException("to == nllu");
if ( accountUid == null ) throw new IllegalArgumentException("account uid == null");
// create message
String message = createMessage(to, accountUid);
// convert to inputstream
InputStream is = new ByteArrayInputStream(message.getBytes("UTF-8"));
// add to folder
CommandProcessor.getInstance().addOp(
new AddMessageCommand(new MailFolderCommandReference(
folder), is));
}
// in java/org/columba/mail/gui/table/TableController.java
public void showHeaderList(IMailbox folder, IHeaderList headerList) throws Exception {
// save previously selected folder options
if (previouslySelectedFolder != null) {
((MailFrameMediator) getFrameController()).getFolderOptionsController().save(previouslySelectedFolder);
}
// load options of newly selected folder
((MailFrameMediator) getFrameController()).getFolderOptionsController().load(folder, FolderOptionsController.STATE_BEFORE);
getHeaderTableModel().set(headerList);
// load options of newly selected folder
((MailFrameMediator) getFrameController()).getFolderOptionsController().load(folder, FolderOptionsController.STATE_AFTER);
// remember previously selected folder
previouslySelectedFolder = folder;
}
// in java/org/columba/mail/gui/table/command/ViewHeaderListCommand.java
public void updateGUI() throws Exception {
((MailFrameMediator) mediator).removeTreeSelectionListener(this);
// Update only if the selection did not change
if (updateGui) {
((TableViewOwner) mediator).getTableController().showHeaderList(
folder, headerList);
}
}
// in java/org/columba/mail/gui/table/command/ViewHeaderListCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// Register as SelectionListener to track the selection
// of the tree
if (!updateGui)
return;
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
folder = (IMailbox) r.getSourceFolder();
// register for status events
((StatusObservableImpl) folder.getObservable()).setWorker(worker);
// fetch the headerlist
try {
headerList = (folder).getHeaderList();
} catch (Exception e) {
updateGui = false;
// Reset the selection
((MailFrameMediator) mediator).setTreeSelection(null);
new ClearHeaderlistAction(mediator).actionPerformed(null);
throw e;
}
updateGui &= !worker.cancelled();
}
// in java/org/columba/mail/pop3/POP3Server.java
public void save() throws Exception {
headerList.persist();
}
// in java/org/columba/mail/pop3/POP3Server.java
public void logout() throws Exception {
getStore().logout();
}
// in java/org/columba/mail/pop3/POP3Server.java
public List synchronize() throws Exception {
if (getHeaderList().count() == 0) {
LOG.severe(accountItem.getName() + " - POP3 Headerlist is empty!");
}
// Get the uids from the headercache
LinkedList headerUids = new LinkedList(getHeaderList().keySet());
// Get the list of the uids on the server
// Important: Use a clone of the List since
// we must not change it!
List newUids = store.getUIDList();
// substract the uids that we already downloaded ->
// newUids contains all uids to fetch from the server
ListTools.substract(newUids, headerUids);
// substract the uids on the server from the downloaded uids ->
// headerUids are the uids that have been removed from the server
ListTools.substract(headerUids, store.getUIDList());
Iterator it = headerUids.iterator();
// update the cache
while (it.hasNext()) {
getHeaderList().remove(it.next());
cacheChanged = true;
}
// return the uids that are new
return newUids;
}
// in java/org/columba/mail/pop3/POP3Server.java
public int getMessageCount() throws Exception {
return getStore().getMessageCount();
}
// in java/org/columba/mail/pop3/POP3Server.java
public int getMessageSize(Object uid) throws Exception {
return store.getSize(store.getIndex(uid));
}
// in java/org/columba/mail/pop3/command/FetchNewMessagesCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
POP3CommandReference r = (POP3CommandReference) getReference();
server = r.getServer();
// register interest on status bar information
((StatusObservableImpl) server.getObservable()).setWorker(worker);
log(MailResourceLoader.getString("statusbar", "message",
"authenticating"));
try {
// login and get # of messages on server
totalMessageCount = server.getMessageCount();
if (worker.cancelled())
throw new CommandCancelledException();
// synchronize local UID list with server UID list
List newMessagesUidList = synchronize();
if (worker.cancelled())
throw new CommandCancelledException();
if (Logging.DEBUG) {
LOG.fine(newMessagesUidList.toString());
}
if (worker.cancelled())
throw new CommandCancelledException();
// only download new messages
downloadNewMessages(newMessagesUidList, worker);
// Delete old message from server if the feature is enabled
server.cleanUpServer();
// logout cleanly
logout();
// display downloaded message count in statusbar
if (newMessageCount == 0) {
log(MailResourceLoader.getString("statusbar", "message",
"no_new_messages"));
} else {
log(MessageFormat.format(MailResourceLoader.getString(
"statusbar", "message", "fetched_count"),
new Object[] { new Integer(newMessageCount) }));
// get inbox-folder from pop3-server preferences
IMailbox inboxFolder = server.getFolder();
// notify listeners
IMailFolderCommandReference ref = new MailFolderCommandReference(inboxFolder, newMessagesUidList.toArray());
MailCheckingManager.getInstance().fireNewMessageArrived(ref);
}
} catch (CommandCancelledException e) {
server.logout();
// clear statusbar message
server.getObservable().clearMessage();
} catch (Exception e) {
// clear statusbar message
server.getObservable().clearMessage();
throw e;
}
/*
* catch (IOException e) { String name = e.getClass().getName();
* JOptionPane.showMessageDialog(null, e.getLocalizedMessage(),
* name.substring(name.lastIndexOf(".")), JOptionPane.ERROR_MESSAGE); //
* clear statusbar message server.getObservable().clearMessage(); }
*/
finally {
/*
* // always enable the menuitem again
* r[0].getPOP3ServerController().enableActions(true);
*/
}
}
// in java/org/columba/mail/pop3/command/FetchNewMessagesCommand.java
public void downloadMessage(Object serverUID, IWorkerStatusController worker)
throws Exception {
// server message numbers start with 1
// whereas List numbers start with 0
// -> always increase fetch number
IWorkerStatusChangeListener listener = new IWorkerStatusChangeListener() {
public void workerStatusChanged(WorkerStatusChangedEvent e) {
if (e.getSource().cancelled()) {
try {
server.dropConnection();
} catch (IOException e1) {
}
}
}
};
// important for cancel
worker.addWorkerStatusChangeListener(listener);
// download message
ColumbaMessage message;
try {
message = server.getMessage(serverUID, worker);
} catch (SocketException e) {
if (!worker.cancelled())
throw e;
else
throw new CommandCancelledException();
}
// not needed anymore
worker.removeWorkerStatusChangeListener(listener);
if (message == null) {
LOG.severe("Message with UID=" + serverUID
+ " isn't on the server.");
return;
}
message.getHeader().getFlags().setSeen(false);
// get inbox-folder from pop3-server preferences
IMailbox inboxFolder = server.getFolder();
// start command which adds message to folder
// and calls apply-filter on this specific message
IMailFolderCommandReference r = new MailFolderCommandReference(
inboxFolder, message);
CommandProcessor.getInstance().addOp(new AddPOP3MessageCommand(r));
}
// in java/org/columba/mail/pop3/command/FetchNewMessagesCommand.java
protected int calculateTotalSize(List uidList) throws Exception {
int totalSize = 0;
Iterator it = uidList.iterator();
while (it.hasNext()) {
totalSize += server.getMessageSize(it.next());
}
return totalSize;
}
// in java/org/columba/mail/pop3/command/FetchNewMessagesCommand.java
public void downloadNewMessages(List newMessagesUIDList,
IWorkerStatusController worker) throws Exception {
LOG.fine("need to fetch " + newMessagesUIDList.size() + " messages.");
int totalSize = calculateTotalSize(newMessagesUIDList);
worker.setProgressBarMaximum(totalSize);
worker.setProgressBarValue(0);
newMessageCount = newMessagesUIDList.size();
for (int i = 0; i < newMessageCount; i++) {
if (worker.cancelled())
throw new CommandCancelledException();
// which UID should be downloaded next
Object serverUID = newMessagesUIDList.get(i);
LOG.fine("fetch message with UID=" + serverUID);
log(MessageFormat.format(MailResourceLoader.getString("statusbar",
"message", "fetch_messages"), new Object[] {
new Integer(i + 1), new Integer(newMessageCount) }));
int size = server.getMessageSize(serverUID);
if (server.getAccountItem().getPopItem().getBoolean("enable_limit")) {
// check if message isn't too big to download
int maxSize = server.getAccountItem().getPopItem().getInteger(
"limit");
// if message-size is bigger skip download of this message
if (size > maxSize) {
LOG.fine("skipping download of message, too big");
continue;
}
}
// now download the message
downloadMessage(serverUID, worker);
if (!server.getAccountItem().getPopItem().getBoolean(
"leave_messages_on_server")) {
// delete message from server
server.deleteMessage(serverUID);
LOG.fine("deleted message with uid=" + serverUID);
}
}
}
// in java/org/columba/mail/pop3/command/FetchNewMessagesCommand.java
public List synchronize() throws Exception {
log(MailResourceLoader.getString("statusbar", "message",
"fetch_uid_list"));
LOG.fine("synchronize local UID-list with remote UID-list");
// synchronize local UID-list with server
List newMessagesUIDList = server.synchronize();
return newMessagesUIDList;
}
// in java/org/columba/mail/pop3/command/FetchNewMessagesCommand.java
public void logout() throws Exception {
server.logout();
LOG.fine("logout");
log(MailResourceLoader.getString("statusbar", "message", "logout"));
if (newMessageCount == 0) {
log(MailResourceLoader.getString("statusbar", "message",
"no_new_messages"));
}
}
// in java/org/columba/mail/pop3/command/FetchNewMessagesCommand.java
public void updateGUI() throws Exception {
if (action != null) {
action.setEnabled(true);
}
}
// in java/org/columba/mail/pop3/command/AddPOP3MessageCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
inboxFolder = (IMailbox) r.getSourceFolder();
IColumbaMessage message = (IColumbaMessage) r.getMessage();
// add message to folder
SourceInputStream messageStream = new SourceInputStream(message
.getSource());
Object uid = inboxFolder.addMessage(messageStream,
message.getHeader().getAttributes(),
message.getHeader().getFlags());
messageStream.close();
// mark message as recent
r.setSourceFolder(inboxFolder);
r.setUids(new Object[] { uid });
r.setMarkVariant(MarkMessageCommand.MARK_AS_RECENT);
new MarkMessageCommand(r).execute(worker);
// apply spam filter
boolean messageWasMoved = applySpamFilter(uid, worker);
if (messageWasMoved == false) {
// apply filter on message
applyFilters(uid);
}
}
// in java/org/columba/mail/pop3/command/AddPOP3MessageCommand.java
private boolean applySpamFilter(Object uid, IWorkerStatusController worker)
throws Exception {
// message belongs to which account?
AccountItem item = CommandHelper.retrieveAccountItem(inboxFolder, uid);
if ( item == null ) return false;
// if spam filter is not enabled -> return
if (!item.getSpamItem().isEnabled()) {
return false;
}
// create reference
IMailFolderCommandReference r = new MailFolderCommandReference(
inboxFolder, new Object[] { uid });
// score message and mark as "spam" or "not spam"
new ScoreMessageCommand(r).execute(worker);
// is message marked as spam
boolean spam = ((Boolean) inboxFolder.getAttribute(uid, "columba.spam"))
.booleanValue();
if (spam == false)
return false;
if (item.getSpamItem().isMoveIncomingJunkMessagesEnabled()) {
if (item.getSpamItem().isIncomingTrashSelected()) {
// move message to trash
IMailbox trash = (IMailbox) ((RootFolder) inboxFolder
.getRootFolder()).getTrashFolder();
// create reference
MailFolderCommandReference ref2 = new MailFolderCommandReference(
inboxFolder, trash, new Object[] { uid });
CommandProcessor.getInstance().addOp(
new MoveMessageCommand(ref2));
} else {
// move message to user-configured folder (generally "Junk"
// folder)
IMailbox destFolder = (IMailbox) FolderTreeModel
.getInstance()
.getFolder(item.getSpamItem().getIncomingCustomFolder());
// create reference
MailFolderCommandReference ref2 = new MailFolderCommandReference(
inboxFolder, destFolder, new Object[] { uid });
CommandProcessor.getInstance().addOp(
new MoveMessageCommand(ref2));
}
return true;
}
return false;
}
// in java/org/columba/mail/pop3/command/AddPOP3MessageCommand.java
private void applyFilters(Object uid) throws Exception {
IFilterList list = inboxFolder.getFilterList();
for (int j = 0; j < list.count(); j++) {
IFilter filter = list.get(j);
Object[] result = inboxFolder.searchMessages(filter,
new Object[] { uid });
if (result.length != 0) {
CompoundCommand command = new FilterCompoundCommand(filter,
inboxFolder, result);
CommandProcessor.getInstance().addOp(command);
}
}
}
// in java/org/columba/mail/pop3/POP3Store.java
public List getUIDList() throws Exception {
return new ArrayList(getUidMap().keySet());
}
// in java/org/columba/mail/imap/FetchSubFolderListCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
MailFolderCommandReference r = (MailFolderCommandReference) getReference();
if (r == null) {
return;
}
if (r.getSourceFolder() instanceof IMAPRootFolder) {
imapRoot = (IMAPRootFolder) r.getSourceFolder();
imapRoot.syncSubscribedFolders();
}
}
// in java/org/columba/mail/imap/IMAPServer.java
public void logout() throws Exception {
if (protocol.getState() != IMAPProtocol.NOT_CONNECTED) {
try {
protocol.logout();
} catch (Exception e) {
// don't care
}
}
}
// in java/org/columba/mail/imap/IMAPServer.java
public ListInfo[] list(String reference, String pattern) throws Exception {
ensureLoginState();
try {
return protocol.list(reference, pattern);
} catch (IMAPDisconnectedException e) {
return protocol.list(reference, pattern);
}
}
// in java/org/columba/mail/imap/IMAPServer.java
public Integer append(InputStream messageSource, IMAPFlags flags,
IMAPFolder folder) throws Exception {
// make sure we are already logged in
ensureLoginState();
// close the mailbox if it is selected
if (protocol.getState() == IMAPProtocol.SELECTED
&& protocol.getSelectedMailbox().equals(folder)) {
protocol.close();
}
MailboxStatus status = protocol.status(folder.getImapPath(),
new String[] { "UIDNEXT" });
if (flags != null) {
protocol.append(folder.getImapPath(), messageSource,
new Object[] { flags });
} else {
protocol.append(folder.getImapPath(), messageSource);
}
return new Integer((int) status.getUidNext());
}
// in java/org/columba/mail/imap/IMAPServer.java
public Integer append(InputStream messageSource, IMAPFolder folder)
throws Exception {
return append(messageSource, null, folder);
}
// in java/org/columba/mail/imap/IMAPServer.java
public void deleteFolder(String path) throws Exception {
// make sure we are already logged in
ensureLoginState();
if (protocol.getState() == IMAPProtocol.SELECTED
&& protocol.getSelectedMailbox().equals(path)) {
protocol.close();
}
protocol.unsubscribe(path);
protocol.delete(path);
}
// in java/org/columba/mail/imap/IMAPServer.java
public Integer[] copy(IMAPFolder destFolder, Object[] uids,
IMAPFolder folder) throws Exception {
ensureSelectedState(folder);
// We need to sort the uids in order
// to have the correct association
// between the new and old uid
List sortedUids = Arrays.asList(uids);
Collections.sort(sortedUids);
MailboxStatus statusBefore = protocol.status(destFolder.getImapPath(),
new String[] { "UIDNEXT" });
protocol.uidCopy(new SequenceSet(Arrays.asList(uids)), destFolder
.getImapPath());
MailboxStatus statusAfter = protocol.status(destFolder.getImapPath(),
new String[] { "UIDNEXT" });
// the UIDS start UIDNext till UIDNext + uids.length
int copied = (int) (statusAfter.getUidNext() - statusBefore
.getUidNext());
Integer[] destUids = new Integer[copied];
for (int i = 0; i < copied; i++) {
destUids[i] = new Integer((int) (statusBefore.getUidNext() + i));
}
return destUids;
}
// in java/org/columba/mail/imap/IMAPServer.java
public void fetchHeaderList(IHeaderList headerList, List list,
IMAPFolder folder) throws Exception {
// make sure this mailbox is selected
ensureSelectedState(folder);
printStatusMessage(MailResourceLoader.getString("statusbar", "message",
"fetch_header_list"));
int count = list.size() / IMAPServer.STEP_SIZE;
int rest = list.size() % IMAPServer.STEP_SIZE;
getObservable().setCurrent(0);
getObservable().setMax(count + 1);
for (int i = 0; i < count; i++) {
doFetchHeaderList(headerList, list.subList(
i * IMAPServer.STEP_SIZE, (i + 1) * IMAPServer.STEP_SIZE));
getObservable().setCurrent(i);
}
if (rest > 0) {
doFetchHeaderList(headerList, list
.subList(count * IMAPServer.STEP_SIZE, count
* IMAPServer.STEP_SIZE + rest));
}
getObservable().setCurrent(count + 1);
}
// in java/org/columba/mail/imap/IMAPServer.java
public List search(Object[] uids, IFilterRule filterRule, IMAPFolder folder)
throws Exception {
LinkedList result = new LinkedList(search(filterRule, folder));
ListTools.intersect(result, Arrays.asList(uids));
return result;
}
// in java/org/columba/mail/filter/plugins/DeleteMessageAction.java
public ICommand getCommand(IFilterAction filterAction, IFolder srcFolder,
Object[] uids) throws Exception {
MailFolderCommandReference r = new MailFolderCommandReference(srcFolder, uids);
r.setMarkVariant(MarkMessageCommand.MARK_AS_EXPUNGED);
MarkMessageCommand c = new MarkMessageCommand(r);
CommandProcessor.getInstance().addOp(c);
r = new MailFolderCommandReference(srcFolder);
return new ExpungeFolderCommand(r);
}
// in java/org/columba/mail/filter/plugins/DateFilter.java
public boolean process(IFolder folder, Object uid)
throws Exception {
// transform string to Date representation
Date date = transformDate(pattern);
if (date == null)
return false;
boolean result = false;
// get date
Date d = (Date) ((IMailbox)folder).getAttribute(uid, "columba.date");
if (d == null) {
LOG.fine("field date not found");
return false;
}
switch (condition) {
case FilterCriteria.DATE_BEFORE:
if (d.before(date)) {
result = true;
}
break;
case FilterCriteria.DATE_AFTER:
if (d.after(date)) {
result = true;
}
break;
}
return result;
}
// in java/org/columba/mail/filter/plugins/BodyFilter.java
public boolean process(IFolder folder, Object uid)
throws Exception {
// get message body
InputStream messageSourceStream = ((IMailbox)folder).getMessageSourceStream(uid);
StringBuffer body = StreamUtils.readCharacterStream(messageSourceStream);
String bodyText = pattern;
boolean result = false;
switch (condition) {
case FilterCriteria.CONTAINS:
if (body.indexOf(bodyText) != -1) {
result = true;
}
break;
case FilterCriteria.CONTAINS_NOT:
if (body.indexOf(bodyText) == -1) {
result = true;
}
break;
}
return result;
}
// in java/org/columba/mail/filter/plugins/PriorityFilter.java
public boolean process(IFolder folder, Object uid)
throws Exception {
boolean result = false;
String s = (String) searchPattern;
Integer searchPatternInt = transformPriority(s);
Integer priority = (Integer) ((IMailbox)folder).getAttribute(uid,
"columba.priority");
if (priority == null) {
return false;
}
switch (condition) {
case FilterCriteria.IS:
if (priority.compareTo(searchPatternInt) == 0) {
result = true;
}
break;
case FilterCriteria.IS_NOT:
if (priority.compareTo(searchPatternInt) != 0) {
result = true;
}
break;
}
return result;
}
// in java/org/columba/mail/filter/plugins/FlagsFilter.java
public boolean process(IFolder folder, Object uid)
throws Exception {
boolean result = false;
String headerField = pattern;
Flags flags = ((IMailbox)folder).getFlags(uid);
if (headerField.equalsIgnoreCase("Answered")) {
result = flags.get(Flags.ANSWERED);
} else if (headerField.equalsIgnoreCase("Deleted")) {
result = flags.get(Flags.DELETED);
} else if (headerField.equalsIgnoreCase("Flagged")) {
result = flags.get(Flags.FLAGGED);
} else if (headerField.equalsIgnoreCase("Recent")) {
result = flags.get(Flags.RECENT);
} else if (headerField.equalsIgnoreCase("Draft")) {
result = flags.get(Flags.DRAFT);
} else if (headerField.equalsIgnoreCase("Seen")) {
result = flags.get(Flags.SEEN);
} else if (headerField.equalsIgnoreCase("Spam")) {
result = ((Boolean) ((IMailbox)folder).getAttribute(uid, "columba.spam"))
.booleanValue();
}
if (condition == FilterCriteria.IS) {
return result;
} else {
return !result;
}
}
// in java/org/columba/mail/filter/plugins/MarkMessageAsReadAction.java
public ICommand getCommand(IFilterAction filterAction,
IFolder srcFolder, Object[] uids) throws Exception {
MailFolderCommandReference r = new MailFolderCommandReference(
srcFolder, uids);
String variant = filterAction.get("markvariant");
if (variant.equals("read")) {
r.setMarkVariant(MarkMessageCommand.MARK_AS_READ);
} else if (variant.equals("unread")) {
r.setMarkVariant(MarkMessageCommand.MARK_AS_UNREAD);
} else if (variant.equals("flagged")) {
r.setMarkVariant(MarkMessageCommand.MARK_AS_FLAGGED);
} else if (variant.equals("not_flagged")) {
r.setMarkVariant(MarkMessageCommand.MARK_AS_UNFLAGGED);
} else if (variant.equals("expunged")) {
r.setMarkVariant(MarkMessageCommand.MARK_AS_EXPUNGED);
} else if (variant.equals("not_expunged")) {
r.setMarkVariant(MarkMessageCommand.MARK_AS_UNEXPUNGED);
} else if (variant.equals("answered")) {
r.setMarkVariant(MarkMessageCommand.MARK_AS_ANSWERED);
} else if (variant.equals("spam")) {
r.setMarkVariant(MarkMessageCommand.MARK_AS_SPAM);
} else if (variant.equals("no_spam")) {
r.setMarkVariant(MarkMessageCommand.MARK_AS_NOTSPAM);
}
// if something goes wrong here, fall back to "mark as read"
else {
r.setMarkVariant(MarkMessageCommand.MARK_AS_READ);
}
MarkMessageCommand c = new MarkMessageCommand(r);
return c;
}
// in java/org/columba/mail/filter/plugins/AccountFilter.java
public boolean process(IFolder folder, Object uid) throws Exception {
boolean result = false;
Integer messageAccountUid = (Integer) ((IMailbox) folder).getAttribute(
uid, "columba.accountuid");
if ((messageAccountUid != null) && (criteriaAccountUid != -1)) {
int id = messageAccountUid.intValue();
if ((criteriaCondition == FilterCriteria.IS)
&& (criteriaAccountUid == id)) {
result = true;
} else if ((criteriaCondition == FilterCriteria.IS_NOT)
&& (criteriaAccountUid != id)) {
result = true;
}
}
return result;
}
// in java/org/columba/mail/filter/plugins/CopyMessageAction.java
public ICommand getCommand(IFilterAction filterAction,
IFolder srcFolder, Object[] uids) throws Exception {
String uid = filterAction.getUid();
IMailbox destFolder = (IMailbox) FolderTreeModel.getInstance()
.getFolder(uid);
if (destFolder == null) {
JOptionPane
.showMessageDialog(
FrameManager.getInstance()
.getActiveFrame(),
"Unable to find destination folder, please correct the destination folder path for this filter");
throw new Exception("File not found");
}
MailFolderCommandReference r = new MailFolderCommandReference(srcFolder,
destFolder, uids);
CopyMessageCommand c = new CopyMessageCommand(r);
return c;
}
// in java/org/columba/mail/filter/plugins/MatchAllFilter.java
public boolean process(IFolder folder, Object uid) throws Exception {
// match all matches
return true;
}
// in java/org/columba/mail/filter/plugins/MoveMessageAction.java
public ICommand getCommand(IFilterAction filterAction,
IFolder srcFolder, Object[] uids) throws Exception {
String uid = filterAction.getUid();
IMailbox destFolder = (IMailbox) FolderTreeModel.getInstance()
.getFolder(uid);
if (destFolder == null) {
JOptionPane
.showMessageDialog(
FrameManager.getInstance()
.getActiveFrame(),
"Unable to find destination folder, please correct the destination folder path for this filter");
throw new Exception("File not found");
}
MailFolderCommandReference r = new MailFolderCommandReference(srcFolder,
destFolder, uids);
MoveMessageCommand c = new MoveMessageCommand(r);
return c;
}
// in java/org/columba/mail/filter/plugins/SizeFilter.java
public boolean process(IFolder folder, Object uid)
throws Exception {
boolean result = false;
Integer size = transformSize((String) pattern);
Integer s = (Integer) ((IMailbox)folder).getAttribute(uid, "columba.size");
if (s == null) {
return false;
}
switch (condition) {
case FilterCriteria.SIZE_SMALLER:
if (size.compareTo(s) > 0) {
result = true;
}
break;
case FilterCriteria.SIZE_BIGGER:
if (size.compareTo(s) < 0) {
result = true;
}
break;
}
return result;
}
// in java/org/columba/mail/filter/plugins/HeaderfieldFilter.java
public boolean process(IFolder folder, Object uid)
throws Exception {
// get message header
Header header = ((IMailbox)folder).getHeaderFields(uid,
new String[] { headerfield });
if (header == null) {
return false;
}
String headerItem = (String) header.get(headerfield);
// cancel if headerfield doesn't exist
if (headerItem == null)
return false;
// decode headerfield
headerItem = EncodedWord.decode(headerItem).toString();
// see if theirs a match
boolean result = match(headerItem, condition, pattern);
return result;
}
// in java/org/columba/mail/filter/plugins/ColorMessageFilterAction.java
public ICommand getCommand(IFilterAction filterAction, IFolder srcFolder,
Object[] uids) throws Exception {
int rgb = filterAction.getIntegerWithDefault("rgb", Color.black.getRGB());
// create reference
MailFolderCommandReference r = new MailFolderCommandReference(srcFolder, uids);
r.setColorValue(rgb);
// create command
return new ColorMessageCommand(r);
}
// in java/org/columba/mail/filter/plugins/AddressbookFilter.java
public boolean process(IFolder folder, Object uid) throws Exception {
Header header = ((IMailbox) folder).getHeaderFields(uid,
new String[] { "From" });
String from = header.get("From");
Address address = null;
try {
address = AddressParser.parseAddress(from);
} catch (Exception ex) {
return false;
}
IFolderFacade folderFacade = null;
IContactFacade contactFacade = null;
try {
folderFacade = ServiceConnector.getFolderFacade();
contactFacade = ServiceConnector.getContactFacade();
} catch (ServiceNotFoundException e) {
e.printStackTrace();
return false;
}
org.columba.addressbook.facade.IFolder contactFolder = folderFacade.getCollectedAddresses();
String contactId = contactFacade.findByEmailAddress(contactFolder.getId(), address.getMailAddress());
if ( contactId != null ) return true;
return false;
}
// in java/org/columba/mail/filter/plugins/ScoreMessageFilterAction.java
public ICommand getCommand(IFilterAction filterAction, IFolder srcFolder,
Object[] uids) throws Exception {
MailFolderCommandReference r = new MailFolderCommandReference(srcFolder, uids);
ScoreMessageCommand c = new ScoreMessageCommand(r);
return c;
}
// in java/org/columba/mail/filter/plugins/ColorFilter.java
public boolean process(IFolder folder, Object uid) throws Exception {
int messageRGB = defaultColorRGB;
Color messageColor = (Color) ((IMailbox)folder).getAttribute(uid, "columba.color");
if (messageColor != null) {
messageRGB = messageColor.getRGB();
}
boolean result = false;
if ((criteriaCondition == FilterCriteria.IS) &&
(messageRGB == criteriaRGB)) {
result = true;
} else if ((criteriaCondition == FilterCriteria.IS_NOT) &&
(messageRGB != criteriaRGB)) {
result = true;
}
return result;
}
// in java/org/columba/mail/pgp/MultipartSignedRenderer.java
public InputStream render(MimePart part) throws Exception {
Vector streams = new Vector((2 * 2) + 3);
MimeHeader header = part.getHeader();
// Create boundary to separate the mime-parts
String boundary = createUniqueBoundary().toString();
header.putContentParameter("boundary", boundary);
byte[] startBoundary = ("\r\n--" + boundary + "\r\n").getBytes();
byte[] endBoundary = ("\r\n--" + boundary + "--\r\n").getBytes();
// Add pgp-specific content-parameters
// we take as default hash-algo SHA1
header.putContentParameter("micalg", "pgp-sha1");
header.putContentParameter("protocol", "application/pgp-signature");
// Create the header and body of the multipart
streams.add(header.getHeader().getInputStream());
// Add the MimePart that will be signed
streams.add(new ByteArrayInputStream(startBoundary));
CloneStreamMaster signedPartCloneModel = new CloneStreamMaster(
MimeTreeRenderer.getInstance().renderMimePart(part.getChild(0)));
streams.add(signedPartCloneModel.getClone());
// Add the signature
streams.add(new ByteArrayInputStream(startBoundary));
StreamableMimePart signatureMimePart;
signatureMimePart = null;
JSCFController controller = JSCFController.getInstance();
JSCFConnection con = controller.getConnection();
PGPPassChecker passCheck = PGPPassChecker.getInstance();
boolean check = passCheck.checkPassphrase(con);
if (!check) {
throw new WrongPassphraseException("wrong passphrase");
}
JSCFStatement stmt = con.createStatement();
JSCFResultSet res = stmt.executeSign(signedPartCloneModel.getClone());
signatureMimePart = new InputStreamMimePart(this.signatureHeader, res
.getResultStream());
streams.add(MimeTreeRenderer.getInstance().renderMimePart(
signatureMimePart));
// Create the closing boundary
streams.add(new ByteArrayInputStream(endBoundary));
return new SequenceInputStream(streams);
}
// in java/org/columba/mail/pgp/MultipartEncryptedRenderer.java
public InputStream render(MimePart part) throws Exception {
Vector streams = new Vector((2 * 2) + 3);
MimeHeader header = part.getHeader();
// Create boundary to separate the mime-parts
String boundary = createUniqueBoundary().toString();
header.putContentParameter("boundary", boundary);
byte[] startBoundary = ("\r\n--" + boundary + "\r\n").getBytes();
byte[] endBoundary = ("\r\n--" + boundary + "--\r\n").getBytes();
// Add pgp-specific content-parameters
header.putContentParameter("protocol", "application/pgp-encrypted");
// Create the header of the multipart
streams.add(header.getHeader().getInputStream());
SecurityItem pgpItem = ((PGPMimePart) part).getPgpItem();
// Add the ControlMimePart
streams.add(new ByteArrayInputStream(startBoundary));
streams.add(MimeTreeRenderer.getInstance().renderMimePart(controlPart));
// Add the encrypted MimePart
streams.add(new ByteArrayInputStream(startBoundary));
StreamableMimePart encryptedPart;
encryptedPart = null;
/*
JSCFDriverManager.registerJSCFDriver(new GPGDriver());
JSCFConnection con = JSCFDriverManager.getConnection("jscf:gpg:"+pgpItem.get("path"));
*/
JSCFController controller = JSCFController.getInstance();
JSCFConnection con = controller.getConnection();
//con.getProperties().put("USERID", pgpItem.get("id"));
JSCFStatement stmt = con.createStatement();
JSCFResultSet res = stmt.executeEncrypt(MimeTreeRenderer.getInstance()
.renderMimePart(part.getChild(
0)), pgpItem.get("recipients"));
if (res.isError()) {
JOptionPane.showMessageDialog(FrameManager.getInstance()
.getActiveFrame(),
StreamUtils.readCharacterStream(res.getErrorStream()).toString());
}
encryptedPart = new InputStreamMimePart(encryptedHeader,
res.getResultStream());
streams.add(MimeTreeRenderer.getInstance().renderMimePart(encryptedPart));
// Create the closing boundary
streams.add(new ByteArrayInputStream(endBoundary));
return new SequenceInputStream(streams);
}
// in java/org/columba/mail/spam/rules/MissingToHeaderRule.java
public float score(IMailbox folder, Object uid) throws Exception {
Header header = folder.getHeaderFields(uid, new String[] { "To"});
String from = header.get("To");
if (from == null) return MAX_PROBABILITY;
if (from.length() == 0) return MAX_PROBABILITY;
return NEARLY_ZERO;
}
// in java/org/columba/mail/spam/rules/SubjectContainsSpamRule.java
public float score(IMailbox folder, Object uid) throws Exception {
Header header = folder.getHeaderFields(uid, new String[] { "Subject"});
String subject = header.get("Subject");
if (subject == null) return NEARLY_ZERO;
if (subject.length() == 0) return NEARLY_ZERO;
// convert to lower-case
subject = subject.toLowerCase();
if (subject.indexOf("[spam]") != -1) return MAX_PROBABILITY;
return NEARLY_ZERO;
}
// in java/org/columba/mail/spam/rules/OnlyHTMLMimepartRule.java
public float score(IMailbox folder, Object uid) throws Exception {
MimeTree tree = folder.getMimePartTree(uid);
Iterator it = tree.getAllLeafs().iterator();
boolean onlyHTML = true;
while (it.hasNext()) {
MimePart mp = (MimePart) it.next();
MimeHeader header = mp.getHeader();
MimeType mimetype = header.getMimeType();
if ((mimetype.getType().equals("text"))
&& (mimetype.getSubtype().equals("html"))) {
} else {
onlyHTML = false;
}
}
if (onlyHTML) return MAX_PROBABILITY;
return NEARLY_ZERO;
}
// in java/org/columba/mail/spam/rules/SubjectWhitespaceRule.java
public float score(IMailbox folder, Object uid) throws Exception {
Header header = folder.getHeaderFields(uid, new String[]{"Subject"});
String subject = header.get("Subject");
if ( subject == null ) return NEARLY_ZERO;
if ( subject.length() == 0 ) return NEARLY_ZERO;
int count=0;
boolean whitespace = false;
for ( int i=0; i<subject.length(); i++) {
char ch = subject.charAt(i);
if ( ch == ' ') {
// whitespace detected
// if already detected before
if ( whitespace ) count++;
whitespace = true;
} else {
whitespace = false;
}
}
// check for at least 10 whitespaces
if ( count > 10 ) return MAX_PROBABILITY;
return NEARLY_ZERO;
}
// in java/org/columba/mail/spam/rules/SubjectIsAllCapitalsRule.java
public float score(IMailbox folder, Object uid) throws Exception {
Header header = folder.getHeaderFields(uid, new String[] { "Subject"});
String subject = header.get("Subject");
if (subject == null) return NEARLY_ZERO;
if (subject.length() == 0) return NEARLY_ZERO;
if (subject.equals(subject.toUpperCase())) return MAX_PROBABILITY;
return NEARLY_ZERO;
}
// in java/org/columba/mail/spam/rules/RuleList.java
public ProbabilityMap getProbabilities(IMailbox folder, Object uid)
throws Exception {
ProbabilityMap map = new ProbabilityMapImpl();
Iterator it = list.iterator();
while (it.hasNext()) {
Rule rule = (Rule) it.next();
LOG.info("rule " + rule.getName());
float score = rule.score(folder, uid);
LOG.info("score=" + score);
map.addToken(new Token(rule.getName()), score);
}
return map;
}
// in java/org/columba/mail/spam/rules/MixedCharactersAddressRule.java
public float score(IMailbox folder, Object uid) throws Exception {
Header header = folder.getHeaderFields(uid, new String[] { "From"});
String from = header.get("From");
if (from == null) return NEARLY_ZERO;
if (from.length() == 0) return NEARLY_ZERO;
int count = 0;
for (int i = 0; i < from.length(); i++) {
if (Character.isDigit(from.charAt(i))) count++;
}
// if 1/3 of all characters are digits
if ( count > from.length()/3) return MAX_PROBABILITY;
return NEARLY_ZERO;
}
// in java/org/columba/mail/spam/SpamController.java
public boolean scoreMessage(IMailbox mailbox, Object uid) throws Exception {
return spamPlugin.scoreMessage(mailbox, uid);
}
// in java/org/columba/mail/spam/SpamController.java
public void trainMessageAsSpam(IMailbox mailbox, Object uid)
throws Exception {
spamPlugin.trainMessageAsSpam(mailbox, uid);
}
// in java/org/columba/mail/spam/SpamController.java
public void trainMessageAsHam(IMailbox mailbox, Object uid)
throws Exception {
spamPlugin.trainMessageAsHam(mailbox, uid);
}
// in java/org/columba/mail/spam/MacchiatoPlugin.java
public boolean scoreMessage(IMailbox mailbox, Object uid) throws Exception {
// load database from file
load();
// get inputstream of message body
InputStream istream = CommandHelper.getBodyPart(mailbox, uid);
// we are using this inpustream multiple times
// --> istream will be closed by CloneStreamMaster
CloneStreamMaster master = new CloneStreamMaster(istream);
// get stream
istream = master.getClone();
// apply additional handcrafted rules
ProbabilityMap map = RuleList.getInstance().getProbabilities(mailbox,
uid);
float score = filter.scoreMessage(new Message(istream), map);
return score >= 0.9f;
}
// in java/org/columba/mail/spam/MacchiatoPlugin.java
public void trainMessageAsSpam(IMailbox mailbox, Object uid)
throws Exception {
// get inputstream of message body
InputStream istream = CommandHelper.getBodyPart(mailbox, uid);
// get headers
Header h = mailbox.getHeaderFields(uid, Message.HEADERFIELDS);
// put headers in list
Enumeration e = h.getKeys();
List list = new ArrayList();
while (e.hasMoreElements()) {
String key = (String) e.nextElement();
list.add(h.get(key));
}
// load database from file
load();
try {
CloneStreamMaster master = new CloneStreamMaster(istream);
InputStream inputStream = master.getClone();
byte[] md5sum = MD5SumHelper.createMD5(inputStream);
// close stream
inputStream.close();
// get new inputstream
inputStream = master.getClone();
Message message = new Message(inputStream, list, md5sum);
// check if this message was already learned
// -> only add if this is not the case
if (db.MD5SumExists(md5sum)) {
// message already exists
// --> correct token data
filter.correctMessageAsSpam(message);
} else {
// new message
filter.trainMessageAsSpam(message);
}
// close stream
inputStream.close();
// set dirty flag
hasChanged = true;
} catch (IOException e1) {
LOG.severe(e1.getMessage());
if (Logging.DEBUG)
e1.printStackTrace();
} catch (NoSuchAlgorithmException nsae) {
} // does not occur
}
// in java/org/columba/mail/spam/MacchiatoPlugin.java
public void trainMessageAsHam(IMailbox mailbox, Object uid)
throws Exception {
// get inputstream of message body
InputStream istream = CommandHelper.getBodyPart(mailbox, uid);
// get headers
Header h = mailbox.getHeaderFields(uid, Message.HEADERFIELDS);
// put headers in list
Enumeration e = h.getKeys();
List list = new ArrayList();
while (e.hasMoreElements()) {
String key = (String) e.nextElement();
list.add(h.get(key));
}
// load database from file
load();
try {
CloneStreamMaster master = new CloneStreamMaster(istream);
InputStream inputStream = master.getClone();
byte[] md5sum = MD5SumHelper.createMD5(inputStream);
// close stream
inputStream.close();
// get new inputstream
inputStream = master.getClone();
Message message = new Message(inputStream, list, md5sum);
// check if this message was already learned
if (db.MD5SumExists(md5sum)) {
// message already exists
// --> correct token data
filter.correctMessageAsHam(message);
} else {
// new message
filter.trainMessageAsHam(message);
}
// close stream
inputStream.close();
// set dirty flag
hasChanged = true;
} catch (IOException e1) {
LOG.severe(e1.getMessage());
if (Logging.DEBUG)
e1.printStackTrace();
} catch (NoSuchAlgorithmException nsae) {
} // does not occur
}
// in java/org/columba/mail/spam/command/LearnMessageAsSpamCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// get array of source references
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
// get array of message UIDs
Object[] uids = r.getUids();
// get source folder
IMailbox srcFolder = (IMailbox) r.getSourceFolder();
// register for status events
((StatusObservableImpl) srcFolder.getObservable()).setWorker(worker);
// update status message
if (uids.length > 1) {
// TODO (@author fdietz): i18n
worker.setDisplayText("Training messages...");
worker.setProgressBarMaximum(uids.length);
}
for (int j = 0; j < uids.length; j++) {
if (worker.cancelled()) {
break;
}
try {
// train message as spam
SpamController.getInstance().trainMessageAsSpam(srcFolder,
uids[j]);
if (uids.length > 1) {
worker.setProgressBarValue(j);
}
} catch (Exception e) {
if (Logging.DEBUG) {
e.printStackTrace();
}
}
}
}
// in java/org/columba/mail/spam/command/CommandHelper.java
public static InputStream getBodyPart(IMailbox folder, Object uid)
throws Exception {
MimeTree mimePartTree = folder.getMimePartTree(uid);
List l = mimePartTree.getLeafsWithContentType(mimePartTree
.getRootMimeNode(), "text");
if (l.size() > 1) {
Vector streamList = new Vector();
Iterator it = l.iterator();
while (it.hasNext()) {
MimePart mp = (MimePart) it.next();
InputStream s = getBodyPartStream(folder, uid, mp);
streamList.add(s);
}
SequenceInputStream stream = new SequenceInputStream(streamList
.elements());
return stream;
} else if (l.size() == 1) {
MimePart mp = (MimePart) l.get(0);
InputStream s = getBodyPartStream(folder, uid, mp);
return s;
} else {
return new ByteArrayInputStream(new byte[0]);
}
}
// in java/org/columba/mail/spam/command/CommandHelper.java
private static InputStream getBodyPartStream(IMailbox folder, Object uid,
MimePart mp) throws Exception {
InputStream bodyStream = folder.getMimePartBodyStream(uid, mp
.getAddress());
int encoding = mp.getHeader().getContentTransferEncoding();
switch (encoding) {
case MimeHeader.QUOTED_PRINTABLE: {
bodyStream = new QuotedPrintableDecoderInputStream(bodyStream);
break;
}
case MimeHeader.BASE64: {
bodyStream = new Base64DecoderInputStream(bodyStream);
break;
}
}
return bodyStream;
}
// in java/org/columba/mail/spam/command/CommandHelper.java
public static AccountItem retrieveAccountItem(IMailbox folder, Object uid)
throws Exception {
AccountItem item = null;
Object accountUid = folder.getAttribute(uid, "columba.accountuid");
if (accountUid != null) {
// try to get account using the account ID
item = MailConfig.getInstance().getAccountList().uidGet(
((Integer) accountUid).intValue());
}
if (item == null) {
// try to get the account using the email address
Header header = folder.getHeaderFields(uid, new String[] { "To" });
item = MailConfig.getInstance().getAccountList().getAccount(
header.get("To"));
}
if (item == null) {
// use default account as fallback
item = MailConfig.getInstance().getAccountList()
.getDefaultAccount();
}
return item;
}
// in java/org/columba/mail/spam/command/LearnMessageAsHamCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// get array of source references
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
// get array of message UIDs
Object[] uids = r.getUids();
// get source folder
IMailbox srcFolder = (IMailbox) r.getSourceFolder();
// register for status events
((StatusObservableImpl) srcFolder.getObservable()).setWorker(worker);
// update status message
if (uids.length > 1) {
// TODO (@author fdietz): i18n
worker.setDisplayText("Training messages...");
worker.setProgressBarMaximum(uids.length);
}
long startTime = System.currentTimeMillis();
for (int j = 0; j < uids.length; j++) {
if (worker.cancelled()) {
break;
}
try {
// train message as ham
SpamController.getInstance().trainMessageAsHam(srcFolder,
uids[j]);
if (uids.length > 1) {
worker.setProgressBarValue(j);
}
} catch (Exception e) {
if (Logging.DEBUG) {
e.printStackTrace();
}
}
}
long endTime = System.currentTimeMillis();
LOG.info("took me=" + (endTime - startTime) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
}
// in java/org/columba/mail/spam/command/ScoreMessageCommand.java
public void updateGUI() throws Exception {
// update table
if (markAsSpamCommand != null) {
markAsSpamCommand.updateGUI();
}
if (markAsNotSpamCommand != null) {
markAsNotSpamCommand.updateGUI();
}
}
// in java/org/columba/mail/spam/command/ScoreMessageCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// get source reference
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
// get array of message UIDs
uids = r.getUids();
// get source folder
srcFolder = (IMailbox) r.getSourceFolder();
// register for status events
((StatusObservableImpl) srcFolder.getObservable()).setWorker(worker);
// update status message
// TODO (@author fdietz): i18n
worker.setDisplayText("Scoring messages ...");
worker.setProgressBarMaximum(uids.length);
ArrayList spamList = new ArrayList();
ArrayList nonspamList = new ArrayList();
for (int j = 0; j < uids.length; j++) {
if (worker.cancelled()) {
return;
}
try {
// score message
boolean result = scoreMessage(j);
// if message is spam
if (result) {
// mark message as spam
spamList.add(uids[j]);
} else {
// mark message as *not* spam
nonspamList.add(uids[j]);
}
// train message as spam or non spam
trainMessage(j, result);
worker.setProgressBarValue(j);
if (worker.cancelled()) {
break;
}
} catch (Exception e) {
if (Logging.DEBUG) {
e.printStackTrace();
}
}
}
// mark spam messages
if (spamList.size() != 0) {
MailFolderCommandReference ref = new MailFolderCommandReference(
srcFolder, spamList.toArray());
ref.setMarkVariant(MarkMessageCommand.MARK_AS_SPAM);
markAsSpamCommand = new MarkMessageCommand(ref);
markAsSpamCommand.execute(worker);
}
// mark non spam messages
if (nonspamList.size() != 0) {
MailFolderCommandReference ref = new MailFolderCommandReference(
srcFolder, nonspamList.toArray());
ref.setMarkVariant(MarkMessageCommand.MARK_AS_NOTSPAM);
markAsNotSpamCommand = new MarkMessageCommand(ref);
markAsNotSpamCommand.execute(worker);
}
}
// in java/org/columba/mail/spam/command/ScoreMessageCommand.java
private boolean scoreMessage(int j) throws Exception, IOException {
// calculate message score
boolean result = SpamController.getInstance().scoreMessage(srcFolder,
uids[j]);
// message belongs to which account?
AccountItem item = CommandHelper
.retrieveAccountItem(srcFolder, uids[j]);
if (item.getSpamItem().checkAddressbook()) {
// check if sender is already in addressbook
boolean isInAddressbook = new AddressbookFilter().process(
srcFolder, uids[j]);
result = result && !isInAddressbook;
}
return result;
}
// in java/org/columba/mail/spam/command/ScoreMessageCommand.java
private void trainMessage(int j, boolean result) throws Exception {
// add this message to frequency database
if (result) {
SpamController.getInstance().trainMessageAsSpam(srcFolder, uids[j]);
} else {
SpamController.getInstance().trainMessageAsHam(srcFolder, uids[j]);
}
}
// in java/org/columba/mail/spam/spamassassin/SpamAssassinPlugin.java
public boolean scoreMessage(IMailbox mailbox, Object uid) throws Exception {
InputStream rawMessageSource = mailbox.getMessageSourceStream(uid);
IPCHelper ipcHelper = new IPCHelper();
// "-L" use local tests only
// String cmd = "spamassassin -L";
// String cmd = "spamc -c -L";
String cmd = ExternalToolsHelper.getSpamc() + " -c";
String result = null;
int exitVal = -1;
try {
LOG.info("creating process..");
ipcHelper.executeCommand(cmd);
LOG.info("sending to stdin..");
ipcHelper.send(rawMessageSource);
exitVal = ipcHelper.waitFor();
LOG.info("exitcode=" + exitVal);
LOG.info("retrieving output..");
result = ipcHelper.getOutputString();
ipcHelper.waitForThreads();
} catch (Exception ex) {
ex.printStackTrace();
}
if (result == null) {
return false;
}
if (exitVal == 1) {
// spam found
return true;
} else {
return false;
}
}
// in java/org/columba/mail/spam/spamassassin/SpamAssassinPlugin.java
public void trainMessageAsSpam(IMailbox mailbox, Object uid)
throws Exception {
InputStream rawMessageSource = mailbox.getMessageSourceStream(uid);
IPCHelper ipcHelper = new IPCHelper();
LOG.info("creating process..");
// --no-rebuild option is deprecated in recent SpamAssassin versions
/*
ipcHelper.executeCommand(ExternalToolsHelper.getSALearn()
+ " --no-rebuild --spam --single");
*/
ipcHelper.executeCommand(ExternalToolsHelper.getSALearn()
+ " --no-sync --spam --single");
LOG.info("sending to stdin..");
ipcHelper.send(rawMessageSource);
int exitVal = ipcHelper.waitFor();
LOG.info("exitcode=" + exitVal);
LOG.info("retrieving output..");
String result = ipcHelper.getOutputString();
LOG.info("output=" + result);
ipcHelper.waitForThreads();
}
// in java/org/columba/mail/spam/spamassassin/SpamAssassinPlugin.java
public void trainMessageAsHam(IMailbox mailbox, Object uid)
throws Exception {
InputStream rawMessageSource = mailbox.getMessageSourceStream(uid);
IPCHelper ipcHelper = new IPCHelper();
LOG.info("creating process..");
// --no-rebuild option is deprecated in recent SpamAssassin versions
ipcHelper.executeCommand(ExternalToolsHelper.getSALearn()
+ " --no-sync --ham --single");
LOG.info("sending to stdin..");
ipcHelper.send(rawMessageSource);
int exitVal = ipcHelper.waitFor();
LOG.info("exitcode=" + exitVal);
LOG.info("retrieving output..");
String result = ipcHelper.getOutputString();
LOG.info("output=" + result);
ipcHelper.waitForThreads();
}
// in java/org/columba/mail/spam/spamassassin/IPCHelper.java
public void executeCommand(String command) throws Exception {
p = Runtime.getRuntime().exec(command);
errorStream = new StreamThread(p.getErrorStream());
outputStream = new StreamThread(p.getInputStream());
inputStream = p.getOutputStream();
errorStream.start();
outputStream.start();
}
// in java/org/columba/mail/spam/spamassassin/IPCHelper.java
public void send(String in) throws Exception {
inputStream.write(in.getBytes());
inputStream.flush();
inputStream.close();
}
// in java/org/columba/mail/spam/spamassassin/IPCHelper.java
public void send(InputStream in) throws Exception {
StreamUtils.streamCopy(in, inputStream);
inputStream.flush();
inputStream.close();
}
// in java/org/columba/mail/spam/spamassassin/IPCHelper.java
public int waitFor() throws Exception {
int exitVal = p.waitFor();
return exitVal;
}
// in java/org/columba/mail/spam/spamassassin/IPCHelper.java
public String getErrorString() throws Exception {
String str = errorStream.getBuffer();
return str;
}
// in java/org/columba/mail/spam/spamassassin/IPCHelper.java
public String getOutputString() throws Exception {
String str = outputStream.getBuffer();
return str;
}
// in java/org/columba/mail/spam/spamassassin/IPCHelper.java
public void waitForThreads() throws Exception {
outputStream.join();
errorStream.join();
}
// in java/org/columba/mail/search/SearchFolderFactory.java
public static VirtualFolder createSearchFolder(FilterCriteria c,
IMailFolder folder) throws Exception {
// create search folder
VirtualFolder searchFolder = createVirtualFolder(folder);
// add filter criteria
searchFolder.getFilter().getFilterRule().add(c);
return searchFolder;
}
// in java/org/columba/mail/search/SearchFolderFactory.java
public static VirtualFolder prepareSearchFolder(FilterCriteria c,
IMailFolder folder) throws Exception {
// create search folder
VirtualFolder searchFolder = createVirtualFolder(folder);
// add filter criteria
searchFolder.getFilter().getFilterRule().add(c);
return searchFolder;
}
// in java/org/columba/mail/search/SearchFolderFactory.java
public static VirtualFolder createSearchFolder(FilterRule rule,
IMailFolder folder) throws Exception {
// create search folder
VirtualFolder searchFolder = createVirtualFolder(folder);
searchFolder.getFilter().getFilterRule().setCondition(
rule.getConditionInt());
for (int i = 0; i < rule.getChildCount(); i++) {
// add filter criteria
searchFolder.getFilter().getFilterRule().add(rule.get(i));
}
return searchFolder;
}
// in java/org/columba/mail/search/SearchFolderFactory.java
public static VirtualFolder prepareSearchFolder(FilterRule rule,
IMailFolder folder) throws Exception {
// create search folder
VirtualFolder searchFolder = createVirtualFolder(folder);
searchFolder.getFilter().getFilterRule().setCondition(
rule.getConditionInt());
for (int i = 0; i < rule.getChildCount(); i++) {
// add filter criteria
searchFolder.getFilter().getFilterRule().add(rule.get(i));
}
return searchFolder;
}
// in java/org/columba/mail/search/MailSearchProvider.java
private List<ISearchResult> retrieveResultData(Vector<SearchIndex> indizes,
int startIndex, int resultCount) throws Exception {
// ensure we are in existing result range
int count = (startIndex + resultCount <= indizes.size()) ? resultCount
: indizes.size();
List<ISearchResult> result = new Vector<ISearchResult>();
// gather result results
for (int i = startIndex; i < count; i++) {
SearchIndex idx = indizes.get(i);
VirtualFolder folder = idx.folder;
Object messageId = idx.messageId;
// TODO @author fdietz: ensure that we don't fetch individual
// headers
// to reduce client/server roundtrips
String title = (String) folder.getAttribute(messageId,
"columba.subject");
Address from = (Address) folder.getAttribute(messageId,
"columba.from");
Date date = (Date) folder.getAttribute(messageId, "columba.date");
String description = from.toString() + " " + date;
VirtualHeader h = (VirtualHeader) folder.getHeaderList().get(messageId);
URI uri = SearchResultBuilder.createURI(h.getSrcFolder().getId(), h.getSrcUid());
System.out.println("uri="+uri.toString());
ImageIcon statusIcon = null;
Flags flags = folder.getFlags(messageId);
if (flags.getDeleted()) {
statusIcon = ImageLoader.getSmallIcon("user-trash.png");
} else if (flags.getAnswered()) {
statusIcon = MailImageLoader
.getSmallIcon("message-mail-replied.png");
} else if (flags.getDraft()) {
statusIcon = MailImageLoader.getSmallIcon("edit.png");
} else if (!flags.getSeen()) {
statusIcon = MailImageLoader
.getSmallIcon("message-mail-unread.png");
} else if (flags.getSeen()) {
statusIcon = MailImageLoader
.getSmallIcon("message-mail-read.png");
}
String dateString = new DateHelper().format(date);
result.add(new MailSearchResult(title, description, uri,
dateString, date, from, statusIcon, flags.getFlagged()));
}
return result;
}
// in java/org/columba/mail/folder/imap/UpdateFlagCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// get references
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
// get IMAP rootfolder
IMAPFolder srcFolder = (IMAPFolder) r.getSourceFolder();
srcFolder.updateFlag(flag);
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
public void removeFolder() throws Exception {
try {
if (existsOnServer) {
String path = getImapPath();
getServer().deleteFolder(path);
}
super.removeFolder();
} catch (Exception e) {
throw e;
}
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
public void setName(String name) throws Exception {
if (getName() == null) { // if creating new folder
super.setName(name);
return;
}
String oldPath = getImapPath();
LOG.info("old path=" + oldPath);
String newPath = null;
if (getParent() instanceof IMAPFolder) {
newPath = ((IMAPFolder) getParent()).getImapPath();
}
newPath += (getServer().getDelimiter() + name);
LOG.info("new path=" + newPath);
getServer().renameFolder(oldPath, newPath);
super.setName(name);
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
public synchronized IHeaderList getHeaderList() throws Exception {
if (headerList == null) {
// header cache is stored in "headerlist" subfolder
File headercacheDirectory = new File(getDirectoryFile(),
"headerlist");
headerList = new BerkeleyDBHeaderList(headercacheDirectory, getId());
headerList
.addHeaderListCorruptedListener(new IHeaderListCorruptedListener() {
public void headerListCorrupted(IHeaderList headerList) {
headerList.clear();
getMessageFolderInfo().reset();
fireFolderPropertyChanged();
}
});
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
Object[] synchronizeHeaderlist() throws Exception, IOException,
CommandCancelledException, IMAPException {
Object[] result = new Object[0];
// do not sync folders which have a Noselect flag
if (!getConfiguration().getBooleanWithDefault("selectable", true))
return result;
// Check if the mailbox has changed
MailboxStatus status = getServer().getStatus(this);
if (status.getMessages() == 0) {
purgeHeaderList();
syncMailboxInfo(status);
return result;
}
if (!firstSync
&& status.getMessages() == this.getMessageFolderInfo()
.getExists()) {
return result;
}
List localUids = new LinkedList(Arrays
.asList(getHeaderList().getUids()));
// Sort the uid list
Collections.sort(localUids);
int largestLocalUid = localUids.size() > 0 ? ((Integer) localUids
.get(localUids.size() - 1)).intValue() : -1;
int largestRemoteUid = getServer().getLargestRemoteUid(this, status);
if (localUids.size() == status.getMessages()
&& largestRemoteUid == largestLocalUid) {
// Seems to be no change!
if (firstSync) {
firstSync = false;
synchronizeFlags(status);
} else {
syncMailboxInfo(status);
}
return result;
}
printStatusMessage(MailResourceLoader.getString("statusbar", "message",
"sync_messages"));
largestRemoteUid = getServer().fetchUid(
new SequenceSet(SequenceEntry.STAR), this);
if (largestRemoteUid == -1) {
largestRemoteUid = getServer().fetchUid(
new SequenceSet(status.getMessages()), this);
}
int largestLocalUidIndex = findLargestLocalUidIndex(localUids);
int newMessages = status.getMessages() - largestLocalUidIndex;
/*
* // Somehow there are new messages that // have a lower index -> out
* of sync if (localUids.size() - status.getMessages() + newMessages <
* 0) {
*
* LOG.severe("Folder " + getName() + " is out of sync -> recreating the
* cache!"); purgeHeaderList(); // all messages are new newMessages =
* status.getMessages(); // Set the index of the largest Uid to 0 // ->
* ensure it works with the fetch of new // messages part below
* largestLocalUidIndex = 0; largestLocalUid = -1;
*
* localUids.clear(); }
*/
LOG.fine("Found " + newMessages + " new Messages");
// If we have new messages add them to the headerlist
if (newMessages > 0) {
printStatusMessage(MailResourceLoader.getString("statusbar",
"message", "fetch_new_headers"));
// Ensure sizes are correct
getMessageFolderInfo().setExists(localUids.size());
getMessageFolderInfo().setUnseen(
Math.min(getMessageFolderInfo().getUnseen(), localUids
.size()));
getMessageFolderInfo().setRecent(0);
List newUids = fetchNewMessages(largestLocalUidIndex);
localUids.addAll(newUids);
if (newUids.size() < newMessages) {
// There are still more messages to update
// -> issue another fetch messages command
CommandProcessor.getInstance().addOp(
new FetchMessagesCommand(
new MailFolderCommandReference(this),
newMessages, largestLocalUidIndex, newUids
.size()));
} else {
fetchDone();
}
result = newUids.toArray(new Object[0]);
} else {
// Number of deleted messages is computed from exists on imap and
// local
// newMessages
findRemovedMessages(status, localUids);
if (firstSync) {
firstSync = false;
synchronizeFlags(status);
} else {
syncMailboxInfo(status);
}
}
return result;
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
private void findRemovedMessages(MailboxStatus status, List localUids)
throws Exception, IOException, IMAPException,
CommandCancelledException {
int largestRemoteUid = getServer().getLargestRemoteUid(this);
int deletedMessages = localUids.size() - status.getMessages();
LOG.fine("Found " + deletedMessages + " deleted Messages");
// Find the messages that have been deleted
if (deletedMessages > 0) {
int found = 0;
// First deleted all local uids that
// are larger than the largest remote uid
while (localUids.size() > 0
&& found != deletedMessages
&& ((Integer) localUids.get(localUids.size() - 1))
.intValue() > largestRemoteUid) {
Flags flags = getHeaderList().remove(
localUids.get(localUids.size() - 1)).getFlags();
fireMessageRemoved(localUids.remove(localUids.size() - 1),
flags);
found++;
}
// Search in packs beginning from newest to oldest
// -> in most cases this should save us a lot of uid fetchings to
// find the deleted messages
// Pack size is min 10, max 200 else mailboxsize / 10
int packSize = Math.min(Math.max(deletedMessages, status
.getMessages() / 10), 200);
int upper = status.getMessages();
int localPointer = localUids.size() - 1;
// Fetch Pack outer loop
while (upper >= 1 && found != deletedMessages) {
SequenceSet set = new SequenceSet();
set.add(Math.max(upper - packSize + 1, 1), upper);
// Fetch these uids and compare them to the
// local list
Integer[] actUids = getServer().fetchUids(set, this);
// Compare inner loop
for (int i = actUids.length - 1; i >= 0
&& found != deletedMessages; i--) {
// Find missing uids loop
while (found != deletedMessages && localPointer >= 0
&& !localUids.get(localPointer).equals(actUids[i])) {
// We found the uid of a deleted message
// -> remove it from the headerlist
getHeaderList().remove(localUids.get(localPointer));
found++;
localPointer--;
}
// next position in the local uid list
localPointer--;
}
upper = upper - packSize;
}
// All the other local mails are deleted
while (found < deletedMessages && localPointer >= 0) {
getHeaderList().remove(localUids.get(localPointer--));
found++;
}
if (found != deletedMessages) {
LOG.severe("Assertion failed : found only " + found + " of "
+ deletedMessages);
}
}
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
private void purgeHeaderList() throws Exception {
ICloseableIterator it = getHeaderList().keyIterator();
while (it.hasNext()) {
Object uid = it.next();
fireMessageRemoved(uid, getHeaderList().get(uid).getFlags());
}
it.close();
getHeaderList().clear();
getMessageFolderInfo().reset();
fireFolderPropertyChanged();
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
List fetchNewMessages(int startIndex) throws IOException, IMAPException,
CommandCancelledException, Exception {
IMAPFlags[] newFlags = getServer().fetchFlagsListStartFrom2(
startIndex + 1, this);
List newUids = new ArrayList(newFlags.length);
// Build a list of the new uids
for (int i = 0; i < newFlags.length; i++) {
// Update the list of new and local uids
newUids.add(newFlags[i].getUid());
}
// Fetch the headers of the new messages ...
getServer().fetchHeaderList(getHeaderList(), newUids, this);
// .. and set the flags
setFlags(newFlags);
// fire message added updates
for (int i = 0; i < newFlags.length; i++) {
fireMessageAdded(newFlags[i].getUid(), newFlags[i]);
}
return newUids;
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
private void synchronizeFlags(MailboxStatus status) throws Exception,
IOException, CommandCancelledException, IMAPException {
printStatusMessage(MailResourceLoader.getString("statusbar", "message",
"sync_flags"));
MailboxStatus flagStatus = new MailboxStatus();
flagStatus.setMessages(status.getMessages());
// Build the remote lists of messages that are UNSEEN, FLAGGED, DELETED,
// JUNK
SearchKey unseenKey = new SearchKey(SearchKey.UNSEEN);
List remoteUnseenUids = Arrays.asList(getServer().search(unseenKey,
this));
flagStatus.setUnseen(remoteUnseenUids.size());
SearchKey flaggedKey = new SearchKey(SearchKey.FLAGGED);
List remoteFlaggedUids = Arrays.asList(getServer().search(flaggedKey,
this));
SearchKey deletedKey = new SearchKey(SearchKey.DELETED);
List remoteDeletedUids = Arrays.asList(getServer().search(deletedKey,
this));
SearchKey recentKey = new SearchKey(SearchKey.RECENT);
List remoteRecentUids = Arrays.asList(getServer().search(recentKey,
this));
flagStatus.setRecent(remoteRecentUids.size());
SearchKey junkKey = new SearchKey(SearchKey.KEYWORD, "JUNK");
List remoteJunkUids = Arrays.asList(getServer().search(junkKey, this));
SearchKey answeredKey = new SearchKey(SearchKey.ANSWERED);
List remoteAnsweredUids = Arrays.asList(getServer().search(answeredKey,
this));
SearchKey draftKey = new SearchKey(SearchKey.DRAFT);
List remoteDraftUids = Arrays.asList(getServer().search(draftKey,
this));
// update the local flags and ensure that the MailboxInfo is correct
ICloseableIterator headerIterator = getHeaderList().headerIterator();
int unseen = 0;
int flagged = 0;
int recent = 0;
int deleted = 0;
int junk = 0;
int answered = 0;
int draft = 0;
while (headerIterator.hasNext()) {
IColumbaHeader header = (IColumbaHeader) headerIterator.next();
Object uid = header.get("columba.uid");
Flags flag = header.getFlags();
Flags oldFlag = (Flags) flag.clone();
int index;
index = Collections.binarySearch(remoteUnseenUids, uid);
flag.setSeen(index < 0);
if (!flag.getSeen()) {
unseen++;
}
index = Collections.binarySearch(remoteDeletedUids, uid);
flag.setDeleted(index >= 0);
if (flag.getDeleted()) {
deleted++;
}
index = Collections.binarySearch(remoteFlaggedUids, uid);
flag.setFlagged(index >= 0);
if (flag.getFlagged()) {
flagged++;
}
index = Collections.binarySearch(remoteRecentUids, uid);
flag.setRecent(index >= 0);
if (flag.getRecent()) {
recent++;
}
index = Collections.binarySearch(remoteJunkUids, uid);
header.getAttributes().put("columba.spam", new Boolean(index >= 0));
if (index >= 0) {
junk++;
}
index = Collections.binarySearch(remoteAnsweredUids, uid);
flag.setAnswered(index >= 0);
if (flag.getAnswered()) {
answered++;
}
index = Collections.binarySearch(remoteDraftUids, uid);
flag.setDraft(index >= 0);
if (flag.getDraft()) {
draft++;
}
if (!flag.equals(oldFlag)) {
getHeaderList().update(uid, header);
fireMessageFlagChanged(uid, oldFlag, 0);
}
}
headerIterator.close();
if (remoteJunkUids.size() != junk || remoteRecentUids.size() != recent
|| remoteFlaggedUids.size() != flagged
|| remoteDeletedUids.size() != deleted
|| remoteUnseenUids.size() != unseen
|| remoteAnsweredUids.size() != answered
|| remoteDraftUids.size() != draft) {
// Something is wrong
// Sync again
synchronizeHeaderlist();
return;
}
syncMailboxInfo(flagStatus);
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
protected void setFlags(Flags[] flagsList) throws Exception {
for (int i = 0; i < flagsList.length; i++) {
IMAPFlags flags = (IMAPFlags) flagsList[i];
Integer uid = (Integer) flags.getUid();
IColumbaHeader header = getHeaderList().get(uid);
Flags localFlags = header.getFlags();
localFlags.setFlags(flags.getFlags());
// Junk flag
header.getAttributes().put("columba.spam",
Boolean.valueOf(flags.get(IMAPFlags.JUNK)));
getHeaderList().update(uid, header);
}
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
public MimeTree getMimePartTree(Object uid) throws Exception {
MimeTree tree = IMAPCache.getInstance().getMimeTree(this, uid);
if (tree == null) {
tree = getServer().getMimeTree(uid, this);
IMAPCache.getInstance().addMimeTree(this, uid, tree);
}
return tree;
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
public void innerCopy(IMailbox destiny, Object[] uids) throws Exception {
IMAPFolder destFolder = (IMAPFolder) destiny;
Object[] destUids = getServer().copy(destFolder, uids, this);
if (destUids.length < uids.length) {
LOG
.warning("Some messages could not be copied because they do not exist anymore!");
}
// Check if maybe no message at all got copied
// In this case we are finished here
if (destUids.length == 0)
return;
if (destFolder.mailboxSyncEnabled) {
// Trigger Synchronization
CommandProcessor.getInstance().addOp(
new CheckForNewMessagesCommand(
new MailFolderCommandReference(destFolder)));
}
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
public void markMessage(Object[] uids, int variant) throws Exception {
getServer().markMessage(uids, variant, this);
super.markMessage(uids, variant);
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
public void expungeFolder() throws Exception {
try {
getServer().expunge(this);
super.expungeFolder();
} catch (Exception e) {
throw e;
}
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
public IColumbaHeader getMessageHeader(Object uid) throws Exception {
return getHeaderList().get(uid);
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
public void addSubfolder(IMailFolder child) throws Exception {
if (child instanceof IMAPFolder) {
getServer().createMailbox(child.getName(), this);
}
super.addSubfolder(child);
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
public Object addMessage(InputStream in, Attributes attributes, Flags flags)
throws Exception {
PassiveHeaderParserInputStream withHeaderInputStream = new PassiveHeaderParserInputStream(
in);
IMAPFlags imapFlags = new IMAPFlags(flags.getFlags());
Integer uid = getServer()
.append(withHeaderInputStream, imapFlags, this);
// Since JUNK is a non-system Flag we have to set it with
// an addtitional STORE command
if (((Boolean) attributes.get("columba.spam")).booleanValue()) {
imapFlags.set(IMAPFlags.JUNK, true);
getServer().setFlags(new Object[] { uid }, imapFlags, this);
}
if (mailboxSyncEnabled) {
// Trigger Synchronization
CommandProcessor.getInstance().addOp(
new CheckForNewMessagesCommand(
new MailFolderCommandReference(this)));
}
return uid;
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
public Header getHeaderFields(Object uid, String[] keys) throws Exception {
// get header with UID
IColumbaHeader header = getHeaderList().get(uid);
if (header == null)
return new Header();
// cached headerfield list
List cachedList = Arrays.asList(CachedHeaderfields
.getDefaultHeaderfields());
List keyList = new ArrayList(Arrays.asList(keys));
ListTools.substract(keyList, cachedList);
if (keyList.size() > 0) {
return getServer().getHeaders(uid, keys, this);
} else {
return (Header) header.getHeader().clone();
}
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
public InputStream getMessageSourceStream(Object uid) throws Exception {
return getServer().getMessageSourceStream(uid, this);
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
public InputStream getMimePartSourceStream(Object uid, Integer[] address)
throws Exception {
return getServer().getMimePartSourceStream(uid, address, this);
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
public InputStream getMimePartBodyStream(Object uid, Integer[] address)
throws Exception {
InputStream result = IMAPCache.getInstance().getMimeBody(this, uid,
address);
if (result == null) {
LOG.fine("Cache miss - fetching from server");
result = IMAPCache.getInstance().addMimeBody(this, uid, address,
getServer().getMimePartBodyStream(uid, address, this));
}
return result;
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
public Object addMessage(InputStream in) throws Exception {
PassiveHeaderParserInputStream withHeaderInputStream = new PassiveHeaderParserInputStream(
in);
Integer uid = getServer().append(withHeaderInputStream, this);
if (mailboxSyncEnabled) {
// Trigger Synchronization
CommandProcessor.getInstance().addOp(
new CheckForNewMessagesCommand(
new MailFolderCommandReference(this)));
}
return uid;
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
public Header getAllHeaderFields(Object uid) throws Exception {
return getServer().getAllHeaders(uid, this);
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
public void updateFlag(IMAPFlags flag) throws Exception,
CommandCancelledException {
if (getServer().isSelected(this)) {
Integer uid = new Integer(getServer().fetchUid(
new SequenceSet(flag.getIndex()), this));
flag.setUid(uid);
setFlags(new Flags[] { flag });
}
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
public void save() throws Exception {
super.save();
if (headerList != null)
headerList.persist();
}
// in java/org/columba/mail/folder/imap/IMAPFolder.java
void fetchDone() throws IOException, CommandCancelledException,
IMAPException, Exception {
MailboxStatus status = getServer().getStatus(this);
List localUids = new LinkedList(Arrays
.asList(getHeaderList().getUids()));
// Sort the uid list
Collections.sort(localUids);
// Number of deleted messages is computed from exists on imap and local
// newMessages
findRemovedMessages(status, localUids);
if (firstSync) {
firstSync = false;
synchronizeFlags(status);
} else {
syncMailboxInfo(status);
}
// Apply filter if enabled
ImapItem item = getServer().getItem();
boolean applyFilter = item.getBooleanWithDefault(
"automatically_apply_filter", false);
// if "automatically apply filter" is selected & there
// are
// new
// messages
if (applyFilter) {
CommandProcessor.getInstance()
.addOp(
new ApplyFilterCommand(
new MailFolderCommandReference(this)));
}
// Reenable Updating the mailbox
mailboxSyncEnabled = true;
}
// in java/org/columba/mail/folder/imap/IMAPRootFolder.java
protected void syncFolder(AbstractFolder parent, String name, ListInfo info)
throws Exception {
if ((name.indexOf(server.getDelimiter()) != -1)
&& (name.indexOf(server.getDelimiter()) != (name.length() - 1))) {
// delimiter found
// -> recursively create all necessary folders to create
// -> the final folder
String subchild = name.substring(0, name.indexOf(server
.getDelimiter()));
AbstractFolder subFolder = (AbstractFolder) parent
.findChildWithName(subchild, false, IMAPFolder.class);
// if folder doesn't exist already
if (subFolder == null) {
subFolder = new IMAPFolder(subchild, "IMAPFolder",
getParentPath());
parent.add(subFolder);
parent.getConfiguration().getRoot().addElement(
subFolder.getConfiguration().getRoot());
FolderTreeModel.getInstance().insertNodeInto(subFolder, parent,
parent.getIndex(subFolder));
((IMAPFolder) subFolder).existsOnServer = true;
subFolder.getConfiguration().setString("selectable", "false");
// this is the final folder
// subFolder = addIMAPChildFolder(parent, info, subchild);
} else {
if (!((IMAPFolder) subFolder).existsOnServer) {
((IMAPFolder) subFolder).existsOnServer = true;
subFolder.getConfiguration().setString("selectable",
"false");
}
}
// recursively go on
syncFolder(subFolder, name.substring(name.indexOf(server
.getDelimiter())
+ server.getDelimiter().length()), info);
} else {
// no delimiter found
// -> this is already the final folder
// if folder doesn't exist already
AbstractFolder subFolder = (AbstractFolder) parent
.findChildWithName(name, false, IMAPFolder.class);
if (subFolder == null) {
subFolder = new IMAPFolder(name, "IMAPFolder", getParentPath());
parent.add(subFolder);
parent.getConfiguration().getRoot().addElement(
subFolder.getConfiguration().getRoot());
FolderTreeModel.getInstance().insertNodeInto(subFolder, parent,
parent.getIndex(subFolder));
}
((IMAPFolder) subFolder).existsOnServer = true;
// Check the Noselect flag
if (info.getParameter(ListInfo.NOSELECT)) {
subFolder.getConfiguration().setString("selectable", "false");
} else {
subFolder.getConfiguration().setString("selectable", "true");
}
// Check the Noinferior flag
if (info.getParameter(ListInfo.NOINFERIORS)
&& info.getDelimiter() != null) {
subFolder.getConfiguration().setString("noinferiors", "true");
} else {
subFolder.getConfiguration().setString("noinferiors", "false");
}
}
}
// in java/org/columba/mail/folder/imap/IMAPRootFolder.java
private boolean removeNotMarkedSubfolders(AbstractFolder parent)
throws Exception {
AbstractFolder child;
// first remove all subfolders recursively
for (int i = 0; i < parent.getChildCount(); i++) {
child = (AbstractFolder) parent.getChildAt(i);
if (child instanceof IMAPFolder) {
if (removeNotMarkedSubfolders(child)) {
// A child got removed -> stay at this position to
// get the next
i--;
}
}
}
// maybe remove this folder
if (parent instanceof IMAPFolder) {
if (!((IMAPFolder) parent).existsOnServer) {
FolderTreeModel.getInstance().removeNodeFromParent(parent);
parent.removeFolder();
return true;
}
}
return false;
}
// in java/org/columba/mail/folder/imap/IMAPRootFolder.java
public void syncSubscribedFolders() throws Exception {
// first clear all flags
markAllSubfoldersAsExistOnServer(this, false);
IMAPFolder inbox = (IMAPFolder) this.findChildWithName("INBOX", false);
inbox.existsOnServer = true;
try {
// create and tag all subfolders on server
ListInfo[] listInfo = getServer().fetchSubscribedFolders();
for (int i = 0; i < listInfo.length; i++) {
ListInfo info = listInfo[i];
LOG.fine("delimiter=" + getServer().getDelimiter());
String folderPath = info.getName();
syncFolder(this, folderPath, info);
}
} catch (Exception ex) {
ex.printStackTrace();
}
// This fixes the strange behaviour of the courier imapserver
// which sets the \Noselect flag on INBOX
inbox.getConfiguration().setString("selectable", "true");
removeNotMarkedSubfolders(this);
findSpecialFolders();
}
// in java/org/columba/mail/folder/imap/IMAPRootFolder.java
public Object[] searchMessages(Filter filter, Object[] uids)
throws Exception {
return null;
}
// in java/org/columba/mail/folder/imap/IMAPRootFolder.java
public Object[] searchMessages(Filter filter) throws Exception {
return null;
}
// in java/org/columba/mail/folder/imap/IMAPRootFolder.java
public void addSubfolder(IMailFolder child) throws Exception {
if (child instanceof IMAPFolder) {
getServer().createMailbox(child.getName(), null);
}
super.addSubfolder(child);
}
// in java/org/columba/mail/folder/imap/IMAPRootFolder.java
public void setInbox(IMAPFolder inbox) throws Exception {
super.addSubfolder(inbox);
super.add(inbox);
}
// in java/org/columba/mail/folder/imap/IMAPRootFolder.java
public void save() throws Exception {
LOG.info("Logout from IMAPServer " + getName());
getServer().logout();
}
// in java/org/columba/mail/folder/imap/FetchMessagesCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// get references
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
IMAPFolder imapFolder = (IMAPFolder) r.getSourceFolder();
worker.setProgressBarMaximum(newMessages);
worker.setProgressBarValue(fetchedMessages);
int fetched = imapFolder.fetchNewMessages(offset + fetchedMessages).size();
fetchedMessages += fetched;
worker.setProgressBarValue(fetchedMessages);
if( worker.cancelled()) {
return;
}
if(fetched > 0 && fetchedMessages < newMessages) {
CommandProcessor.getInstance().addOp(
new FetchMessagesCommand(
new MailFolderCommandReference(imapFolder),
newMessages, offset, fetchedMessages));
} else {
// Trigger any pending Flag syncs
imapFolder.fetchDone();
}
}
// in java/org/columba/mail/folder/imap/CheckForNewMessagesCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// register for status events
((StatusObservableImpl) imapFolder.getObservable()).setWorker(worker);
// Find old numbers
int total = imapFolder.getMessageFolderInfo().getExists();
// check for new headers
Object[] uids = new Object[0];
try {
uids = imapFolder.synchronizeHeaderlist();
} catch (IOException e) {
imapFolder.setMailboxSyncEnabled(true);
worker.cancel();
throw new CommandCancelledException(e);
}
// Get the new numbers
int newTotal = imapFolder.getMessageFolderInfo().getExists();
// fire new message event to interested listeners
if (triggerNotification && (newTotal != total) ) {
if( ((IMAPRootFolder)imapFolder.getRootFolder()).getAccountItem().getImapItem().getBoolean("enable_sound")) {
// create reference of newly arrived messages
IMailFolderCommandReference ref = new MailFolderCommandReference(imapFolder, uids);
// fire event
MailCheckingManager.getInstance().fireNewMessageArrived(ref);
}
}
}
// in java/org/columba/mail/folder/imap/CheckForNewMessagesCommand.java
public void updateGUI() throws Exception {
// Reenable the action
if( action != null) action.setEnabled(true);
}
// in java/org/columba/mail/folder/AbstractMessageFolder.java
public void save() throws Exception {
saveMessageFolderInfo();
if (getSearchEngine() != null) {
getSearchEngine().save();
}
}
// in java/org/columba/mail/folder/AbstractMessageFolder.java
protected void updateMailFolderInfo(Flags flags, int variant)
throws Exception {
boolean updated = false;
if (flags == null) {
return;
}
try {
switch (variant) {
case MarkMessageCommand.MARK_AS_READ: {
if (flags.getRecent()) {
getMessageFolderInfo().decRecent();
updated = true;
}
if (!flags.getSeen()) {
getMessageFolderInfo().decUnseen();
updated = true;
}
break;
}
case MarkMessageCommand.MARK_AS_UNREAD: {
if (flags.getSeen()) {
getMessageFolderInfo().incUnseen();
updated = true;
}
break;
}
case MarkMessageCommand.MARK_AS_EXPUNGED: {
if (!flags.getSeen()) {
getMessageFolderInfo().decUnseen();
updated = true;
}
if (flags.getRecent()) {
getMessageFolderInfo().decRecent();
updated = true;
}
break;
}
case MarkMessageCommand.MARK_AS_RECENT: {
if (!flags.getRecent()) {
getMessageFolderInfo().incRecent();
updated = true;
}
break;
}
case MarkMessageCommand.MARK_AS_NOTRECENT: {
if (flags.getRecent()) {
getMessageFolderInfo().decRecent();
updated = true;
}
break;
}
}
} catch (MailboxInfoInvalidException e) {
recreateMessageFolderInfo();
}
// update treenode
if (updated)
fireFolderPropertyChanged();
}
// in java/org/columba/mail/folder/AbstractMessageFolder.java
protected void markMessage(Object uid, int variant) throws Exception {
IColumbaHeader header = getHeaderList().get(uid);
Flags flags = header.getFlags();
updateMailFolderInfo(flags, variant);
if (flags == null) {
return;
}
Flags oldFlags = (Flags) flags.clone();
switch (variant) {
case MarkMessageCommand.MARK_AS_READ: {
flags.setSeen(true);
flags.setRecent(false);
break;
}
case MarkMessageCommand.MARK_AS_UNREAD: {
flags.setSeen(false);
break;
}
case MarkMessageCommand.MARK_AS_FLAGGED: {
flags.setFlagged(true);
break;
}
case MarkMessageCommand.MARK_AS_UNFLAGGED: {
flags.setFlagged(false);
break;
}
case MarkMessageCommand.MARK_AS_EXPUNGED: {
flags.setSeen(true);
flags.setRecent(false);
flags.setDeleted(true);
break;
}
case MarkMessageCommand.MARK_AS_UNEXPUNGED: {
flags.setDeleted(false);
break;
}
case MarkMessageCommand.MARK_AS_ANSWERED: {
flags.setAnswered(true);
break;
}
case MarkMessageCommand.MARK_AS_UNANSWERED: {
flags.setAnswered(false);
break;
}
case MarkMessageCommand.MARK_AS_SPAM: {
header.getAttributes().put("columba.spam", Boolean.TRUE);
break;
}
case MarkMessageCommand.MARK_AS_NOTSPAM: {
header.getAttributes().put("columba.spam", Boolean.FALSE);
break;
}
case MarkMessageCommand.MARK_AS_DRAFT: {
flags.setDraft(true);
break;
}
case MarkMessageCommand.MARK_AS_NOTDRAFT: {
flags.setDraft(false);
break;
}
case MarkMessageCommand.MARK_AS_RECENT: {
flags.setRecent(true);
break;
}
case MarkMessageCommand.MARK_AS_NOTRECENT: {
flags.setRecent(false);
break;
}
}
setChanged(true);
header.setFlags(flags);
getHeaderList().update(uid, header);
fireMessageFlagChanged(uid, oldFlags, variant);
}
// in java/org/columba/mail/folder/AbstractMessageFolder.java
public void markMessage(Object[] uids, int variant) throws Exception {
for (int i = 0; i < uids.length; i++) {
if (exists(uids[i])) {
markMessage(uids[i], variant);
}
}
}
// in java/org/columba/mail/folder/AbstractMessageFolder.java
public void expungeFolder() throws Exception {
// get list of all uids
Object[] uids = getUids();
for (int i = 0; i < uids.length; i++) {
Object uid = uids[i];
if (uid == null) {
continue;
}
// if message with uid doesn't exist -> skip
if (!exists(uid)) {
LOG.info("uid " + uid + " doesn't exist");
continue;
}
if (getFlags(uid).getDeleted()) {
// move message to trash if marked as expunged
LOG.info("removing uid=" + uid);
// remove message
removeMessage(uid);
}
}
}
// in java/org/columba/mail/folder/AbstractMessageFolder.java
public void removeMessage(Object uid) throws Exception {
// remove from header-list
IColumbaHeader header = getHeaderList().remove(uid);
// notify listeners
fireMessageRemoved(uid, header.getFlags());
}
// in java/org/columba/mail/folder/AbstractMessageFolder.java
public boolean exists(Object uid) throws Exception {
return getHeaderList().exists(uid);
}
// in java/org/columba/mail/folder/AbstractMessageFolder.java
public Object[] getUids() throws Exception {
return getHeaderList().getUids();
}
// in java/org/columba/mail/folder/AbstractMessageFolder.java
public void setAttribute(Object uid, String key, Object value)
throws Exception {
IColumbaHeader header = getHeaderList().get(uid);
Flags flags = header.getFlags();
if (flags == null) {
return;
}
Flags oldFlags = (Flags) flags.clone();
header.getAttributes().put(key, value);
getHeaderList().update(uid, header);
// set folder changed flag
// -> if not, the header cache wouldn't notice that something
// -> has changed. And wouldn't save the changes.
setChanged(true);
fireMessageFlagChanged(uid, oldFlags, 0);
}
// in java/org/columba/mail/folder/AbstractMessageFolder.java
public Flags getFlags(Object uid) throws Exception {
return getHeaderList().get(uid).getFlags();
}
// in java/org/columba/mail/folder/AbstractMessageFolder.java
public Attributes getAttributes(Object uid) throws Exception {
return getHeaderList().get(uid).getAttributes();
}
// in java/org/columba/mail/folder/AbstractMessageFolder.java
public Object getAttribute(Object uid, String key) throws Exception {
return getHeaderList().get(uid).getAttributes().get(key);
}
// in java/org/columba/mail/folder/AbstractMessageFolder.java
public Object[] searchMessages(IFilter filter, Object[] uids)
throws Exception {
// if there is no search engine, try the default one
if (getSearchEngine() == null)
return (new DefaultSearchEngine(this)).searchMessages(filter, uids);
return getSearchEngine().searchMessages(filter, uids);
}
// in java/org/columba/mail/folder/AbstractMessageFolder.java
public Object[] searchMessages(IFilter filter) throws Exception {
// if there is no search engine, try the default one
if (getSearchEngine() == null)
return (new DefaultSearchEngine(this)).searchMessages(filter);
return getSearchEngine().searchMessages(filter);
}
// in java/org/columba/mail/folder/mailboximport/MHImporter.java
public void importMailboxFile(File directory,
IWorkerStatusController worker, IMailbox destFolder)
throws Exception {
File[] list = directory.listFiles(MHMessageFileFilter.getInstance());
for (int i = 0; i < list.length; i++) {
File file = list[i];
String name = file.getName();
if (name.equals(".") || name.equals("..")) {
continue;
}
if (name.startsWith(".")) {
continue;
}
if ((file.exists()) && (file.length() > 0)) {
importMessage(file, worker);
}
}
}
// in java/org/columba/mail/folder/mailboximport/MHImporter.java
protected void importMessage(File file, IWorkerStatusController worker)
throws Exception {
StringBuffer strbuf = new StringBuffer();
BufferedReader in = new BufferedReader(new FileReader(file));
String str;
strbuf = new StringBuffer();
while ((str = in.readLine()) != null) {
strbuf.append(str + "\n");
}
in.close();
saveMessage(strbuf.toString(), worker, getDestinationFolder());
}
// in java/org/columba/mail/folder/mailboximport/MozillaImporter.java
public void importMailboxFile(File file, IWorkerStatusController worker,
IMailbox destFolder) throws Exception {
int count = 0;
boolean sucess = false;
StringBuffer strbuf = new StringBuffer();
BufferedReader in = new BufferedReader(new FileReader(file));
String str;
// parse line by line
while ((str = in.readLine()) != null) {
// if user cancelled task exit immediately
if (worker.cancelled()) {
return;
}
// if line doesn't start with "From" or line length is 0
// -> save everything in StringBuffer
if (!str.startsWith("From ") || str.length() == 0) {
strbuf.append(str + "\n");
} else {
// line contains "-" (mozilla mbox style)
// -> import message in Columba
if (str.indexOf("-") != -1) {
if (strbuf.length() != 0) {
// found new message
saveMessage(strbuf.toString(), worker,
getDestinationFolder());
count++;
sucess = true;
}
strbuf = new StringBuffer();
} else {
strbuf.append(str + "\n");
}
}
}
// save last message, because while loop aborted before being able to
// save message
if (sucess && strbuf.length() > 0) {
saveMessage(strbuf.toString(), worker, getDestinationFolder());
}
in.close();
}
// in java/org/columba/mail/folder/mailboximport/EvolutionImporter.java
public void importMailboxFile(File file, IWorkerStatusController worker,
IMailbox destFolder) throws Exception {
int count = 0;
boolean sucess = false;
StringBuffer strbuf = new StringBuffer();
BufferedReader in = new BufferedReader(new FileReader(file));
String str;
// parse line by line
while ((str = in.readLine()) != null) {
// if user cancelled task exit immediately
if (worker.cancelled() == true) {
return;
}
// if line doesn't start with "From" or line length is 0
// -> save everything in StringBuffer
if ((str.startsWith("From ") == false) || (str.length() == 0)) {
strbuf.append(str + "\n");
} else {
// line contains "@" (evolution mbox style) or
// -> import message in Columba
if (str.indexOf("@") != -1) {
if (strbuf.length() != 0) {
// found new message
saveMessage(strbuf.toString(), worker,
getDestinationFolder());
count++;
sucess = true;
}
strbuf = new StringBuffer();
} else {
strbuf.append(str + "\n");
}
}
}
// save last message, because while loop aborted before being able to
// save message
if ((sucess == true) && (strbuf.length() > 0)) {
saveMessage(strbuf.toString(), worker, getDestinationFolder());
}
in.close();
}
// in java/org/columba/mail/folder/mailboximport/AbstractMailboxImporter.java
protected void saveMessage(String rawString, IWorkerStatusController worker,
IMailbox destFolder) throws Exception {
/*
* *20031231, karlpeder* Using InputStream instead of rawString
* directly. Ensures size is set correctly by addMessage (bug #843657)
*/
SourceInputStream in = new SourceInputStream(new CharSequenceSource(
rawString));
destFolder.addMessage(in);
in.close();
counter++;
//TODO (@author fdietz): i18n
worker.setDisplayText("Importing messages: " + getCount());
}
// in java/org/columba/mail/folder/mailboximport/PegasusMailImporter.java
public void importMailboxFile(File file, IWorkerStatusController worker,
IMailbox destFolder) throws Exception {
int count = 0;
boolean sucess = false;
StringBuffer strbuf = new StringBuffer();
BufferedReader in = new BufferedReader(new FileReader(file));
String str;
// parse line by line
while ((str = in.readLine()) != null) {
// if user cancelled task exit immediately
if (worker.cancelled() == true) {
return;
}
// if line doesn't start with "From ???@???" or line length is 0
// -> save everything in StringBuffer
if ((str.startsWith("From ???@???") == false) ||
(str.length() == 0)) {
strbuf.append(str + "\n");
} else {
if (strbuf.length() != 0) {
// found new message
saveMessage(strbuf.toString(), worker,
getDestinationFolder());
count++;
sucess = true;
}
strbuf = new StringBuffer();
}
}
// save last message, because while loop aborted before being able to
// save message
if ((sucess == true) && (strbuf.length() > 0)) {
saveMessage(strbuf.toString(), worker, getDestinationFolder());
}
in.close();
}
// in java/org/columba/mail/folder/mailboximport/MBOXImporter.java
public void importMailboxFile(File file, IWorkerStatusController worker,
IMailbox destFolder) throws Exception {
FileSource mboxSource = new FileSource(file);
MboxMessage[] messages = MboxParser.parseMbox(mboxSource);
mboxSource.close();
LOG.info("Found " + messages.length + " messages in MBOX file"); //$NON-NLS-1$ //$NON-NLS-2$
SteerableInputStream in = new SteerableInputStream(new FileInputStream(file));
worker.setProgressBarMaximum(messages.length);
for( int i=0; i<messages.length && !worker.cancelled(); i++) {
worker.setProgressBarValue(i);
in.setPosition(messages[i].getStart());
in.setLengthLeft(messages[i].getLength());
destFolder.addMessage(in);
// this is necessary to do!
counter++;
}
in.finalClose();
}
// in java/org/columba/mail/folder/outbox/OutboxFolder.java
public SendableMessage getSendableMessage(Object uid) throws Exception {
ColumbaMessage message = getMessage(uid);
SendableMessage sendableMessage = new SendableMessage(message);
return sendableMessage;
}
// in java/org/columba/mail/folder/outbox/OutboxFolder.java
public Object addMessage(InputStream in, Attributes attributes, Flags flags)
throws Exception {
Object uid = super.addMessage(in, attributes, flags);
setAttribute(uid, "columba.recipients", attributes
.get("columba.recipients"));
return uid;
}
// in java/org/columba/mail/folder/mbox/MboxDataStorage.java
public void removeMessage(Object uid) throws Exception {
MboxMessage message = (MboxMessage) messages.remove(uid);
if (uid.equals(largestUid)) {
FileChannel channel = new RandomAccessFile(mboxFile, "rw")
.getChannel();
channel
.truncate(mboxFile.length()
- (message.getLength() + FROMLINE.length() + TERMLINE.length));
channel.close();
} else {
int intUid = ((Integer) uid).intValue();
deleteFilePart(mboxFile, message.getStart() - FROMLINE.length(),
message.getLength() + FROMLINE.length() + TERMLINE.length);
// update message starts of following messages
Enumeration uids = messages.keys();
while (uids.hasMoreElements()) {
Integer actUid = (Integer) uids.nextElement();
if (actUid.intValue() > intUid) {
MboxMessage m = (MboxMessage) messages.get(actUid);
m
.setStart(m.getStart()
- (message.getLength() + FROMLINE.length() + TERMLINE.length));
}
}
}
}
// in java/org/columba/mail/folder/mbox/MboxDataStorage.java
public Source getMessageSource(Object uid) throws Exception {
if( ! exists(uid)) throw new FolderInconsistentException();
MboxMessage message = (MboxMessage) messages.get(uid);
FileInputStream in = new FileInputStream(mboxFile);
in.skip(message.getStart());
File tempFile = File.createTempFile("mbox_message", ".tmp");
tempFile.deleteOnExit();
FileOutputStream out = new FileOutputStream(tempFile);
StreamUtils.streamCopy(in, out, (int) message.getLength());
in.close();
out.close();
return new FileSource(tempFile);
}
// in java/org/columba/mail/folder/mbox/MboxDataStorage.java
public InputStream getMessageStream(Object uid) throws Exception {
MboxMessage message = (MboxMessage) messages.get(uid);
FileInputStream in = new FileInputStream(mboxFile);
in.skip(message.getStart());
File tempFile = File.createTempFile("mbox_message", ".tmp");
tempFile.deleteOnExit();
FileOutputStream out = new FileOutputStream(tempFile);
StreamUtils.streamCopy(in, out, (int) message.getLength());
in.close();
out.close();
return new FileInputStream(tempFile);
}
// in java/org/columba/mail/folder/mbox/MboxDataStorage.java
public void saveMessage(Object uid, InputStream source) throws Exception {
FileOutputStream out = new FileOutputStream(mboxFile, true);
out.write(FROMLINE.getBytes("US-ASCII"));
long pos = mboxFile.length();
long length = StreamUtils.streamCopy(source, out);
out.write(TERMLINE);
out.close();
messages.put(uid, new MboxMessage(uid, pos, length));
largestUid = uid;
}
// in java/org/columba/mail/folder/mbox/MboxDataStorage.java
public boolean exists(Object uid) throws Exception {
return messages.containsKey(uid);
}
// in java/org/columba/mail/folder/mbox/CachedMboxFolder.java
public void save() throws Exception {
super.save();
((MboxDataStorage)getDataStorageInstance()).save();
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public boolean exists(Object uid) throws Exception {
return headerList.exists(uid);
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public IHeaderList getHeaderList() throws Exception {
if (!active) {
activate();
} else {
revalidateSearch();
}
return headerList;
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public void addSearchToHistory() throws Exception {
VirtualFolder searchFolder = (VirtualFolder) FolderTreeModel
.getInstance().getFolder("106");
// only create new subfolders if we used the default "Search Folder"
if (!searchFolder.equals(this)) {
return;
}
// (tstich) reduced to 3 because all need to be
// search when activated on startup
// we only want 3 subfolders
// -> if more children exist remove them
if (searchFolder.getChildCount() >= 3) {
AbstractMessageFolder child = (AbstractMessageFolder) searchFolder
.getChildAt(0);
child.removeFolder();
}
// create new subfolder
String name = "search result";
VirtualFolder newFolder = null;
try {
newFolder = (VirtualFolder) FolderFactory.getInstance()
.createChild(searchFolder, name, "VirtualFolder");
} catch (Exception ex) {
ex.printStackTrace();
return;
}
// if creation failed
if (newFolder == null) {
return;
}
// copy all properties to the subfolder
int uid = getConfiguration().getInteger("property", "source_uid");
boolean includes = getConfiguration().getBoolean("property",
"include_subfolders");
IFolderItem newFolderItem = newFolder.getConfiguration();
newFolderItem.setInteger("property", "source_uid", uid);
newFolderItem.setBoolean("property", "include_subfolders", includes);
newFolderItem.getElement("filter").removeFromParent();
newFolderItem.getRoot().addElement(
(XmlElement) getConfiguration().getElement("filter").clone());
MailFilterCriteria newc = new MailFilterCriteria(new Filter(
getConfiguration().getElement("filter")).getFilterRule().get(0));
/*
* FilterCriteria c = new
* Filter(getConfiguration().getElement("filter")) .getFilterRule()
* .get( 0);
*
* FilterCriteria newc = new
* Filter(getConfiguration().getElement("filter")) .getFilterRule()
* .get( 0); newc.setCriteria(c.getCriteriaString());
* newc.setHeaderItem(c.getHeaderItemString());
* newc.setPattern(c.getPattern()); newc.setType(c.getType());
*/
// lets find a good name for our new vfolder
StringBuffer buf = new StringBuffer();
if (newc.getTypeString().equalsIgnoreCase("flags")) {
LOG.info("flags found"); //$NON-NLS-1$
buf.append(newc.getTypeString());
buf.append(" (");
buf.append(newc.getCriteriaString());
buf.append(" ");
buf.append(newc.getPatternString());
buf.append(")");
} else if (newc.getTypeString().equalsIgnoreCase("custom headerfield")) {
buf.append(newc.getHeaderfieldString());
buf.append(" (");
buf.append(newc.getCriteriaString());
buf.append(" ");
buf.append(newc.getPatternString());
buf.append(")");
} else {
buf.append(newc.getTypeString());
buf.append(" (");
buf.append(newc.getCriteriaString());
buf.append(" ");
buf.append(newc.getPatternString());
buf.append(")");
}
newFolder.setName(buf.toString());
// update tree-view
FolderTreeModel.getInstance().nodeStructureChanged(searchFolder);
// update tree-node (for renaming the new folder)
FolderTreeModel.getInstance().nodeChanged(newFolder);
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
protected void applySearch() throws Exception {
IMailFolder srcFolder = getSourceFolder();
XmlElement filter = getConfiguration().getRoot().getElement("filter");
if (filter == null) {
filter = new XmlElement("filter");
filter.addAttribute("description", "new filter");
filter.addAttribute("enabled", "true");
XmlElement rules = new XmlElement("rules");
rules.addAttribute("condition", "match_all");
XmlElement criteria = new XmlElement("criteria");
criteria.addAttribute("type", "Subject");
criteria.addAttribute("headerfield", "Subject");
criteria.addAttribute("criteria", "contains");
criteria.addAttribute("pattern", "pattern");
rules.addElement(criteria);
filter.addElement(rules);
getConfiguration().getRoot().addElement(filter);
}
Filter f = new Filter(getConfiguration().getRoot().getElement("filter"));
applySearch(srcFolder, f);
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
protected void applySearch(IMailFolder parent, Filter filter)
throws Exception {
if (parent instanceof IMailbox) {
IMailbox folder = (IMailbox) parent;
// if the parent is a virtual folder the search cannot be applied directly
// look for the correct uids by finding the first non virtual folder
Object[] resultUids = null;
if (folder instanceof VirtualFolder)
resultUids = folder.searchMessages(filter, folder.getUids());
else
resultUids = folder.searchMessages(filter);
if (resultUids != null) {
for (int i = 0; i < resultUids.length; i++) {
addFilteredMessage(resultUids[i], folder);
}
}
}
if (isRecursive()) {
for (Enumeration e = parent.children(); e.hasMoreElements();) {
IMailFolder folder = (IMailFolder) e.nextElement();
if (folder instanceof VirtualFolder) {
continue;
}
applySearch(folder, filter);
}
}
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
private void addFilteredMessage(Object resultUid, IMailbox folder) throws Exception {
String[] headerfields = CachedHeaderfields.getDefaultHeaderfields();
ColumbaHeader header = null;
if (folder instanceof VirtualFolder) {
// get source folder reference
VirtualHeader virtualHeader = ((VirtualFolder) folder)
.getVirtualHeader(resultUid);
IMailbox sourceFolder = virtualHeader.getSrcFolder();
Object sourceUid = virtualHeader.getSrcUid();
Header h = sourceFolder.getHeaderFields(sourceUid,
headerfields);
header = new ColumbaHeader(h);
header.setAttributes(sourceFolder
.getAttributes(sourceUid));
header.setFlags(sourceFolder.getFlags(sourceUid));
Object uid = add((ColumbaHeader) header, sourceFolder,
sourceUid);
fireMessageAdded(uid, getFlags(uid));
} else {
if (!folder.exists(resultUid))
return;
Header h = folder.getHeaderFields(resultUid,
headerfields);
header = new ColumbaHeader(h);
header.setAttributes(folder
.getAttributes(resultUid));
header.setFlags(folder.getFlags(resultUid));
Object uid = add(header, folder, resultUid);
fireMessageAdded(uid, getFlags(uid));
}
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public Object add(ColumbaHeader header, IMailbox source, Object uid)
throws Exception {
Object newUid = generateNextUid();
// VirtualMessage m = new VirtualMessage(f, uid, index);
VirtualHeader virtualHeader = new VirtualHeader((ColumbaHeader) header,
source, uid);
virtualHeader.setVirtualUid(newUid);
headerList.add(virtualHeader, newUid);
return newUid;
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public void markMessage(Object[] uids, int variant) throws Exception {
List list = new ArrayList();
// Check if all uids are still exisiting
for (Object uid : uids) {
if (exists(uid)) {
list.add(uid);
}
}
if (list.size() == 0)
return;
Collections.sort(list, new Comparator() {
public int compare(Object o1, Object o2) {
VirtualHeader h = (VirtualHeader) headerList.get(o1);
String oV1 = h.getSrcFolder().getId();
h = (VirtualHeader) headerList.get(o2);
String oV2 = h.getSrcFolder().getId();
return oV1.compareTo(oV2);
}
});
List folderUids = new ArrayList(uids.length);
Iterator it = list.iterator();
VirtualHeader h = (VirtualHeader) headerList.get(it.next());
;
folderUids.add(h.getSrcUid());
IMailbox srcFolder = h.getSrcFolder();
while (it.hasNext()) {
h = (VirtualHeader) headerList.get(it.next());
if (h.getSrcFolder() == srcFolder) {
folderUids.add(h.getSrcUid());
} else {
srcFolder.markMessage(folderUids.toArray(), variant);
// change to new folder
srcFolder = h.getSrcFolder();
folderUids.clear();
folderUids.add(h.getSrcUid());
}
}
srcFolder.markMessage(folderUids.toArray(), variant);
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public void removeMessage(Object uid) throws Exception {
// get source folder reference
VirtualHeader h = (VirtualHeader) headerList.get(uid);
IMailbox sourceFolder = h.getSrcFolder();
Object sourceUid = h.getSrcUid();
// remove from source folder
sourceFolder.removeMessage(sourceUid);
// remove from virtual folder
headerList.remove(uid);
// notify listeners
fireMessageRemoved(uid, getFlags(uid));
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public MimeTree getMimePartTree(Object uid) throws Exception {
if (!exists(uid))
return null;
VirtualHeader h = (VirtualHeader) headerList.get(uid);
IMailbox sourceFolder = h.getSrcFolder();
Object sourceUid = h.getSrcUid();
return sourceFolder.getMimePartTree(sourceUid);
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public Object[] searchMessages(Filter filter, Object[] uids)
throws Exception {
if (!active) {
activate();
} else {
revalidateSearch();
}
if (uids.length == 0)
return new Object[0];
List list = new ArrayList(Arrays.asList(uids));
Collections.sort(list, new Comparator() {
public int compare(Object o1, Object o2) {
VirtualHeader h = (VirtualHeader) headerList.get(o1);
String oV1 = h.getSrcFolder().getId();
h = (VirtualHeader) headerList.get(o2);
String oV2 = h.getSrcFolder().getId();
return oV1.compareTo(oV2);
}
});
List resultList = new ArrayList();
List virtualHeader = new ArrayList();
VirtualHeader h = (VirtualHeader) headerList.get(list.get(0));
IMailbox sourceFolder = h.getSrcFolder();
virtualHeader.add(h);
for (int i = 1; i < uids.length; i++) {
h = (VirtualHeader) headerList.get(list.get(i));
if (h.getSrcFolder() != sourceFolder || i == uids.length - 1) {
// Now we can search this folder since no mail from
// this folder will come in the list
Object[] srcUids = new Object[virtualHeader.size()];
// Create a src uid array
for (int j = 0; j < virtualHeader.size(); j++) {
srcUids[j] = ((VirtualHeader) virtualHeader.get(j))
.getSrcUid();
}
// search the src folder with the src uid array
Object[] resultUids = sourceFolder.searchMessages(filter,
srcUids);
// Convert the src uids back to virtual uids
if ((resultUids != null) && (resultUids.length > 0)) {
Object[] virtualUids = new Object[resultUids.length];
for (int j = 0; j < resultUids.length; j++) {
virtualUids[j] = srcUidToVirtualUid(sourceFolder,
resultUids[j]);
}
// Add all found virtual uids to the result
resultList.addAll(Arrays.asList(virtualUids));
}
virtualHeader.clear();
}
// Add this header to the list for later searching
virtualHeader.add(h);
sourceFolder = h.getSrcFolder();
}
if (virtualHeader.size() > 0) {
// Now we can search this folder since no mail from
// this folder will come in the list
Object[] srcUids = new Object[virtualHeader.size()];
// Create a src uid array
for (int j = 0; j < virtualHeader.size(); j++) {
srcUids[j] = ((VirtualHeader) virtualHeader.get(j)).getSrcUid();
}
// search the src folder with the src uid array
Object[] resultUids = sourceFolder.searchMessages(filter, srcUids);
// Convert the src uids back to virtual uids
if ((resultUids != null) && (resultUids.length > 0)) {
Object[] virtualUids = new Object[resultUids.length];
for (int j = 0; j < resultUids.length; j++) {
virtualUids[j] = srcUidToVirtualUid(sourceFolder,
resultUids[j]);
}
// Add all found virtual uids to the result
resultList.addAll(Arrays.asList(virtualUids));
}
virtualHeader.clear();
}
return resultList.toArray();
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public Object[] searchMessages(Filter filter) throws Exception {
return searchMessages(filter, getUids());
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public Object[] getUids() throws Exception {
if (!active) {
activate();
}
return headerList.getUids();
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public Object addMessage(InputStream in) throws Exception {
// not supported
return null;
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public Object getAttribute(Object uid, String key) throws Exception {
VirtualHeader h = (VirtualHeader) headerList.get(uid);
IMailbox sourceFolder = h.getSrcFolder();
Object sourceUid = h.getSrcUid();
return sourceFolder.getAttribute(sourceUid, key);
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public Flags getFlags(Object uid) throws Exception {
VirtualHeader h = (VirtualHeader) headerList.get(uid);
IMailbox sourceFolder = h.getSrcFolder();
Object sourceUid = h.getSrcUid();
return sourceFolder.getFlags(sourceUid);
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public Header getHeaderFields(Object uid, String[] keys) throws Exception {
VirtualHeader h = (VirtualHeader) headerList.get(uid);
IMailbox sourceFolder = h.getSrcFolder();
Object sourceUid = h.getSrcUid();
return sourceFolder.getHeaderFields(sourceUid, keys);
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public InputStream getMessageSourceStream(Object uid) throws Exception {
VirtualHeader h = (VirtualHeader) headerList.get(uid);
IMailbox sourceFolder = h.getSrcFolder();
Object sourceUid = h.getSrcUid();
return sourceFolder.getMessageSourceStream(sourceUid);
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public InputStream getMimePartBodyStream(Object uid, Integer[] address)
throws Exception {
VirtualHeader h = (VirtualHeader) headerList.get(uid);
IMailbox sourceFolder = h.getSrcFolder();
Object sourceUid = h.getSrcUid();
return sourceFolder.getMimePartBodyStream(sourceUid, address);
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public InputStream getMimePartSourceStream(Object uid, Integer[] address)
throws Exception {
VirtualHeader h = (VirtualHeader) headerList.get(uid);
IMailbox sourceFolder = h.getSrcFolder();
Object sourceUid = h.getSrcUid();
return sourceFolder.getMimePartSourceStream(sourceUid, address);
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public void innerCopy(IMailbox destFolder, Object[] uids) throws Exception {
List list = new ArrayList();
// Check if all uids are still exisiting
for (Object uid : uids) {
if (exists(uid)) {
list.add(uid);
}
}
if (list.size() == 0)
return;
Collections.sort(list, new Comparator() {
public int compare(Object o1, Object o2) {
VirtualHeader h = (VirtualHeader) headerList.get(o1);
String oV1 = h.getSrcFolder().getId();
h = (VirtualHeader) headerList.get(o2);
String oV2 = h.getSrcFolder().getId();
return oV1.compareTo(oV2);
}
});
List folderUids = new ArrayList(uids.length);
Iterator it = list.iterator();
VirtualHeader h = (VirtualHeader) headerList.get(it.next());
;
folderUids.add(h.getSrcUid());
IMailbox srcFolder = h.getSrcFolder();
while (it.hasNext()) {
h = (VirtualHeader) headerList.get(it.next());
if (h.getSrcFolder() == srcFolder) {
folderUids.add(h.getSrcUid());
} else {
srcFolder.innerCopy(destFolder, folderUids.toArray());
// change to new folder
srcFolder = h.getSrcFolder();
folderUids.clear();
folderUids.add(h.getSrcUid());
}
}
// Copy the rest
srcFolder.innerCopy(destFolder, folderUids.toArray());
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public void setAttribute(Object uid, String key, Object value)
throws Exception {
// get header with UID
/*
* ColumbaHeader header = (ColumbaHeader) headerList.get(uid);
* header.getAttributes().put(key, value);
*/
VirtualHeader h = (VirtualHeader) headerList.get(uid);
h.getAttributes().put(key, value);
IMailbox sourceFolder = h.getSrcFolder();
Object sourceUid = h.getSrcUid();
sourceFolder.setAttribute(sourceUid, key, value);
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public Attributes getAttributes(Object uid) throws Exception {
VirtualHeader h = (VirtualHeader) headerList.get(uid);
IMailbox sourceFolder = h.getSrcFolder();
Object sourceUid = h.getSrcUid();
return sourceFolder.getAttributes(sourceUid);
/*
* if (getHeaderList().containsKey(uid)) { return
* getHeaderList().get(uid).getAttributes(); } else { return null; }
*/
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public Object addMessage(InputStream in, Attributes attributes, Flags flags)
throws Exception {
// not supported
return null;
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public Header getAllHeaderFields(Object uid) throws Exception {
VirtualHeader h = (VirtualHeader) headerList.get(uid);
IMailbox sourceFolder = h.getSrcFolder();
Object sourceUid = h.getSrcUid();
return sourceFolder.getAllHeaderFields(sourceUid);
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public void expungeFolder() throws Exception {
IMailFolder srcFolder = getSourceFolder();
boolean isInclude = Boolean.valueOf(
getConfiguration().getString("property", "include_subfolders"))
.booleanValue();
if (isInclude) {
recursiveExpunge(srcFolder);
} else {
if (srcFolder instanceof IMailbox)
((IMailbox) srcFolder).expungeFolder();
}
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
private void recursiveExpunge(IMailFolder srcFolder) throws Exception {
IMailFolder folder;
if (srcFolder instanceof IMailbox)
((IMailbox) srcFolder).expungeFolder();
for (Enumeration e = srcFolder.children(); e.hasMoreElements();) {
folder = (IMailFolder) e.nextElement();
if (folder instanceof VirtualFolder) {
continue;
}
recursiveExpunge(folder);
}
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public void activate() throws Exception {
if (active)
return;
LOG.fine("Activating virtual folder " + getName());
getMessageFolderInfo().reset();
applySearch();
registerWithSource();
active = true;
}
// in java/org/columba/mail/folder/virtual/VirtualFolder.java
public void removeFolder() throws Exception {
if (active) {
deactivate();
}
super.removeFolder();
}
// in java/org/columba/mail/folder/virtual/ActivateVirtualFolderCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
VirtualFolder vFolder = (VirtualFolder) ((IFolderCommandReference) getReference())
.getSourceFolder();
worker.setDisplayText(MessageFormat.format(MailResourceLoader
.getString("statusbar", "message", "activate_vfolder"),
new Object[] { vFolder.getName() }));
vFolder.activate();
}
// in java/org/columba/mail/folder/search/IMAPQueryEngine.java
public void sync() throws Exception {
// method is not needed by IMAP
}
// in java/org/columba/mail/folder/search/IMAPQueryEngine.java
public List queryEngine(IFilterRule filter) throws Exception {
// pass the work to IMAPStore
return folder.getServer().search(filter, folder);
}
// in java/org/columba/mail/folder/search/IMAPQueryEngine.java
public List queryEngine(IFilterRule filter, Object[] uids)
throws Exception {
// pass the work to IMAPStore
return folder.getServer().search(uids, filter, folder);
}
// in java/org/columba/mail/folder/search/IMAPQueryEngine.java
public void messageAdded(Object uid) throws Exception {
// method is not needed by IMAP
}
// in java/org/columba/mail/folder/search/IMAPQueryEngine.java
public void messageRemoved(Object uid) throws Exception {
// method is not needed by IMAP
}
// in java/org/columba/mail/folder/search/IMAPQueryEngine.java
public void reset() throws Exception {
// method is not needed by IMAP
}
// in java/org/columba/mail/folder/search/DummyQueryEngine.java
public void sync() throws Exception {
}
// in java/org/columba/mail/folder/search/DummyQueryEngine.java
public List queryEngine(IFilterRule filter) throws Exception {
return null;
}
// in java/org/columba/mail/folder/search/DummyQueryEngine.java
public List queryEngine(IFilterRule filter, Object[] uids)
throws Exception {
return null;
}
// in java/org/columba/mail/folder/search/DummyQueryEngine.java
public void messageAdded(Object uid) throws Exception {
}
// in java/org/columba/mail/folder/search/DummyQueryEngine.java
public void messageRemoved(Object uid) throws Exception {
}
// in java/org/columba/mail/folder/search/DummyQueryEngine.java
public void reset() throws Exception {
}
// in java/org/columba/mail/folder/search/DefaultSearchEngine.java
protected boolean processRule(Object uid, IFilterCriteria criteria,
String type) throws Exception {
if (type == null) {
JOptionPane.showMessageDialog(null,
"Filter type couldn't been found", "Error occured",
JOptionPane.ERROR_MESSAGE);
return false;
}
AbstractFilter instance = getFilter(criteria, type);
if (instance == null) {
return false;
}
return instance.process(folder, uid);
}
// in java/org/columba/mail/folder/search/DefaultSearchEngine.java
protected List processCriteria(IFilterRule rule, List uids) throws Exception {
LinkedList result = new LinkedList();
boolean b;
int match = rule.getConditionInt();
ListIterator it = uids.listIterator();
Object uid;
// MATCH_ALL
if (match == FilterRule.MATCH_ALL) {
while (it.hasNext()) {
b = true;
uid = it.next();
for (int i = 0; (i < rule.count()) && b; i++) {
IFilterCriteria criteria = rule.get(i);
String type = criteria.getTypeString();
b &= processRule(uid, criteria, type);
}
if (b) {
result.add(uid);
}
}
}
// in java/org/columba/mail/folder/search/DefaultSearchEngine.java
public Object[] searchMessages(IFilter filter, Object[] uids)
throws Exception {
if (!filter.getEnabled()) {
// filter is disabled
return new Object[] {};
}
List notDefaultEngineResult = null;
List defaultEngineResult = new LinkedList();
IFilterRule filterRule = filter.getFilterRule();
IFilterRule notDefaultEngine = new FilterRule();
IFilterRule defaultEngine = new FilterRule();
divideFilterRule(filterRule, notDefaultEngine, defaultEngine);
if (defaultEngine.count() > 0) {
try {
if (uids != null) {
defaultEngineResult = getNonDefaultEngine().queryEngine(
defaultEngine, uids);
} else {
defaultEngineResult = getNonDefaultEngine().queryEngine(
defaultEngine);
}
} catch (Exception e) {
e.printStackTrace();
LOG.warning("NonDefaultSearch engine "+ nonDefaultEngine.toString()+"reported an error: falling back to default search:\n"+e.getMessage());
defaultEngine = new FilterRule();
notDefaultEngine = filter.getFilterRule();
}
}
if (notDefaultEngine.count() == 0) {
notDefaultEngineResult = defaultEngineResult;
} else {
// MATCH_ALL
if (filterRule.getConditionInt() == FilterRule.MATCH_ALL) {
if (defaultEngine.count() > 0) {
notDefaultEngineResult = processCriteria(notDefaultEngine,
defaultEngineResult);
} else {
if (uids != null) {
notDefaultEngineResult = processCriteria(
notDefaultEngine, Arrays.asList(uids));
} else {
notDefaultEngineResult = processCriteria(
notDefaultEngine, Arrays.asList(folder
.getUids()));
}
}
}
// MATCH_ANY
else {
if (uids != null) {
List uidList = new LinkedList(Arrays.asList(uids));
ListTools.substract(uidList, defaultEngineResult);
notDefaultEngineResult = processCriteria(notDefaultEngine,
uidList);
notDefaultEngineResult.addAll(defaultEngineResult);
} else {
notDefaultEngineResult = processCriteria(notDefaultEngine,
Arrays.asList(folder.getUids()));
}
}
}
/*
* worker.setDisplayText( "Search Result: " +
* notDefaultEngineResult.size() + " messages found in " +
* (System.currentTimeMillis() - startTime) + " ms");
*/
return notDefaultEngineResult.toArray();
}
// in java/org/columba/mail/folder/search/DefaultSearchEngine.java
public Object[] searchMessages(IFilter filter) throws Exception {
if (getObservable() != null) {
getObservable().setMessage(
MailResourceLoader.getString("statusbar", "message",
"search"));
}
// return searchMessages(filter, null);
Object[] result = searchMessages(filter, null);
if (getObservable() != null) {
// clear status bar message now we are done (with a delay)
getObservable().clearMessageWithDelay();
}
return result;
}
// in java/org/columba/mail/folder/search/DefaultSearchEngine.java
protected List queryEngine(IFilterRule filter, Object[] uids)
throws Exception {
return processCriteria(filter, Arrays.asList(uids));
}
// in java/org/columba/mail/folder/search/DefaultSearchEngine.java
protected List queryEngine(IFilterRule filter) throws Exception {
Object[] uids = folder.getUids();
return processCriteria(filter, Arrays.asList(uids));
}
// in java/org/columba/mail/folder/search/DefaultSearchEngine.java
public void sync() throws Exception {
getNonDefaultEngine().sync();
}
// in java/org/columba/mail/folder/search/LuceneQueryEngine.java
public List queryEngine(IFilterRule filter) throws Exception {
Query query = getLuceneQuery(filter, analyzer);
List result = search(query);
ListTools.substract(result, deleted);
if (!checkResult(result)) {
// Search again
result = search(query);
ListTools.substract(result, deleted);
}
return result;
}
// in java/org/columba/mail/folder/search/LuceneQueryEngine.java
public List queryEngine(IFilterRule filter, Object[] uids) throws Exception {
List result = queryEngine(filter);
ListTools.intersect(result, Arrays.asList(uids));
return result;
}
// in java/org/columba/mail/folder/search/LuceneQueryEngine.java
public void messageAdded(Object uid) throws Exception {
Document messageDoc = getDocument(uid);
IndexWriter writer = new IndexWriter(ramIndexDir, analyzer, false);
writer.addDocument(messageDoc);
writer.close();
incOperationCounter();
}
// in java/org/columba/mail/folder/search/LuceneQueryEngine.java
public void messageRemoved(Object uid) throws Exception {
deleted.add(uid);
/*
* try { indexLock.tryToGetLock(null); getReader().delete(new
* Term("uid", uid.toString())); indexLock.release(); } catch
* (IOException e) { JOptionPane.showMessageDialog( null,
* e.getMessage(), "Error while removing Message from Lucene Index",
* JOptionPane.ERROR_MESSAGE); }
*/
}
// in java/org/columba/mail/folder/search/LuceneQueryEngine.java
public void reset() throws Exception {
createIndex();
}
// in java/org/columba/mail/folder/search/LuceneQueryEngine.java
public void sync() throws Exception {
LOG.severe("Lucene Index inconsistent - recreation forced");
IHeaderList hl = folder.getHeaderList();
if (getObservable() != null) {
getObservable().setMessage(
MailResourceLoader.getString("statusbar", "message",
"lucene_sync"));
}
getObservable().setCurrent(0);
try {
createIndex();
IndexWriter writer = new IndexWriter(luceneIndexDir, analyzer,
false);
int count = hl.count();
getObservable().setCurrent(count);
Object uid;
int i = 0;
ICloseableIterator it;
for (it = hl.keyIterator(); it.hasNext();) {
uid = it.next();
writer.addDocument(getDocument(uid));
getObservable().setCurrent(i);
}
it.close();
getObservable().setCurrent(count);
writer.optimize();
writer.close();
} catch (Exception e) {
LOG.severe("Creation of Lucene Index failed :"
+ e.getLocalizedMessage());
// show neat error dialog here
}
}
// in java/org/columba/mail/folder/mh/MHDataStorage.java
public boolean exists(Object uid) throws Exception {
File file = new File(folder.getDirectoryFile() + File.separator
+ ((Integer) uid).toString());
return file.exists();
}
// in java/org/columba/mail/folder/mh/MHDataStorage.java
public void removeMessage(Object uid) throws Exception {
File file = new File(folder.getDirectoryFile() + File.separator
+ ((Integer) uid).toString());
//delete the file containing the message in the file system
if (!file.delete()) {
// Could not delete the file - possibly someone has a lock on it
LOG.warning("Could not delete " + file.getAbsolutePath()
+ ". Will try to delete it on exit");
// ... delete it when Columba exists instead
file.deleteOnExit();
} else {
LOG.info(file.getAbsolutePath() + " deleted successfully");
}
}
// in java/org/columba/mail/folder/mh/MHDataStorage.java
public Source getMessageSource(Object uid) throws Exception {
File file = new File(folder.getDirectoryFile() + File.separator + ((Integer) uid).toString());
try {
return new FileSource(file);
} catch (IOException e) {
throw new FolderInconsistentException();
}
}
// in java/org/columba/mail/folder/mh/MHDataStorage.java
public InputStream getMessageStream(Object uid) throws Exception {
return new FileInputStream( new File(folder.getDirectoryFile() + File.separator + ((Integer) uid).toString()));
}
// in java/org/columba/mail/folder/command/CreateVFolderOnMessageCommand.java
public void updateGUI() throws Exception {
FolderTreeModel.getInstance().nodeStructureChanged(parentFolder);
if (vfolder != null) {
//vfolder.showFilterDialog((AbstractMailFrameController) getFrameMediator());
new ConfigFrame(mediator, vfolder);
}
}
// in java/org/columba/mail/folder/command/CreateVFolderOnMessageCommand.java
public void execute(IWorkerStatusController worker)
throws Exception {
// get references to selected folder and message
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
Object[] uids = r.getUids(); // uid for messages to save
if (uids.length == 0) {
LOG.fine(
"No virtual folder created since no message was selected");
return; // no message selected.
}
Object uid = uids[0];
parentFolder = (IMailbox) r.getSourceFolder();
//register for status events
((StatusObservableImpl) parentFolder.getObservable()).setWorker(worker);
// get value of Subject, From or To header
Header header = parentFolder.getHeaderFields(uid,
new String[] {"Subject", "From", "To"});
String headerValue = (String) header.get(vfolderType);
if (headerValue == null) {
LOG.warning("Error getting " + vfolderType
+ " header. No virtual folder created");
return;
}
// create virtual folder (is attached to parentFolder)
String name = vfolderType + " contains [" + headerValue + "]";
vfolder = createVirtualFolder(name, vfolderType, headerValue,
parentFolder);
}
// in java/org/columba/mail/folder/command/ExpungeFolderCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// get source references
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
IMailbox srcFolder = (IMailbox) r.getSourceFolder();
// register for status events
((StatusObservableImpl) srcFolder.getObservable()).setWorker(worker);
// update status message
worker.setDisplayText("Expunging " + srcFolder.getName() + "..");
// expunge folder
srcFolder.expungeFolder();
}
// in java/org/columba/mail/folder/command/AddMessageCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// get reference
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
// get source folder
folder = (IMailbox) r.getSourceFolder();
// register for status events
((StatusObservableImpl) folder.getObservable()).setWorker(worker);
// add message to folder
folder.addMessage(is);
is.close();
}
// in java/org/columba/mail/folder/command/ExportFolderCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// get references
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
OutputStream os = null;
try {
// create output stream
os = new BufferedOutputStream(new FileOutputStream(r.getDestFile()));
int counter = 0;
IMailbox srcFolder;
Object[] uids;
InputStream in;
int read;
byte[] buffer = new byte[1024];
// get source folder
srcFolder = (IMailbox) r.getSourceFolder();
// get array of message UIDs
uids = srcFolder.getUids();
// initialize progressbar with total number of messages
worker.setProgressBarMaximum(uids.length);
worker.setProgressBarValue(0);
// for each message in folder i
for (int j = 0; (j < uids.length) && !worker.cancelled(); j++) {
// get message source from folder
in = new BufferedInputStream(srcFolder
.getMessageSourceStream(uids[j]));
// prepend From line
os.write(new String("From \r\n").getBytes());
// write message source to file
while ((read = in.read(buffer, 0, buffer.length)) > 0) {
os.write(buffer, 0, read);
}
try {
in.close();
} catch (IOException ioe_) {
}
// append newline
os.write(new String("\r\n").getBytes());
os.flush();
worker.setProgressBarValue(j);
counter++;
}
// update status message
if (worker.cancelled()) {
worker.setDisplayText(MailResourceLoader.getString("statusbar",
"message", "export_messages_cancelled"));
} else {
worker.setDisplayText(MessageFormat.format(MailResourceLoader
.getString("statusbar", "message",
"export_messages_success"),
new Object[] { Integer.toString(counter) }));
}
}
// in java/org/columba/mail/folder/command/CreateFilterOnMessageCommand.java
public void updateGUI() throws Exception {
if ((filter != null) && (srcFolder != null)) {
FilterDialog dialog = new FilterDialog(mediator, filter);
if (!dialog.wasCancelled()) {
srcFolder.getFilterList().add(filter);
}
}
}
// in java/org/columba/mail/folder/command/CreateFilterOnMessageCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// get references to selected folder and message
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
Object[] uids = r.getUids(); // uid for messages to save
if (uids.length == 0) {
LOG.fine("No filter created since no message was selected");
return; // no message selected.
}
Object uid = uids[0];
srcFolder = (IMailbox) r.getSourceFolder();
// register for status events
((StatusObservableImpl) srcFolder.getObservable()).setWorker(worker);
// get value of Subject, From or To header
Header header = srcFolder.getHeaderFields(uid, new String[] {
"Subject", "From", "To" });
String headerValue = (String) header.get(filterType);
if (headerValue == null) {
LOG.warning("Error getting " + filterType
+ " header. No filter created");
return;
}
// create filter
String descr = filterType + " contains [" + headerValue + "]";
filter = createFilter(descr, filterType, headerValue);
}
// in java/org/columba/mail/folder/command/ApplyFilterCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// get references
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
// get source folder
IMailbox srcFolder = (IMailbox) r.getSourceFolder();
// register for status events
((StatusObservableImpl) srcFolder.getObservable()).setWorker(worker);
// display status message
worker.setDisplayText("Applying filter to " + srcFolder.getName()
+ "...");
// get filter list from folder
IFilterList list = srcFolder.getFilterList();
if (list == null) {
return;
}
// initialize progressbar
worker.setProgressBarMaximum(list.count());
// for each filter
for (int i = 0; i < list.count(); i++) {
// update progressbar
worker.setProgressBarValue(i);
// get filter
IFilter filter = list.get(i);
// skip, if filter is disabled
if ( filter.getEnabled() == false) continue;
// search all messages which match this filter
Object[] result = srcFolder.searchMessages(filter);
if (result == null) {
continue;
}
// if we have a result
if (result.length != 0) {
// create a Command for every action of this filter
// -> create a compound object which encapsulates all commands
CompoundCommand command = new FilterCompoundCommand(filter, srcFolder, result);
// add command to scheduler
//MainInterface.processor.addOp(command);
command.execute(worker);
}
}
}
// in java/org/columba/mail/folder/command/ToggleMarkCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
this.worker = worker;
/*
* // use wrapper class for easier handling of references array adapter =
* new FolderCommandAdapter( (MailFolderCommandReference[])
* getReferences());
* // get array of source references MailFolderCommandReference[] r =
* adapter.getSourceFolderReferences();
*/
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
// get array of message UIDs
Object[] uids = r.getUids();
// get source folder
IMailbox srcFolder = (IMailbox) r.getSourceFolder();
// register for status events
((StatusObservableImpl) srcFolder.getObservable()).setWorker(worker);
// which kind of mark?
int markVariant = r.getMarkVariant();
// create one list containing the marked items, which have to be "unmarked"
// and another list containing the items remained to be marked
List<Object> list1 = new ArrayList<Object>();
List<Object> list2 = new ArrayList<Object>();
for (int j = 0; j < uids.length; j++) {
Flags flags = srcFolder.getFlags(uids[j]);
boolean result = false;
if (markVariant == MarkMessageCommand.MARK_AS_READ) {
if (flags.getSeen())
result = true;
} else if (markVariant == MarkMessageCommand.MARK_AS_FLAGGED) {
if (flags.getFlagged())
result = true;
} else if (markVariant == MarkMessageCommand.MARK_AS_EXPUNGED) {
if (flags.getDeleted())
result = true;
} else if (markVariant == MarkMessageCommand.MARK_AS_ANSWERED) {
if (flags.getAnswered())
result = true;
} else if (markVariant == MarkMessageCommand.MARK_AS_DRAFT) {
if (flags.getDraft())
result = true;
} else if (markVariant == MarkMessageCommand.MARK_AS_SPAM) {
boolean spam = ((Boolean) srcFolder.getAttribute(uids[j],
"columba.spam")).booleanValue();
if (spam)
result = true;
}
if (result)
list1.add(uids[j]);
else
list2.add(uids[j]);
}
MailFolderCommandReference ref = null;
// un-mark messages
if (list1.size() > 0) {
ref = new MailFolderCommandReference(srcFolder, list1.toArray());
ref.setMarkVariant(-markVariant);
MarkMessageCommand c = new MarkMessageCommand(ref);
commandList.add(c);
c.execute(worker);
// train bayesian filter
if ((markVariant == MarkMessageCommand.MARK_AS_SPAM)
|| (markVariant == MarkMessageCommand.MARK_AS_NOTSPAM)) {
processSpamFilter(uids, srcFolder, -markVariant);
}
}
// mark messages
if (list2.size() > 0) {
ref = new MailFolderCommandReference(srcFolder, list2.toArray());
ref.setMarkVariant(markVariant);
MarkMessageCommand c = new MarkMessageCommand(ref);
commandList.add(c);
c.execute(worker);
// train bayesian filter
if ((markVariant == MarkMessageCommand.MARK_AS_SPAM)
|| (markVariant == MarkMessageCommand.MARK_AS_NOTSPAM)) {
processSpamFilter(uids, srcFolder, markVariant);
}
}
}
// in java/org/columba/mail/folder/command/ToggleMarkCommand.java
private void processSpamFilter(Object[] uids, IMailbox srcFolder,
int markVariant) throws Exception {
// update status message
worker.setDisplayText("Training messages...");
worker.setProgressBarMaximum(uids.length);
// mark as spam /as not spam
// for each message
for (int j = 0; j < uids.length; j++) {
worker.setDisplayText("Training messages...");
worker.setProgressBarMaximum(uids.length);
// increase progressbar value
worker.setProgressBarValue(j);
// cancel here if user requests
if (worker.cancelled()) {
break;
}
// message belongs to which account?
AccountItem item = CommandHelper.retrieveAccountItem(srcFolder,
uids[j]);
// skip if account information is not available
if (item == null)
continue;
// if spam filter is not enabled -> return
if (item.getSpamItem().isEnabled() == false)
continue;
LOG.info("learning uid=" + uids[j]); //$NON-NLS-1$
// create reference
IMailFolderCommandReference ref = new MailFolderCommandReference(srcFolder,
new Object[] { uids[j] });
// create command
ICommand c = null;
if (markVariant == MarkMessageCommand.MARK_AS_SPAM)
c = new LearnMessageAsSpamCommand(ref);
else
c = new LearnMessageAsHamCommand(ref);
// execute command
c.execute(worker);
// skip if message is *not* marked as spam
if (markVariant == MarkMessageCommand.MARK_AS_NOTSPAM)
continue;
// skip if user didn't enable this option
if (item.getSpamItem().isMoveMessageWhenMarkingEnabled() == false)
continue;
if (item.getSpamItem().isMoveTrashSelected() == false) {
// move message to user-configured folder (generally "Junk"
// folder)
IMailFolder destFolder = FolderTreeModel.getInstance()
.getFolder(item.getSpamItem().getMoveCustomFolder());
// create reference
MailFolderCommandReference ref2 = new MailFolderCommandReference(
srcFolder, destFolder, new Object[] { uids[j] });
CommandProcessor.getInstance().addOp(new MoveMessageCommand(ref2));
} else {
// move message to trash
IMailbox trash = (IMailbox) ((RootFolder) srcFolder
.getRootFolder()).getTrashFolder();
// create reference
MailFolderCommandReference ref2 = new MailFolderCommandReference(
srcFolder, trash, new Object[] { uids[j] });
CommandProcessor.getInstance().addOp(new MoveMessageCommand(ref2));
}
}
}
// in java/org/columba/mail/folder/command/CopyMessageCommand.java
protected void doExecute(IWorkerStatusController worker,
String statusMessage, String errorRetryMessage,
String errorIgnoreMessage, String errorCopyMessage,
String errorTitle, String canceledMessage) throws Exception {
// get references
r = (IMailFolderCommandReference) getReference();
// get destination foldedr
destFolder = (IMailbox) r.getDestinationFolder();
Object[] uids = r.getUids();
// get source folder
IMailbox srcFolder = (IMailbox) r.getSourceFolder();
// register for status events
((StatusObservableImpl) srcFolder.getObservable()).setWorker(worker);
// setting lastSelection for srcFolder to null
srcFolder.setLastSelection(null);
LOG.fine("src=" + srcFolder + " dest=" + destFolder);
// update status message
worker.setDisplayText(MessageFormat.format(MailResourceLoader
.getString("statusbar", "message", statusMessage),
new Object[] { destFolder.getName() }));
// initialize progress bar with total number of messages
worker.setProgressBarMaximum(uids.length);
if (srcFolder.getRootFolder().equals(destFolder.getRootFolder())) {
// folders have same root folder
// -> for example: two IMAP folders on the same server
// -----> this means we use server-side copying which
// -----> is much faster than using inputstreams here
//
// also used for local folders, which saves some parsing work
srcFolder.innerCopy(destFolder, uids);
} else {
// two different root folders
// -> get inputstream from source-folder and add it to
// -> destination-folder as inputstream
// -----> moving of raw message source
// (works also for copying from local to IMAP folders, etc.
for (int j = 0; (j < uids.length) && !worker.cancelled(); j++) {
if (!srcFolder.exists(uids[j])) {
continue;
}
try {
// add source to destination folder
Attributes attributes = srcFolder.getAttributes(uids[j]);
Flags flags = srcFolder.getFlags(uids[j]);
InputStream messageSourceStream = srcFolder
.getMessageSourceStream(uids[j]);
destFolder.addMessage(messageSourceStream, attributes,
flags);
messageSourceStream.close();
} catch (IOException ioe) {
String[] options = new String[] {
MailResourceLoader.getString("statusbar",
"message", errorRetryMessage),
MailResourceLoader.getString("statusbar",
"message", errorIgnoreMessage),
MailResourceLoader
.getString("", "global", "cancel") };
int result = JOptionPane.showOptionDialog(FrameManager.getInstance()
.getActiveFrame(),
MailResourceLoader.getString("statusbar",
"message", errorCopyMessage),
MailResourceLoader.getString("statusbar",
"message", errorTitle),
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.ERROR_MESSAGE, null, options,
options[0]);
switch (result) {
case JOptionPane.YES_OPTION:
//retry copy
j--;
break;
case JOptionPane.CANCEL_OPTION:
worker.cancel();
default:
continue;
}
}
// update progress bar
worker.setProgressBarValue(j);
}
}
// in java/org/columba/mail/folder/command/CopyMessageCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
doExecute(worker, "copy_messages", "err_copy_messages_retry",
"err_copy_messages_ignore", "err_copy_messages_msg",
"err_copy_messages_title", "copy_messages_cancelled");
}
// in java/org/columba/mail/folder/command/MarkMessageCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
/*
* // use wrapper class for easier handling of references array adapter =
* new FolderCommandAdapter( (MailFolderCommandReference[])
* getReferences()); // get array of source references
* MailFolderCommandReference[] r = adapter.getSourceFolderReferences();
*/
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
// get array of message UIDs
Object[] uids = r.getUids();
// get source folder
IMailbox srcFolder = (IMailbox) r.getSourceFolder();
// register for status events
((StatusObservableImpl) srcFolder.getObservable()).setWorker(worker);
// which kind of mark?
int markVariant = r.getMarkVariant();
// saving last selected message to the folder
srcFolder.setLastSelection(uids[0]);
// mark message
srcFolder.markMessage(uids, markVariant);
}
// in java/org/columba/mail/folder/command/RemoveFolderCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// get source folder
IMailbox childFolder = (IMailbox) ((IMailFolderCommandReference) getReference())
.getSourceFolder();
// remove source folder
childFolder.removeFolder();
}
// in java/org/columba/mail/folder/command/MarkFolderAsReadCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// get folder that is going to be moved
folderToBeRead = (IMailbox) ((IMailFolderCommandReference) getReference()).getSourceFolder();
worker.setDisplayText(MessageFormat.format(
MailResourceLoader.getString("statusbar", "message",
"folder_markasread"), new Object[] {folderToBeRead.getName()}));
worker.clearDisplayTextWithDelay();
IMailFolderCommandReference markCommandRefs = new MailFolderCommandReference(folderToBeRead);
Object[] uids = folderToBeRead.getUids();
if ((uids != null) && (uids.length > 0)) {
markCommandRefs.setUids(uids);
markCommandRefs.setMarkVariant(MarkMessageCommand.MARK_AS_READ);
markMessageCommand = new MarkMessageCommand(markCommandRefs);
markMessageCommand.execute(worker);
}
}
// in java/org/columba/mail/folder/command/MoveFolderCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// get folder that is going to be moved
IMailFolder movedFolder = (IMailFolder) ((IFolderCommandReference) getReference())
.getSourceFolder();
// get destination folder
destParentFolder = (IMailFolder) ((IFolderCommandReference) getReference())
.getDestinationFolder();
// AbstractFolder.append also automatically removes the folder
// from its parent
movedFolder.moveTo(destParentFolder);
}
// in java/org/columba/mail/folder/command/SaveMessageBodyAsCommand.java
public void execute(IWorkerStatusController worker)
throws Exception {
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
Object[] uids = r.getUids(); // uid for messages to save
IMailbox srcFolder = (IMailbox) r.getSourceFolder();
// register for status events
((StatusObservableImpl) srcFolder.getObservable()).setWorker(worker);
JFileChooser fileChooser = new JFileChooser();
// save each message
for (int j = 0; j < uids.length; j++) {
Object uid = uids[j];
LOG.info("Saving UID=" + uid);
header = srcFolder.getAllHeaderFields(uid);
setupMessageBodyPart(uid, srcFolder,worker);
AttachmentModel attMod = new AttachmentModel();
attMod.setCollection(srcFolder.getMimePartTree(uid));
attachments = attMod.getDisplayedMimeParts();
// determine type of body part
boolean ishtml = false;
if (bodyHeader.getMimeType().getSubtype().equals("html")) {
ishtml = true;
}
// setup filters and filename for file chooser dialog
ExtensionFileFilter txtFilter = new ExtensionFileFilter("txt",
"Text (*.txt)");
ExtensionFileFilter htmlFilter = new ExtensionFileFilter("html",
"Html (*.html)");
fileChooser.resetChoosableFileFilters();
fileChooser.setAcceptAllFileFilterUsed(false);
fileChooser.addChoosableFileFilter(txtFilter);
fileChooser.addChoosableFileFilter(htmlFilter);
// add check box for incl. of headers
JCheckBox inclHeaders = new JCheckBox(MailResourceLoader.getString(
"dialog", "saveas", "save_all_headers"),
getInclAllHeadersOption());
fileChooser.setAccessory(inclHeaders);
// setup dialog title, active filter and file name
String subject = EncodedWord.decode( header.get("Subject")).toString();
String defaultName = getValidFilename(subject,true);
if (ishtml) {
fileChooser.setDialogTitle(MailResourceLoader.getString(
"dialog", "saveas", "save_html_message"));
fileChooser.setFileFilter(htmlFilter);
if (defaultName.length() > 0) {
fileChooser.setSelectedFile(new File(defaultName + "."
+ htmlFilter.getExtension()));
}
} else {
fileChooser.setDialogTitle(MailResourceLoader.getString(
"dialog", "saveas", "save_text_message"));
fileChooser.setFileFilter(txtFilter);
if (defaultName.length() > 0) {
fileChooser.setSelectedFile(new File(defaultName + "."
+ txtFilter.getExtension()));
}
}
// show dialog
int res = fileChooser.showSaveDialog(null);
if (res == JFileChooser.APPROVE_OPTION) {
File f = fileChooser.getSelectedFile();
ExtensionFileFilter filter = (ExtensionFileFilter) fileChooser.getFileFilter();
// Add default extension if no extension is given by the user
if (ExtensionFileFilter.getFileExtension(f) == null) {
f = new File(f.getAbsolutePath() + "."
+ filter.getExtension());
}
int confirm;
if (f.exists()) {
// file exists, user needs to confirm overwrite
confirm = JOptionPane.showConfirmDialog(FrameManager.getInstance()
.getActiveFrame(),
MailResourceLoader.getString("dialog", "saveas",
"overwrite_existing_file"),
MailResourceLoader.getString("dialog", "saveas",
"file_exists"), JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE);
} else {
confirm = JOptionPane.YES_OPTION;
}
if (confirm == JOptionPane.YES_OPTION) {
// store whether all headers should be incl.
boolean incl = inclHeaders.isSelected();
storeInclAllHeadersOption(incl);
LOG.info("Incl. all headers: " + incl);
// save message
if (filter.getExtension().equals(htmlFilter.getExtension())) {
saveMsgBodyAsHtml(incl, f);
} else {
saveMsgBodyAsText(incl, f);
}
}
}
}
// end of for loop over uids to save
}
// in java/org/columba/mail/folder/command/SaveMessageBodyAsCommand.java
private void setupMessageBodyPart(Object uid, IMailbox srcFolder,
IWorkerStatusController worker) throws Exception {
// Does the user prefer html or plain text?
XmlElement html = MailConfig.getInstance().getMainFrameOptionsConfig()
.getRoot().getElement("/options/html");
// Get body of message depending on user preferences
MimeTree mimePartTree = srcFolder.getMimePartTree(uid);
MimePart bodyPart = null;
if (Boolean.valueOf(html.getAttribute("prefer")).booleanValue()) {
bodyPart = mimePartTree.getFirstTextPart("html");
} else {
bodyPart = mimePartTree.getFirstTextPart("plain");
}
if (bodyPart == null) {
bodyHeader = new MimeHeader();
bodyStream = new ByteArrayInputStream(new byte[0]);
} else {
bodyHeader = bodyPart.getHeader();
bodyStream = srcFolder.getMimePartBodyStream(uid, bodyPart.getAddress());
}
}
// in java/org/columba/mail/folder/command/TagMessageCommand.java
Override
public void execute(IWorkerStatusController worker) throws Exception {
// get array of source references
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
// does not work: r.getFolderName()
// does not work: r.getMessage().getUID()
// get source folder
IMailbox srcFolder = (IMailbox) r.getSourceFolder();
Hashtable<Object, IFolder> mails = new Hashtable<Object, IFolder>();
// check if virtual folder, if yes, do not use these uids, use the
// real uids instead
if (srcFolder instanceof VirtualFolder) {
// get original folder
try {
IHeaderList hl = ((IMailbox) r.getSourceFolder())
.getHeaderList();
for (Object uid : r.getUids()) {
// should be virtual
mails.put(((VirtualHeader) hl.get(uid)).getSrcUid(),
((VirtualHeader) hl.get(uid)).getSrcFolder());
}
} catch (Exception e) {
LOG.severe("Error getting header list from virtual folder");
e.printStackTrace();
}
} else {
for (Object uid : r.getUids()) {
mails.put(uid, r.getSourceFolder());
}
}
if (type == ADD_TAG) {
for (Entry<Object, IFolder> entry : mails.entrySet()) {
AssociationStore.getInstance().addAssociation("tagging", id,
createURI(entry.getValue().getId(), entry.getKey()).toString());
}
} else if (type == REMOVE_TAG) {
for (Entry<Object, IFolder> entry : mails.entrySet()) {
AssociationStore.getInstance().removeAssociation("tagging", id,
createURI(entry.getValue().getId(), entry.getKey()).toString());
}
}
}
// in java/org/columba/mail/folder/command/RenameFolderCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// get source folder
selectedFolder = (IMailFolder) ((IFolderCommandReference) getReference()).getSourceFolder();
// get name of folder
String name = ((IMailFolderCommandReference) getReference()).getFolderName();
// rename folder
((IMailFolder) selectedFolder).setName(name);
}
// in java/org/columba/mail/folder/command/SaveMessageSourceAsCommand.java
public void execute(IWorkerStatusController worker)
throws Exception {
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
Object[] uids = r.getUids(); // uid for messages to save
IMailbox srcFolder = (IMailbox) r.getSourceFolder();
// register for status events
((StatusObservableImpl) srcFolder.getObservable()).setWorker(worker);
JFileChooser fileChooser = new JFileChooser();
// Save message source for each selected message
for (int j = 0; j < uids.length; j++) {
Object uid = uids[j];
LOG.info("Saving UID=" + uid);
//setup save dialog
String subject = (String) srcFolder.getHeaderFields(uid, new String[] { "Subject" }).get("Subject");
subject = EncodedWord.decode(subject).toString();
String defaultName = getValidFilename(subject, false);
if (defaultName.length() == 0) {
defaultName = srcFolder.getHeaderList().get(uid).get("columba.from").toString();
}
fileChooser.setSelectedFile(new File(defaultName));
fileChooser.setDialogTitle(MailResourceLoader.getString("dialog",
"saveas", "save_msg_source"));
// show dialog
if (fileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
File f = fileChooser.getSelectedFile();
if (f.exists()) {
// file exists, user needs to confirm overwrite
int confirm = JOptionPane.showConfirmDialog(FrameManager.getInstance()
.getActiveFrame(),
MailResourceLoader.getString("dialog", "saveas",
"overwrite_existing_file"),
MailResourceLoader.getString("dialog", "saveas",
"file_exists"), JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (confirm == JOptionPane.NO_OPTION) {
j--;
continue;
}
}
InputStream in = null;
OutputStream out = null;
try {
// save message source under selected filename
in = new BufferedInputStream(srcFolder.getMessageSourceStream(uid));
out = new BufferedOutputStream(new FileOutputStream(f));
byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer, 0, buffer.length)) > 0) {
out.write(buffer, 0, read);
}
} catch (IOException ioe) {
LOG.severe("Error saving msg source to file: " + ioe.getMessage());
JOptionPane.showMessageDialog(null,
MailResourceLoader.getString("dialog", "saveas",
"err_save_msg"),
MailResourceLoader.getString("dialog", "saveas",
"err_save_title"), JOptionPane.ERROR_MESSAGE);
} finally {
try {
in.close();
} catch (IOException ioe) {
}
try {
if (out != null) {
out.close();
}
} catch (IOException ioe) {
}
}
}
}
// end of loop over selected messages
}
// in java/org/columba/mail/folder/command/AddSenderToAddressbookCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// get reference
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
// get array of message UIDs
Object[] uids = r.getUids();
// get source folder
IMailbox folder = (IMailbox) r.getSourceFolder();
// register for status events
((StatusObservableImpl) folder.getObservable()).setWorker(worker);
IContactFacade contactFacade = null;
IModelFacade modelFacade = null;
try {
contactFacade = ServiceConnector.getContactFacade();
modelFacade = ServiceConnector.getModelFacade();
} catch (ServiceNotFoundException e) {
e.printStackTrace();
return;
}
Vector<String> v = new Vector<String>();
// for each message
for (int i = 0; i < uids.length; i++) {
// get header of message
Header header = folder.getHeaderFields(uids[i],
new String[] { "From" });
// get sender
String sender = (String) header.get("From");
v.add(sender);
}
// add sender to addressbook
Iterator<String> it = v.listIterator();
while (it.hasNext()) {
try {
Address address = Address.parse(it.next());
// add contact to addressbook
IContactItem contactItem = modelFacade.createContactItem();
FacadeUtil.getInstance().initContactItem(contactItem, address.getDisplayName(), address.getMailAddress());
contactFacade.addContact(contactItem);
} catch (ParserException e) {
e.printStackTrace();
} catch (StoreException e) {
e.printStackTrace();
}
}
}
// in java/org/columba/mail/folder/command/SaveFolderConfigurationCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// skip if no reference available
if ((getReference() != null) || (getReference() == null)) {
return;
}
IMailFolder folderTreeNode = (IMailFolder) ((IMailFolderCommandReference) getReference())
.getSourceFolder();
// if folder is message folder
// ->TODO (@author fdietz): there should be an interface, instead of the AbstractMessageFolder
// class
if (folderTreeNode instanceof AbstractMessageFolder) {
AbstractMessageFolder folder = (AbstractMessageFolder) folderTreeNode;
// register for status events
((StatusObservableImpl) folder.getObservable()).setWorker(worker);
// save headercache
folder.save();
}
}
// in java/org/columba/mail/folder/command/AddAllSendersToAddressbookCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// get reference
IFolderCommandReference r = (IFolderCommandReference) getReference();
// selected messages
Object[] uids = r.getUids();
// selected folder
IMailbox folder = (IMailbox) r.getSourceFolder();
// register for status events
((StatusObservableImpl) folder.getObservable()).setWorker(worker);
IContactFacade contactFacade = null;
IModelFacade modelFacade = null;
try {
contactFacade = ServiceConnector.getContactFacade();
modelFacade = ServiceConnector.getModelFacade();
} catch (ServiceNotFoundException e) {
e.printStackTrace();
return;
}
List<String> addresses = new ArrayList<String>();
// for every message
for (int i = 0; i < uids.length; i++) {
// get header of message
Header header = folder.getHeaderFields(uids[i], new String[] {
"From", "To", "Cc", "Bcc" });
String addrStr = (String) header.get("From");
addresses.addAll(parseAddrStr(addrStr));
addrStr = (String) header.get("To");
addresses.addAll(parseAddrStr(addrStr));
addrStr = (String) header.get("Cc");
addresses.addAll(parseAddrStr(addrStr));
addrStr = (String) header.get("Bcc");
addresses.addAll(parseAddrStr(addrStr));
}
// add sender to addressbook
Iterator<String> it = addresses.listIterator();
List<IContactItem> contactItems = new ArrayList<IContactItem>();
while (it.hasNext()) {
try {
String addrStr = it.next();
if (addrStr == null)
continue;
Address address = Address.parse(addrStr);
// add contact to addressbook
IContactItem contactItem = modelFacade.createContactItem();
FacadeUtil.getInstance().initContactItem(contactItem, address.getDisplayName(), address.getMailAddress());
contactItems.add(contactItem);
} catch (ParserException e) {
e.printStackTrace();
} catch (StoreException e) {
e.printStackTrace();
}
}
contactFacade.addContacts(contactItems.toArray(new IContactItem[contactItems.size()]));
}
// in java/org/columba/mail/folder/command/ColorMessageCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// get array of source references
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
// get array of message UIDs
Object[] uids = r.getUids();
// get source folder
IMailbox srcFolder = (IMailbox) r.getSourceFolder();
// register for status events
((StatusObservableImpl) srcFolder.getObservable()).setWorker(worker);
// which kind of color?
int rgbValue = r.getColorValue();
// saving last selected Message to the folder
srcFolder.setLastSelection(uids[0]);
// get color from factory
// ->factory shares color objects to save memory
Color color = ColorFactory.getColor(rgbValue);
// for each message
for (int j = 0; j < uids.length; j++) {
// set columba.color flag
srcFolder.setAttribute(uids[j], "columba.color", color);
}
}
// in java/org/columba/mail/folder/command/PrintMessageCommand.java
public void updatedGUI() throws Exception {
}
// in java/org/columba/mail/folder/command/PrintMessageCommand.java
public void execute(IWorkerStatusController worker)
throws Exception {
/*
* *20030604, karlpeder* Fixed minor flaws to be able to print text
* messages. Further more added support for html messages.
*/
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
Object[] uids = r.getUids(); // uid for messages to print
IMailbox srcFolder = (IMailbox) r.getSourceFolder();
//register for status events
((StatusObservableImpl) srcFolder.getObservable()).setWorker(worker);
// Print each message
for (int j = 0; j < uids.length; j++) {
Object uid = uids[j];
LOG.info("Printing UID=" + uid);
Header header = srcFolder.getHeaderFields(uids[j], getHeaderKeys());
setupMessageBodyPart(uid, srcFolder, worker);
// Setup print document for message
cDocument messageDoc = new cDocument();
messageDoc.setHeader(getMailHeader());
messageDoc.setFooter(getMailFooter());
String[] headerKeys = getHeaderKeys();
cParagraph hKey;
cParagraph hValue;
cHGroup hLine;
Object value;
// Add header information to print
for (int i = 0; i < Array.getLength(headerKeys); i++) {
hKey = new cParagraph();
// *20030531, karlpeder* setting headerKeys to lowercase for
// lookup!
hKey.setText(MailResourceLoader.getString("header",
headerKeys[i].toLowerCase()));
hKey.setFontStyle(Font.BOLD);
hValue = new cParagraph();
/*
* *20031216, karlpeder* Changed handling of dates.
* Previously columba.date header was used. Now we
* use the Date header instead
*/
//if (headerKeys[i].equalsIgnoreCase("date")) {
// value = header.get("columba.date");
//} else {
//value = header.get(headerKeys[i]);
//}
value = header.get(headerKeys[i]);
if (headerKeys[i].equalsIgnoreCase(dateHeaderKey)) {
// special handling for dates
SimpleDateFormat formatter = new SimpleDateFormat(
"d MMM yyyy HH:mm:ss Z");
String dateStr = (String) value;
// ignore leading weekday name (e.g. "Mon,"), since this
// seems to give problems during parsing
ParsePosition pos = new ParsePosition(dateStr.indexOf(',') + 1);
Date d = formatter.parse((String) value, pos);
if (d != null) {
hValue.setText(getMailDateFormat().format(d));
} else {
// fall back to use the Date header contents directly
hValue.setText((String) value);
}
} else {
hValue.setText((String) value);
}
hValue.setLeftMargin(new cCmUnit(3.0));
hLine = new cHGroup();
hLine.add(hKey);
hLine.add(hValue);
messageDoc.appendPrintObject(hLine);
}
// Add list of attachments if applicable
AttachmentModel attMod = new AttachmentModel();
attMod.setCollection(srcFolder.getMimePartTree(uid));
List attachments = attMod.getDisplayedMimeParts();
for (int i = 0; i < attachments.size(); i++) {
StreamableMimePart mp = (StreamableMimePart) attachments.get(i);
if (mp.getHeader().getFileName() != null) {
// one line is added to the header for each attachment
// (which has a filename defined)
hKey = new cParagraph();
hKey.setText(MailResourceLoader.getString("header",
attHeaderKey));
hKey.setFontStyle(Font.BOLD);
hValue = new cParagraph();
hValue.setText(mp.getHeader().getFileName());
hValue.setLeftMargin(new cCmUnit(3.0));
hLine = new cHGroup();
hLine.add(hKey);
hLine.add(hValue);
messageDoc.appendPrintObject(hLine);
}
}
// Add body of message to print
String mimesubtype = bodyHeader.getMimeType().getSubtype();
if (mimesubtype.equals("html")) {
messageDoc.appendPrintObject(getHTMLBodyPrintObject());
} else {
messageDoc.appendPrintObject(getPlainBodyPrintObject());
}
// print the print document (i.e. the message)
messageDoc.print();
}
// end of for loop over uids to print
}
// in java/org/columba/mail/folder/command/PrintMessageCommand.java
private void setupMessageBodyPart(Object uid, IMailbox srcFolder,
IWorkerStatusController worker) throws Exception {
// Does the user prefer html or plain text?
XmlElement html = MailConfig.getInstance().getMainFrameOptionsConfig()
.getRoot().getElement("/options/html");
// Get body of message depending on user preferences
MimeTree mimePartTree = srcFolder.getMimePartTree(uid);
MimePart bodyPart = null;
if (Boolean.valueOf(html.getAttribute("prefer")).booleanValue()) {
bodyPart = mimePartTree.getFirstTextPart("html");
} else {
bodyPart = mimePartTree.getFirstTextPart("plain");
}
if (bodyPart == null) {
bodyHeader = new MimeHeader();
bodyStream = new ByteArrayInputStream(new byte[0]);
} else {
bodyHeader = bodyPart.getHeader();
bodyStream = srcFolder.getMimePartBodyStream(uid, bodyPart.getAddress());
}
}
// in java/org/columba/mail/folder/command/MoveMessageCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
// get references
r = (IMailFolderCommandReference) getReference();
// get source folder
IMailbox srcFolder = (IMailbox) r.getSourceFolder();
// get destination foldedr
destFolder = (IMailbox) r.getDestinationFolder();
// cancel, if source equals destination folder
if ( srcFolder.getId() == destFolder.getId() ) return;
// calling CopyMessageCommand.execute() here!
//super.execute(worker);
doExecute(worker, "move_messages", "err_copy_messages_retry",
"err_copy_messages_ignore", "err_move_messages_msg",
"err_move_messages_title", "move_messages_cancelled");
// get messgae UIDs
Object[] uids = r.getUids();
// register for status events
((StatusObservableImpl) srcFolder.getObservable()).setWorker(worker);
// setting lastSelection to null
srcFolder.setLastSelection(null);
LOG.info("src=" + srcFolder + " dest=" + destFolder);
// update status message
worker.setDisplayText("Moving messages to " + destFolder.getName()
+ "...");
worker.setProgressBarMaximum(uids.length);
// mark all messages as expunged
srcFolder.markMessage(uids, MarkMessageCommand.MARK_AS_EXPUNGED);
// expunge folder
srcFolder.expungeFolder();
// We are done - clear the status message after a delay
worker.clearDisplayTextWithDelay();
}
// in java/org/columba/mail/folder/command/ImportMessageCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
ImportFolderCommandReference r = (ImportFolderCommandReference) getReference();
AbstractMailboxImporter importer = r.getImporter();
importer.run(worker);
}
// in java/org/columba/mail/folder/command/SyncSearchEngineCommand.java
public void execute(IWorkerStatusController worker)
throws Exception {
// get source folder
parentFolder = (AbstractLocalFolder) ((IMailFolderCommandReference) getReference()).getSourceFolder();
// resync search engine
// -> this is only needed for Lucene right now
DefaultSearchEngine engine = parentFolder.getSearchEngine();
engine.sync();
}
// in java/org/columba/mail/folder/AbstractFolder.java
public void setName(String newName) throws Exception {
IFolderItem item = getConfiguration();
item.setString("property", "name", newName);
fireFolderPropertyChanged();
}
// in java/org/columba/mail/folder/AbstractFolder.java
public void removeFolder() throws Exception {
// remove XmlElement
getConfiguration().getRoot().getParent().removeElement(
getConfiguration().getRoot());
// notify listeners
fireFolderRemoved();
}
// in java/org/columba/mail/folder/AbstractFolder.java
public void addSubfolder(IMailFolder child) throws Exception {
getConfiguration().getRoot().addElement(
child.getConfiguration().getRoot());
fireFolderAdded(child);
}
// in java/org/columba/mail/folder/AbstractLocalFolder.java
public void removeFolder() throws Exception {
// delete folder from your harddrive
boolean b = DiskIO.deleteDirectory(directoryFile);
// if this worked, remove it from tree.xml configuration, too
if (b) {
super.removeFolder();
}
}
// in java/org/columba/mail/folder/AbstractLocalFolder.java
public MimeTree getMimePartTree(Object uid) throws Exception {
// get message with UID
IColumbaMessage message = getMessage(uid);
// get tree-like structure of mimeparts
MimeTree mptree = message.getMimePartTree();
return mptree;
}
// in java/org/columba/mail/folder/AbstractLocalFolder.java
public InputStream getMessageSourceStream(Object uid) throws Exception {
return getDataStorageInstance().getMessageStream(uid);
}
// in java/org/columba/mail/folder/AbstractLocalFolder.java
public InputStream getMimePartBodyStream(Object uid, Integer[] address)
throws Exception {
// get message with UID
IColumbaMessage message = getMessage(uid);
// Get the mimepart
LocalMimePart mimepart = (LocalMimePart) message.getMimePartTree()
.getFromAddress(address);
return mimepart.getInputStream();
}
// in java/org/columba/mail/folder/AbstractLocalFolder.java
public InputStream getMimePartSourceStream(Object uid, Integer[] address)
throws Exception {
// get message with UID
IColumbaMessage message = getMessage(uid);
// Get the mimepart
LocalMimePart mimepart = (LocalMimePart) message.getMimePartTree()
.getFromAddress(address);
return new SourceInputStream(mimepart.getSource());
}
// in java/org/columba/mail/folder/AbstractLocalFolder.java
public void innerCopy(IMailbox destFolder, Object[] uids) throws Exception {
if (getObservable() != null) {
getObservable().setMax(uids.length);
}
for (int i = 0; i < uids.length; i++) {
// skip this message, if it doesn't exist in source folder
if (!exists(uids[i])) {
continue;
}
InputStream messageSourceStream = getMessageSourceStream(uids[i]);
destFolder.addMessage(messageSourceStream, getAttributes(uids[i]),
getFlags(uids[i]));
messageSourceStream.close();
/*
* ((AbstractLocalFolder) destFolder).setFlags(destuid, (Flags)
* getFlags( uids[i]).clone());
*/
// destFolder.fireMessageAdded(uids[i]);
if (getObservable() != null) {
getObservable().setCurrent(i);
}
}
// we are done - clear the progress bar
if (getObservable() != null) {
getObservable().resetCurrent();
}
}
// in java/org/columba/mail/folder/AbstractLocalFolder.java
public Object addMessage(InputStream in) throws Exception {
return addMessage(in, null, null);
}
// in java/org/columba/mail/folder/AbstractLocalFolder.java
public Object addMessage(InputStream in, Attributes attributes, Flags flags)
throws Exception {
// generate UID for new message
Object newUid = generateNextMessageUid();
// save message stream to file
getDataStorageInstance().saveMessage(newUid, in);
// close stream
in.close();
// parse header
Source source = getDataStorageInstance().getMessageSource(newUid);
int messageSize = source.length();
Header header = HeaderParser.parse(source);
ColumbaHeader h;
if ((attributes != null) && (flags != null)) {
// save header and attributes. Copy the flags!
h = new ColumbaHeader(header, (Attributes) attributes.clone(),
new Flags(flags.getFlags()));
} else {
h = new ColumbaHeader(header);
h.set("columba.size", new Integer(messageSize / 1024));
}
source.close();
h.set("columba.uid", newUid);
getHeaderList().add(h, newUid);
fireMessageAdded(newUid, getFlags(newUid));
return newUid;
}
// in java/org/columba/mail/folder/AbstractLocalFolder.java
protected ColumbaMessage getMessage(Object uid) throws Exception {
// Check if the message is already cached
if (aktMessage != null) {
if (aktMessage.getUID().equals(uid)) {
// this message is already cached
return aktMessage;
}
}
ColumbaMessage message;
try {
Source source = null;
source = getDataStorageInstance().getMessageSource(uid);
// Parse Message from DataStorage
try {
message = new ColumbaMessage(MessageParser.parse(source));
} catch (ParserException e1) {
LOG.fine(e1.getSource().toString());
throw e1;
}
source.close();
message.setUID(uid);
aktMessage = message;
// TODO: fix parser exception
} catch (FolderInconsistentException e) {
super.removeMessage(uid);
throw e;
}
// We use the attributes and flags from the cache
// but the parsed header from the parsed message
IColumbaHeader header = getHeaderList().get(uid);
header.setHeader(message.getHeader().getHeader());
message.setHeader(header);
return message;
}
// in java/org/columba/mail/folder/AbstractLocalFolder.java
protected IColumbaHeader getMessageHeader(Object uid) throws Exception {
if ((aktMessage != null) && (aktMessage.getUID().equals(uid))) {
// message is already cached
// try to compare the headerfield count of
// the actually parsed message with the cached
// headerfield count
IColumbaMessage message = getMessage(uid);
// number of headerfields
int size = message.getHeader().count();
// get header from cache
IColumbaHeader h = getHeaderList().get(uid);
// message doesn't exist (this shouldn't happen here)
if (h == null) {
return null;
}
// number of headerfields
int cachedSize = h.count();
// if header contains more fields than the cached header
if (size > cachedSize) {
return (ColumbaHeader) message.getHeader();
}
return (ColumbaHeader) h;
} else {
// message isn't cached
// -> just return header from cache
return getHeaderList().get(uid);
}
}
// in java/org/columba/mail/folder/AbstractLocalFolder.java
public void removeMessage(Object uid) throws Exception {
// remove message from disk
getDataStorageInstance().removeMessage(uid);
// fireMessageRemoved(uid, getFlags(uid));
super.removeMessage(uid);
}
// in java/org/columba/mail/folder/AbstractLocalFolder.java
protected void setFlags(Object uid, Flags flags) throws Exception {
IColumbaHeader h = getHeaderList().get(uid);
Flags oldFlags = h.getFlags();
h.setFlags(flags);
// update MessageFolderInfo
if (oldFlags.get(Flags.RECENT) && !flags.get(Flags.RECENT)) {
getMessageFolderInfo().decRecent();
}
if (!oldFlags.get(Flags.RECENT) && flags.get(Flags.RECENT)) {
getMessageFolderInfo().incRecent();
}
if (oldFlags.get(Flags.SEEN) && !flags.get(Flags.SEEN)) {
getMessageFolderInfo().incUnseen();
}
if (!oldFlags.get(Flags.SEEN) && flags.get(Flags.SEEN)) {
getMessageFolderInfo().decUnseen();
}
}
// in java/org/columba/mail/folder/AbstractLocalFolder.java
public Header getHeaderFields(Object uid, String[] keys) throws Exception {
// cached headerfield list
List cachedList = Arrays.asList(CachedHeaderfields
.getDefaultHeaderfields());
LinkedList keyList = new LinkedList(Arrays.asList(keys));
ListTools.substract(keyList, cachedList);
if (keyList.size() == 0) {
return getHeaderList().get(uid).getHeader();
} else {
// We need to parse
// get message with UID
IColumbaMessage message = getMessage(uid);
Header header = message.getHeader().getHeader();
Header subHeader = new Header();
String value;
for (int i = 0; i < keys.length; i++) {
value = header.get(keys[i]);
if (value != null) {
subHeader.set(keys[i], value);
}
}
return subHeader;
}
}
// in java/org/columba/mail/folder/AbstractLocalFolder.java
public void expungeFolder() throws Exception {
// make sure to close all file handles
// to the currently cached message
// -> necessary for windows to be able to delete the local file
if (aktMessage != null) {
aktMessage.close();
aktMessage = null;
}
super.expungeFolder();
}
// in java/org/columba/mail/folder/AbstractLocalFolder.java
public Header getAllHeaderFields(Object uid) throws Exception {
IColumbaMessage message = getMessage(uid);
Header header = message.getHeader().getHeader();
return header;
}
// in java/org/columba/mail/folder/AbstractLocalFolder.java
public synchronized IHeaderList getHeaderList() throws Exception {
if (headerList == null) {
// header cache is stored in "headerlist" subfolder
File headercacheDirectory = new File(getDirectoryFile(),"headerlist");
headerList = new BerkeleyDBHeaderList(headercacheDirectory, getId());
final AbstractMessageFolder folder = this;
headerList
.addHeaderListCorruptedListener(new IHeaderListCorruptedListener() {
public void headerListCorrupted(IHeaderList headerList) {
try {
SyncHeaderList.sync(folder, headerList);
} catch (IOException e) {
LOG.severe(e.getMessage());
}
}
});
}
// in java/org/columba/mail/folder/AbstractLocalFolder.java
public void save() throws Exception {
super.save();
if (headerList != null)
headerList.persist();
}
// in java/org/columba/mail/folder/temp/TempFolder.java
public Object[] getUids() throws Exception {
return messageList.keySet().toArray();
}
// in java/org/columba/mail/folder/temp/TempFolder.java
public boolean exists(Object uid) throws Exception {
return messageList.containsKey(uid);
}
// in java/org/columba/mail/folder/temp/TempFolder.java
public IHeaderList getHeaderList() throws Exception {
return headerList;
}
// in java/org/columba/mail/folder/temp/TempFolder.java
public void removeMessage(Object uid) throws Exception {
Flags flags = getFlags(uid);
fireMessageRemoved(uid, flags);
headerList.remove(uid);
messageList.remove(uid);
}
// in java/org/columba/mail/folder/temp/TempFolder.java
public MimeTree getMimePartTree(Object uid) throws Exception {
return ((IColumbaMessage) messageList.get(uid)).getMimePartTree();
}
// in java/org/columba/mail/folder/temp/TempFolder.java
public IColumbaHeader getMessageHeader(Object uid) throws Exception {
ColumbaHeader header = (ColumbaHeader) headerList.get(uid);
return header;
}
// in java/org/columba/mail/folder/temp/TempFolder.java
public IColumbaMessage getMessage(Object uid) throws Exception {
IColumbaMessage message = (IColumbaMessage) messageList.get(uid);
return message;
}
// in java/org/columba/mail/folder/temp/TempFolder.java
public Object[] searchMessages(Filter filter, Object[] uids)
throws Exception {
return getSearchEngine().searchMessages(filter, uids);
}
// in java/org/columba/mail/folder/temp/TempFolder.java
public Object[] searchMessages(Filter filter) throws Exception {
return getSearchEngine().searchMessages(filter);
}
// in java/org/columba/mail/folder/temp/TempFolder.java
public void innerCopy(IMailbox destFolder, Object[] uids)
throws Exception {
for (int i = 0; i < uids.length; i++) {
InputStream messageSourceStream = getMessageSourceStream(uids[i]);
destFolder.addMessage(messageSourceStream);
messageSourceStream.close();
}
}
// in java/org/columba/mail/folder/temp/TempFolder.java
public Object addMessage(InputStream in, Attributes attributes, Flags flags)
throws Exception {
Message message = MessageParser.parse(
TempSourceFactory.createTempSource(in, -1));
Object newUid = generateNextUid();
LOG.info("new UID=" + newUid);
ColumbaHeader h = new ColumbaHeader(message.getHeader());
if (attributes != null) {
h.setAttributes((Attributes) attributes.clone());
}
if ( flags != null ) {
h.setFlags((Flags) flags.clone());
}
h.getAttributes().put("columba.uid", newUid);
headerList.add(h, newUid);
messageList.put(newUid, new ColumbaMessage(h, message));
fireMessageAdded(newUid, getFlags(newUid));
return newUid;
}
// in java/org/columba/mail/folder/temp/TempFolder.java
public Object getAttribute(Object uid, String key)
throws Exception {
return ((ColumbaHeader) headerList.get(uid)).getAttributes().get(key);
}
// in java/org/columba/mail/folder/temp/TempFolder.java
public Flags getFlags(Object uid) throws Exception {
return ((ColumbaHeader) headerList.get(uid)).getFlags();
}
// in java/org/columba/mail/folder/temp/TempFolder.java
public Attributes getAttributes(Object uid) throws Exception {
if (getHeaderList().exists(uid)) {
return getHeaderList().get(uid).getAttributes();
} else {
return null;
}
}
// in java/org/columba/mail/folder/temp/TempFolder.java
public Header getHeaderFields(Object uid, String[] keys)
throws Exception {
IColumbaHeader header = ((IColumbaMessage) messageList.get(uid)).getHeader();
Header subHeader = new Header();
String value;
for (int i = 0; i < keys.length; i++) {
value = (String) header.get(keys[i]);
if (value != null) {
subHeader.set(keys[i], value);
}
}
return subHeader;
}
// in java/org/columba/mail/folder/temp/TempFolder.java
public InputStream getMessageSourceStream(Object uid)
throws Exception {
return new SourceInputStream(((IColumbaMessage) messageList.get(uid)).getSource());
}
// in java/org/columba/mail/folder/temp/TempFolder.java
public InputStream getMimePartBodyStream(Object uid, Integer[] address)
throws Exception {
IColumbaMessage message = (IColumbaMessage) messageList.get(uid);
LocalMimePart mimepart = (LocalMimePart) message.getMimePartTree()
.getFromAddress(address);
return mimepart.getInputStream();
}
// in java/org/columba/mail/folder/temp/TempFolder.java
public InputStream getMimePartSourceStream(Object uid, Integer[] address)
throws Exception {
IColumbaMessage message = (IColumbaMessage) messageList.get(uid);
LocalMimePart mimepart = (LocalMimePart) message.getMimePartTree()
.getFromAddress(address);
return new SourceInputStream(mimepart.getSource());
}
// in java/org/columba/mail/folder/temp/TempFolder.java
public void setAttribute(Object uid, String key, Object value)
throws Exception {
// get header with UID
ColumbaHeader header = (ColumbaHeader) getHeaderList().get(uid);
header.getAttributes().put(key, value);
}
// in java/org/columba/mail/folder/temp/TempFolder.java
public Object addMessage(InputStream in) throws Exception {
return addMessage(in, null, null);
}
// in java/org/columba/mail/folder/temp/TempFolder.java
public Object addMessage(IColumbaMessage message) throws Exception {
Object newUid = generateNextUid();
ColumbaHeader h = (ColumbaHeader) ((ColumbaHeader) message.getHeader());
h.getAttributes().put("columba.uid", newUid);
headerList.add(h, newUid);
messageList.put(newUid, message);
return newUid;
}
// in java/org/columba/mail/folder/temp/TempFolder.java
public void removeFolder() throws Exception {
//super.removeFolder();
// do nothing
}
// in java/org/columba/mail/folder/temp/TempFolder.java
public Header getAllHeaderFields(Object uid) throws Exception {
IColumbaHeader header = ((IColumbaMessage) messageList.get(uid)).getHeader();
return header.getHeader();
}
// in java/org/columba/mail/smtp/command/SendAllMessagesCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
// display status message
worker.setDisplayText(MailResourceLoader.getString("statusbar",
"message", "send_message"));
// get Outbox folder from reference
outboxFolder = (OutboxFolder) r.getSourceFolder();
// get UID list of messages
Object[] uids = outboxFolder.getUids();
// save every message in a list
for (int i = 0; i < uids.length; i++) {
if (outboxFolder.exists(uids[i]) == true) {
SendableMessage message = outboxFolder
.getSendableMessage(uids[i]);
sendListManager.add(message);
}
}
int actAccountUid = -1;
List sentList = new Vector();
SMTPServer smtpServer = null;
IMailbox sentFolder = null;
// send all messages
while (sendListManager.hasMoreMessages()) {
SendableMessage message = sendListManager.getNextMessage();
// get account information from message
if (message.getAccountUid() != actAccountUid) {
actAccountUid = message.getAccountUid();
AccountItem accountItem = MailConfig.getInstance()
.getAccountList().uidGet(actAccountUid);
if (accountItem == null) {
// use the default account
accountItem = MailConfig.getInstance().getAccountList()
.getDefaultAccount();
if (accountItem == null)
continue; // skip message if there's no account
// available to send it
}
// Sent folder
sentFolder = (IMailbox) FolderTreeModel
.getInstance()
.getFolder(
accountItem.getSpecialFoldersItem().get("sent"));
// open connection to SMTP server
smtpServer = new SMTPServer(accountItem);
}
smtpServer.sendMessage(message, worker);
sentList.add(message.getHeader().get("columba.uid"));
}
// we are done - clear status text with a delay
// (if this is not done, the initial text will stay in
// case no messages were sent)
worker.clearDisplayTextWithDelay();
// move all successfully send messages to the Sent folder
if (sentList.size() > 0) {
moveToSentFolder(sentList, sentFolder);
sentList.clear();
}
}
// in java/org/columba/mail/smtp/command/SendAllMessagesCommand.java
public void updateGUI() throws Exception {
if (action != null)
action.setEnabled(true);
}
// in java/org/columba/mail/smtp/command/SendMessageCommand.java
public void execute(IWorkerStatusController worker) throws Exception {
ComposerCommandReference r = (ComposerCommandReference) getReference();
if (!validArguments(r))
return;
// display status message
worker.setDisplayText(MailResourceLoader.getString("statusbar",
"message", "send_message_compose"));
// get composer controller
// -> get all the account information from the controller
composerController = r.getComposerController();
// close composer view
if (composerController.getView().getFrame() != null) {
composerController.getView().getFrame().setVisible(false);
}
sendMessageDialog = new SendMessageDialog(worker);
ComposerModel model = ((ComposerModel) composerController.getModel());
AccountItem item = model.getAccountItem();
// sent folder
IMailbox sentFolder = (IMailbox) FolderTreeModel.getInstance()
.getFolder(item.getSpecialFoldersItem().get("sent"));
// get the SendableMessage object
SendableMessage message = null;
try {
// compose the message suitable for sending
message = new MessageComposer(model).compose(worker, r
.isAppendSignature());
} catch (JSCFException e1) {
if (e1 instanceof CancelledException) {
// user cancelled sending operation
// open composer view
showComposer = true;
return;
} else {
JOptionPane.showMessageDialog(FrameManager.getInstance()
.getActiveFrame(), e1.getMessage());
// open composer view
showComposer = true;
return;
}
}
// display status message
worker.setDisplayText(MailResourceLoader.getString("statusbar",
"message", "send_message_connect"));
// open connection
final SMTPServer server = new SMTPServer(item);
// successfully connected and autenthenticated to SMTP server
try {
// display status message
worker.setDisplayText(MailResourceLoader.getString("statusbar",
"message", "send_message"));
IWorkerStatusChangeListener listener = new IWorkerStatusChangeListener() {
public void workerStatusChanged(WorkerStatusChangedEvent e) {
if (e.getSource().cancelled()) {
try {
server.dropConnection();
} catch (IOException e1) {
}
}
}
};
// important for cancel
worker.addWorkerStatusChangeListener(listener);
// send message
server.sendMessage(message, worker);
// not needed anymore
worker.removeWorkerStatusChangeListener(listener);
if (worker.cancelled()) {
showComposer = true;
return;
}
// mark as read
Flags flags = new Flags();
flags.setSeen(true);
message.getHeader().setFlags(flags);
// save message in Sent folder
ComposerCommandReference ref = new ComposerCommandReference(
composerController, sentFolder);
ref.setMessage(message);
SaveMessageCommand c = new SaveMessageCommand(ref);
CommandProcessor.getInstance().addOp(c);
// -> get source reference of message
// when replying this is the original sender's message
// you selected and replied to
IMailFolderCommandReference ref2 = model.getSourceReference();
if (ref2 != null
&& ((IMailbox) ref2.getSourceFolder()).exists(ref2
.getUids()[0])) {
// mark message as answered
ref2.setMarkVariant(MarkMessageCommand.MARK_AS_ANSWERED);
MarkMessageCommand c1 = new MarkMessageCommand(ref2);
CommandProcessor.getInstance().addOp(c1);
}
// display status message
worker.setDisplayText(MailResourceLoader.getString("statusbar",
"message", "send_message_closing"));
// close connection to server
server.closeConnection();
// display status message
worker.setDisplayText(MailResourceLoader.getString("statusbar",
"message", "send_message_success"));
} /*
* catch (SMTPException e) { JOptionPane.showMessageDialog(null,
* e.getMessage(), "Error while sending",
* JOptionPane.ERROR_MESSAGE); // open composer view showComposer =
* true; }
*/catch (Exception e) {
// e.printStackTrace();
// open composer view
showComposer = true;
throw e;
}
}
// in java/org/columba/mail/smtp/command/SendMessageCommand.java
public void updateGUI() throws Exception {
// can no longer assume that sendMessageDialog has been displayed
if (sendMessageDialog != null) {
// close send message dialog
sendMessageDialog.setVisible(false);
}
if (showComposer == true
&& composerController.getView().getFrame() != null) {
// re-open composer view
composerController.getView().getFrame().setVisible(true);
composerController.getView().getFrame().requestFocus();
} else {
// do not prompt user if composer should be really closed
composerController.setPromptOnDialogClosing(false);
// save composer window state
composerController.fireClosed();
}
}
// in java/org/columba/mail/composer/MessageComposer.java
public SendableMessage compose(IWorkerStatusController workerStatusController, boolean appendSignature)
throws Exception {
this.accountUid = model.getAccountItem().getUid();
workerStatusController.setDisplayText("Composing Message...");
MimeTreeRenderer renderer = MimeTreeRenderer.getInstance();
SendableMessage message = new SendableMessage();
SendableHeader header = initHeader();
MimePart root = null;
/*
* *20030921, karlpeder* The old code was (accidentially!?) modifying
* the attachment list of the model. This affects the composing when
* called a second time for saving the message after sending!
*/
//List mimeParts = model.getAttachments();
List attachments = model.getAttachments();
List mimeParts = new ArrayList();
Iterator ite = attachments.iterator();
while (ite.hasNext()) {
mimeParts.add(ite.next());
}
// *20030919, karlpeder* Added handling of html messages
StreamableMimePart body;
if (model.isHtml()) {
// compose message body as multipart/alternative
XmlElement composerOptions = MailConfig.getInstance()
.getComposerOptionsConfig().getRoot()
.getElement("/options");
XmlElement html = composerOptions.getElement("html");
if (html == null) {
html = composerOptions.addSubElement("html");
}
String multipart = html.getAttribute("send_as_multipart", "true");
if (multipart.equals("true")) {
// send as multipart/alternative
body = composeMultipartAlternativeMimePart(appendSignature);
} else {
// send as text/html
body = composeHtmlMimePart(appendSignature);
}
} else {
// compose message body as text/plain
body = composeTextMimePart(appendSignature);
}
if (body != null) {
mimeParts.add(0, body);
}
// Create Multipart/Mixed if necessary
if (mimeParts.size() > 1) {
root = new MimePart(new MimeHeader("multipart", "mixed"));
for (int i = 0; i < mimeParts.size(); i++) {
root.addChild((StreamableMimePart) mimeParts.get(i));
}
} else {
root = (MimePart) mimeParts.get(0);
}
if (model.isSignMessage()) {
SecurityItem item = model.getAccountItem().getPGPItem();
String idStr = item.get("id");
// if the id not currently set (for example in the security panel in
// the account-config
if ((idStr == null) || (idStr.length() == 0)) {
// Set id on from address
item.setString("id", model.getAccountItem().getIdentity()
.getAddress().getMailAddress());
}
PGPMimePart signPart = new PGPMimePart(new MimeHeader("multipart",
"signed"), item);
signPart.addChild(root);
root = signPart;
}
if (model.isEncryptMessage()) {
SecurityItem item = model.getAccountItem().getPGPItem();
// Set recipients from the recipients vector
List recipientList = model.getRCPTVector();
StringBuffer recipientBuf = new StringBuffer();
for (Iterator it = recipientList.iterator(); it.hasNext();) {
recipientBuf.append((String) it.next());
}
item.setString("recipients", recipientBuf.toString());
PGPMimePart signPart = new PGPMimePart(new MimeHeader("multipart",
"encrypted"), item);
signPart.addChild(root);
root = signPart;
}
header.setRecipients(model.getRCPTVector());
List headerItemList;
headerItemList = model.getToList();
if ( ( headerItemList != null ) && (headerItemList.size() > 0) ){
Address adr = null;
try {
adr = Address.parse((String) headerItemList.get(0));
header.getAttributes().put("columba.to", adr);
} catch (ParserException e) {
if (Logging.DEBUG)
e.printStackTrace();
}
}
headerItemList = model.getCcList();
if ( ( headerItemList != null ) && (headerItemList.size() > 0) ) {
Address adr = null;
try {
adr = Address.parse((String) headerItemList.get(0));
header.getAttributes().put("columba.cc", adr);
} catch (ParserException e) {
if (Logging.DEBUG)
e.printStackTrace();
}
}
root.getHeader().getHeader().merge(header.getHeader());
InputStream in = renderer.renderMimePart(root);
// size
int size = in.available() / 1024;
header.getAttributes().put("columba.size", new Integer(size));
message.setHeader(header);
message.setAccountUid(accountUid);
//Do not access the inputstream after this line!
message.setSourceStream(in);
return message;
}