创建文档时,系统会要求我们设置权限。
基本上写的代码部分复制如下:
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
}
}
字符串
我试了两种方法:预处理器或订阅。
预处理器不工作,因为文档似乎没有完全构建,特别是关于权限(仅设置管理员)。获取似乎不起作用(这是可以理解的,因为文档尚未存储)。
Susbcript在doc.save()
行 * 同步 * 处理会崩溃,不管刷新模式是RefreshMode.REFRESH
还是RefreshMode.NO_REFRESH
。如果它是 asynchrounsly 完成的,它似乎会循环,就像doc.save
重新触发CreationEvent
一样。
所以如果我做错了什么,我会寻求帮助,或者如果存在第三种方式,我会寻求帮助。
编辑:添加了块代码,如果没有找到删除权限,则跳过保存。
2条答案
按热度按时间i7uq4tfw1#
正如@Manjunatha Muniyappa所说,我通过从Object存储中获取文档而不是从CreationEvent对象中获取文档来解决我的问题。这似乎是编辑推荐的(“作为最佳实践,获取事件的持久化源对象”)。同样,通过这种方式,CreationEvent不会被引发(我不知道为什么)。
所以解决方案是在Creation Event上创建一个异步订阅,与下面这个handler类关联:
字符串
bxjv4tth2#
由于名誉关系我不能发表评论,所以我必须回答。
字符串
doc.save()
之前更新答案
也可以用
event.get_SourceObject();
代替型