t100のプログラミング脱出作戦

自分のプログラミング脳をプログラムにして、いつかプログラミングから脱出してやるぞっ!とか夢見ながら、日々プログラム作っていく 百野 貴博 の日記です!今は、屋号『百蔵。』として、Silverlight・WPFを追跡中です! (2007/09/30)
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
【--/--/-- --:--】 | スポンサー広告 | トラックバック(-) | コメント(-) top↑
Wicketがプロパティファイルを検索する順番
※この記事で紹介した内容を、トラックバックでさらに詳しく解説頂いちゃいました!
詳しくは、こちらのリンクをご覧くださいっ!


Wicketがプロパティファイルを検索する順番 詳解@矢野勉のはてな日記


あと、自分でも「WicketのDropDownChoiceで"選択してください"を変更する方法」を別途書き直しました。

よろしければ、どうぞー。

----↓元記事、ここから----

Wicket1.3 [beta2]で、ドロップダウン(DropDownChoice)の
未選択時のデフォルト文字列「選択してください」の変更方法を調べてみました。
# Localizer.class の212行目あたりにブレークポイントつけました。

設定の変更自体は、プロパティファイルに記述することで対応できます。
仕組みは、エラーメッセージで項目名を指定する方法と同じで
プロパティファイルを使います。


ただ、使用されるプロパティファイルの名前とキー名の規約と検索の順序は、ちょっと複雑です。
今回調べてみた結果を、ざっくり以下に記述します。
(ステップ実行で確認した結果のまとめなので微妙ですが・・・)


検索の順序は、プロパティファイル名のパターンと、キー名のパターンの組み合わせで決まります。
まずはそれぞれに、どのようなパターンがあるのか解説します。


■プロパティファイル名のパターン

使用するプロパティファイル名は、現在のWebPage、対象のコンポーネント、WicketApplicationのクラス名を使って決定します。
決定の順番は以下です。


1.現在のWebPageのクラス名、及び、その親クラスのクラス名

 継承階層が複数ある場合、親クラス名が順番に検証に使われます。
 WebPage ← ParentPage ← ChildPage となっている場合、ChildPage, ParentPage, WebPage の順に
 プロパティファイルを検索します。
 #パッケージ名も含めた、完全な名前が使われます。
 
 #Wicket内で決められたクラス以上の親クラスはたどりません。
 #例えば、WebPageの親クラスのPageクラスは検索対象ではありません。
 
2.現在のコンポーネントが存在しているWebPage上のコンポーネントツリー上のオブジェクトクラス

 WebPage ← Form ← Border ← Label というような階層構造になっている場合
 Formから順番に、コンポーネントのクラス名が使われます。
 
 また、対象のコンポーネント自身のクラスに関しては
 そのコンポーネントの親クラス名も順番に使用されます。
 継承階層が複数ある場合、親クラス名が順番に検証に使われます。
 #ここでも、Wicket内で決められたクラス以上の親クラスはたどりません。
 
 ここに関しては、法則性に自身がありません・・・(ダメ)
 ステップ実行していると、どうも不可解な動きをするので、、、もう少し違うルールがありそうな肝・・・。


3.アプリケーションで使用しているクラス名、及び、その親クラスのクラス名

 現在使用しているWicketApplicationクラスと、その親クラスの名前が順番に検証に使われます。
 親クラスの辿り方は、WebPageの際と同じです。


以上がファイル名を決めるルールなのですが、さらにプロパティファイルの拡張子は、(.properties と、.xml)の2つが可能で、かつ、現在のロケール名も考慮されます。
つまり、日本語圏の場合、次の4パターンが順に検索されます。(_ja.properties, _ja.xml, .properties, .xml)


これらの組み合わせでクラスパス中を検索し、見つかるまで繰り返されます。


ファイル名だけで見た場合の検索の順番は、以下となります。

1.1のルールで拡張子4種類
2.2のルールで拡張子4種類
3.3のルールで、、、



■キー名のルール


キー名は、実は接頭語とキー名の2つのパートで構成されています。
ここでは、接頭語とキー名を組み合わせた値を、完全キー名と呼ぶことにします。


例えば、コンポーネントの表示名称を指定する場合、対象のコンポーネントの親コンポーネントのIDを"."で接続したものが接頭語となります。
そして、対象コンポーネントのIDがキー名になります。

例えば、MyPageに、以下のようなコンポーネントツリーがあるケースを考えます。
myForm (Form) ← myBorder (FormComponentFeedbackBorder) ← myDropDownChoice (DropDownChoice)

この場合、myForm.myBorder が接頭語で、myDropDownChoice が、キーになります

また、DropDownChoice の空項目の値のような場合はさらに、完全なコンポーネントID+コンポーネントID+"null" (値は、"."区切り)が使われます。

この場合、myForm.myBorder.myDropDownChoice.myDropDownChoice.null となります。


また、キー名は、完全キー名と、キー名の2パターンが検索で使用されます。

この場合、myForm.myBorder.myDropDownChoice.myDropDownChoice.null と、myDropDownChoice.null の2パターンとなります。

さらに、接頭語、キー名とも、一番先頭の"."以前の単語を削除しながら検索が繰り返されます。

この場合

myForm.myBorder.myDropDownChoice.myDropDownChoice.null

myBorder.myDropDownChoice.myDropDownChoice.null

myDropDownChoice.myDropDownChoice.null

myDropDownChoice.null

null

となります。


先ほどの順番と組み合わせると、以下となります。
#でも、実際は2のルールの箇所で少し違ったパターンがあります、、、が法則が分かりませんでした・・・。

1.1のルールで拡張子4種類で、完全キー名(接頭語+キー名)
2.1のルールで拡張子4種類で、キー名
3.1のルールで拡張子4種類で、完全キー名から、最初の"."以前の単語を削除したもの
 ("."がなくなるまで繰り返し)

4.2のルールで拡張子4種類で、完全キー名(接頭語+キー名)
5.2のルールで拡張子4種類で、キー名
6.2のルールで拡張子4種類で、完全キー名から、最初の"."以前の単語を削除したもの
 ("."がなくなるまで繰り返し)

7.3のルールで拡張子4種類で、完全キー名(接頭語+キー名)
8.3のルールで拡張子4種類で、キー名
9.3のルールで拡張子4種類で、完全キー名から、最初の"."以前の単語を削除したもの
 ("."がなくなるまで繰り返し)



うーむ・・・。説明文として、かなりイケテナイ、、、(´・ω・`)


ですが、、、まとめると次のようになります。



・プロパティファイルの名前は、WebPage、コンポーネント、WicketApplicationの現在のクラスと、その親クラスの名前が使われる。

 なので、あるクラスのまとまり単位で表示名を変更することが出来そう。

・プロパティファイルの名前は、ロケーション情報と、拡張子の組み合わせによって、4パターンチェックされる。

 なので、ロケーションに合ったファイル名を使ったほうが良さそう。

・プロパティファイルを検索する際は、接頭語を含んだ完全なキー名と、接頭語を含まないキー名が使用される。

 なのでキー名に規約を持たせれば、複数の画面間で共通の設定をする。みたいなことも出来そう。

・キー名が、"." で区切られている場合は、先頭の"."より以前の単語を削除した文字列をキーとして、"."が無くなるまで検索を繰り返す。

 なので、CSSのように、ある階層構造をもったコンポーネントの時だけ指定。みたいなことも出来そう。





あとは、検索順をイメージできれば使いこなせる、、、かも?

うーん。ややこしいなぁ。
どっかにドキュメントないかな・・・。
















管理者にだけ表示を許可する


トラックバックURL:
この記事経由です。 Wicketがプロパティファイルを検索する順番 デバッガで追ってここまで調査したそのやる気がすばらしいです。私そこまでやってなかったので.... 元ネタはセレクトリストの「選択無し」のメッセージを変える話なのですけど、この話はWicketがローカライズ
2007/11/04(日) 07:27:03 | 矢野勉のはてな日記
さて、前回 は Wicket の入口について書きました。普通だと、これからどんどん使うコンポーネントを増やしていくという流れになると思うのです...
2008/07/15(火) 10:00:19 | rio\'s blog
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。