PCMLとオブジェクト・マッピングによるJava呼び出しの簡素化
PCML-OMで決まり文句的コードと明示的なデータ変換を取り除いてプログラムの保守性を向上させる
IBM iのプログラムをJavaから呼び出すことが今まで以上に簡単になりました。決まり文句的なコードや各フィールドをgetterやsetterで呼び出すこと、データ変換に必要だったすべてのお作法を実行することはもう不要です。プログラム呼び出しマークアップ言語(PCML: Program Call Markup Language)はXMLをベースとしたタグ言語で、JavaからIBM iのプログラムを呼び出すためにIBMが開発したものです。PCMLとオブジェクト・マッピングを組み合わせて使用すると、複雑なプログラム呼び出しが地図を作るかのように簡単なマッピングの課題に変わり、接続を獲得し、IBM iプログラムへの呼び出しを1つにまとめます。私が作成したPCMLオブジェクト・マッパー(PCML-OM)は無償で利用できるオープン・ソースのユーティリティで、あとの面倒をすべて見てくれます。皆さんが行わなければならないのはCOBOLまたはRPGのコンパイラを使用してPCMLドキュメントを生成することだけです。
PCMLの一長一短
これまではPCMLを使用するためにJavaプログラムを書くことは、特にたくさんのパラメータがある場合などは良く言っても退屈な作業でした。レガシーのCOBOLプログラムはその長いヘッダーに数十というパラメータがあることで悪名高いものです。PCMLのデータ変換は原始的なもので、明示的に呼び出さなければならず、しかも残念なことに日付の概念がありません。
PCML-OMはPCMLを活用してビジネス要件により焦点を当て、IBM iのプログラムを呼び出すメカニズムにはあまり焦点を置いていません。PCMLのデータ要素がアプリケーション中にどのように組み込まれるかを単に構成するだけで、IBM iを呼び出したときにオブジェクト・マッパーがJavaオブジェクトを埋めてくれます。
経験豊富なPCMLプログラマであれば、com.ibm.as400.data.ProgramCallDocumentクラスがIBM iのプログラム・データを設定したり取得したりするための主要な手段であることはご存知でしょう。 PCML-OMはこのクラスを完全にカプセル化していますので、このクラスに直接アクセスする必要はありません。
プログラムとそれに関連したPCMLファイルを見てみましょう。OMTEST100というプログラムは保険契約の検索をするプログラムです。このプログラムは検索用のパラメータをいくつか入力として受け取り、関係したフィールドのデータ構造として契約情報が出力されます。2番目のデータ構造には入力パラメータと出力パラメータの両方が含まれていて、入力はユーザーとセッションID、出力は戻り値コードとシステム・メッセージです。このPCMLドキュメントを図1に示します。
図1: OMTEST100のPCMLドキュメント
オブジェクトをマップする
IBM iのプログラムとデータを入出力するJavaプログラム中にクラスがあります。UMLクラス図(下記図2)では、四角の上部にクラス名、中部にフィールド名、下部にクラスのメソッドが書かれています。
図2: UMLクラス図
各フィールドにはgetterおよびsetterのメソッドがありますが明示的には書かれていません。上記の3つのクラスはいずれもcom.pcml-om.exampleというパッケージ中にあります。
クラスのフィールド用のgetterおよびsetterメソッドは標準のJavaビーンの慣習に準拠したものでなければなりません。この慣習は図3に説明されていますが、PolicyDataクラスのコードの一部にpolicynoという名前のフィールド用のgetterおよびsetterコードが示されています。
図3: PolicyDataクラスのコードの一部
既存のクラスをIBM iプログラムと連携させるには、クラスのフィールドをPCMLドキュメント中のデータ要素にマップする構成ファイルを記述します。PCML-OM構成ファイル中で使用する基本的なXMLタグを図4に示します。
図4: PCML-OM構成ファイル中のXMLタグ
最初のデータ構造をマップする構成ファイルの一部を図5に示します。PCML-OM構成ファイル中の構造名とデータ名がPCMLドキュメント中の名前と一致している点に注意してください。これらの名前がPCMLドキュメントと正確に一致していないとマッピングはうまくいきません。
図5: 最初のデータ構造をマップする構成ファイル
PCML-OMでのデータ変換のほとんどは自動的に行われますが、固有のカスタム・データ変換を定義することもできます。下記に示す例では大文字の名前を大文字と小文字が混じった名前に変換するカスタム変換を使用してIBM iのデータをJavaアプリケーションのデータに変換しています。データがJavaアプリケーションからIBM iのプログラムに渡されるときはすべて大文字の名前になるように変換します。PCML-OM構成ファイル中では「legacy」という用語はIBM iのプログラムのことを意味します。POJOという略語(Plain Old Java Objects)はアプリケーション中でのデータ・オブジェクトのことを意味します。
convertToLegacy属性中で定義されているメソッドはpojoFieldName属性中で名前を付けられたフィールドからデータを取得し、戻り値をpcmlName属性中にリストされているPCMLデータ要素中に配置します。逆に、convertToPojo属性中で定義されているメソッドはその入力としてpcmlNameデータを使用し、指定されたJavaオブジェクト戻り値をpojoFieldNameに配置します。これを以下に示します。
日付変換をするにはJava (POJO)側とIBM i (legacy)側の両側で使用する日付フォーマットを定義する必要があります。PCMLには特定の日付型がありませんので、PCML-OMライブラリは日付が文字型か数値型であると仮定します。Java側では日付はjava.util.Dateクラスかまたは文字列です。日付フォーマットの構文はjava.text.SimpleDateFormatクラスのJavaDocs中に指定されています。それを以下に示します。
構造中にないデータ要素があるときは、次の例に示すようにプログラム・タグを提供しなければなりません。慣例により、これが通常の入力パラメータです。ここで紹介した例ではPOLICYNO-INフィールドだけが構造になっておらず、PolicyDataクラスのpolicynoフィールドにマッピングされます。この構造はPCMLファイル中のプログラムにすでにマッピングされていますので、これをPCML-OM構成ファイルに追加するのは冗長になります。
IBM iプログラムの呼び出し
PCML-OMライブラリへアクセスするための鍵となります(詳細は後述「DAOのデザイン・パターン」を参照ください)。PcmlDaoコンストラクタはマッピング構成ファイルを読み込み、アプリケーション用にメモリー上のマッピングを作成します。この構成ファイルは展開パッケージ(通常はウェブ・アプリケーション・アーカイブ・ファイル)中のクラス・ファイルとともに格納されます。このファイルを読み込むには適切なクラス・ローダーへの参照をPcmlDaoコンストラクタに渡さなければなりません。適切なクラス・ローダーを参照する最も簡単な方法は、構成ファイルのクラス・パッケージと同じクラス・パッケージ内のクラスを参照することです。ここで挙げた例では両方の構成ファイルともPolicyDataクラスと同じパッケージ内にあります。このクラス・ローダーへの参照をPolicyData.class.getClassLoader()を使って獲得します。
PcmlDaoコンストラクタ用のJavadoc記述は以下の通りです。
PcmlDaoコンストラクタを呼び出すときはかなりのオーバーヘッドが生じますので、PcmlDaoは1つだけ作成してそれをアプリケーション内で再利用するようにしてください。このオブジェクトを一旦作成してしまえばIBM iプログラムへの呼び出しは非常に効率的になります。PcmlDaoクラスはスレッド・セーフで、大量処理用アプリケーションに適しています。
IBM iプログラムへの呼び出しはcallAS400メソッドを介して行います(図6)。
図6: calAS400メソッドによるIBM iプログラムの呼び出し
これらのパラメータはAS400の接続オブジェクト、プログラム名、および呼び出しで使用されるすべてのデータ・オブジェクトです。データ・オブジェクトの順番は重要ではありません。
大量処理用アプリケーションの開発用に、PCMLにはシリアライズされたPCMLファイルを作成するオプションがあります。このファイルによりIBM iプログラムの呼び出しがさらに効率的になります。PCML-OMは内部のマッピング・データ構造を作成するのに、シリアライズされていないバージョンのPCMLファイルを使用しなければなりません。アプリケーションを最大限効率的なものにするためには、シリアライズされたバージョンのPCMLドキュメントとシリアライズされていないバージョンのPCMLドキュメントの両方をインクルードして同じパッケージ上に格納しておかなければなりません。シリアライズされたPCMLファイルの作成方法についてはIBMのドキュメントを参照ください。
お気に召さない点がありますか?
PCML-OMライブラリは、パフォーマンスに関する限り妥協を許しません。ここでご紹介したコードの例をご覧いただくとおわかりの通り、PCML-OMにより決まり文句的なコードや明示的なデータ変換をなくすことができるので、Javaプログラムの保守性が向上します。とりわけ、このライブラリはオープン・ソースであり自由主義のユーザーライセンスのもとで自由に利用可能です。ソースコードとランタイムJARファイルをダウンロードするには、github.comサイトへ行ってPCML-OMを検索するだけです。
補足 : DAOのデザイン・パターン
ソフトウェアのデザイン・パターンは、詳細な設計をしなくとも何らかのプログラムを構築するための一般的なガイドラインを提供します。パターンは特定のコンピュータ言語やテクノロジに依存していません。データ・アクセス・オブジェクト(DAO: Data Access Object)はデザイン・パターンであり、この中でオブジェクトを使用してデータ・ソースからのデータにアプリケーション中からアクセスして使用します。DAOはデータにアクセスする方法の詳細を隠蔽してくれます。HibernateはDAOを使用して関係データベース内のデータにアクセスします。今回の例では、DAOはIBM iプログラム内からデータにアクセスします。