ユーティリティコンポーネント作成プロジェクト†
テキストファイル読み込み†
koichik
uguu さんのご意見を取り入れて S2UtilConfiguration にしてみました.もはや S2Text じゃないぞ? なのでバージョン番号も 0.0.1 のまま (笑)
名前に合わせて全面的に Commons Configuration ベースにしちゃいました.もはや Commons Configuration に OGNL でアクセスすることが主目的で,ついでにヒアドキュメントと J2SE5.0 Properties 風の XML をサポートしているという感じです.
使い方は案 2 とあまり変わっていなくて
<component name="conf" class="org.seasar.util.configuration.PropertiesConfiguration">
<initMethod name="load">
<arg>"org/seasar/util/configuration/PropertiesConfigurationTest.properties"</arg>
</initMethod>
</component>
のように設定ファイルを読み込ませておけば,OGNL 式で
conf["foo.bar"]
のように設定情報にアクセスできます.
上記のようにアクセスした場合にキーに値がマッピングされていなければ例外がスローされます.これは設定で変更することは出来ません.
もしキーが存在しない場合に null を戻して欲しければ,
conf.getProperty("foo.bar")
とすることができます.また,
conf.getInt("foo.bar", 0)
のようにデフォルトを指定することもできます.
s2-util-configuration-0.0.1-src.zip
koichik
こんな感じです.使うときはまず
<component name="env" class="org.seasar.util.text.env.impl.PropertiesEnvironment">
<initMethod name="load">
<arg>"org/seasar/util/text/env/impl/PropertiesEnvironmentTest.properties"</arg>
</initMethod>
</component>
という具合にコンポーネントにファイルをロードして,後は任意の OGNL 式で
env["foo.bar"]
のように使うことが出来ます.
ファイル形式としては suga さんのヒアドキュメントに加えてプロパティファイル,XML ファイルをサポートしています.でもプレーンファイルは用意してません.キーがないと困るので.(^^;
s2-util-text-0.0.1-src.zip
- これは個人的な経験に基づく意見なのですが、指定したキーに対応するデータが存在しない場合は、必ず例外 (KeyNotFoundException) をスローした方が良いかと思います。設定情報を読み込もうとしているのに設定情報が存在しないなんて、ユーザの想定しない状況だと思いますので。 -- uguu
- コメントありがとうございます.現状,デフォルトで KeyNotFoundException を飛ばすようにしていますが,そもそも選択肢をなくして無条件に例外を飛ばす方がよいということでしょうか? 意図的に例外を飛ばさないように設定した場合にキーがないのは「ユーザの想定しない状況」ではないと思うのですが... -- koichik
- そもそも選択肢をなくして無条件に例外をスローして良いと思います。あくまで私の感覚ですが、指定したキーに対する設定情報が存在しないなんておかしな事態ですので、そういう時は例外をスローして欲しいです。私の経験値が足りないせいか、逆に例外をスローして欲しくないケースが分かりません… koichik さん的には必要だと思いますか? -- uguu
- えと,「例外をスローして欲しい」と「例外をスローしない選択肢をなくして欲しい」はかなり違うと思うのですが,選択肢をなくすべき強い理由があるのでしょうか? 私としては「設定情報が存在しないなんておかしな事態」と決めつけることに躊躇してしまうのですが.例えば HttpClient 等を使っていて,プロキシのホストをプロパティファイルから取得するようにした場合,プロパティファイルになければ null が設定されて構わない (プロキシを使わない) みたいなケースがないでしょうか? -- koichik
- なるほど、「例外をスローして欲しい」と「例外をスローしない選択肢をなくして欲しい」は違いますね。理由としては、単純に「選択肢なんて出来るだけ少ないほうがすっきりする」というだけです。 HttpClient の件についても、そのようなケースは考えられますね。私が浅はかでした -- uguu
suga
こんな感じです。(案なので仕様も実装も手抜きですけど)
使うときには OGNL で #test.get("foo") とやるか、直接コンポーネントを受け取って内部メソッドを呼び出すか、ではないでしょうか。
この程度のものですが、作る意義は、エンコーディングの問題や改行コードの問題、例外処理などがあるのでいちいち作るのは面倒、結構汎用的に使える、ということです。
テンプレート的に使うなら MessageFormat と組み合わせて使う、とかでしょうか。
s2util-text.zip
- いい感じですね.個人的に一番ベーシックに使いたいのはプロパティファイル形式なので,そちらもサポートしてもらえると嬉しいです>WRさん.もちろんnative2asciiなんかしないでdiconファイルにエンコード指定ができるといいです(省略時はプラットフォームデフォルトで).commonsにそのためのライブラリがありましたよね. -- koichik
- 複数行にまたがるテキストを扱う場合には,ヒアドキュメントよりもXMLがいいなぁ〜って思ったりするのですが,いかがでしょう? CDATAセクションを使えばエスケープも不要だし今風ではないかと. -- koichik
- 些細なことですが,インタフェースのTextContainerという名前はS2Containerを連想させやすくないでしょうか? 代案としてはTextBundleとかTextProviderとか? -- koichik
- そこらの名前は全然考えていなくて、とりあえず形を出そうとしただけですので、適したものを考えましょう。こういう形であれば、実装が複数あれば良いだけなので、XML 用のものを作れば良いだけかと。 -- suga
- 作れば良いだけは了解なんですが,機能的に完全にかぶっちゃうのでわざわざ作ってもらうほどのことはないかもしれないなぁ,と.こういう用途でXMLを希望する人がどれくらいいるか分からないのです. -- koichik
- sugaさんありがとうございます。流れにのれていませんが、もう少々お待ちを。 -- WR
- テキストファイルの読み込みというより、設定情報の読み込み、つまり jakarta-commons-configuration の Seasar バージョンなんですよね? 名前についての意見ですが、 s2-util-text というより s2-util-configuration の方がしっくりくるのですが、いかがなものでしょうか。 -- uguu