読者です 読者をやめる 読者になる 読者になる

ExcelBaseParticipantProviderを試す(3)

ExcelBaseParticipantProvider#getAuthorizedUserIds()については、だいぶ大きな勘違いをしてました。
type部分の記述方法とその意味ですね。

type部分は

  • ExcelBaseParticipantProvider#hasAuthority(IdentityInfo)

と、

  • ExcelBaseParticipantProvider#getAuthorizedUserIds(ParticipantContext)

の両方で使われます。

で、前者は単純なもので、指定したユーザIDに対するロールを取得するためにtypeを使います。単にtype部分で合致するid(+name)があるカラムのロールを取得するだけです。

勘違いしていたというか今回やっとわかったのは後者。
type部分が階層構造をとるわけです。id/nameの対である列が、『営業部>第3課>ほげほげ担当』のように左→右=上位→下位となるようになっているわけですね。
と、言葉で書いても全く通じないので、今度図で表記してみようかなとは思いますが今回は省略。


で、ExcelBaseParticipantProvider#getAuthorizedUserIds(ParticipantContext) の仕様で1点気になったことがあります。

あるフローにおいて、
データ登録可能なロールが"ロールA"であり、
最初のManual-stopする伝票箱(アクティビティ)も"ロールA"のスイムレーン上にあるときに、
participantName="ロールA"に所属する{userIDNumber=1, userIDString="ユーザ1"}
というユーザでデータを登録すると、このユーザ自身には権限が与えられないということが起こったわけです。

確認してみたところ、type欄だけを元に権限を与える先を決定しているのですが、実行ユーザのロールと同じロールは結果に含まれないので(下位ロールのみを拾っている)、同じロールのスイムレーンにアクティビティが連続している場合にうまくいかないようです。

で、

    public List<IdentityInfo> getAuthorizedUserIds(ParticipantContext context) {
        List<IdentityInfo> result = new ArrayList<IdentityInfo>();
        for (BuriExcelPrtiPrvidrItemDto itemDto : findParticipantName(context)) {
            IdentityInfo info = new IdentityInfo();
            info.setIdNumber(itemDto.getId());
            info.setIdString(itemDto.getName());
            result.add(info);
        }
        if (hasAuthority(context)) { // 実行ユーザも適切な権限を持つのであれば追加する
            result.add(context.getCurrentUserId());
        }
        return result;
    }

のようにreturn前の3行を追加してみると、僕が予想した動きになりました。

この修正はどうでしょうかね。
とりあえず既存テストはオールグリーンのままでしたが...。