Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java FileNET P8 5.2.1 FP2-文档创建的编辑权限_Java_Filenet P8_Filenet Content Engine - Fatal编程技术网

Java FileNET P8 5.2.1 FP2-文档创建的编辑权限

Java FileNET P8 5.2.1 FP2-文档创建的编辑权限,java,filenet-p8,filenet-content-engine,Java,Filenet P8,Filenet Content Engine,我们被要求在创建文档时设置权限 基本上,编写的代码部分复制如下: public void onEvent(ObjectChangeEvent event, Id eventId) { if (event instanceof CreationEvent) { Document doc = (Document) event.get_SourceObject(); AccessPermissionList permissions = doc.get_Permi

我们被要求在创建文档时设置权限

基本上,编写的代码部分复制如下:

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
    }
}
public void onEvent(objectchangeent事件,Id eventId){
if(CreationEvent的事件实例){
Document doc=(Document)事件;
AccessPermissionList permissions=doc.get_permissions();
字符串CreatorGranteName=GetCreatorGranteName(文档);
迭代器iter=permissions.Iterator();
布尔值=false;
while(iter.hasNext()){
AccessPermission ace=(AccessPermission)iter.next();
if(ace.get_GranteeName().equals(CreatorGranteName)){
权限。删除(ace);
//相关?是否重复“许可”?
单据设置权限(权限);
打破
}
}
if(!found)return;//不需要保存
doc.save(RefreshMode.REFRESH);//-->触发CreationEvent->loop
System.out.println(“已保存”);//从未到达
}
}
我尝试了两种方法:预处理器或订阅

预处理器无法工作,因为文档似乎未完全生成,特别是关于权限(仅设置了管理员)。抓取似乎不起作用(这是可以理解的,因为文档尚未存储)

Susbcription如果在
doc.save()
行同步处理,则会崩溃,无论刷新模式是
RefreshMode.refresh
还是
RefreshMode.NO\u refresh
。 如果异步完成,它似乎会循环,好像
doc.save
重新触发
CreationEvent

所以,如果我做错了什么,我会寻求帮助,如果有第三种方法,我会寻求帮助


编辑:添加了块代码,如果找不到删除权限,将跳过保存。

由于声誉问题,我无法发表评论,因此我必须回答 你试过了吗

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);`

因为声誉问题,我不能发表评论,所以我必须回答 你试过了吗

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);`

正如@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);
        }
    }
}
//只保留相关行。
公共类CustomEventAction实现EventActionHandler{
// [...]
public void OneEvent(ObjectChangeEvent事件,Id eventId){
if(CreationEvent的事件实例){
ObjectStore os=event.getObjectStore();
Id=event.get_SourceObjectId();
过滤元件fe=
新FilterElement(null,null,null,“权限创建者”,null);
PropertyFilter pf=新的PropertyFilter();
pf.附加属性(fe);
Document doc=Factory.Document.fetchInstance(os、id、pf);
AccessPermissionList权限;
字符串CreatorGranteName=GetCreatorGranteName(文档);
权限=doc.get_permissions();
迭代器iter=permissions.Iterator();
布尔值=false;
while(iter.hasNext()){
AccessPermission ace=(AccessPermission)iter.next();
if(ace.get_GranteeName().equals(CreatorGranteName)){
权限。删除(ace);
发现=真;
打破
}
}
如果(!找到){
返回;
}
单据保存(刷新模式,刷新);
}
}
}

正如@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);
        }
    }
}
//只保留相关行。
公共类CustomEventAction实现EventActionHandler{
// [...]
public void OneEvent(ObjectChangeEvent事件,Id eventId){
if(CreationEvent的事件实例){
ObjectStore os=event.getObjectStore();
Id=event.get_SourceObjectId();
过滤元件fe=
新FilterElement(null,null,null,“权限创建者”,null);
PropertyFilter pf=新的PropertyFilter();
pf.附加属性(fe);
Document doc=Factory.Document.fetchInstance(os、id、pf);
AccessPermissionList权限;
字符串CreatorGranteName=GetCreatorGranteName(文档);
权限=doc.get_permissions();
迭代器iter=permissions.Iterator();
布尔值=false;
while(iter.hasNext()){
AccessPermission ace=(AccessPermission)iter.next();
if(ace.get_GranteeName().equals(CreatorGranteName)){
权限。删除(ace);
发现=真;
打破
}
}
如果(!找到){
返回;
}
单据保存(刷新模式,刷新);
}
}
}

我没有,但目的是什么?这是否防止再次引发
CreationEvent