2017-06-15 11 views
0

ドキュメントの作成時にアクセス許可を設定するように求められます。 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 
    } 
} 

は、私は2つの方法を試してみました。

プリプロセッサは、ドキュメントが完全に構築されていない、特にアクセス許可(管理者のみが設定されている)のため動作しません。取得は機能していないようです(これは、文書がまだ保存されていないためわかります)。

Susbcriptionクラッシュそれは同期は関係なく、リフレッシュモードがRefreshMode.REFRESHRefreshMode.NO_REFRESHであれば、doc.save()ラインで処理されます場合。 asynchrounslyが完了した場合、ループのように見えます。doc.saveは、CreationEventをリトリガーします。

私は何か問題があった場合、または存在する場合は第3の方法を探しています。

EDIT:削除するアクセス許可が見つからなかった場合、保存をスキップするブロックコードが追加されました。私が原因で評判のコメントすることはできませんので

答えて

1

@Manjunatha Muniyappaによると、私はCreationEventオブジェクトから取得するのではなく、オブジェクトストアからドキュメントを取得することで問題を解決しました。 It seems to be recommended by the editor"ベストプラクティスとして、イベントの永続ソースオブジェクトを取得します")。また、このようにして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); 
     } 
    } 
} 
1

、私はあなたのよう試すことができ

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

代わりevent.get_SourceObject();のも

更新答えdoc.save()

前に、それはあなたがしようとしました 答えなければなりません

`changeEvent.get_SourceObjectId(); 
Document doc= Factory.Document.fetchInstance(os, documentId, propertyFilter);` 
+0

私はしませんでしたが、何が目的ですか?これは 'CreationEvent'を再び呼び起こさないのでしょうか?また、それは新しいバージョンを作成するようです(私はcheckOutが必要と思われる)。 – Amessihel

+0

チェックインの前にコードが文書を保存していますので、チェックインして保存すると問題は解決します。また、event.get_SourceObject()の代わりに。 changeEvent.get_SourceObjectId();のようにしてみてください。ドキュメントdoc = Factory.Document.fetchInstance(os、documentId、propertyFilter); –

+0

また、 'checkin()'呼び出しに関する部分を削除してください。この文脈では関係ありませんでした。前回の専門家と同じように 'Document.fetchInstance()'呼び出しに言及し、より完全で正確なので私たちの専門家の答えの後に設計されたものを選択したので、私はあなたをアップしました。 – Amessihel

関連する問題