はじめに
SAP Process Integration(PI7.5)/SAP Process Orchestration(SAP PI/PO)のMainstream maintenanceは2027年末までです。それにともないSAP Cloud Integration(SAP CPI)に移行することをご検討される方もいらっしゃると思います。SAP PI/POの機能差として文字コードの変換があげられます。SAP PI/PO はSFTPアダプターの設定からファイルの文字コードを任意に設定することができます。一方で、SAP CPIはファイルの文字コードを変換する機能はデフォルトでは実装されておりません。
本Blogの目的
本BlogではSAP Cloud Integrationでスクリプトを書くことでファイル上の文字コード変換を行う方法を紹介します。
前提知識
※提供画面がお客様環境と異なることがありますのでご了承ください。
環境面
- SAP CPI環境
- ファイルを出力するSFTPサーバ
- Cloud Connector
知識面
- SAP CPIにおける基本的な開発ステップを理解しているレベル
説明の流れ
- シナリオの紹介
- Cloud Connectorの接続設定
- SAP Cloud Integration iFlow開発
- まとめ
1. シナリオの紹介
ここでは文字コード変換のシナリオを説明します。
SFTP to SFTPで以下の内容のテキストファイルを送信します。
SenderとReceiverのSFTPサーバは同じとします。
テキストファイルには半角のアルファベットと数字と半角スペース、全角スペース、ひらがな、漢字、いくつかのマーク、そして改行コード(CRLF)が入っています。
以下、サクラエディタでテキストファイルを開いた画面です。
送信テキストファイル内容
文字コード変換はShift_JISからUTF-8の変換を想定しています。
2. Cloud Connectorの接続設定
以下のBlogの2. SFTPサーバ接続設定のCloud Connector部分をご参照ください。
Identity Authenticationの監査ログをCloud Integrationを利用して読み込む方法
3. SAP Cloud Integration iFlow開発
ここではSAP CPIのスクリプト機能を利用してファイルの文字コード変換を行う方法について説明します。
開発するiFlowは以下の通りです。
iFlow全体概要
まずはMonitor画面のSecurity Materialタイルより各システムの認証情報をDeployします。
Security Material
Create > User Credentialsを選択し、SFTPサーバ認証情報をDeployしてください。
SFTPの場合
Name: <任意> 本ブログではSFTP_USER
Type: User Credential
User: <SFTPサーバのユーザ名>
Password: <SFTPサーバのパスワード>
User Credential
ここでDeployした認証情報のNameはiFlowのSFTPアダプターの設定より各システムにアクセスする際に使用するのでメモしておいてください。
続いてSFTPサーバのknown hostsを追加する必要があります。
Monitor > Connectivity Testsに移動します。
Connectivity Testsタイル
SSHタブでホストキーを取得します。以下の情報を入力して、sendしてください。成功した後コピーしてテキストエディタでknown_hostsとして保存します。
Host: <Cloud Connectorで設定したVirtual Host>
Port: <Cloud Connectorで設定したVirtual Port>
Proxy Type: On-Premise
Location ID: <Cloud Connectorで設定したLocaion ID>未設定の場合は空欄
Authentication: None
*クラウド版SFTPサーバの場合は
Host: <SFTPサーバ Host>
Port: <SFTPサーバPort>
Proxy Type: Internet
Authentication: None
接続確認画面
Security Materialに戻り、Uploadボタンより先程保存したknown_hostsをアップロードします。
Security MaterialのUpload
Deploy後再度Connectivity Testsへ移動して再度接続テストを行います。
今回はAuthenticationをDeployしたSFTP認証情報を利用します。接続が成功する事を確認します。
Host: <Cloud Connectorで設定したVirtual Host>
Port: <Cloud Connectorで設定したVirtual Port>
Proxy Type: On-Premise
Location ID: <Cloud Connectorで設定したLocaion ID>未設定の場合は空欄
Authentication: User Credential
Credential Name: <Cloud IntegrationでDeployしたSFTPサーバ認証名> 本ブログではSFTP_USER
Host Key Verification: Against Tenant
*クラウド版SFTPサーバの場合は
Host: <SFTPサーバ Host>
Port: <SFTPサーバPort>
Proxy Type: Internet
Authentication: User Credential
Credential Name: <Cloud IntegrationでDeployしたSFTPサーバ認証名> 本ブログではSFTP_USER
Host Key Verification: Against Tenant
User Credentialを利用した接続確認
Designページへ移動して、任意のPackage配下に新規のiFlowを作成してください。
iFlowの作成
EditボタンよりiFlowを編集していきます。
完成形が以下になります。それぞれの中身を説明していきたいと思います。
iFlowの流れ(再掲)
①SenderのSFTPサーバの設定
SFTPアダプターの設定は以下のようになっています。
SenderのSFTPアダプターの設定
Directory: <任意のDirectory名> 本ブログではルートを指定
File Name: <任意のファイル名> 本ブログではtest_before_SJIS.txt
Address: <SCCで設定したSFTPサーバーVirtual Host>:<SCCで設定したSFTPサーバVirtual Port>
Proxy Type: On-Premise
Location ID: <SCCで設定したLocation ID> 設定してない場合は空欄
Authentication: User Name/Password
Credential Name: <Cloud IntegrationでDeployしたSFTPサーバ認証名> 本ブログではSFTP_USER
*クラウド版SFTPサーバの場合は
Directory: <任意のDirectory名> 本ブログではルートを指定
File Name: <任意のファイル名> 本ブログではtest_before_SJIS.txt
Address: <SFTPサーバHost>:<SFTPサーバPort>
Proxy Type: Internet
Authentication: User Name/Password
Credential Name: <Cloud IntegrationでDeployしたSFTPサーバ認証名> 本ブログではSFTP_USER
②読み込みテキストファイルの文字エンコーディングを指定
Content ModifierをiFlow上に設置し、Exchange PropertyにCamelCharsetNameを追加します。本ブログではExchange PropertyにてCamelCharsetNameを定義しておりますが、Message Headerにて定義しても問題ありません(
Avoiding Encoding Issues)。Senderから送られてくるファイルの文字コードを設定します。
Content Modifierの中身
③テキストファイルのテキストの文字コードをUTF-8に変換
次にGroovy Scriptを設置してCreateを押して新規Scriptを作成してください。
Scriptの作成
事前に記述してあるScriptを削除して以下のScriptをペーストしてください。OKボタンを押して保存してください。
文字コードの変換にはJavaのStringクラスを利用しています(
ドキュメントページ)。getBytes(Charset charset)を利用して、指定された文字セットを使用してStringをバイト・シーケンスにエンコード化し、結果を新規byte配列として返します。それを、new String(byte[] bytes, Charset charset)のbytesの部分にセットします。new String(byte[] bytes, Charset charset)は指定された文字セットを使用して、指定されたbyte配列を復号化することにより、新しいStringを構築しています。
import com.sap.gateway.ip.core.customdev.util.Message;
import java.util.HashMap;
def Message processData(Message message) {
//Bodyを取得
//変数bodyの中身はSJISの文字列が格納されている
def body = message.getBody(java.lang.String);
//変数bodyの文字列をSJISのbyte配列からUTF-8のbyte配列に戻し、UTF-8の文字コードとして文字列を再構築
// new String(byte[] bytes, Charset charset)
def ChangeStr = new String(body.getBytes("UTF-8"), "UTF-8");
//MessageにUTF-8の文字コードに変換した文字列をセット
message.setBody(ChangeStr)
return message;
}
Scriptの中身
④書き込みテキストファイルの文字エンコーディングを指定
最後にContent Modifierを設置し、Exchange PropertyにCamelCharsetNameを追加します。Source Valueには変換後の文字コードを指定します。
Content Modifierの中身
⑤ReceiverのSFTPサーバの設定
SFTPアダプターの設定は以下のようになっています。
File Nameは任意です。
ReceiverのSFTPアダプター設定
ここまでiFlowの開発は以上となります。
iFlowを保存後Deployしてください。
実行結果
iFlow実行されますとSFTPサーバーの指定したルートの配下にtest_after.txtファイルが生成されます。
ファイル出力の確認
サクラエディタで開き、文字コードを確認します。
SenderのSFTPアダプターを利用して読み込んだtest_before_SJIS.txtとiFlowを通して出力されたtest_after.txtを比較します。
文字コード変換の確認
test_after.txtはUTF-8で開かれており、文字コードも変換されています。図中黄色い枠はハイライトした文字の文字コードを表しています。
最後に
本BlogではSAP Cloud Integrationでスクリプトを書くことでファイル上の文字コード変換を行う方法を紹介しました。
さらに、今回登場したUTF-8・Shift_JIS以外のエンコーディングをiFlow上で行いたい場合は、CamelCharsetNameの文字コードの種類を変更+スクリプト内の文字コードの指定を変更されますと対応可能です(
Avoiding Encoding Issues)。
変換に対応できる文字コードについてです。CamelCharsetName はApach CamelのPropertyの一つです。SAP Cloud IntegrationはApache Camelがベースになって作られています。Apache CamelはJavaのオープンソース連携フレームワークですので、Javaが理解できる文字エンコードの種類であれば、今回の文字コード変換手法で対応可能です。
文字コード変換に際する注意点としては、以下の2点があげられます。
- ご利用のSAP CPIのApache Camelのバージョン次第ではお客様環境で扱える文字コードの種類が異なる可能性があることです。
- SAP Cloud IntegrationはデフォルトでBodyの文字コードがUTF-8と解釈されます。文字コードの変換を施していても、Trace機能でSAP Cloud IntegrationからUTF-8以外の文字コードのBodyの中身を見ると文字化けしていることです。
Bodyの文字化け
興味がある方はぜひ触ってみてください。