ZimbraLog.calendar.debug(new Formatter().format("Skipping unknown RECUR token: \"%s\" in Recur \"%s\"", s[0], str));
ZimbraLog.calendar.warn(new Formatter().format("Skipping RECUR token: \"%s\" in Recur \"%s\" due to parse error", s[0], str), e);
    private void parse(String str, TimeZoneMap tzmap) throws ServiceException {        try {            for (String tok : str.split(";")) {                String[] s = tok.split("=");                if (s.length != 2) {                    if (ZimbraLog.calendar.isDebugEnabled())                        ZimbraLog.calendar.debug(new Formatter().format("Parse error for recur: \"%s\" at token \"%s\"", str, tok));                    continue;                }                                    String rhs = s[1];                                try {                    switch(Tokens.valueOf(s[0])) {                     case FREQ:                        mFreq = Frequency.valueOf(rhs);                        break;                    case UNTIL:                        ParsedDateTime until = ParsedDateTime.parse(rhs, tzmap);                        if (until != null) {                            // RFC2445 4.3.10 Recurrence Rule:                            // "If specified as a date-time value, then it MUST                            // be specified in an UTC time format."                            if (until.hasTime())                                until.toUTC();                            mUntil = until;                        }                        break;                    case COUNT:                        mCount = Integer.parseInt(rhs);                        break;                    case INTERVAL:                        mInterval = Integer.parseInt(rhs);                        break;                    case BYSECOND:                        parseIntList(rhs, mBySecondList, 0, 59);                        break;                    case BYMINUTE:                        parseIntList(rhs, mByMinuteList, 0, 59);                        break;                    case BYHOUR:                        parseIntList(rhs, mByHourList, 0, 23);                        break;                    case BYDAY:                        parseByDayList(rhs, mByDayList);                        break;                    case BYMONTHDAY:                        parseIntList(rhs, mByMonthDayList, -31, 31);                        break;                    case BYYEARDAY:                        parseIntList(rhs, mByYearDayList, -366, 366);                        break;                    case BYWEEKNO:                        parseIntList(rhs, mByWeekNoList, -53, 53);                        break;                    case BYMONTH:                        parseIntList(rhs, mByMonthList, 1, 12);                        break;                    case BYSETPOS:                        parseIntList(rhs, mBySetPosList, Integer.MIN_VALUE, Integer.MAX_VALUE);                        break;                    case WKST:                        mWkSt = ZWeekDay.valueOf(rhs);                        break;                    }                } catch(IllegalArgumentException e) {                    ZimbraLog.calendar.debug(new Formatter().format("Skipping unknown RECUR token: \"%s\" in Recur \"%s\"", s[0], str));                }            }        } catch (ParseException e) {            throw ServiceException.FAILURE("Parse error for recur \""+str+"\"", null);        }    }