WAP@Enhydra

Unwiring Open Source

Satish S.
Lateral Software Technology

村上英治	eijim@po.jah.ne.jp
V0.6J-0

Revision History

A – Added, M – Modified, D – Deleted
Change #	Version	Date of Change	A / M / D	Changes incorporated in brief	Change Request #	
1	0.01	May 03, 2000	A	Appendix A	Preview Release	
2	0.02	May 04, 2000	A, M	Added: Cover Page, Revision History, TOC.
Added: WAP Technology Backgrounder
Modified: Appendix A to add support for XMLC  recompilation for WML.	Preview Release	
3	0.03	May 05, 2000	M	Modified: Appendix A to restructure Pattern Matching Rules	Preview Release	
4	0.04	May 06, 2000	A	Added: Appendix B 	Preview release	
5	0.05	May 07, 2000	A	Added: Preface
Added: Writing a Hello World WML application,	Preview Release	
6	0.06	May 08, 2000	A	Added: Multi-card Decks in WML	Preview Release	

内容 

I.	序文 
II.	WAPとEnhydraについて 
•	WAP-技術的背景 
•	WAPアーキテクチャー 
•	WAPプログラミング・モデル 
•	アプリケーション開発フレームワーク 
•	Enhydraの導入 
III.	Enhydraによる無線アプリケーション開発の基本  
•	こんにちは、WMLの世界  
•	WMLの中のマルチカードデッキ 
•	入力オプション-テキスト・フィールドと選択 
IV.	Enydraハウツー 
V.	付録: 
•	付録A ワイヤレスの開発のためのEnydraの設定
•	付録B XMLを出力するためのEnhydraの設定

Preface

E-Mail suggestions / comments / criticisms to DrSatish@Bigfoot.com

WAPとEnhydraについて 

WAP-技術的背景

ワイヤレスのアプリケーション・プロトコル (WAP)は携帯電話にインターネット・コンテンツをもたらす標準規格です。 
なぜ、いま注目を集めているのでしょうか。 
それは今日最も急成長している市場のうちの2つであるインターネットおよび携帯電話を組み合わせるという単純な理由からです。 
インターネットの成長によりビジネスおよび個人の必需品となりアクセスできる機器がPCに限定されないことはますます重要になりました。 コストおよび大きさは急速な時代の要請により技術の専門家でないモバイル利用者にとってノートPCさえインターネット・コンテンツにアクセスするにはもはや不適当な装置になっています。
インターネット可能な低費用で大げさでない機器によってそのような状況は解決されます。
ハードウェア・ベンダーの不必要な競争による独自規格の新しい装置を開発するのではなく公開された規格によるすでに存在しよく知られている機器を利用する方が理にかなっています。増加する携帯電話の利用者が携帯電話をそのような機器として自然な選択を行ないます。
WAPは、そのような装置が満足するべきコミュニケーションのプロトコルおよびマークアップ記述の標準を定めます。
この急成長している市場をターゲットとする開発者のために、WAPを理解するためには次の概念およびそれらの論理的基礎を理解する必要があります: 
•	WAPアーキテクチャー 
•	WAPプログラミング・モデル 
•	アプリケーション開発フレームワーク 
•	静的かつ動的な内容の生成方法
私たちはアーキテクチャー(このセクション中のプログラミング・モデルおよびアプリケーション開発フレームワーク)をカバーするでしょう。 Java/Enhydraを使用するコンテンツ生成方法はこのドキュメントの残りの焦点になるでしょう。 

WAPアーキテクチャーおよびプログラミングモデルは、従来のインターネット技術に大部分は似ています。 すなわち異なるのは2、3の箇所です。
PCによってインターネット・コンテンツにアクセスしているとして、通常のシナリオを考えましょう。 urlをタイプするか、あるいはあなたのブラウザー(注: ブラウザーという用語はPC特定の含蓄を持つ傾向があるので私たちはしばしばそれをユーザエージェントと呼ぶことにします。)内でハイパーリンクをクリックします。 
HTTPリクエストは、適切なサーバー(今後は起源サーバーと呼びます)へブラウザーによってなされます。 起源サーバーは、HTMLドキュメントを希望の内容でHTTPレスポンスを作りこれによって利用者は満足します。
同じ標準および手段を採用することが便利かもしれない一方、すべての既存の経験および内容はWAP環境のいくつかの重要な特徴に対して準最適解です。 
•	ネットワーク制約 
•	帯域幅 
PCベースのインターネットアクセス用の典型的な帯域幅として56kbpsが考えられるが私たちは一般に少しもそれに満足しません。 携帯電話用のネットワーク帯域幅は、9.6kbpsから14.4 kbpsまでと非常に制限されます。GPRSとUMTSのように新しいモバイルの標準の出現とともにこれが変化すると予想されます。しかし、帯域幅制約は少なくとも近い将来の間は主な問題になるでしょう。 かさばるテキストベースのヘッダーを備えたHTTPは、無線のコミュニケーションのために全く設計されていません。さらに言えば、典型的なHTMLページのサイズおよびフォーマットも同様です。

•	信頼度 
接続の切断は、PCベースのインターネットアクセスでさえ主な問題となっています。従ってGetRightとGo!zillaのような再開することができるダウンロードプログラムが人気となっています。 しかしながら、携帯電話用のネットワーク信頼度は、あなたがPCで経験しているものよりさらに悪い。 信頼性の高いプロトコルはそのような環境中では不可欠です。 
•	ユーザエージェント制約 
•	処理能力 
近い将来にあなたの携帯電話上で複雑なJavaアプレットがペンティアムベースのプロセッサーで実行されることを期待してはいけません。携帯電話のプロセッサーは以前よりはるかにパワフルです。しかし、あなたのキラーWAPアプリケーションについては、機能性が特殊効果よりはるかに大きく優先します。 また増加した処理力がバッテリーの消費を早くすることを覚えておく必要があります。
•	入力オプション 
マウス、101のキーボードはありません。 ひとつのキーから4つのアルファベットを入力することができる数字キーがあるだけです。キー1からはABCD 、キー2からはEFGHという具合に。例えば、文字「B」を入力するために、数字キー1を2度打たなければなりません。 文字「H」を入力するためには数字キー２を４度打たなければなりません。それに慣れていなければ、全く苦痛です。
モラルの話:あなたがユーザに多くタイプさせれば、ユーザは非常に不幸でしょう。これはWAPのためのアプローチの差を強調する、面白いポイントです。 HTML/HTTPを使用して、ウェブ上の任意のサービスを得るためにはログイン名およびパスワードを決める必要があります。パスワード入力はブラウザーによって非表示となります。また、確認にそれを2度入力しなければなりません。 類似したアプローチはWAPにおいては準最適解でしょう。 パスワード入力を非表示にするかどうかのオプションもありますが、WAPユーザエージェントの入力オプションについてはユーザがタイプしたものが非表示になる場合、それは望んだものでないことを意味します。 また、確認にユーザにパスワードを2度入力させ、それを非表示にしてしまうと、ユーザはほとんど２度異なる値を入力するでしょう。解決方法:パスワードを非表示にしません。 ユーザは何をタイプしているか知っていますのでそれを２度入力させて確認する必要はないのです。
•	表示の制約 
表示サイズは、あなたの画面の設計を実質的なアプローチに変えます。 あまりにも多くの表示データはいけません。ユーザは、あなたの特定のサービスにアクセスする際に通信料金の課金にひやひやしていることでしょう。不必要なデータおよび(または)装飾的なグラフィックスでユーザをいらいらさせないでください。 代わりに、あなたのサービスのコアロジックに注力してください。 

WAPアプリケーション開発フレームワークはこれらのアーキテクチャ上の制約を補うために最適化されます。 それは、UIデザイナー側の基本的な考えを変えることを必要とします。 
要約するために、WAPアプリケーション・フレームワークはトランプの隠喩に基づきます。 
この隠喩およびその論理的基礎の意味の理解はユーザー・フレンドリーなWAPアプリケーションを設計するために不可欠です。 
最初に2つのことを考慮しましょう: 
•	送信内容の単位 
•	ユーザインターラクションの単位 
これらはPC上のブラウザーベースの要請に対しても通常同じなので、このHTTP応答については特に考えなかったかもしれません。 
HTMLページ(関連するグラフィックス、スクリプト、アプレットなどを備えた)はHTTPリクエストに応じて送信されます。また、ユーザはフォームへの記入によりシステムと対話します。 
私たちはすべてこれに慣れています。また、それは、インターネットアクセスの従来のやり方のコンテキストの中でとてもうまくいっています。
しかし、あなたがWAP環境の特有の制約で同じことをしようとすると、そのようなメカニズムは基本的に欠陥があります。 
最初に、HTMLの画面は数ページに及ぶ多くの情報として非常に大きくなる傾向があります。一般に、最初のページにアクセスするよりも全画面を通して読むのに多くの時間がかかります。
WAPユーザ・パラダイムはある特定のデータの短い集中した要求について考えます。現在のユーザエージェントの画面制約では、単一のスクリーン上の過度のデータを管理することはできません。 
1つのリクエスト当たりの送信データを制限するオプションつまり1つの画面当たりのデータを考慮しましょう。これが、携帯電話に制限付のデータを表示し管理する最適のソルーションであるように思えます。 しかしながら、固有のネットワーク待ち時間により、ユーザエージェントにデータを送信するために必要な時間は、画面と対話するために必要な時間と比べて不釣り合いです。これは非常に不満足なユーザ経験となります。
この問題は、送信内容の単位とユーザインターラクションの単位の相違を考えることにより解決されます。 
WAPでの送信内容の単位はトランプの固まりと考えられます。 WAPでのトランプはユーザインターラクションの単位から構成される多くのカードから成ります。したがって、ユーザインターラクション(カード)を1単位以上送信することによって、ユーザ経験に対するネットワーク待ち時間の影響は最小限にできます。 

ちょうどこの問題についてのあるアイデアをもっている状態なので、WAPのネットワーク・アーキテクチャーを見てみましょう。

Network Architecture                                       WAP Gateway

COMPUTER
NETWORK

IP

WIRELESS
NETWORK

         	D  Mobile
                Phone
								Origin
							Server

ネットワーク・アーキテクチャーはノキアWAPツールキットを採用しました。 
最初に。 

伝統的に、私たちが以前に述べたように、ユーザエージェントはHTTPリクエストをHTTPレスポンスを返す起源サーバーに要求します。 
HTTPレスポンスはテキストベースで、かさばります。 それらは、無線の送信には実際ふさわしくはありません。 また、HTMLページもそうです。 従ってWAPのような標準が必要なのです。
今、私たちは、起源サーバーが単にHTTPを理解する一方で携帯電話が単にWAPを理解するような状況とします。 明白に、私たちは両方を理解することができ、2つの間を翻訳することができるような仲介人をここで必要とします。WAPゲートウエイはそのような仲介人です。 
WAPゲートウエイは、ユーザエージェントと起源サーバーの間で単にプロキシー・サーバーとして存在します。 ユーザエージェントはWAP規格を満足しながらリクエストを出します。 WAPゲートウエイはそれを受け取り、適切なHTTPヘッダーを付けて、適切な起源サーバーにそれを送ります。 起源サーバーは送信されたHTTPリクエストに全く満足しています。 しかしながら、それは従来のHTMLではなくワイヤレス・マークアップ・ランゲージ(WML)のWAPマークアップ言語を選択をしたことより実現されます。
WAPゲートウエイは、起源サーバーのHTTP/WMLレスポンスを受け取り、送信に適切なバイナリ圧縮した形式へエンコードしまた元来要求したユーザエージェントのもとへそれを送ります。
元のHTMLおよびエンコードされたWMLに翻訳しWAPゲートウエイに送り返すことも起源サーバーで可能です。しかし、これは典型的な準最適の解です。  
WMLの符号化は2-折りの長所を持ちます: 
•	それは、サイズを縮小ししたがってデータの高価な送信のコストを節約します。
•	携帯電話上の小さなブラウザーはWMLを理解する必要がありません。  それが扱う内容は既に解析されています。  したがって、CPUはそれほど強力である必要がありません。  これは、非常に価格意識が強い消費者市場のコストを節約します。

また、最終的に、WAPアーキテクチャー(WAP Architecture)モデルは図４から得られます。WAPアーキテクチャー" WAPアーキテクチャー規約"   www.wapforum.org 

WIRELESS APPLICATION
ENVIRONMENT( WAE )

       HTML

        OTHERS

       HTTP

WIRELESS SESSION PROTOCOL( WSP )

WIRELESS TRANSACTION PROTOCOL (WTP)

WIRELESS TRANSACTION LAYER SECURITY (WTLS)

    TLS - SSL

WIRELESS DATAGRAM PROTOCOL( WDP )

     TCP / IP

       UDP

  BEARER SERVICES

       CDMA

        SMS

  ETCETERA

Enhydraによる無線アプリケーション開発の基本

こんにちは、WMLの世界   

私たちは短い例を備えたEnhydraベースのWMLアプリケーション開発の旅に出かけます。 この例については、私が、詳細な着実なアプローチによる、構成、開発および配備プロセスについて説明しましょう。 私たちがもっと高度なコンセプトへ移るときに、あなたがどの変更を加える必要があるかを示して、基礎的な構造および配備ステップの説明をします。

目的: 
•	Enhydra上であなたの最初のWMLアプリケーションを書き、コンパイルし実行します。 
•	典型的なEnhydraアプリケーションの開発に関与する、構成変更に精通していくようになってください。 
•	WMLの基本を理解します。 
•	Enhydraベースのアプリケーション開発の法則を理解してください。 

前必要条件: 
•	JavaとHTMLについての知識を持っています。 
•	Enhydra 3.0.1をインストールしています。 
•	付録AのようにENHYDRA_ROOT/lib/stdrules.mkおよびENHYDRA_ROOT/xml/wml/wml.xcatに変更を加えました。 

仮定: 
Javaを理解する上で私は、あなたが単純なテキストエディターをむしろ使用していると仮定します、私たちは、2つの理由のためにKelpで可能になったJDeveloper/JBuilderを使用することを考えていません: 
•	そのようなIDEを使用する学習はEnhydraでの無線アプリ開発の学習にはとるに足りません。
•	さらに、Enhydraの舞台裏の仕掛けの理解にはるかによい考えを与えます。 

ステップ: 
•	あなたのワーキングディレクトリー中のnewappを次のように実行します: 
newapp helloWorldWML 
•	または、あなたの好きなIDEの中でプロジェクトを作成して、作成されたファイルを加えてください。  あなたのIDEが階層としてプロジェクト構造を表示し、異なるタイプのファイルの追加、削除および修正を許可する場合、それは大変助けになります。
•	 あなたのプレゼンテーション・ディレクトリー中で新しいファイルWelcome.wmlを次のように作成します:
<?xml version="1.0"?>
	<!DOCTYPE wml
		PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
		"http://www.wapforum.org/DTD/wml_1.1.xml">
	<wml>
		<card id="card1" title="WAP@Enhydra">
			<p>
				Hello World
				<br/>
				<em>Welcome to WAP@Enhydra</em>
			</p>
		</card>
	</wml>
•	あなたのプレゼンテーション・ディレクトリーで、Welcome.javaを次のように修正してください:
package helloWorldWML.presentation;

import com.lutris.appserver.server.httpPresentation.HttpPresentation;
import com.lutris.appserver.server.httpPresentation.HttpPresentationComms;
import com.lutris.appserver.server.httpPresentation.HttpPresentationException;
import com.lutris.appserver.server.httpPresentation.HttpPresentationOutputStream;
import com.lutris.appserver.server.httpPresentation.HttpPresentationRequest;
import com.lutris.appserver.server.httpPresentation.HttpPresentationResponse;
import org.enhydra.xml.xmlc.XMLObject;
import java.io.IOException;

public class Welcome implements HttpPresentation
{
	public void run( HttpPresentationComms comms )
		throws HttpPresentationException, IOException
	{
WelcomeWML welcome = ( WelcomeWML )comms.xmlcFactory.create( WelcomeWML.class );
		present( welcome, comms );
	}

	public void present( XMLObject doc, HttpPresentationComms comms )
		throws HttpPresentationException, IOException
	{
		HttpPresentationResponse response = comms.response;
		response.setContentType( "text/vnd.wap.wml" );
		HttpPresentationOutputStream out = response.getOutputStream();
		String buffer = doc.toDocument();
		out.println( buffer );
		response.flush();
	}

}

•	今、私たちは、Enhydra上の最初のWMLアプリケーションをコンパイルし配備するためにプロジェクト構成ファイルに必要な変更を加えます。  付録Aでどのようにstdrules.mkの変更を既に加えたかを思い出してください。
•	config.mk-を変更:
セクション中で、インターフェースとインプリメンテーションを生成する、そして: 
•	WMLに対するXMLCオプションを次のように加えます:
XMLC_WML_OPTS += -xcatalog /opt/enhydra3.0.1/xml/wml/wml.xcat -generate both
•	次のようになります:			
#
#	Generate interfaces and implementations
	#
	XMLC_HTML_OPTS += -generate both
	XMLC_WML_OPTS += -xcatalog /opt/enhydra3.0.1/xml/wml/wml.xcat -generate both
•	セクション中で、インターフェースとインプリメンテーションを生成する、そして: 
•	WMLに対するXMLCオプションを次のように加えます: 
XMLC_WML_OPTS += -xcatalog /opt/enhydra3.0.1/xml/wml/wml.xcat -generate both
 (wml.xcatファイルの位置がマシン特定であることに注目する。詳細は付録Aを参照。)
•	ここに、それが今どのように見えていなければないかを示します:			
#
#	Generate interfaces and implementations
	#
	XMLC_HTML_OPTS += -generate both
	XMLC_WML_OPTS += -xcatalog /opt/enhydra3.0.1/xml/wml/wml.xcat -generate both

•	プレゼンテーション・ディレクトリー中のメイクファイルへの変更:
Locate:
HTML_DIR = .
		HTML_CLASSES = WelcomeHTML
Change to:
		WML_DIR = .
		WML_CLASSES = WelcomeWML
			
•	PROJECT_ROOTからmakeを実行。  緊密にここまできたら、エラーはないでしょう。
•	出力ディレクトリーに移動し、あなたの最初のEnhydraアプリケーションを次のように実行する:
	cd output
	./start
•	WAPエミュレーター(WAP Emulator)を立ち上げます。
http://localhost:9000/
•	おめでとう!  Enhydra上の最初のWAPアプリケーションを成功裡に配備しました。

Explanation:
	To-do
Summary:
	To-do

WMLの中のマルチカードデッキ 

目的: 
•	Enhydra上のあなたの最初のマルチカードWMLデッキを構築し配備させること 
•	デッキ内のカード間にナビゲートする手段としてWMLの中でアンカーを使用すること。 
•	WMLの中のイベントおよびタスクの概念の理解 
•	イベントタスクの関連を理解しインプリメントする
•	内部イベントや外部イベントの違いの理解。 
•	WAPアプリケーション・プログラミングモデルの送信内容およびユーザインターラクションの単位間の違いを理解し内面化する

前必要条件: 
•	開発し配備したハローワールドWML)アプリケーション。 

ステップ: 
•	あなたのワーキングディレクトリーの下にあなたの新しいアプリケーションの骨格を作成します: 
newapp multiCardWML 
•	あなたのプレゼンテーション・ディレクトリー中で新しいファイルWelcome.wmlを次のように作成します:
<?xml version="1.0"?>
<!DOCTYPE wml
PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
	"http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
	<card id="card1" title="First Card" ontimer="#card2">
		<timer value="20"/>
		<p>
			<em>Welcome to the First Card</em>
			<br/>
			<do type="accept" label="Second Card">
				<go href="#card2"/>
			</do>
		</p>
	</card>

	<card id="card2" title="Second Card" ontimer="#card3">
		<timer value="20"/>
		<p>
			<em>Welcome to the Second Card</em>
			<br/>
			<do type="accept" label = "Third Card">
				<go href="#card3"/>
			</do>
		</p>
	</card>

	<card id="card3" title="Third Card" ontimer="#card1">
		<timer value="20"/>
		<p>
			<em>Welcome to the Third Card</em>
			<do type="accept" label="First Card">
				<go href="#card1"/>
			</do>
		</p>
	</card>
</wml>
•	あなたのプレゼンテーション・ディレクトリー中のWelcome.javaを次のように修正します:
package multiCard.presentation;

import com.lutris.appserver.server.httpPresentation.HttpPresentation;
import com.lutris.appserver.server.httpPresentation.HttpPresentationComms;
import com.lutris.appserver.server.httpPresentation.HttpPresentationException;
import com.lutris.appserver.server.httpPresentation.HttpPresentationOutputStream;
import com.lutris.appserver.server.httpPresentation.HttpPresentationRequest;
import com.lutris.appserver.server.httpPresentation.HttpPresentationResponse;

import java.io.IOException;

import org.enhydra.xml.xmlc.XMLObject;

public class Welcome implements HttpPresentation
{
	public void run( HttpPresentationComms comms )
		throws HttpPresentationException, IOException
	{
WelcomeWML welcome = ( WelcomeWML )comms.xmlcFactory.create( WelcomeWML.class );
	present( welcome, comms );
	}

	private void present( XMLObject doc, HttpPresentationComms comms )
throws HttpPresentationException, IOException
	{
HttpPresentationResponse response = comms.response;
response.setContentType( "text/vnd.wap.wml" );
HttpPresentationOutputStream out = response.getOutputStream();
		out.println( doc.toDocument() );
		response.flush();
	}
}

•	XMLCに対するWMLコンパイルオプションを付け加えるためにあなたのPROJECT_ROOTディレクトリー中のconfig.mk-を修正します:
#
# Generate interfaces and implementions
#
XMLC_WML_OPTS  += -xcatalog /opt/enhydra3.0.1/xml/wml/wml.xcat -generate both
•	WMLプレゼンテーション・クラスを次のように生成するためにあなたのプレゼンテーション・ディレクトリー中のメイクファイルを修正します:
WML_DIR = .
WML_CLASSES = WelcomeWML
•	あなたのアプリケーションを構築するためにPROJECT_ROOTからのmakeを実行します
•	出力ディレクトリーに移動し、配備します。
./start
•	あなたの好きなWAPエミュレータ/SDKからあなたのページにアクセスしてください。  WAPアプリケーションのルック・アンド・フィールの一般的な考えを思いつくためにカードを通ってナビゲートしてください。
    
Explanation:	To-do

Summary:	To-do

入力オプション(Input Options)- テキスト・フィールドと選択 

目的: 
•	WMLにおいて利用可能なデータ・エントリー・オプションを理解する
•	ユーザー・フレンドリーなナビゲーションのオプションのためにメニュー画面を作成するためにアンカーを使用してください。 
•	ユーザ入力のためにテキストフィールドを使用します。 
•	ユーザ入力を単純化するためリストボックスを使用してください。 
•	WMLの中のコンテキストの概念を理解する、またカード間の状態を維持するために現在のコンテキストを使用すること 

前必要条件: 
•	EnhydraベースのWAPアプリケーションに要求される、構成変更についての基礎的な理解 
•	開発途上のマルチカードデッキおよびデッキ内の操作についての熟知 
•	イベント、タスクおよびイベントタスクの関連についての理解。

Steps: 
	To-do

Explanation:
	To-do

Summary:
	To-do

付録A 
	
WML出力のためにEnhydraを設定する

WMLとHTMLのサポートを提供するためのEnhydraの設定は、かなり多数の構成ファイルを変更することを含んでいます。  いくつかの変更は厳密には一度だけです。  それらを一度変更してください。そうすれば、それらについて再び(あるいは、少なくとも、Enhydraの次のリリースをインストールするまでは)心配する必要がありません。   他のいくつかの変更は作成するすべてのプロジェクトのために個々の構成ファイルに対して行います。それらはオプションです。WMLまたはHTMLを生成していなければ、すべてそれらを省略してもよいでしょう。  いくつかの問題はJavaプレゼンテーション・オブジェクトのために作成する(典型的なWelcome.java)の修正を含んでいます。  XMLCおよびあなたのノキアWAPツールキットの両方を幸福にしておくためにPUBLIC/SYSTEM識別子の割り当てを含んでいます。  また、ユーザエージェントにはあなたのアプリケーションの配備に含まれる少なくとも1つのランタイム時の問題が存在します。

stdrules.mk(一度だけ変更)の変更 

1)	Javaビルドルールのセクションを変更します。 
•	カレント・ディレクトリ・レベルにdo_xmlc_wml_targetsを次のように加えることによりJavaターゲットビルドパスのためのビルドルールを修正する:
java_pass:: do_xmlc_html_targets do_xmlc_wml_targets dojhtml_targets jpass_subdirs dojpass_targets jpass_post_subdirs dormi_targets donative_targets
•	WML_CLASSESを次のようにJavaクラスターゲットをビルドするために省略時ルールを修正します:
dojpass_targets:: $(JDDI_CLASSES:%=$(PACKAGE_OUTPUT)/%.class) $(JOLT_CLASSES:%=$(PACKAGE_OUTPUT)/%.class) $(HTML_CLASSES:%=${PACKAGE_OUTPUT}/%.class) $(WML_CLASSES:%=${PACKAGE_OUTPUT}/%.class) $(CLASSES:%=$(PACKAGE_OUTPUT)/%.class)
•	XMLCを使用して、WMLからクラスを構築する規則を加えます。 
•	XMLCを使用して、HTMLからクラスを構築する省略時ルールのサブセクションを見つけます。
•	このセクション以下に、XMLCを次のように使用して、WMLからクラスを構築するために新しいディフォルト・ルールを加えてください:
#
# Default rule to build classes to WML using XMLC
#
do_xmlc_wml_targets::  $(WML_CLASSES:%=${PACKAGE_OUTPUT}/%.class)

2)	一般ビルドルールのセクションを変更します。 
•	カレント・ディレクトリ・レベルに条件付きクリーンアップ用のサブセクションがあります。  WMLファイルのために次の追加を組込みます:
ifneq ($(WML_CLASSES),)
-rm -rf $(WML_CLASSES:%=./%.java)
	-rm -rf $(WML_CLASSES:%=./%Impl.java)
endif

3)	パターンマッチング・ルールセクションの追加: 
•	XMLCの再コンパイルのサポート用のサブセクションを見つけます。 
WML再コンパイルのサポートを次のように加えます:
ifeq ($(XMLC_AUTO_COMP),YES)
XMLC_HTML_OPTS += -for-recomp
XMLC_WML_OPTS  += -for-recomp
endif
•	XMLCでのWMLのコンパイルのためにサブセクションを作成します。
•	以下のようにXMLC_WML_OPTSを追加します:
XMLC_WML_OPTS += -domfactory org.enhydra.wireless.wml.WMLDomFactory
•	WMLファイルのXMLCコンパイルのためのパターンマッチング規則を次のように定義します。  
•	XMLCでのHTMLコンパイルについて前のサブセクションをコピーしペーストする、そして 
•	HTMLのすべてをWMLに変更すること。 
•	私のstdrules.mkからWMLパターンマッチング・ルールの抜粋:

#
# Compile WML with XMLC
#

XMLC_WML_OPTS += -domfactory org.enhydra.wireless.wml.WMLDomFactory

$(PACKAGE_OUTPUT)/%WML.class: $(WML_DIR)/%.wml $(XMLC_WML_OPTS_FILE) $(XMLC_%_OPTS_FILE)
	@mkdir -p $(PACKAGE_OUTPUT)
ifeq ($(XMLC_AUTO_COMP),YES)
	cp -f $(WML_DIR)/$*.wml $(PACKAGE_OUTPUT)
endif
	@CLASSPATH="$(ENHYDRA_CLASSPATH)" ; export CLASSPATH ; \
	set -x ; \
        $(XMLC_CMD) -class $(PACKAGE).$*WML $(XMLC_WML_OPTS) $(XMLC_$*_OPTS) $(XMLC_JAVAC) $(XMLC_WML_OPTS_FILE) $(XMLC_$*_OPTS_FILE) $(WML_DIR)/$*.wml

$(PACKAGE_OUTPUT)/%WML.class: %.wml $(XMLC_WML_OPTS_FILE)
	@mkdir -p $(PACKAGE_OUTPUT)
ifeq ($(XMLC_AUTO_COMP),YES)
	cp -f $*.wml $(PACKAGE_OUTPUT)
endif
	@CLASSPATH="$(ENHYDRA_CLASSPATH)" ; export CLASSPATH ; \
	set -x ; \
        $(XMLC_CMD) -class $(PACKAGE).$*WML $(XMLC_WML_OPTS) $(XMLC_$*_OPTS) $(XMLC_JAVAC) $(XMLC_WML_OPTS_FILE) $*.wml
 
PROJECT_ROOTディレクトリー内のconfig.mkの設定: 

1)	セクション中で、インターフェースとインプリメンテーションを生成するセクションをつぎのように修正する: 
#
# Generate interfaces and implementions
#
XMLC_HTML_OPTS += -generate both
XMLC_WML_OPTS += -xcatalog /usr/local/enhydra3.0.1/xml/wml/wml.xcat –generate both
2)	xcatalogオプションは、ローカルな仕様を充当するためにあなたのxmlファイル中のPUBLIC/SYSTEM識別子を割り当てるためにあります。  例えば、WMLのためのSYSTEM 識別子は典型的に次のとおりです:  
http://www.wapforum.org/DTD/wml_1.1.xml
しかしながら、xmlcは、これを有効にするためにインターネットに接続するように努力するでしょう。 これの回避策は、あなたの/usr/local/enhydra3.0.1/xml/wml/wml.xcatを次のようにします:
<?xml version="1.0"?>
<!DOCTYPE XCatalog PUBLIC "-//DTD XCatalog//EN" "org/apache/xerces/readers/xcatalog.dtd">
<XCatalog>
 <Map PublicID="-//WAPFORUM//DTD WML 1.1//EN"
        HRef="file:/usr/local/enhydra3.0.1/xml/wml/wml_1.1.xml"/>
</XCatalog>
プレゼンテーション・ディレクトリー中のメイクファイルの設定 

1)	WMLディレクトリーおよびあなたのクラスに対する値を設定します: 
WML_DIR=。 
WML_CLASSES=WelcomeWML 
2)	HTMLに等価なオプションの下で直ちにそれを行ってください。 

WML出力のためにJavaプレゼンテーション・オブジェクトを修正する

package presentWML.presentation;

import com.lutris.appserver.server.httpPresentation.HttpPresentation;
import com.lutris.appserver.server.httpPresentation.HttpPresentationComms;
import com.lutris.appserver.server.httpPresentation.HttpPresentationException;
import com.lutris.appserver.server.httpPresentation.HttpPresentationOutputStream;
import com.lutris.appserver.server.httpPresentation.HttpPresentationRequest;
import com.lutris.appserver.server.httpPresentation.HttpPresentationResponse;

import java.io.IOException;

import org.enhydra.xml.xmlc.XMLObject;

public class Welcome implements HttpPresentation
{
	public void run( HttpPresentationComms comms )
		throws HttpPresentationException, IOException
	{
WelcomeWML welcome = ( WelcomeWML )comms.xmlcFactory.create( WelcomeWML.class );
		present( welcome, comms );
	}
	
	private void present( XMLObject doc, HttpPresentationComms comms )
		throws HttpPresentationException, IOException
	{
		HttpPresentationResponse response = comms.response;
		response.setContentType( "text/vnd.wap.wml" );
		HttpPresentationOutputStream out = response.getOutputStream();
		out.println( doc.toDocument() );
		response.flush();
	}
}

ノキアユーザエージェントのランタイム時の問題 
•	http://localhost:9000/のような連続するスラッシュを使用するとエミュレータ/7110がクラッシュします。

付録B 

XMLの内容を表示するためにEnhydraを設定する   

XMLのサポートを提供するためにEnhydraを設定することはWMLに関しての非常に類似した変更を含みます。  以前のように、いくつかの変更は厳密に一度だけです。  それらを一度変更してください。そうすれば、それらについて再び(あるいは、少なくとも、Enhydraの次のリリースをインストールするまでは)心配する必要はありません。   他のいくつかの変更は作成するすべてのプロジェクトのために個々の構成ファイルに対しておこないます。いくつかの問題は作成する(典型的なWelcome.java) Javaプレゼンテーション・オブジェクトのための修正を含んでいます。  いくらかは純粋にオプションで、あなたが個別のHTMLおよび(または)WML出力の生成に興味を持たなければ、省略することができます。

stdrules.mk(一度だけの変更)の変更 

1)	Javaビルドルールセクションの変更。 
•	カレント・ディレクトリ・レベルにdo_xmlc_xml_targetsを次のように加えることによりJavaターゲットビルドパスのビルドルールを修正する:
java_pass:: do_xmlc_html_targets do_xmlc_wml_targets do_xmlc_xml_targets dojhtml_targets jpass_subdirs dojpass_targets jpass_post_subdirs dormi_targets donative_targets
•	XML_CLASSESを次のようにJavaクラスターゲットをビルドするために省略時ルールを修正します:
dojpass_targets:: $(JDDI_CLASSES:%=$(PACKAGE_OUTPUT)/%.class) $(JOLT_CLASSES:%=$(PACKAGE_OUTPUT)/%.class) $(HTML_CLASSES:%=${PACKAGE_OUTPUT}/%.class) $(WML_CLASSES:%=${PACKAGE_OUTPUT}/%.class)  $(XML_CLASSES:%=${PACKAGE_OUTPUT}/%.class)
$(CLASSES:%=$(PACKAGE_OUTPUT)/%.class)
•	XMLCを使用して、XMLからクラスをビルドする規則を加えます。 
•	XMLCを使用して、HTMLからクラスをビルドする省略時ルールサブセクションを見つけます。
•	このセクション以下に、XMLCを次のように使用して、XMLからクラスを構築するために新しいディフォルト・ルールを加えてください:
#
# Default rule to build classes to XML using XMLC
#
do_xmlc_xml_targets::  $(XML_CLASSES:%=${PACKAGE_OUTPUT}/%.class)

2)	一般ビルドルールセクションを変更します。 
•	カレント・ディレクトリ・レベルに条件付きのクリーンアップ用のサブセクションがあります。  XMLファイルを扱うために次の追加を組込みます:
ifneq ($(XML_CLASSES),)
-rm -rf $(XML_CLASSES:%=./%.java)
	-rm -rf $(XML_CLASSES:%=./%Impl.java)
endif

3)	パターンマッチング・ルールセクションを追加します。: 
•	XMLC再コンパイルサポート用のサブセクションを見つけます。 
XML再コンパイルのサポートを次のように加えます:
ifeq ($(XMLC_AUTO_COMP),YES)
XMLC_HTML_OPTS += -for-recomp
XMLC_WML_OPTS  += -for-recomp
XMLC_XML_OPTS   += -for-recomp
endif
•	XMLCによるXMLのコンパイルのためにサブセクションを作成します。 
•	XMLファイルのXMLCコンパイルのためのパターンマッチング規則を定義します。  
•	XMLCによるHTMLコンパイルについての前のサブセクションをコピーしペーストする、そして 
•	HTMLのすべてをXMLに変更すること。 
•	私のstdrules.mkからXMLパターンマッチング・ルールの抜粋:

#
# Compile XML with XMLC
#

$(PACKAGE_OUTPUT)/%XML.class: $(XML_DIR)/%.xml $(XMLC_XML_OPTS_FILE) $(XMLC_%_OPTS_FILE)
	@mkdir -p $(PACKAGE_OUTPUT)
ifeq ($(XMLC_AUTO_COMP),YES)
	cp -f $(XML_DIR)/$*.xml $(PACKAGE_OUTPUT)
endif
	@CLASSPATH="$(ENHYDRA_CLASSPATH)" ; export CLASSPATH ; \
	set -x ; \
        $(XMLC_CMD) -class $(PACKAGE).$*XML $(XMLC_XML_OPTS) $(XMLC_$*_OPTS) $(XMLC_JAVAC) $(XMLC_XML_OPTS_FILE) $(XMLC_$*_OPTS_FILE) $(XML_DIR)/$*.xml

$(PACKAGE_OUTPUT)/%XML.class: %.xml $(XMLC_XML_OPTS_FILE)
	@mkdir -p $(PACKAGE_OUTPUT)
ifeq ($(XMLC_AUTO_COMP),YES)
	cp -f $*.xml $(PACKAGE_OUTPUT)
endif
	@CLASSPATH="$(ENHYDRA_CLASSPATH)" ; export CLASSPATH ; \
	set -x ; \
        $(XMLC_CMD) -class $(PACKAGE).$*XML $(XMLC_XML_OPTS) $(XMLC_$*_OPTS) $(XMLC_JAVAC) $(XMLC_XML_OPTS_FILE) $*.xml
 
PROJECT_ROOTディレクトリー中のconfig.mkの設定: 

3)	セクション中で、インターフェースとインプリメンテーションを生成するセクションを、次のように修正する:
#
# Generate interfaces and implementions
#
XMLC_HTML_OPTS += -generate both
XMLC_WML_OPTS += -xcatalog /usr/local/enhydra3.0.1/xml/wml/wml.xcat –generate both
XMLC_XML_OPTS += -generate both

プレゼンテーション・ディレクトリー中のメイクファイルの設定 

3)	XMLディレクトリーおよびあなたのクラスに対する値をセットします:
XML_DIR = .
XML_CLASSES = WelcomeXML
4)	HTML/WMLに等価なオプションを設定する。 
5)	注:純粋にXMLとして出力するつもりならば、メイク構成およびメイクファイル中のHTML、および(または)WMLセクションを省略してもよい。

XMLを出力するためにJavaプレゼンテーション・オブジェクトを作成、修正する

package presentXML.presentation;

import com.lutris.appserver.server.httpPresentation.HttpPresentation;
import com.lutris.appserver.server.httpPresentation.HttpPresentationComms;
import com.lutris.appserver.server.httpPresentation.HttpPresentationException;
import com.lutris.appserver.server.httpPresentation.HttpPresentationOutputStream;
import com.lutris.appserver.server.httpPresentation.HttpPresentationRequest;
import com.lutris.appserver.server.httpPresentation.HttpPresentationResponse;

import java.io.IOException;

import org.enhydra.xml.xmlc.XMLObject;

public class Welcome implements HttpPresentation
{
	public void run( HttpPresentationComms comms )
		throws HttpPresentationException, IOException
	{
		WelcomeXML welcome = ( WelcomeXML )comms.xmlcFactory.create( WelcomeXML.class );
		present( welcome, comms );
	}
	
	private void present( XMLObject doc, HttpPresentationComms comms )
		throws HttpPresentationException, IOException
	{
		HttpPresentationResponse response = comms.response;
		response.setContentType( "text/xml" );
		HttpPresentationOutputStream out = response.getOutputStream();
		out.println( doc.toDocument() );
		response.flush();
	}
}