BEA ホーム | 製品 | デベロッパ・センタ | support | askBEA |
![]() |
![]() |
|
![]() |
e-docs > WebLogic Integration > AI トピック > アダプタの開発 > サービス アダプタの開発 |
アダプタの開発
|
サービス アダプタの開発
サービス アダプタは、クライアントから XML 要求ドキュメントを受け取ると、基本となる EIS で該当する関数を呼び出します。このサービス アダプタはメッセージのコンシューマで、応答を返す場合と返さない場合があります。サービス アダプタでは、次の 4 つの機能が実行されます。
この章の内容は以下のとおりです。
WebLogic Integration に限定されない J2EE 準拠アダプタ
この章で説明することは、主に WebLogic Integration で使用するアダプタの開発手順です。ADK により WebLogic Integration 環境以外でも使用可能なアダプタを開発することはできますが、その場合は、所定の修正を加えた手順に従ってください。手順については、WebLogic Integration に限定されないアダプタの作成を参照してください。
実行時環境におけるサービス アダプタ
図6-1 および 図6-2 は、実行時環境でサービス アダプタが使用される場合に実行されるプロセスを示しています。図6-1 では非同期サービス アダプタ、図6-2 では同期アダプタのプロセスを示しています。
図6-1 実行時環境における非同期サービス アダプタ
イベントの処理フロー
図6-3 は、サービス アダプタの開発手順の概要です。
図6-3 サービス アダプタ開発プロセスにおけるイベントのフロー
手順 1 :環境要件の調査
サービス アダプタの開発を開始する前に、サービス アダプタをサポートするために環境に必要なリソースを識別する必要があります。この手順では、開発環境における要件について詳しく説明します。必要なリソースの詳細なリストについては、アダプタ設定ワークシートを参照してください。
EIS に関する情報に基づいてバックエンド機能に対するインタフェースを決定します。
EIS 内の機能を呼び出すには、高コストの接続オブジェクトが必要です。この機能は、EIS と通信を行うために必要です。
高コストの接続オブジェクトには、ソケット接続や DBMS 接続のようなシステム リソースの割り当てが必要です。J2EE コネクタ アーキテクチャの大きな利点の 1 つは、アプリケーション サーバがこのようなオブジェクトをプールしてくれることです。アダプタのオブジェクトはアプリケーション サーバによってプールされるため、このオブジェクトを決定する必要があります。
接続要求パスを通じて接続認証を渡すために、アダプタは ConnectionRequestInfo クラスを実装する必要があります。このような実装を容易にするため、ADK ではConnectionRequestInfoMap クラスを提供しています。このクラスを使用して、ユーザ名およびパスワードなどの認可情報を接続オブジェクトにマップすることができます。
ADK は、J2EE Connector Architecture Specification 1.0 に準拠しています。接続アーキテクチャ セキュリティの詳細については、このドキュメントの「Security」節を参照してください。以下の URL から 簡単に印刷できる PDF 形式の仕様をダウンロードできます。
以下のトランザクションの境界設定から、どのタイプをアダプタに実装するかを決定します。
注意: トランザクションの境界設定の詳細については、トランザクション境界設定または次に示すサイトを参照してください。
http://java.sun.com/blueprints/guidelines/designing_enterprise_applications/transaction_management/platform/index.html
手順 2 : 開発環境のコンフィグレーション
この手順では、環境をコンフィグレーションする 4 つの手順(手順 2a から手順 2b まで)について説明します。
注意: この手順は、GenerateAdapterTemplate ユーティリティを実行することで簡単に行えます。詳細については、カスタム開発環境の作成を参照してください。
手順 2a : ディレクトリ構造の設定
WebLogic Integration のインストール時に作成されるディレクトリ構造は、アダプタを実行するためだけでなく、ADK を使用するためにも必要です。ADK 関連のファイルは、WLI_HOME/adapters/ ディレクトリ(WLI_HOME は、WebLogic Integration をインストールしたディレクトリ)に格納されています。インストール時に、WLI_HOME ディレクトリに必要なディレクトリおよびファイルが含まれているかを必ず確認してください。
次の表では、WLI_HOME のディレクトリ構造について説明します。
ディレクトリ構造の変更 GenerateAdapterTemplate を使用して開発ツリーを複製すると、adapters/sample のすべてのディレクトリの内容が自動的に複製されて、新しい開発環境に合わせて更新されます。 変更は、ファイル WLI_HOME/adapters/ADAPTER/docs/api/index.html (ADAPTER は、新しい開発ディレクトリ名) に反映されます。また、新しいアダプタに応じて WebLogic Integration を設定する際に、このファイル内のコードをコピーして、そのアダプタの config.xml ファイルに貼り付けることもできます。 手順 2b : アダプタ論理名の割り当て アダプタに論理名を割り当てます。通常、アダプタの論理名は、次のようにアンダースコアで区切られた 3 つの項目(ベンダ名、アダプタに接続される EIS のタイプおよび EIS のバージョン)で構成されます。 vendor_EIS-type_EIS-version 例 : BEA_WLS_SAMPLE_ADK アダプタ論理名の詳細については、アダプタ論理名を参照してください。 手順 2c : ビルド プロセスの設定 ADK では、Ant という Java 言語のみを使用して作成した Java のビルド ツールに基づくビルド プロセスが採用されています。Ant の詳細については、Ant ベースのビルド プロセスを参照してください。Ant の使用方法の詳細については、以下のサイトを参照してください。
ADK に付属のサンプル アダプタ(WLI_HOME/adapters/sample/project に格納されている)には、build.xml というファイルが入っています。このファイルは、サンプル アダプタの Ant ビルド ファイルです。このファイルには、J2EE 準拠アダプタを構築するのに必要なタスクが収められています。GenerateAdapterTemplate ユーティリティを実行して、アダプタの開発ツリーを複製すると、使用するアダプタ専用の build.xml ファイルが作成されます。この自動ファイル生成により、サンプル build.xml ファイルをカスタマイズする手間が省け、かつコードの正確性が保証されます。GenerateAdapterTemplate ユーティリティの使用方法の詳細については、カスタム開発環境の作成を参照してください。
Manifest ファイル
GenerateAdapterTemplate によって作成されるファイルの中には、MANIFEST.MF という manifest ファイルがあります。このファイルには、このファイルを使用する各コンポーネントに対するクラスロード指示が定義されています。manifest ファイルは、ear/META-INF を除くすべての /META-INF ディレクトリに作成されます。
リスト6-1 は、サンプル アダプタに組み込まれている manifest ファイルの例を示しています。
コード リスト 6-1 Manifest ファイルの例
Manifest-Version: 1.0
Created-By:BEA Systems, Inc.
Class-Path: BEA_WLS_SAMPLE_ADK.jar adk.jar wlai-core.jar
wlai-client.jar
このファイルの最初の 2 行には、バージョン情報およびベンダ情報が含まれます。3 行目では、関連クラスパスまたはクラスロード指示が定義されます。Class-Path プロパティには、コンポーネントが必要とするリソースへの参照と共有JAR ファイルのリストが含まれます。(リストでは、ファイル名がスペースで区切られています。)JAR ファイルは、EAR ファイルの共有エリアに組み込む必要があります。(詳細については、エンタープライズ アーカイブ(EAR)ファイルを参照してください。)
JAR ツールでは、Class-Path: 行の長さの上限は 72 文字です。72 文字を超える行は次の行に回され、次に示すようにスペースで始まります。
Class-Path: .....72 文字のクラスパス
<スペース>クラスパスの続き
サンプルの ADK アダプタでは、以下の Ant コマンドによりすべての共有 JAR ファイルは、1 つの JAR ファイル(shared.jar)に統合されます。
コード リスト 6-2
<jar jarfile='${LIB_DIR}/shared.jar'>
<zipfileset src='${LIB_DIR}/${JAR_FILE}'>
<exclude name='META-INF/MANIFEST.MF'/>
</zipfileset>
<zipfileset src='${WLI_LIB_DIR}/adk.jar'>
<exclude name='META-INF/MANIFEST.MF'/>
</zipfileset>
<zipfileset src='${WLI_LIB_DIR}/wlai-core.jar'>
<exclude name='META-INF/MANIFEST.MF'/>
</zipfileset>
<zipfileset src='${WLI_LIB_DIR}/wlai-client.jar'>
<exclude name='META-INF/MANIFEST.MF'/>
</zipfileset>
</jar>
<jar jarfile='${LIB_DIR}/${EAR_FILE}'>
<fileset dir='${basedir}' includes='version_info.xml'/>
<fileset dir='${SRC_DIR}/ear' includes='META-INF/application.xml'/>
<fileset dir='${LIB_DIR}' includes='shared.jar,${RAR_FILE},${WAR_FILE},
${EVENTROUTER_WAR_FILE}'/>
</jar>
注意: ファイル名MANIFEST.MF は、WAR ファイルに組み込む場合にはすべて大文字で表記する必要があります。正しく表記されていない場合、UNIX システムでは認識されず、エラーが発生します。
build.xml のコンポーネント
build.xml がどのように機能するかを知るには、ファイルを開いてコンポーネントをレビューします。ここでは、主なファイル要素について説明します。build.xml の内容をレビューする際にこれらの説明を参照してください。
注意: 以下の例はサンプル アダプタからの引用で、複製バージョンのものではありません。
<project name='BEA_WLS_SAMPLE_ADK' default='all' basedir='.'>
コード リスト 6-3 アーカイブ ファイル名の設定
<property name='JAR_FILE' value='BEA_WLS_SAMPLE_ADK.jar'/>
<property name='RAR_FILE' value='BEA_WLS_SAMPLE_ADK.rar'/>
<property name='WAR_FILE' value='BEA_WLS_SAMPLE_ADK_Web.war'/>
<property name='EVENTROUTER_JAR_FILE'
value='BEA_WLS_SAMPLE_ADK_EventRouter.jar'/>
<property name='EVENTROUTER_WAR_FILE'
value='BEA_WLS_SAMPLE_ADK_EventRouter.war'/>
<property name='EAR_FILE' value='BEA_WLS_SAMPLE_ADK.ear'/>
コード リスト 6-4 標準 ADK プロパティ
<property name='ADK' value='${WLI_LIB_DIR}/adk.jar'/>
<property name='ADK_WEB' value='${WLI_LIB_DIR}/adk-web.jar'/>
<property name='ADK_TEST' value='${WLI_LIB_DIR}/adk-test.jar'/>
<property name='ADK_EVENTGENERATOR' value='${WLI_LIB_DIR}/
adk-eventgenerator.jar'/>
<property name='BEA' value='${WLI_LIB_DIR}/bea.jar'/>
<property name='LOGTOOLKIT' value='${WLI_LIB_DIR}/
logtoolkit.jar'/>
<property name='WEBTOOLKIT' value='${WLI_LIB_DIR}/
webtoolkit.jar'/>
<property name='WLAI_CORE' value='${WLI_LIB_DIR}/
wlai-core.jar'/>
<property name='WLAI_CLIENT' value='${WLI_LIB_DIR}/
wlai-client.jar'/>
<property name='WLAI_COMMON' value='${WLI_LIB_DIR}/
wlai-common.jar'/>
<property name='WLAI_EVENTROUTER' value='${WLI_LIB_DIR}/
wlai-eventrouter.jar'/>
<property name='XMLTOOLKIT' value='${WLI_LIB_DIR}/
xmltoolkit.jar'/>
<property name='XCCI' value='${WLI_LIB_DIR}/xcci.jar'/>
これらのプロパティを変更する必要はありませんが、この後に、アダプタで必要な他の JAR ファイルやクラスを追加できます。
コード リスト 6-5 クラスパスの設定
<path id='CLASSPATH'>
<pathelement location='${SRC_DIR}'/>
<pathelement path='${ADK}:${ADK_EVENTGENERATOR}:
${ADK_WEB}:${ADK_TEST}:${WEBTOOLKIT}:${WLAI_CORE}:
${WLAI_EVENTROUTER}:${WLAI_CLIENT}'/>
<pathelement path='${WEBLOGIC_JAR}:${env.BEA_HOME}'/>
<pathelement path='${JUNIT}:${HTTPUNIT}:${TIDY}'/>
</path>
コード リスト 6-6 すべてのバイナリおよびアーカイブを呼び出すサンプル
<!-- このターゲットにより、アダプタのすべてのバイナリおよび
アーカイブが作成される -->
<target name='all' depends='ear'/>
コード リスト 6-7 サンプル version_info ファイル
<!-- このターゲットにより、version_info ファイルがアーカイブに
組み込まれる -->
<target name='version_info'>
<java classname='GenerateVersionInfo'>
<arg line='-d${basedir}'/>
<classpath>
<pathelement path='${WLI_HOME}/adapters/utils:
${WEBLOGIC_JAR}'/>
</classpath>
</java>
</target>
コード リスト 6-8 JAR ファイルに値を設定するためのサンプル コード
<target name='jar' depends='packages,version_info'>
<delete file='${LIB_DIR}/${JAR_FILE}'/>
<mkdir dir='${LIB_DIR}'/>
<jar jarfile='${LIB_DIR}/${JAR_FILE}'>
コード リスト 6-9 Includes リストを組み込むサンプル コード
<fileset dir='${SRC_DIR}'
includes='sample/cci/*.class,sample/spi/*.class,
sample/eis/*. class,*.xml,*.properties'/>
コード リスト 6-10 JAR ファイルのバージョン情報の設定
<!-- JAR ファイルのバージョン情報を組み込む -->
<fileset dir='${basedir}'
includes='version_info.xml'/>
</jar>
コード リスト 6-11 接続アーキテクチャ RAR ファイルを作成するサンプル コード
<target name='rar' depends='jar'>
<delete file='${LIB_DIR}/${RAR_FILE}'/>
<mkdir dir='${LIB_DIR}'/>
<jar jarfile='${LIB_DIR}/${RAR_FILE}'
manifest='${SRC_DIR}/rar/META-INF/MANIFEST.MF'>
<fileset dir='${SRC_DIR}/rar'includes='META-INF/ra.xml,
META-INF/weblogic-ra.xml' excludes=
'META-INF/MANIFEST.MF'/>
</jar>
</target>
コード リスト 6-12 WAR ファイル生成のためのサンプル コード
<target name='war' depends='jar'>
<!-- 既存の環境をクリーンアップする -->
<delete file='${LIB_DIR}/${WAR_FILE}'/>
<copy file='${WLI_HOME}/adapters/src/war/WEB-INF/taglibs/
adk.tld' todir='${SRC_DIR}/war/WEB-INF/taglibs'/>
<java classname='weblogic.jspc' fork='yes'>
<arg line='-d ${SRC_DIR}/war -webapp ${SRC_DIR}/
war -compileAll -depend'/>
<classpath refid='CLASSPATH'/>
</java>
<!-- 最初のアダプタは共通 ADK JSP をコンパイルする必要がある -->
<java classname='weblogic.jspc' fork='yes'>
<arg line='-d ${WLI_HOME}/adapters/src/war -webapp
${WLI_HOME}/adapters/src/war -compileAll
-depend'/>
<classpath refid='CLASSPATH'/>
</java>
<war warfile='${LIB_DIR}/${WAR_FILE}'
webxml='${SRC_DIR}/war/WEB-INF/web.xml'
manifest='${SRC_DIR}/war/META-INF/MANIFEST.MF'>
<!--
重要! Exclude the WEB-INF/web.xml file from
the WAR as it already gets included via the webxml attribute above
-->
<fileset dir="${SRC_DIR}/war" >
<patternset >
<include name="WEB-INF/weblogic.xml"/>
<include name="**/*.html"/>
<include name="**/*.gif"/>
</patternset>
</fileset>
<!--
重要! ADK 設計時フレームワークをアダプタの設計時
Web アプリケーションに含める
-->
<fileset dir="${WLI_HOME}/adapters/src/war" >
<patternset >
<include name="**/*.css"/>
<include name="**/*.html"/>
<include name="**/*.gif"/>
<include name="**/*.js"/>
</patternset>
</fileset>
<!-- 設計時 UI をサポートするアダプタのクラスを
含める -->
<classes dir='${SRC_DIR}' includes='sample/web/*.class'/>
<classes dir='${SRC_DIR}/war'includes='**/*.class'/>
<classes dir='${WLI_HOME}/adapters/src/war' includes=
'**/*.class'/>
<!--
アプリケーションで必要とされ、EAR に共有されないすべての JAR
ファイルを、WAR ファイルの WEB-INF/lib ディレクトリ下に
組み込む
-->
コード リスト 6-13 Web アプリケーションが必要とする JAR ファイルを組み込むサンプル コード
<lib dir='${WLI_LIB_DIR}' includes='adk-web.jar,
webtoolkit.jar,wlai-client.jar'/>
コード リスト 6-14 EAR ファイルの組込み
<target name='ear' depends='rar,eventrouter_jar,war'>
<delete file='${LIB_DIR}/${EAR_FILE}'/>
<!-- jar ファイルを組み込むのではなく、
jar ファイルを共有するイベント ルータを組み込む-->
<delete file='${LIB_DIR}/${EVENTROUTER_WAR_FILE}'/>
<delete dir='${SRC_DIR}/eventrouter/WEB-INF/lib'/>
<war warfile='${LIB_DIR}/${EVENTROUTER_WAR_FILE}
'webxml='${SRC_DIR}/eventrouter/WEB-INF/web.xml
'manifest='${SRC_DIR}/eventrouter/META-INF/
MANIFEST.MF'>
<fileset dir='${basedir}' includes='version_info.xml'/>
<fileset dir="${SRC_DIR}/eventrouter" >
<patternset>
<exclude name="WEB-INF/web.xml"/>
<exclude name="META-INF/*.mf"/>
</patternset>
</fileset>
<lib dir='${LIB_DIR}' includes='${EVENTROUTER_JAR_
FILE}'/>
<lib dir='${WLI_LIB_DIR}'includes=
'adk-eventgenerator.jar,wlai-eventrouter.jar'/>
</war>
<jar jarfile='${LIB_DIR}/${EAR_FILE}'>
<fileset dir='${basedir}' includes='version_info.xml'/>
<fileset dir='${SRC_DIR}/ear' includes=
'application.xml'/>
<fileset dir='${LIB_DIR}'includes='${JAR_FILE},
${RAR_FILE}, ${WAR_FILE},${EVENTROUTER_WAR_FILE}'/>
<fileset dir='${WLI_LIB_DIR}'includes='adk.jar,
wlai-core.jar,wlai-client.jar'/>
</jar>
<delete file='${LIB_DIR}/${EVENTROUTER_WAR_FILE}'/>
<delete file='${LIB_DIR}/${EVENTROUTER_JAR_FILE}'/>
<delete file='${LIB_DIR}/${WAR_FILE}'/>
<delete file='${LIB_DIR}/${RAR_FILE}'/>
<delete file='${LIB_DIR}/${JAR_FILE}'/>
</target>
コード リスト 6-15 EAR 固有の EventRouter を組み込むサンプル コード
<delete file='${LIB_DIR}/${EVENTROUTER_WAR_FILE}'/>
<delete dir='${SRC_DIR}/eventrouter/WEB-INF/lib'/>
<war warfile='${LIB_DIR}/${EVENTROUTER_WAR_FILE}
'webxml='${SRC_DIR}/eventrouter/WEB-INF/web.xml
'manifest='${SRC_DIR}/eventrouter/META-INF/
MANIFEST.MF'>
<fileset dir='${basedir}' includes='version_info.xml'/>
<fileset dir="${SRC_DIR}/eventrouter" >
<patternset >
<exclude name="WEB-INF/web.xml"/>
<exclude name="META-INF/*.mf"/>
</patternset>
</fileset>
<lib dir='${LIB_DIR}' includes='${EVENTROUTER_
JAR_FILE}'/>
<libdir='${WLI_LIB_DIR}'
includes='adk-eventgenerator.jar,
wlai-eventrouter.jar'/>
</war>
コード リスト 6-16 共通または共有 JAR ファイルの組み込みを示すサンプル コード
<jar jarfile='${LIB_DIR}/${EAR_FILE}'>
<fileset dir='${basedir}' includes='version_info.xml'/>
<fileset dir='${SRC_DIR}/ear' includes='application.xml'/>
<fileset dir='${LIB_DIR}'includes='${JAR_FILE},${RAR_FILE},
${WAR_FILE},${EVENTROUTER_WAR_FILE}'/>
<fileset dir='${WLI_LIB_DIR}'includes='adk.jar,
wlai-core.jar,wlai-client.jar'/>
</jar>
コード リスト 6-17 Java ソースのコンパイル用サンプル コード
<target name='packages'>
<echo message='Building ${ant.project.name}...'/>
<javac srcdir='${SRC_DIR}'
excludes='war/jsp_servlet/**'
deprecation='true' debug='true'>
<classpath refid='CLASSPATH'/>
</javac>
</target>
コード リスト 6-18 EventRouter JAR ファイル構築用サンプル コード
<target name='eventrouter_jar' depends='packages,version_info'>
<delete file='${LIB_DIR}/${EVENTROUTER_JAR_FILE}'/>
<jar jarfile='${LIB_DIR}/${EVENTROUTER_JAR_FILE}'>
<fileset dir='${SRC_DIR}'
includes='sample/event/*.class'/>
<fileset dir='${basedir}'
includes='version_info.xml'/>
</jar>
</target>
コード リスト 6-19 スタンドアロン デプロイメント用の EventRouter ターゲットを生成するサンプル コード
<target name='eventrouter_war' depends='jar,eventrouter_jar'>
<delete file='${LIB_DIR}/${EVENTROUTER_WAR_FILE}'/>
<delete dir='${SRC_DIR}/eventrouter/WEB-INF/lib'/>
<war warfile='${LIB_DIR}/${EVENTROUTER_WAR_FILE}'webxml=
'${SRC_DIR}/eventrouter/WEB-INF/web.xml'>
<fileset dir='${basedir}' includes='version_info.xml'/>
<fileset dir='${SRC_DIR}/eventrouter' excludes=
'WEB-INF/web.xml'/>
<lib dir='${LIB_DIR}' includes='${JAR_FILE},
${EVENTROUTER_JAR_FILE}'/>
<lib dir='${WLI_LIB_DIR}'includes='adk.jar,
adk-eventgenerator.jar,wlai-core.jar,
wlai-eventrouter.jar,wlai-client.jar''/>
</war>
</target>
コード リスト 6-20 Javadoc を生成するサンプル コード
<target name='apidoc'>
<mkdir dir='${DOC_DIR}'/>
<javadoc sourcepath='${SRC_DIR}'
destdir='${DOC_DIR}'
packagenames='sample.*'
author='true'
version='true'
use='true'
overview='${SRC_DIR}/overview.html'
windowtitle='WebLogic BEA_WLS_SAMPLE_ADK Adapter
API Documentation'
doctitle='WebLogic BEA_WLS_SAMPLE_ADK Adapter
API Documentation'
header='WebLogic BEA_WLS_SAMPLE_ADK Adapter'
bottom='Built using the WebLogic Adapter
Development Kit (ADK)'>
<classpath refid='CLASSPATH'/>
</javadoc>
</target>
コード リスト 6-21 クリーンアップ コードを組み込むサンプル コード
<target name='clean' depends='clean_release'/>
<target name='clean_release' depends='clean_all,clean_apidoc'/>
<target name='clean_all'depends='clean_ear,clean_rar,clean_war,
clean_eventrouter_war,clean_test'/>
<target name='clean_test'>
<delete file='${basedir}/BEA_WLS_SAMPLE_ADK.log'/>
<delete file='${basedir}/mcf.ser'/>
</target>
<target name='clean_ear' depends='clean_jar'>
<delete file='${LIB_DIR}/${EAR_FILE}'/>
</target>
<target name='clean_rar' depends='clean_jar'>
<delete file='${LIB_DIR}/${RAR_FILE}'/>
</target>
<target name='clean_war' depends='clean_jar'>
<delete file='${LIB_DIR}/${WAR_FILE}'/>
<delete dir='${SRC_DIR}/war/jsp_servlet'/>
</target>
<target name='clean_jar' depends='clean_packages,clean_version_
info'>
<delete file='${LIB_DIR}/${JAR_FILE}'/>
</target>
<target name='clean_eventrouter_jar'>
<delete file='${LIB_DIR}/${EVENTROUTER_JAR_FILE}'/>
</target>
<target name='clean_eventrouter_war' depends='clean_
eventrouter_jar'>
<delete file='${LIB_DIR}/${EVENTROUTER_WAR_FILE}'/>
</target>
<target name='clean_version_info'>
<delete file='${basedir}/version_info.xml'/>
</target>
<target name='clean_packages'>
<delete>
<fileset dir='${SRC_DIR}' includes='**/*.class'/>
</delete>
</target>
<target name='clean_apidoc'>
<delete dir='${DOC_DIR}'/>
</target>
</project>
手順 2d : メッセージ バンドルの作成
エンド ユーザ向けのメッセージは、メッセージ バンドルに入れます。2 つ以上の言語でメッセージを生成できる「key=value」の組み合わせを含む .properties テキスト ファイル。実行時にロケールおよび地域言語が指定されると、メッセージの内容が該当する「key=value」の組み合わせに基づいて解釈され、メッセージがユーザのロケールに従って適切な言語で提示されます。
メッセージ バンドルの作成方法については、次に示すサイトにある JavaSoft チュートリアルを参照してください。
手順 3 : SPI の実装
サービス プロバイダ インタフェース(SPI)には、EIS への接続、管理、トランザクションの環境設定、およびサービス呼び出しのフレームワークが用意されているオブジェクトが入っています。J2EE 準拠アダプタには、javax.resource.spi パッケージにあるこれらのインタフェースの実装が必要です。
この節では、SPI の実装に使用できるインタフェースについて説明します。SPI の実装作業には、最低 3 つのインタフェースが必要です(基本的な SPI の実装を参照してください)。ここでは、それぞれのインタフェースを詳しく説明し、さらに、ADK に含まれているサンプル アダプタによるそれらのインタフェース拡張方法を説明します。
まず、3 つのインタフェースについて説明します。次に、追加インタフェースについて詳しく説明し、さらにそれらを使用する理由や、アダプタで使用した場合の利点についても説明します。
基本的な SPI の実装
アダプタに SPI を実装するには、最低でも、次の 3 つのインタフェースの拡張が必要です。
3 つのインタフェースは、ここで示す順番で実装するのが理想的です。
この 3 つのインタフェースのほか、使用するアダプタの要求に合わせて、この節で説明されたほかのインタフェースを任意に実装できます。
ManagedConnectionFactory
javax.resource.spi.ManagedConnectionFactory
ManagedConnectionFactory インタフェースは、ManagedConnection と EIS 固有の接続ファクトリ インスタンス両方のファクトリです。このインタフェースは、ManagedConnection インスタンスをマッチングしたり、作成したりするメソッドによって接続プールをサポートします。
トランザクション境界設定
ManagedConnectionFactory に不可欠なコンポーネントは、トランザクションの境界設定です。1 つのトランザクションにインクルードされるプログラム文を決定します。J2EE では、アプリケーション サーバとアダプタ(およびそのベースのリソース マネージャ)との間のトランザクション管理規約を定義します。トランザクション管理規約は、2 つの部分から構成されます。規約は、使用するトランザクションの種類によって異なります。トランザクションには、2 つの種類があります。
XA 準拠トランザクション
javax.transaction.xa.XAResource ベース規約は、分散トランザクション処理環境(DTP)におけるトランザクション マネージャとリソース マネージャ間の取り決めです。JDBC ドライバまたは JMS プロバイダは、グローバル トランザクションと、データベースまたはメッセージ サービス接続との間の関連付けをサポートするために、このインタフェースを実装します。
XAResource インタフェースは、トランザクションが外部トランザクション マネージャで管理されている環境内のアプリケーション プログラムでの使用を目的としたトランザクション リソースならばどのようなものでもサポート可能です。
そのようなリソースの例として、アプリケーションが複数のデータベース接続を経由してデータにアクセスするようなデータベース管理システムが挙げられます。それぞれのデータベース接続は、トランザクション リソースとして、トランザクション マネージャに登録されます。トランザクション マネージャは、グローバル トランザクションに関連する各接続に対して、XAResource を取得します。トランザクション マネージャは、start() メソッドを使用して、グローバル トランザクションとリソースを関連付け、end() メソッドによってトランザクションとリソースの関連付けを解除します。リソース マネージャは、グローバル トランザクションを、start() メソッド呼び出しと end() メソッド呼び出しの間にそのデータに対して行われたすべての作業に関連付けます。
トランザクションのコミット時、リソース マネージャは、トランザクションを 2 フェーズ コミット プロトコルに従って準備、コミット、またはロールバックするようにトランザクション マネージャから指示されます。
ローカル トランザクション
ローカル トランザクション管理規約は、アダプタが、そのリソース マネージャで実行されるローカル トランザクションをサポートするために、javax.resource.spi.LocalTransaction インタフェースを実装する場合の規約です。この規約によって、アプリケーションサーバがトランザクション管理のインフラストラクチャと実行時環境を整えられます。アプリケーション コンポーネントはこのトランザクション インフラストラクチャを利用して、コンポーネントレベルのトランザクション モデルをサポートします。
トランザクションの境界設定の詳細については、以下の URL を参照してください。
http://java.sun.com/blueprints/guidelines/
designing_enterprise_applications/transaction_management/
platform/index.html
ADK 実装
ADK では、アダプタに対して AbstractManagedConnectionFactory という抽象ファンデーションを提供しています。このファンデーションには、以下の機能があります。
以下の主要メソッドに対し、独自の実装が必要です。
以下の節では、それらのメソッドについて説明します。
createConnectionFactory()
createConnectionFactory() は、アダプタに対するアプリケーションレベルの接続ハンドル用のファクトリです。すなわち、アダプタのクライアントは、このメソッドにより返されたオブジェクトを使用して EIS に対する接続ハンドルを取得します。
アダプタが CCI インタフェースをサポートする場合、com.bea.adapter.cci.ConnectionFactoryImpl のインスタンス、または拡張されたクラスを返すことをお勧めします。このメソッドを正しく実装するポイントは、ConnectionManager、LogContext、および ResourceAdapterMetaData をクライアント API に伝播することです。
コード リスト 6-22 createConnectionFactory() の例
protected Object
createConnectionFactory(ConnectionManager connectionManager,
String strAdapterName,
String strAdapterDescription,
String strAdapterVersion,
String strVendorName)
throws ResourceException
createManagedConnection()
createManagedConnection() は、アダプタに対する ManagedConnection インスタンスの作成に使用します。以下のリストに、このメソッドの例を示します。
コード リスト 6-23 createManagedConnection() の例
public ManagedConnection
createManagedConnection(Subject subject, ConnectionRequestInfo
info)
throws ResourceException
ManagedConnection インスタンスは、EIS との通信に必要な高コスト リソースをカプセル化します。このメソッドは、ConnectionManager がクライアントの要求を満たすために新しい ManagedConnection が必要と判断した場合に、ConnectionManager によって呼び出されます。アダプタの一般的な設計パターンでは、このメソッドで EIS との通信に必要なリソースを開き、それからそのリソースを新しい ManagedConnection インスタンスに渡すようにします。
checkState()
checkState() メソッドは、AbstractManagedConnectionFactory がファクトリ関係のタスクを実行する前に呼び出します。このメソッドを使用して、初期化の必要があるすべてのメンバーが正しく初期化されていることを確認しないと、ManagedConnectionFactory では分担された SPI タスクを実行できません。
このメソッドの実装は次のとおりです。
protected boolean checkState()
equals()
equals() メソッドは、オブジェクト引数が等しいかどうかをテストします。このメソッドは、ConnectionManager が接続プールの管理に使用しますので、必ず正しく実装してください。等価性比較において、このメソッドは重要なメンバーをすべて組み込む必要があります。
このメソッドの実装は次のとおりです。
public boolean equals(Object obj)
hashCode()
hashCode() メソッドは、ファクトリで使用するハッシュ コードを提供します。また、ConnectionManager による接続プールの管理にも使用されます。したがって、このメソッドは、オブジェクトのユニーク性を決定するプロパティに基づいて hashCode を生成します。
このメソッドの実装は次のとおりです。
public int hashCode()
matchManagedConnections()
ManagedConnectionFactory は matchManagedConnections() メソッドの実装が必要です。AbstractManagedConnectionFactory は、AbstractManagedConnection の compareCredentials() メソッドに依存する matchManagedConnections() メソッドを実装します。
管理対象接続にロジックを適合させるためには、AbstractManagedConnection クラスが提供する compareCredentials() メソッドをオーバーライドします。このメソッドは、ManagedConnectionFactory が ConnectionManager に対する接続要求と接続とをマッチングする場合に呼び出されます。
現行では、AbstractManagedConnectionFactory の実装は、指定された Subject/ConnectionRequestInfo パラメータから PasswordCredential を抽出します。どちらのパラメータもヌルであれば、このインスタンスに対する ManagedConnectionFactory は適切なので、このメソッドは true を返します。この実装を、以下のリストに示します。
コード リスト 6-24 compareCredentials() の実装
public boolean compareCredentials(Subject subject,
ConnectionRequestInfo info)
throws ResourceException
{
ILogger logger = getLogger();
次に、ADK の ManagedConnectionFactory を使用して、JAAS Subject または SPI ConnectionRequestInfo から、PasswordCredential を抽出する必要があります。以下のリストに例を示します。
コード リスト 6-25 PasswordCredential の抽出
PasswordCredential pc = getFactory().
getPasswordCredential(subject, info);
if (pc == null)
{
logger.debug(this.toString() + ": compareCredentials
上記のリストでは、JAAS Subject および ConnectionRequestInfo がヌルで、一致しています。このメソッドは、このインスタンスのファクトリの適切性が確立されるまでは、呼び出されません。呼び出しの結果、Subject と ConnectionRequestInfo が両方ともヌルの場合、デフォルトにより資格一致となります。この接続の ping 結果により、比較結果の出力が決まります。以下のリストに、プログラムによる接続の ping を行う方法を示します。
コード リスト 6-26 接続の ping
return ping();
}
boolean bUserNameMatch = true;
String strPcUserName = pc.getUserName();
if (m_strUserName != null)
{
logger.debug(this.toString() + ": compareCredentials >>> comparing
my username ["+m_strUserName+"] with client username
["+strPcUserName+"]");
次に、Subject または ConnectionRequestInfo で指定されたユーザがこちらのユーザと同じかどうか確認する必要があります。このアダプタでは、再認証をサポートしていないので、この 2 つのユーザ名が一致しない場合、このインスタンスは要求を満たすことができなくなります。以下のコードが要求を満たしています。
bUserNameMatch = m_strUserName.equals(strPcUserName);
ユーザ名が一致すると、これが継続して良好かどうかを判別するため、接続の ping が行われます。名前が一致しない場合、ping する理由はありません。
接続を ping するには、以下のコードを使用します。
return bUserNameMatch ? ping() : false;
実装に関する説明
管理対象シナリオの場合、アプリケーション サーバは、アダプタの ManagedConnectionFactory に対して matchManagedConnections() メソッドを呼び出します。この指定では、接続要求を満たすためにアプリケーション サーバがどの ManagedConnectionFactory を使用するか、その決定については指示していません。ADK の AbstractManagedConnectionFactory は、matchManagedConnections() を実装します。
この実装を行う最初の手順は、「これ」(すなわち、ConnectionManager が matchManagedConnections を呼び出した ManagedConnectionFactory インスタンス)とアプリケーション サーバによって提供されたセット内の各 ManagedConnection に対する ManagedConnectionFactory との比較です。同一の ManagedConnectionFactory を持つセット内の各 ManagedConnection に対しては、実装により compareCredentials() メソッドが呼び出されます。このメソッドにより、各 ManagedConnection オブジェクトは要求を満たすことができるかどうかを判別できます。
ConnectionManager によって、matchManagedConnections() が呼び出され(リスト6-27 を参照してください)、管理しているプール内で有効な接続が検索されます。このメソッドでヌルが返された場合、ConnectionManager は、createManagedConnection() を呼び出し、EIS に新しい接続を割り当てます。
コード リスト 6-27 matchManagedConnections() メソッドの実装
public ManagedConnection
matchManagedConnections(Set connectionSet,
Subject subject,
ConnectionRequestInfo info)
throws ResourceException
このクラスでは、接続のマッチングに次の方法を使用しています。
開発時に必要な AbstractManagedConnectionFactory プロパティ
AbstractManagedConnectionFactory の基本実装を使用するには、デプロイメント時に次の表のプロパティを指定する必要があります。
ADK における他の主要 ManagedConnectionFactory 機能 ADK のサンプル アダプタは、sample.spi.ManagedConnectionFactoryImpl と呼ばれる、AbstractManagedConnectionFactory を拡張するクラスを提供します。このクラスは、ADK の基本クラスを拡張する方法例として使用してください。 ManagedConnectionFactory と呼ばれる、サンプル アダプタの実装コードの完全リストについては、次を参照してください。 WLI_HOME/adapters/sample/src/sample/spi/ ManagedConnection javax.resource.spi.ManagedConnection ManagedConnection オブジェクトは、EIS に対する接続設定に必要なすべての高コスト リソースをカプセル化します。ManagedConnection インスタンスは、基本となる EIS に対する物理的な接続を表します。ManagedConnection オブジェクトは、アプリケーション サーバによって管理対象環境にプールされます。 ADK 実装 ADK では ManagedConnection の抽象実装を提供しています。この基本クラスは、接続イベント リスナおよび複数アプリケーションレベルの接続ハンドルを ManagedConnection インスタンスごとに管理するロジックを提供します。 ManagedConnection インタフェースを実装する場合、基本となる EIS が提供するトランザクション境界設定サポートを決める必要があります。トランザクション境界設定の詳細については、トランザクション境界設定を参照してください。 ADK では、AbstractManagedConnection という、以下の機能を持つ javax.resource.spi.ManagedConnection インタフェースの抽象実装を提供しています。
ManagedConnectionFactoryImpl.java
ADK に付属しているサンプル アダプタには、AbstractManagedConnection を拡張する ManagedConnectionImpl が入っています。サンプル アダプタの ManagedConnection 実装コードの完全リストについては、次を参照してください。
WLI_HOME/adapters/sample/src/sample/spi/
ManagedConnectionFactoryImpl.java
ManagedConnectionMetaData
javax.resource.spi.ManagedConnectionMetaData
ManagedConnectionMetaData インタフェースは、ManagedConnection インスタンスに関連付けられている基本となる EIS インスタンスに関する情報を提供します。アプリケーションサーバでは、この情報に基づいて、接続対象の EIS インスタンスに関する実行時情報が取得されます。
ADK 実装
ADK では、AbstractManagedConnectionMetaData という、以下の機能を持つ javax.resource.spi.ManagedConnectionMetaData および javax.resource.cci.ConnectionMetaData インタフェースの抽象実装を提供しています。
ADK に付属しているサンプル アダプタには、AbstractManagedConnectionMetaData を拡張する ConnectionMetaDataImpl が入っています。アダプタの詳細なコード リストについては、次を参照してください。
WLI_HOME/adapters/sample/src/sample/spi/ConnectionMetaDataImpl.java
ConnectionEventListener
javax.resource.spi.ConnectionEventListener
ConnectionEventListener インタフェースは、アプリケーション サーバが ManagedConnection インスタンスからの通知を受信できるようにするイベント コールバック メカニズムを提供します。
ADK 実装
ADK では、ConnectionEventListener の 2 つの具象実装を提供しています。
たいていの場合は、ADK で提供するこの 2 つの実装で十分なので、このインタフェースの独自の実装を用意する必要はありません。
ConnectionManager
javax.resource.spi.ConnectionManager
ConnectionManager インタフェースは、アダプタが接続要求をアプリケーション サーバに渡すのに使用できるフックを提供します。
ADK 実装
ADK では、このインタフェースの具象実装を提供しています。これは、com.bea.adapter.spi.NonManagedConnectionManager と呼ばれます。この実装は、非管理対象環境で実行中のアダプタに基本接続マネージャを提供します。管理対象環境では、このインタフェースはアプリケーション サーバによって提供されます。ほとんどの場合に、ADK が用意する実装を使用できます。
NonManagedConnectionManager は、javax.resource.spi.ConnectionManager インタフェースの具象実装で、アダプタが非管理シナリオにおいて ConnectionManager の役割を果たしますが、接続プールなどの高品質なサービスは提供しません。
ConnectionRequestInfo
javax.resource.spi.ConnectionRequestInfo
ConnectionRequestInfo インタフェースは、アダプタが独自の要求に固有なデータ構造を接続要求フローに渡せるようにします。アダプタは、空のインタフェースを拡張して、接続要求に対する独自のデータ構造をサポートします。
ADK 実装
ADK は、javax.resource.spi.ConnectionRequestInfo インタフェースの具象実装を提供します。このインタフェースは、ConnectionRequestInfoMap と呼ばれます。これは、ユーザ名やパスワードなど、接続が確立された場合に要求される情報への java.util.Map インタフェースを提供します。
LocalTransaction
javax.resource.spi.LocalTransaction
LocalTransaction インタフェースは、EIS リソース マネージャの内部で管理されているトランザクションのサポートを提供し、外部トランザクション マネージャを必要としません。
ADK 実装
ADK では、AbstractLocalTransaction という、このインタフェースの抽象実装を提供しており、EIS 固有の事項を中心に LocalTransaction の実装作業を行うことができます。特に、次のような作業を行います。
手順 4 : CCI の実装
クライアント インタフェースにより、J2EE 準拠アプリケーションは、バックエンド システムにアクセスできます。クライアント インタフェースは、クライアント アプリケーションとバックエンド システム間のデータ フローを管理しますが、コンテナまたはアプリケーション サーバとアダプタとのやり取りに関する可視性はありません。クライアント インタフェースは、EIS との対話における要求および応答の両レコードのフォーマットを指定します。
まず、アダプタが J2EE 準拠 Common Client Interface (CCI) をサポートする必要があるかどうかを判断しなければなりません。現行の J2EE 仕様では必須要件にはなっていませんが、これから先のバージョンでは必須要件になることが予想されます。したがって、ADK では、アダプタの CCI インタフェースの実装を支援することに重点を置いています。
この節の構成
この節(手順 4 : CCI の実装)では、CCI の実装に使用できるインタフェースについて説明します。CCI の実装作業には、最低でも 2 つのインタフェースが必要です(基本的な CCI の実装を参照)。ここでは、それぞれのインタフェースを詳しく説明し、さらに、ADK に含まれているサンプル アダプタによるそれらのインタフェース拡張方法を説明します。
この 2 つの必須インタフェースの説明に続いて、その他のインタフェースの詳細やこれらのインタフェースを使用する理由や利点についても説明しています。
基本的な CCI の実装
アダプタに CCI を実装するには、最低でも、次の 2 つのインタフェースを拡張する必要があります。
これらのインタフェースは、できればここで示す順序で実装してください。
また、アダプタに必要な以下のインタフェースはいずれも実装可能です。
Connection
javax.resource.cci.Connection
Connection は、クライアントが基盤となる物理接続にアクセスするときに使用する、アプリケーションレベルのハンドルを表します。Connection インスタンスに関連付けられた実際の物理接続は、ManagedConnection インスタンスによって表されます。
クライアントは、ConnectionFactory インスタンスで getConnection() メソッドを使用することにより、Connection インスタンスを取得します。Connection は、ゼロ個以上の Interaction インスタンスと関連付けることができます。
ADK 実装
ADK では、AbstractConnection という、このインタフェースの抽象実装を提供しています。この実装には以下の機能があります。
このクラスは、次のメソッドを実装して拡張する必要があります。
public Interaction createInteraction()
throws ResourceException
このメソッドは、この接続に関連付けられた対話を作成します。この対話により、アプリケーションが EIS 関数を実行できるようになります。このメソッドの戻り値および例外は、以下のとおりです。
Interaction
javax.resource.cci.Interaction
javax.resource.cci.Interaction は、コンポーネントが EIS 関数を実行できるようにします。Interaction インスタンスは、EIS インスタンスとの対話を、以下のメソッドによってサポートします。
Interaction インスタンスは、接続から作成され、Interaction と Connection インスタンスとの関連付けの保守に必要です。close() メソッドは、対話に必要なアダプタが保守するすべてのリソースを解放します。Interaction インスタンスをクローズしても、関連付けられた Connection インスタンスはクローズをトリガしません。
ADK 実装
ADK では、AbstractInteraction という、このインタフェースの実装を提供しています。この実装には以下の利点があります。
このインタフェースには、execute() を実装する AbstractInteraction の具象拡張を提供する必要があります。execute() には 2 つのバージョンがあります。これらについては、次に説明します。
execute() バージョン 1
リスト6-28 で宣言されている execute() メソッドは、InteractionSpec で表された対話を示しています。
コード リスト 6-28 execute() バージョン 1 のコード例
public boolean execute(InteractionSpec ispec,
Record input,
Record output)
throws ResourceException
この形の呼び出しでは、execute() は入力レコードを取り込んで、出力レコードを更新します。以下を返します。
以下の表に、execute() バージョン 1 のパラメータを示します。
execute() バージョン 2 リスト6-29 で宣言されている execute() メソッドでも、InteractionSpec で表された Interaction が実行されます。 コード リスト 6-29 execute() バージョン 2 のコード例 この形式の呼び出しでは、execute() は入力 Record を取り込み、Interaction の実行が正常に完了した場合、出力 Record を返します。 このメソッドの戻り値および例外は、以下のとおりです。
public Record execute(InteractionSpec ispec,
Record input)
throws ResourceException
例外が発生した場合、このメソッドによって Connection に通知され、Connection によって自己のクローズなどの適切な処置が行われます。
以下の表に、execute() バージョン 2 のパラメータを示します。
XCCI を使用した CCI の実装 XCCI(XML-CCI)は、データ表示に XML ベースのレコード形式を使用する Client Connector Interface の固有言語です。これらのフォーマットは、フレームワークおよびツールによってサポートされています。XML-CCI は、通常、XCCI という略称で呼ばれます。 XCCI には、Services および DocumentRecords という 2 つの主要コンポーネントがあります。 サービス サービスは、EIS で使用可能な機能を表し、次の 4 つのコンポーネントで構成されます。
サービスが要求または応答データを必要としないことを示すには、DesignTimeRequestHandler の要求または応答に対し、空またはヌルの IDocumentDefinition を作成します。また、空またはヌルの IDocumentDescriptor インスタンスを持つサービスに対し、IServiceDescriptor の要求または応答に IDocumentDescriptor を設定します。静的 DocumentFactory.createNullDocumentDefinition() メソッドを使用して空またはヌルの IDocumentDefinition インスタンスを作成し、静的 DescriptorFactory.createNullDocumentDescriptor() メソッドを使用して空またはヌルの IDocumentDescriptor インスタンスを作成します。
空またはヌルのドキュメント定義または記述子を生成された IServiceDescriptor、あるいは設計時にアダプタにより生成された IApplicationViewDescriptor で使用する場合、これらのサービスに対するヌル要求または応答ドキュメントを実行時に処理する必要があります。つまり、空またはヌルのドキュメント記述子を使用するアダプタは、実行時に要求または応答ドキュメントが非ヌルであるとは想定しないからです。
アプリケーション ビューの実行時エンジンにより、要求または応答を必要とするサービスが非ヌルの要求または応答ドキュメントを受け取り、要求や応答を必要としないサービスがヌルの要求や応答ドキュメントを受け取ることができます。
DocumentRecord
com.bea.connector.DocumentRecord
実行時に、XCCI レイヤは DocumentRecord オブジェクトをサービスに対する入力と想定し、DocumentRecord オブジェクトをサービスからの出力として返します。DocumentRecord は、javax.resource.cci.Record および com.bea.document.IDocument インタフェースを実装しています。Record インタフェースの説明については、Recordを参照してください。
IDocument は、アダプタ内の CCI レイヤからの XML 入力および出力を促進するインタフェースですが、これは次に説明します。
IDocument
com.bea.document.IDocument
IDocument は、W3C Document Object Model (DOM) を取り巻く高次元のラッパです。IDocument インタフェースの最も重要な付加価値は、XML ドキュメントの要素に Xpath インタフェースを提供する点です。すなわち、IDocument オブジェクトは、XPath 文字列を使用してクエリおよび更新が可能です。たとえば、リスト6-30 に示す XML ドキュメントは、「Bob」という名前の人物に関する詳細を記録するために XML をどのように使用するかを示しています。
コード リスト 6-30 XML の例
<Person name="Bob">
<Home squareFeet="2000"/>
<Family>
<Child name="Jimmy">
<Stats sex="male" hair="brown" eyes="blue"/>
</Child>
<Child name="Susie">
<Stats sex="female" hair="blonde" eyes="brown"/>
</Child>
</Family>
</Person>
IDocument を使用し、リスト6-31 に示されている XPath コードで「Jimmy」の髪の色を検索できます。
コード リスト 6-31 IDocument Data を検索するサンプル コード
System.out.println("Jimmy's hair color: " +
person.getStringFrom("//Person[@name=¥"Bob¥"]/Family/Child
[@name=¥"Jimmy¥"]/Stats/@hair");
一方、DOM を使用する場合、リスト6-32 に示すコードを使用してクエリを発行する必要があります。
コード リスト 6-32 DOM Data を検索するサンプル コード
String strJimmysHairColor = null;
org.w3c.dom.Element root = doc.getDocumentElement();
if (root.getTagName().equals("Person") &&
root.getAttribute("name").equals("Bob") {
org.w3c.dom.NodeList list = root.
getElementsByTagName("Family");
if (list.getLength() > 0) {
org.w3c.dom.Element family = (org.w3c.dom.
Element)list.item(0);
org.w3c.dom.NodeList childList = family.getElementsByTagName("Child");
for (int i=0; i < childList.getLength(); i++) {
org.w3c.dom.Element child = childList.item(i);
if (child.getAttribute("name").equals("Jimmy")) {
org.w3c.dom.NodeList statsList =
child.getElementsByTagName("Stats");
if (statsList.getLength() > 0) {
org.w3c.dom.Element stats = statsList.item(0);
strJimmysHairColor = stats.getAttribute("hair");
}
}
}
}
}
IDocument によりコードが簡素化されます。
ADK 付属の XCCI クラス
アダプタに対し XCCI を実装するために、ADK は以下のクラスおよびインタフェースを提供します。
ここでは、それらのクラスおよびインタフェースについて説明します。
AbstractDocumentRecordInteraction
com.bea.adapter.cci.AbstractDocumentRecordInteraction
このクラスは、ADK の抽象基本 Interaction、com.bea.adapter.cci.AbstractInteraction を拡張します。このクラスの目的は、DocumentRecord の操作に便利なメソッドを提供し、実装時のエラー処理の量を減らすことです。このクラスは以下の宣言をします。
protected abstract boolean execute(
InteractionSpec ixSpec,
DocumentRecord inputDoc,
DocumentRecord outputDoc
) throws ResourceException
および
protected abstract DocumentRecord execute(
InteractionSpec ixSpec,
DocumentRecord inputDoc
) throws ResourceException
これらのメソッドは、出力レコードが DocumentRecord オブジェクトであることが確認されてから、具象実装で呼び出されます。
DocumentDefinitionRecord
com.bea.adapter.cci.DocumentDefinitionRecord
このクラスを使用すると、アダプタが DocumentRecordInteraction 実装から IDocumentDefinition を返すことができるようになります。このクラスは、サービスに対する要求と応答ドキュメント定義の少なくとも一方を作成する設計時要求を満たすのに便利です。
DocumentInteractionSpecImpl
com.bea.adapter.cci.DocumentInteractionSpecImpl
このクラスを使用すると、特定のサービスに対する要求ドキュメント定義および応答ドキュメント定義を、実行時に実行メソッドに対して提供された InteractionSpec に保存できます。この機能は、アダプタの Interaction が実行時にサービスの XML スキーマにアクセスする必要がある場合に便利です。
IProxiedMarker および IProxiedConnection インタフェース
com.bea.connector.IProxiedConnection
com.bea.connector.IProxiedMarker
IProxiedMarker インタフェースは、com.bea.adapter.cci.ConnectionFactoryImpl クラスによって実装されます。このマーカは、関連付けられた接続がプロキシ オブジェクトであるかどうかを判別するために使用されます。IProxiedConnection インタフェースは、com.bea.adapter.cci.AbstractConnection クラスによって実装され、プロキシに関連付けられた実際の接続を返すために使用されます。IProxiedConnection インタフェースには、getAdapterConnection() という 1 つのメソッドがあります。getAdapterConnection メソッドは、ポインタを返す AbstractConnection クラスで定義されています。IProxedConnection インタフェースが必要になるのは、プロキシが実装するインタフェースのみ返すことができるからです。プロキシは、派生ツリーのクラス オブジェクトを区別できません。
XCCI の設計パターン
XCCI による方法を使用した場合に使用される一般的な設計パターンは、Interaction 実装でのサービスの定義をサポートすることです。このデザイン パターンを使用する場合、アダプタの javax.resource.cci.Interaction 実装により、クライアント プログラムは、WebLogic Integration サービスを定義するために、基本にある EIS からメタデータを検索できます。その結果、具体的には、この対話によって、サービスに対する要求と応答 XML スキーマおよび追加メタデータの生成を可能にする必要があります。Interaction により、クライアント プログラムは EIS の提供する関数のカタログを参照できます。この方法により、アダプタのシン クライアント アーキテクチャが促進されます。
ADK では、この設計パターンの実装を支援する com.bea.adapter.cci.DesignTimeInteraction- SpecImpl クラスを提供しています。sample.cci.InteractionImpl クラスは、DesignTimeInteractionSpecImpl クラスを使用してこの設計パターンの実装方法を示します。
非 XML J2EE 準拠アダプタの使用
ADK では、WebLogic Integration で非 XML アダプタを使用するためのプラグイン メカニズムを提供しています。あらかじめ構築されたアダプタのすべてが、その javax.resource.cci.Record データ型に XML を使用するわけではありません。たとえば、次のような場合、XML は使用できません。
このようなタイプのアダプタの実装を容易にするため、ADK では com.bea.connector.IRecordTranslator インタフェースを提供しています。実行時に、アプリケーション統合エンジンは、アダプタの IRecordTranslator 実装を使用して、アダプタのサービスを実行する前に要求および応答レコードを変換します。
Application Integration エンジンでは、com.bea.connector.DocumentRecord タイプの javax.resource.cci.Record しかサポートしないので、この独自形式を要求および応答レコード用のドキュメント レコードに変換する必要があります。この場合、アダプタの CCI 対話レイヤを書き直す必要はありません。IRecordTranslator インタフェースを実装するアダプタの EAR ファイルにクラスを含めることにより、アプリケーション統合エンジンは要求および応答の各レコードに対して、トランスレータ クラスにあるトランスレーション メソッドを実行できます。
InteractionSpec 実装クラスと IRecordTranslator 実相クラスの間には、1 対 1 の相関関係があります。複数の種類の InteractionSpec 実装を持つアダプタは、それぞれに対して IRecordTranslator 実装クラスを必要とします。プラグイン アーキテクチャは、アダプタの InteractionSpec の完全クラス名およびフレーズ RecordTranslator を使用してトランスレータ クラスを名前でロードします。たとえば、アダプタの InteractionSpec クラスの名前が com.bea.adapter.dbms.cci.InteractionSpecImpl である場合、エンジンは com.bea.adapter.dbms.cci.InteractionSpecImplRecordTranslator クラスをロードします(後者のクラスが有効の場合)。
実装する必要のあるメソッドの詳細については、以下のディレクトリの com.bea.connector.IRecordTranslator の Javadoc を参照してください。
WLI_HOME/docs/apidocs/com/bea/connector/IRecordTranslator.html
ConnectionFactory
javax.resource.cci.ConnectionFactory
ConnectionFactory は、EIS インスタンスへの接続を取得するためのインタフェースを提供します。ConnectionFactory インタフェースの実装は、アダプタによって必ず提供されます。
アプリケーションは、JNDI ネームスペースから ConnectionFactory インスタンスをルックアップし、これを使用して EIS 接続を取得します。
JNDI 登録をサポートするために、java.io.Serializable および javax.resource.Referenceableinterfaces を実装する必要があります。このためには、ConnectionFactory の実装クラスが必要となります。
ADK 実装
ADK では、ConnectionFactoryImpl という javax.resource.cci.ConnectionFactory インタフェースの具象実装を提供します。このインタフェースには以下の機能があります。
このクラスは通常、拡張せずにそのまま使用できます。
ConnectionMetaData
javax.resource.cci.ConnectionMetaData
ConnectionMetaData は、Connection インスタンスによって接続された EIS インスタンスに関する情報を提供します。コンポーネントは、Connection.getMetaData メソッドを呼び出して ConnectionMetaData インスタンスを取得します。
ADK 実装
デフォルトで、ADK は、com.bea.adapter.spi.AbstractConnectionMetaData クラスを通じてこのクラスの実装を提供します。この抽象クラスを拡張して、その 4 つの抽象メソッドを使用するアダプタに実装する必要があります。
ConnectionSpec
javax.resource.cci.ConnectionSpec
ConnectionSpec は、アプリケーション コンポーネントが接続要求固有のプロパティを ConnectionFactory.getConnection() メソッドに渡すときに使用されます。
この ConnectionSpec インタフェースを JavaBean として実装し、ツールをサポートできるようにすることをお勧めします。ConnectionSpec 実装クラスのプロパティは、ゲッター メソッドおよびセッター メソッドのパターンによって定義します。
CCI 仕様により、ConnectionSpec の標準プロパティのセットが定義されます。プロパティの定義は、派生インタフェースまたは空の ConnectionSpec インタフェースの実装クラスに対して行われます。さらに、アダプタでは基本となる EIS に固有の追加プロパティを定義できます。
ADK 実装
ConnectionSpec 実装は、JavaBean でなければならないので、ADK ではこのクラスに対しては実装を提供していません。
InteractionSpec
javax.resource.cci.InteractionSpec
InteractionSpec は、EIS インスタンスとの対話を行うのに必要なプロパティを格納しています。特に、これは基本となる EIS の指定関数を対話で実行するときに使用されます。
CCI 仕様により、InteractionSpec の標準プロパティのセットが定義されます。標準プロパティを基本の EIS に適用しない場合、標準プロパティのサポートのために InteractionSpec を実装する必要はありません。
InteractionSpec 実装クラスは、サポートされる各プロパティに対してゲッター メソッドおよびセッター メソッドを提供する必要があります。このゲッター メソッドおよびセッター メソッド規約は、JavaBean 設計パターンに基づいている必要があります。
InteractionSpec インタフェースは、ツールをサポートするためには、JavaBean として実装する必要があります。InteractionSpec インタフェースの実装クラスは、java.io.Serializable インタフェースを実装する必要があります。
InteractionSpec には、Record にはないが、どの EIS 関数を呼び出すかを判断するときに役立つ情報が入っています。
次の表では、標準プロパティについて説明します。
以下の標準プロパティは、対話インスタンスの ResultSet 要件に関する判断材料として使用されます。
CCI 実装では、InteractionSpec インタフェースに記述されたプロパティ以外の追加プロパティを指定できます。
注意: 追加プロパティのフォーマットおよびタイプは、EIS に固有のもので、CCI 仕様のスコープ外です。
ADK 実装
ADK には、InteractionSpecImpl という、javax.resource.cci.InteractionSpec の具象実装が入っています。このインタフェースは、表 6-5 で説明されている標準対話プロパティにゲッター メソッドおよびセッター メソッドを使用することによって拡張できる、基本実装を提供します。
LocalTransaction
javax.resource.cci.LocalTransaction
LocalTransaction インタフェースは、アプリケーションレベルのローカル トランザクション境界設定に使用されます。これは、リソース マネージャのローカル トランザクションに対するトランザクション境界設定インタフェースです。システム規約レベルの LocalTransaction インタフェース(javax.resource.spi package で定義されている)は、コンテナのローカル トランザクション管理に使用されます。
ローカル トランザクションは、リソース マネージャの内部で管理されます。ローカル トランザクションの調整には、外部トランザクション マネージャは関与しません。
CCI 実装は、LocalTransaction インタフェースを実装できます(必須ではありません)。LocalTransaction インタフェースが CCI 実装でサポートされている場合、Connection.getLocalTransaction() メソッドは、LocalTransaction インスタンスを返すことになります。すると、コンポーネントは、返された LocalTransaction を使用して、基本の EIS インスタンスに対して、(Connection インスタンスに関連付けられた)リソース マネージャのローカル トランザクションの境界設定を行うことができます。
com.bea.adapter.spi.AbstractLocalTransaction クラスでもこのインタフェースを実装します。
ローカル トランザクションの詳細については、トランザクション境界設定を参照してください。
Record
javax.resource.cci.Record
javax.resource.cci.Record インタフェースは、Interaction で定義される execute() メソッドからの入力またはメソッドへの出力表現に使用する基本インタフェースです。execute() メソッドの詳細については、execute() バージョン 1およびexecute() バージョン 2を参照してください。
MappedRecord または IndexedRecord には、追加の Record を入れることができます。これは、MappedRecord および IndexedRecord を使用して任意の深さの階層構造を作成できることを示しています。MappedRecord または IndexedRecord で表される階層構造のリーフ要素としては、基本 Java タイプが使用されます。
Record インタフェースは、以下の表に示されている表現の 1 つになるように拡張できます。
アダプタが CCI インタフェースを実装する場合、次に考慮する事項はサービスに対しどのレコード形式を使用するかです。各サービスに対し、要求レコード(サービスへの入力を提供する)および応答レコード(EIS 応答を提供する)の形式を指定する必要があります。 ADK 実装 ADK では、CCI レイヤで XML ベースのレコード形式を実装する支援に重点を置いています。この目的のため、ADK では DocumentRecord クラスを提供しています。さらに、BEA のスキーマ ツールキットを使用すれば、サービスに対する要求および応答ドキュメントを記述するスキーマを開発できます。 ADK では、レコード名とレコード記述に対するゲッター メソッドおよびセッター メソッドを提供する javax.resource.cci.Record インタフェースの具象実装、RecordImpl を用意しています。 アダプタ プロバイダが XML ベースのレコード形式を使用する(使用を強く推奨します)場合、ADK では com.bea.adapter.cci.Abstract DocumentRecordInteraction クラスも用意しています。このクラスによって、クライアントが DocumentRecord オブジェクトを渡すことができます。さらに、このクラスは DocumentRecord の内容へのアクセスに便利なメソッドを提供しています。 ResourceAdapterMetaData javax.resource.cci.ResourceAdapterMetaData インタフェース javax.resource.cci.ResourceAdapterMetaData は、アダプタ実装の機能に関する情報を提供します。CCI クライアントは、ConnectionFactory.getMetaData を使用してアダプタのメタデータ情報を取得します。getMetaData() メソッドは、EIS インスタンスに対するアクティブな接続を必要としません。ResourceAdapterMetaData インタフェースは、アダプタ実装に固有な情報を追加して提供するように拡張できます。 注意: このインタフェースは、アダプタを通じて接続されている EIS インスタンスに関する情報は提供しません。 ADK 実装 ADK では、アダプタ メタデータをカプセル化し、すべてのプロパティに対してゲッターおよびセッターを提供するインタフェース、ResourceAdapterMetaDataImpl を用意しています。
手順 5 : アダプタのテスト
アダプタのテストを行うため、ADK では、com.bea.adapter.test.TestHarness、ユニット テスト用のオープンソース ツール JUnit を強化するテスト支援機能を提供しています。com.bea.adapter.test.TestHarness は、以下の処理を行います。
JUnit に関する詳細については、次のサイトを参照してください。
テスト支援機能の使用方法
ADK テスト支援機能を使用する手順は次のとおりです。
コード リスト 6-33 サンプル アダプタによる Ant ターゲットの指定
<target name='test' depends='packages'>
<java classname='com.bea.adapter.test.TestHarness'>
<arg value='-DCONFIG_FILE=test.properties'/<classpath
refid='CLASSPATH'/>
</java>
ADK が提供するテスト ケースの拡張
サンプル アダプタには、次の 2 つの TestCase 拡張が付属しています。
sample.spi.NonManagedScenarioTestCase
NonManagedScenarioTestCase を使用すると、非管理対象シナリオの SPI および CCI クラスをテストできます。具体的には、次の 4 つについてテストします。
sample.event.OfflineEventGeneratorTestCase
sample.event.OfflineEventGeneratorTestCase を使用すると、Weblogic Server 外のイベント ジェネレータの内部機能をテストできます。具体的には、イベント ジェネレータの以下の内容をテストします。
sample.client.ApplicationViewClient
sample.client.ApplicationViewClient は、追加のアダプタ テスト手段を提供します。このクラスは、サービスを呼び出し、アプリケーション ビューのイベントをリスンする方法を示す Java プログラムです。Ant build.xml ファイルは、クライアント ターゲットを提供し、ApplicationViewClient プログラムを使用できるようにします。ant client を実行する場合のデフォルト コンフィグレーションは、プログラムの使用方法を表示することです。クライアント プログラムに対する入力パラメータは、build.xml ファイルを編集し、変更します。
sample.client.ApplicationViewClient.java の例を確認するには、WLI_HOME/adapters/ sample/src/sample/client を参照してください。
注意: sample.client.ApplicationViewClient は、テスト支援機能に組み込まれていません。
手順 6 : アダプタのデプロイ
SPI および CCIインタフェースを実装し、アダプタをテストしたときに、手動または WebLogic Server Administration Console からアダプタを WebLogic Integration 環境にデプロイできます。詳細は、アダプタのデプロイを参照してください。
![]() |
![]() |
![]() |
![]() |
||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |