Search in sources :

Example 6 with Interval

use of com.zimbra.cs.fb.FreeBusy.Interval in project zm-mailbox by Zimbra.

the class CheckRecurConflicts method getConflicts.

private static UserConflicts getConflicts(FreeBusy fb, List<Instance> instances) throws ServiceException {
    UserConflicts conflicts = new UserConflicts(fb.getName());
    Iterator<Interval> ivalIter = fb.iterator();
    Iterator<Instance> instIter = instances.iterator();
    Interval ival = ivalIter.hasNext() ? ivalIter.next() : null;
    Instance inst = instIter.hasNext() ? instIter.next() : null;
    // f/b status of the previous overlap between instance and interval, if previous and current overlaps
    // are with the same instance
    String prevStatus = null;
    while (ival != null && inst != null) {
        String status = ival.getStatus();
        if (IcalXmlStrMap.FBTYPE_FREE.equals(status)) {
            ival = ivalIter.hasNext() ? ivalIter.next() : null;
            continue;
        }
        if (!inst.hasStart() || !inst.hasEnd()) {
            inst = instIter.hasNext() ? instIter.next() : null;
            prevStatus = null;
            continue;
        }
        long instStart = inst.getStart();
        long instEnd = inst.getEnd();
        long ivalStart = ival.getStart();
        long ivalEnd = ival.getEnd();
        // If instance is before interval, go to next instance.
        if (instEnd <= ivalStart) {
            inst = instIter.hasNext() ? instIter.next() : null;
            prevStatus = null;
            continue;
        }
        // If interval is before instance, go to next interval.
        if (ivalEnd <= instStart) {
            ival = ivalIter.hasNext() ? ivalIter.next() : null;
            prevStatus = null;
            continue;
        }
        // We have an overlap!
        if (prevStatus != null)
            status = FreeBusy.chooseBusier(status, prevStatus);
        conflicts.put(inst, status);
        prevStatus = status;
        // Advance to the next interval or instance.
        if (ivalEnd < instEnd) {
            // Go to the next interval if its end time is earlier than the instance end time, because
            // the next interval may still overlap the same instance.
            ival = ivalIter.hasNext() ? ivalIter.next() : null;
        } else {
            // instEnd >= ivalEnd
            // If instance end time is at or earlier than interval end time, go to the next
            // instance.  Clear prevStatus because we're changing instance.
            inst = instIter.hasNext() ? instIter.next() : null;
            prevStatus = null;
        }
    }
    return conflicts;
}
Also used : Instance(com.zimbra.cs.mailbox.CalendarItem.Instance) Interval(com.zimbra.cs.fb.FreeBusy.Interval)

Example 7 with Interval

use of com.zimbra.cs.fb.FreeBusy.Interval in project zm-mailbox by Zimbra.

the class Appointment method getBusyTimesString.

private static String getBusyTimesString(OperationContext octxt, Mailbox mbox, List<Conflict> list, TimeZone tz, Locale lc, boolean hasMoreConflicts) throws ServiceException {
    StringBuilder sb = new StringBuilder();
    int conflictCount = 0;
    for (Conflict avail : list) {
        if (!avail.isBusy())
            continue;
        // List conflicting appointments and their organizers.
        FreeBusy fb = avail.getFreeBusy();
        List<FBInstance> instances = new ArrayList<FBInstance>();
        for (Iterator<Interval> iter = fb.iterator(); iter.hasNext(); ) {
            Interval interval = iter.next();
            // busy intervals only
            if (Conflict.isBusy(interval.getStatus())) {
                // busy appointments only
                for (FBInstance fbinst : interval.getInstances()) {
                    if (Conflict.isBusy(fbinst.getFreeBusy()))
                        instances.add(fbinst);
                }
            }
        }
        for (FBInstance instance : instances) {
            Date startDate = new Date(instance.getStartTime());
            Date endDate = new Date(instance.getEndTime());
            String start = CalendarMailSender.formatDateTime(startDate, tz, lc);
            sb.append(" * ").append(start);
            String end;
            if (DateTimeUtil.sameDay(startDate, endDate, tz)) {
                end = CalendarMailSender.formatTime(endDate, tz, lc);
                sb.append(" - ").append(end);
            } else {
                end = CalendarMailSender.formatDateTime(endDate, tz, lc);
                sb.append("\r\n   - ").append(end);
            }
            int apptId = instance.getApptId();
            long recurIdDt = instance.getRecurIdDt();
            CalendarItem appt = mbox.getCalendarItemById(octxt, apptId);
            Invite inv = appt.getInviteForRecurId(recurIdDt);
            if (inv != null && inv.hasOrganizer()) {
                ZOrganizer organizer = inv.getOrganizer();
                String orgDispName;
                if (organizer.hasCn())
                    orgDispName = organizer.getCn() + " <" + organizer.getAddress() + ">";
                else
                    orgDispName = organizer.getAddress();
                sb.append(L10nUtil.getMessage(MsgKey.calendarResourceConflictScheduledBy, lc, orgDispName));
            }
            sb.append("\r\n");
            conflictCount++;
        }
    }
    if (hasMoreConflicts)
        sb.append(" * ...\r\n");
    return sb.toString();
}
Also used : FreeBusy(com.zimbra.cs.fb.FreeBusy) ArrayList(java.util.ArrayList) ZOrganizer(com.zimbra.cs.mailbox.calendar.ZOrganizer) Date(java.util.Date) FBInstance(com.zimbra.cs.fb.FreeBusy.FBInstance) Invite(com.zimbra.cs.mailbox.calendar.Invite) Interval(com.zimbra.cs.fb.FreeBusy.Interval)

Aggregations

Interval (com.zimbra.cs.fb.FreeBusy.Interval)7 IntervalList (com.zimbra.cs.fb.FreeBusy.IntervalList)3 AccessManager (com.zimbra.cs.account.AccessManager)2 FBInstance (com.zimbra.cs.fb.FreeBusy.FBInstance)2 Instance (com.zimbra.cs.mailbox.CalendarItem.Instance)2 HashMap (java.util.HashMap)2 LinkedList (java.util.LinkedList)2 ICalTimeZone (com.zimbra.common.calendar.ICalTimeZone)1 TimeZoneMap (com.zimbra.common.calendar.TimeZoneMap)1 ServiceException (com.zimbra.common.service.ServiceException)1 FreeBusy (com.zimbra.cs.fb.FreeBusy)1 Folder (com.zimbra.cs.mailbox.Folder)1 Mailbox (com.zimbra.cs.mailbox.Mailbox)1 Invite (com.zimbra.cs.mailbox.calendar.Invite)1 IRecurrence (com.zimbra.cs.mailbox.calendar.Recurrence.IRecurrence)1 ZOrganizer (com.zimbra.cs.mailbox.calendar.ZOrganizer)1 CalendarDataResult (com.zimbra.cs.mailbox.calendar.cache.CalSummaryCache.CalendarDataResult)1 CalendarItemData (com.zimbra.cs.mailbox.calendar.cache.CalendarItemData)1 FullInstanceData (com.zimbra.cs.mailbox.calendar.cache.FullInstanceData)1 InstanceData (com.zimbra.cs.mailbox.calendar.cache.InstanceData)1