Uploaded image for project: 'S2Container'
  1. S2Container
  2. CONTAINER-175

SAX サポートクラスの final を外し,OGNL の処理中にクラスを読み込むのを Class#forName() から ClassLoader#loadClass() に変更しました.

    Details

    • Type: Improvement
    • Status: Resolved
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 2.4.23
    • Fix Version/s: 2.4.24
    • Component/s: S2Container
    • Labels:
      None
    • Environment:
      Windows Vista
      JDK1.5.0_14

      Description

      提案
      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コンテナーにセットされます

      使用方法
      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>
      

      以上、ご検討をお願いいたします。

        Attachments

          Activity

            People

            • Assignee:
              koichik koichik
              Reporter:
              fengdh Feng Dihai
            • Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: