[CAIレシピ] テキストファイルの作成

## はじめに

この記事では、CAIプロセスでプレーンテキストファイルを作成する手順を確認しています。

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

- [はじめてCAIを使う際に](https://qiita.com/shunsuzu/private/12b8dbd08a30efa0003a)
- [プロセスの作成と実行(匿名認証と基本認証)](https://qiita.com/shunsuzu/private/01d91caedb92bd7781ea)
- [割り当てステップと、各種変数フィールドの利用](https://qiita.com/shunsuzu/private/fae696539cd245828848)

## テキストファイルの作成
### ファイルアプリケーション接続の作成

1. IICSにログインして __アプリケーション統合__ のページに移動、 __新規メニュー__ を選択して __アプリケーション接続__ の作成画面を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/eb39c3d0-50b3-d227-cc07-da9ed33941a6.png)

1. アプリケーション接続のタイプとして __File__ を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/c7390011-998b-aff0-b916-98aee2ad1506.png)

1. アプリケーション接続の __名前__ に __recipe-appConn-FileWrite__、ランタイム環境に __Secure Agent__ を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/984e3031-718b-ec51-c6c0-5304e8fc5be8.png)

1. __イベントターゲット__ タブを選択して、__File Writer__ イベントを追加します。このイベントはプレーンテキストファイルやXMLファイルなどの生成時に利用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/69b89376-5636-367e-fd0e-2b97c8352989.png)


1. __File Writer__ イベントの必須項目かつ規定値がブランクである __Directory__ プロパティを設定します。このプロパティにはファイルを保存するSecure Agent実行環境のディレクトリを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/b57de238-656e-4fdc-8b5e-4b846f52f20d.png)
各プロパティについては後述する[参考 - File接続ターゲットイベントの各プロパティ](#参考---file接続ターゲットイベントの各プロパティ)に概要を記載しています。


1. __イベントターゲット__ タブを選択して、__Delimited Content Writer__ イベントを追加します。このイベントは、CSVファイルの生成時に利用します(今回のレシピでは使用しません、別のレシピで使用します)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/4350a610-d8f4-0dd7-d978-6c70f3500911.png)

1. __Delimited Content Writer__ の必須項目かつ規定値がブランクである __Directory__ プロパティを設定します。このプロパティにはファイルを保存するSecure Agent実行環境のディレクトリを指定します。

1. アプリケーション接続の保存、パブリッシュ を実行します。

### CAIプロセスの作成

次の手順では作成したアプリケーション接続を利用するCAIプロセスを作成しています。

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

1. 一時フィールドとして __tmpFileWrite__ を定義します。__定義された接続タイプ__ には作成したアプリケーション接続を指定、__タイプ__ として __File write task__ を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/6505fc5c-c2d7-3101-a141-350f2bcdfc74.png)

1. CAIプロセスが次の順に実行されるように各種ステップを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/463cbccf-21f3-db08-6d78-af234a025c10.png)

1. 割り当てステップを選択して、次のように各フィールドに値を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/e399a8f9-673e-ef76-5b90-87a648c45731.png)
   <table>
        <tr>
            <th>フィールド</th>
            <th>割り当て</th>
            <th>値</th>
        </tr>
        <tr>
            <td>tmpFileWrite<br>> File name</td>
            <td>計算式</td>
            <td>'test-recipe-pca-fileWritePlainText.csv'</td>
        </tr>
        <tr>
            <td>tmpFileWrite<br>> Content Format</td>
            <td>コンテンツ</td>
            <td>Plain Text</td>
        </tr>
        <tr>
            <td>tmpFileWrite<br>> Plain File Content</td>
            <td>計算式</td>
            <td>concat("This is File Write Test", "&&##10;", "by CAI Process")<br>改行を含めた文字列を生成しています</td>
        </tr>
    </table>
1. サービスステップを選択して、__サービスタイプ=接続__,__接続=recipe-appConn-FileWrite(作成したアプリケーション接続)__,__アクション=FileWriter__ を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/cba038fb-d1cf-292f-4509-5f51ef8cc8c2.png)

1. サービスステップの __入力フィールド__ を選択して、__fileWriteTask__ に一時フィールド __tmpFileWrite__ を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/107a873a-1e18-6b1c-81d7-81121975ccaa.png)


### CAIプロセスの実行

curlコマンドを例とした動作確認結果です。CAIプロセスが正常終了してレスポンスコードとしてHTTP 200が返ってくる動作、CAIプロセスで指定した値がテキストファイルに出力されている動作を確認できます。

```:curlコマンドと実行結果
curl -I https://usw5-cai.dm-us.informaticacloud.com/active-bpel/public/rt/<---ご利用のOrg ID--->/recipe-pca-fileWritePlainText

//実行結果
HTTP/2 200
略

//出力ファイルの確認
$ cat test-recipe-pca-fileWritePlainText.csv
This is File Write Test
by CAI Process
```

## 参考 - File接続ターゲットイベントの各プロパティ


### 共通プロパティ
- __ディレクトリ(Directory)__
ファイルを格納するディレクトリの相対パスを指定します。
- __ファイルの存在(File Exists)__
同じ名前のファイルがすでに存在している場合の処理を決定します。
__上書き(OVerride)__: 既存のファイルを置き換えます。ターゲットが生成されたときに既存のファイルをどのように処理するかを決定するには、［削除の強制］オプションを選択します。
__付加(Append)__: 既存のファイルにコンテンツを追加します。一時的なプレフィックスや一時的なファイル名は指定しないでください。
__失敗(Fail)__: 競合ファイルをスキップして、ファイル名がすでに存在することを示す例外をスローします。
__無視(Ignore)__: 競合ファイルをスキップして、問題を無視します（例外のスローなし）。
__移動(Move)__: ターゲットファイルに書き込む前に既存のファイルを移動します。既存のファイルの移動先フォルダを指定するには、［既存の移動］を使用します。
__名前の変更(TryRename)__: ファイル名が存在するかどうかを確認せずに、ファイルの名前を一時的な名前から実際の名前に変更します。［一時的なファイル名］も指定している場合にのみ使用します。一部のファイルシステムまたはFTPサーバーでは、この方が早い場合があります。
- __既存の移動(Move Existing)__
［ファイルの存在］の［移動］オプションと一緒に使用すると、ターゲットに書き込む際に既存のファイルの場所を指定できます。
このフィールドに「backup」と入力するだけで、既存のフィールドをバックアップフォルダに移動できます。バックアップファイルの名前を移動時に変更し、以降の操作でバックアップファイルが新しいバージョンに置き換わらないようにするには、ファイル名を決定するための式を入力します。以下に例を示します。
`backup\${file:name}_${file:modified}`
この式は、既存のファイルが移動されるたびに新しいファイルをバックアップフォルダに作成し、ファイル名にタイムスタンプを追加します。
[Apache Camel File Expression言語](http://camel.apache.org/file-language.html)を活用できます。

- __削除の強制(Eager Delete)__
一時ファイルに書き込む前にターゲットファイルを削除するには、 ［はい］を選択します。この場合、［ファイルの存在］オプションに［上書き］を選択し、［一時的なファイル名］を指定する必要もあります（以下を参照）。
待機して、一時ファイルに書き込んで出力ファイルの名前に変更する準備が整った場合にのみターゲットファイルを削除するには、 ［いいえ］を選択します。これは、書き込み操作が完了するまでの間、既存のファイルを使えるようにする場合などに使用できます。
- __書き込みの強制(Force Writes)__
ファイルシステムがすべてのデータをターゲットファイルに書き込むようにし、システム障害が発生した場合はすべてのデータが維持されるようにするには、 ［はい］を選択します。
ログデータを扱っており、ファイルシステム障害が発生した場合のデータフラグメントの損失も気にしない場合は、 ［いいえ］を選択します。これにより、パフォーマンスがやや向上します。
- __書き込みバッファサイズ(Write Buffer Size)__
書き込みバッファのサイズ（バイト単位）を決定します。

### File Writerイベント
- __一時的なプレフィックス(Temp File Name)__
ファイルに一時的な名前を付ける場合に、ファイル名のプレフィックスを入力します。書き込み操作が完了したら元の名前に戻します。
［ファイルの存在］オプションに［付加］を選択した場合は無視されます。
- __一時的なファイル名(Write Buffer Size)__
プレフィックスの代わりに、一時ファイル名を決定するための式を入力します。
[Apache Camel File Expression言語](http://camel.apache.org/file-language.html)を活用できます。
［ファイルの存在］オプションに［付加］を選択した場合は無視されます。
- __文字セット(Character Set)__
ファイルのエンコーディングを決定します。指定しない場合、イベントターゲットはUTF-8のファイルエンコーディングを使用します。

### Delimited Content Writerイベント
- __区切り文字(Delimiter)__
このイベントターゲットが生成したファイルで使用するための区切り文字。スペースまたはタブを使用するには、エスケープ文字（「\s」または「\t」）として入力します。
- __テキスト修飾子(Text Qualifier)__
このイベントターゲットが作成したファイルで使用するテキスト修飾子。スペースまたはタブを使用するには、エスケープ文字（「\s」または「\t」）として入力します。
- __ヘッダーのスキップ(Skip Headers)__
生成したコンテンツにヘッダー名があるかどうかを確認します。ヘッダー名なしで区切りコンテンツを保存する場合は ［はい］を選択します。
- __行の末尾のスタイル(Line Ending Style)__
生成されたコンテンツでの行の末尾のスタイルを決定します（Windowsスタイルは\r\n、Unixスタイルは\n）。






## 参照

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