項ごとに様々なトピックを記載しています。各項の内容は、次のとおりです。
進化し続けてきたインターネットは、ここ数年でさらに大きく進歩しました。従来のユーザーは、ポピュラーな2つのブラウザのいずれかを使用して、デスクトップ・パーソナル・コンピュータからインターネットにアクセスするのが一般的でした。しかし、これは大きく様変わりしました。今日、インターネットには、スマートフォン、携帯情報端末(PDA)、ポケットベル、一般電話、自動車、さらには冷蔵庫などの家電製品からもアクセスできるようになりました。このことは、企業がサービスを提供する機会が大きく広がっていることを示します。しかし、これはまた、開発者にとっては大きな課題となります。従来は、唯一のマークアップ言語であるHTMLを使用してアプリケーションを開発し、そのアプリケーションにアクセスする2つのブラウザを提供するのみでした。今日では、ほとんどすべてのチャネルで独自のマークアップ言語が使用され、ブラウザは機能が多様化して同じマークアップ言語でも異なるバージョンがサポートされています。たとえば、ほとんどのスマートフォンはWMLをサポートしています。しかし、機種によってサポートしているWMLのバージョンが異なります。同じバージョンのWMLをサポートしている場合でも、標準とはいくらか違いがある場合があります。電話機では、一般的にVoiceXMLが使用されています。この場合も、異なるバージョンのVoiceXMLが様々なボイス・ゲートウェイでサポートされています。開発者は、このような多様なチャネルに対して、どのようにWebアプリケーションを作成すればよいでしょうか。チャネル固有のマークアップ言語を使用しているチャネルごとにアプリケーションを作成するのも1つの方法です。しかし、この方法には、膨大な時間とコストが必要です。
オラクル社は、マルチチャネルの課題に真剣に取り組み、開発者や企業がすべてのチャネルに対応できる1つのアプリケーションを簡単に開発できるように、新しいソリューションの開発を目指しました。OracleAS Wirelessマルチチャネル・サーバー(MCS)は、開発者をすべてのチャネルにおける複雑さから解放します。MCSは、Webアプリケーションにアクセスする単一のブラウザとして機能します。
マルチチャネル・サーバーでは、アプリケーション開発用に、デバイスに依存しない次の3つのマークアップ言語がサポートされます。
XHTML+XForms: XForms(http://www.w3.org/TR/xforms/)をサポートするXHTML 1.0(http://www.w3.org/TR/xhtml1/)標準マークアップ言語
XHTML Mobile Profile(XHTML MP): Open Mobile Alliance社(http://www.openmobilealliance.org/)によって定義された標準マークアップ言語(http://www1.wapforum.org/tech/documents/WAP-277-XHTMLMP-20011029-a.pdf)
OracleAS Wireless XML: OracleAS Wirelessによって定義されたマークアップ言語
開発者によっては、マルチチャネルは念頭になく、たとえば音声チャネルでのみアプリケーションを公開する場合があります。このような場合でも、MCSを使用する理由は何でしょうか。MCSを使用する理由には、少なくとも次の2点があげられます。
VoiceXMLではなく、XHTMLを使用してアプリケーションを開発できます。ほとんどのWeb開発者はXHTMLの知識があり、新たにVoiceXMLの知識は必要ありません。これによって、時間とコストが節約できるのは明白です。
様々なボイス・ゲートウェイで、異なるバージョンのVoiceXMLがサポートされています。このため、システム固有のVoiceXMLを使用してアプリケーションを開発した場合は、そのアプリケーションが、他のすべてのボイス・ゲートウェイで動作することを保証する必要があります。MCSを使用すると、アプリケーションへの変更なしに、多くのボイス・ゲートウェイでアプリケーションが動作することが保証されます。
現在は1つのチャネルでのみアプリケーションを公開する予定でも、将来、別のチャネルからもそのアプリケーションにアクセス可能にすることが有益になる場合があります。その場合、MCSは新しいチャネルもサポートするため、アプリケーションを変更する必要はありません。
次に、マルチチャネル・サーバーの主な機能について説明します。
マルチチャネル・コンテンツ適応: デバイスに依存しない同じコンテンツを、異なるデバイス上の異なるチャネルに配信します。マルチチャネル・サーバーは、現行のユーザー・デバイス機能に基づいてアプリケーションのコンテンツを適応します。また、デバイス固有のマークアップ言語、画面サイズ、ネットワーク速度などにも対応します。
標準マークアップ言語のサポート: 標準マークアップ言語を使用してアプリケーションを開発します。これによって、開発者は新しいマークアップ言語を学習する必要がないため、開発の時間とコストを節約できます。アプリケーションが1つのチャネル(たとえば、音声チャネル)に配信される場合でも、開発者は新しいチャネル固有のマークアップ言語を学習する必要はありません。開発者は、非常にポピュラーなXHTMLを使用しながら、作成したコンテンツをVoiceXML、WMLなどのデバイスに配信できます。
デバイスとゲートウェイでの動作保証: 市場には多数のデバイスやゲートウェイが出回っているため、それらすべてのデバイスやゲートウェイ上でアプリケーションが動作することをアプリケーション開発者が保証するのは困難です。PCの主要なブラウザは2つのみですが、ほとんどのWebアプリケーションは、そのいずれかのブラウザ上で最適に動作するためにも調整が必要になります。各種の新しいモバイル・デバイスの場合は、開発者がそのすべてのデバイスでアプリケーションが機能することを保証するのは不可能です。マルチチャネル・サーバーは、すべてのデバイスとの互換性を保証します。
デバイス検出: マルチチャネル・サーバーは、高度なアルゴリズムを使用して、リクエストが出されたデバイスを検出します。デバイス検出では、User-Agent、AcceptなどのHTTPヘッダーが照合されます。一部のデバイス機能(比較的新しいデバイスの場合)は、デバイスによってリクエストとともに送信され、コンテンツの最適な適応用に使用されます。
マルチメディア適応: マルチチャネル・サーバーは、テキスト適応とともに、イメージ、着信音、音声構文およびオーディオ/ビデオ・ストリームのデバイス固有の適応も行います。
単一のブラウザ: 複数のアプリケーションが相互に対話するブラウザは、マルチチャネル・サーバーのみです。これによって、アプリケーション開発者は、エンド・ユーザーのデバイスで発生する不具合から解放されます。たとえば、ほとんどのモバイル・デバイスはHTTP Cookieをサポートしていません。しかし、ユーザー・セッションの維持には、Cookieを使用するのが最も簡単な方法です。マルチチャネル・サーバーは、エンド・ユーザーのデバイスにかわって、セッションと他のCookieを処理します。
XFormsエンジン: マルチチャネル・サーバーによって、ユーザー・デバイスに対するXForms(http://www.w3.org/TR/xforms/)のサポートが強化されます。
既存のポータルとの併用: マルチチャネル・サーバーをポータル・サーバーの手前にデプロイすることによって、既存のポータルを介してデバイスにアクセスできます。
URLのキャッシュ: デバイスによっては、メモリー量が非常に制限されている場合があり、デバイスで受信できるコンテンツが制限されます。マルチチャネル・サーバーでは、デバイスに送信する長いURLをキャッシュすることで、コンテンツのサイズを減らすことができます。
Oracle Application Serverには、マルチチャネル・サーバー以外に、MCSに基づいて作成されたWireless and Voice Portalが用意されています。Wireless and Voice Portalによって、次の機能が追加されます。
ポータル: Wireless and Voice Portalには、ユーザー管理やサービス管理、ACLなど、完全なポータル機能が用意されています。ユーザーはこのポータルを使用して、各サービスに対する起動パッドとなるカスタマイズ可能な独自のホーム・ページを作成できます。使用可能なサービスには、データベース情報、パーソナライズ、アラート、ロケーション・サービスなど、様々な形態があります。コンテンツ・ソースが膨大な数であるために、管理しやすい方法を使用して、各種デバイスに各種アプリケーションを最適の方法で配信することは、さらに複雑になります。
ネットワーク適応: Wireless and Voice Portalは、HTTPプロトコル以外に各種プロトコルもサポートしているため、HTTP以外のデバイスからもアクセス可能です。ネットワーク適応は、拡張可能なフレームワークに基づいて行われます。このフレームワークによって、顧客は自分のドライバにプラグインしてネットワーク・プロトコルを適応できます。
J2ME WebServices: Wireless and Voice PortalではWebServicesプロキシが提供されるため、J2ME対応デバイスはWebServicesにアクセスできます。これによって、WebServicesとして公開された外部アプリケーションにアクセスできるため、MIDlet開発者はアプリケーションを拡張できます。
次の図に、マルチチャネル・サーバーの主なコンポーネントを示します。
マルチチャネル・サーバーは、拡張可能なアプリケーションのプラットフォームです。これは、交換可能な複数のモジュールで構成されています。モジュール実装を交換することによって、デフォルト動作を変更できます。すべてのモジュールとそのデフォルト実装について、次に説明します。
この項では、様々なマルチメディア・コンテンツをデバイスに合せて適応する方法を説明します。
OracleAS Wirelessのマルチメディア適応サービスにより、イメージ、着信音、音声グラマーおよびオーディオ/ビデオの各配信に関するデバイス固有の適応が可能になります。このサービスは、コアのマルチチャネル・サーバーの中枢部分です。
デバイスやそのデバイス上のブラウザによって、サポートされるイメージ・フォーマット、および画面サイズや色の深度が異なります。リクエストに応じて、OracleAS Wirelessによるコンテンツ適応の一部では、クライアント・デバイスに合せてイメージが動的に適応されます。さらに、新しいIntelligent Messagingコンポーネントは、イメージ適応サービスを使用して、EMSおよびMMS用のイメージを変換します。
Java APIとして提供される着信音適応では、着信音データを、最も一般的な電話でサポートされているフォーマットに変換できます。サポートされているフォーマットには、RTTL、iMelodyおよびMIDIが含まれます。着信音適応のフレームワークによって、開発者は、着信音の新規フォーマット用のサポートを簡単に追加できます。Intelligent Messagingコンポーネントは、着信音適応サービスを使用して、着信音を変換し、SMS、EMSおよびMMSを介して配信します。
マルチメディア適応サービスでは、ボイス・ゲートウェイ・ベンダーがOracleAS Wirelessプラットフォームを拡張し、新規またはベンダー固有の構文フォーマットをサポートできるため、OracleAS Wirelessの音声サポートがさらに強化されます。このような構文フォーマットは、(SimpleGrammar
タグを介して)音声ブラウザでサポートされるフォーマットに変換されます。OracleAS Wireless XMLに定義されている構文はインラインとみなされ、URL参照によって提供される構文は外部とみなされます。新しい構文フォーマットをサポートする必要があるボイス・ゲートウェイ・ベンダーは、OracleAS Wireless XML構文を自社の構文フォーマットに変換するためのXSLスタイルシートを簡単に提供できます。インライン構文変換は音声トランスフォーマで直接サポートされます。また、オラクル社は、関連するXSLスタイルシートを使用して、外部の音声構文変換用のフレームワークを提供します。
複数の入力イメージ・フォーマットをサポートします。
ファイル形式: BMP、GIF、JFIF、PNG、TIFF、WBMP
コンテンツ・フォーマット: MONOCHROME、1BIT、2BIT、4BIT、8BIT、12BIT、16BIT、24BIT、32BIT、48BIT、LUT、DRCT、RGB、GRAY
圧縮形式: JPEG、BMPRLE、LZW、LZWHDIFF、FAX3、FAX4、HUFFMAN3、PACKBITS、GIFLZW、DEFLATE
複数の出力イメージ・コンテンツ・フォーマットをサポートします。これには、異なる色の深度、圧縮形式、色スキームおよびファイル形式が含まれます。
ファイル形式: JFIF(JPEG)、GIF、BMP、WBMP、PNG
圧縮形式: JPEG、GIFLZW、BMPRLE、DEFLATE
コンテンツ・フォーマット: MONOCHROME、2BITLUTGRAY、4BITLUTGRAY、8BITLUTGRAY、8BITLUTRGB、24BITRGB、8BITGRAY
イメージのスケール変更とサイズ変更をサポートします。
固定ディメンションにスケール変更します。
アスペクト比を維持し、枠ボックスに収まるようにスケール変更します(元のイメージのディメンションが対象のイメージのディメンションより小さい場合は、元のイメージのディメンションを使用して枠ボックスが定義されます)。
デバイス/ネットワークで設定されたサイズ制限を順守するために、イメージ・データのサイズをバイト単位で縮小します。
前述のイメージ処理機能は、OracleAS WirelessのJ2EE準拠のコンポーネントとして提供されます。
URLの長さ制限をサポートします。
インバウンドとアウトバウンドのイメージのキャッシュをサポートします。インバウンド・キャッシュとは、元のイメージを(Web Cacheを使用して)中間層にキャッシュすることを意味します。これによって、異なるタイプの複数のデバイスから同じイメージがリクエストされた場合でも、元のイメージのフェッチは1回で済みます。アウトバウンド・キャッシュとは、適応済イメージを(Web Cacheを使用して)キャッシュすることを意味します。これによって、類似のデバイス上で複数のユーザーが同じ適応済イメージを共有できます。
注意: イメージのキャッシュ・ポリシーは、元のイメージの所有者が決定します。MCSはキャッシュ・ヘッダーをWeb Cacheに渡すため、特定のイメージがキャッシュ不能の場合でも、Web Cacheはそのイメージをキャッシュしません。 |
イメージ適応を使用し、XHTMLとWireless XMLのそれぞれでアプリケーションを開発する方法の詳細は、第8章「OracleAS Wireless Developer Kit」を参照してください。
イメージをWebまたはワイヤレス・アプリケーションにデプロイする前にバッチ・モードで変換するために、コマンドライン・ツールが用意されています。
名前: ImageGenerate.{bat|sh}
説明: Javaアプリケーションを起動し、各種デバイスでサポートされるあらゆるフォーマットで、指定の入力イメージからイメージを生成するシェルまたはUNIXシェル・スクリプト。バッチ・ファイルやスクリプト・ファイルは、ORACLE_HOME¥wireless¥bin¥ImageGenerate.bat(Windowsの場合)またはORACLE_HOME/wireless/bin/ImageGenerate.sh(UNIXの場合)に格納されています。
使用方法:
ImageGenerate.{bat|sh} -inFile filename -outFile filename [-outW width] [-outH height] -outFormat format [-outContent contentType] [-dataSizeLimit limit] [-maintainRatio {true|false}]
パラメータ
inFile filename: 処理する入力ファイルのファイル名。必須の引数です。
outFile filename: 処理後の結果ファイル名。必須の引数です。
outW width: 結果イメージの幅(ピクセル単位)。オプションの引数です。
outFormat format: 結果イメージの出力ファイル形式。
たとえば、完全な仕様は、『Oracle interMediaユーザーズ・ガイド』(Oracle Technology Networkから入手可能)を参照してください。
GIFF(Gifフォーマット)、JFIF(jpgフォーマット)、WBMP(wbmpフォーマット)、PNGF(pngフォーマット)の例が含まれています。必須の引数です。
outContent contentType: 結果イメージのコンテンツ・フォーマット。
たとえば、MONOCHROMEを指定すると、イメージが白黒表現に変更されます。GIFイメージの場合は、4BITLUTを指定すると、4ビット(16色)表現に変更されます。完全な仕様は、『Oracle interMediaユーザーズ・ガイド』を参照してください。オプションの引数です。
dataSizeLimit limit: GIFイメージ用。指定のサイズにイメージを収めるために、ピクセルの色数を減らし(最終的には白黒表現まで)、必要に応じてイメージ・サイズを縮小します。オプションの引数です。
maintainRatio {true | false}: イメージのアスペクト比を維持します。outWとoutHのサイズで囲まれたボックスにイメージを収めます。デフォルトはtrueです。オプションの引数です。
使用方法:
ImageGenerate -inFile stock_600_450.jpg -outFile stock_240_180.gif -outW 240 -outH 180 -outContent monochrome -outFormat giff
注意: Java_HOMEまたはORACLE_HOMEのいずれかが環境変数として定義されていることを確認してください。 |
この項では、ImageProcessor APIについて説明します。
ImageProcessorインタフェースは、processという名前のメソッドで構成されています。このメソッドは、指定のイメージURLを、コール側デバイスでの表示に適したイメージにリンクしている別のURLにリライトします。デバイス情報は、コール側デバイスに対応するoracle.panama.model.Device
インスタンスにハンドルを渡すことによって提供されます。通常、リライトされたURLは、入力イメージURLとデバイス特性に基づいて適応済イメージを動的に生成できるサーバーを指し示します。ImageProcessorインタフェースを例9-1に示します。
例9-1 インタフェースoracle.panama.multimedia.ImageProcessor
package oracle.panama.multimedia; import oracle.panama.model.Device; /** Use this interface to replace the existing Image processing * implementation for all formats with your own implementation */ public interface ImageProcessor { ImageResponse process(ImageRequest request, Device) throws MultimediaException; }
oracle.panama.multimedia.ImageRequest
クラスとImageResponse
クラスは、入力イメージと対象の出力イメージに関する情報を獲得します。詳細は、oracle.panama.multimedia
のJavadocを参照してください。
このoracle.panama.multimedia.impl.ImageProcessorImpl
インタフェースのデフォルト実装によって、マルチメディア適応サービスのイメージ適応サーブレットを指し示すようにURLがリライトされます。このサーブレットは、元のイメージをフェッチして動的に処理し、適応済イメージをリクエスト側デバイスに戻します。
ImageProcessorインタフェースのデフォルト実装を変更する場合は、OracleAS Wirelessツールを使用して、実装クラスの名前を指定する必要があります。
OracleAS Wirelessツールに管理者でログインします。
「システム」フォルダにある「サイト管理」をクリックします。
「コンポーネント構成」の下にある「マルチメディア適応サービス」をクリックします。
「イメージ・プロバイダ・クラス名」フィールドの値を実装クラス名に変更し、「OK」をクリックします。
最後に、実装クラスがOracleAS Wirelessのクラスパスに含まれていることを確認します。
この項では、着信音適応について説明します。
着信音適応を使用して、特定の入力フォーマットで指定された着信音を、デバイスでサポートされているフォーマットに変換します。この変換は、XMSメッセージ・アプリケーションで自動的に実行されます。ただし、開発者が着信音適応を制御できるように、Java APIが用意されています。
サポートされている変換は、次のとおりです。
RTTTLからNokiaバイナリ、IMelody、MIDI
IMelodyからNokiaバイナリ、RTTTL、MIDI
RingtoneProcessorインタフェース(例9-2)は、指定の着信音を出力デバイスで要求されるフォーマットにリライトする、processという名前のメソッドで構成されています。processメソッドは、RingtoneRequestインスタンスを受け取り、変換された着信音を出力としてRingtoneResponseインスタンスに戻します。このインタフェースは、メッセージ・フレームワークによって起動し、直接使用することもできます。
例9-2 インタフェースoracle.panama.multimedia.Ringtone.Processor
package oracle.panama.multimedia; /** Use this interface to replace the existing Ringtone processing * implementation for all formats with your own implementation */ public interface RingtoneProcessor { RingtoneResponse process(RingtoneRequest request) throws MultimediaException; }
例9-3 クラスoracle.panama.multimedia.RingtoneRequest
package oracle.panama.multimedia; import Java.io.InputStream; public class RingtoneRequest { /** Ringtone input data types */ public static int RINGTONE_DATA_STRING = 0; public static int RINGTONE_DATA_STREAM = 1; public static int RINGTONE_DATA_BYTES = 2; public static int RINGTONE_DATA_NULL = -1; public String inputFormat = null; public String outputFormat = null; public String inputMimeType = null; public String outputMimeType = null; private String dataString = null; private InputStream dataStream = null; private byte[] dataBytes = null; private int dataType = RINGTONE_DATA_NULL; public RingtoneRequest() { } public void setData (String ringtone) { this.dataString = ringtone; this.dataType = RINGTONE_DATA_STRING; } public void setData (InputStream ringtone) { this.dataStream = ringtone; this.dataType = RINGTONE_DATA_STREAM; } public void setData (byte[] ringtone) { this.dataBytes = ringtone; this.dataType = RINGTONE_DATA_BYTES; } public String getDataAsString () { return this.dataString; } public InputStream getDataAsStream() { return this.dataStream; } public byte[] getDataAsBytes() { return this.dataBytes; } /** note, no setDataType method is provided to prevent * inconsistency. The dataType attribute is set when * setting data. */ public int getDataType() { return this.dataType; } }
例9-4 クラスoracle.panama.multimedia.RingtoneResponse
package oracle.panama.multimedia; import Java.io.OutputStream; public class RingtoneResponse { public String inputFormat = null; public String outputFormat = null; public String inputMimeType = null; public String outputMimeType = null; private String dataString = null; private OutputStream dataStream = null; private byte[] dataBytes = null; private int dataType = RingtoneRequest.RINGTONE_DATA_NULL; public RingtoneResponse() { } public void setData (String ringtone) { this.dataString = ringtone; this.dataType = RingtoneRequest.RINGTONE_DATA_STRING; } public void setData (OutputStream ringtone) { this.dataStream = ringtone; this.dataType = RingtoneRequest.RINGTONE_DATA_STREAM; } public void setData (byte[] ringtone) { this.dataBytes = ringtone; this.dataType = RingtoneRequest.RINGTONE_DATA_BYTES; } public String getDataAsString () { return this.dataString; } public OutputStream getDataAsStream() { return this.dataStream; } public byte[] getDataAsBytes() { return this.dataBytes; } /** note, no setDataType method is provided to prevent * inconsistency. The dataType attribute is set when * setting data. */ public int getDataType() { return this.dataType; } }
クラスoracle.panama.multimedia.RingtoneProcessorImpl
は、前述のインタフェースを実装します。この実装では、構成パラメータを参照して、着信音変換の実装のマトリックスをロードします。着信音コンバータは、フォーマットを別のフォーマットに変換し、着信音コンバータJava APIセクションに定義されているインタフェースを実装します。新しい着信音フォーマット(既存のフォーマットRTTTLに類似したRTTTL2など)のサポートに必要なのは、RTTTLからRTTTL2(またはその逆)に変換するためのJavaコードを追加することのみです。新しいフォーマットを、他のすべてのサポート済フォーマットに変換する必要はありません。あるフォーマットを別のフォーマットに変換する方法が複数ある場合は、変換手順が最も少ないコンバータが選択されます。たとえば、IMelodyからRTTTL2への変換で、RTTTLをRTTTL2に変換する新しいコンバータのみを指定した場合、MCSでは、最初にIMelodyをRTTTLに変換してからRTTTL2に変換します。IMelodyをRTTTL2に変換する独自のコンバータを指定した場合は、前述のコンバータより変換手順が少ないため、このコンバータが選択されます。
RingtoneProcessorインタフェースのデフォルト実装を変更する場合は、OracleAS Wirelessツールを使用して、実装クラスの名前を指定する必要があります。
OracleAS Wirelessツールに管理者でログインします。
「システム」フォルダにある「サイト管理」をクリックします。
「コンポーネント構成」の下にある「マルチメディア適応サービス」をクリックします。
「着信音プロバイダ・クラス名」フィールドの値を実装クラス名に変更し、「OK」をクリックします。
最後に、実装クラスがOracleAS Wirelessのクラスパスに含まれていることを確認します。
例9-5は、RingtoneProcessorの使用方法を示すサンプル・プログラムです。
例9-5 RingtoneProcessorのサンプル・プログラム
import Java.io.FileOutputStream; import Java.io.ByteArrayOutputStream; import oracle.panama.multimedia.RingtoneProcessor; import oracle.panama.multimedia.RingtoneRequest; import oracle.panama.multimedia.RingtoneResponse; import oracle.panama.multimedia.MultimediaException; public class RingtoneUserTest { public static void main(String[] args) { try { RingtoneProcessor processor = RingtoneProcessorProvider.getProvider(); if (processor != null) { RingtoneRequest request = new RingtoneRequest(); request.inputFormat = "IMELODY"; request.setData("BEGIN:IMELODY\nVERSION:1.2\nFORMAT:CLASS1.0\nMELODY:r1a1a2a3e3lmnop2a2a2a2g2a2r3a3a3e3g2a3a3a2a2g2\nEND:IMELODY\r\n"); request.outputFormat = "RTTTL"; RingtoneResponse response = processor.process(request); int dType = response.getDataType(); if (dType == RingtoneRequest.RINGTONE_DATA_STRING) { System.out.println(response.getDataAsString()); } else if (dType == RingtoneRequest.RINGTONE_DATA_STREAM) { FileOutputStream outFile = new FileOutputStream("ringtone.txt"); ((ByteArrayOutputStream) response.getDataAsStream()).writeTo(outFile); } else if (dType == RingtoneRequest.RINGTONE_DATA_BYTES) { // process the byte array response } else { // process failed to set the response data } } else { // Processor is null!! No ringtone converter available System.out.println("No ringtone converter available"); } } catch (Exception ex) { ex.printStackTrace(); } catch (Error e) { e.printStackTrace(); System.out.println("Error parsing ringtone"); } } }
この項では、着信音コンバータAPIについて説明します。
着信音変換インタフェースは、指定の着信音のフォーマットを別のフォーマットにリライトする、オーバーロードされたメソッド(convert
)で構成されています。このconvert
メソッドは、RingtoneRequestのインスタンスを受け取り、変換された着信音をRingtoneResponseインスタンスに戻します。RingtoneProcessorImplではこのインタフェースを使用して、サポートされているフォーマットに応じて各種コンバータをコールします。このインタフェースを実装し、いくつかの構成情報を追加することによって、新しい着信音フォーマットのサポートが追加されます。
public RingtoneResponse convert (RingtoneRequest request);
クラスoracle.panama.multimedia.RingtoneConverterImpl
は、前述のインタフェースを実装します。この実装によって、指定されたすべての着信音変換がサポートされます。
新しいフォーマットにRingtoneConverter実装を追加することによってデフォルトのRingtoneProcessor実装を拡張する場合は、構成ファイルconfig.properties
を使用して、ORACLE_HOME/wireless/server/classes/oracle/panama/multimediaにRingtoneConverter実装クラスを指定する必要があります。例9-6に示すように、新しいフォーマット名をプロパティringtone.formatsに追加し、実装クラスをプロパティringtone.convertersに追加する必要があります。
例9-6 デフォルトのRingtoneProcessor実装の拡張
------------------ #Formats ringtone.formats=RTTTL NOKIA IMELODY MIDI #Converters in one string:triplets of "from format","to format","impln class" ringtone.converters=RTTTL NOKIA oracle.panama.multimedia.RingtoneConverterImpl\ RTTTL IMELODY oracle.panama.multimedia.RingtoneConverterImpl \ IMELODY RTTTL oracle.panama.multimedia.RingtoneConverterImpl \ IMELODY MIDI oracle.panama.multimedia.RingtoneConverterImpl -------------------
たとえば、RTTTL2を追加する場合のプロパティ・ファイルは次のようになります。
------------------------- #Formats ringtone.formats=RTTTL NOKIA IMELODY MIDI RTTTL2 #Converters in one string:triplets of "from format","to format","impln class" ringtone.converters=RTTTL NOKIA oracle.panama.multimedia.RingtoneConverterImpl\ RTTTL IMELODY oracle.panama.multimedia.RingtoneConverterImpl \ IMELODY RTTTL oracle.panama.multimedia.RingtoneConverterImpl \ IMELODY MIDI oracle.panama.multimedia.RingtoneConverterImpl \ RTTTL RTTTL2 my.package.RTTTLToRTTTL2Converter \ -----------------------
RTTTL2からRTTTLへのコンバータも追加した場合は、別のトリプレット(RTTTL2 RTTTL another.package.RTTTL2Converterなど)をringtone.convertersに追加する必要があります。
デバイス適応は、ソース・コンテンツをターゲット・デバイスに変換するプロセスで、次のような様々な要素に対応して最適化します。
環境(電話会社、接続速度など)
デバイスのフォーム要素(幅、高さ、色など)
ユーザー作業環境
OracleAS Wirelessは、XHTML/XForms、XHTML MPおよびOracleAS Wirelessマークアップ言語で記述された入力ソース文書を各種のモバイル・デバイスに適応させます。
HTML
XHTML
cHTML
WAP/WML
HDML
MML
VoiceXML
SMS
MMS
Instant Messagingクライアント
OracleAS Wirelessのデバイス適応によって、開発者には次のような利点があります。
デバイス・フォーム要素が自動的に認識されます。
すべてのデバイス間でレンダリングが最適化されます。
フォーム要素に基づいてレンダリングが最適化されます。
広範なデバイス・ナレッジ・ベースを使用できます。
OracleAS Wirelessのデバイス・リポジトリには、システムの中核となる豊富なデバイス情報が格納されます。管理者と開発者は、OracleAS Wirelessツールを使用して新しいデバイス情報を追加できます。
デバイス・リポジトリ内のすべての情報は、ターゲット・デバイスに対するソース・コンテンツ適応で使用されます。リポジトリ内の情報を最新の状態に維持することが重要です。
開発者は、次の方法でデバイス・リポジトリ内の情報にアクセスできます。
Oracle Application Serverのデバイス・リポジトリAPI
W3CのCSS Media Queries規格
Oracle Application Serverのデバイス・リポジトリAPIは一連のJava APIで、JavaとJSPの開発者がデバイス・リポジトリへのアクセスをプログラムで制御するために使用するAPIです。OracleAS Wirelessのマークアップ作成者は、CSS Media Queriesを使用して、ソース文書からデバイス・リポジトリの情報に直接アクセスできます。CSS Media QueriesはW3C規格(勧告候補ステータス)です。CSS Media Queriesの詳細は、Oracle Technology NetworkのOracleAS Wireless CSS Supportを参照してください。
OracleAS Wirelessは、サービス・リクエストを発行したデバイスのタイプを自動的に検出します。デバイス検出コンポーネントは、UserAgent(使用可能な場合)を使用して、デバイス・リポジトリ内のデバイスの中からサービス・リクエストに関連付けるデバイスを判別します。
デバイスの検出ルールは、次のとおりです。
UserAgentがHTTPヘッダーで使用不可の場合は、ステップ4に進みます。
ユーザー・エージェント一致文字列がHTTPヘッダーのUserAgentと一致するデバイスをデバイス・リポジトリから選択します。
複数のデバイスが戻された場合は、ユーザー・エージェント一致文字列が最も長いデバイスを選択します。この結果、完全に一致するデバイスが1つの場合は、そのデバイスが戻されます。これで、デバイスの検出が完了します。
Accept HTTPヘッダーを使用し、IETF RFC-2616仕様に従って優先コンテンツ・タイプを判別します。
優先MIMEタイプと一致する最初のデバイスが戻されます。
リクエストにx-up-devcap-screenpixelsおよびx-up-devcap-screenchars HTTPヘッダーが含まれている場合は、デバイスのScreenWidth、ScreenHeight、ScreenRows、ScreenColumns属性を使用して最も近似のロジカル・デバイスが検出されます。
デバイスが検出されない場合は、ログ・ファイルにエラーが記録されます。
OracleAS Wirelessでのデバイス検出は、次のインタフェースを実装するフック・クラスを指定することで、カスタマイズできます。
oracle.panama.rt.hook.DeviceIdentificationHook
フックのデフォルト実装は、次のとおりです。
oracle.panma.rt.hook.DeviceIdentificationPolicy class
デバイス・リポジトリAPIは、HTTPリクエストにフォーム要素情報がある場合、HTTPヘッダーの動的なフォーム要素作成を実行します。動的なHTTPヘッダー作成は、次の手順で実行されます。
リポジトリからデバイス情報を取り出し、oracle.panama.model.DeviceV2 object
のインスタンスを作成します。
HTTPヘッダー内で既知のデバイス・フォーム要素情報を検索し、oracle.panama.model.DeviceV2
の適切な属性を更新します。
Oracle Application Serverのデバイス適応の最終フェーズでは、デバイス・トランスフォーマを選択して起動し、サポートされているソース入力文書からターゲット・デバイスへのレンダリングに適したマークアップ言語を生成します。デバイス・リポジトリ内のすべてのデバイスには、そのデバイスに適したトランスフォーマのリストがあります。
注意: 同じMIME_TYPEで2つのトランスフォーマを単一のデバイスに追加することはできません。 |
デバイス・トランスフォーマは、表9-1に示すように、入力ソース文書として受け取られ、OracleAS Wirelessのマークアップ言語ごとにグループ化されます。
表9-1 デバイス・トランスフォーマの入力マークアップ
トランスフォーマの接頭辞 | OracleAS Wirelessマークアップ | OracleAS WirelessのマークアップのMIMEタイプ |
---|---|---|
mxml- |
mobile-xml |
text/vnd.oracle.OracleAS Wireless XML |
xforms- |
xhtml+xforms |
application/vnd.oracle.xhtml+xforms |
xhtml- |
xhtml+mp |
application/vnd.wap.xhtml+xml |
表9-2に、OracleAS Wirelessのマークアップ言語で受け取られるトランスフォーマ、およびトランスフォーマで生成されるマークアップを示します。
表9-2 mobile-xml用のデバイス・トランスフォーマ
トランスフォーマ | ターゲット・マークアップ | 説明 |
---|---|---|
mxml-ASYNC_Java |
text/plain |
SMSデバイス、テキスト |
mxml-Adomo |
text/vxml |
Adomoボイス・ゲートウェイ |
mxml-Verascape |
text/vxml |
Verascapeボイス・ゲートウェイ |
mxml-VoiceGenie |
text/vxml |
VoiceGenieボイス・ゲートウェイ |
mxml-avantgo |
text/html |
AvantGoブラウザ |
mxml-blazer |
text/html |
Handspring Blazerブラウザ |
mxml-chtml |
text/html |
cHTMLブラウザ |
mxml-ciscoip |
text/xml |
Cisco IP電話 |
mxml-goweb |
text/html |
GoWebブラウザ |
mxml-hdml |
text/x-hdml |
HDMLブラウザ |
mxml-hdml-kddi |
text/x-hdml |
EZweb HDMLブラウザ |
mxml-html32 |
text/html |
W3C HTML 3.2準拠のブラウザ |
mxml-html40 |
text/html |
W3C HTML 4.0準拠のブラウザ |
mxml-mml |
text/html |
J-PHONE Type C3以上 |
mxml-mml-t04 |
text/html |
J-PHONE Type C2 |
mxml-palm-family |
text/html |
Palmブラウザ |
mxml-pocketpc |
text/html |
PocketPC PDAブラウザ |
mxml-smil |
application/smil |
MMS SMIL |
mxml-wml11 |
text/vnd.wap.wml |
WML11準拠のブラウザ |
mxml-wml11-ericsson |
text/vnd.wap.wml |
Ericsson WML11ブラウザ |
mxml-wml11-openwave |
text/vnd.wap.wml |
Openwave WML11ブラウザ |
mxml-wml11-wig |
text/vnd.wap.wml |
WIGブラウザ |
mxml-xmp |
text/html |
XHTML MPブラウザ |
表9-3に、XHTML+XForms用のデバイス・トランスフォーマを示します。
表9-3 XHTML+XForms用のデバイス・トランスフォーマ
トランスフォーマ | ターゲット・マークアップ | 説明 |
---|---|---|
xforms-Verascape |
text/vxml |
Verascapeボイス・ゲートウェイ |
xforms-VoiceGenie |
text/vxml |
VoiceGenieボイス・ゲートウェイ |
xforms-async_xhtml |
text/plain |
SMS、テキスト |
xforms-chtml |
text/html |
cHTMLブラウザ |
xforms-hdml |
text/x-hdml |
HDMLブラウザ |
xforms-html32 |
text/html |
W3C HTML 3.2準拠のブラウザ |
xforms-html32-handheld |
text/html |
HTML 3.2 HandHeld Friendlyブラウザ |
xforms-html40 |
text/html |
W3C HTML 4.0準拠のブラウザ |
xforms-mml |
text/html |
J-PHONE Type C3以上 |
xforms-mms-smil |
application/smil |
MMS SMIL |
xforms-palm-family |
text/html |
Palmブラウザ |
xforms-wml11 |
text/vnd.wap.wml |
WML11準拠のブラウザ |
xforms-wml11-ericsson |
text/vnd.wap.wml |
Ericsson WML11ブラウザ |
xforms-wml11-openwave |
text/vnd.wap.wml |
Openwave WML11ブラウザ |
xforms-xmp |
text/html |
XHTML MPブラウザ |
表9-4に、XHTML + MP用のデバイス・トランスフォーマを示します。
表9-4 XHTML+MP用のデバイス・トランスフォーマ
トランスフォーマ | ターゲット・マークアップ | 説明 |
---|---|---|
xhtml-chtml |
text/html |
cHTMLブラウザ |
xhtml-hdml |
text/x-hdml |
HDMLブラウザ |
xhtml-html32 |
text/html |
W3C HTML 3.2準拠のブラウザ |
xhtml-html32-handheld |
text/html |
HTML 3.2 HandHeld Friendlyブラウザ |
xhtml-html40 |
text/html |
W3C HTML 4.0準拠のブラウザ |
xhtml-mml |
text/html |
J-PHONE Type 3 |
xhtml-mms-smil |
application/smil |
MMS SMIL |
xhtml-palm-family |
text/html |
Palmブラウザ |
xhtml-wml11 |
text/vnd.wap.wml |
WML11準拠のブラウザ |
xhtml-wml11-ericsson |
text/vnd.wap.wml |
Ericsson WML11ブラウザ |
xhtml-wml11-openwave |
text/vnd.wap.wml |
Openwave WML11ブラウザ |
xhtml-xmp |
text/html |
XHTML MPブラウザ |
oracle.panama.model.Device API
は使用されなくなりました。このリリースでは、新しいAPIのoracle.panama.model.DeviceV2
を使用します。JavaアプリケーションとJSPアプリケーションからデバイス・リポジトリにアクセスするには、DeviceV2インタフェースを使用する必要があります。
DeviceV2インタフェースには、次に示すように、古いDevice APIからもアクセスできます。
Device device = RequestFactory.lookupRequest(); DeviceV2 devicev2 = device.getDeviceV2();
このコード部分は、現行のHTTPリクエストのコンテキストに応じて、デバイス・リポジトリからターゲット・デバイスを取り出します。つまり、devicev2は実際のデバイス情報へのハンドルです。
DeviceV2インタフェースへのハンドルが取得されると、デバイス属性や機能の取出しは直接行われます。例9-7に示すように、機能の値の取出しには、Javaのboolean、Stringまたはintの3つのメソッドが用意されています。
例9-7 機能の値の取出し
boolean bool = devicev2.getDeliveryContextAttributeBoolean(DeviceAttr.COLORCAPABLE); String model = devicev2.getDeliveryContextAttributeString(DeviceAttr.MODEL); int width = devicev2.getDeliveryContextAttributeString(DeviceAttr.DEVICEWIDTH);
デバイスの属性または機能は、すべてoracle.panama.model.DeviceAttr
インタフェースにリストされています。表9-5に、すべてのデバイスの属性または機能を示します。
表9-5 一般的なデバイス機能
デバイス属性 | 説明 |
---|---|
VENDOR |
デバイス・メーカー。 |
MODEL |
モデル番号。 |
DEVICECLASS |
デバイス・クラス(使用中止)。 |
MEDIA |
CSS Media Queriesで使用するCSSメディア・タイプ。 |
DEVICETAG |
リポジトリ内の関連するデバイスを識別してグループ化するタグ。 |
DEVICEWIDTH |
表示領域の幅(ピクセル単位)。 |
DEVICEHEIGHT |
表示領域の高さ(ピクセル単位)。 |
PIXELPITCH |
ピクセルのサイズ(mm単位)(ビットマップ・デバイスのみ)。 |
DEFAULTFONTSIZE |
デバイスで使用するデフォルトのフォント・サイズ。 |
GRID |
グリッド・デバイス(ビットマップ・デバイス以外)。 |
COLORCAPABLE |
trueの場合、デバイスでは色をレンダリングできます。 |
PAGEDMEDIA |
trueの場合、これはWAP/WMLなどページ化されたデバイスです。 |
BITSPERPIXEL |
モノクローム・デバイス用のピクセル当たりのビット数、またはカラー・デバイス用のカラー・コンポーネント当たりのビット数。 |
MAXDOCSIZE |
最大ドキュメント・サイズ。 |
TEXTINPUTCAPABLE |
trueの場合、デバイスではテキスト入力をサポートします。 |
NUMBEROFSOFTKEYS |
デバイスでサポートされるソフトキーの数。 |
KEYBOARD |
キーボード・タイプ。qwerty、phone keypad、disambiguatingのいずれかです。 |
表9-6に、ブラウザの機能をリストします。
表9-6 ブラウザの機能
MARKUP LANGUAGE | デバイスでサポートするマークアップのリスト |
---|---|
PROLOG |
文書のXMLプロローグ。 |
SUPPORTSAMPERSANDENTITY |
trueの場合、デバイスではXMLアンパサンド・エンティティをサポートします(使用中止)。 |
SUPPORTSRELATIVEURL |
trueの場合、関連するURLがサポートされます。 |
SUPPORTSCOOKIE |
trueの場合は、Cookieがサポートされます。 |
MESSAGINGBASED |
trueの場合は、非同期メッセージがサポートされます。 |
TABLESCAPABLE |
trueの場合は、表がサポートされます。 |
AUDIOCONTENT |
サポートされるオーディオMIMEタイプのリスト。 |
電子メール |
trueの場合は、電子メールの送受信が可能になります。 |
TEXTTOSPEECH |
trueの場合は、TTSエンジンがサポートされます。 |
SPEECHGRAMMAR |
trueの場合は、構文がサポートされます。 |
RECORDSPEECH |
trueの場合は、音声を録音できます。 |
VOICECALLCAPABLE |
trueの場合は、音声でコールできます。 |
CALLCONTROLCAPABLE |
trueの場合は、コールを制御できます。 |
DEFAULTMARKUPLANGUAGE |
デバイスに送信するデフォルトのMIMEタイプ。 |
ACCEPT |
受け入れたMIMEタイプのリスト。 |
ACCEPT_CHARSET |
受け入れた文字コードのリスト。 |
IMAGECAPABLE |
trueの場合は、イメージを表示できます(使用中止)。 |
IMAGECONTENTTYPES |
サポートされるイメージMIMEタイプのリスト。 |
VICEOCAPABLE |
trueの場合は、ビデオがサポートされます(使用中止)。 |
VIDEOCONTENTTYPES |
サポートされるビデオMIMEタイプのリスト(使用中止)。 |
VIDEOMODE |
サポートされるビデオ・モード(使用中止)。 |
AUDIOCONTENTTYPES |
サポートされるオーディオMIMEタイプのリスト。 |
REVERSEENTITYMAP |
XMLエンティティの変換ルールのリスト。 |
表9-7に、メッセージ機能をリストします。
表9-7 メッセージ機能
DELIVERYTYPES | サポートされるメッセージ配信タイプまたはチャネルのリスト |
---|---|
BANDWIDTH |
ネットワーク速度。 |
URLCAPABLE |
URLのハイパーリンクに直接従うことができます。 |
NOKIASMARTMESSAGING CAPABLE |
trueの場合は、Nokiaスマート・メッセージがサポートされます。 |
RINGTONECAPABLE |
trueの場合、ダウンロード可能な着信音がサポートされます。 |
OPERATORLOGOCAPABLE |
trueの場合は、オペレータ・ロゴをダウンロードできます。 |
VCARDCAPABLE |
trueの場合は、VCARDをサポートできます。 |
VCALENDARCAPABLE |
trueの場合は、VCALENDARがサポートされます。 |
SYNCMLCAPABLE |
trueの場合は、SYNCMLがサポートされます。 |
MESSAGESIZELIMIT |
1メッセージ当たりの最大文字数。 |
MULTIMEDIAAUDIOFORMATS |
マルチメディア・オーディオ・タイプ。 |
MULTIMEDIAIMAGEFORMATS |
マルチメディア・イメージ・タイプ。 |
MULTIMEDIAVIDEOFORMATS |
マルチメディア・ビデオ・フォーマット。 |
SMILLAYOUTCAPABLE |
trueの場合、MMSブラウザではSMILレイアウト・タグをサポートします。 |
表9-8に、VoiceXMLゲートウェイ機能をリストします。
表9-8 VoiceXMLゲートウェイ機能
GRAMMARCONTENTTYPES | サポートされる音声グラマーのMIMEタイプのリスト |
---|---|
MIMETYPE_TEXTTOVOICEGRAMMAR |
テキストから生成された音声構文のゲートウェイ固有のMIMEタイプ。 |
MIMETYPE_OGSTOVOICEGRAMMAR |
OGS構文から生成された音声構文のゲートウェイ固有のMIMEタイプ。 |
MIMETYPE_TEXTTODTMFGRAMMAR |
テキストから生成されたDTMF構文のゲートウェイ固有のMIMEタイプ。 |
MIMETYPE_OGSTODTMFGRAMMAR |
OGS構文から生成されたDTMF構文のゲートウェイ固有のMIMEタイプ。 |
MIMEMAP_APPLICATION_SRGS_XML |
application/srgs+xmlに対するゲートウェイ固有のMIMEタイプを入力します。 |
MIMEMAP_APPLICATION_X_ABNF |
application/x-abnfに対するゲートウェイ固有のMIMEタイプを入力します。 |
MIMEMAP_APPLICATION_X_GSL |
application/x-gslに対するゲートウェイ固有のMIMEタイプを入力します。 |
MIMEMAP_APPLICATION_X_JSGF |
application/x-jsgfに対するゲートウェイ固有のMIMEタイプを入力します。 |
MIMEMAP_APPLICATION_X_DTMF |
application/x-dtmfに対するゲートウェイ固有のMIMEタイプを入力します。 |
MIMEMAP_APPLICATION_X_WATSON |
application/x-watsonに対するゲートウェイ固有のMIMEタイプを入力します。 |
MIMEMAP_APPLICATION_X_SWI |
application/x-swiに対するゲートウェイ固有のMIMEタイプを入力します。 |
表9-9に、Java(J2ME)機能をリストします。
OracleAS Wirelessサーバーは、HTTPヘッダーを使用して、ユーザー・デバイスに関する情報をバックエンド・アプリケーションに送信します。アプリケーションでは、この情報を使用して、生成するコンテンツを最適化できます。表9-10に、アプリケーションが受け取るヘッダーを示します。
表9-10 デバイスの情報と分類
HTTPヘッダー名 | 説明 |
---|---|
X-Oracle-Device.Class |
デバイスのチャネル・モードとフォーム要素を示します。Device.classのそれぞれの値は、一意の通信チャネル・モードと一意のフォーム要素を示します(可能な値については、後述する説明と代表的なデバイスを参照)。 |
X-Oracle-Device.Orientation |
デバイスのオリエンテーションは、フォーム要素とともに、アプリケーションで特定デバイスのレンダリング・スタイルを変更するのに役立ちます。可能な値は、landscapeとportraitで、デフォルト値はportraitです(システムによる指定がない場合、または幅と高さが同じ場合)。 |
X-Oracle-Device.MaxDocSize |
現行リクエストを発行したデバイスで処理されるXML文書(サービス・レスポンス)の最大サイズ(バイト単位)。文書のバイト・サイズとターゲット・デバイスのダイジェスト・バイト・サイズはマップできないため、この値は近似値になります。オーディオやイメージなどの埋込みコンテンツでは、このサイズを考慮する必要があります。サービスがMaxDocSizeより大きいXML文書を戻す場合、そのリクエストに対するレスポンスは未定義になります。 |
X-Oracle.Device.Secure |
可能な値はtrueまたはfalseです。OracleAS Wirelessサーバーとデバイス間の接続が、現行のリソース・リクエストの発行時に保護されていたかどうかを示します。 |
X-Oracle-Orig-User-Agent |
OracleAS WirelessサーバーへのリクエストがHTTPプロトコルを介して発行され、デバイスがUser-Agent HTTPヘッダーを送信した場合は、そのヘッダー名を使用してヘッダーがアプリケーションに再送信されます。 |
X-Oracle-Orig-Accept |
OracleAS WirelessサーバーへのリクエストがHTTPプロトコルを介して発行され、デバイスがAccept HTTPヘッダーを送信した場合は、そのヘッダー名を使用してヘッダーがアプリケーションに再送信されます。 |
OracleAS Wirelessマルチチャネル・サーバー(MCS)Runtimeは、OC4Jサーブレット、非同期サーバー、音声サーバーからは直接起動され、OC4J Servlet Filterからは間接的に起動されます。MCS Runtimeは、様々な通信チャネル(音声、Hypertext Transaction Protocol(HTTP)、Instance Messaging、SMS、電子メール、双方向ポケットベルなど)を使用するデバイス、ユーザー・エージェントおよび自律型モバイル・エージェントからのリクエストを処理します。MCS Runtimeは、これらのチャネルからのサービス・リクエストを適応し、デバイス固有の機能を利用するためにサービス・レスポンスにトランスコードします。これによって、各デバイスが持つ様々な特異性から開発者を解放します。リクエストは、OracleAS Wireless MCSによって、異なる通信チャネルから標準J2EEサーブレット2.3サービス・リクエストに適応されるため、開発者は、業界標準のサーブレットAPI、JSP、XHTML、XForms、CSS、さらにはOracle独自のOracleAS Wireless XMLを使用して、汎用的なアプリケーションを開発できます。MCSでは、中央管理されたデバイス情報リポジトリ内にあるデバイス・モデルの拡張可能なレパートリを効率的に利用できるため、デバイス固有の機能を活用できます。
この項では、MCS Runtimeの機能について説明します。ここでは、MCS Runtimeセッション管理、セッションの永続性、Runtime APIと拡張性、コンテンツ適応およびURLリライト・メカニズムについて説明します。また、MCS Runtimeは、自動セッション・トラッキングを実施し、タイムアウト時間を経過してセッションが期限切れになった場合、またはデバイスが切断された場合に、セッションを終了します。
OracleAS Wireless MCS Runtimeでは、MCSセッションIDを指定するパラメータPAsidを追加して各URLをリライトすることで、OC4Jサーブレット・セッションから独立してRuntimeセッションが追跡されます。セッション・トラッキングによって、一連のリクエストが同じユーザーから発行されていることが識別されます。MCS Runtimeセッションには、デバイス資格証明、ユーザー作業環境、Runtimeコンテキスト、Cookie、URLキャッシュおよび状況依存サービスに必要な他の状態が含まれています。さらに、これらのMCSセッションの状態は永続的な場合もあります。MCSセッションIDがリクエストで参照されると、そのMCSセッションIDを使用して、MCSセッションの永続的な状態がリストアされます。たとえば、PAsidパラメータがURLに格納されます。MCS RuntimeではRuntimeセッションをメンテナンスします。これによって、代替チャネルの一時セッションを介して接続しているユーザーは、長期間有効なMCS Runtimeセッションを共有できます。永続的なMCSセッションによって、セッションの継続期間が長くなり、複数モーダルの相互作用がさらに継続されます。
MCS Runtimeセッションは、OC4Jサーブレット・セッションにバインドできます。WAP HTTP State Management Specification(http://www.wapforum.org/)を実装しているWAP 2.0デバイスでは、セッション管理のためにCookieをサポートできます。市販のWAPゲートウェイのほとんどでは、WAPデバイスにかわってCookieが管理されます。デバイスまたはゲートウェイでCookieがサポートされない場合、OC4Jサーブレット・コンテナはURLをリライトしてセッションを追跡します。MCS Runtimeでもセッションが追跡されるため、同じOC4Jサーブレット・セッションに複数のMCS Runtimeセッションをバインドできます。たとえば、Cookieリポジトリは共有のため、複数のブラウザが同じサーブレット・セッションを共有する場合がありますが、同じデバイス上の2つのブラウザ・ウィンドウで2つの独立したMCS Runtimeセッションを開始できます。
MCS Runtimeセッションの状態は同じアイランドにある他のOC4Jインスタンスにレプリケートできるため(アイランドは、複数のOC4Jインスタンス間でセッションの状態をレプリケートします)、最初のインスタンスが失敗した場合は、デバイス・リクエストを同じアイランドにある他のOC4Jインスタンスにリダイレクトできます。デフォルトでは、OC4Jサーブレット・セッションへのバインドは使用可能になっており、OC4Jセッションのレプリケーションおよびフェイルオーバーを構成するにはこのバインドが必要です。MCS Runtimeセッションが他のチャネルのアクティブなセッション(音声、Instance Messaging、SMSなど)にバインドされていない場合は、サーブレット・セッションが失効すると、そのサーブレット・セッションにバインドされているMCS Runtimeセッションが無効化されます。MCS Runtimeセッションの無効化によって解放されるのはメモリー内のリソースのみで、永続的なMCSセッションの状態は維持されます。このセッションの状態は、Runtimeセッションが再度アクティブ化されるとリストアできます。
MCS Runtimeセッションは、アイドル時間がサイト全体の構成パラメータ「ランタイム・セッション・ライフ時間 (秒)」で指定した値を超えると失効します。このパラメータは、「システム」→「ワイヤレス・サーバー: 管理」→「ランタイム構成」コンソールにあります。デフォルトのセッション・ライフ時間は10分です。MCS RuntimeセッションがOC4Jサーブレット・セッションにバインドされている場合、このパラメータは、OC4Jサーブレット・セッションの有効期限(デフォルトは30分)でオーバーライドされます。Runtimeセッションからサーブレット・セッションにバインドしているセッションは、System.properties
ファイル内のパラメータ設定enable.http.session.binding=false
で使用禁止にできます。MCSセッションの永続性を有効にするには、「システム」→「ワイヤレス・サーバー: 管理」→「ランタイム構成」コンソールにある「ランタイム・セッションの永続性の有効化」オプションを使用します。デフォルトでは、Runtimeセッションの永続性は無効です。永続的なMCSセッションは、アイドル時間が、同じコンソールにある「永続的なセッション・ライフ時間 (日)」で指定された日数を超えると、永続記憶域から消去されます。MCSの永続的なセッション・ライフ時間には、OC4Jサーブレット・セッション・ライフ時間やMCS Runtimeセッション・ライフ時間より長い日数を指定できます。デフォルト設定は2日です。
マルチチャネル・ゲートウェイを使用するには、Webアプリケーションを作成してデプロイする必要があります。アプリケーションの開発には、あらゆるWebテクノロジを使用できます。静的ページまたは動的ページのいずれも使用できます。また、Mobile XMLまたはXHTMLマークアップ言語のいずれかを使用できます。唯一の要件は、アプリケーションへのアクセスにHTTP(S)プロトコルを使用することです。アプリケーションは、マルチチャネル・ゲートウェイと同じマシンで実行しなくてもかまいません。
説明をわかりやすくするために、アプリケーションは簡単なJSP(Hello.jsp
)であることを前提とします。このJSPディレクトリにアクセスするURLは、http://myhost:8080/jsp/Hello.jsp
です。
次のURLで、もう1つのWebアプリケーション、マルチチャネル・ゲートウェイにアクセスできます。http://hostname:7777/mcs/remote/
(7777
はOracle Application Server Wireless用のデフォルトのポートです)。しかし、マルチチャネル・ゲートウェイはコンテンツを生成しないため、マルチチャネル・ゲートウェイのURLにアクセスするだけではコンテンツを入手できません。マルチチャネル・ゲートウェイを介して、ご使用のデバイスから独自のアプリケーションにアクセスするには、特別なURLを指定する必要があります。この特別なURLを作成する方法については、次のサンプルURLを参考にしてください。
http://myhost:8080/jsp/Hello.jsp
次のURLをデバイスに入力する必要があります。
http://hostname:7777/mcs/remote/http/myhost/8080/jsp/Hello.jsp
前述のURLの作成方法は、次のとおりです。
基本マルチチャネル・ゲートウェイURLを取得します。URLはhttp://hostname:7777/mcs/remote/
です。
アプリケーションへの絶対URLを作成します。デフォルトのポート番号を使用している場合でも、HTTPには80
、HTTPSには443
のポート番号を含めます。
元のアプリケーションURLの://
および:
を/
と置き換えます。たとえばhttp://myhost:8080/jsp/Hello.jsp
はhttp/myhost/8080/jsp/Hello.jsp
となります。
修正したURLをマルチチャネル・ゲートウェイURLに追加します。
パラメータは簡単にWebアプリケーションへ渡すことができます。標準URL構文を使用して問合せ文字列をURLの最後に追加するだけです。
たとえば、fname
とlname
パラメータをHello.jsp
に渡すには、次の構文を使用します。
http://hostname:7777/mcs/remote/http/myhost/8080/jsp/Hello.jsp?fname=John&lname=Doe
ユーザーのデバイスからマルチチャネル・ゲートウェイへのリクエストを受信すると、次のような元のアプリケーションURLが生成されます。
http://myhost:8080/jsp/Hello.jsp
次に、そのURLへリクエストが送信されます。マルチチャネル・ゲートウェイは、ユーザーのデバイスがリクエストの送信に使用したのと同じHTTPメソッドを使用します。ユーザーのデバイスがGET
を使用した場合は、マルチチャネル・ゲートウェイもGET
を使用してバックエンド・アプリケーションにアクセスします。現在サポートされているのはGET
とPOST
のみです。
通常、Oracle Application Server Containers for J2EE(OC4J)では、Java Server Pages(JSP)ファイルに変更がないか確認し、変更があった場合は再コンパイルされます。ただし、こうしたOC4Jの動作は、ptg Webアプリケーションの内部にデプロイされたJSPファイルについては変更されています。
含まれているプリコンパイルJSPファイルを変更しても、OC4JはそれらのJSPファイルの検出およびコンパイルは行いません。
注意: OC4Jの構成の詳細は、『Oracle Application Server Containers for J2EE JavaServer Pages開発者ガイド』の「JSP構成パラメータ」を参照してください。 |
たとえば、ptg Webアプリケーションの内部にデプロイされたすべてのJSPファイルはプリコンパイルされます。なんらかの理由でそれらのJSPファイルを変更すると、そのプリコンパイルされたクラス・ファイルは使用できなくなります。OC4Jの設定を変更してJSPのコンパイルを有効にする必要があります。そのためには、次の場所にあるptgアプリケーションのweb.xml
ファイルを変更します。
ORACLE_HOME/OC4J_Wireless/applications/ptg/ptg-web/WEB-INF/web.xml
.
この問題を回避し、Oracle Application Server Wirelessに含まれているJSPファイルのパフォーマンスを最適化するには、次のようにweb.xml
ファイルを変更する必要があります。
ファイルから次の部分を削除します。
<!-- WARNING!!! Overridden JSP engine settings With this configuration the JSP files in this application will NOT be recompiled. Any changes to the JSP source files will NOT take effect. If you want to switch back to the default JSP engine settings simply comment out the servlet declaration and mapping for the jsp servlet below. --><servlet><servlet-name>jsp</servlet-name><servlet-class>oracle.jsp.runtimev2.JspServlet</servlet-class><!-- you can disable page scope listener if you don't need this function. --><init-param><param-name>check_page_scope</param-name><param-value>true</param-value></init-param><!-- you can set main_mode to "justrun" to speed up JSP dispatching, if you don't need to recompile your JSP anymore. You can always switch your main_mode. Please see our doc for details --><init-param><param-name>main_mode</param-name><param-value>justrun</param-value></init-param><load-on-startup>0</load-on-startup></servlet><servlet-mapping><servlet-name>jsp</servlet-name><url-pattern>/*.jsp</url-pattern></servlet-mapping><servlet-mapping><servlet-name>jsp</servlet-name><url-pattern>/*.JSP</url-pattern></servlet-mapping><servlet-mapping><servlet-name>jsp</servlet-name><url-pattern>/*.jspx</url-pattern></servlet-mapping><servlet-mapping><servlet-name>jsp</servlet-name><url-pattern>/*.sqljsp</url-pattern></servlet-mapping><servlet-mapping><servlet-name>jsp</servlet-name><url-pattern>/*.SQLJSP</url-pattern></servlet-mapping>
ORACLE_HOME/j2ee/OC4J_Wireless/applications/ptg/ptg-web/WEB-INF/classes/_modulesディレクトリ、およびORACLE_HOME/j2ee/OC4J_Wireless/applications/ptg/ptg-web/WEB-INF/classesディレクトリにある、ディレクトリ名がアンダースコア(_)で始まるすべてのクラス・ファイルも削除する必要があります。
OC4J_Wirelessアプリケーションを再起動します。
OracleAS Wireless MCS Runtime APIは、Javaインタフェースを提供してランタイム実行ステータスを検証し、ランタイム実行フローを追跡し、デフォルトの実行セマンティクスを補強します。Runtime APIは、次のJavaパッケージで構成されています。
oracle.panama.rt
は、ステータスの管理に必要な基本Runtimeオブジェクトへのインタフェースを提供します。
oracle.panama.rt.event
は、Javaイベント・モデルに基づいてランタイム実行順序を監視するためのインタフェースを提供します。
oracle.panama.rt.hook
は、Runtimeのカスタマイズ可能な基本コンポーネントへのインタフェースとこれらのインタフェースに対するデフォルトの実装ポリシーを提供します。
これらのパッケージは、wireless.jar
ファイルに含まれています。JavaアプリケーションまたはMCS Runtime APIに依存するプラグイン・コンポーネントをコンパイルする場合は、Javaクラスパスにwireless.jar
を挿入したことを確認してください。
oracle.panama.rt
パッケージは、Runtime APIのコアを定義します。イベント・リスナーなど、Runtimeのカスタム・プラグイン・コンポーネントは、oracle.panama.rt
パッケージのRequest、ResponseおよびSessionの各インタフェースを使用できます。
次の項では、このパッケージのインタフェースについて説明します。次のインタフェースがあります。
リクエスト・オブジェクトは、サービス・リクエストのURLパラメータおよびHTTPヘッダー属性を定義するために使用されます。また、ユーザー・エージェント・タイプ、デバイス・モデルおよびその他のRuntimeコンテキストも定義します。リスナーは、リクエストからイベントをサブスクライブできます。
Requestインタフェースの次のメソッドによって、リクエスト・オブジェクトに関連付けられているパラメータをアクセス、置換、追加または削除できます。
Object getAttribute(AttributeCategory category, String name)
Object setAttribute(AttributeCategory category, String name, Object attribute)
このメソッドを使用して、属性の名前と値にアクセスします。属性には、ユーザー・パラメータ、システム・パラメータ、または、アプリケーション・コンテキストがあります。属性のカテゴリは3種類あります。
PARAMETERS
RUNTIME
CONTEXTS
Requestに関して最も重要な属性カテゴリは、ユーザーが発行した問合せパラメータとフォーム・パラメータを含むPARAMETERSです。MCS Runtimeは、パラメータを取り出すためにURL問合せ文字列を解析します。Runtimeのその他のコンポーネントは、これらのパラメータをプログラム上で設定できます。MCS RuntimeはURLをリライトおよびキャッシュするため、一部のパラメータはRuntimeセッション内でURLキャッシュから取り出されます。MCS Runtimeでは、セッション内でHTTPリクエストからの問合せ文字列とURLキャッシュの両方を解析して、問合せパラメータの詳細リストを作成する場合があります。
Responseインタフェースは、MCS Runtimeのレスポンス・オブジェクトを表します。リスナーは、Responseからイベントをサブスクライブできます。Responseオブジェクトは、Requestオブジェクトの実行結果です。
Sessionインタフェースは、MCS Runtimeのセッション・オブジェクトを表します。リクエストは、有効なセッション・コンテキストでのみ実行できます。セッションは、最大非活動間隔を超過した場合に期限切れになります。開発者は、セッション期間中の情報を対応するセッション・オブジェクトに格納できます。リスナーは、セッションからイベントをサブスクライブできます。MCS Runtimeセッションの確立方法については、9.4.1項「MCS Runtimeセッション管理」を参照してください。
セッションは、他のRuntimeコンテキスト間で、デバイス資格証明、パーソナライズ作業環境、圧縮していないURL、CookieおよびXForms文書をキャッシュします。SMSおよびInstant Messagingサーバーは、Runtimeセッションを広範囲にわたって使用して、動的に生成された短縮名(URLを識別する1桁のメニュー番号など)を管理します。セッションの状態には、コンテンツ・プロバイダのアプリケーションに対する認証の様々な状態を表すCookieが含まれます。MCS Runtimeは、RuntimeセッションでXForms文書をキャッシュします。セッション所有者は、インスタンス・データをアプリケーションに送信する前に、リクエスト/レスポンス・メッセージをいくつか使用してXForms文書と相互作用できます。
Sessionインタフェースの次のメソッドによって、セッション・オブジェクトに関連付けられているパラメータをアクセス、置換、追加または削除できます。
Object getAttribute(AttributeCategory category, String name)
Object setAttribute(AttributeCategory category, String name, Object attribute)
このメソッドを使用して、属性の名前と値にアクセスします。属性のカテゴリは3種類あります。
PARAMETERS
RUNTIME
CONTEXTS
MCS Runtimeは、OC4Jサーブレット、Servlet Filter、音声サーバーまたは非同期サーバーから起動されます。サーブレット3.2フィルタと同様に、MCS Runtime controllerは、MCS Runtimeの交換可能なRequest、ResponseおよびSessionの各リスナーを介して拡張できます。
これらのオブジェクトに関係するリスナーが登録されている場合、MCSセッションの確立、MCSセッションの失効またはリクエストとレスポンスの処理中に、MCS Runtimeは実行の進捗状況を通知するイベントの順序を生成します。リスナーは、MCS Runtime controllerの実行フローを変更せず、その進捗を監視し、リクエストおよびレスポンスのデータを変更できます。イベント・リスナーに対して有効なアプリケーションには、データ・ロギング、パフォーマンス監視、およびコンテキストを認識した高度なカスタマイズが含まれます。oracle.panama.rt.event
パッケージは、JDKイベント・モデルに基づいてAPIを定義します。
リスナーとイベントは、リスナーがオブザーバを表す重要なオブザーバ設計パターンを形成します。3つのタイプのリスナーが定義されています。
ListenerRegistrationHookは、Request、Response、Sessionなどの対象からイベントを受信するためにリスナーをサブスクライブします。
oracle.panama.rt.event.RequestListener
の実装側は、次のイベントを受信できます。
before request
request begin
service begin
service end
transform begin
transform end
request end
after request
request error
どのリクエスト関連イベントが生成されるかは、OracleAS Wirelessツールの「システム・マネージャ」→「サイト」→「Wireless Webサーバー」→「イベントおよびリスナー」でイベント・マスクを指定して制御できます。たとえば、RequestListenerにrequest beginイベントを受信させる場合は、OracleAS Wirelessツールの「システム・マネージャ」→「サイト」→「Wireless Webサーバー」→「イベントおよびリスナー」コントロール・パネルで「'request begin'イベントを使用可能にする」オプションをtrueに設定する必要があります。サイト構成プロパティ名を次に示します。
wireless.http.event.beforeRequest
wireless.http.event.requestBegin
wireless.http.event.requestEnd
wireless.http.event.serviceBegin
wireless.http.event.serviceEnd
wireless.http.event.transformBegin
wireless.http.event.transformEnd
wireless.http.event.requestError
wireless.http.event.afterRequest
RequestListenerは、requestBegin(RequestEvent)の処理中に入力パラメータを傍受し、サービスの起動前に、リクエスト・パラメータに追加ビジネス・ルールを適用できます。
oracle.panama.rt.event.ResponseListener
の実装側は、レスポンス関連イベントを受信できます。有効なレスポンス関連イベントは、response errorのみです。MCS Runtimeで、ResponseListenerでresponse errorイベントを受信する場合は、OracleAS Wirelessツールの「システム・マネージャ」→「サイト」→「Wireless Webサーバー」→「イベントおよびリスナー」コントロール・パネルで「'response error'イベントを使用可能にする」オプションをtrueに設定する必要があります。サイト構成プロパティ名は、wireless.http.event.responseError
です。
oracle.panama.rt.event.SessionListener
の実装側は、セッション・ライフ・サイクル・イベントを受信できます。有効なセッション・イベントは、次のとおりです。
before session
session begin
session authenticated
session end
after session
どのセッション・イベントが生成されるかは、OracleAS Wirelessツールの「システム・マネージャ」→「サイト」→「Wireless Webサーバー」→「イベントおよびリスナー」コントロール・パネルでイベント・マスクを指定して制御できます。たとえば、SessionListenerでsession beginイベントを受信する場合は、OracleAS Wirelessツールの「システム・マネージャ」→「サイト」→「Wireless Webサーバー」→「イベントおよびリスナー」コントロール・パネルで「'session begin'イベントを使用可能にする」オプションをtrueに設定します。サイト構成プロパティ名を次に示します。
wireless.http.event.beforeSession
wireless.http.event.sessionBegin
wireless.http.event.sessionAuthenticated
wireless.http.event.sessionEnd
wireless.http.event.afterSession
次に、カスタマイズしたイベント・リスナーを設定する手順を説明します。
注意: クラスパスを正しく設定していることを確認し、関連するすべてのファイルを追加する必要があります。追加する必要があるファイルは、log.xml ファイルで確認してください。
|
RequestListener、ResponseListenerまたはSessionListenerインタフェースを実装します。
注意: 各リスナーで次のメソッドを提供する必要があります。
|
クラスパスのwireless.jar
ファイルを使用して、手順1からの新規Javaソース・ファイルをコンパイルします。
「システム・マネージャ」→「サイト」→「Wireless Webサーバー」→「イベントおよびリスナー」コントロール・パネルでイベント・マスク・エントリを変更して、特定のイベントの生成を使用可能にします。
OracleAS Wirelessツールの「システム・マネージャ」→「サイト」→「Wireless Webサーバー」→「イベントおよびリスナー」コントロール・パネルで、RequestListener、ResponseListenerおよびSessionListenerのクラス名を指定します。サイト構成プロパティ名を次に示します。
wireless.http.locator.combined.listener.classes
wireless.http.locator.session.listener.classes
wireless.http.locator.response.listener.classes
wireless.http.locator.request.listener.classes
OracleAS Wirelessインスタンスを再起動します。
いずれかのイベント・リスナーでAbortServiceException
がスローされ、リクエストの拒否をMCS Runtime controllerに通知する場合がありますが、この拒否通知は、サービスが起動されていない時点で、次のいずれかのイベントが実行されている間に発生した場合にのみ有効です。
beforeRequest(RequestEvent)
beforeSession(SessionEvent)
sessionAuthenticated(SessionEvent)
requestBegin(RequestEvent)
sessionBegin(SessionEvent)
serviceBegin(RequestEvent)
serviceEnd()
、transformBegin()
およびtransformEnd()
イベントの実行時に、複数のリスナーでAbortServiceException
がスローされ、ユーザーに対するサービスのコンテンツが拒否される場合がありますが、サービス起動の継続的な効果はロールバックできません。sessionEnd()
、afterSession()
、requestEnd()
およびafterRequest()
メソッドでは、AbortServiceException
はスローされません。
例9-8で、Request、ResponseおよびSessionのリスナー・インタフェースを実装するリスナーについて説明します。このサンプルのリスナーでは、Request、ResponseおよびSessionのすべてのイベントをリスニングしています。また、このサンプルのリスナーでは、リクエストのレスポンス時間を記録します。
例9-8 イベント・リスナーの実装
package oracle.panama.rt.event; import oracle.panama.rt.Request; import oracle.panama.rt.Response; import oracle.panama.rt.Session; import oracle.panama.rt.AttributeCategory; import oracle.panama.rt.event.RequestEvent; import oracle.panama.rt.event.ResponseEvent; import oracle.panama.rt.event.SessionEvent; import oracle.panama.rt.event.RequestListener; import oracle.panama.rt.event.ResponseListener; import oracle.panama.rt.event.SessionListener; import oracle.panama.rt.event.AbortServiceException; public class Listener implements RequestListener, ResponseListener, SessionListener { private final static String BEFORE_REQUEST = "L__L1"; private final static String REQUEST_BEGIN = "L__L2"; private final static String SERVICE_BEGIN = "L__L3"; private final static String SERVICE_END = "L__L4"; private final static String TRANSFORM_BEGIN = "L__L5"; private final static String TRANSFORM_END = "L__L6"; private final static String REQUEST_END = "L__L7"; private final static String AFTER_REQUEST = "L__L8"; private final static String BEFORE_SESSION = "L__L9"; private final static String SESSION_BEGIN = "L__LA"; private final static String SESSION_END = "L__LB"; private final static String AFTER_SESSION = "L__LC"; public void beforeSession(SessionEvent event) throws AbortServiceException { System.out.println(event.toString()); } public void sessionBegin(SessionEvent event) throws AbortServiceException { //[29] StringBuffer buf = new StringBuffer(1000000); event.getSession().setAttribute(AttributeCategory.RUNTIME, this.SESSION_BEGIN, buf); } public void beforeRequest(RequestEvent event) throws AbortServiceException { event.put(BEFORE_REQUEST, new Long(event.getTimeStamp())); } public void requestBegin(RequestEvent event) throws AbortServiceException { event.put(REQUEST_BEGIN, new Long(event.getTimeStamp())); } public void serviceBegin(RequestEvent event) throws AbortServiceException { event.put(SERVICE_BEGIN, new Long(event.getTimeStamp())); } public void serviceEnd(RequestEvent event) throws AbortServiceException { event.put(SERVICE_END, new Long(event.getTimeStamp())); } public void transformBegin(RequestEvent event) throws AbortServiceException { event.put(TRANSFORM_BEGIN, new Long(event.getTimeStamp())); } public void transformEnd(RequestEvent event) throws AbortServiceException { event.put(TRANSFORM_END, new Long(event.getTimeStamp())); } public void requestEnd(RequestEvent event) throws AbortServiceException { event.put(REQUEST_END, new Long(event.getTimeStamp())); } public void afterRequest(RequestEvent event) throws AbortServiceException { //[54] Long val; long t1, t2, t3, t4, t5, t6; StringBuffer buf = (StringBuffer) event.getRequest().getSession().getAttribute( AttributeCategory.RUNTIME, this.SESSION_BEGIN); /* compute total response time */ t6 = event.getTimeStamp(); val = (Long) event.get(this.BEFORE_REQUEST); t1 = val.longValue(); buf.append("Request time = "); buf.append(t6 - t1); buf.append("\r\n"); /* compute service time */ val = (Long) event.get(this.SERVICE_END); t3 = val.longValue(); val = (Long) event.get(this.SERVICE_BEGIN); t2 = val.longValue(); buf.append("Service time = "); buf.append(t3 - t2); buf.append("\r\n"); /* compute transform time */ val = (Long) event.get(this.TRANSFORM_END); t5 = val.longValue(); val = (Long) event.get(this.TRANSFORM_BEGIN); t4 = val.longValue(); buf.append("Transform time = "); buf.append(t5 - t4); buf.append("\r\n"); } public void sessionEnd(SessionEvent event) throws AbortServiceException { // [84] StringBuffer buf = (StringBuffer) event.getSession().getAttribute( AttributeCategory.RUNTIME, this.SESSION_BEGIN); System.out.println(buf.toString()); System.out.println(event.toString()); } public void afterSession(SessionEvent event) throws AbortServiceException { System.out.println (event.toString()); } public void requestError(RequestEvent event) throws AbortServiceException { System.out.println(event.toString()); } public void responseError(ResponseEvent event) throws AbortServiceException { System.out.println(event.toString()); } }
例9-8では、Session、RequestおよびResponseのすべてのイベントをリスニングするサンプルのリスナーについて説明しています。ここでは、セッションを使用して、同じセッション内にあるすべてのリクエストをグループ化する方法を示しています。29行目のsessionBegin()
メソッドでは、セッション内のすべてのイベントを記録するための大きな文字列バッファを作成します。84行目のsessionEnd()
メソッドでは、セッションの最後に、セッションのログが格納された文字列バッファを出力します。イベント・オブジェクトに配置される値は、イベント・ソースのライフ・サイクル全体にわたって存続し、後続イベントの実行時に取り出すことができます。また、リスナーによって値をRequestオブジェクトまたはSessionオブジェクトのRUNTIME属性カテゴリに配置することもできます。この両方の手法によって、リスナーは個々のイベント・ソースのイベントを相互に関連付けてトレースできます。このサンプルでは、リスナーは各イベントのタイムスタンプをイベント・オブジェクトに格納しています。54行目のafterRequest()
メソッドに示すように、このタイムスタンプはリクエストの最後に取り出され、リクエストの合計レスポンス時間、サービス時間および変換時間を計算するために使用されます。
MCS Runtimeは、文書を解析してレスポンス文書内のURLをリライトした後に、文書を変換してデバイスに配信します。MCSは、チャネル・プロトコル、ターゲット・ホスト名およびポート番号も含めてレスポンス文書内のすべてのURLを置換するため、文書内のリンクに続く後続のリクエストをすべて傍受できます。このため、MCSはデバイスに対するリバース・プロキシ・サーバーとして機能します。
MCS Runtimeは、MCSセッションで当初のURLをキャッシュし、それぞれのURLを、PAsidパラメータとPAckeyパラメータのみで構成される短いURLに置換します。PAsidパラメータは、MCS RuntimeセッションIDを指定します。また、PAckeyパラメータは、MCSセッションのURLを参照するキーを指定します。MCSセッションID、URLキャッシュ、キャッシュ・キーおよびCookieは、永続的な状態のMCSセッションに含まれます。MCS Runtimeでは、MCSセッションでキャッシュされた当初のURLのパラメータを使用して傍受するリクエストを修正します。
MCSは、リバース・プロキシで仮想ブラウザとして機能し、MCSセッションでキャッシュされたCookieに添付する、ターゲット・ホストへのHTTPリクエストとポート番号を生成します。MCSでのURLのキャッシュおよびリライト方式によって、URLに多数の非表示フィールドが含まれる場合でも高い圧縮率を実現できます。
リバース・プロキシ・サーバーとして機能するMCSは、チャネル・プロトコル、ターゲット・ホスト、ポート番号、フォームまたは問合せパラメータを含むすべてのURLをリライトするため、デバイスからのすべてのリクエストのプロキシとして機能できます。このため、MCSでは、マルチチャネル・プロキシのリクエストをHTTPコンテンツ・プロバイダのリクエストに変換できます。コンテンツ・プロバイダへのHTTPリクエストを生成するとき、MCSはそのコンテンツ・プロバイダへの仮想ブラウザとして機能し、一般的なユーザー・エージェント・タイプを提示します。コンテンツ・プロバイダによるアプリケーションの記述が必要なのは、MCS仮想ブラウザの一般的なユーザー・エージェント・タイプに対してのみです。これによって、マルチチャネル・アプリケーションの配信モデルが簡略化され、同時に、XHTML、XForms、CSSなど業界標準のマークアップ言語に基づいた強力な開発モデルが提供されます。
仮想ブラウザとして機能するMCSは、コンテンツ・プロバイダ・アプリケーションからのURLリダイレクトに従うことができます。また、MCSはHTTPヘッダーRefererもサポートしているため、外部アプリケーションはリクエストのコンテキストをトレースできます。MCSは、HTTPプロトコルとHTTPSプロトコルの両方を使用でき、他の永続CookieとともにセッションCookieをサポートします。このCookieは永続的なMCSセッションに含めることができます。MCSは、デバイスがMCS Runtimeへのアクセスに使用するメソッドに応じて、GETメソッドまたはPOSTメソッドのいずれかを使用します。MCS RuntimeがデフォルトでGETメソッドを使用するのは、HTTPチャネルがデバイスで使用されていない場合のみです。
MCS Runtimeは、HTTPレスポンス・コード301〜305などのリダイレクト・レスポンス・コードを検出し、HTTP Locationヘッダーに指定されたリダイレクトURLに従います。MCSは、POSTベースのリダイレクトもサポートできます。POSTベースのリダイレクトを送信するには、コンテンツ・プロバイダは、例9-9に示すように、値をtrueに設定したHTTPヘッダーx-oracle-mobile-redirect
とOracleAS Wireless XMLフォームをレスポンスのコンテンツとして送信する必要があります。3行目でPOSTリダイレクトがURL http://OracleAS Wireless.oracle.comに送信されます。param1=value1
は、URLにポスト・データとして渡されます。
例9-9 OracleAS Wireless XMLフォーム
<% response.setHeader("x-oracle-mobile-redirect", "true"); response.setHeader("Content-Type", "tex/vnd.oracle.OracleAS Wireless XML"); // [3] %> <?xml version = "1.0" encoding = "UTF-8" standalone="yes" ?> <!DOCTYPE SimpleResult PUBLIC "-//ORACLE//DTD SimpleResult 1.1.0//EN" "http://xmlns.oracle.com/ias/dtds/SimpleResult_1_1_0.dtd"> <SimpleResult> <SimpleContainer> <SimpleForm name="ProcessSignOnForm" mimetype="text/vnd.oracle.OracleAS Wireless XML" target="http://OracleAS Wireless.oracle.com/MyApp" method="post"> <SimpleFormItem name="param1" value="value1" type="hidden"/> </SimpleForm> </SimpleContainer> </SimpleResult>
MCSは、HTTPヘッダーRefererの参照URLを送信します。コンテンツ・プロバイダはこのメカニズムを使用して、現行のリクエストのコンテキストをトレースします。デフォルトではRefererヘッダーは送信されませんが、例9-10で説明されているOracleAS Wireless XMLの属性sendrefererにより、Refererヘッダーの送信が必要であることが示されます。
例9-10 OracleAS Wireless XMLの属性sendreferer
<?xml version="1.0" encoding="UTF-8"?> <SimpleResult> <SimpleContainer> <SimpleHref target="HelloWorld.xml" sendreferer="true">Send Referer</SimpleHref> <SimpleHref target="HelloWorld.xml" sendreferer="false">Don't Send Referer </SimpleHref> </SimpleContainer> </SimpleResult>
MCSでは、HTTPSプロトコル・ベースのURLにアクセスできます。HTTPSを使用する前に、システム・マネージャのサイト構成を使用してクライアント資格証明を構成する必要があります。MCSでは、HTTPプロキシ・サーバーを介して外部URLにアクセスできます。プロキシ設定は、システム・マネージャのサイト構成を使用して指定できます。
MCS Runtimeでは、Netscapeによるバージョン0(ゼロ)のCookie仕様が実装されます(http://www.netscape.com/newsref/std/cookie_spec.html)。また、MCS Runtimeでは、外部URLから送信されたCookieがMCS Runtimeセッションに格納され、セッションから取り出された関連Cookieが、HTTP URLリクエストとともにコンテンツ・プロバイダに送信されます。このCookieは、MCSセッションが有効であるかぎり有効です。永続Cookieをサポートするには、永続的なMCSセッションを使用可能にする必要があります。
MCSでは、コンテンツ適応を実行して、標準のXHTML、XFormsおよびCSSマークアップ言語で記述されたWebコンテンツをデバイス固有のマークアップ言語に適応します。MCSでは、高度なアルゴリズムを使用して、User-Agent、AcceptなどのHTTPヘッダーの属性、およびオプションのデバイス識別と物理デバイス・モデル(ユーザーがデバイスを登録するときに指定)を検索することで、デバイスとネットワーク機能を判別します。また、MCSは、新しいデバイスがリクエストとともに発行したデバイス機能があるかどうかも確認します。MCSは、デバイスのナレッジ・ベースにあるデバイス・モデルのレパートリを使用して、最適なコンテンツ適応をレンダリングします。
OracleAS Wirelessには、自己完結型ポータルを作成するために必要なコンポーネントとして、ユーザーとデバイスのプロビジョニング、ユーザー管理、コンテンツとサービスの管理、シングル・サインオン認証、認可、デバイス登録、ユーザー作業環境管理、エンド・ユーザーのパーソナライズ・ポータル、請求システム統合などの機能も備えています。Wireless and Voice Portalは、ユーザー・リポジトリ、Oracle Internet Directoryおよびシングル・サインオン資格証明をOracle Application Server Portal製品と共有し、メインのポータルと相互運用できます。Wireless and Voice Portal Runtimeでは、デバイスからの各リクエストは、有効なRuntimeセッションのコンテキスト内で処理されます。セッション所有者はGuestユーザー、つまり匿名ユーザーの場合がありますが、匿名デバイスからのリクエストも追跡され、個々のRuntimeセッションに割り当てられます。
OracleAS Wireless and Voice Portal Runtimeでは、デバイスで使用可能な識別子を使用して各デバイスを一貫して識別できるように、Oracle Application Server OIDユーザー・リポジトリ内で仮想ユーザーが自動的にプロビジョニングされます。デバイス識別子がリクエストに存在する場合は、仮想ユーザーのRuntimeセッションが開始されます。デバイス識別子の基礎として、Mobile Identification Number(MIN)、Mobile Subscriber ISDN(MSISDN)、Ipv6アドレス、Electronic Serial Number(ESN)などの固有のデバイス識別子を使用できます。また、デバイス識別子はWAPゲートウェイによってデバイスにプロビジョニングされることもあります。WAP Client ID Specification(http://www.wapforum.org/)には、デバイス識別子をサポートするための標準スキームが定義されています。リクエストにデバイス識別子が指定されていない場合、OracleAS Wireless Runtimeでは可能であれば永続Cookieを使用してデバイスに識別子がプロビジョニングされます。
Wireless and Voice Portal Runtimeでは、仮想ユーザーを使用したパーソナライズを容易にするためにのみデバイス識別子が使用されます。仮想ユーザーを使用して開始されたRuntimeセッションは、リポジトリ内のパーソナライズ済プリセットや作業環境プロファイルなどの情報にアクセスできます。また、デバイス識別子を使用すると、セッションが失効しないかぎり、デバイスでユーザー用の同じRuntimeセッションに再接続できます。デバイス識別子は、ワイヤレス・デバイスや音声デバイスのセッション管理の堅牢さを高め、断続的な接続障害の発生時にもサービスを継続可能にします。また、ユーザーはポータルへの接続と接続の間に、コンテキストを失わずに通話できます。
デバイス識別子は認証手段ではありません。仮想ユーザー用のRuntimeセッションは認証されませんが、ユーザーはパーソナライズされたポータルにアクセスできます。ユーザーが認証済セッションを確立できるのは、Wireless and Voice Portalに登録している場合のみです。ユーザー名とパスワードは登録時に指定できます。ユーザーのパーソナライズ・プロファイルとプリセットは、登録後も使用できます。また、登録には、E-Walletや金融取引サービスなど、セキュアなサービスへのアクセス権を付与する認証を可能にするという利点があります。
Wireless and Voice Portal Runtimeでは、デバイスで使用可能な識別子を使用して各デバイスを一貫して識別できるように、Wirelessリポジトリ内で仮想ユーザーが自動的にプロビジョニングされます。仮想ユーザー・オプションにより、デバイス所有者は、ユーザー操作を強化するポータルのパーソナライズ機能に即時にアクセスできます。この機能によって、新たなWAPクライアントID規格を使用している電話会社やエンタープライズ・ポータル管理者のプロビジョニング処理が自動化されます。
デバイス所有者はWireless and Voice Portalに登録し、認証を通じてセキュアなサービスへのアクセス権を取得できます。この登録は、デバイス所有者が設定メニューから実行できます。この自己プロビジョニング登録機能により、管理タスクがさらに簡素化されます。仮想ユーザー・サポート機能を持つデバイスを使用すると、登録済ユーザーは、セキュアなサービスから認証をリクエストされるまでシステムにサイン・オンし続けなくても、Wireless and Voice Portalに接続し、パーソナライズされたサービスにアクセスできます。仮想ユーザー機能によって、デバイスのアクティビティを仮想識別子で識別できるため、ポータルのアクセス可能性が改善されるのみでなく、ポータル操作のデータ・マイニング機能も強化されます。
仮想ユーザー機能は、サイト単位の構成パラメータ設定wireless.virtualuser.enabled=false
で使用禁止にできます。このプロパティは、「システム・マネージャ」→「サイト」→「ユーザー・プロビジョニング」コントロール・パネルで「仮想ユーザーを使用可能にする」オプションを使用して変更できます。仮想ユーザー機能を使用禁止にした場合、またはデバイスでデバイス識別子がサポートされていない場合、セッションはGuestユーザーを使用して開始されます。このユーザーは、リポジトリ内でプロビジョニングされている必要があります。Wireless and Voice Portalブートストラップ・リポジトリには、匿名ユーザーであるGuestが含まれています。
Wireless and Voice Portal Runtimeオブジェクトに直接アクセスするアプリケーションでは、oracle.panama.model.User
のgetUserType()
メソッドから戻されるoracle.panama.model.UserType
の値をチェックできます。RuntimeセッションのUserは、oracle.panama.rt.Session
のgetUser()
メソッドから取得できます。外部コンテンツ・プロバイダは、ユーザー・タイプ情報をHTTPヘッダー属性x-oracle-user.userkindから取得できます。この属性の可能な値はanonymous、virtualまたはregisteredです。
認証済セッションが必要なサービスのアプリケーション・プログラムでは、URLにPAlogin=trueパラメータを追加する必要があります。Wireless and Voice Portal Runtimeは、Runtimeセッションが未認証の場合に、サービス・リクエスト内のURLパラメータの中からPAlogin=trueパラメータが検出されると、ユーザーの認証を試行します。この認証プロセスは、リクエストされたサービスがRuntimeによって起動される前に実行され、通常はユーザーがOracle Application Server Single Sign-On(SSO)Serverにユーザー名とパスワードを入力する必要があります。PAloginパラメータで認証プロセスが起動した後も、セキュアなサービス用のアプリケーション・プログラムではセッションが認証されていることを検証する必要があります。Wireless and Voice Portal Runtimeオブジェクトに直接アクセスするアプリケーションでは、oracle.panama.rt.Session
インタフェースのisUserAuthenticated()
メソッドを使用できます。外部コンテンツ・プロバイダは、HTTPヘッダー属性x-oracle-user.authkindから情報を取得できます。この属性の値はauthenticatedまたはunauthenticatedです。
また、アプリケーションでは、セッションがSSL、TLS、WTLSのうちどのチャネルで保護されているかもチェックできます。Wireless and Voice Portal Runtimeオブジェクトに直接アクセスするアプリケーションでは、oracle.panama.rt.Request
インタフェースのisSecure()
メソッドを使用できます。外部コンテンツ・プロバイダは、HTTPヘッダー属性x-oracle-device.secureを介して条件isSecure()
を取得できます。この属性の値はtrueまたはfalseです。
サービスへのアクセスの認可は、すべての認証済または未認証セッションについてリクエストごとに実行されます。この認証により、セッション・ユーザーがサービスへのアクセス権限を持っていることが確認されます。デフォルトの認可ポリシーでは、セッションが認証済かどうかは区別されません。仮想または登録済ユーザーによる未認証セッションは、認証済セッションと同様の可視性を持ちます。したがって、アプリケーションでは認証を規定するためにPAloginパラメータを適用する必要があります。
マルチチャネル・サーバーは、デバイス・ブラウザとバックエンドWebアプリケーションの間にデプロイされる中間層です。マルチチャネル・サーバーは、HTTP(HTTPS)プロトコルを介してデバイスやアプリケーションと通信します。
マルチチャネル・サーバーは、リクエスト/レスポンスの文字コード/デコードを正しく行うために、デバイスとアプリケーションの両方で使用する文字コードを認識する必要があります。マルチチャネル・サーバーは、各HTTPホップの文字コードを次の順序で処理します。
デバイスからの最初のリクエスト: MCSは、デバイス・ブラウザの「受け入れた文字コード」属性を使用して、ブラウザから送信されたリクエスト・パラメータをデコードします。
MCSからアプリケーションへの最初のリクエスト: MCSは、アプリケーションで必要な文字コードを認識しません。この場合、MCSは、アプリケーションへの最初のリクエストでUTF-8文字コードを使用します。
アプリケーションからの最初のレスポンス: MCSは、Hypertext Transfer Protocol(HTTP)1.1仕様に従って、受信者に送信されるエンティティ本体のメディア・タイプを検出します。送信者は、この仕様に従ってContent-Type HTTPヘッダーを追加し、コンテンツのキャラクタ・セットを示すcharset値を追加する必要があります。次に例を示します。
Content-Type: application/vnd.oracle.xhtml+xforms; charset=ISO-8859-4
Content-Typeヘッダー(charset値)を指定しない場合、MCSはISO-8859-1文字コードを使用します。
注意: この文字コード値はMCSで記憶され、アプリケーションへの後続のリクエストで使用されます。 |
MCSからの最初のレスポンス: MCSは、デバイス・ブラウザの「受け入れた文字コード」属性を使用して、ブラウザから送信されたリクエスト・パラメータをデコードします。
デバイスからの後続のリクエスト: MCSは、デバイス・ブラウザの「受け入れた文字コード」属性を使用して、ブラウザから送信されたリクエスト・パラメータをデコードします。
MCSからアプリケーションへの後続のリクエスト: MCSは、前のレスポンスでアプリケーションから送信された内容と同じ文字コードを使用します。
アプリケーションからの後続のレスポンス: MCSは、ステップ3で説明したロジックを使用します。アプリケーションでは、文字コードを再指定する必要があります。アプリケーションで別のコードを使用することは可能ですが、一般的ではありません。
MCSからの後続のレスポンス: MCSは、デバイス・ブラウザの「受け入れた文字コード」属性を使用して、ブラウザから送信されたリクエスト・パラメータをデコードします。
最初のリクエスト/レスポンスの後は、後続のすべてのリクエスト/レスポンスについてステップ5〜8を繰り返します。
つまり、MCSはデバイスとの通信時に、常に「受け入れた文字コード」のデバイス属性を使用して文字コード/デコードを行います。また、アプリケーションとの通信時は、常にContent-Type HTTPヘッダーのcharset値を使用します。このルールの唯一の例外は、MCSでUTF-8文字コードを使用している場合の、MCSからアプリケーションへの最初のリクエストです。
このセクションでは、Wirelessサービスに関する情報、およびそれらを活用して最も効率的な機能を提供する方法について説明します。
様々なサービスによって、エンド・ユーザーはOracleAS Wirelessの機能にアクセスできます。これらのサービスは、コンテンツ・ソースと配信ターゲットの間のリンクを表します。サービスにより、特定のデータ・ソースが(アダプタを介して)様々なデバイスに連結されます。
次のように様々なタイプのサービスがあります。
MasterService: サービスの実際の実装を提供します。MasterServiceでは、サービスに使用されるアダプタとサービス固有のパラメータが指定されます。
Link: サービスへのポインタです。ほとんどの場合、LinkはMasterServiceをエンド・ユーザーに公開し、MasterServiceのパラメータをカスタマイズするために使用されます。
Module: 既知のURLを持つMasterServiceへのポインタです。
Folder: 他のFolderなど、他のサービスのコンテナです。サービス・ツリーの作成に使用されます。
ExternalLink: 外部リソースを指し示すサービスです。
MasterServiceでは、基本的なワイヤレス機能を提供します。これにより、サービスが実際に実装されます。各MasterServiceは1つのアダプタに基づいています。MasterServiceにより、アダプタの初期パラメータ、入力パラメータおよび出力パラメータの値が設定されます。各MasterServiceでは、使用するアダプタの独自インスタンスが作成されます。したがって、複数のサービスが同じタイプのアダプタを使用し、それぞれが独自サービス固有の引数値を渡すことができます。
すべてのMasterServiceの作成にHTTPアダプタを使用することをお薦めします。これにより、JSPや他のWebテクノロジを使用して、サービスのビジネス・ロジックを柔軟に実装できます。
Linkは、パラメータの値をオーバーライドして既存のサービスをさらにカスタマイズするために使用されます。
Linkサービスが起動すると、OracleAS WirelessサーバーはパラメータをLinkが示すサービスのパラメータとマージして、そのサービスを起動します。
Linkは、サービスをユーザー・サービス・ツリー形式で適切に編成するためにも使用されます。これにより、同じサービスに異なる名前を付けて、異なるフォルダ(サービス・ツリーの異なるレベル)で柔軟に公開できます。パラメータ値をオーバーライドしない場合は、Linkを起動すると、それが指すサービスが起動します。
Moduleは、予約済の仮想URL(OMP URL、つまりomp://my.module)を使用するワイヤレス・サービスです。
Moduleは、任意のアプリケーションまたはモジュールからコールでき、他のアプリケーションまたはモジュールに制御を戻すように指示できます。コールは任意のレベルまでネストできます。この双方向リンク・メカニズムにより、アプリケーションの迅速なアセンブリが可能になります。
Moduleと通常のサービスとの重要な違いは、Moduleは完了後に戻るために必要なサービスに関する情報を受け取ることです。これは、常にModuleのコール元であるとはかぎりません(Moduleのコール元は、異なるサービスに戻るためのModuleを必要とする場合があります)。
アクセスに関連するサービスには、次の2種類があります。
ユーザー・プライベート・サービス: 個々のユーザーのみがアクセス可能です。
共有サービス: 複数のユーザーがアクセス可能です。
この2種類のサービスには、異なる規則が適用されます。
ユーザー・プライベート・サービスは、ユーザーのホーム・サービス・ツリーに常駐するサービスです。ユーザーは、この種のすべてのサービスにアクセスできます。他のユーザーのプライベート・サービスにはアクセスできません。
これに対して、共有サービスには複数のユーザーがアクセスします。アクセスは、ユーザー・グループ・サービスの関係により制御されます。グループにサービスを割り当てると、そのグループのユーザーはすべてサービスにアクセスできます。
このセクションでは、フォルダ・レンダラについて説明します。
フォルダ・レンダラは、フォルダのコンテンツをレンダリングする、OracleAS WirelessのRuntimeコンポーネントです。エンド・ユーザーがカスタマイズできるように、フォルダ・レンダラ・コンポーネントのロジックはフォルダ・レンダラ・フックの形式で具体化されています。
詳細は、oracle.panama.rt.hook.FolderRendererHook
Javaインタフェースを参照してください。
OracleAS Wirelessには、デフォルトでフォルダ・レンダラ・フックの実装が用意されています。デフォルト実装の構成は次のとおりです。
OC4Jアダプタに基づいたシステム・マスター・サービス。omp://oracle.iasw.folder.renderer
の仮想URLが含まれます。
マスター・サービスの検索と起動を行うJavaクラス。このJavaクラスの名前はoracle.panama.rt.hook.FolderRendererPolicy
で、インタフェースFolderRendererHookを実装します。
一連のJSPページ。マスター・サービスは、iaswfr/FolderRenderer.jsp
の相対URLを使用して1つのJSPを指し示します。このJSPは、フォルダのコンテンツをレンダリングできる一連のJSPページへのエントリ・ポイントとして機能します。
JSPページによって起動するメソッドのライブラリが含まれるユーティリティJavaクラス。このJavaクラスの名前はoracle.panama.rt.hook.FolderRendererUtil
です。
JSPベースのフォルダ・レンダラのフレームワークを使用すると、エンド・ユーザーは簡単にカスタマイズできるようになります。JSPで記述されたフォルダ・レンダラのロジックによって、エンド・ユーザーは、Javaコードを再コンパイルしないでJSPページを簡単に変更できます。JSPベースのフォルダ・レンダラを使用すると、次に示すように、いくつかのレベルでカスタマイズを実行できます。
ユーザーは、デフォルト実装に含まれているJSPを変更できます。
ユーザーは、一連のJSPページを新たに作成し、その新しいJSPページを指し示すようにシステム・マスター・サービスの相対URLを変更できます。
ユーザーは、マスター・サービスと一連のJSPページを新たに作成できます。この場合、ユーザーは、仮想URLのomp://oracle.iasw.folder.renderer
が指し示すデフォルトのマスター・サービスを新しいマスター・サービスに置換します。
ユーザーは、インタフェースFolderRendererHook
の独自の実装を記述できます。このインタフェースのデフォルト実装はoracle.panama.rt.hook.FolderRendererPolicy
です。
ユーザーは、フォルダ・レンダラをカスタマイズするために、JSPページの構造と実行フローを理解する必要があります。
JSPページの論理構造を次に示します。
エントリ・ポイントとして機能するトップレベルのJSPページがFolderRenderer.jsp
です。このFolderRenderer.jspから、接続デバイスのデバイス・カテゴリをチェックし、第2レベルの適切なJSPページを追加します。
第2レベルのJSPページはXXXRenderer.jspという名前で、XXXは接続デバイスのデバイス・カテゴリです。XXXRenderer.jsp自体には、XXXHeader.jsp、XXXBody.jspおよびXXXFooter.jspの3つのJSPページが含まれています。
たとえば、WAP電話からのリクエストの場合、FolderRenderer.jspにはMicroBrowserRenderer.jspが含まれ、そのMicroBrowserRenderer.jspには、MicroBrowserHeader.jsp、MicroBrowserBody.jspおよびMicroBrowserFooter.jspが含まれます。
フォルダ・レンダラのデフォルト実装の実行フローは、次のとおりです。
OracleAS Wireless Runtimeは、フォルダをレンダリングする準備ができると、oracle.panama.rt.hook.FolderRendererPolicy invoke()
メソッドをコールします。
invoke()
メソッドは、仮想URLのomp://oracle.iasw.folder.renderer
のハードコード値を使用し、マスター・サービスを検索して起動します。マスター・サービスはJSPとして実装され、iaswfr/FolderRenderer.jsp
の相対URLが含まれます。
FolderRenderer.jspがコールされ、次の処理が実行されます。
必要なすべての情報(ServiceContext、セッション、ユーザー、デバイスなど)をリクエストから取得して格納します。この情報は、FolderRenderer.jspに含まれる他のJSPページで使用されます。
接続デバイスが属しているデバイス・カテゴリをチェックし、適切なJSPページ(前述の説明を参照)を追加します。
追加されたJSPページでは、現行フォルダのコンテンツがレンダリングされます。
OracleAS Wirelessサーバーを使用すると、サーバー側のユーザー・ブックマークを管理できます。各ブックマークは、デバイス固有のマークアップ言語で戻されたコンテンツを持つデータ・ソース(URL)を参照します。OracleAS Wirelessサーバーでは、ユーザーと管理者はブックマークをユーザー・サービス・ツリーの任意の位置に配置できます。
各ブックマークは1つの論理エントリで、異なるマークアップ言語に対応した複数のURLを含めることができます。たとえば、Yahooブックマークには、HTMLマークアップ言語用のURL http://www.yahoo.com
、およびWMLマークアップ言語用のURL http://wap.yahoo.com
を含めることができます。ユーザーが、WMLマークアップ言語をサポートするデバイスからYahooブックマークにアクセスすると、http://wap.yahoo.com
URLのコンテンツがデバイスに戻されます。また、ユーザーが、HTML言語をサポートするデバイスからYahooブックマークにアクセスすると、http://www.yahoo.com
URLのコンテンツが戻されます。
各マークアップ言語は、MIMEタイプによって一意に識別されます。OracleAS Wirelessサーバーでブックマークを格納するとき、内部的には、<URL, markup language>の組合せを<URL, MIME-type>の組合せとして格納します。
ブックマークはワイヤレス・トランスコーディングAPIと統合されています。このAPIによって、WMLコンテンツ(text/vnd.wap.wml
MIMEタイプ)をOracleAS Wireless XMLに変換し、さらにOracleAS Wirelessサーバーでサポートされているデバイス固有のマークアップ言語に変換できます。
URLに関連付けられたMIMEタイプに応じて、一部のURLはユーザーのデバイスから直接アクセスされ、他の一部はOracleAS Wirelessを介してアクセスされます。現在、OracleAS Wirelessサーバーを介してアクセスできるのは、text/vnd.wap.wml
MIMEタイプに関連付けられたURLのみです。トランスコーディングAPIでサポートする入力マークアップ言語が増えるに従って、アクセスできるURLも増える予定です。
さらに、ブックマークの任意のURLをデフォルトURLとしてマークできます。デバイスでサポートされるマークアップ言語に対応したURLがないブックマークにデバイスがアクセスすると、OracleAS WirelessサーバーはデフォルトURLを起動し、そのコンテンツをOracleAS Wireless XMLにトランスコードし、さらに、デバイスでサポートするマークアップ言語に変換します。
デフォルトURLから戻されたコンテンツのマークアップ言語は、ワイヤレス・トランスコーディングAPIによるサポートが必要です(つまり、デフォルトURLで使用できるのは、WMLのtext/vnd.wap.wml
MIMEタイプのコンテンツのみです)。
ユーザー・デバイスとブックマークでサポートされるMIMEタイプ(つまり、関連付けられたURLがあるMIMEタイプ)に応じて、次のいくつかの方法で、ブックマークに格納されたURLにアクセスできます。
ユーザーのデバイスがWMLコンテンツ・タイプをサポートし、text/vnd.wap.wml
MIMEタイプに関連付けられたURLがある場合。この場合、ユーザーのデバイスはOracleAS Wirelessサーバーを介してURLにアクセスします。関連するすべてのURLがOracleAS Wirelessサーバーを指し示すようにリライトされた場合を除き、WMLコンテンツは変更されません。後続のすべてのリクエストは、OracleAS Wirelessサーバーを介してアクセスします。
ユーザーのデバイスがWML以外のマークアップ言語をサポートし、そのMIMEタイプに対応するURLがブックマークにある場合。この場合は、OracleAS Wirelessサーバーを介さずに(つまり、ユーザーはWirelessポータルを離れて)ユーザーのデバイスからURLに直接アクセスします。
ユーザーのデバイスがWML以外のマークアップ言語をサポートし、そのマークアップ言語に関連付けられたブックマークにURLはないが、デフォルトURL(text/vnd.wap.wml
MIMEタイプ)がある場合。この場合、ユーザーのデバイスはリクエストをOracleAS Wirelessサーバーに送信します。サーバーでは、WMLコンテンツをフェッチし、WMLをOracleAS Wireless XMLにトランスコードします。次に、そのOracleAS Wireless XMLをデバイス固有のマークアップ言語に変換し、レスポンスをデバイスに返信します。後続のすべてのリクエストでこれを繰り返します。
ユーザーのデバイスが、対応するURLがブックマークにないマークアップ言語をサポートし、デフォルトURLがない場合。この場合、デフォルトのFolderRendererはブックマークを起動するリンクを表示しないため、ユーザーに対してブックマークは表示されません。
OracleAS WirelessリポジトリはModel-View-Control(MVC)アーキテクチャのモデルで構成されていますが、OracleAS Wireless RuntimeレイヤーはMVCのコントローラに該当します。oracle.panama.model
パッケージ内のRepository Model APIを使用すると、OracleAS Wirelessリポジトリ内の永続オブジェクトを作成、削除、変更および問い合せるアプリケーションを開発できます。
OracleAS Wirelessリポジトリでは、オブジェクト間に組織構造が適用されます。たとえば、1人のユーザーを複数のグループに所属させることができます。各ユーザーは、1つ以上のロールに割り当てられます。ユーザーは、所属するグループからアクセス可能なサービスにアクセスできます。ただし、ユーザー・インタフェースの実装では、Oracle Internet Directory(OID)やOracle Applicationsのユーザー・リポジトリ(AOL)など、外部のプロビジョニング・システムやリポジトリにアクセスし、エンタープライズ・ユーザー情報を管理し、ユーザーのロール、グループ・メンバーシップおよびそのユーザーがアクセス可能な特定のサービスを指定できます。
フォルダは、サービス・ツリーを構成するサービスのコンテナとして使用される特殊なサービスです。サービスまたはフォルダは、1つ以上のグループに割り当てることができます。ユーザーは、DeviceAddressのコレクション、LocationMarkのコレクション、カスタマイズProfileのコレクション、高度なカスタマイズで使用されるPresetsの1つ以上のコレクションを所有できます。デフォルトのLocationMarkとデフォルトのProfileは、ユーザーごとに割り当てることができます。Model APIのDeviceインタフェースでは、対象となるデバイス・プロトコル(WAP、SMS、E-MAILなど)を定義します。また、対象となるデバイスの物理的な特性(画面の幅と高さ、画面の列数と行数、ソフトキーの数など)も指定します。この特性はアダプタとトランスフォーマで使用できます。
Model APIの対象ユーザーは、カスタマイズ・ポータル、ポートレット、カスタム・フック、リスナーおよびアプリケーションの開発者です。この場合のアプリケーションには、JSP、サーブレット、モジュール、およびHTTPアダプタを介して起動する他の(URLアドレス可能な)リソースなどがあります。開発者はModel APIを使用して、永続オブジェクトを操作するスタンドアロン・アプリケーションを開発することもできます。この種のインタフェースではリポジトリ内のデータ整合性が保たれますが、アクセス制御セキュリティは規定されません。Model APIを介してリポジトリにアクセスするアプリケーションは、OracleAS Wireless Runtimeレイヤー内の同じ認証および認可メカニズムでは認証または許可されません。Model APIは、認証および認可ポリシーを開発してカスタマイズするために、トラステッド・コンポーネントによって使用されます。OracleAS Wirelessツールは、リポジトリに認証および認可されたアクセス制御を提供します。開発者は、Model APIのインタフェースを使用してサービスを開発するときに十分な注意を払い、エンド・ユーザーがサービスを起動したときに予期しない問題が発生しないように、適切な対策を講じる必要があります。
注意: WirelessモデルのAPIを使用し、Wirelessのキャッシュ永続性オブジェクトを変更する場合、オブジェクトの失効したコピーがどのキャッシュにも残っていないことを確認する必要があります。キャッシングは各JVMごとに実行されます。Wirelessをカスタム・デプロイすると、複数のJVMが作成されます。これらのJVMは、キャッシュ内にあるオブジェクトの失効したコピーを排除するために同期化する必要があります。 次のコードをWebアプリケーション・ファイル(web.xml)に含め、変更がすべてのWebアプリケーションに伝播されるようにします(この作業が必要なのは一度のみで、JVMごとに何度も行う必要はありません)。 <?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"><web-app><!-- ...--><filter-mapping>...</filter-mapping><listener><listener-class>oracle.panama.servlet.CacheManagerListener</listener-class></listener><servlet>...</servlet><!-- ... --></web-app> |
リポジトリ・オブジェクトは、Data Model APIからアクセスされると、Javaインスタンスのメイン・メモリーにキャッシュされます。これらのオブジェクトがメイン・メモリーから削除されるのは、TTL間隔中にAPIを介してアクセスされなかった場合のみです。この間隔は、OracleAS Wirelessツールの「システム・マネージャ」→「サイト」→「ランタイム構成」コントロール・パネルの「キャッシュ・オブジェクト・ライフ時間 (秒)」プロパティから構成できます。リポジトリ・オブジェクトが変更され、Javaインスタンスの1つからリポジトリにコミットされると、他のすべてのJavaインスタンスでは変更後のオブジェクトがリポジトリから自動的に再ロードされます。キャッシュ同期スレッドの数は、OracleAS Wirelessツールの「システム・マネージャ」→「サイト」→「オブジェクト・キャッシュ同期」コントロール・パネルで指定できます。
ModelObjectは、すべてのリポジトリ・オブジェクトに共通する動作とプロパティを表すルート・インタフェースです。このオブジェクトは、oracle.panama.modelパッケージに格納されています。
oracle.panama.modelパッケージには、モデル・オブジェクトにアクセスできるように次の3つのロケータおよびファクトリ・オブジェクトも用意されています。
MetaLocator: Model API使用の開始ポイント。このコールから、ModelFactoryおよびModelServicesインタフェース実装への参照を取得できます。
ModelFactory: モデル・オブジェクトを作成するためのファクトリ。
ModelServices: モデル・オブジェクトにアクセスするためのロケータ。
次に、様々なモデル・インタフェースについて簡単に説明します。インタフェースの詳細は、Model API仕様を参照してください。
Adapter: RuntimeAdapterのリポジトリ・コンテナであり、すべてのカスタム・アダプタで実装されるインタフェースです。このAdapterによって、RuntimeAdapterクラスがリポジトリに取り込まれ、RuntimeAdapterのロードと初期化がサポートされます。
DeviceV2: 対象となるロジカル・デバイス・プロトコルの定義です。たとえば、WML固有デバイスに対してWML11を指定できますが、Nokia固有のWMLに対してWML_Nokia7110を指定することもできます。その他の例には、SMSとE-MAILがあります。DeviceV2にはTransformerオブジェクトが含まれています。
User: ユーザーIDを表し、OracleAS Wirelessポータルでのパーソナライズを容易にします。
Profile: ユーザーは、サービス・ツリーのカスタマイズを含む1つ以上のProfileを持つことができます。ユーザーのProfileでは、フォルダ内のサービスの優先順位を指定できます。
Group: ユーザーのコレクションです。Groupは、特定のサービスをグループ・メンバーに対して公開するために使用されます。ユーザーは、所属するグループからアクセス可能なサービスにアクセスできます。
Role: Groupと同様に、Roleもユーザーのコレクションです。ただし、Groupは実行時にアクセスを制御するために使用されますが、Roleは異なるWebtoolへのアクセスを制御するために使用されます。
Service: 抽象インタフェースで、サービス全般を処理します。Serviceには、次のサブインタフェースが含まれています。
MasterService: 最終的なサービスです。このMasterServiceは、他のすべてのサービスのテンプレートです。外部ソースとの通信には、常にAdapterを使用します。
Folder: ファイル・システムのディレクトリに類似しており、サブフォルダを含む他のサービスが格納されています。
ExternalLink: 外部URLへの論理参照です。1つのExternalLinkでは、チャネルごとに1つのURLを参照するか、または複数のチャネルで1つのURLを共有できます。
LocalModule: モジュール化可能なMasterServiceへのポインタです。
Link: 別のLinkを含む他のサービスへのポインタです。Linkは、MasterServiceのカスタマイズやアクセス可能なMasterServiceのプライベート・ツリー構造の作成に使用されます。Linkは、最終的なマスター・サービスに至るサービス連鎖が保持するアクセス可能なパラメータをオーバーライドできます。
LocationMark: 名前が付けられ、ジオコーディングされた物理アドレスを表す永続オブジェクトです。
Transformer: すべての変換サブクラスに対するベース・インタフェースです。また、実際の変換実装(JavaまたはXSL)のリポジトリ・コンテナです。Transformerは、oracle.panama.rt.xform.RtTransformerインタフェースを実装するカスタム・トランスフォーマ・クラスのロードと初期化を実行します。また、XSLTスタイルシート用のXSLTトランスフォーマを提供します。
Transformerには、次のサブインタフェースがあります。
JavaTransformer: Transformerインタフェースを実装するクラスで、デバイスに依存しないマークアップ言語からデバイス固有のマークアップ言語への変換を処理します。また、oracle.panama.xform.RtTransformerクラスをリポジトリに取り込みます。Transformerは、oracle.panama.rt.xform.RtTransformerインタフェースを実装するカスタム・トランスフォーマ・クラスのロードと初期化を実行します。
XSLTransformer: デバイスに依存しないマークアップ言語からデバイス固有のマークアップ言語への変換を処理するXSLTスタイルシートを使用します。カスタムXSLTスタイルシートをリポジトリに取り込みます。また、XSLTスタイルシート用のXSLTプロセッサを提供します。
次のサンプル・コードに、Model APIのインタフェースを使用してOracleAS Wirelessリポジトリに新規オブジェクトをプロビジョニングする方法を示します。この例ではサンプル・コードを取り込むためにスタンドアロン・クラスを使用していますが、アダプタ、フック、リスナーおよびサーブレットなど、他のタイプのコンポーネントを使用してModel APIを示すことができます。この例には、Model APIでの検索、作成、削除およびコミット操作のみが示されていますが、必要なビジネス・ロジックは含まれていません。
以降に示す例のコード行の横にあるカッコ内の番号は、説明文とコード内の対応する行を関連付けるため、説明文で参照されます。
例9-11 MetaLocatorインタフェース
Use MetaLocator to get the ModelFactory and ModelServices (line [1]). Use ModelFactory to create a new object. Use ModelServices to search for an object. MetaLocator metaLocator = MetaLocator.getInstance(); modelFactory = metaLocator.getModelFactory(); modelServices = metaLocator.getModelServices();
MetaLocatorインタフェースを使用して、ModelFactoryとModelServicesを参照します。このインタフェースのgetInstance()
メソッドは、MetaLocatorのシングルトン・インスタンスを取得します。getModelFactory
メソッドとgetModelServices
メソッドは、ModelFactoryとModelServicesを参照します。
通常、新規オブジェクトを作成するには、オブジェクトがすでに存在しているかどうかを最初にチェックします。任意のオブジェクトを参照するには、ModelServicesインタフェースとメソッドlookupX(Java.lang.String name)を使用します。Xはオブジェクトのインタフェース名です。このサンプル・コードでは、新規ユーザーを作成するとき(新規ユーザー作成のコード・セクションは、[2]行目から始まります)、次のコード行のように、最初にModelServicesインタフェースのlookupUser(userName)メソッドを使用してユーザーを参照します([3]行目)。
modelServices.lookupUser(userName);
この参照操作は、リポジトリ内で新規永続オブジェクトを作成する前の最初の手順です。lookupUser(userName)メソッドは、名前でユーザーを検索し、ユーザー名が見つかると、Userオブジェクトを戻します。ユーザー名が見つからない場合、メソッドはPanamaRuntimeExceptionをスローします。
次に、ユーザーが所属する(または所属する必要がある)グループがすでに存在しているかどうかをチェックします([4]行目)。任意のオブジェクトを参照する場合の規則に従って、ModelServicesインタフェースとlookupGroup(groupName)メソッドを使用し、グループ名を指定してグループを参照します。グループが見つかると、メソッドはGroupオブジェクトを戻します。グループが見つからない場合、メソッドはPanamaRuntimeExceptionをスローします。
ユーザーとグループがすでに存在しているかどうかを確認した後、次のように新規ユーザー・オブジェクトを作成します(例9-12)([5]行目から[6]行目まで)。
例9-12 新規ユーザー・オブジェクトの作成
{ user = modelFactory.createUser(userName, groups); } else { user = modelFactory.createUser(userName); } user.setPassword(userPassword); user.setEnabled(true);
新規に作成したユーザーは必ず保存してください。新規にオブジェクトを作成した後は、次のように、そのオブジェクトを保存する必要があります([7]行目)。
modelFactory.save();
saveは、現行スレッド内で作成または変更されたすべてのオブジェクトに適用されます。オブジェクトは永続記憶域に保存され、トランザクションがコミットされます。作業内容を保存できない場合は、メソッドがPanamaExceptionをスローします。
サンプル・コードのsearchUser()メソッド([8]行目)は、Userオブジェクトの検索方法を示しています。一連のユーザー(名前が文字Bで始まるすべてのユーザーなど)を列挙するには、findUsersメソッド([10]行目)から戻されるResultSetEnumeration([9]行目)を使用します。メソッドfindUsersは、名前にパターン一致を使用します。サンプル・コードの詳細リストの[11]行目と[12]行目も参照してください。
ResultSetEnumeration
([13]行目)をクローズして、データベース・カーソルを解放します。クローズしないと、ResultSetEnumerationはオープンしたままになります。
ユーザーを削除するには、[14]行目のサンプル・コード・セクションに従ってdeleteUser
メソッドを使用します。ユーザー名は、[15]行目で正しく指定してください。ModelServices.lookupUser()
メソッドは、例外をスローしてパターン一致テンプレートを拒否します。ユーザー・オブジェクトは[16]行目で削除されます。
例9-13 ユーザーの削除
import Java.util.Vector; import oracle.panama.PanamaException; import oracle.panama.PanamaRuntimeException; import oracle.panama.model.MetaLocator; import oracle.panama.model.ModelFactory; import oracle.panama.model.ModelServices; import oracle.panama.model.ResultSetEnumeration; import oracle.panama.model.User; import oracle.panama.model.Group; /** * This is a sample program demonstrates the usage of the model API. */ public class SampleModelClient { private ModelFactory modelFactory; private ModelServices modelServices; public SampleModelClient() { MetaLocator metaLocator = MetaLocator.getInstance(); [1] modelFactory = metaLocator.getModelFactory(); modelServices = metaLocator.getModelServices(); } /** * Get all group names */ private String[] getGroupNames() throws PanamaException, PanamaRuntimeException { String[] names; ResultSetEnumeration result = null; try { // Find all user groups - use a wildcard for the name expression result = modelServices.findGroups("*"); Vector buffer = new Vector(); while (result.hasMoreElements()) { Group group = (Group)result.next(); String name = group.getName(); buffer.addElement(name); } names = new String[buffer.size()]; buffer.copyInto(names); } catch (PanamaRuntimeException ex) { throw ex; } finally { if (result != null) { result.close(); result = null; } } return names; } /** * Create a new user. */ private void createUser(String userName, String userPassword, String groupName) [2] throws PanamaException, PanamaRuntimeException { try { // First check if the user does not already exists modelServices.lookupUser(userName); [3] // If we are here the user must already exists return; } catch (PanamaRuntimeException ignore) {} Group group = null; try { // Get the group to add the user group = modelServices.lookupGroup(groupName); [4] } catch (PanamaRuntimeException ex) { // A PanamaRuntimeException is thrown if the group is not found group = null; } User user; // modelFactory.createUser() will automatically create a // home folder for the new user. if (group != null) { Group[] groups = new Group[1]; groups[0] = group; user = modelFactory.createUser(userName, groups); [5] } else { user = modelFactory.createUser(userName); } user.setPassword(userPassword); user.setEnabled(true); [6] // save the newly created object modelFactory.save(); [7] } /** * Search for users. */ private User[] searchUser(String userNamePattern) [8] throws PanamaException, PanamaRuntimeException { User[] users; ResultSetEnumeration result = null; [9] try { result = modelServices.findUsers(userNamePattern); [10] Vector buffer = new Vector(); while (result.hasMoreElements()) { [11] User user = (User) result.next(); [12] buffer.addElement(user); } users = new User[buffer.size()]; buffer.copyInto(users); } catch (PanamaRuntimeException ex) { throw ex; } finally { if (result != null) { result.close(); [13] result = null; } } return users; } /** * Delete a user. */ private void deleteUser(String userName) [14] throws PanamaException, PanamaRuntimeException { try { if (userName != null && userName.length() > 0) { User user = modelServices.lookupUser(userName); [15] user.delete(); [16] // Save the changes modelFactory.save(); } } catch (PanamaRuntimeException ex) { throw ex; } } }
OC4J_Wireless以外のコンテナにデプロイされているアプリケーションでWirelessモデルのAPIを使用すると、JAVA.LANG.CLASSNOTFOUNDEXCEPTION: ORACLE.PANAMA.CORE.MODELSERVICESIMPLというエラーが表示される場合があります。
このエラーは、CLASSPATHが正しく設定されていないときに発生します。CLASSPATHにWirelessライブラリへのパスを含め、アクセスできるようにする必要があります。
注意: この操作は、アプリケーションをデプロイした後にEnterprise Managerを使用して実行できます。 |
Enterprise Managerを使用してカスタム・パス(WirelessパブリックAPIにアクセスするOC4Jインスタンス用のパス)を追加または編集するには、次のようにします。
EMスタンドアロン・コンソールにログインし、新規OC4Jインスタンスを作成(または既存のOC4Jインスタンスを変更)してカスタムCLASSPATHを追加します。
OC4Jインスタンスのコンテナをクリックします(この場合はOC4J_Wireless)。または、「OC4Jインスタンスの作成」をクリックし、一意の名前を指定してOC4J Wirelessの新規インスタンスを作成します。
CLASSPATH情報を(すべての.EARファイルを対象としてグローバルに)OC4Jインスタンスに追加するには、次のようにします。
「管理」をクリックしてこのOC4Jインスタンスを管理します。
「グローバルWebモジュール」をクリックします。
「一般」をクリックします。
「行の追加」をクリックしてカスタムclassesディレクトリ(または.JARファイル)を「クラスパス」セクションに追加します。
各ライブラリ(またはclassesディレクトリ)のパスを入力します。次のWirelessパスを追加して、Wirelessライブラリにアクセスできるようにする必要があります。
ORACLE_HOME/wireless/server/classes ORACLE_HOME/wireless/bin/internal ORACLE_HOME/wireless/lib/wireless.jar ORACLE_HOME/wireless/lib/wireless_drm.jar
新規EARファイルをデプロイするには、次のようにします。
「アプリケーション」をクリックします。
「EARファイルのデプロイ」ボタンをクリックしてウィザードに従います。
デプロイされたEARファイルのクラスパスに追加するには、次のようにします。
EARファイル(この場合はワイヤレス)をクリックし、下部の「管理」にある「一般」リンクをクリックします。
「行の追加」をクリックしてカスタムclassesディレクトリ(または.jarファイル)を「ライブラリ・パス」セクションに追加します。各ライブラリまたはclassesディレクトリのパスを入力します。次のWirelessパスを追加して、Wirelessライブラリにアクセスできるようにする必要があります。
ORACLE_HOME/wireless/server/classes ORACLE_HOME/wireless/bin/internal ORACLE_HOME/wireless/lib/wireless.jar ORACLE_HOME/wireless/lib/wireless_drm.jar