isami100のSwingin' Seasar日記

2004-07-12

S2.0.12、S2DaoV1.0.0リリース

えーと、Launcherからの起動で何事も起こらず終了するようになりました。(T_T)?

しばし調査中。。。

S2ContainerImpl#initの対象範囲が、includeせず直接定義されているコンポーネントのみになったから、かな。。。?diconの定義も見直してみよう。継続調査。

やはりincludeによるコンポーネント参照の仕組みが変わったので、diconの記述を修正する必要がありそうです。これまでみたいに役割によるフラットな分割ではなく、親子関係(依存関係?)をベースに分割するのがいいみたい。相互依存(相互参照)しているdiconファイルは1つにまとめないとStackOverflowErrorになります(diconファイルを分割して相互にincludeさせてはダメ)。

いずれにせよ、親のinitを呼んでも子供のコンテナまで自動的にinitしなくなったので、Lancherは直す必要がありそう。

Launcher 改

子供のコンテナのinitを再帰的に呼ぶように修正します。

Launcher.java
package s2study.app.launcher;

import javax.swing.UIManager;
import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;

public class Launcher {

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            SingletonS2ContainerFactory.init();
            initContainer(SingletonS2ContainerFactory.getContainer());
        }
        catch (Exception e) {
            e.printStackTrace();
            System.exit(99);
        }
    }

    private static void initContainer(S2Container container) {
        for (int i = 0; i < container.getChildSize(); i++) {
            initContainer(container.getChild(i));
        }
        container.init();
    }

}

diconファイル再考

これまでの構成は、こんな感じでした。

  • Login.dicon
    • LoginFrame.dicon
    • LoginAction.dicon
    • LoginService.dicon
    • LoginDao.dicon

コンポーネントの参照関係は、次のようにFrameとActionが相互参照していました。

  • LoginFrame.dicon→LoginAction.dicon
  • LoginAction.dicon→LoginFrame.dicon
  • LoginAction.dicon→LoginService.dicon
  • LoginService.dicon→LoginDao.dicon

従来のS2Containerの仕組みでは、ルートのコンテナにすべてのコンポーネントがフラットに集められていたので、同列のdiconファイルに定義されているコンポーネントを参照することができました。*1

新しいS2Containerでは、自身とincludeされている子供とその子孫についてのみ参照でき、親のコンポーネントや兄弟のコンポーネントは参照できません。というわけで、こんな感じの構成にしてみました。

本当は、Daoのdiconファイルはアプリで共通にするのが望ましいですが、とりあえず上記の構成で画面が動くようになります。

TooManyRegistration RuntimeException

EmployeeRef関連のdiconファイルも同様に修正してみました。EmployeeRefMenu.diconとEmployeeRefAction.diconをEmployeeRefFrame.diconに統合、あとはログインと同じようにFrame→Service→Daoの順にinclude。

が、今度はTooManyRegistrationRuntimeExceptionが発生。何故だ???

org.seasar.framework.container.TooManyRegistrationRuntimeException: [ESSR0045]interface javax.swing.Actionに複数のコンポーネント(s2study.ui.ActionAdapter, s2study.ui.ActionAdapter)が登録されています
	at org.seasar.framework.container.impl.TooManyRegistrationComponentDef.getComponent(TooManyRegistrationComponentDef.java:33)
	at org.seasar.framework.container.impl.S2ContainerImpl.getComponent(S2ContainerImpl.java:49)
	at org.seasar.framework.container.assembler.AutoPropertyAssembler.assemble(AutoPropertyAssembler.java:44)
	at org.seasar.framework.container.deployer.SingletonComponentDeployer.assemble(SingletonComponentDeployer.java:49)
	at org.seasar.framework.container.deployer.SingletonComponentDeployer.deploy(SingletonComponentDeployer.java:31)
	at org.seasar.framework.container.deployer.SingletonComponentDeployer.init(SingletonComponentDeployer.java:57)
	at org.seasar.framework.container.impl.ComponentDefImpl.init(ComponentDefImpl.java:220)
	at org.seasar.framework.container.impl.S2ContainerImpl.init(S2ContainerImpl.java:259)
	at s2study.app.launcher.Launcher.initContainer(Launcher.java:25)
	at s2study.app.launcher.Launcher.initContainer(Launcher.java:23)
	at s2study.app.launcher.Launcher.initContainer(Launcher.java:23)
	at s2study.app.launcher.Launcher.main(Launcher.java:13)

原因判明

どうやら、JFormattedTextFieldについてactionプロパティがautoBindingされることが原因の模様。これらについて、autoBinding="none"を指定することで、とりあえずTooManyRegistrationの問題は解消。*2今まではdiconファイルがFrameとActionで分かれていたからautoBinding対象にならなかったのかな??

もう1つの問題

HSQLDBにコネクションを張る部分で固まるようになった。ポートは9001で変わってないし、HSQLDBのDatabaseManagerからは接続可能。j2ee.diconの中身は変わってない模様。むー。

原因判明。サーバとして使っていたhsqldb.jarのバージョンが古かった。orz

これでとりあえず問題はすべてクリアになった。かな?

*1ex.)LoginFrame.diconに定義されているコンポーネントからLoginAction.diconに定義されているコンポーネントを参照することが可能

*2:JMenuについても同様

wizardpwizardp2004/07/12 19:06普通なら『機能・レイヤごとに設定ファイルが分かれてすっきり』なんでしょうけど、Swingだとプレゼンテーションレイヤ内で相互依存しているケースが多いので、プレゼンテーションレイヤのdiconファイルが肥大化してしまいますね。

higayasuohigayasuo2004/07/13 06:56子コンテナのinit,destroyを呼び出さないのはバグですね。修正します。

isami100isami1002004/07/13 09:58UI層のdiconファイルが統合されるのは、descriptionタグやコメント等を使って見易くなるよう工夫が必要ですね。まだインストールしてませんがキジムナ使えば編集もしやすくなるかも。initの件は了解です。よろしくお願いします。