FileNET P8 5.2.1 FP2 — редактировать разрешения на создание документа

Нас просят настроить разрешения при создании документа.

В основном написанная часть кода воспроизводится ниже:

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.

Вот и ищу помощи, если что-то не так сделал, или третий способ, если он есть.

РЕДАКТИРОВАТЬ: добавлен блочный код, который пропускает сохранение, если разрешения на удаление не найдены.


person Amessihel    schedule 15.06.2017    source источник


Ответы (2)


Как сказал @Manjunatha Muniyappa, я решил свою проблему, извлекая документ из хранилища объектов, а не получая его из объекта CreationEvent. Кажется, это рекомендуется редактором ("рекомендуется получить сохраненный исходный объект события"). Также таким образом CreationEvent не будет поднят (я не знаю, почему).

Таким образом, решение состоит в том, чтобы создать асинхронную подписку на событие создания, связанную с этим классом обработчика ниже:

// Only relevant lines are kept.
public class CustomEventAction implements EventActionHandler {
    // [...]
    public void onEvent(ObjectChangeEvent event, Id eventId) {
        if (event instanceof CreationEvent) {
            ObjectStore os = event.getObjectStore();
            Id id = event.get_SourceObjectId();
            FilterElement fe = 
                    new FilterElement(null, null, null, "permissions creator", null);
            PropertyFilter pf = new PropertyFilter();
            pf.addIncludeProperty(fe);
            Document doc = Factory.Document.fetchInstance(os, id, pf);

            AccessPermissionList permissions;

            String creatorGranteeName = getCreatorGranteeName(doc);
            permissions = doc.get_Permissions();
            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);
                    found = true;
                    break;
                }
            }

            if (!found) {
                return;
            }

            doc.save(RefreshMode.REFRESH);
        }
    }
}
person Amessihel    schedule 16.06.2017

Поскольку я не могу комментировать из-за репутации, я должен ответить на него. Вы пытались

doc.checkin(AutoClassify.DO_NOT_AUTO_CLASSIFY, CheckinType.MAJOR_VERSION);

до doc.save()

Обновленный ответ

Также вместо event.get_SourceObject(); можно попробовать как

`changeEvent.get_SourceObjectId(); 
Document doc= Factory.Document.fetchInstance(os, documentId, propertyFilter);`
person bajji    schedule 15.06.2017
comment
Я не делал, но какая цель? Мешает ли это снова поднять CreationEvent ? Также кажется, что он создаст новую версию (я думаю, потребуется проверка). - person Amessihel; 15.06.2017
comment
Ваш код сохраняет документ перед регистрацией, поэтому, если вы зарегистрируетесь и сохраните, проблема будет решена. Также вместо event.get_SourceObject(); вы можете попробовать как changeEvent.get_SourceObjectId(); Document doc = Factory.Document.fetchInstance(os, documentId, propertyFilter); - person bajji; 15.06.2017
comment
Также, пожалуйста, удалите часть, касающуюся checkin() звонка, она не имеет отношения к данному контексту. Я проголосовал за вас, потому что вы упомянули вызов Document.fetchInstance(), как и наш эксперт прямо перед этим, и выбрали мой, разработанный после ответа нашего эксперта, поскольку он более полный / точный. - person Amessihel; 18.06.2017