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;
}
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();
}
Aggregations