項ごとに様々なトピックを記載しています。各項の内容は、次のとおりです。
OracleAS Wirelessには、Oracle Application Serverを完全にインストールせずに、ワイヤレス・アプリケーションを開発およびテストできる開発者キットが含まれています。このキットでは、次の領域のアプリケーション開発がサポートされます。
J2ME: OracleAS Wireless Developer Kit(WDK)には、J2ME Web Services Software Developer Kit(J2ME SDK)およびJ2ME Webサービス・プロキシ・サーバー(J2MEプロキシ・サーバー)が含まれています。MIDletをテストするには、デバイスにJ2ME SDKをインストールする必要があります。
メッセージ: WDKには、OracleAS WirelessのJavaメッセージAPIの実装が含まれています。開発者は、これらのAPIを使用するアプリケーションを作成して、そのアプリケーションを変更することなくOracleAS Wirelessサーバーにデプロイできます。また、開発者が開発アクティビティを迅速に開始できるようにいくつかの例が含まれています。
マルチチャネル・サーバー: WDKには、マルチチャネル・サーバーの軽量バージョンであるMCSLiteが含まれています。MCSLiteでは、完全なマルチチャネル・サーバー製品と同じ適応機能が提供されます。ワイヤレスとボイス・アプリケーションの開発者は、このメモリー・フットプリントの小さいサーバーを利用して、アプリケーションをOracleAS Wirelessにデプロイする前にテストできます。
OracleAS Wireless Developer Kitは、Oracle JDeveloper Wireless Editionと緊密に統合されており、ウィザード、コード・テンプレートおよびデバイス・シミュレータなどの機能が提供されます。OracleAS Wireless Developer Kitはスタンドアロン・モードで提供されるため、IDEまたは開発ツールでOracleAS Wirelessの開発機能を活用できます。
Oracle Application Server Wireless WDKのメッセージ・サービスには、様々な種類のデバイスにメッセージを送信するための豊富なフレームワークが用意されています。通知サービス・クライアントは内部のプロトコルやメッセージ・フォーマットの複雑さを意識しなくてよいため、アプリケーション・ロジックやコンテンツ作成に集中ができます。
Oracle Application Server Wireless WDKのメッセージ・サービスには、次の機能があります。
Oracle Application Server Wireless WDKのメッセージ・サービスでは、ワイヤレス・デバイスとの通信に必要な主要プロトコルに加えて、様々な種類のメッセージ・プロトコルをサポートしています。サポートしているプロトコルは、次のとおりです。
SMS
UCPとSMPPのどちらもすぐに使用可能。
Nokiaスマート・メッセージおよびEMS拡張の両方をサポート。
MMS
MM1とMM7のどちらもすぐに使用可能。
組込みMMSCでMM1をサポート。
すべての主要なMMSCベンダーのMM7をサポート。
電子メール
SMTP、IMAPおよびP-IMAPはすべてすぐに使用可能。
Instant Messaging
Jabber XMPPプロトコルをすぐに使用可能。すべての主要なIMプロバイダとの相互運用が可能です。
ポケットベル
単方向と双方向の両方のポケットベルをサポート。
FAX
テキストおよびマルチメディアの添付をサポート。
音声
すべての主要なVoiceXMLゲートウェイをサポート。
OracleAS Wireless XML、およびXHTMLとVoiceXMLのいずれでもボイス・アプリケーションを記述可能。
インテリジェントなメッセージ・ルーティング
手動メッセージ・ルーティング: このリリースでは、同じメッセージを複数の受信者に、異なる通信プロトコルを利用して配信できます。たとえば、ある受信者には会議のアラームをSMSで送信し、別の受信者には電子メールで送信できます。メッセージを送信する実際のコードは、メッセージ送信に使用するプロトコルや送信先のデバイスとは無関係に、同じものを利用できます。異なる点は、メッセージの送信先のデバイスの拡張アドレスのみです。拡張アドレスは、デリバリ・タイプとデバイスのアドレスの2つの部分で構成されます。デリバリ・タイプは、配信チャネルと考えることもできます。拡張アドレスは、たとえばE-mail:first.last@oracle.comのようになります。ここで、E-mailはデリバリ・タイプ、first.last@oracle.comは(通常の)アドレスです。この2つの要素はコロンで区切ります。sms:+16501234567やmms: +16501234567なども拡張アドレスです。この場合、この2つの拡張アドレスは同じ物理デバイスを指しています。異なるのは、メッセージがルーティングされるチャネルのみです。
メッセージ・フェイルオーバー: WDKメッセージには、前述の単純なアドレス指定機能に加えて、配信に失敗したメッセージを別のデバイスに送信する機能があります。これは、フェイルオーバー・チェーンを使用して実現します。フェイルオーバー・チェーンのアドレス指定には、複数のアドレスが含まれます。アドレスは、address1,address2,...の形式で指定します。チェーンに記述するアドレスは、それぞれをカンマで区切ります。たとえば、SMSメッセージを携帯電話に送信し、それが失敗した場合は同じユーザー宛てに電子メールを送信するとします。この場合のフェイルオーバー・チェーンは、sms:+16501234567,E-mail:first.last@oracle.comのようになります。SMSデバイスへの送信が失敗すると、電子メール・アドレスに再度メッセージが送信されます。
コンテンツの自動適応
多種多様なメッセージ: WDKメッセージでは、多種多様なメッセージ(テキスト形式、添付ファイル、ハイパーリンク、マルチメディア・コンテンツなどを埋め込んだメッセージ)を完全にサポートしています。
トランスコーディング: すべてのデバイスを対象としたメッセージを1つのマークアップで作成できます。メッセージング・サーバーは、デバイス・リポジトリを使用して、ターゲット・デバイスのメッセージ・フォーマットを正しく決定します。入力メッセージは、ターゲット・デバイスのメッセージ・フォーマットに合せて自動的にトランスコードされます。受信デバイスがソース・メッセージ・フォーマットを直接サポートしている場合、メッセージの変換は行われません。
メッセージの変換プロセスでは、入力マークアップ言語のトランスコードと、イメージや音声などマルチメディア・コンテンツの適応(必要な場合)の両方が行われます。
メッセージの適応が行われるということは、1つの共通する仮想デバイスに対してアプリケーションがメッセージを送信できるということです。この場合、それぞれのメッセージング・チャネルの特異性や制約に注意を払う必要がなくなります。
メッセージのパッケージング: WDKメッセージでは、メッセージのトランスコーディングに加えて、ターゲットのデバイスに合せたメッセージのパッケージングも行います。パッケージングは、テキストベース(電子メールのmultipart/alternativeなど)または純粋なバイナリ形式(SMSなどのチャネル)で実行できます。
表8-1に、マークアップのソース・フォーマット・タイプを示します。
表8-1 マークアップのソース・フォーマット・タイプ
マークアップ | 説明 |
---|---|
XHTML |
XHTMLは、AS11通知サービスのトランスコーディング・エンジンの優先マークアップ言語です。 |
Mobile XML |
OracleAS Wireless XMLは、すべてのメッセージ・チャネルに対してサポートされています。 |
ネイティブのマークアップ |
メッセージを特定のデバイスに送る場合や、制御の最適化が必要な場合は、XHTMLマークアップ言語の他に、ネイティブのマークアップ(MMS用のSMILなど)を指定することもできます。その場合、メディアの適応処理(後述)は同じように利用できますが、マークアップ自体に対するトランスコーディングは行われません。 |
VCardおよびVCal |
VCardの連絡先とVCalの予定を、それぞれの標準テキスト・フォーマットで指定できます。チャネルが電子メールなどの場合、元のVCardまたはVCalendarのマークアップは、単に添付ファイルとして送信されます。チャネルがSMSなどの場合には、VCardとVCalenderは適切なバイナリ・エンコーディングに変換されます。 |
イメージ |
イメージは、必要に応じて適切なバイナリ形式に適応されます。ターゲットのデバイスに対してイメージが大きすぎる場合には、サイズ変更とディザリングが再度自動的に実行されます。 |
オーディオ |
AS10g WDKメッセージでは、オーディオも、必要に応じてターゲットのデバイスで要求される正しい形式に適応されます。 |
前述のメッセージを、2つのデバイス(1つはSMSデバイス、もう1つは電子メール・アドレス)に送信する場合について考えます。
String[] recipients = [ sms:+16501234567, E-mail:First.Last@oracle.com ]; XMSSimpleSender sender = XMSFactory.createSimpleSender(); sender.sendMsg(recipients, test message, testMsg);
この場合、電子メールでは完全なメッセージ表示が可能であり、マークアップ入力はHTMLにトランスコードされます。その結果、メッセージはプレーン・テキストとHTML形式で表現され、イメージも含むmultipart/alternativeメッセージとしてパッケージングされます。
SMSデバイスの場合はイメージを表示できないため、メッセージをテキストのみで表したものが、Webリンクとともに表示されます(ユーザーは、Webリンクから完全なメッセージを表示できます)。
フェイルオーバー・チェーンを使用する場合、フェイルオーバー時にもトランスコーディングが同じように行われます。電子メール・アドレスとSMSデバイスで構成されるフェイルオーバー・チェーンにメッセージを送信した場合、メッセージは、まずmultipart/alternativeとして電子メール・アドレスに送られ、その配信に失敗するとプレーン・テキストで表現したものがSMSアドレスに送信されます。
WDKでのメッセージの送信は、デフォルトではJava APIを使用して行われます。次に、WDKでメッセージを送信する際に使用するクラスについて簡単に説明します。
すべてのXMSクライアント・インタフェースはXMSFactoryのシングルトン・クラスを利用して取得できます。また、このクラスはそのイディオムのgetInstance()標準メソッドを使用して得られます。XMSFactoryには、現在、createXMSSimpleSenderとcreateXMSSimpleSenderの2つのメソッドがあります。これらのメソッドの詳細は、XMSのJavadocを参照してください。
Java APIにより、ユーザーがXMS Webサービス・インタフェースの詳細を意識することはありませんが、情報を完全に記述し、WDKの仕組みを理解できるようにするため、ここではその詳細を説明します。この項の情報は、クライアント・サイド・スタブをJava以外の言語に対して生成する場合にも役立ちます。
XMS Webサービスは、SOAPおよびメッセージング・サービスを提供するWebサービス技術を土台として構築されたRPCスタイルのWebサービスです。このサービスでは、XMSメッセージ・システムのあらゆるメッセージ・タイプがサポートされています。
SMS
MMS
EMS
電子メール
音声メッセージ
FAX
ポケットベル
Instant Messaging
WAPプッシュ
XMS Webサービスは、標準のWSDLファイルに記述されます。表8-2では、このファイルのコンテンツを簡単にまとめてあります。
表8-2 XMS WSDLファイルのコンテンツ
メソッド | 入力パラメータ | 出力パラメータ |
---|---|---|
getVersion( ) XMSサーバーのバージョンを取得します。 |
なし。 |
XMSサーバー・バージョンの文字列。例: 9.0.4.0 |
GetSupported Transports( ) ゲートウェイ・サーバーでサポートしているメッセージのデリバリ・タイプを取得します。 |
なし。 |
デリバリ・タイプ文字列の配列。例: SMS, E-mail, Voice |
sendText( ) メッセージ・ゲートウェイ経由でテキスト・メッセージを送信します。 |
Username: Oracle Application Server Wirelessのユーザー名文字列。 Password: そのユーザーのパスワード文字列。 Senders: 送信者のアドレスの配列。送信者のアドレスは、トランスポート・タイプとアドレスで構成し、コロン(:)で区切って指定します。例: SMS:1-1234567 ReplyTo: 代替返信先アドレスの配列(オプション)。返信先の各アドレスは、トランスポート・タイプとアドレスで構成し、コロン(:)で区切って指定します。例: Voice:1-650- 1234567 Recipients: <デリバリ・タイプ> : <アドレス>の形式で記述した受信者アドレスの配列。例: E-mail:john@foo.com AssociatedKey: 追跡を容易にするための受信者関連キー(オプション)。 Subject: メッセージの件名を表す文字列。 MessageBody: メッセージの本文を表す文字列。 Encoding: メッセージ・コンテンツのエンコーディング。例: text/plain、text/xml、およびtext/html |
メッセージID文字列の配列。例: 101, 12345, 112 |
sendTextMsg ( ) sendTextの簡易バージョン。件名は指定できません。コンテンツは常にテキストで、Oracle Application Server Wirelessでサポートするいずれかのマークアップ、またはプレーン・テキストのどちらかです。 |
Username: Oracle Application Server Wirelessのユーザー名文字列。 Password: そのユーザーのパスワード文字列。 Senders: 送信者のアドレスの配列。送信者のアドレスは、トランスポート・タイプとアドレスで構成し、コロン(:)で区切って指定します。例: SMS:1-1234567 Recipients: <デリバリ・タイプ> : <アドレス>の形式で記述した受信者アドレスの配列。例: E-mail:john@foo.com |
出力: メッセージID文字列の配列。例: 101, 12345, 112 |
getStatusByMsgID ( ) メッセージIDの現在の送信ステータスを取得します。 |
Username: Oracle Application Server Wirelessのユーザー名文字列。 Password: そのユーザーのパスワード文字列。 Message ID: sendTextMsgまたはsendTextから返されたメッセージID文字列。 |
出力: 次の形式のメッセージ・ステータス文字列。 ステータスコード, ステータス説明 [,トランスポート・タイプ, アドレス] ステータスコード: <0: メッセージ配信に失敗、=0: 保留中、>0: メッセージ・センターまたはデバイスに送信。 ステータス説明: ステータスの説明テキスト。 トランスポート・タイプ: 配信に使用されたトランスポート・タイプ。 アドレス: 配信に使用されたアドレス。 次に例を示します。 1, Message has been delivered successfully., E-mail, foo@bar.com |
getStatusesByMsgIDs ( ) |
Username: Oracle Application Server Wirelessのユーザー名文字列。 Password: そのユーザーのパスワード文字列。 Message IDs: メッセージIDの配列。 |
メッセージ・ステータスの文字列配列(getStatusByMsgIDを参照)。 |
WSDLファイルは、様々なアプリケーション開発ツールで処理できます。Oracle JDeveloperでJavaクラス・スタブを生成してWSDLファイルからWebサービスを起動する手順については、XMS Webサービスのチュートリアルを参照してください。
WDKのデフォルトのメッセージ・ゲートウェイは、http://messenger.oracle.com/xms/webservicesです。これは、Oracle Application Server Wirelessで提供しているテスト用のメッセージWebサービス・ゲートウェイで、MMS、EMS、SMS、電子メール、FAX、IM、および音声のメッセージをサポートするように構成されています。
このインスタンスでは、標準のSOAP Webサービスが提供されるため、WDKクライアントからのリクエストに加えて、あらゆる種類のSOAPクライアントからのリクエストを処理できます。
このインスタンス用のWSDLファイルは、http://messenger.oracle.com/push/PushLite.wsdlにあります。
公開されているインスタンスは、割当て制限付きで新しいユーザーが無料で試用できます。
この項では、開発者がWDKのMCSLiteコンポーネントを使用して、マルチチャネル・アプリケーションを開発およびテストする方法を説明します。
MCSLiteは、サーブレットとサーブレット・フィルタが含まれたJ2EE Webアプリケーションです。メモリー・フットプリントは小さいですが、完全なMCSサーバーのコンテンツ適応機能をすべて備えています。目的は、開発者がアプリケーションをOracleAS Wirelessサーバーにデプロイする前に、完全にテストできるようにすることです。
MCSLiteの主目標はテストです。このコンポーネントは、開発者がアプリケーションの実行内容をより深く理解できるように情報を提供します。MCSLiteのログ・ファイルには、次の重要な情報が含まれます。
デバイス/シミュレータから受信したHTTPヘッダーとリクエスト・パラメータ
バックエンド・アプリケーションに送信したHTTPヘッダーとリクエスト・パラメータ
バックエンド・アプリケーションから受信したHTTPヘッダーとコンテンツ
デバイス/シミュレータに送信したHTTPヘッダーとコンテンツ
リクエスト処理中のエラー
ローカル: MCSLiteは、適応対象のWebアプリケーションの前にサーブレット・フィルタとしてデプロイされます。このデプロイの利点は、MCSLiteとコンテンツ生成Webアプリケーションが同じJava VMで実行されることです。この結果、アプリケーションの全体的なパフォーマンスが向上します。不利な点は、各アプリケーションとともにMCSLiteをデプロイする必要があることです。
リモート: MCSLiteは、デバイスとWebアプリケーション間のHTTPプロキシとして機能します。このデプロイの利点は、MCSLiteと関係なくWebアプリケーションを開発およびデプロイでき、その場合でもアプリケーションをあらゆるデバイスでテストできることです。不利な点は、デバイスからコンテンツまでの間に、デバイスからMCSLiteサーバーへのホップとMCSLiteサーバーからWebアプリケーションへのホップの2つのHTTPホップがあることです。これはパフォーマンスに影響を与えますが、使いやすさの点を考慮するとそれほど問題ではありません。開発者にはこのデプロイ方法をお薦めします。
MCSLiteの主な機能は次のとおりです。
完全な適応機能(マルチチャネル・サーバーと同一)
次に、1回の適応サイクルの処理内容を示します。
デバイスの検出: 詳細は以降の説明を参照してください。
コンテンツの取出し: データ・ソースへの接続とバックエンド・アプリケーションで生成されたコンテンツのフェッチ。
コンテンツ・タイプの検出: バックエンド・アプリケーションから戻されたコンテンツとHTTPヘッダーが、適切なコンテンツ・タイプを取得するために検証されます。この検証は、適切なトランスフォーマを現在のデバイスとコンテンツ・タイプに基づいて選択するために必要です。
変換: デバイス不特定のマークアップ言語からデバイス固有のマークアップ言語への変換。
小さいメモリー・フットプリント: 高度な技術(遅延オブジェクト・インスタンス化など)によって、小さいメモリー・フットプリントを実現しています。この機能は、WDKでのアプリケーションの作成やテストに、あまり性能の高くないマシンを使用できるという点で役に立ちます。
柔軟なログ・ファイル・システム: コンテンツ適応処理に関するログ・ファイルが生成されます。ログ・ファイルの情報量は、WDKのweb.xml
から構成可能なログ・レベルによって決まります。ワイヤレス・アプリケーションをデバッグするときは、ログ・レベルを、最も多くの情報が生成されるdebugに設定してください。デフォルトのMCSLite構成の変更方法は、次の項を参照してください。
トランスフォーマとデバイス記述の自動再ロード: 自動再ロード機能によって、デバイスとトランスフォーマのメタデータに対する変更が、サーバーを再起動せずに自動的に取得されます。この機能は、マルチチャネル・サーバーに新規デバイスまたはトランスフォーマを追加するときに特に便利です。MCSLiteでは同じXML表現のデバイス・メタデータが使用されるため、MCSLiteで新規デバイス記述を簡単に作成およびテストでき、その内容をMCS XMLプロビジョニング・ツールを使用してMCSにアップロードできます。
MCSLiteは、非常に使いやすく設計されています。これを使用するには、最初にWebアプリケーションを作成し、デプロイする必要があります。アプリケーションの開発には、あらゆるWebテクノロジを使用できます。静的ページまたは動的ページのいずれも使用できます。また、OracleAS Wireless XML、あるいはXHTML+XFormsまたはXHTML MPマークアップ言語のいずれかを使用できます。唯一の要件は、アプリケーションへのアクセスにHTTPプロトコルを使用することです。
使用方法は、現在のデプロイがローカルであるかリモートであるかによって異なります。
ローカル・デプロイ: MCSLite Webアプリケーションとともにアプリケーションをデプロイします。最も簡単な方法は、JSP/サーブレットをORACLE_HOME/j2ee/OC4J_Wireless/applications/wdk/wdk-web/WEB-INF
ディレクトリにコピーすることです。この方法は、テストする簡単なアプリケーションがあり、独自のWebアプリケーションを作成およびデプロイしない場合に使用してください。次に、このデプロイ例でMCSLiteを使用する方法の例を示します。
MCSLiteおよびユーザー・アプリケーションのURLはhttp://apphost:port/myApp.jsp
です。
デバイスのブラウザ(シミュレータ)を起動し、アプリケーションのURLを入力します(つまり、アドレス・フィールドに「http://apphost:port/myApp.jsp
」と入力します)。
リモート・デプロイ(推奨): MCSLiteでは、この使用方法をお薦めします。テストするアプリケーションが、(MCSLiteでのテスト成功後に)その内容を変更せずに稼働中のOracleAS Wirelessサーバーにデプロイできる独立したWebアプリケーションであるためです。次に、このデプロイ例でMCSLiteを使用する方法の例を示します。
テストするアプリケーション、およびそのURLはhttp://apphost:port/myApp.jsp
です。
MCSLiteがホスト名MCSLitehostというマシンにデプロイされる場合、MCSLiteコンテンツ取出しサーブレットのURLはhttp://mcslitehost:port/wdk/mcslite
です。
2つのWebアプリケーションは、同じマシンに配置しても配置しなくてもかまいません。このデプロイ例を使用すると、複数の開発者が1つのMCSLiteインスタンスを共有できます。アプリケーションにデバイスまたはシミュレータからアクセスするには、ブラウザに特別なURLを入力します。その特別なURLは、(前述の例を使用すると)http://mcslitehost:port/wdk/mcslite/http/apphost/port/myApp.jsp
です。
この特別なURLを生成する手順は、次のとおりです。
まずMCSLiteのURL(http://mcslitehost:port/wdk/mcslite
)を記述します。
このURLにスラッシュ(/)を追加し、その後にバックエンド・アプリケーションのURL(http://apphost:port/myApp.jsp
)を追加します。結果は、http://mcslitehost:port/wdk/mcslite/http://apphost:port/myApp.jsp
となります。
この新しいURLは無効です。修正するには、アプリケーションのURLのコロン、スラッシュ、スラッシュ(://)とコロン(:)をスラッシュ(/)に変更します。この結果が、特別なURLhttp://mcslitehost:port/wdk/mcslite/http/apphost/port/myApp.jsp
になります。
注意: 特別なURLには簡略フォームがあります。アプリケーションがデプロイされるHTTPポートがポート80(デフォルトのHTTPポート)の場合は、バックエンド・アプリケーションのURLのportの部分を省略できます。プロトコルの部分(http)も省略できます。簡略URLは、http://mcslitehost:port/wdk/mcslite/apphost/myApp.jsp となります。
|
MCSLiteのデプロイ例に関係なく、バックエンド・アプリケーションへのパラメータの送信方法は同じです。通常のブラウザからのパラメータの送信と異なる点はありません。URLの問合せ部分にパラメータを追加するだけで送信できます。たとえば、次の2つのパラメータをアプリケーションに送信するとします。
fname=John and lname=Doe
この場合は、次のようにURLに追加します。
http:// ... /myApp.jsp?fname=John&lname=Doe
注意:
|
MCSLiteでは、MCSと同じURLリライティングとキャッシュ・メカニズムが使用されます。ただし、URLリライティングでは詳細フォームまたは簡略フォームのいずれを使用するかを示す構成パラメータが使用される点が異なります。
ログ・ファイルには、開発者にとって重要な情報が含まれており、アプリケーション・テスト時にデバッグ情報を得るための優れた情報源です。ログ・ファイルに記録されるメッセージには、次の4つのタイプがあります。
ERROR: MCSLiteでのリクエスト処理中に重度(リカバリ不可能)の問題が発生した場合。最も一般的な問題は、バックエンド・アプリケーションのURLが無効、またはバックエンド・アプリケーションから戻されたコンテンツが無効というエラーです。これらエラーおよび他のすべてのエラーで、ログ・ファイルにはその問題の識別に必要なすべての情報が記録されます。
WARNING: リクエスト処理時に問題が発生したが、MCSLiteによってリカバリされ、リクエストが処理された場合。開発者は、このような警告の原因をすべて取り除く必要があります。
INFO: リクエスト処理フローに関する情報メッセージ。
DEBUG: バックエンド・アプリケーションではなく、MCSLite自体の問題に関連する低レベルのメッセージ。MCSLiteに関する不具合と問題の報告時には、ログ・ファイルの情報を使用してください。
ログ・ファイルは、次のいずれかの方法で表示できます。
ORACLE_HOME/j2ee/OC4J_Wireless/applications/wdk/wdk-web/logs
ディレクトリ内のファイルを直接オープンする方法。この場合は、MCSLiteが稼働しているマシン(通常は開発者自身のマシン)に直接アクセスする必要があります。
使用中のPCのHTML Webブラウザを使用して、Webログ・ビューアにアクセスする方法。MCSLiteログ・ビューア(サーブレット)のURLはhttp://mcslitehost:port/wdk/log
です。Webベースのログ・ビューアは、(リモートMCSLiteデプロイなどで)1つのMCSLiteサーバーを開発者グループで共有している場合に便利です。
ログ・ファイルの各メッセージについて、デバイス・リクエストのIPアドレスとセッション情報が提供されます。この情報は、ユーザーが自分のデバイスから送信したリクエストを、別のユーザーのデバイスから送信されたリクエストと区別して見つける場合に役立ちます。
注意: log.xmlファイルのXFM-xxxxという書式のエラー・メッセージは、XFormsプロセッサによって生成されます。 |
MCSLiteの利点の1つは、デフォルトの状態で動作し、構成する必要がないことです。オプションで、詳細な構成処理を実行できます。MCSLiteでは、ログ・ファイルの位置と名前、ロギング・レベル、XML妥当性チェック・モード、デバイスおよびトランスフォーマの自動再ロードの有効化または無効化などの構成が可能です。これらの構成処理を実行するには、MCSLiteのweb.xml
ファイルを編集します。web.xml
はORACLE_HOME/j2ee/OC4J_Wireless/applications/wdk/wdk-web/WEB-INF
にあります。
次に、MCSLiteのweb.xml
内の構成プロパティを示します。
wdk.log.file
: ログ・ファイルへの絶対パス(ディレクトリとファイル名)。たとえば、D:¥wdk¥logs¥wdk.log
のように指定します。また、System.out
またはSystem.err
を指定すると、標準出力または標準エラーを使用できます。値を指定しない場合は、デフォルトのログ・ファイルの位置であるORACLE_HOME/j2ee/OC4J_Wireless/applications/wdkwdk-web/logs/wdk.log
が使用されます。
wdk.log.level
: ログ・ファイルに記録する情報の量を指定します。有効な値は、debug、info、warningおよびerrorです。debugを指定すると、最も多くの情報が生成され、infoを指定すると、その次に多くの情報が生成され、以降は情報量が減少していきます。このプロパティのデフォルト値はinfoです。
xml.validation.mode
: XMLパーサーの妥当性チェック・モードを設定します。有効な値は、trueまたはfalseです。デフォルト値はfalseです。
autoreload.transformers
: トランスフォーマの変更を自動的に検出および再ロードするかどうかを指定します。有効な値は、trueまたはfalseです。デフォルト値はtrueです。
autoreload.devices
: デバイスの変更を自動的に検出および再ロードするかどうかを指定します。有効な値は、trueまたはfalseです。デフォルト値はtrueです。
long.url.format
: 埋込みURLのリライトに、URLの詳細フォーマットまたは簡略フォーマットのいずれを使用するかを指定します。有効な値は、trueまたはfalseです。デフォルト値はtrueです。
OracleAS Wirelessサーバーでは、すべてのデバイス記述がデータベースに格納されます。ただし、MCSLiteを簡素化するために、データベース接続は不要で、各デバイス記述はXMLファイルに格納されます。デバイスのXMLファイルは、ORACLE_HOME/j2ee/OC4J_Wireless/applications/wdk/wdk-web/repository
にあります。各XMLファイルには、単一のデバイスの属性と特性を記述するメタデータが含まれます。
次に、MCSLiteが必要とする重要なデバイス・プロパティの一部を示します。
Name: デバイスの一意の名前。
UserAgents: デバイスのメタデータには、複数のユーザー・エージェントの値が含まれている場合があります。これは、デバイスのメタデータが複数の物理デバイスと一致する可能性があることを意味します。ユーザー・エージェントはデバイスの検出に使用されます。
Transformers: 特定のデバイスに使用する必要があるトランスフォーマの名前が含まれます。マークアップ言語ごとに1つずつ、複数のトランスフォーマ値があります。
DefaultMarkupLanguage: デバイスのMIMEタイプ。Accept-Charsetとともに、デバイスに送信されるレスポンスのコンテンツ・タイプを構成します。
Accept-Charset: デバイスのエンコーディング。DefaultMarkupLanguageとともに、デバイスに送信されるレスポンスのコンテンツ・タイプを構成します。
DeviceClass: デバイスのクラス(microbrowser、pdabrowser、pcbrowser、voice、micromessengerなど)。
DeviceHeightとDeviceWidth: デバイス画面の高さと幅。
OracleAS Wireless WDKには、ワイヤレス・アプリケーションの開発に役立つログ・ファイルが用意されています。この項では、WDKログ・ファイルに記録される情報を詳細に説明します。
ログ・ファイルに記録される情報の量は、WEB-INF/web.xml内のwdk.log.levelパラメータを変更することによって構成できます。このパラメータの有効な値は、情報量の最も多いレベルから最も少ないレベルまで順に、debug、info、warningおよびerrorです。このパラメータのデフォルト値はinfoです。このレベルでは、次の種類の情報がログ・ファイルに記録されます。
リクエストURL: 現在処理中のリクエストに関連付けられているURL文字列および問合せパラメータです。たとえば、http://myhost:80/myapp/foo.jsp?param1=value1です。
クライアントから受信したリクエストHTTPヘッダー: クライアント(デバイス)から受信したすべてのリクエストHTTPヘッダーがリストされます。このリストの重要なヘッダーの1つはuser-agentヘッダーで、その値はデバイス検出に使用されます。
検出されたデバイス: このデバイスが、user-agentヘッダーに基づいて検出されたデバイスであることをユーザーに通知します。この情報は、問題が生じた場合に確認する必要があります。
バックエンド・アプリケーションに送信したリクエストHTTPヘッダー: バックエンド・アプリケーションに送信したすべてのリクエストHTTPヘッダーがリストされます。仮想ブラウザとして、WDKは元のヘッダーの一部を変更し、別のヘッダーを追加します。
バックエンド・アプリケーションから受信したレスポンスHTTPヘッダー: バックエンド・アプリケーションから受信したすべてのレスポンスHTTPヘッダーがリストされます。これらのヘッダーはWDKによってレスポンスの処理に使用され、クライアント(デバイス)には送信されないことに注意してください。
バックエンド・アプリケーションからのXML: バックエンド・アプリケーションからの正確なXML文字列のレスポンスを示します。
XMLのタイプとバージョン: WDKは、XMLのタイプ(Simple Result、XHTML+XFORMSまたはXHTML-MP)とバージョンを検出しようとします。検出結果が、ログのこのセクションに示されます。この情報に基づいて、WDKは使用する適切なトランスフォーマを選択します。
WDKレスポンス: クライアント(デバイス)に送信した最終的なマークアップ言語とHTTPヘッダーを示します。この最終的な結果は、バックエンド・アプリケーションから受信したXMLレスポンスにトランスフォーマ(XSLTまたはJavaトランスフォーマ)を適用することによって取得されます。
debugログ・レベルが使用されると、さらに詳細なログ・メッセージが生成されます。デバッグ・メッセージは次のとおりです。
トランスフォーマのロード: 成功したトランスフォーマのロードを示します。
デバイスのロード: 成功したデバイスのロードを示します。
デバイスとトランスフォーマのマッピング: 各デバイスに複数のトランスフォーマが関連付けられています(各マークアップ・タイプに対して1つずつ)。このデバッグ・メッセージでは、デバイスとトランスフォーマ間のマッピングが示されます。
バックエンドURL: このリクエストのバックエンドURLを示します。
バックエンド・レスポンス・コードとレスポンス・メッセージ: このリクエストのバックエンド・レスポンス・コードとレスポンス・メッセージを示します。
トランスフォーマに渡されたXML: トランスフォーマに渡されたXML文字列を示します。このXML文字列は、バックエンド・アプリケーションから受信した元のXML文字列とは異なります。この文字列は注釈からの結果である中間の形式で、トランスフォーマに対する入力として使用されます。
次の例は、debugログ・レベルのWDKログ・ファイルからの抜粋(例8-1を参照)で、UP Simulator 4.1.1を使用した1回のリクエスト/レスポンス型サイクルの成功例です。
ヘッダーには、次の情報が含まれます。
クライアントのIPアドレス: 127.0.0.1
セッションID: fe88712959d4470794599b62102e61df
ログ・レベル: INFO
タイムスタンプ: [Fri, 23 May 2003 10:41:11 PDT]
例8-1 WDKログ・ファイルのサンプル
127.0.0.1 - - fe88712959d4470794599b62102e61df - - INFO : [Fri, 23 May 2003 10:41:11 PDT] **************** Start of serving request *************** 127.0.0.1 - - fe88712959d4470794599b62102e61df - - INFO : [Fri, 23 May 2003 10:41:11 PDT] Request URL: http://localhost:9010/wdk/mcslite/ 127.0.0.1 - - fe88712959d4470794599b62102e61df - - INFO : [Fri, 23 May 2003 10:41:11 PDT] Request HTTP headers received from client: user-agent: OWG1 UP/4.1.20a UP.Browser/4.1.20a-XXXX UP.Link/4.1.HTTP-DIRECT x-upfax-accepts: none x-up-devcap-max-pdu: 2984 x-up-devcap-iscolor: 0 x-up-devcap-numsoftkeys: 2 accept: application/x-hdmlc, application/x-up-alert, application/x-up-cacheop, application/x-up-device, application/x-up-digestentry, application/vnd.wap.wml, text/x-wap.wml, text/vnd.wap.wml, application/vnd.wap.wmlscript, text/vnd.wap.wmlscript, application/vnd.uplanet.channel, application/vnd.uplanet.list, text/x-hdml, text/plain, image/vnd.wap.wbmp, image/bmp, application/remote-printing text/x-hdml;version=3.1, text/x-hdml;version=3.0, text/x-hdml;version=2.0, image/bmp, text/html x-up-devcap-smartdialing: 1 x-up-devcap-msize: 8,18 accept-charset: ISO-8859-1, UTF-8, * x-up-devcap-screenpixels: 171,108 host: localhost:9010 accept-language: en x-up-devcap-screendepth: 1 content-type: application/x-www-form-urlencoded x-up-devcap-charset: ISO-8859-1 x-up-subno: rhalimma_st3010pc cookie: JSESSIONID=fe88712959d4470794599b62102e61df x-up-devcap-immed-alert: 1 127.0.0.1 - - fe88712959d4470794599b62102e61df - - INFO : [Fri, 23 May 2003 10:41:11 PDT] Request HTTP headers sent to back end application: x-oracle-user.location.addresslastline: Room 200 x-oracle-service.home.url: http://localhost:9000/omsdk/rm x-up-devcap-screendepth: 1 host: localhost:9010 x-up-devcap-numsoftkeys: 2 x-oracle-user.deviceid: 1234 x-oracle-orig-user-agent: OWG1 UP/4.1.20a UP.Browser/4.1.20a-XXXX UP.Link/4.1.HTTP-DIRECT accept: application/vnd.oracle.xhtml+xforms, text/vnd.oracle.OracleAS Wireless XML, application/vnd.wap.xhtml+xml, application/xhtml+xml;profile="http://xmlns.oracle.com/ias/dtds/xhtml+xforms", application/xhtml+xml;profile="http://www.wapforum.org/xhtml", application/xhtml+xml, application/xml, text/xml, application/vnd.oracle.xad, */*, */* x-oracle-service.parent.url: http://localhost:9000/omsdk/rm x-oracle-user.location.addressline2: Apt# 1004 x-oracle-user.location.addressline1: 1007 Broadway St x-oracle-user.location.block: Block A x-oracle-user.locale: US x-oracle-user.authkind: unauthenticated x-oracle-user.displayname: Jon Smith x-oracle-user.location.type: profile x-up-devcap-max-pdu: 2984 x-oracle-user.userkind: registered x-up-devcap-iscolor: 0 x-up-devcap-screenpixels: 171,108 x-oracle-mcs.character.encoding: UTF-8 x-oracle-user.location.postalcodeext: 3158 accept-charset: ISO-8859-1, UTF-8, * accept-charset: UTF-8, * x-oracle-user.location.companyname: Company XYZ x-oracle-home.url: http://localhost:9000/omsdk/rm cookie: JSESSIONID=fe88712959d4470794599b62102e61df x-up-devcap-immed-alert: 1 x-oracle-module.callback.url: http://localhost:9000/omsdk/rm x-upfax-accepts: none x-up-devcap-smartdialing: 1 user-agent: PTG/2.0 (Oracle9iAS Wireless 9.0.4.0; media="handheld"; paged="1") x-oracle-user.location.postalcode: 94104 x-up-devcap-msize: 8,18 x-oracle-user.location.city: San Francisco x-oracle-user.location.country: USA content-type: application/x-www-form-urlencoded x-oracle-user.name: jsmith x-oracle-user.location.y: 200.8 x-oracle-user.location.x: 135.9 x-oracle-user.location.county: San Francisco x-oracle-orig-accept: application/x-hdmlc, application/x-up-alert, application/x-up-cacheop, application/x-up-device, application/x-up-digestentry, application/vnd.wap.wml, text/x-wap.wml, text/vnd.wap.wml, application/vnd.wap.wmlscript, text/vnd.wap.wmlscript, application/vnd.uplanet.channel, application/vnd.uplanet.list, text/x-hdml, text/plain, image/vnd.wap.wbmp, image/bmp, application/remote-printing text/x-hdml;version=3.1, text/x-hdml;version=3.0, text/x-hdml;version=2.0, image/bmp, text/html x-up-subno: rhalimma_st3010pc accept-language: en x-up-devcap-charset: ISO-8859-1 x-oracle-module.callback.label: Home x-oracle-user.location.state: CA 127.0.0.1 - - fe88712959d4470794599b62102e61df - - DEBUG : [Fri, 23 May 2003 10:41:11 PDT] Back end URL: http://localhost:9010/mcs/examples/index.jsp 127.0.0.1 - - fe88712959d4470794599b62102e61df - - DEBUG : [Fri, 23 May 2003 10:41:11 PDT] Back end response code: 200 ; response message: OK 127.0.0.1 - - fe88712959d4470794599b62102e61df - - INFO : [Fri, 23 May 2003 10:41:11 PDT] Response HTTP headers received from back end application: x-oracle-wireless.referer.url: http://localhost:9010/mcs/examples/index.jsp content-type: application/vnd.oracle.xhtml+xforms; charset=UTF-8 x-oracle-wireless.base.url: http://localhost:9010/mcs/examples/index.jsp connection: Close date: Fri, 23 May 2003 17:41:10 GMT server: Oracle9iAS (9.0.3.0.0) Containers for J2EE content-length: 994 127.0.0.1 - - fe88712959d4470794599b62102e61df - - INFO : [Fri, 23 May 2003 10:41:11 PDT] XML Result from backend: <?xml version = "1.0" encoding = "UTF-8" standalone="yes" ?> <html profile="http://xmlns.oracle.com/ias/dtds/xhtml+xforms/0.9.0/1.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:style="urn:oracle:iasw-internal:style.1.0" xmlns:extra="urn:oracle:iasw-internal:mxml.1.0"> <head> <title>Oracle9iAS Wireless Examples</title> <style type="text/css"> .title {font-style: italic; color: blue; font-size: xx-large} .menu {font-style: italic; color: blue; font-size: x-large} li {font-weight: bold; color: blue} </style> </head> <body> <nl style="list-style-type: decimal"> <label class="title">Oracle9iAS Wireless Examples</label> <li class="menu" href="xhtml%2Bxforms/index.jsp">XHTML+XFroms Examples</li> <li class="menu" href="xhtml%2Bmp/index.jsp">XHTML MP Examples</li> <li class="menu" href="mobile-xml/index.jsp">OracleAS Wireless XML Examples</li> </nl> </body> </html> 127.0.0.1 - - fe88712959d4470794599b62102e61df - - INFO : [Fri, 23 May 2003 10:41:11 PDT] XML content info - Type: XHTML, version: 0.9.0 127.0.0.1 - - fe88712959d4470794599b62102e61df - - INFO : [Fri, 23 May 2003 10:41:11 PDT] Transformer that will be used: xforms-wml11-openwave 127.0.0.1 - - fe88712959d4470794599b62102e61df - - DEBUG : [Fri, 23 May 2003 10:41:11 PDT] The XML passed to transformer: <html profile="http://xmlns.oracle.com/ias/dtds/xhtml+xforms/0.9.0/1.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:style="urn:oracle:iasw-internal:style.1.0" xmlns:extra="urn:oracle:iasw-internal:mxml.1.0" xmlns:mxml="http://xmlns.oracle.com" style:mheight="0mm" style:mwidth="0mm" style:word-spacing="normal" style:padding-top="0" style:text-align="justify" style:border-top-color="#000000" style:border-right-style="none" style:font-size="medium" style:padding-bottom="0" style:margin-right="0" style:list-style-type="disc" style:vertical-align="baseline" style:border-bottom-color="#000000" style:pause-after="none" style:width="0px" style:speech-rate="default" style:border-left-width="medium" style:speak="normal" style:float="none" style:text-decoration="none" style:padding-right="0" style:border-right-color="#000000" style:list-style-image="none" style:background-attachment="scroll" style:clear="none" style:stress="none" style:font-family="serif,san-serif" style:margin-top="0" style:letter-spacing="normal" style:font-variant="normal" style:border-top-width="medium" style:margin-bottom="0" style:border-left-style="none" style:speak-numeral="none" style:background-image="none" style:pause-before="none" style:volume="default" style:border-bottom-width="medium" style:pitch="default" style:text-transform="none" style:list-style-position="outside" style:padding-left="0" style:margin-left="0" style:border-right-width="medium" style:color="#000000" style:text-indent="0" style:border-top-style="none" style:border-left-color="#000000" style:height="0px" style:font-weight="400" style:background-repeat="repeat" style:font-style="normal" style:pitch-range="default" style:border-bottom-style="none" style:voice-family="neutral" style:speak-header="once" style:display="inline" extra:iaswhref="http://localhost:9010/wdk/mcslite/?PAckey=4!" extra:newdoc="true"><extra:param extra:name="PAckey" extra:value="4!" extra:hidden="true"/> <head style:border-left-width="medium" style:border-left-style="none" style:border-left-color="#000000" style:display="inline"><extra:messages/><extra:patparams/> <title style:border-left-width="medium" style:border-left-style="none" style:border-left-color="#000000" style:display="inline">Oracle9iAS Wireless Examples</title> <style type="text/css" style:border-left-width="medium" style:border-left-style="none" style:border-left-color="#000000" style:display="inline"> .title {font-style: italic; color: blue; font-size: xx-large} .menu {font-style: italic; color: blue; font-size: x-large} li {font-weight: bold; color: blue} </style> <extra:displaypage page="1" deck="1"/></head> <body __length__="13" style:border-left-width="medium" style:border-left-style="none" style:border-left-color="#000000" style:display="block" extra:emwidth="0" extra:pxwidth="0" extra:emheight="0" extra:pxheight="0" extra:random="30274" extra:softkeys="2" extra:paged="true"><extra:page page="1" pagelength="342" deck="1" extra:expand="true"> <nl style="list-style-type: decimal" __length__="70" style:white-space="nowrap" style:list-style-type="decimal" style:border-left-width="medium" style:margin-top="0.5em" style:margin-bottom="0.5em" style:border-left-style="none" style:border-left-color="#000000" style:display="block" extra:uid="XF1" extra:expand="true"> <label class="title" __length__="53" style:border-top-color="#0000ff" style:font-size="xx-large" style:border-bottom-color="#0000ff" style:border-left-width="medium" style:border-right-color="#0000ff" style:margin-top="0" style:margin-bottom="0" style:border-left-style="none" style:color="#0000ff" style:border-left-color="#0000ff" style:font-style="italic" style:display="inline">Oracle9iAS Wireless Examples</label> <li class="menu" href="xhtml%2Bxforms/index.jsp" __length__="78" extra:abshref="http://localhost:9010/mcs/examples/xhtml%2Bxforms/index.jsp" extra:iaswhref="/wdk/mcslite?PAckey=5!" extra:iaswphref="/wdk/mcslite?PAckey=%PAckey!" extra:iaswpkhref="5" style:border-top-color="#0000ff" style:font-size="x-large" style:border-bottom-color="#0000ff" style:border-left-width="medium" style:text-decoration="underline" style:border-right-color="#0000ff" style:margin-top="0" style:margin-bottom="0" style:border-left-style="none" style:color="#0000ff" style:border-left-color="#0000ff" style:font-weight="700" style:font-style="italic" style:display="list-item">XHTML+XFroms Examples</li> <li class="menu" href="xhtml%2Bmp/index.jsp" __length__="70" extra:abshref="http://localhost:9010/mcs/examples/xhtml%2Bmp/index.jsp" extra:iaswhref="/wdk/mcslite?PAckey=6!" extra:iaswphref="/wdk/mcslite?PAckey=%PAckey!" extra:iaswpkhref="6" style:border-top-color="#0000ff" style:font-size="x-large" style:border-bottom-color="#0000ff" style:border-left-width="medium" style:text-decoration="underline" style:border-right-color="#0000ff" style:margin-top="0" style:margin-bottom="0" style:border-left-style="none" style:color="#0000ff" style:border-left-color="#0000ff" style:font-weight="700" style:font-style="italic" style:display="list-item">XHTML MP Examples</li> <li class="menu" href="mobile-xml/index.jsp" __length__="71" extra:abshref="http://localhost:9010/mcs/examples/mobile-xml/index.jsp" extra:iaswhref="/wdk/mcslite?PAckey=7!" extra:iaswphref="/wdk/mcslite?PAckey=%PAckey!" extra:iaswpkhref="7" style:border-top-color="#0000ff" style:font-size="x-large" style:border-bottom-color="#0000ff" style:border-left-width="medium" style:text-decoration="underline" style:border-right-color="#0000ff" style:margin-top="0" style:margin-bottom="0" style:border-left-style="none" style:color="#0000ff" style:border-left-color="#0000ff" style:font-weight="700" style:font-style="italic" style:display="list-item">OracleAS Wireless XML Examples</li> </nl> </extra:page></body> </html> 127.0.0.1 - - fe88712959d4470794599b62102e61df - - INFO : [Fri, 23 May 2003 10:41:11 PDT] Mobile WDK Response: Content-Type: text/vnd.wap.wml; charset=UTF-8 Content-Length: 1384 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE wml PUBLIC "-//PHONE.COM//DTD WML 1.1//EN" "http://www.phone.com/dtd/wml11.dtd"> <wml><head><meta http-equiv="Cache-Control" forua="true" content="max-age=10"/></head><template><do type="accept" name="do_accept" label="Ok"><refresh/></do></template><card><onevent type="onenterforward"><go href="#ID117"/></onevent><onevent type="onenterbackward"><prev/></onevent></card><card id="ID117" title="Oracle9iAS Wireless Examples"><p mode="nowrap"><big><i>Oracle9iAS Wireless Examples</i></big><select name="mID117"><option value="5">XHTML+XFroms Examples</option><option value="6">XHTML MP Examples</option><option value="7">OracleAS Wireless XML Examples</option><option title="Ok">[Back]<onevent type="onpick"><prev/></onevent></option></select><do type="accept" name="do_accept" label="Ok"><go href="#_nav"><setvar name="_h" value="$(mID117)"/></go></do></p></card><card id="_nav" onenterforward="/wdk/mcslite?PAckey=$(_h)!"><onevent type="onenterbackward"><prev/></onevent></card><card id="_form"><onevent type="onenterforward"><go method="post" href="http://localhost:9010/wdk/mcslite/?r=30274"><postfield name="PAckey" value="4!"/><postfield name="$(_sb)" value="$(_sv)"/><postfield name="PATpage" value="$(PATpage)"/><postfield name="PATdeck" value="$(PATdeck)"/></go></onevent><onevent type="onenterbackward"><prev/></onevent></card></wml> 127.0.0.1 - - fe88712959d4470794599b62102e61df - - INFO : [Fri, 23 May 2003 10:41:11 PDT] **************** End of serving request ***************
この項では、WDKで発生する一般的な誤りの一部を説明します。
バックエンド・アプリケーションのURLの誤り。たとえば、バックエンドURL http://somehost:8080/myapp/first.jspに基づいた正しいURLと誤りのあるURLの例は、次のとおりです。
正しいURL: http://localhost:9010/wdk/mcslite/http/somehost/9090/myapp/first.jsp
誤りのあるURL: http://localhost:9010/wdk/mcslite/http/somehost/9090/myap/first.jsp
URLに誤りがあると、エラーの原因(この場合は404 Not Found)を詳細に説明したエラー・ページが表示されます。
バックエンドURLの値は、ログ・ファイルの「Back end URL」の下の記述で確認できます。
ログ・エントリの例:
127.0.0.1 - - 3b34912b68474bc1b1defa87e74dbd1e - - DEBUG : [Fri, 23 May 2003 11:06:45 PDT] Back end URL: http://localhost:9010/mcs/examples/mobile-xmll/index.jsp 127.0.0.1 - - 3b34912b68474bc1b1defa87e74dbd1e - - DEBUG : [Fri, 23 May 2003 11:06:45 PDT] Back end response code: 404 ; response message: Not Found 127.0.0.1 - - 3b34912b68474bc1b1defa87e74dbd1e - - ERROR : [Fri, 23 May 2003 11:06:45 PDT] javax.servlet.ServletException: HTTP(S) Error: 404 : Not Found
バックエンド・アプリケーションからのcontent-typeレスポンス・ヘッダーの誤り。たとえば、XFormsページを開発するときは、コンテンツ・タイプをapplication/vnd.oracle.xhtml+xformsに設定する必要があります。この値を設定しないと、WDKのコンテンツ検出ロジックでエラーが発生し、最終的なマークアップ言語が誤って生成されます。
バックエンド・アプリケーションから受信したコンテンツ・タイプの値は、ログ・ファイルの「Response HTTP headers received from back-end application」の下の記述で確認できます。
ログ・エントリの例:
127.0.0.1 - - 3b34912b68474bc1b1defa87e74dbd1e - - INFO : [Fri, 23 May 2003 10:59:27 PDT] Response HTTP headers received from back end application: x-oracle-wireless.referer.url: http://localhost:9010/mcs/examples/index.jsp content-type: application/vnd.oracle.xhtml+xforms; charset=UTF-8 x-oracle-wireless.base.url: http://localhost:9010/mcs/examples/index.jsp connection: Close date: Fri, 23 May 2003 17:59:27 GMT server: Oracle9iAS (9.0.3.0.0) Containers for J2EE content-length: 994
バックエンド・アプリケーションからのXMLコンテンツの誤り。バックエンド・アプリケーションからのXMLコンテンツは整形式のXML文書であることが必要です。つづりの間違いまたは終了タグの不足の場合は、WDKからエラー・コード500が戻されます。この場合は、クライアント・デバイスにエラー・メッセージ(「XMLを解析できませんでした。無効なXMLが含まれています。」)が表示されます。
バックエンド・アプリケーションからのXMLコンテンツは、ログ・ファイルの「XML Result from backend」の下の記述で確認できます。
ログ・エントリの例:
127.0.0.1 - - 3b34912b68474bc1b1defa87e74dbd1e - - INFO : [Fri, 23 May 2003 11:00:50 PDT] XML Result from backend: <?xml version = "1.0" encoding = "UTF-8" standalone="yes" ?> <html profile="http://xmlns.oracle.com/ias/dtds/xhtml+xforms/0.9.0/1.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:style="urn:oracle:iasw-internal:style.1.0" xmlns:extra="urn:oracle:iasw-internal:mxml.1.0"> <head> <title>Oracle9iAS Wireless Examples</title> <style type="text/css"> .title {font-style: italic; color: blue; font-size: xx-large} .menu {font-style: italic; color: blue; font-size: x-large} li {font-weight: bold; color: blue} </style> </head> <body> <nl style="list-style-type: decimal"> <label class="title">Oracle9iAS Wireless Examples</label> <li class="menu" href="xhtml%2Bxforms/index.jsp">XHTML+XFroms Examples</li> <li class="menu" href="xhtml%2Bmp/index.jsp">XHTML MP Examples</li> <li class="menu" href="mobile-xml/index.jsp">OracleAS Wireless XML Examples</li> </nl> <body> </html> 127.0.0.1 - - 3b34912b68474bc1b1defa87e74dbd1e - - ERROR : [Fri, 23 May 2003 11:00:50 PDT] oracle.wireless.sdk.SdkException: The xml could not be parsed. It contains invalid xml.
アプリケーション開発者は、優れたロケーション・サービスを新たに作成するか、またはロケーション情報を使用して既存のアプリケーションを拡張できます。このためには、次の専用サービスが必要です。
モバイル・ポジショニング: アプリケーションで、ユーザーの現在のロケーションを取得および設定できます。
次の種類のロケーション・サービスがあります。
ジオコーディング: 住所または固定回線の電話番号の地理的位置を検索します。また、地理的位置を住所または電話番号に関連付ける逆の機能もあります。
マッピング: ロケーション周辺地域のマップ・イメージ、一連のロケーションをカバーするマップ、ルートのマップなどを取得します。
運転方向: 2つの住所またはロケーションの間の運転方向を取得します。
ビジネス・ディレクトリ: 住所やロケーション周辺のビジネス、都市、州または国などのビジネスを検出します。
OracleAS Wireless WDKには、これらのロケーション・サービスのコンポーネントにアクセスするためのApplication Program Interface(API)が用意されています。開発者は、これらのAPIからOracleAS Wireless Webサービスにアクセスして、関連するコンテンツ・サービス・プロバイダとの完全なOracleAS Wireless環境を設定することなく、アプリケーションを開発、デバッグおよびテストできます。
次の各項では、重要なAPIコールの一部を、いくつかの例に沿って簡単に説明します。APIの詳細は、WDKとともに提供されるJavadocを参照してください。
モバイル・ポジショニング・サービスを使用すると、モバイル・ユーザーの現在のロケーションを取得および設定できます。このサービスは、OracleAS Wireless WDKでWebサービスとして実装されています。アプリケーションでは、インターネット上のどこからでも任意のプログラミング・モデルを使用して、モバイル・ユーザーの現在のロケーションを取得および設定できます。
oracle.panama.mp.soap.MPSoapClient
クラスによって、クライアントのSOAPコールがラップされ、Javaプログラミング・インタフェースでサービスが公開されます。クライアントのJavaプログラムでは、モバイル・ユーザーのロケーションを取得および設定する前に、WebサービスのURLとサービスIDを使用してこのクラスのオブジェクトを最初に作成しておく必要があります。WebサービスのURLは、OracleAS Wirelessサーバー上のロケーションWebサービスのSOAPルーターで、たとえば、http://myaswserver.oracle.com:port/location/webservices
です。サービスIDはSOAPのサービスIDで、たとえばurn:MobilePositionServer
です。
ロケーションの取得
モバイル・ユーザーのロケーションを取得するには、次の2つのメソッドを使用できます。
getPositionSimple(String username, String password, String msid)
getPosition(String username, String password, String msid, boolean getLatestLocationOnly)
getPositionSimpleメソッドのパラメータusernameとpasswordは、認証目的で使用されます。3番目のパラメータMSIDは、ロケーション取得がリクエストされているユーザーのモバイル・ステーションIDです。MSIDは通常、ユーザーの携帯電話の番号です。リクエストが成功すると、このファンクションによって、緯度と経度を表す2つの倍精度数の配列が戻されます。
getPosition
メソッドの最初の3つのパラメータはgetPositionSimple
メソッドの場合と同じです。最後のパラメータは、コール元がモバイル・ステーションの認識済最新ロケーションの取得を要求しているかどうかを示すブール値です。trueに設定されている場合、ポジショニング操作は実行されずに、OracleAS Wirelessサーバーからモバイル・ステーションの認識済最新ロケーションが戻されます。キャッシュされているロケーションがOracleAS Wirelessサーバーに存在しない場合は例外が発生します。falseに設定されている場合は、経過期間がシステムのデフォルトのサービス品質の範囲内であるかぎり、キャッシュされているロケーションがOracleAS Wirelessサーバーから戻されます。それ以外の場合は、OracleAS Wirelessサーバーによってモバイル・ポジショニング操作が実行され、モバイル・ステーションの現在のロケーションが取得されます。getPosition
メソッドの戻り値はユーザーのロケーションが(XMLフォーマットで)記述された文字列で、次のようなスキーマです。
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" elementFormDefault="qualified"> <xsd:element name="RESPONSE "> <xsd:complexType> <xsd:sequence> <xsd:element ref="TIMESTAMP"/> <xsd:element ref="POS"/> <xsd:element ref="VELOCITY" minOccurs="0"/> <xsd:element ref="BEARING" minOccurs="0"/> <xsd:element ref="ALTITUDE" minOccurs="0"/> <xsd:element ref="ALT_UNCERTAINTY" minOccurs="0"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="ALTITUDE" type="xsd:string"/> <xsd:element name="ALT_UNCERTAINTY" type="xsd:string"/> <xsd:element name="BEARING" type="xsd:string"/> <xsd:element name="LAT" type="xsd:string"/> <xsd:element name="LONG" type="xsd:string"/> <xsd:element name="POS"> <xsd:complexType> <xsd:sequence> <xsd:element ref="LONG"/> <xsd:element ref="LAT"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="TIMESTAMP" type="xsd:string"/> <xsd:element name="VELOCITY" type="xsd:string"/> </xsd:schema>
<POS>
要素には、ロケーションの緯度と経度が含まれます。
<TIMESTAMP>
要素には、ロケーション取得時のタイムスタンプが含まれます。時間には、常にグリニッジ標準時が使用されます。たとえば、2003-03-12 20:01:06 GMTのように記述されます。
オプションの<VELOCITY>
要素では、モバイル・デバイスの速度(m/秒)が指定されます。
オプションの<BEARING>
要素では、北からの時計回りで方位角(緯度)が指定されます。
オプションの<ALTITUDE>
要素では、モバイル・デバイスの海抜高度(m)が指定されます。
usernameパラメータとpasswordパラメータで識別されるコール元は、有効なOracleAS Wirelessユーザーであり、MSIDに関連付けられているユーザーのロケーションにアクセスするためのロケーション認可が付与されている必要があります。usernameとpasswordによってコール元を認証できない場合、またはコール元がロケーション情報へのアクセスを許可されていない場合は、例外が発生します。
ロケーションの設定
モバイル・デバイスは、全地球測位システム(GPS)を介して提供されるそのモバイル・デバイスの現在のロケーションを、OracleAS Wirelessサーバーに送信できます。送信された現在のロケーションはサーバーにキャッシュされ、モバイル・ポジショニングAPIとプライバシAPIを使用して問い合せることができます。デバイスの現在のロケーションをOracleAS Wirelessサーバーに転送するクライアント・アプリケーション・プログラムを作成する必要があります。Javaクライアントは、oracle.panama.mp.soap.MPSoapClient
クラスのsetPosition(String xmlReq)
メソッドをコールできます。このファンクションは、位置データを表す1つのStringパラメータを取ります。データはXMLフォーマットで、次のスキーマに準拠している必要があります。
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" elementFormDefault="qualified"> <xsd:element name="MP_GPS"> <xsd:complexType> <xsd:sequence> <xsd:element ref="USERNAME"/> <xsd:element ref="PASSWORD"/> <xsd:element ref="MSID"/> <xsd:element ref="TIME" minOccurs="0"/> <xsd:element ref="GMT" minOccurs="0"/> <xsd:element ref="POS"/> <xsd:element ref="ALTITUDE" minOccurs="0"/> <xsd:element ref="ALT_UNCERTAINTY" minOccurs="0"/> <xsd:element ref="VELOCITY" minOccurs="0"/> <xsd:element ref="BEARING" minOccurs="0"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="ALTITUDE" type="xsd:string"/> <xsd:element name="ALT_UNCERTAINTY" type="xsd:string"/> <xsd:element name="BEARING" type="xsd:string"/> <xsd:element name="GMT" type="xsd:string"/> <xsd:element name="LAT" type="xsd:string"/> <xsd:element name="LONG" type="xsd:string"/> <xsd:element name="MSID" type="xsd:string"/> <xsd:element name="PASSWORD" type="xsd:string"/> <xsd:element name="POS"> <xsd:complexType> <xsd:sequence> <xsd:element ref="LAT"/> <xsd:element ref="LONG"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="TIME" type="xsd:string"/> <xsd:element name="USERNAME" type="xsd:string"/> <xsd:element name="VELOCITY" type="xsd:string"/> </xsd:schema>
<USERNAME>
要素および<PASSWORD>
要素は、リクエストを許可するためにOracleAS Wirelessサーバーで使用されます。
<MSID>
要素は、モバイル・デバイスまたはユーザーのモバイル・ステーションIDです。
オプションの<TIME>
要素は、このロケーションがGPSで生成された時刻を示します。この値が不明な場合は、OracleAS Wirelessサーバーがデータを受信した時間が使用されます。
オプションの<VELOCITY>
要素では、モバイル・デバイスの速度(m/秒)が指定されます。
オプションの<BEARING>
要素では、北からの時計回りで方位角(緯度)が指定されます。
オプションの<ALTITUDE>
要素では、モバイル・デバイスの海抜高度(m)が指定されます。
モバイル・ポジショニングの例
次に、SOAPクライアントを使用してOracleAS Wirelessサーバーに対する位置を設定および取得する方法の例を示します。
MPSoapClient mpsc = new MPSoapClient("http://usunnab16.us.oracle.com:5555/location/webservices", "urn:MobilePositionServer"); String xmlReq = "<?xml version= '1.0' encoding='ISO-8859-1' standalone='yes'?>\n" + "<MP_GPS>\n" + "<MSID>6038973096</MSID>\n" + "<POS>\n" + "<LAT>42.1576</LAT>\n" + "<LONG>-122.34</LONG>\n" + "</POS>\n"+ "</MP_GPS>"; System.out.println(mpsc.setPosition(xmlReq)); // NOTE: Need to change getPosition call// double[] ret = mpsc.getPositionSimple("", "", "6038973096"); System.out.println(ret[0] + "," + ret[1]);
クライアント側のLBS WebサービスAPIは、実質的にはOracleAS Wirelessサーバー内のAPIと同じです。次のいくつかの例で、これについて説明します。最も問題とされる違いは、set()
ファンクションではサーバーの指定が必要なことです。OracleAS Wirelessサーバー内のアプリケーションでは、このようなターゲット・サーバーの指定は必要ありません。
ジオコーディング
ジオコーディング: 地理上の座標(緯度と経度)を住所に割り当てます。
一括ジオコーディング: 広範囲にわたる住所の集合に対するジオコーディングを1回の操作で実行します。
逆ジオコーディング: 住所を地理上の座標(緯度と経度)に割り当てます。
一括逆ジオコーディング: 一連の住所を地理上の座標(緯度と経度)に割り当てます。
電話番号ジオコーディング: 住所を固定電話番号に割り当てます。
一括電話番号ジオコーディング
逆電話番号ジオコーディング: 一連の電話番号を住所に割り当てます。
一括逆電話番号ジオコーディング
ジオコーディングでは次の機能がサポートされます。
次に、ジオコーディング操作の例を示します。
... public static void main(String args[]) { SpatialManager.set("http://myaswserver.oracle.com:port/location/webservices"); Location locs[] = SpatialManager.getGeocoder().geocodeAddress( new LocationImpl( new PointImpl(0, 0), "Oracle", "1", new String[] { "Oracle Dr" }, "", "Nashua", "NH", "03062", "", "US"), ""); if(locs != null) { for(int i = 0; i < locs.length; i++) System.out.println(i + ": " + locs[i]); } else System.out.println("null"); }
マッピング
マッピングでは次の機能がサポートされます。
ラベル付き地点とマーク付き地点を含むまたは含まない地図を表示します。
全運転方向または1つの経路の地図を表示します(運転方向サービス内の同じ機能)。
次に、マーク付き地点が1つあるマッピングの例を示します。
... public static void main(String args[]) { SpatialManager.set("http://myaswserver.oracle.com:port/location/webservices"); Location adr1[] = SpatialManager.getGeocoder().geocodeAddress( new LocationImpl( new PointImpl(0, 0), "NEDC", "1", new String[] { "Oracle Dr" }, "", "Nashua", "NH", "03062", "", "US"), ""), adr2[] = SpatialManager.getGeocoder().geocodeAddress( new LocationImpl( new PointImpl(0, 0), "HQ", "500", new String[] { "Oracle Parkway" }, "", "Redwood City", "CA", "94065", "", "US"), ""); System.out.println( SpatialManager.getMapper().getMapURL( adr1[0], ImageFormats.GIF, 800, 600, false)); ... } ...
運転方向
運転方向のコンポーネントでは、次の機能がサポートされます。
住所または地理的地点の座標間の運転方向を決定します。
全方向または1つの経路の地図を表示します
運転方向の簡易ジオメトリを提供します。
リクエストされたルートの方向、距離、所要時間をテキストで提供します。
次の例は、2つの住所間の運転方向を示しています。
... public static void main(String args[]) { SpatialManager.set("http://myaswserver.oracle.com:port/location/webservices"); Location adr1[] = SpatialManager.getGeocoder().geocodeAddress( new LocationImpl( new PointImpl(0, 0), "NEDC", "1", new String[] { "Oracle Dr" }, "", "Nashua", "NH", "03062", "", "US"), ""), adr2[] = SpatialManager.getGeocoder().geocodeAddress( new LocationImpl( new PointImpl(0, 0), "HQ", "500", new String[] { "Oracle Parkway" }, "", "Redwood City", "CA", "94065", "", "US"), ""); ////////////////////////////////////////////////////////////////// RoutingSettings settings = new RoutingSettings(true, false); settings.setSecondaryOption(RoutingOption.maneuverMapWidth, "800"); settings.setSecondaryOption(RoutingOption.maneuverMapHeight, "600"); settings.setSecondaryOption(RoutingOption.overviewMapWidth, "800"); settings.setSecondaryOption(RoutingOption.overviewMapHeight, "600"); System.out.println( SpatialManager.getRouter().computeRoute( adr1[0], adr2[0], null, settings, Locale.US)); }
ビジネス・ディレクトリ
ビジネス・ディレクトリのコンポーネントでは、次の機能がサポートされます。
市、州、郵便番号内のビジネスの検索、住所または地理的位置から離れた場所、運転方向ルートから離れた場所のビジネスの検索、住所または地理的位置の周辺にある直近のnビジネスのセット内のビジネスの検索
指定した名前によるビジネスの検索、指定したカテゴリ内のビジネスの検索、指定したキーワード(名前やカテゴリ)に一致するビジネスの検索、指定した名前とカテゴリに一致するビジネスの検索
カテゴリ階層の検索とナビゲート
次に、指定した名前を持つ複数のカテゴリとビジネスの例を示します。
public static void main(String args[]) { SpatialManager.set("http://myaswserver.oracle.com:port/location/webservices"); ////////////////////////////////////////////////////////////////// System.out.println(SpatialManager.getYPFinder().getCategoryAtRoot()); System.out.println(SpatialManager.getYPFinder().getCategoryAtPath(new String[0])); YPCategory cats[] = SpatialManager.getYPFinder().getCategoryAtRoot().getSubCategories(); if(cats != null) for(int i = 0; i < cats.length; i++) System.out.println(i + ": " + cats[i]); ////////////////////////////////////////////////////////////////// YPBusiness b[] = SpatialManager.getYPFinder().getBusinessesAnywhere( "Border", Locale.US); for(int i = 0; i < b.length; i++) System.out.println(i + ": " + b[i]); }