Preprocessor, Postprocessorの概要説明と使用方法

# 目次
1. はじめに
1. 概要
1. 完成イメージ
1. 実装前
1. 実装方法
1. 実装後
1. まとめ

# はじめに
今回は、Foundry（旧Fabric）のPreProcessor,PostProcessorの機能や
実装方法について紹介していきます。

※今回は、VoltMX Foundryを用いて説明を行います。
Quantumと基本的には同じですが、メソッド名が一部異なる点がありますので、
Quantumご利用の方は、メソッド名など読み替えながら進めてください。

# 概要
PreProcessorは、外部データソースにデータを渡す前に呼び出される機能です。
例えば、リクエスト値が空の場合にエラーメッセージを表示する等で使用することができます。

PostProcessorは、外部データからデータが受信された後、
そのデータがフロントアプリに返される前に呼び出される機能です。
例えば、アプリにデータを返す前に一部のデータ形式を変更したり、データを追加する際に使用することができます。


# 完成イメージ
では早速実装を行っていきましょう！

今回は例として、リクエストの値が空の場合に、
「○○を入力してください」とエラーを表示するような処理を加えてみたいと思います。
![スクリーンショット 0004-12-06 14.27.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/eb2780ad-27a4-b749-632b-f092d5657b2e.png)


既にIntegration Serviceで外部APIを使用して、
天気情報を取得するgetWeatherというAPIを作成しておきましたので、
こちらを使って説明を行います。

リクエスト値である`cityName`を入力すると、
その都市の天気情報が取得できるという内容になっています。

![スクリーンショット 0004-12-06 13.42.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/f4fa657b-5998-63f3-38ab-a023d97220bf.png)


# 実装前  
現状はPreProcessorに何も設定を行っていないため、
リクエスト値を空にすると、このような結果となります。
![スクリーンショット 0004-12-06 13.45.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/7f13a43e-1e73-6289-218c-35a383fca6d9.png)

このままだと、APIの呼び出しに失敗した、ということ以外何もわからないため、
何が原因のエラーなのかわかるように実装してみましょう！


# 実装方法
## メニューを開く
まずは、Integration Serviceの「Advanced」のメニューを開きましょう。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3539323236342f66346661363537622d353939382d363366332d333861622d6130323364393732323062662e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/50be38fd-d904-0193-c709-9612b84c6e14.png)

すると、PreProcessor,PostProcessorを設定できる画面が開きます。

![スクリーンショット 0004-12-06 13.51.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/fc8d4ddc-da5c-6846-8f37-459ea03fdc27.png)

## 使用できる言語
ここでは、JavaまたはJavascript、Rules（※）の形式で記述することができます。

:::note info
※補足
Rulesは、Fabric V8 SP4から追加されたオプションで、
より人間の言語に近づけたMVELという言語を採用しているため、
以下のように感覚的にわかりやすいコードで記述することができます。
```
name: "Convert account code to type in post-processor"
description: " Rule to convert account type to code and add details in result"
condition: "AccountType == 1"
actions:
- "results.addParam(\"AccountType\", \"Loan Account\")"
- "results.addParam(\"Message\", \"This is a Loan Account\")"
```
今回は、詳しく説明しませんが、
もっと詳しく知りたい方は公式ドキュメントを参考にしてみてくださいね👀

https://docs.kony.com/konylibrary/konyfabric/V9M2/kony_fabric_user_guide/Content/Rules.htm

:::




## コーディング
今回は、Javascriptを使用して記載します。
Javascriptのラジオボタンをクリックすると、
入力欄が表示されますので以下のように入力しました。


```preProcessor.js
function processInput() {
    //リクエスト値を取得する
    var cityName = request.getParameter('cityName');

    if (!cityName) {
        var newOutputParam1 = new com.hcl.voltmx.middleware.dataobject.Param();
        newOutputParam1.setName('errorCode');
        newOutputParam1.setValue('ERR001');
        result.setParam(newOutputParam1);

        var newOutputParam2 = new com.hcl.voltmx.middleware.dataobject.Param();
        newOutputParam2.setName('errorMessage');
        newOutputParam2.setValue('都市名を入力してください。');
        result.setParam(newOutputParam2);
        return false;
    } else {
        return true;
    }
}
processInput();
```

処理の順に説明を行っていきます。


`getParameter`
()内にRequest Inputで設定したパラメーターを指定することで、
その値に入力された値を取得することができるメソッドになります。
今回は、Request InputのcityNameというパラメータを取得し、
cityNameという変数に代入しています。

if文の中では、
cityNameのデータが存在しない場合、
エラーメッセージを表示し、
そうでない場合は、trueを返す処理を行っています。

`new com.hcl.voltmx.middleware.dataobject.Param()`
（※Quantumの場合は、`new com.konylabs.middleware.dataobject.Param`）

こちらを実行する際、
`setName`でキーを、`setValue`でバリューを指定することで、
データ取得後の結果に新しいパラメーターを追加することができます。

今回、cityNameがない場合、
「都市名を入力してください」と表示したいので、
それぞれエラーコードとエラーメッセージを設定しています。

実装ができたので、早速実行してみましょう！

# 実装後

![ezgif-5-708258aa18.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/2210bca7-60db-c827-9a39-add4a470b198.gif)

Request InputのcityNameを空にした状態で実行すると、
「都市名を入力してください」のエラーメッセージとエラーコードが表示され、
cityNameを入力した状態で実行すると、
正常に天気情報が取得できていることがわかりますね！

今回は、PreProcessorの実装方法を詳しくご説明しましたが、
PostProcessorについても同様に実装が可能です。
また、Integration Service以外にもOrchestration Serviceでも同じく設定が可能です。

使えるメソッドなどは公式ドキュメントに記載がありますので、
参考にしながら進めてみてくださいね:relaxed:！

・VoltMX

https://opensource.hcltechsw.com/volt-mx-docs/java_docs_apis/MiddlewareAPI/overview-summary.html

・Quantum

https://docs.kony.com/konylibrary/integration/MiddlewareAPI/overview-summary.html

# まとめ
今回は、Pre-Postprocessorの概要と使用方法について紹介しました。
フロントアプリと外部サービス間の処理の中で、
データを追加・削除したり形式を変更したりと便利な機能ですので、ぜひ使ってみてくださいね！

# 参考
https://docs.kony.com/konylibrary/konyfabric/kony_fabric_user_guide/Content/Rules_as_Pre_Post_Processors.htm
https://opensource.hcltechsw.com/volt-mx-docs/java_docs_apis/MiddlewareAPI/overview-summary.html
https://docs.kony.com/konylibrary/integration/MiddlewareAPI/overview-summary.html