[CAIレシピ] リスト型のプロセスオブジェクト変数の利用

## はじめに

[プロセスオブジェクトによるユーザー定義変数の利用](https://qiita.com/shunsuzu/private/70f1c56f95536645e62f)では、プロセスオブジェクトの利用手順を確認しました。この記事では、より実践的な実装方法を理解するためにプロセスオブジェクトのフィールドをリスト型(`プログラミングにおける配列`)として利用する手順を確認します。

なお、この記事は次の記事の内容を理解していることを前提としています。

- [はじめてCAIを使う際に](https://qiita.com/shunsuzu/private/12b8dbd08a30efa0003a)
- [プロセスの作成と実行(匿名認証と基本認証)](https://qiita.com/shunsuzu/private/01d91caedb92bd7781ea)
- [割り当てステップと、各種変数フィールドの利用](https://qiita.com/shunsuzu/private/fae696539cd245828848)
- [ディシジョンステップによるによる分岐処理](https://qiita.com/shunsuzu/private/cf69000890ccdfd1d42f)
- [ジャンプステップによる実行制御](https://qiita.com/shunsuzu/private/07da81c4301cbe5bfe9a)
- [プロセスオブジェクトによるユーザー定義変数の利用](https://qiita.com/shunsuzu/private/70f1c56f95536645e62f)

## リスト型のプロセスオブジェクトを利用する

### CAIプロセスの作成

次の手順では [プロセスオブジェクトによるユーザー定義変数の利用](https://qiita.com/shunsuzu/private/70f1c56f95536645e62f) で作成したプロセスオブジェクトを入力フィールドとして受け取り、内容を編集・コピーした値を出力フィールドとして返すCAIプロセスを作成しています。

1. CAIプロセスを次の設定で作成します。
    - 名称を __recipe-pca-processObjectList__ とする
    - __匿名アクセス__ を許可する
    - __クラウドサーバー__ にデプロイする

1. 入力フィールド __input__ を __リスト型__ として __タイプ=recipe-po-processObjectTest (作成したプロセスオブジェクト)__ にて定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/16d32e54-91cc-c2b0-16ee-19e56c867b4e.png)

1. 同様に、出力フィールド __output__ を __リスト型__ として __タイプ=recipe-po-processObjectTest (作成したプロセスオブジェクト)__ にて定義します。

1. 次の一時フィールドを定義します。
   <table  style="margin: 0;">
        <tr>
            <th>№</th>
            <th>名前</th>
            <th>タイプ</th>
            <th>初期値</th>
            <th>概要</th>
        </tr>
        <tr>
            <td>1</td>
            <td>tmpPO</td>
            <td>recipe-po-processObjectTest</td>
            <td></td>
            <td>出力用ProcessObject用の一時的なフィールド</td>
        </tr>
        <tr>
            <td>2</td>
            <td>tmpCount</td>
            <td>整数</td>
            <td></td>
            <td>入力フィールドとして受け取ったリスト型の長さ</td>
        </tr>
        <tr>
            <td>3</td>
            <td>tmpLength</td>
            <td>整数</td>
            <td>1</td>
            <td>イテレート処理用カウンタ変数</td>
        </tr>
    </table>

1. CAIプロセスが次の順に実行されるように各種ステップを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/40093f26-d47c-79fa-0f3a-c76db8237857.png)
配置手順によってはディシジョンステップの終端(![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/d76156fd-388d-9591-a7bc-8cf1390d99bd.png))が上記スクリーンショットとは異なる場所に配置される(または、表示されない)場合があります。


1. 割り当てステップをステップを選択して、一時フィールド __tmpLength__ に __計算式__ として `list:count($input.input )` を指定します。この計算式では一時フィールドに、リスト型入力フィールドの要素数(長さ)を代入しています。

1. ディシジョンステップを選択して、__tmpCount__ が __tmpLength__ 以下の場合と、それ以外の場合で分岐する設定をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/0ab7ff37-ef7b-5635-57fe-48042f1dc442.png)
この処理では、tmpCount(`イテレート処理用のカウンタ変数`)の値が、tmpLength(`入力フィールドの要素数`)以下の場合に処理を継続します。

1. 割り当てステップを選択して、次のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/41e1bf84-37f1-c347-b5fa-722baf141599.png)

    <table>
      <tr>
          <th>フィールド</th>
          <th>割り当て</th>
          <th>値</th>
          <th>概要</th>
      </tr>
      <tr>
          <td>tmpPO > id</td>
          <td>計算式</td>
          <td>concat("new-",\$input.input [\$temp.tmpCount ]/id)</td>
          <td>入力フィールドのX番目のid値を一時フィールドにコピー</td>
      </tr>
      <tr>
          <td>tmpPO > value</td>
          <td>計算式</td>
          <td>concat("new-",\$input.input [\$temp.tmpCount ]/value)</td>
          <td>入力フィールドのX番目のvalue値を一時フィールドにコピー</td>
      </tr>
      <tr>
          <td>output</td>
          <td>追加</td>
          <td>tmpPO</td>
          <td>出力フィールドに一時フィールドを追加</td>
      </tr>
      <tr>
          <td>tmpCount</td>
          <td>計算式</td>
          <td>$temp.tmpCount + 1</td>
          <td>カウンタ変数のインクリメント</td>
      </tr>
    </table>

1. ジャンプステップを選択して、遷移先としてディシジョンステップ(今回の例では __tmpCount__)を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/60a0f24f-a201-a0d9-242d-7f9053e74009.png)

### CAIプロセスの実行

curlコマンドを例とした動作確認結果です。入力フィールドをコピー・編集した値が出力フィールドとして得られる動作を確認できました。

```:curlコマンドと実行結果
// curl コマンド
curl https://<IICS・CAIサーバー>/active-bpel/public/rt/<Org ID>/recipe-pca-processObjectList \
-H 'Content-Type: application/json' \
-d '{"input": [
{"id" : "aaa1", "value" : "bbb1"},
{"id" : "aaa2", "value" : "bbb2"},
{"id" : "aaa3", "value" : "bbb3"}
]}'

// 実行結果
{"output":[
  {"id":"new-aaa1","value":"new-bbb1"},
  {"id":"new-aaa2","value":"new-bbb2"},
  {"id":"new-aaa3","value":"new-bbb3"}
]}
```



## 参照

- [Qiita - IICS CAIの実装レシピ - マスターページ](https://qiita.com/shunsuzu/private/3d1971ef6e3b993516aa)