Нас просят настроить разрешения при создании документа.
В основном написанная часть кода воспроизводится ниже:
public void onEvent(ObjectChangeEvent event, Id eventId) {
if (event instanceof CreationEvent) {
Document doc = (Document) event.get_SourceObject();
AccessPermissionList permissions = doc.get_Permissions();
String creatorGranteeName = getCreatorGranteeName(doc);
Iterator<AccessPermission> iter = permissions.iterator();
boolean found = false;
while (iter.hasNext()) {
AccessPermission ace = (AccessPermission) iter.next();
if (ace.get_GranteeName().equals(creatorGranteeName)) {
permissions.remove(ace);
// relevant ? is "permission" duplicated ?
doc.set_Permissions(permissions);
break;
}
}
if (!found) return ; // no need to save
doc.save(RefreshMode.REFRESH); // --> triggers CreationEvent -> loop
System.out.println("Saved."); // never reached
}
}
Я пробовал два способа: препроцессор или подписка.
Препроцессор не работает, так как документ не выглядит полностью построенным, особенно в отношении разрешений (установлены только администраторы). Извлечение, похоже, не работает (что понятно, поскольку документ еще не сохранен).
Поддержка аварийно завершает работу, если она синхронно обрабатывается в doc.save()
строке, независимо от режима обновления RefreshMode.REFRESH
или RefreshMode.NO_REFRESH
. Если это выполняется асинхронно, создается впечатление, что doc.save
повторно запускает CreationEvent
.
Вот и ищу помощи, если что-то не так сделал, или третий способ, если он есть.
РЕДАКТИРОВАТЬ: добавлен блочный код, который пропускает сохранение, если разрешения на удаление не найдены.