タイトル倉橋浩一のWebObjects Practice》WebObjectsを4.5から5に移行する時の注意点カテゴリーWebObjects, 倉橋浩一のWebObjects Practice
作成日2001/9/3 14:20:8作成者新居雅行
いつもお世話になっております、WebObjects屋の倉橋浩一でございます。この度、『WebObjects Practice』という連載を始めることになりました。どうぞよろしくお願いします。"Practice"だと練習って感じですが、"Practical(実用的な) WebObjects"ということも視野に入れて、開発の現場でちょっと役に立つ小技なども紹介していきたいと思っています。プラットフォームはMac OS X、バージョンはWO 5をメインにしていきます。WO 5だけで行ければ楽なんですが、率直なところWO 4.5は完成度が高いものの、WO 5はJavaで全面的に書き直しているだけに今まで通りに行かないところもいろいろあり、WebObjectsの実力を引き出すのが少し苦労する面もあります。ので、時々WO 4.5に戻りつつ、進めていきます。

さて、第一回ということで、まず環境整備から書いておきます。現在、WO 5は、期間限定で評価版が無償配布されています。9月末まで使用可能で、とりあえずダウンロード/インストールした方も少なくないと思います。
インストールについては、すでに新居さんも書いていらっしゃいましたが、必ずrootでログインしてからインストールしてください。その他は特に問題ないはずです。
サンプルなどを動作させるためにはデータベースが必要です。WOと一番相性のいいデータベースはOpenBase社のOpenBaseSQLです。同社のWebから最新の6.5.7をダウンロードしてインストールしてください。インストールされているOpenBaseのバージョンはApplications/OpenBase/OpenBaseManagerのabout画面に表示されます。

◇OpenBase International
 http://www.openbase.com/

さて、無事、WO 5のインストールが完了したとしても、まだ難関が控えています。WO 4.5からお使いの方は気づいていらっしゃると思いますが、やはりバグとしか思えないところがところどころ見つかります。ツールのバグならまだしも、WebObjects Frameworks自体にもバグが残っているのじゃないでしょうか。また、バグなのか仕様なのかわからない点、仕様変更によって大きく変わってしまった点なども多々あります。
今日は、それらについて、取り上げてみたいと思います。多分、近日中にFIXが出ると思うのですが、皆さんが予期していない結果にハマって時間を浪費するのを防ぐことができれば幸いです。

(1) Validationの仕様
WO 5で、not allow nullのattributeを用意しておいて、WODisplayGroupのinsert()で新しいeoを追加します。ここでSubmitボタンにsession().defaultEditingContext().revert()をバインドして
呼び出すと、"nullは許しとらん"ってエラーが出ます。
いろいろ調べてみたところでは、従来とvalidationのルールが変わったみたいですね。ちなみに、上の現象は、revertをWOHyperLinkに返ると発生しません。つまり、エラーが出ているのは、revert()ではなくて、Submitによってnullがeoに書き込まれようとするところで出ている、ということのようです。
まだ検証中ですが、私個人としては、この仕様はhtml向きではないと感じています。

(2) WODisplayGroupのqualifyDataSourceとqualifyDisplayGroup
たとえば、WOTextFieldをWODisplayGroupのquaryMatchとバインドして、特定のattributeの検索条件を与えるものとします。
WODisplayGroupで予めfetchしておいてから、qualifyDisplayGroupを呼び出すと、条件にマッチするeoがdisplayedObjects()に入ります。これは予期した通りです。
次に、条件を変えないで、qualifyDataSourceを呼び出すと、displayedObjects()とallObjects()に同じ件数のeoが入ります。これも予期した通りの結果です。
さて、ここでquaryMatchの条件を変更して、もう一度、qualifyDataSourceを呼び出します。すると、allObjects()には条件に合致するeoが格納されるものの、displayedObjects()が空になってしまいます。以前は、displayedObjects()とallObjects()に同じ件数のeoが入っていました。

quaryDataSource()を実行するとWODisplayGroupのdataSourceにフィルタをセットしてからfetchが呼び出されますが、どうもその際に直前にquaryDisplayGroup()でセットしたフィルタが
残ってしまって、結果としてdisplayedObjectsにeoが入らない、ということになっているようです。
release noteには、こういう仕様変更が行われたという記述はありませんので、バグのようです。将来のバージョンアップなどには注意しましょう。

(3) NSGregorianDataからNSTimestampへ
かつて日時の処理に関しては、NSGregorianDateという非常に賢いクラスが用意されていましたが、WO 5.0からはNSTimestampに変わります。
NSTimestampは、EOFでの処理やWOFでの日付データの表示など、すべての局面で使われています。ただし、NSTimestamp自体は、日付の演算などを行う機能を持っていないので、これはJDKのGregorianCalendarを使う必要があります。Java標準への移行ということで仕方ないのかもしれませんが、かつてはNSGregorianDateだけでみんな賄えてしまったので、個人的には「悪化だっ」と思ってしまいます。

文句を言っていても仕方ないので、日付に関する処理をまとめておきます。

// 現在の年月日時刻を取得する
NSTimestamp now = new NSTimestamp();
GregorianCalendar now = new GregorianCalendar();

// 任意の日時の日付を生成 年 月 日 時 分 秒
GregorianCalendar theDay = new GregorianCalendar(1945, 8, 15, 10, 0, 0);

あるフィールド(年、月、日....秒)だけ取り出したい、セットしたい、シフトしたい、という場合にはadd、roll、set、getといったメソッドを使います。addやrollはたとえば、日や月などを指定しただけ増減させることができますが、rollは指定したフィールドだけしか変化はしませんので、日に31という数値を加えるように指定しても、月の変更はありません。addだと計算結果が次の月だとか次の年に相当する場合には指定フィールドより上位フィールドへの桁上げの処理を行います。このとき、どのフィールドなのかという指定にフィールド指定定数を使います。たとえば、YEAR(年)、MONTH(月)、DAY_OF_MONTH(日)、HOUR_OF_DAY(24時間の時)、HOUR(12時間の時)、MINUTE(分)、SECOND(秒)などで、いずれもCalendarクラスのstatic変数です。その他、詳細については、java.util.Calendarやjava.util.GregorianCalendarクラスの解説を参照してください。

◇Uses of Class java.util.Calendar
 http://java.sun.com/j2se/1.4/docs/api/java/util/class-use/Calendar.html

// 明日
GregorianCalendar tomorrow = new GregorianCalendar();
tomorrow.add(Calendar.DAY_OF_MONTH, 1);

// 先月
GregorianCalendar lastMonth = new GregorianCalendar();
lastMonth.add(Calendar.MONTH, -1);

// GregorianCalendarからNSTimestampへ変換
NSTimestamp result = new NSTimestamp(lastMonth.getTime());

// 秒を取り出す
int sec = now.get(Calendar.SECOND);

 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

WO 4.5からの移行は、けっこう骨が折れます。プロジェクトをそのまま開くことはできませんし、ソースも、ある程度の書き換えが必要です。eomodeldもwoファイルも、比較的簡単なものしか開くことができません。今後の連載では、その辺の負担を少しでも軽減できる情報や、WO 5で「飯を食っていく」ための技術について、取り上げていきたいと思います。

第一回からとりとめのない話になってしまってすみません。次回は、「再利用コンポーネントの活用」をメインに取り上げます。その他、バグなどに関する新しい情報があれば、書いていきます。

では、また。

[倉橋浩一/テクニカル・ピット]
関連リンクWebObjectsのページ