Search in sources :

Example 1 with TimeZoneMap

use of com.zimbra.common.calendar.TimeZoneMap in project zm-mailbox by Zimbra.

the class CalendarUtils method parseInviteForDeclineCounter.

static ParseMimeMessage.InviteParserResult parseInviteForDeclineCounter(Account account, MailItem.Type type, Element inviteElem) throws ServiceException {
    TimeZoneMap tzMap = new TimeZoneMap(Util.getAccountTimeZone(account));
    Invite inv = new Invite(ICalTok.DECLINECOUNTER.toString(), tzMap, false);
    CalendarUtils.parseInviteElementCommon(account, type, inviteElem, inv, true, true);
    // UID
    String uid = inv.getUid();
    if (uid == null || uid.length() == 0)
        throw ServiceException.INVALID_REQUEST("Missing uid in a decline counter invite", null);
    // ORGANIZER
    if (!inv.hasOrganizer())
        throw ServiceException.INVALID_REQUEST("Missing organizer in a decline counter invite", null);
    // DTSTAMP
    if (inv.getDTStamp() == 0) {
        //zdsync
        inv.setDtStamp(new Date().getTime());
    }
    inv.setLocalOnly(false);
    ZVCalendar iCal = inv.newToICalendar(true);
    String summaryStr = inv.getName() != null ? inv.getName() : "";
    ParseMimeMessage.InviteParserResult toRet = new ParseMimeMessage.InviteParserResult();
    toRet.mCal = iCal;
    toRet.mUid = inv.getUid();
    toRet.mSummary = summaryStr;
    toRet.mInvite = inv;
    return toRet;
}
Also used : ZVCalendar(com.zimbra.common.calendar.ZCalendar.ZVCalendar) TimeZoneMap(com.zimbra.common.calendar.TimeZoneMap) Invite(com.zimbra.cs.mailbox.calendar.Invite) Date(java.util.Date)

Example 2 with TimeZoneMap

use of com.zimbra.common.calendar.TimeZoneMap in project zm-mailbox by Zimbra.

the class CancelCalendarItem method handle.

@Override
public Element handle(Element request, Map<String, Object> context) throws ServiceException {
    ZimbraSoapContext zsc = getZimbraSoapContext(context);
    Account acct = getRequestedAccount(zsc);
    Mailbox mbox = getRequestedMailbox(zsc);
    OperationContext octxt = getOperationContext(zsc, context);
    ItemId iid = new ItemId(request.getAttribute(MailConstants.A_ID), zsc);
    if (!iid.hasSubpart())
        throw ServiceException.INVALID_REQUEST("missing invId subpart: id should be specified as \"item-inv\"", null);
    int compNum = (int) request.getAttributeLong(MailConstants.E_INVITE_COMPONENT);
    CalendarItem calItem = mbox.getCalendarItemById(octxt, iid.getId());
    if (calItem == null)
        throw MailServiceException.NO_SUCH_CALITEM(iid.getId(), " for CancelCalendarItemRequest(" + iid + "," + compNum + ")");
    if (calItem.inTrash())
        throw ServiceException.INVALID_REQUEST("cannot cancel a calendar item under trash", null);
    // We probably don't want to bother with conflict check for a cancel request...
    Invite inv = calItem.getInvite(iid.getSubpartId(), compNum);
    if (inv == null)
        throw MailServiceException.INVITE_OUT_OF_DATE(iid.toString());
    MailSendQueue sendQueue = new MailSendQueue();
    try {
        Element recurElt = request.getOptionalElement(MailConstants.E_INSTANCE);
        if (recurElt != null) {
            TimeZoneMap tzmap = inv.getTimeZoneMap();
            Element tzElem = request.getOptionalElement(MailConstants.E_CAL_TZ);
            ICalTimeZone tz = null;
            if (tzElem != null) {
                tz = CalendarUtils.parseTzElement(tzElem);
                tzmap.add(tz);
            }
            RecurId recurId = CalendarUtils.parseRecurId(recurElt, tzmap);
            // trace logging
            ZimbraLog.calendar.info("<CancelCalendarItem> id=%d, folderId=%d, subject=\"%s\", UID=%s, recurId=%s", calItem.getId(), calItem.getFolderId(), inv.isPublic() ? inv.getName() : "(private)", calItem.getUid(), recurId.getDtZ());
            Element msgElem = request.getOptionalElement(MailConstants.E_MSG);
            cancelInstance(zsc, octxt, msgElem, acct, mbox, calItem, inv, recurId, inv.getAttendees(), sendQueue);
        } else {
            // if recur is not set, then we're canceling the entire calendar item...
            // trace logging
            ZimbraLog.calendar.info("<CancelCalendarItem> id=%d, folderId=%d, subject=\"%s\", UID=%s", calItem.getId(), calItem.getFolderId(), inv.isPublic() ? inv.getName() : "(private)", calItem.getUid());
            Invite seriesInv = calItem.getDefaultInviteOrNull();
            if (seriesInv != null) {
                if (seriesInv.getMethod().equals(ICalTok.REQUEST.toString()) || seriesInv.getMethod().equals(ICalTok.PUBLISH.toString())) {
                    if (seriesInv.isOrganizer()) {
                        // Send cancel notice to attendees who were invited to exception instances only.
                        // These attendees need to be notified separately because they aren't included in the series
                        // cancel notice.
                        List<ZAttendee> atsSeries = seriesInv.getAttendees();
                        Invite[] invs = calItem.getInvites();
                        long now = octxt != null ? octxt.getTimestamp() : System.currentTimeMillis();
                        for (Invite exceptInv : invs) {
                            if (exceptInv != seriesInv) {
                                String mthd = exceptInv.getMethod();
                                if ((mthd.equals(ICalTok.REQUEST.toString()) || mthd.equals(ICalTok.PUBLISH.toString())) && inviteIsAfterTime(exceptInv, now)) {
                                    List<ZAttendee> atsExcept = exceptInv.getAttendees();
                                    // Find exception instance attendees who aren't series attendees.
                                    List<ZAttendee> ats = CalendarUtils.getRemovedAttendees(atsExcept, atsSeries, false, acct);
                                    if (!ats.isEmpty()) {
                                        // notify ats
                                        cancelInstance(zsc, octxt, null, acct, mbox, calItem, exceptInv, exceptInv.getRecurId(), ats, sendQueue);
                                    }
                                }
                            }
                        }
                    }
                    // Finally, cancel the series.
                    Element msgElem = request.getOptionalElement(MailConstants.E_MSG);
                    cancelInvite(zsc, octxt, msgElem, acct, mbox, calItem, seriesInv, sendQueue);
                }
                // disable change constraint checking since we've just successfully done a modify
                octxt = new OperationContext(octxt).unsetChangeConstraint();
            }
        }
    } finally {
        sendQueue.send();
    }
    Element response = getResponseElement(zsc);
    return response;
}
Also used : OperationContext(com.zimbra.cs.mailbox.OperationContext) Account(com.zimbra.cs.account.Account) Element(com.zimbra.common.soap.Element) RecurId(com.zimbra.cs.mailbox.calendar.RecurId) ItemId(com.zimbra.cs.service.util.ItemId) CalendarItem(com.zimbra.cs.mailbox.CalendarItem) Mailbox(com.zimbra.cs.mailbox.Mailbox) ZimbraSoapContext(com.zimbra.soap.ZimbraSoapContext) ZAttendee(com.zimbra.cs.mailbox.calendar.ZAttendee) TimeZoneMap(com.zimbra.common.calendar.TimeZoneMap) Invite(com.zimbra.cs.mailbox.calendar.Invite) ICalTimeZone(com.zimbra.common.calendar.ICalTimeZone)

Example 3 with TimeZoneMap

use of com.zimbra.common.calendar.TimeZoneMap in project zm-mailbox by Zimbra.

the class CalendarUtils method parseInviteForCounter.

static ParseMimeMessage.InviteParserResult parseInviteForCounter(Account account, Invite oldInvite, MailItem.Type type, Element inviteElem) throws ServiceException {
    TimeZoneMap tzMap = new TimeZoneMap(Util.getAccountTimeZone(account));
    Invite inv = new Invite(ICalTok.COUNTER.toString(), tzMap, false);
    CalendarUtils.parseInviteElementCommon(account, type, inviteElem, inv, true, true);
    // Get the existing invite to populate X-MS-OLK-ORIGINALSTART and X-MS-OLK-ORIGINALEND
    if (oldInvite == null) {
        Mailbox mbox = MailboxManager.getInstance().getMailboxByAccount(account);
        CalendarItem calItem = mbox.getCalendarItemByUid(null, inv.getUid());
        if (calItem != null)
            oldInvite = calItem.getInvite(inv.getRecurId());
    }
    if (oldInvite != null) {
        // Add TZIDs from oldInvite to inv
        inv.getTimeZoneMap().add(oldInvite.getTimeZoneMap());
        // Add ORIGINALSTART x-prop
        ParsedDateTime dt = oldInvite.getStartTime();
        if (dt != null) {
            ZCalendar.ZProperty prop = new ZCalendar.ZProperty("X-MS-OLK-ORIGINALSTART");
            prop.setValue(dt.getDateTimePartString());
            if (dt.getTZName() != null)
                prop.addParameter(new ZParameter(ICalTok.TZID, dt.getTZName()));
            inv.addXProp(prop);
        }
        // Add ORIGINALEND x-prop
        dt = oldInvite.getEffectiveEndTime();
        if (dt != null) {
            ZCalendar.ZProperty prop = new ZCalendar.ZProperty("X-MS-OLK-ORIGINALEND");
            prop.setValue(dt.getDateTimePartString());
            if (dt.getTZName() != null)
                prop.addParameter(new ZParameter(ICalTok.TZID, dt.getTZName()));
            inv.addXProp(prop);
        }
        // Add LOCATION if not already exist.
        if (inv.getLocation() == null || inv.getLocation().isEmpty())
            inv.setLocation(oldInvite.getLocation());
    }
    // UID
    String uid = inv.getUid();
    if (uid == null || uid.length() == 0)
        throw ServiceException.INVALID_REQUEST("Missing uid in a counter invite", null);
    // ORGANIZER
    if (!inv.hasOrganizer())
        throw ServiceException.INVALID_REQUEST("Missing organizer in a counter invite", null);
    // DTSTAMP
    if (inv.getDTStamp() == 0) {
        //zdsync
        inv.setDtStamp(new Date().getTime());
    }
    // DTSTART
    if (inv.getStartTime() == null)
        throw ServiceException.INVALID_REQUEST("Missing dtstart in a counter invite", null);
    // iCalendar object doesn't have an ATTENDEE property.  RFC2446 doesn't require one.
    if (!inv.hasOtherAttendees()) {
        ZAttendee at = new ZAttendee(account.getMail());
        at.setPartStat(IcalXmlStrMap.PARTSTAT_TENTATIVE);
        inv.addAttendee(at);
    }
    inv.setLocalOnly(false);
    ZVCalendar iCal = inv.newToICalendar(true);
    String summaryStr = inv.getName() != null ? inv.getName() : "";
    ParseMimeMessage.InviteParserResult toRet = new ParseMimeMessage.InviteParserResult();
    toRet.mCal = iCal;
    toRet.mUid = inv.getUid();
    toRet.mSummary = summaryStr;
    toRet.mInvite = inv;
    return toRet;
}
Also used : ZProperty(com.zimbra.common.calendar.ZCalendar.ZProperty) ZParameter(com.zimbra.common.calendar.ZCalendar.ZParameter) Date(java.util.Date) CalendarItem(com.zimbra.cs.mailbox.CalendarItem) ZCalendar(com.zimbra.common.calendar.ZCalendar) ZVCalendar(com.zimbra.common.calendar.ZCalendar.ZVCalendar) Mailbox(com.zimbra.cs.mailbox.Mailbox) ZAttendee(com.zimbra.cs.mailbox.calendar.ZAttendee) TimeZoneMap(com.zimbra.common.calendar.TimeZoneMap) ZProperty(com.zimbra.common.calendar.ZCalendar.ZProperty) ParsedDateTime(com.zimbra.common.calendar.ParsedDateTime) Invite(com.zimbra.cs.mailbox.calendar.Invite)

Example 4 with TimeZoneMap

use of com.zimbra.common.calendar.TimeZoneMap in project zm-mailbox by Zimbra.

the class CalendarUtils method parseInviteForCancel.

static ParseMimeMessage.InviteParserResult parseInviteForCancel(Account account, Folder folder, MailItem.Type type, Element inviteElem, TimeZoneMap tzMap, boolean recurrenceIdAllowed, boolean recurAllowed) throws ServiceException {
    if (tzMap == null) {
        tzMap = new TimeZoneMap(Util.getAccountTimeZone(account));
    }
    Invite cancel = new Invite(ICalTok.CANCEL.toString(), tzMap, false);
    cancel.setSentByMe(true);
    CalendarUtils.parseInviteElementCommon(account, type, inviteElem, cancel, recurrenceIdAllowed, recurAllowed);
    String uid = cancel.getUid();
    if (uid == null || uid.length() == 0)
        throw ServiceException.INVALID_REQUEST("Missing uid in a cancel invite", null);
    Invite sanitized = cancelInvite(account, null, false, false, folder, cancel, null, cancel.getAttendees(), cancel.getRecurId(), false);
    //zdsync
    sanitized.setInviteId(cancel.getMailItemId());
    //zdsync
    sanitized.setDtStamp(cancel.getDTStamp());
    ZVCalendar iCal = sanitized.newToICalendar(true);
    String summaryStr = sanitized.getName() != null ? sanitized.getName() : "";
    ParseMimeMessage.InviteParserResult toRet = new ParseMimeMessage.InviteParserResult();
    toRet.mCal = iCal;
    toRet.mUid = sanitized.getUid();
    toRet.mSummary = summaryStr;
    toRet.mInvite = sanitized;
    return toRet;
}
Also used : ZVCalendar(com.zimbra.common.calendar.ZCalendar.ZVCalendar) TimeZoneMap(com.zimbra.common.calendar.TimeZoneMap) Invite(com.zimbra.cs.mailbox.calendar.Invite)

Example 5 with TimeZoneMap

use of com.zimbra.common.calendar.TimeZoneMap in project zm-mailbox by Zimbra.

the class CalendarUtils method parseInviteForCreateException.

static ParseMimeMessage.InviteParserResult parseInviteForCreateException(Account account, MailItem.Type type, Element inviteElem, TimeZoneMap tzMap, String uid, Invite defaultInv) throws ServiceException {
    if (tzMap == null) {
        tzMap = new TimeZoneMap(Util.getAccountTimeZone(account));
    }
    Invite create = new Invite(ICalTok.PUBLISH.toString(), tzMap, false);
    create.setSentByMe(true);
    CalendarUtils.parseInviteElementCommon(account, type, inviteElem, create, true, false);
    // DTSTAMP
    if (create.getDTStamp() == 0) {
        //zdsync
        create.setDtStamp(new Date().getTime());
    }
    // UID
    if (uid != null && uid.length() > 0)
        create.setUid(uid);
    // SEQUENCE - Make sure it's greater than the series sequence.  (bugs 19111 and 35036)
    create.setSeqNo(Math.max(create.getSeqNo(), defaultInv.getSeqNo() + 1));
    // Don't allow changing organizer in an exception instance.
    create.setOrganizer(defaultInv.hasOrganizer() ? new ZOrganizer(defaultInv.getOrganizer()) : null);
    create.setIsOrganizer(account);
    // change tracking
    String changes = parseInviteChanges(inviteElem);
    if (changes != null) {
        // Set the changes as x-prop in the serialized iCalendar object, but not to the parsed Invite object.
        create.addXProp(new ZProperty(ICalTok.X_ZIMBRA_CHANGES, changes));
    }
    ZVCalendar iCal = create.newToICalendar(true);
    // Don't set the changes x-prop in the parsed Invite.
    create.removeXProp(ICalTok.X_ZIMBRA_CHANGES.toString());
    String summaryStr = create.getName() != null ? create.getName() : "";
    ParseMimeMessage.InviteParserResult toRet = new ParseMimeMessage.InviteParserResult();
    toRet.mCal = iCal;
    toRet.mUid = create.getUid();
    toRet.mSummary = summaryStr;
    toRet.mInvite = create;
    return toRet;
}
Also used : ZVCalendar(com.zimbra.common.calendar.ZCalendar.ZVCalendar) TimeZoneMap(com.zimbra.common.calendar.TimeZoneMap) ZOrganizer(com.zimbra.cs.mailbox.calendar.ZOrganizer) ZProperty(com.zimbra.common.calendar.ZCalendar.ZProperty) Invite(com.zimbra.cs.mailbox.calendar.Invite) Date(java.util.Date)

Aggregations

TimeZoneMap (com.zimbra.common.calendar.TimeZoneMap)30 Invite (com.zimbra.cs.mailbox.calendar.Invite)15 ICalTimeZone (com.zimbra.common.calendar.ICalTimeZone)12 ParsedDateTime (com.zimbra.common.calendar.ParsedDateTime)10 ZVCalendar (com.zimbra.common.calendar.ZCalendar.ZVCalendar)8 Element (com.zimbra.common.soap.Element)8 ZProperty (com.zimbra.common.calendar.ZCalendar.ZProperty)7 Date (java.util.Date)7 Account (com.zimbra.cs.account.Account)6 Mailbox (com.zimbra.cs.mailbox.Mailbox)6 ZimbraSoapContext (com.zimbra.soap.ZimbraSoapContext)6 ArrayList (java.util.ArrayList)6 ParsedDuration (com.zimbra.common.calendar.ParsedDuration)5 ZComponent (com.zimbra.common.calendar.ZCalendar.ZComponent)5 ServiceException (com.zimbra.common.service.ServiceException)5 CalendarItem (com.zimbra.cs.mailbox.CalendarItem)5 Instance (com.zimbra.cs.mailbox.CalendarItem.Instance)5 ItemId (com.zimbra.cs.service.util.ItemId)5 OperationContext (com.zimbra.cs.mailbox.OperationContext)4 RecurId (com.zimbra.cs.mailbox.calendar.RecurId)4