タイトル倉橋浩一のWebObjects Practice》WebObjects 4.5で作った掲示板をVer.5に対応する(1)カテゴリーWebObjects, 倉橋浩一のWebObjects Practice
作成日2001/12/28 16:23:8作成者新居雅行
ご無沙汰してしまいました、WebObjects Practiceです。「飯食ってます」で予告したように、電子掲示板のWO 5対応版をやります。ただ、同じ手順をダラダラと続けてもあまり意味がないので、WO 4.5からWO 5.0への移植方法のご紹介、という形とします。

ご存じのように、WO 4.5と5.0とはプロジェクトの形式も、ソースも異なります。ただ、変換のためのツールは用意されています。が、使い方がちょっと煩雑で、また変換処理も万全というわけではないようです(という記述からお分かりのように、私はツールは使ったことありません)。

ということで、手作業で移植作業をしていきます。手順は大まかに以下のステップを踏みます。

1.WO 5上で新規プロジェクトを作る
2.データベースなど環境を整える
3.EOModelを作り、プロジェクトに登録する
4.Javaソースを移植
5.コンポーネントを移植
6.テスト

では、順番に見ていきましょう。

――――プロジェクトを作る
ProjectBuilder上で新規にWebObjects Applicationプロジェクトを作ります。名前はSimpleOrder2にします(芸が無いですが)。基本的な注意事項として、Projectまでのパスに空白や日本語が含まれないようにしてください。ProjectBuilderは動いても、ビルドで失敗したりしますので。

WO 4.5版と同じ名前のコンポーネントを用意します。ProjectBuilderのWeb Componentsをクリックした状態でNewを選び、WebObjectsグループからComponentを選択し、ファイル名を入力します。ターゲットにはApplication Serverを選択します。

この手順を繰り返して登録していくのですが、Newを選ぶ前に、Web Componentsをクリックすることを忘れないでください。でないと、前に作ったコンポーネントの下に、新しいコンポーネントが生成されてしまいます。まぁ、間違えてもドラッグして移動すれば問題ないのですが、時々、どこに生成されたかわからなくなってしまうことがありますので。

――――データベースなどの定義
4.5版ではOpenBase Liteを使用しましたが、今回はOpenBaseSQLのversion 7を使用します。OpenBaseManagerを起動し、"SimpleBoard2"という名称のデータベースを作成します。encodingには私はEUC Japaneseを指定しましたが、Shift JISやJISでも問題ありません。これまでのOpenBaseで何かと設定に苦労させられた日本語エンコーディングもversion 7ではかなり安定しています。なお、データベースそのものの定義は必要ありません。あとでEOModelerを使って定義しますので。

――――EOModelを作る
WO 4.5で作成したEOModelファイルをWO 5で開こうとすると、エラーになります(ならない環境もあるようですが)。ので、ここでは、新規にEOModelを定義しなおします。

まず、EOModelerを起動します。Newを選び、JDBCアダプタを指定し、URLにjdbc:openbase://127.0.0.1/SimpleOrder2を設定し、Finishボタンをクリックします。これで空のEOModelが出来上がりましたので、ここで一度保存します。Saveを選んで、SimpleBoard2のプロジェクトディレクトリ直下に保存します。WO 4.5では、この時、「モデルをプロジェクトに登録しますか?」というダイアログが出て、この場で登録することができたのですが、WO 5.0では手動で登録する必要があります。

ProjectBuilderでResourcesをクリックし、プロジェクトメニューから「ファイルを追加」を選び、さきほど保存したSimpleBoard2.eomodeldを選びます。次に表示されるダイアログで、参照スタイルを「プロジェクトを基準」、タイトルを「Application Server」に指定します。

さて、WO 5のEOModelerには、新しく作ったeomodeldファイル再度開こうとするとエラーが出てしまって開くことができないというバグがあります。ので、一度EOModelerを終了させてから、SimpleOrder2.eomodeldディレクトリの中のindex.eomodeldファイルをエディタなどで開き、12行目を
IDENTIFIER_QUOTE_STRING = "\x80"";
から
IDENTIFIER_QUOTE_STRING = "\"";
に変更します。これで、無事、開けるようになりますので、Modelを定義します。なお、サンプルではWO 4.5版とはAttributeの名称が一部異なりますのでご注意ください。また、4.5ではEOGenericRecordを使っていましたが、今回はCustom EOを作ります。Add EntityでEntityを追加し、Entity名などを入力していきますが、Entity名、Table名、クラス名を、すべて同じものにします(前回は、クラス名はEOGenericRecordのままでした)。

custom eoのためのソースを生成するには、EOModeler上のSimpleBoard2アイコン(Modelアイコン)をクリックした状態で、Javaボタンをクリックします。するとソースが生成されますので、SimpleBoard2のプロジェクトディレクトリ直下に保存します。

生成したソースをProjectに登録します。ProjectBuilderでClassesグループを選んでおいてから、プロジェクトメニューから「ファイルを追加」を選び、Board.javaを選択します。先ほどEOModelを登録した時と同様に、参照スタイルを「プロジェクトを基準」、タイトルを「Application Server」に指定します。同じ手順をMessage.javaでも行います。

――――ソースの移植
JavaソースはWO 4.5のソースをcopy&pasteして、5.0との相違点(日本語化コード、コンストラクタのパラメータ、NSGregorianDateをNSTimestampに変更、など)を修正します。

また、4.5版ではEOEnterpriseObjectを使っていましたが、今回はcustom eoを使っています。そのままでも動きますが、せっかくなのでEOEnterpriseObjectで定義されている部分を各クラスに変更し、takeValueForKey/valueForKeyをアクセサメソッドに置き換え、不要になったキャストを消します。

例えば、
String title = (String)eo.valueForKey("title");
と書いてあったものは
String title = eo.title();
となりますし、
eo.takeValueForKey(new NSGregorianDate(), "updated");
は、
eo.setUpdated(new NSTimestamp());
と書き直します。一見して、コーディング量がかなり減るのがおわかりかと思います。実は今回、まったく"custom"なことはしていないのですが、コーディング量が減ることで開発効率はかなり上がります。また、valueForKey/takeValueForKey(key-valueコーディング)では、attribute名が文字列定数で与えられますので、attributeを間違えたとしても、コンパイルを通ってしまい実行するまでエラーがわかりませんが、custom eoはアクセサメソッドですのでコンパイル時点でエラーが表示されます。"custom"でなくても、十分メリットがあることがおわかりいただけますでしょうか。
(この項、続く)
[倉橋浩一/テクニカル・ピット]
関連リンクWebObjectsのページ