-
Type:
Improvement
-
Resolution: Fixed
-
Priority:
Major
-
Affects Version/s: 2.4.23
-
Component/s: S2Container
-
None
-
Environment:Windows Vista
JDK1.5.0_14
提案
javaではimport句を使えば、いちいち「パッケージ名.クラス名」ではなく、ショット・クラス名のみで引用できます。
しかしdiconファイルを記述する時、componentのclass属性またはOGNL式の中にjava.langパッケージ以外はすべてフル・クラス名で記入しなければなりません。場合によって開発者に大きな負担になりかねません。javaのimport句のように明示的にパッケージとクラスのインポート機能をS2Containerに追加することを提案いたします。
実現方法の説明
S2Containerのソースを分析した結果、インポート機能は実現できて社内プロジェクトに適用されています。S2Containerが提供する公開APIだけではきれいに実装できないところがありますので、できればS2Containerの公式サポートを強く望んでおります。
宣言及び引用方法
XMLドキュメントのprocessing instructionを利用します。記述例:
<?xml version="1.0" encoding="UTF-8" ?> <?java-import java.util.*; com.mydomain.commons.*; com.mydomain.util.DebugUtil; ?> <components> <component name="foo" class="DebugUtil"> <property name="map"> #@TreeMap@{"key1" : "value1", "key2" : "value2"} </property> </component> </components>
実装クラス
- EnhancedXmlS2ContainerBuilder extends XmlS2ContainerBuilder
- <?java-import ?>を認識できる拡張コンテナー・ビルダー
- 以下EnhancedSaxHandlerParserおよびSmartComponentTagHandlerを引用します
- EnhancedSaxHandlerParser
- XMLパーサ、org.seasar.framework.xml.SaxHandlerParserはfinalクラスのため、新規用意
- 以下EnhancedSaxHandlerを引用います
- EnhancedSaxHandler extends DefaultHandler
- <?java-import ?>を解析するハンドラ
- 解析結果はClassImporterのインスタンスにいれます
- SmartComponentTagHandler extends ComponentTagHandler
- componentのclass属性をショット・クラス名を認識できるタグ・ハンドラ
- ショット・クラス名の解決はClassImporterに委託します
- ClassImporter
- インポートしたパッケージ及びクラスのリストを管理します
- ショット・クラス名をインポート済みリストと突き合わせて、クラス・ローダーにクラスをロードさせます
- クラスを見つからない場合は、ルート・クラス・インポート(存在すれば)を使ってさらに検索します
- SmartClassLoader extends ClassLoader
- 親クラスロードおよびClassImporterオブジェクトを持つクラス・ローダー
- ショット・クラス名の解決はClassImporterに任せます、クラスは親クラスによってロードされます
- EnhancedXmlS2ContainerBuilder#parse(parent, path)処理の中で、生成したS2コンテナーにセットされます
- org.seasar.framework.util.OgnlUtil (修正版)
- ClassResolverImpl#classForName(className, ctx)を以下の呼び出しをを修正します:
Class.forName(..) => classLoader.loadClass(className)理由:Class.forName(..)では余分のクラス検証処理がかかりますので、うまくショット・クラス名を解決できません。
参考資料:
http://www.javageeks.com/Papers/ClassForName/ClassForName.pdf
http://blog.bjhargrave.com/2007/07/why-do-classforname-and.html
- ClassResolverImpl#classForName(className, ctx)を以下の呼び出しをを修正します:
使用方法
s2container.diconに名前は「dicon」の「EnhancedXmlS2ContainerBuilder」コンポーネントを追加します:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <include condition="#ENV == 'ut'" path="warmdeploy.dicon"/> <include condition="#ENV == 'ct'" path="hotdeploy.dicon"/> <include condition="#ENV != 'ut' and #ENV != 'ct'" path="cooldeploy.dicon"/> <component name="dicon" class="org.seasar.framework.container.patch.EnhancedXmlS2ContainerBuilder"/> </components>
以上、ご検討をお願いいたします。
リリース後に問題が解消していないことが分かっても手遅れなので,対応後の確認および報告はリリースの前にお願いします.
インポート機能を Seasar2 に取り込む予定はないのでパッチを提供していただく必要はありません.