#xpages #lotus-domino #icalendar #xpages-extlib
#xpages #lotus-domino #icalendar #xpages-extlib
Вопрос:
У меня есть пользовательский XPage java REST api в Lotus для обработки резервирования, пока все идет хорошо. Однако у меня есть одна странная «проблема»: всякий раз, когда я обновляю собрание, название зала (например Test room/Site
) добавляется к LOCATION
строке iCalendar.
Я обновляю встречи, находя запись в календаре пользователя ( NotesCalendar.getEntryByUID
), затем я вызываю NotesCalendarEntry.read()
, чтобы получить строку iCalendar, затем я вручную заменяю значения определенных полей iCalendar, например DTSTART
, на те, которые я хочу обновить (я только обновляю DTSTART, DTEND и SUMMARY). Наконец, я звоню NotesCalendarEntry.update(string)
, чтобы обновить событие. Это работает хорошо, однако с каждым обновлением поле МЕСТОПОЛОЖЕНИЯ становится все больше и больше, потому что к нему постоянно добавляется название комнаты, и, наконец, это выглядит как:
LOCATION: Test Room/Test SiteTest Room/Test SiteTest Room/Test Site
и т.д.
Я делаю что-то не так? Как я могу это предотвратить? Я не хочу каждый раз очищать поле местоположения, потому что пользователи могут указывать свое собственное местоположение, и я бы хотел сохранить его (в этом случае название номера также добавляется к исходному тексту местоположения)
Код:
NotesCalendar cal = session.getCalendar( session.getDbDirectory( session.getServerName() ).openMailDatabase() );
NotesCalendarEntry calEntry = cal.getEntryByUNID(apptUNID); // apptUNID is taken from http json payload
String iCalE = calEntry.read();
// 20190326T160000Z
String dStart = DateUtil.formatICalendar(dtStart);
String dEnd = DateUtil.formatICalendar(dtEnd);
iCalE = iCalE.replace("\n", ""); // I added this because same was happening to literal n (not actual line breaks)
StringBuilder sb = new StringBuilder(iCalE);
int StartIndex = iCalE.indexOf("BEGIN:VEVENT"); // DTSTART is also in BEGIN:VTIMEZONE so we need to exclude that
int tmpIndex = iCalE.indexOf("DTSTART", StartIndex) 7; // 7 = len of DTSTART
int LineBreakIndex = iCalE.indexOf('n', tmpIndex);
if(iCalE.charAt(LineBreakIndex-1) == 'r')
LineBreakIndex--;
sb.delete(tmpIndex, LineBreakIndex);
sb.insert(tmpIndex, ":" dStart); // start date
tmpIndex = sb.indexOf("DTEND", StartIndex) 5;
LineBreakIndex = sb.indexOf(Character.toString('n'), tmpIndex);
if(sb.charAt(LineBreakIndex-1) == 'r')
LineBreakIndex--;
sb.delete(tmpIndex, LineBreakIndex);
sb.insert(tmpIndex, ":" dEnd);
calEntry.update(sb.toString());
calEntry.recycle();
Кроме того, могу ли я с уверенностью предположить, что строки iCalendar всегда заканчиваются символом r n ? (в настоящее время это так, у меня были некоторые проблемы с этим, но я разобрался, я не уверен, могу ли я безопасно искать ‘ r n’, хотя)
Я не использую ical4j, потому что я буквально изменяю только 2 или 3 поля и ничего больше.
Комментарии:
1. Покажите свой код, пожалуйста.
2. Добавлен код @RichardSchwartz
3. Вы пробовали добавлять необязательные аргументы в NotesCalendarentry. Вызов Update()? Значение 1 (или CS_WRITE_MODIFY_LITERAL) в третьем аргументе (флаги) для перезаписи записи календаря без сохранения предыдущих значений полей? (Я не делаю это ответом, поскольку я не специалист по xpages; Я читаю из документа для классов LotusScript.)
4. @RichardSchwartz к сожалению, это ничего не изменило, насколько я могу видеть, название комнаты всегда добавляется в конце поля местоположения. Когда я задаю МЕСТОПОЛОЖЕНИЕ для некоторого пользовательского текста, оно в конечном итоге устанавливается на
Random textnRoom name/Site name
5. Я временно исправил это, просто удалив любой текст после литерала
n
в поле местоположение, но я бы предпочел какое-нибудь правильное исправление.