use of com.zimbra.cs.mailbox.calendar.Invite in project zm-mailbox by Zimbra.
the class CalendarItem method isPublic.
/**
* Returns true if all invites in the calendar item have CLASS:PUBLIC.
* @return
*/
public boolean isPublic() {
boolean result = true;
Invite[] invs = getInvites();
if (invs != null && invs.length > 0) {
for (Invite i : invs) {
if (!i.isPublic()) {
result = false;
break;
}
}
}
return result;
}
use of com.zimbra.cs.mailbox.calendar.Invite in project zm-mailbox by Zimbra.
the class CalendarItem method getNextAlarm.
private AlarmData getNextAlarm(long nextAlarm, boolean skipAlarmDefChangeCheck, AlarmData currentNextAlarmData, boolean dismissed, boolean forEmailAction) throws ServiceException {
if (nextAlarm == NEXT_ALARM_ALL_DISMISSED || !hasAlarm()) {
return null;
}
long now = getMailbox().getOperationTimestampMillis();
// Chosen alarm must be at or after this time.
long atOrAfter;
long snoozeUntil;
if (nextAlarm == NEXT_ALARM_KEEP_CURRENT) {
// special case to preserve current next alarm trigger time
if (currentNextAlarmData != null) {
atOrAfter = currentNextAlarmData.getNextAtBase();
snoozeUntil = currentNextAlarmData.getSnoozeUntil();
} else {
// no existing alarm; pick the first alarm in the future
atOrAfter = snoozeUntil = now;
}
} else if (nextAlarm == NEXT_ALARM_FROM_NOW) {
// another special case to mean starting from "now"; pick the first alarm in the future
atOrAfter = snoozeUntil = now;
} else if (!dismissed && currentNextAlarmData != null) {
// if not dismissing previous alarm, keep it as the base trigger time. nextAlarm has snoozed re-trigger time
atOrAfter = currentNextAlarmData.getNextAtBase();
snoozeUntil = nextAlarm;
} else {
// else we just use the nextAlarm value that was passed in
atOrAfter = snoozeUntil = nextAlarm;
}
if (atOrAfter <= 0) {
// sanity check
atOrAfter = snoozeUntil = now;
}
if (snoozeUntil != AlarmData.NO_SNOOZE && snoozeUntil < atOrAfter) {
snoozeUntil = atOrAfter;
}
// startTime and endTime limit the time range for meeting instances to be examined.
// All instances that ended before startTime are ignored, and by extension the alarms for them.
// endTime limit is set to avoid examining too many instances, for performance reason.
long startTime = atOrAfter;
if (startTime > now) {
// Handle the case when appointment is brought back in time such that the new start time
// is earlier than previously set alarm trigger time.
startTime = now;
}
long endTime = getNextAlarmRecurrenceExpansionLimit();
Collection<Instance> instances = expandInstances(startTime, endTime, false);
// Special handling for modified alarm definition
if (atOrAfter > 0 && !skipAlarmDefChangeCheck) {
// Let's see if alarm definition has changed. It changed if there is no alarm to go off at
// previously saved nextAlarm time.
boolean alarmDefChanged = true;
long savedNextInstStart = currentNextAlarmData != null ? currentNextAlarmData.getNextInstanceStart() : 0;
for (Instance inst : instances) {
long instStart = inst.getStart();
long instEnd = inst.getEnd();
if (inst.hasStart() && inst.hasEnd()) {
// Ignore instances that ended already.
if (instEnd <= startTime)
continue;
// For appointments (but not tasks), ignore instances whose start time has come and gone.
if (instStart < startTime && (this instanceof Appointment))
continue;
// definition.
if (instStart > savedNextInstStart)
break;
}
InviteInfo invId = inst.getInviteInfo();
Invite inv = getInvite(invId.getMsgId(), invId.getComponentId());
Iterator<Alarm> alarmsIter = inv.alarmsIterator();
for (; alarmsIter.hasNext(); ) {
Alarm alarm = alarmsIter.next();
long currTrigger = alarm.getTriggerTime(instStart, instEnd);
if (currTrigger == atOrAfter) {
// Detected alarm definition change. Reset atOrAfter to 0 to force the next loop
// to choose the earliest alarm from an earliest instance at or after old nextAlarm time.
alarmDefChanged = false;
break;
}
}
// no need to look at later instances
break;
}
if (alarmDefChanged) {
// If alarm definition changed, just pick the earliest alarm from now. Without this,
// we can't change alarm definition to an earlier trigger time, e.g. from 5 minutes before
// to 10 minutes before. (bug 28630)
atOrAfter = snoozeUntil = now;
}
}
AlarmData alarmData = getNextAlarmHelper(atOrAfter, snoozeUntil, instances, startTime, forEmailAction);
if (alarmData == null && this instanceof Task) {
// special handling for Tasks
return getNextAlarmHelperForTasks(atOrAfter, snoozeUntil, forEmailAction);
} else {
return alarmData;
}
}
use of com.zimbra.cs.mailbox.calendar.Invite in project zm-mailbox by Zimbra.
the class GetMsgTest method testHandle.
@Test
public void testHandle() throws Exception {
Account acct1 = Provisioning.getInstance().get(Key.AccountBy.name, "test@zimbra.com");
Account acct2 = Provisioning.getInstance().get(Key.AccountBy.name, "test2@zimbra.com");
Mailbox mbox1 = MailboxManager.getInstance().getMailboxByAccount(acct1);
Folder calendarFolder = mbox1.getCalendarFolders(null, SortBy.NONE).get(0);
String fragment = "Some message";
ZVCalendar calendar = new ZVCalendar();
calendar.addDescription(desc, null);
ZComponent comp = new ZComponent("VEVENT");
calendar.addComponent(comp);
Invite invite = MailboxTestUtil.generateInvite(acct1, fragment, calendar);
ICalTimeZone ical = invite.getTimeZoneMap().getLocalTimeZone();
long utc = 5 * 60 * 60 * 1000;
ParsedDateTime s = ParsedDateTime.fromUTCTime(System.currentTimeMillis() + utc, ical);
ParsedDateTime e = ParsedDateTime.fromUTCTime(System.currentTimeMillis() + (30 * 60 * 1000) + utc, ical);
invite.setDtStart(s);
invite.setDtEnd(e);
invite.setPriority("5");
invite.setClassProp("PRI");
invite.setOrganizer(new ZOrganizer("test@zimbra.com", null));
invite.setUid(UUID.randomUUID().toString());
invite.setMethod("REQUEST");
invite.setName("Testing");
invite.setFreeBusy("B");
invite.setIsOrganizer(true);
invite.setItemType(MailItem.Type.APPOINTMENT);
invite.setUid(UUID.randomUUID().toString());
AddInviteData inviteData = mbox1.addInvite(null, invite, calendarFolder.getId());
calendarFolder = mbox1.getCalendarFolders(null, SortBy.NONE).get(0);
Element request = new Element.XMLElement("GetCalendarItem");
Element action = request.addElement(MailConstants.E_MSG);
action.addAttribute(MailConstants.A_ID, acct1.getId() + ":" + inviteData.calItemId + "-" + inviteData.invId);
action.addAttribute(MailConstants.A_WANT_HTML, "1");
action.addAttribute(MailConstants.A_NEED_EXP, "1");
Element response = new GetMsg().handle(request, ServiceTestUtil.getRequestContext(acct1));
Element organizer = response.getElement("m").getElement("inv").getElement("comp").getElement("or");
String organizerString = organizer.prettyPrint();
assertTrue(organizerString.contains("a=\"test@zimbra.com\" url=\"test@zimbra.com\""));
mbox1.grantAccess(null, 10, acct2.getId(), ACL.GRANTEE_USER, ACL.RIGHT_READ, null);
request = new Element.XMLElement("CreateMountPoint");
Element link = request.addElement("link");
link.addAttribute("f", "#");
link.addAttribute("reminder", 0);
link.addAttribute("name", "sharedcal");
link.addAttribute("path", "/Calendar");
link.addAttribute("owner", "test@zimbra.com");
link.addAttribute("l", 10);
link.addAttribute("view", "appoinment");
response = new CreateMountpoint().handle(request, ServiceTestUtil.getRequestContext(acct2));
String mptId = response.getElement("link").getAttribute("id");
request = new Element.XMLElement("GetMsgRequest");
action = request.addElement(MailConstants.E_MSG);
action.addAttribute(MailConstants.A_ID, acct1.getId() + ":" + inviteData.calItemId + "-" + mptId);
action.addAttribute(MailConstants.A_WANT_HTML, "1");
action.addAttribute(MailConstants.A_NEED_EXP, "1");
response = new GetMsg().handle(request, ServiceTestUtil.getRequestContext(acct2, acct1));
organizerString = response.getElement("m").prettyPrint();
assertTrue(!organizerString.contains("a=\"test@zimbra.com\" url=\"test@zimbra.com\""));
request = new Element.XMLElement("FolderAction");
action = request.addElement("action");
action.addAttribute("id", mptId);
action.addAttribute("op", "delete");
response = new FolderAction().handle(request, ServiceTestUtil.getRequestContext(acct2));
mbox1.revokeAccess(null, 10, acct2.getId());
}
use of com.zimbra.cs.mailbox.calendar.Invite in project zm-mailbox by Zimbra.
the class TaskHit method getCompletionPercentage.
public int getCompletionPercentage() throws ServiceException {
Task task = (Task) getCalendarItem();
Invite inv = task.getDefaultInviteOrNull();
if (inv != null) {
String compPerc = inv.getPercentComplete();
if (compPerc != null) {
try {
int toRet = Integer.parseInt(compPerc);
return toRet;
} catch (Exception e) {
return 0;
}
}
}
return 0;
}
use of com.zimbra.cs.mailbox.calendar.Invite in project zm-mailbox by Zimbra.
the class TaskHit method getStatus.
public Status getStatus() throws ServiceException {
Task task = (Task) getCalendarItem();
Invite inv = task.getDefaultInviteOrNull();
if (inv != null) {
String status = inv.getStatus();
try {
Status s = Status.valueOf(status.toUpperCase());
return s;
} catch (IllegalArgumentException e) {
ZimbraLog.index.debug("Unknown Task Status value: " + status.toUpperCase());
}
}
return Status.DEFERRED;
}
Aggregations