001: package org.columba.mail.folder.command;
002:
003: import java.net.URI;
004: import java.net.URISyntaxException;
005: import java.util.Hashtable;
006: import java.util.Map.Entry;
007: import java.util.logging.Logger;
008:
009: import org.columba.api.command.IWorkerStatusController;
010: import org.columba.core.association.AssociationStore;
011: import org.columba.core.command.Command;
012: import org.columba.core.folder.api.IFolder;
013: import org.columba.mail.command.IMailFolderCommandReference;
014: import org.columba.mail.folder.IMailbox;
015: import org.columba.mail.folder.virtual.VirtualFolder;
016: import org.columba.mail.folder.virtual.VirtualHeader;
017: import org.columba.mail.message.IHeaderList;
018:
019: public class TagMessageCommand extends Command {
020:
021: public final static int ADD_TAG = 0;
022:
023: public final static int REMOVE_TAG = 1;
024:
025: private static final Logger LOG = Logger
026: .getLogger("org.columba.mail.folder.command.TagMessageCommand");
027:
028: private int type;
029:
030: private String id;
031:
032: public TagMessageCommand(IMailFolderCommandReference theReference,
033: int type, String id) {
034: super (theReference);
035: this .type = type;
036: this .id = id;
037: }
038:
039: @Override
040: public void execute(IWorkerStatusController worker)
041: throws Exception {
042: // get array of source references
043: IMailFolderCommandReference r = (IMailFolderCommandReference) getReference();
044:
045: // does not work: r.getFolderName()
046: // does not work: r.getMessage().getUID()
047:
048: // get source folder
049: IMailbox srcFolder = (IMailbox) r.getSourceFolder();
050:
051: Hashtable<Object, IFolder> mails = new Hashtable<Object, IFolder>();
052:
053: // check if virtual folder, if yes, do not use these uids, use the
054: // real uids instead
055: if (srcFolder instanceof VirtualFolder) {
056: // get original folder
057: try {
058:
059: IHeaderList hl = ((IMailbox) r.getSourceFolder())
060: .getHeaderList();
061: for (Object uid : r.getUids()) {
062: // should be virtual
063: mails.put(
064: ((VirtualHeader) hl.get(uid)).getSrcUid(),
065: ((VirtualHeader) hl.get(uid))
066: .getSrcFolder());
067: }
068: } catch (Exception e) {
069: LOG
070: .severe("Error getting header list from virtual folder");
071: e.printStackTrace();
072: }
073: } else {
074: for (Object uid : r.getUids()) {
075: mails.put(uid, r.getSourceFolder());
076: }
077: }
078:
079: if (type == ADD_TAG) {
080: for (Entry<Object, IFolder> entry : mails.entrySet()) {
081: AssociationStore.getInstance().addAssociation(
082: "tagging",
083: id,
084: createURI(entry.getValue().getId(),
085: entry.getKey()).toString());
086: }
087: } else if (type == REMOVE_TAG) {
088: for (Entry<Object, IFolder> entry : mails.entrySet()) {
089: AssociationStore.getInstance().removeAssociation(
090: "tagging",
091: id,
092: createURI(entry.getValue().getId(),
093: entry.getKey()).toString());
094: }
095: }
096: }
097:
098: // TODO @author hubms: copied from frederiks search builder
099: public static URI createURI(String folderId, Object messageId) {
100: URI uri = null;
101: try {
102: uri = new URI("columba://org.columba.mail/" + folderId
103: + "/" + messageId);
104: } catch (URISyntaxException e) {
105: e.printStackTrace();
106: }
107: return uri;
108: }
109:
110: }
|