本文へジャンプ

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

送信されたすべての情報は安全です。

  • 閉じる [x]

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


送信されたすべての情報は安全です。

  • 閉じる [x]

IBM Workplace Forms V2.7 ストリーミング API ガイド

Gu Yi, Lead Software Engineer, IBM
Gu Yi は、IBM の China Development Lab の IBM Software Services for Lotus (ISSL) Emerging Services Team に所属する上級ソフトウェア・エンジニアです。Gu Yi は 2005 年から IBM Software Services のプロジェクトに携わっており、IBM Workplace Forms に関連するさまざまなプロジェクトへの参加経験があります。また、2 年の IBM WebSphere Portal 開発経験と、業界内で 4 年の J2EE 開発経験もあります。

概要: IBM Workplace Forms V2.7 の新機能である ピュア Java ストリーミング API について説明します。ピュア Java ストリーミング API を、C 言語で記述された従来の API と比較します。サンプル・コードを示しながら、ピュア Java ストリーミング API の使用法を説明します。

日付:  2007年 5月 15日
レベル:  中級 この記事の原文:  英語
アクティビティー: 2117 ビュー
お気軽にご意見・ご感想をお寄せください: 


IBM Workplace Forms V2.7 において、Workplace Forms ファミリーにストリーミング API が追加されました。この新しいストリーミング API は 100% ピュア Java ベースの API であるため、従来の C 言語 API とは異なります。

この記事では、このストリーミング API の機能を説明し、従来の API と比較します。ストリーミング API のインターフェースは従来の API のインターフェースと同じですが、実行できる操作が限られています。IBM Workplace Forms のストリーミング API にはさまざまな新機能が組み込まれています。

この記事では、ストリーミング API の使用例を解説します。この記事の最後のセクションには、ストリーミング API の使用法を示すサンプル・コードを収録しています。

ストリーミング API の新機能について

IBM Workplace Forms Server API は、階層型の DOM データ構造体セットに基づき、完全に機能する IBM Workplace Forms Viewer の機能要件に対応するよう設計されています。この API は不必要なサービスも提供するため、サーバー・アプリケーションの側から見ると、メモリーを大量に消費し、リアルタイム操作を多数実行するという特徴があります。また、従来の API では一部の Java アプリケーションで安定性の問題が発生する可能性があります。従来の API は C 言語で記述されており、Java C ブリッジを使用して呼び出されるため、Java 仮想マシン (JVM) の保護範囲外で稼働します。したがって、API で障害が発生すると、これが原因で JVM がクラッシュする可能性があります。さらには、この API の障害が原因となってアプリケーション・サーバーがクラッシュする可能性もあります。

Workplace Forms Server API で生じるこれらの問題に対処するため、最新バージョンの IBM Workplace Forms には、ストリーミング API と呼ばれる新たなピュア Java API が組み込まれました。ストリーミング API は、XFDL 解析を実行する Java パーサーとして SAX (Simple API for XML) を採用した 100% Java ベースの API です。

このJava 実装はサーバー環境で安全に稼働し、JVM により障害が円滑に処理され、個々のアプリケーションが相互に切り離されます。Java ベース API で障害が発生しても、アプリケーション・サーバーがクラッシュすることはありません。ストリーミング API は、完全機能ビューアーではなくサーバー・アプリケーションの要件に対応するよう調整されています。Workplace Forms Server API に比べ、ストリーミング API は実行時に使用するメモリー・フットプリントが小さく、Workplace Forms 処理のリアルタイム性が低くなります。


API のノード構造

ストリーミング API のオブジェクト・ツリー構造は、従来の API と同一です。FormNodeP ノードによる XFDL フォームの内部表現を図 1 に示します。ストリーミング API では、XFDL ファイルを解析する際にこの構造が内部で使用されることはありませんが、ストリーミング API でノードを作成または取得する際にこの構造の概念が適用されます。


図 1. API のノード構造

ツリーのルート・ノードはフォーム・ノードです。このルート・ノードには複数の子ノード (ページ) があります。各ページ・ノードには、さらに子ノード (項目) があります。同一タイプのノードは常に、ツリーの同一レベルに位置します。ノード構造のすべてのノードは、FormNodeP (項目ノード、オプション・ノード、または引数ノードなど) とみなすことができます。アプリケーションでは、このオブジェクト・ツリーをナビゲートするときに、任意の FormNodeP オブジェクトに対して dereferenceEx() を呼び出すことができます。ナビゲート操作は相対的です。1 つ上のレベルに移動して参照先項目を検索します。


ストリーミング API のインストール

従来の API に比べ、ストリーミング API のインストールは非常に単純です。Java クラスパスに追加する必要のある JAR ファイルは 1 つだけです。ストリーミング API では、従来の API の構成ファイル (PugeEdgeAPI.ini や Prefs.config など) は無視されます。ただし、ログの印刷用に PureEdge.pel がサポートされています。

クラスパスではストリーミング API と従来の API が共存できます。この共存により、2 つの API を置き換える操作が容易になります。ストリーミング API を使用するには、クラスパスでストリーミング API JAR ファイルが pe_api.jar より前に位置していることを確認してください。クラスパスで最初に pe_api.jar が検出されると、ストリーミング API ではなく従来の API がロードされます。


2 つの API のインターフェースの比較

ストリーミング API では、従来の API のメソッドの一部がサポートされています。ストリーミング API は一部の呼び出しをネイティブ API として使用するため、完全な後方互換性と前方互換性を備えています。ストリーミング API を使用する場合に従来の API のアプリケーションを簡単に移動できます。また、従来の API を使用する場合にストリーミング API を移動する操作も簡単です。

ストリーミング API と従来の API の両方でサポートされているメソッドのリストを表 1 に示します。


表 1. サポートされているメソッド
クラス名メソッド名説明
DTKinitialize(String progName, String progVer, String apiVer); このメソッドは、API を初期化します。ストリーミング API は、初期化を実行するときにパラメーターを使用しません。パラメーターは後方互換性または前方互換性を維持する目的でのみ必要です。
initializeWithLocale(String progName, String progVer, String apiVer, String theLocale) ;同上
IFSSingletongetXFDL();このメソッドは、XFDL クラスを取得するときに使用されます。XFDL オブジェクトとは、ユーザーがフォームのルート・ノードにアクセスするためのインターフェースです。
XFDL readForm(String fileName, …); このメソッドは、指定された fileName (パス・ストリング) または InputStream からフォームを読み取ります。
FormNodeP writeForm(String fileName, FormNodeP triggerItem, 0); このメソッドは、指定された fileName または OutputStream にフォームを書き込みます。ストリーミング API では、triggerItem は NULL でなければなりません。
destroy();このメソッドは明示的に呼び出す必要があります。
dereferenceEx(String theScheme, String theReference, int theReferenceCode, int referenceType, FormNodeP theNSNode) ;dereferenceEx() は、フォームのオプション・ノードまたは項目ノードへの参照を取得します。従来の API と異なり、dereferenceEx() を使用してグループ間をナビゲートすることはできません。パラメーター FormNodeP.UFL_GROUP_REFERENCE はサポートされていません。
getLiteralEx(String theCharSet); このメソッドは、指定された FormNodeP からリテラル文字列を取得します。
setLiteralEx(String theCharSet, String theLiteral); このメソッドは、指定された FormNodeP でリテラル文字列を設定します。
getLiteralByRefEx(String theScheme, String theReference, int theReferenceCode String theCharSet, FormNodeP theNSNode); これは、dereferenceEx() と getLiteralEx() を組み合わせたメソッドです。このメソッドは、オプション・レベルでのみ機能します。
setLiteralByRefEx(String theScheme, String theReference, int theReferenceCode, String theCharset, FormNodeP theNSNode, String theLiteral); これは、dereferenceEx() と setLiteralByRefEx() を組み合わせたメソッドです。このメソッドは、オプション・レベルでのみ機能します。
encloseInstance(); extractInstance(); これらのメソッドは、XFDL データ・インスタンスを更新またはコピーするときに、フォームのルート・ノードまたは XML インスタンス・ノードに対して呼び出されます。
extractXFormsInstance(); updateXFormsInstance(); これらのメソッドは、XForms データ・インスタンスを更新またはコピーするときに、フォームのルート・ノードまたはインスタンス・ノードに対して呼び出されます。

ストリーミング API でサポートされない関数のリストを表 2 に示します。


表 2. ストリーミング API でサポートされない関数
クラス名メソッド名説明
XFDL create (); このメソッドは、新規ノードを作成し、フォーム階層の指定された位置にその新規ノードを追加します。
FormNodeP getChildren() getNext() getInfoEx()ストリーミング API では、これらのクラスを呼び出して FormNodeP のツリー構造をナビゲートすることはできません。ナビゲート操作が必要な場合は、従来の API を使用してください。
setAttribute() getAttribute()現時点では、ストリーミング API では属性に対する操作がサポートされていません。
getSignature(); verifySignature(); Other functions related to signatureこれらの関数は、シグニチャーの検証に関連しています。
getNamespaceURI(); addNamespace( ); Other functions related to namespace特定のノードで名前空間を追加するか、または名前空間 URI を取得します。
extractFile(); encloseFile(); ストリーミング API は、フォームの添付ファイルを操作できません。
setFormula(); Other computation-related functionsストリーミング API では、計算エンジンと XForms エンジンの両方を実行することはできません。バインドされている XForms 項目の値を取得する操作を実行すると、NULL が戻されます。

ストリーミング API でのみ使用可能な新規関数のリストを表 3 に示します。


表 3. ストリーミング API の新規関数
クラス名メソッド名説明
FormNodeP addHint(String theReference, int theReferenceType) ; addHints(java.util.List theReferences, int theReferencesType); ストリーミング API に対し、参照するヒントまたはパターンのセットを指示できます。これにより、API は初回パスの後にこれらのヒントとパターンをキャッシュに入れます。
clearHints();この関数は、すべてのヒントを消去します。

ストリーミング API は、Java アプリケーションで高いパフォーマンスを実現することを目的としています。SAX パーサーの制限により、ツリー・モデル内のナビゲートなどの一部の機能がサポートされていません。ストリーミング API の機能制限から、以下に示す状況においては、従来の API ではなくストリーミング API の使用を検討してください。

  1. アプリケーションが Java プラットフォームで実行されており、拡張機能開発用のアプリケーションではない。
  2. 単純なフォーム操作 (ノードの遅延処理やノードのリテラルの設定など) のみが必要である。複雑なツリー・ナビゲート機能が不要である。
  3. アプリケーションのパフォーマンスの基準が高い。同時接続ユーザー数が多く、応答時間が重要である。フォームのサイズが非常に大きい場合に従来の DOM ベースの API を使用すると、メモリーを大量に消費する。
  4. アプリケーションが複数のプラットフォームにデプロイされている。従来の API は各種プラットフォームに対応していますが、構成が複雑であり、対応 OS が限られています。ストリーミング API は 1 つのファイルに記述されており、任意の Java 環境に配布できるので、Web アプリケーションには最適です。

計算エンジンと XForms エンジンはストリーミング API では機能しないため、アプリケーションでこれらのエンジンを実行する場合に使用できるのは従来の API のみです。


API サンプル・コード

API を使用してフォームを読み取り、値を変更する例と、API を使用してフォームのデータ・インスタンスを変更する例の2 つの使用例のサンプル・コードを以下に示します。

API を使用したフォームの読み取りと値の変更

次に示すコード・スニペットは、フォームの読み取り、フォームの値の変更、および新規ファイルへのフォームの出力の方法を示します。

  1. 1. API を初期化し、XFDL オブジェクトを取得します。
    DTK.initialize("FormReader", "1.0.0", "7.1.0");
    XFDL theXFDL = IFSSingleton.getXFDL();
  2. readForm() API を使用してフォームをロードします。
    String fileName = "order.xfdl";
    FormNodeP theForm = theXFDL.readForm(fileName, XFDL.UFL_SERVER_SPEED_FLAGS);
  3. リスト 1 に示すように、適切な theForm.addHint(String reference, int referenceType) 呼び出しを追加して、ストリーミング API による文書の解析回数を減らします。

    リスト 1. Form.addHint(String reference, int referenceType) 呼び出しの追加
            
    	theForm.addHint("PAGE1.productColumn.value", FormNodeP.UFL_OPTION_REFERENCE);
    	theForm.addHint("PAGE1.unitCostColumn.value", FormNodeP.UFL_OPTION_REFERENCE);
    	theForm.addHint("PAGE1.qtyColumn.value", FormNodeP.UFL_OPTION_REFERENCE);
    	theForm.addHint("PAGE1.Subtotal.value", FormNodeP.UFL_OPTION_REFERENCE);
    	theForm.addHint("PAGE1.Total.value", FormNodeP.UFL_OPTION_REFERENCE);
    	theForm.addHint("PAGE1.Title.value", FormNodeP.UFL_OPTION_REFERENCE);
    

  4. リスト 2 に示すコードは、フォームから値を読み取り、フォームに値を書き込みます。

    リスト 2. フォームからの値の読み取りとフォームへの値の書き込み
            
    String subTotal = theForm.getLiteralByRefEx
    (null, "PAGE1.Subtotal.value", 0, null, null);
    	FormNodeP totalValueNode = theForm.dereferenceEx(null, 
    	"PAGE1.Total.value", 0,FormNodeP.UFL_OPTION_REFERENCE, null);
    
    	String total = totalValueNode.getLiteralEx(null);
    	theForm.setLiteralByRefEx(null, "PAGE1.Title.value", 0, null, null, 
    	"You have been billed " + total);
    	String theTitle = theForm.getLiteralByRefEx
    	(null, "PAGE1.Title.value", 0, null, null);
    	theForm.setLiteralByRefEx(null, "PAGE1.productColumn.value", 0, null, null, 
    	"NAME OF PRODUCT");
    	theForm.setLiteralByRefEx(null, "PAGE1.unitCostColumn.value", 0, null, null, 
    	"COST PER UINIT");
    	theForm.setLiteralByRefEx(null, "PAGE1.qtyColumn.value", 0, null, null, "QUANT");
    
    		theForm.writeForm("newForm.xfdl", null, 0);
    

  5. 最後に、destroy() を呼び出してフォーム・ノードを破棄します。
    theForm.destroy();

API を使用したフォームのデータ・インスタンスの変更

ストリーミング API を使用して、読み取ったフォームのデータ・インスタンスを抽出して置換できます。次に示すコード・スニペットは、API を使用してデータ・インスタンスを抽出および置換する方法を示します。

  1. ByteArrayOutputStream を使用して結果を取り込み、適切な extractXFormsInstance() メソッド呼び出しを追加して、XPathRef パラメーターに属するデータを抽出します。
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    theForm.extractXFormsInstance(null, xPathRef, false, true, null, stream);

    extractXFormsInstance() は、(モデル ID またはインスタンス ID により示される) XForms インスタンスの全体または一部を抽出し、指定されたパス (String) または OutputStream に結果を格納します。
  2. 渡された値 String を使用して、適切な updateXFormsInstance() メソッド呼び出しを追加して、xPathRef パラメーターが指し示すモデルにそのデータを追加します。
    String pathtoXMLFile = “C:\\somexmlfile.xml”;
    theForm.updateXFormsInstance(null, "instance(‘po')", null, pathToXMLFile, null, XFDL.UFL_XFORMS_UPDATE_APPEND);

ストリーミング API を使用して、ファイル、ストリーム、またはリーダーにある (モデル ID およびノード参照により示される) XForms インスタンスで、XML データを置換したり、XML データを追加したりできます。最終パラメーターは、データを置換するか、または示されているノードの前後のどちらかの位置にデータを追加するかを制御するフラグです。XForms インスタンスを置換するには、次のコードを使用します。

theForm.updateXFormsInstance(null, "instance(‘po')", null, pathToXMLFile, null, XFDL.UFL_XFORMS_UPDATE_REPLACE);


まとめ

IBM Workplace Forms のストリーミング API は、新しい Java ベースの API です。この API は、従来の API と大幅に異なります。サポートされている従来の API のインターフェースは限られていますが、Java アプリケーションでのツリー・ナビゲーション以外の操作では優れたパフォーマンスを実現します。


参考文献

学ぶために

製品や技術を入手するために

議論するために

著者について

Gu Yi は、IBM の China Development Lab の IBM Software Services for Lotus (ISSL) Emerging Services Team に所属する上級ソフトウェア・エンジニアです。Gu Yi は 2005 年から IBM Software Services のプロジェクトに携わっており、IBM Workplace Forms に関連するさまざまなプロジェクトへの参加経験があります。また、2 年の IBM WebSphere Portal 開発経験と、業界内で 4 年の J2EE 開発経験もあります。

不正使用の報告のヘルプ

不正使用の報告

ありがとうございます。 このエントリーは、モデレーターの注目フラグが設定されました。


不正使用の報告のヘルプ

不正使用の報告

不正使用の報告の送信に失敗しました。


developerWorks: サイン・イン


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。 プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。 お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

表示名をお選びください

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

(半角英数字で3文字以上31文字以下にする必要があります)


「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


この記事を評価する

コメント

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Lotus
ArticleID=341087
ArticleTitle=IBM Workplace Forms V2.7 ストリーミング API ガイド
publish-date=05152007
author1-email=guyi@cn.ibm.com
author1-email-cc=

タグ

Help
このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。

スライダーバーを使用することで、より多く(少なく)タグを表示します。

人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。

マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。

このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。