Search in sources :

Example 11 with TargetConstraint

use of com.zimbra.cs.mailbox.MailItem.TargetConstraint in project zm-mailbox by Zimbra.

the class ItemActionHelper method executeRemote.

private ItemActionResult executeRemote() throws ServiceException, IOException, HttpException {
    Account target = Provisioning.getInstance().get(Key.AccountBy.id, mIidFolder.getAccountId());
    AuthToken at = getAuthToken();
    String pxyAuthToken = Provisioning.onLocalServer(target) ? null : at.getProxyAuthToken();
    ZAuthToken zat = null;
    if (pxyAuthToken == null) {
        zat = at.toZAuthToken();
        zat.resetProxyAuthToken();
    } else {
        zat = new ZAuthToken(pxyAuthToken);
    }
    ZMailbox.Options zoptions = new ZMailbox.Options(zat, AccountUtil.getSoapUri(target));
    zoptions.setNoSession(true);
    zoptions.setTargetAccount(target.getId());
    zoptions.setTargetAccountBy(Key.AccountBy.id);
    ZMailbox zmbx = ZMailbox.getMailbox(zoptions);
    zmbx.setName(target.getName());
    /* need this when logging in using another user's auth */
    // check for mountpoints before going any further...
    ZFolder zfolder = zmbx.getFolderById(mIidFolder.toString(mAuthenticatedAccount));
    if (zfolder instanceof ZMountpoint) {
        ItemId iidTarget = new ItemId(((ZMountpoint) zfolder).getCanonicalRemoteId(), mAuthenticatedAccount.getId());
        if (!mIidFolder.equals(iidTarget)) {
            mIidFolder = iidTarget;
            if (++mHopCount > com.zimbra.soap.ZimbraSoapContext.MAX_HOP_COUNT)
                throw MailServiceException.TOO_MANY_HOPS(mIidRequestedFolder);
            schedule();
            return ItemActionResult.create(mOperation);
        }
    }
    boolean deleteOriginal = mOperation != Op.COPY;
    String folderStr = mIidFolder.toString();
    List<String> createdIds = new ArrayList<String>(itemIds.length);
    List<String> nonExistentIds = new ArrayList<String>();
    boolean toSpam = mIidFolder.getId() == Mailbox.ID_FOLDER_SPAM;
    boolean toMailbox = !toSpam && mIidFolder.getId() != Mailbox.ID_FOLDER_TRASH;
    for (MailItem item : mMailbox.getItemById(mOpCtxt, itemIds, type)) {
        if (item == null) {
            continue;
        }
        List<Message> msgs = null;
        if (item instanceof Conversation) {
            msgs = mMailbox.getMessagesByConversation(mOpCtxt, item.getId(), SortBy.DATE_ASC, -1);
        }
        if (deleteOriginal) {
            if (msgs != null) {
                // determine which of the conversation's component messages are actually able to be moved
                boolean permDenied = false;
                for (Iterator<Message> it = msgs.iterator(); it.hasNext(); ) {
                    Message msg = it.next();
                    if (!TargetConstraint.checkItem(mTargetConstraint, msg)) {
                        it.remove();
                    } else if (!canDelete(msg)) {
                        it.remove();
                        permDenied = true;
                    }
                }
                // stop here if no messages would be moved...
                if (msgs.isEmpty()) {
                    if (permDenied) {
                        throw ServiceException.PERM_DENIED("cannot delete any messages in " + item.getType() + " " + item.getId());
                    }
                    // all messages were excluded by the TargetConstraint, so there's no failure...
                    continue;
                }
            } else {
                if (!canDelete(item)) {
                    throw ServiceException.PERM_DENIED("cannot delete existing copy of " + item.getType() + " " + item.getId());
                }
            }
        }
        boolean fromSpam = item.inSpam();
        if ((fromSpam && toMailbox) || (!fromSpam && toSpam)) {
            try {
                Folder dest = mMailbox.getFolderById(mOpCtxt, mIidFolder.getId());
                SpamReport report = new SpamReport(toSpam, "remote " + mOperation, dest.getPath());
                Folder source = mMailbox.getFolderById(mOpCtxt, item.getFolderId());
                report.setSourceFolderPath(source.getPath());
                report.setDestAccountName(target.getName());
                SpamHandler.getInstance().handle(mOpCtxt, mMailbox, item.getId(), item.getType(), report);
            } catch (OutOfMemoryError e) {
                Zimbra.halt("out of memory", e);
            } catch (Throwable t) {
                ZimbraLog.mailop.info("could not train spam filter: " + new ItemId(item).toString(), t);
            }
        }
        // since we can't apply tags to a remote object, hardwiring "tags" to null below...
        String flags = (mOperation == Op.UPDATE && mFlags != null ? mFlags : item.getFlagString());
        String name = ((mOperation == Op.RENAME || mOperation == Op.UPDATE) && mName != null ? mName : item.getName());
        String createdId = null;
        InputStream in = null;
        switch(item.getType()) {
            case CONTACT:
                Contact ct = (Contact) item;
                Map<String, ZMailbox.ZAttachmentInfo> attachments = new HashMap<String, ZMailbox.ZAttachmentInfo>();
                for (Contact.Attachment att : ct.getAttachments()) {
                    String attachmentId = zmbx.uploadAttachment(att.getFilename(), att.getContent(), att.getContentType(), 0);
                    ZMailbox.ZAttachmentInfo info = new ZMailbox.ZAttachmentInfo().setAttachmentId(attachmentId);
                    attachments.put(att.getName(), info);
                }
                Map<String, String> fields = ct.getFields();
                Map<String, String> members = new HashMap<String, String>();
                for (String key : fields.keySet()) {
                    if (ContactConstants.A_groupMember.equals(key)) {
                        String memberEncoded = fields.get(key);
                        ContactGroup group = ContactGroup.init(memberEncoded);
                        for (Member m : group.getMembers()) {
                            members.put(m.getValue(), m.getType().getSoapEncoded());
                        }
                        break;
                    }
                }
                fields.remove(ContactConstants.A_groupMember);
                ZContact contact = zmbx.createContact(folderStr, null, fields, attachments, members);
                createdId = contact.getId();
                createdIds.add(createdId);
                break;
            case MESSAGE:
                try {
                    in = StoreManager.getInstance().getContent(item.getBlob());
                    createdId = zmbx.addMessage(folderStr, flags, (String) null, item.getDate(), in, item.getSize(), true);
                } finally {
                    ByteUtil.closeStream(in);
                }
                createdIds.add(createdId);
                break;
            case VIRTUAL_CONVERSATION:
            case CONVERSATION:
                for (Message msg : msgs) {
                    flags = (mOperation == Op.UPDATE && mFlags != null ? mFlags : msg.getFlagString());
                    try {
                        in = StoreManager.getInstance().getContent(msg.getBlob());
                        createdId = zmbx.addMessage(folderStr, flags, (String) null, msg.getDate(), in, msg.getSize(), true);
                    } finally {
                        ByteUtil.closeStream(in);
                    }
                    createdIds.add(createdId);
                }
                break;
            case DOCUMENT:
                Document doc = (Document) item;
                SoapHttpTransport transport = new SoapHttpTransport(zoptions.getUri());
                try {
                    in = StoreManager.getInstance().getContent(doc.getBlob());
                    String uploadId = zmbx.uploadContentAsStream(name, in, doc.getContentType(), doc.getSize(), 4000, true);
                    // instead of using convenience method from ZMailbox
                    // we need to hand marshall the request and set the
                    // response protocol explicitly to what was requested
                    // from the client.
                    Element req = new XMLElement(MailConstants.SAVE_DOCUMENT_REQUEST);
                    Element edoc = req.addUniqueElement(MailConstants.E_DOC);
                    edoc.addAttribute(MailConstants.A_NAME, name);
                    edoc.addAttribute(MailConstants.A_FOLDER, folderStr);
                    edoc.addAttribute(MailConstants.A_FLAGS, flags);
                    Element upload = edoc.addNonUniqueElement(MailConstants.E_UPLOAD);
                    upload.addAttribute(MailConstants.A_ID, uploadId);
                    transport.setResponseProtocol(mResponseProtocol);
                    transport.setAuthToken(zat);
                    Element response = transport.invoke(req);
                    createdId = response.getElement(MailConstants.E_DOC).getAttribute(MailConstants.A_ID);
                } finally {
                    ByteUtil.closeStream(in);
                    transport.shutdown();
                }
                createdIds.add(createdId);
                break;
            case APPOINTMENT:
            case TASK:
                CalendarItem cal = (CalendarItem) item;
                // private calendar item may not be moved by non-owner unless permission was granted
                if (!cal.isPublic()) {
                    boolean asAdmin = mOpCtxt != null ? mOpCtxt.isUsingAdminPrivileges() : false;
                    if (!cal.allowPrivateAccess(mAuthenticatedAccount, asAdmin))
                        throw ServiceException.PERM_DENIED("you do not have permission to move/copy a private calendar item from the current folder/mailbox");
                }
                // Move the item to remote mailbox using SetAppointmentRequest/SetTaskRequest.
                QName qname = (item.getType() == MailItem.Type.TASK ? MailConstants.SET_TASK_REQUEST : MailConstants.SET_APPOINTMENT_REQUEST);
                Element request = new Element.XMLElement(qname).addAttribute(MailConstants.A_FOLDER, folderStr).addAttribute(MailConstants.A_FLAGS, flags);
                ToXML.encodeAlarmTimes(request, cal);
                Invite invDefault = cal.getDefaultInviteOrNull();
                // Takeover as organizer if we're doing a MOVE and source mailbox is the organizer.
                // Don't takeover in a COPY operation.
                boolean takeoverAsOrganizer = false;
                boolean blockMove = false;
                if (Op.MOVE.equals(mOperation)) {
                    Invite inv = invDefault;
                    if (inv == null) {
                        // no default invite; let's use the first invite
                        Invite[] invs = cal.getInvites();
                        if (invs != null && invs.length > 0)
                            inv = invs[0];
                    }
                    takeoverAsOrganizer = inv != null && inv.isOrganizer();
                    blockMove = takeoverAsOrganizer && inv.hasOtherAttendees();
                }
                if (blockMove) {
                    throw MailServiceException.INVALID_REQUEST("This operation requires change of organizer and it is not permitted", null);
                }
                if (invDefault != null) {
                    addCalendarPart(request.addUniqueElement(MailConstants.A_DEFAULT), cal, invDefault, zmbx, target, takeoverAsOrganizer);
                }
                for (Invite inv : cal.getInvites()) {
                    if (inv == null || inv == invDefault)
                        continue;
                    String elem = inv.isCancel() ? MailConstants.E_CAL_CANCEL : MailConstants.E_CAL_EXCEPT;
                    addCalendarPart(request.addNonUniqueElement(elem), cal, inv, zmbx, target, takeoverAsOrganizer);
                }
                ToXML.encodeCalendarReplies(request, cal);
                createdId = zmbx.invoke(request).getAttribute(MailConstants.A_CAL_ID);
                createdIds.add(createdId);
                break;
            default:
                throw MailServiceException.CANNOT_COPY(item.getId());
        }
        try {
            if (deleteOriginal && !mIdFormatter.formatItemId(item).equals(createdId)) {
                List<Integer> nonExistentItems = new ArrayList<Integer>();
                if (msgs == null) {
                    mMailbox.delete(mOpCtxt, new int[] { item.getId() }, item.getType(), null, nonExistentItems);
                } else {
                    for (Message msg : msgs) {
                        mMailbox.delete(mOpCtxt, new int[] { msg.getId() }, msg.getType(), null, nonExistentItems);
                    }
                }
                for (Integer id : nonExistentItems) {
                    nonExistentIds.add(id.toString());
                }
            }
        } catch (ServiceException e) {
            if (e.getCode() != ServiceException.PERM_DENIED)
                throw e;
            // something funky happened permissions-wise between the getEffectivePermissions check and here...
            ZimbraLog.misc.info("could not delete original item " + item.getId() + "; treating operation as a copy instead");
        }
    }
    ItemActionResult result = ItemActionResult.create(mOperation);
    if (Op.HARD_DELETE.equals(mOperation)) {
        ((DeleteActionResult) result).setNonExistentIds(nonExistentIds);
    } else if (Op.COPY.equals(mOperation)) {
        ((CopyActionResult) result).setCreatedIds(createdIds);
    }
    for (int itemId : itemIds) {
        result.appendSuccessId(Integer.toString(itemId));
    }
    return result;
}
Also used : ZMountpoint(com.zimbra.client.ZMountpoint) Account(com.zimbra.cs.account.Account) Message(com.zimbra.cs.mailbox.Message) MimeMessage(javax.mail.internet.MimeMessage) HashMap(java.util.HashMap) Element(com.zimbra.common.soap.Element) XMLElement(com.zimbra.common.soap.Element.XMLElement) ArrayList(java.util.ArrayList) Conversation(com.zimbra.cs.mailbox.Conversation) Folder(com.zimbra.cs.mailbox.Folder) ZFolder(com.zimbra.client.ZFolder) Document(com.zimbra.cs.mailbox.Document) XMLElement(com.zimbra.common.soap.Element.XMLElement) ZAuthToken(com.zimbra.common.auth.ZAuthToken) ItemId(com.zimbra.cs.service.util.ItemId) CalendarItem(com.zimbra.cs.mailbox.CalendarItem) ZMailbox(com.zimbra.client.ZMailbox) ZFolder(com.zimbra.client.ZFolder) SoapHttpTransport(com.zimbra.common.soap.SoapHttpTransport) Member(com.zimbra.cs.mailbox.ContactGroup.Member) InputStream(java.io.InputStream) QName(org.dom4j.QName) ZMountpoint(com.zimbra.client.ZMountpoint) TargetConstraint(com.zimbra.cs.mailbox.MailItem.TargetConstraint) Mountpoint(com.zimbra.cs.mailbox.Mountpoint) ZContact(com.zimbra.client.ZContact) Contact(com.zimbra.cs.mailbox.Contact) MailItem(com.zimbra.cs.mailbox.MailItem) ServiceException(com.zimbra.common.service.ServiceException) MailServiceException(com.zimbra.cs.mailbox.MailServiceException) SpamReport(com.zimbra.cs.service.util.SpamHandler.SpamReport) AuthToken(com.zimbra.cs.account.AuthToken) ZAuthToken(com.zimbra.common.auth.ZAuthToken) ContactGroup(com.zimbra.cs.mailbox.ContactGroup) Invite(com.zimbra.cs.mailbox.calendar.Invite) ZContact(com.zimbra.client.ZContact)

Example 12 with TargetConstraint

use of com.zimbra.cs.mailbox.MailItem.TargetConstraint in project zm-mailbox by Zimbra.

the class ItemAction method handleCommon.

protected ItemActionResult handleCommon(Map<String, Object> context, Element request, MailItem.Type type) throws ServiceException {
    Element action = request.getElement(MailConstants.E_ACTION);
    ZimbraSoapContext zsc = getZimbraSoapContext(context);
    Mailbox mbox = getRequestedMailbox(zsc);
    OperationContext octxt = getOperationContext(zsc, context);
    SoapProtocol responseProto = zsc.getResponseProtocol();
    // determine the requested operation
    boolean flagValue = !isOperationFlagged(request);
    String opStr = getOperation(request);
    // figure out which items are local and which ones are remote, and proxy accordingly
    List<Integer> local = new ArrayList<Integer>();
    Map<String, StringBuilder> remote = new HashMap<String, StringBuilder>();
    partitionItems(zsc, action.getAttribute(MailConstants.A_ID), local, remote);
    if (remote.isEmpty() && local.isEmpty()) {
        return ItemActionResult.create(opStr);
    }
    // for moves/copies, make sure that we're going to receive notifications from the target folder
    Account remoteNotify = forceRemoteSession(zsc, context, octxt, opStr, action);
    // handle referenced items living on other servers
    ItemActionResult result = proxyRemoteItems(action, remote, request, context);
    // handle referenced items living on this server
    if (!local.isEmpty()) {
        String constraint = action.getAttribute(MailConstants.A_TARGET_CONSTRAINT, null);
        TargetConstraint tcon = TargetConstraint.parseConstraint(mbox, constraint);
        ItemActionResult localResults;
        // set additional parameters (depends on op type)
        if (opStr.equals(MailConstants.OP_TAG)) {
            String tagName = action.getAttribute(MailConstants.A_TAG_NAMES, null);
            if (tagName == null) {
                if (action.getAttribute(MailConstants.A_TAG) == null) {
                    throw ServiceException.INVALID_REQUEST("missing required attribute: " + MailConstants.A_TAG_NAMES, null);
                }
                tagName = TagUtil.tagIdToName(mbox, octxt, (int) action.getAttributeLong(MailConstants.A_TAG));
            }
            localResults = ItemActionHelper.TAG(octxt, mbox, responseProto, local, type, tagName, flagValue, tcon).getResult();
        } else if (opStr.equals(MailConstants.OP_FLAG)) {
            localResults = ItemActionHelper.FLAG(octxt, mbox, responseProto, local, type, flagValue, tcon).getResult();
        } else if (opStr.equals(MailConstants.OP_PRIORITY)) {
            localResults = ItemActionHelper.PRIORITY(octxt, mbox, responseProto, local, type, flagValue, tcon).getResult();
        } else if (opStr.equals(MailConstants.OP_READ)) {
            localResults = ItemActionHelper.READ(octxt, mbox, responseProto, local, type, flagValue, tcon).getResult();
        } else if (opStr.equals(MailConstants.OP_COLOR)) {
            Color color = getColor(action);
            localResults = ItemActionHelper.COLOR(octxt, mbox, responseProto, local, type, tcon, color).getResult();
        } else if (opStr.equals(MailConstants.OP_HARD_DELETE)) {
            localResults = ItemActionHelper.HARD_DELETE(octxt, mbox, responseProto, local, type, tcon).getResult();
        } else if (opStr.equals(MailConstants.OP_RECOVER)) {
            ItemId iidFolder = new ItemId(action.getAttribute(MailConstants.A_FOLDER), zsc);
            localResults = ItemActionHelper.RECOVER(octxt, mbox, responseProto, local, type, tcon, iidFolder).getResult();
        } else if (opStr.equals(MailConstants.OP_DUMPSTER_DELETE)) {
            localResults = ItemActionHelper.DUMPSTER_DELETE(octxt, mbox, responseProto, local, type, tcon).getResult();
        } else if (opStr.equals(MailConstants.OP_TRASH)) {
            localResults = handleTrashOperation(octxt, request, mbox, responseProto, local, type, tcon);
        } else if (opStr.equals(MailConstants.OP_MOVE)) {
            localResults = handleMoveOperation(zsc, octxt, request, action, mbox, responseProto, local, type, tcon);
        } else if (opStr.equals(MailConstants.OP_COPY)) {
            ItemId iidFolder = new ItemId(action.getAttribute(MailConstants.A_FOLDER), zsc);
            localResults = ItemActionHelper.COPY(octxt, mbox, responseProto, local, type, tcon, iidFolder).getResult();
        } else if (opStr.equals(MailConstants.OP_SPAM)) {
            String defaultFolder = (flagValue ? Mailbox.ID_FOLDER_SPAM : Mailbox.ID_FOLDER_INBOX) + "";
            ItemId iidFolder = new ItemId(action.getAttribute(MailConstants.A_FOLDER, defaultFolder), zsc);
            localResults = ItemActionHelper.SPAM(octxt, mbox, responseProto, local, type, flagValue, tcon, iidFolder).getResult();
        } else if (opStr.equals(MailConstants.OP_RENAME)) {
            String name = action.getAttribute(MailConstants.A_NAME);
            ItemId iidFolder = new ItemId(action.getAttribute(MailConstants.A_FOLDER, "-1"), zsc);
            localResults = ItemActionHelper.RENAME(octxt, mbox, responseProto, local, type, tcon, name, iidFolder).getResult();
        } else if (opStr.equals(MailConstants.OP_UPDATE)) {
            String folderId = action.getAttribute(MailConstants.A_FOLDER, null);
            ItemId iidFolder = null;
            if (folderId != null) {
                iidFolder = new ItemId(folderId, zsc);
                if (!iidFolder.belongsTo(mbox)) {
                    throw ServiceException.INVALID_REQUEST("cannot move item between mailboxes", null);
                } else if (iidFolder.getId() <= 0) {
                    throw MailServiceException.NO_SUCH_FOLDER(iidFolder.getId());
                }
            }
            String name = action.getAttribute(MailConstants.A_NAME, null);
            String flags = action.getAttribute(MailConstants.A_FLAGS, null);
            String[] tags = TagUtil.parseTags(action, mbox, octxt);
            Color color = getColor(action);
            localResults = ItemActionHelper.UPDATE(octxt, mbox, responseProto, local, type, tcon, name, iidFolder, flags, tags, color).getResult();
        } else if (opStr.equals(MailConstants.OP_LOCK)) {
            localResults = ItemActionHelper.LOCK(octxt, mbox, responseProto, local, type, tcon).getResult();
        } else if (opStr.equals(MailConstants.OP_UNLOCK)) {
            localResults = ItemActionHelper.UNLOCK(octxt, mbox, responseProto, local, type, tcon).getResult();
        } else if (opStr.equals(MailConstants.OP_INHERIT)) {
            mbox.alterTag(octxt, ArrayUtil.toIntArray(local), type, Flag.FlagInfo.NO_INHERIT, false, tcon);
            localResults = new ItemActionResult(local);
        } else if (opStr.equals(MailConstants.OP_MUTE) && type == MailItem.Type.CONVERSATION) {
            // note that "mute" ignores the tcon value
            localResults = ItemActionHelper.TAG(octxt, mbox, responseProto, local, type, Flag.FlagInfo.MUTED.toString(), flagValue, null).getResult();
            if (flagValue) {
                // when marking muted, items are also marked read
                ItemActionHelper.READ(octxt, mbox, responseProto, local, type, flagValue, null).getResult();
            }
        } else if (opStr.equals(MailConstants.OP_RESET_IMAP_UID)) {
            mbox.resetImapUid(octxt, local);
            localResults = new ItemActionResult(local);
        } else {
            throw ServiceException.INVALID_REQUEST("unknown operation: " + opStr, null);
        }
        result.appendSuccessIds(localResults.getSuccessIds());
        if (opStr.equals(MailConstants.OP_HARD_DELETE)) {
            ((DeleteActionResult) result).appendNonExistentIds(localResults);
        } else if (opStr.equals(MailConstants.OP_COPY)) {
            ((CopyActionResult) result).appendCreatedIds(localResults);
        }
    }
    // for moves/copies, make sure that we received notifications from the target folder
    if (remoteNotify != null) {
        proxyRequest(zsc.createElement(MailConstants.NO_OP_REQUEST), context, remoteNotify.getId());
    }
    // check if default calendar is deleted, if yes, reset default calendar id
    Integer defaultCalId = mbox.getAccount().getPrefDefaultCalendarId();
    if (defaultCalId != null && (opStr.equals(MailConstants.OP_TRASH) || opStr.equals(MailConstants.OP_HARD_DELETE)) && result.mSuccessIds.contains(defaultCalId.toString())) {
        ZimbraLog.mailbox.info("Default calendar deleted, so setting default calendar back to \"Calendar\"");
        mbox.resetDefaultCalendarId();
    }
    return result;
}
Also used : OperationContext(com.zimbra.cs.mailbox.OperationContext) Account(com.zimbra.cs.account.Account) HashMap(java.util.HashMap) TargetConstraint(com.zimbra.cs.mailbox.MailItem.TargetConstraint) Element(com.zimbra.common.soap.Element) Color(com.zimbra.common.mailbox.Color) SoapProtocol(com.zimbra.common.soap.SoapProtocol) ArrayList(java.util.ArrayList) ItemId(com.zimbra.cs.service.util.ItemId) Mailbox(com.zimbra.cs.mailbox.Mailbox) ZMailbox(com.zimbra.client.ZMailbox) ZimbraSoapContext(com.zimbra.soap.ZimbraSoapContext)

Example 13 with TargetConstraint

use of com.zimbra.cs.mailbox.MailItem.TargetConstraint in project zm-mailbox by Zimbra.

the class DeleteItem method redo.

@Override
public void redo() throws Exception {
    int mboxId = getMailboxId();
    Mailbox mbox = MailboxManager.getInstance().getMailboxById(mboxId);
    TargetConstraint tcon = null;
    if (mConstraint != null)
        try {
            tcon = TargetConstraint.parseConstraint(mbox, mConstraint);
        } catch (ServiceException e) {
            mLog.warn(e);
        }
    try {
        mbox.delete(getOperationContext(), mIds, type, tcon);
    } catch (MailServiceException.NoSuchItemException e) {
        if (mLog.isInfoEnabled()) {
            mLog.info("Some of the items being deleted were already deleted from mailbox " + mboxId);
        }
    }
}
Also used : Mailbox(com.zimbra.cs.mailbox.Mailbox) ServiceException(com.zimbra.common.service.ServiceException) MailServiceException(com.zimbra.cs.mailbox.MailServiceException) TargetConstraint(com.zimbra.cs.mailbox.MailItem.TargetConstraint) MailServiceException(com.zimbra.cs.mailbox.MailServiceException) TargetConstraint(com.zimbra.cs.mailbox.MailItem.TargetConstraint)

Aggregations

TargetConstraint (com.zimbra.cs.mailbox.MailItem.TargetConstraint)13 ServiceException (com.zimbra.common.service.ServiceException)6 Mailbox (com.zimbra.cs.mailbox.Mailbox)6 ZFolder (com.zimbra.client.ZFolder)5 ArrayList (java.util.ArrayList)5 ZimbraMailItem (com.zimbra.common.mailbox.ZimbraMailItem)4 DbMailItem (com.zimbra.cs.db.DbMailItem)4 OperationContext (com.zimbra.cs.mailbox.OperationContext)4 ItemId (com.zimbra.cs.service.util.ItemId)4 ZMailbox (com.zimbra.client.ZMailbox)3 Element (com.zimbra.common.soap.Element)3 Account (com.zimbra.cs.account.Account)3 MailServiceException (com.zimbra.cs.mailbox.MailServiceException)3 CreateMountpoint (com.zimbra.cs.redolog.op.CreateMountpoint)3 RefreshMountpoint (com.zimbra.cs.redolog.op.RefreshMountpoint)3 HashMap (java.util.HashMap)3 ZMountpoint (com.zimbra.client.ZMountpoint)2 Color (com.zimbra.common.mailbox.Color)2 SoapProtocol (com.zimbra.common.soap.SoapProtocol)2 DbTag (com.zimbra.cs.db.DbTag)2