use of com.zimbra.common.calendar.TimeZoneMap in project zm-mailbox by Zimbra.
the class ForwardCalendarItem method handle.
@Override
public Element handle(Element request, Map<String, Object> context) throws ServiceException {
ZimbraSoapContext zsc = getZimbraSoapContext(context);
Account senderAcct = getZDesktopSafeAuthenticatedAccount(zsc);
Mailbox mbox = getRequestedMailbox(zsc);
OperationContext octxt = getOperationContext(zsc, context);
// proxy handling
ItemId iid = new ItemId(request.getAttribute(MailConstants.A_ID), zsc);
if (!iid.belongsTo(getRequestedAccount(zsc))) {
// Proxy it.
return proxyRequest(request, context, iid.getAccountId());
}
Element msgElem = request.getElement(MailConstants.E_MSG);
ParseMimeMessage.MimeMessageData parsedMessageData = new ParseMimeMessage.MimeMessageData();
MimeMessage mm = ParseMimeMessage.parseMimeMsgSoap(zsc, octxt, mbox, msgElem, null, ParseMimeMessage.NO_INV_ALLOWED_PARSER, parsedMessageData);
Element exc = request.getOptionalElement(MailConstants.E_CAL_EXCEPTION_ID);
Element tzElem = request.getOptionalElement(MailConstants.E_CAL_TZ);
CalendarItem calItem = mbox.getCalendarItemById(octxt, iid.getId());
if (calItem == null) {
throw MailServiceException.NO_SUCH_CALITEM(iid.toString(), "Could not find calendar item");
}
RecurId rid = null;
if (exc != null) {
TimeZoneMap tzmap = calItem.getTimeZoneMap();
ICalTimeZone tz = null;
if (tzElem != null) {
tz = CalendarUtils.parseTzElement(tzElem);
tzmap.add(tz);
}
ParsedDateTime exceptDt = CalendarUtils.parseDateTime(exc, tzmap);
rid = new RecurId(exceptDt, RecurId.RANGE_NONE);
}
Pair<List<MimeMessage>, List<MimeMessage>> mimePair = forwardCalItem(mbox, octxt, calItem, rid, mm, senderAcct);
sendForwardMessages(mbox, octxt, mimePair);
Element response = getResponseElement(zsc);
return response;
}
use of com.zimbra.common.calendar.TimeZoneMap in project zm-mailbox by Zimbra.
the class ExpandRecur method handle.
@Override
public Element handle(Element request, Map<String, Object> context) throws ServiceException {
ZimbraSoapContext zsc = getZimbraSoapContext(context);
Account authAcct = getAuthenticatedAccount(zsc);
long rangeStart = request.getAttributeLong(MailConstants.A_CAL_START_TIME);
long rangeEnd = request.getAttributeLong(MailConstants.A_CAL_END_TIME);
long days = (rangeEnd - rangeStart) / Constants.MILLIS_PER_DAY;
long maxDays = LC.calendar_freebusy_max_days.longValueWithinRange(0, 36600);
if (days > maxDays)
throw ServiceException.INVALID_REQUEST("Requested range is too large (Maximum " + maxDays + " days)", null);
TimeZoneMap tzmap = new TimeZoneMap(Util.getAccountTimeZone(authAcct));
ParsedRecurrence parsed = parseRecur(request, tzmap);
List<Instance> instances = getInstances(parsed, rangeStart, rangeEnd);
Element response = getResponseElement(zsc);
if (instances != null) {
for (Instance inst : instances) {
addInstance(response, inst);
}
}
return response;
}
use of com.zimbra.common.calendar.TimeZoneMap in project zm-mailbox by Zimbra.
the class MetadataTest method legacyCalendarItem.
@Test
public void legacyCalendarItem() throws ServiceException, MessagingException {
Mailbox mbox = MailboxManager.getInstance().getMailboxByAccountId(MockProvisioning.DEFAULT_ACCOUNT_ID);
SetCalendarItemData defaultInv = new SetCalendarItemData();
MimeMessage message = new JavaMailMimeMessage(JMSession.getSession(), new ZSharedFileInputStream("data/TestMailRaw/invite1"));
defaultInv.message = new ParsedMessage(message, Calendar.getInstance().getTimeInMillis(), false);
TimeZoneMap tzMap = new TimeZoneMap(WellKnownTimeZones.getTimeZoneById("EST"));
Invite invite = new Invite("REQUEST", tzMap, false);
invite.setUid("test-uid");
Calendar cal = GregorianCalendar.getInstance();
cal.set(2005, 1, 21);
invite.setDtStart(ParsedDateTime.fromUTCTime(cal.getTimeInMillis()));
cal.set(2005, 2, 21);
invite.setDtEnd(ParsedDateTime.fromUTCTime(cal.getTimeInMillis()));
defaultInv.invite = invite;
CalendarItem calItem = mbox.setCalendarItem(null, Mailbox.ID_FOLDER_CALENDAR, 0, null, defaultInv, null, null, CalendarItem.NEXT_ALARM_KEEP_CURRENT);
calItem.mData.dateChanged = (int) (cal.getTimeInMillis() / 1000L);
Metadata meta = calItem.encodeMetadata();
meta.remove(Metadata.FN_TZMAP);
calItem.decodeMetadata(meta);
Assert.assertEquals(0, calItem.getStartTime());
Assert.assertEquals(0, calItem.getEndTime());
//simulate existence of FN_TZMAP with bad content. In reality the metadata versions 4, 5, 6 had more subtle differences in invite encoding, but this provokes the exception we need
meta.put(Metadata.FN_TZMAP, "foo");
calItem.decodeMetadata(meta);
Assert.assertEquals(0, calItem.getStartTime());
Assert.assertEquals(0, calItem.getEndTime());
cal.set(2007, 2, 21);
calItem.mData.dateChanged = (int) (cal.getTimeInMillis() / 1000L);
boolean caught = false;
try {
calItem.decodeMetadata(meta);
} catch (ServiceException se) {
if (se.getCode().equalsIgnoreCase(ServiceException.INVALID_REQUEST)) {
caught = true;
}
}
Assert.assertTrue("new(er) appointment with bad metadata", caught);
}
use of com.zimbra.common.calendar.TimeZoneMap in project zm-mailbox by Zimbra.
the class WorkingHours method getWorkingHours.
public static FreeBusy getWorkingHours(Account authAcct, boolean asAdmin, Account account, String name, long start, long end) throws ServiceException {
// If free/busy viewing is blocked, so is viewing working hours.
AccessManager accessMgr = AccessManager.getInstance();
boolean accountAceAllowed = accessMgr.canDo(authAcct, account, User.R_viewFreeBusy, asAdmin);
if (!accountAceAllowed)
return FreeBusy.nodataFreeBusy(account.getName(), start, end);
// Get the working hours preference and parse it.
String workingHoursPref = account.getPrefCalendarWorkingHours();
HoursByDay workingHoursByDay = new HoursByDay(workingHoursPref);
// Build a recurrence rule for each day of the week and expand over the time range.
IntervalList intervals = new IntervalList(start, end);
ICalTimeZone tz = Util.getAccountTimeZone(account);
TimeZoneMap tzmap = new TimeZoneMap(tz);
StartSpec startSpec = new StartSpec(start, tz);
for (int day = 1; day <= 7; ++day) {
TimeRange timeRange = workingHoursByDay.getHoursForDay(day);
if (timeRange.enabled) {
IRecurrence rrule = getRecurrenceForDay(day, startSpec, timeRange, tz, tzmap);
List<Instance> instances = rrule.expandInstances(0, start, end);
for (Instance inst : instances) {
Interval ival = new Interval(inst.getStart(), inst.getEnd(), IcalXmlStrMap.FBTYPE_BUSY_UNAVAILABLE);
intervals.addInterval(ival);
}
}
}
// hours are shown as out-of-office.
for (Iterator<Interval> iter = intervals.iterator(); iter.hasNext(); ) {
Interval interval = iter.next();
String status = interval.getStatus();
interval.setStatus(invertStatus(status));
}
return new FreeBusy(name, intervals, start, end);
}
use of com.zimbra.common.calendar.TimeZoneMap in project zm-mailbox by Zimbra.
the class ZRecur method main.
public static void main(String[] args) {
ICalTimeZone tzUTC = ICalTimeZone.getUTC();
TimeZoneMap tzmap = new TimeZoneMap(tzUTC);
ParsedDateTime dtStart = null;
try {
dtStart = ParsedDateTime.parse("20050101T123456", tzmap, tzUTC, tzUTC);
} catch (ParseException e) {
System.out.println("Caught ParseException at start: " + e);
}
Date rangeStart;
Date rangeEnd;
GregorianCalendar cal = new GregorianCalendar();
cal.clear();
cal.setTimeZone(tzUTC);
cal.set(2005, 4, 15, 0, 0, 0);
rangeStart = cal.getTime();
cal.set(2006, 0, 1, 0, 0, 0);
rangeEnd = cal.getTime();
try {
ZRecur test = new ZRecur("FREQ=DAILY;BYMONTH=5,6", tzmap);
System.out.println("\n\n" + test.toString() + "\n-------------------------------------------------");
List<Date> dateList = test.expandRecurrenceOverRange(dtStart, rangeStart.getTime(), rangeEnd.getTime());
for (Date d : dateList) {
cal.setTime(d);
cal.setTimeZone(tzUTC);
System.out.printf("%tc\n", cal);
}
} catch (ServiceException e) {
System.out.println("Caught ServiceException" + e);
e.printStackTrace();
}
try {
ZRecur test = new ZRecur("FREQ=DAILY;BYMONTH=5,6;BYDAY=TH,-1MO", tzmap);
System.out.println("\n\n" + test.toString() + "\n-------------------------------------------------");
List<Date> dateList = test.expandRecurrenceOverRange(dtStart, rangeStart.getTime(), rangeEnd.getTime());
for (Date d : dateList) {
cal.setTime(d);
cal.setTimeZone(tzUTC);
System.out.printf("%tc\n", cal);
}
} catch (ServiceException e) {
System.out.println("Caught ServiceException" + e);
e.printStackTrace();
}
try {
ZRecur test = new ZRecur("FREQ=DAILY;BYMONTH=5,6;BYMONTHDAY=1,3,5,7,9,31", tzmap);
System.out.println("\n\n" + test.toString() + "\n-------------------------------------------------");
List<Date> dateList = test.expandRecurrenceOverRange(dtStart, rangeStart.getTime(), rangeEnd.getTime());
for (Date d : dateList) {
cal.setTime(d);
System.out.printf("%tc\n", cal);
}
} catch (ServiceException e) {
System.out.println("Caught ServiceException" + e);
e.printStackTrace();
}
try {
ZRecur test = new ZRecur("FREQ=DAILY;BYMONTH=5,6;BYMONTHDAY=1,3,5,7,9,31;BYDAY=SU,SA", tzmap);
System.out.println("\n\n" + test.toString() + "\n--------------------------------------------------------------");
List<Date> dateList = test.expandRecurrenceOverRange(dtStart, rangeStart.getTime(), rangeEnd.getTime());
for (Date d : dateList) {
cal.setTime(d);
System.out.printf("%tc\n", cal);
}
} catch (ServiceException e) {
System.out.println("Caught ServiceException" + e);
e.printStackTrace();
}
try {
ZRecur test = new ZRecur("FREQ=DAILY;BYMONTH=5,6;BYMONTHDAY=1,3,5,7,9,31;BYDAY=SU,SA;BYHOUR=21,0", tzmap);
System.out.println("\n\n" + test.toString() + "\n--------------------------------------------------------------");
List<Date> dateList = test.expandRecurrenceOverRange(dtStart, rangeStart.getTime(), rangeEnd.getTime());
for (Date d : dateList) {
cal.setTime(d);
System.out.printf("%tc\n", cal);
}
} catch (ServiceException e) {
System.out.println("Caught ServiceException" + e);
e.printStackTrace();
}
try {
ZRecur test = new ZRecur("FREQ=DAILY;BYMONTH=5,6;BYMONTHDAY=1,3,5,7,9,31;BYDAY=SU;BYHOUR=21,0;BYMINUTE=23", tzmap);
System.out.println("\n\n" + test.toString() + "\n--------------------------------------------------------------");
List<Date> dateList = test.expandRecurrenceOverRange(dtStart, rangeStart.getTime(), rangeEnd.getTime());
for (Date d : dateList) {
cal.setTime(d);
System.out.printf("%tc\n", cal);
}
} catch (ServiceException e) {
System.out.println("Caught ServiceException" + e);
e.printStackTrace();
}
try {
ZRecur test = new ZRecur("FREQ=DAILY;BYMONTH=5,6;BYMONTHDAY=1,3,5,7,9,31;BYDAY=SU;BYHOUR=1,21,0;BYSECOND=0,59", tzmap);
System.out.println("\n\n" + test.toString() + "\n--------------------------------------------------------------");
List<Date> dateList = test.expandRecurrenceOverRange(dtStart, rangeStart.getTime(), rangeEnd.getTime());
for (Date d : dateList) {
cal.setTime(d);
System.out.printf("%tc\n", cal);
}
} catch (ServiceException e) {
System.out.println("Caught ServiceException" + e);
e.printStackTrace();
}
try {
// parse error testing
ZRecur test = new ZRecur("FREQ=DAILY;BIYMONTH=5,6;BYMONTHDAY=1,3,5,7,9,31;BYDAY=SU;BYHOUR=1,21,0;BYSECOND=0,59;BYSETPOS=1,-1,3,1000,,-1000", tzmap);
System.out.println("\n\n" + test.toString() + "\n--------------------------------------------------------------");
List<Date> dateList = test.expandRecurrenceOverRange(dtStart, rangeStart.getTime(), rangeEnd.getTime());
for (Date d : dateList) {
cal.setTime(d);
System.out.printf("%tc\n", cal);
}
} catch (ServiceException e) {
System.out.println("Caught ServiceException" + e);
e.printStackTrace();
}
try {
ZRecur test = new ZRecur("FREQ=HOURLY;BIYMONTH=6;BYMONTHDAY=1,3;BYHOUR=2,14", tzmap);
System.out.println("\n\n" + test.toString() + "\n--------------------------------------------------------------");
List<Date> dateList = test.expandRecurrenceOverRange(dtStart, rangeStart.getTime(), rangeEnd.getTime());
for (Date d : dateList) {
cal.setTime(d);
System.out.printf("%tc\n", cal);
}
} catch (ServiceException e) {
System.out.println("Caught ServiceException" + e);
e.printStackTrace();
}
try {
ZRecur test = new ZRecur("FREQ=HOURLY;BIYMONTH=6;BYMONTHDAY=1;;BYMINUTE=10;BYSECOND=11,12", tzmap);
System.out.println("\n\n" + test.toString() + "\n--------------------------------------------------------------");
List<Date> dateList = test.expandRecurrenceOverRange(dtStart, rangeStart.getTime(), rangeEnd.getTime());
for (Date d : dateList) {
cal.setTime(d);
System.out.printf("%tc\n", cal);
}
} catch (ServiceException e) {
System.out.println("Caught ServiceException" + e);
e.printStackTrace();
}
cal.set(2010, 0, 1, 0, 0, 0);
rangeEnd = cal.getTime();
try {
ZRecur test = new ZRecur("FREQ=YEARLY", tzmap);
System.out.println("\n\n" + test.toString() + "\n--------------------------------------------------------------");
List<Date> dateList = test.expandRecurrenceOverRange(dtStart, rangeStart.getTime(), rangeEnd.getTime());
for (Date d : dateList) {
cal.setTime(d);
System.out.printf("%tc\n", cal);
}
} catch (ServiceException e) {
System.out.println("Caught ServiceException" + e);
e.printStackTrace();
}
try {
ZRecur test = new ZRecur("FREQ=YEARLY;BYYEARDAY=-1", tzmap);
System.out.println("\n\n" + test.toString() + "\n--------------------------------------------------------------");
List<Date> dateList = test.expandRecurrenceOverRange(dtStart, rangeStart.getTime(), rangeEnd.getTime());
for (Date d : dateList) {
cal.setTime(d);
System.out.printf("%tc\n", cal);
}
} catch (ServiceException e) {
System.out.println("Caught ServiceException" + e);
e.printStackTrace();
}
try {
ZRecur test = new ZRecur("FREQ=SECONDLY", tzmap);
System.out.println("\n\n" + test.toString() + "\n--------------------------------------------------------------");
List<Date> dateList = test.expandRecurrenceOverRange(dtStart, rangeStart.getTime(), rangeEnd.getTime());
for (Date d : dateList) {
cal.setTime(d);
System.out.printf("%tc\n", cal);
}
} catch (ServiceException e) {
System.out.println("Caught ServiceException" + e);
e.printStackTrace();
}
try {
ParsedDateTime myDtStart = ParsedDateTime.parse("16010101T020000", tzmap, tzUTC, tzUTC);
ZRecur test = new ZRecur("FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=12;BYDAY=-1SU", tzmap);
System.out.println("\n\n" + test.toString() + "\n--------------------------------------------------------------");
List<Date> dateList = test.expandRecurrenceOverRange(myDtStart, rangeStart.getTime(), rangeEnd.getTime());
for (Date d : dateList) {
cal.setTime(d);
System.out.printf("%tc\n", cal);
}
} catch (ParseException e) {
System.out.println("Caught ParseException" + e);
e.printStackTrace();
} catch (ServiceException e) {
System.out.println("Caught ServiceException" + e);
e.printStackTrace();
}
cal.set(2010, 0, 1, 0, 0, 0);
rangeEnd = cal.getTime();
try {
ZRecur test = new ZRecur("FREQ=YEARLY;BYMONTH=12;BYDAY=1WE", tzmap);
System.out.println("\n\n" + test.toString() + "\n--------------------------------------------------------------");
List<Date> dateList = test.expandRecurrenceOverRange(dtStart, rangeStart.getTime(), rangeEnd.getTime());
for (Date d : dateList) {
cal.setTime(d);
System.out.printf("%tc\n", cal);
}
} catch (ServiceException e) {
System.out.println("Caught ServiceException" + e);
e.printStackTrace();
}
}
Aggregations