Tomcat Plug-in 探求

昨日、行きづまってしまったので、ちょっと視点を変えようと思います。

何をするかというと、LG3D Plug-in で作ろうとしている機能と同じようなことを実現している Plug-in をパクろう 参考にしようと思っているわけです。

で、探したのが Sysdeo Tomcat Launcher Plug-in です。有名らしいので、皆さんご存じですよね。もちろん、Eclipse 3 完全攻略にものってました。

さっそく、これをダウンロードしてみました。

この Plug-in でできることを見てみると

  • Tomcat の起動、停止、再起動
  • Tomcat をデバッガーに登録
  • WARプロジェクトの作成
  • WARファイルの作成

LG3D Plug-in でやりたいことに似てません?

ということで、この Tomcat Plug-in を調べることにしたわけです。

まずは手始めに Extension Points を見てみます。

Tomcat Plugin Extension Points Tab

こんな感じになっているわけですね。実際に使われているものを見ると勉強になります。

Tomcat の起動

手始めにメニューバーとツールバーの Tomcat の起動、停止、再起動からでしょうか。

たぶん、起動も停止も再起動もやっていることは大して違わないと思うので、起動だけ見れば十分でしょう。

起動のアクションは StartActionDelegator クラスです。ボタンが押されたとき or メニューが選択されたときは run メソッドがコールされるんですよね。

で、StartActionDelegator クラスを見てみたら、run メソッド以外はデフォルトのものと同じでした。

    public void run(IAction action) {
        if(TomcatLauncherPlugin.checkTomcatSettingsAndWarn()) {                
            TomcatLauncherPlugin.log(TomcatLauncherPlugin.getResourceString("msg.start"));
            try {    
                TomcatLauncherPlugin.getDefault().getTomcatBootstrap().start();
            } catch (Exception ex) {
                String msg = TomcatLauncherPlugin.getResourceString("msg.start.failed");
                TomcatLauncherPlugin.log(msg + "/n");
                TomcatLauncherPlugin.log(ex);            
            }
        }
    }

ログや例外処理をのぞけばやっていることは

              TomcatLauncherPlugin.getDefault().getTomcatBootstrap().start();

この 1 行だけですね。

そうか getDefault メソッドはこういうときに使うわけですね。ということは XXXXPlugin クラスはプラグインのライフサイクル管理もおこなうとは思いますけど、MVC でいうところのモデルに対するビューもしくはコントローラからのファサードになっているわけですか。

で、TomcatLauncherPlugin クラスの getTomcatBootstrap メソッドはどうなっているかというと

    public TomcatBootstrap getTomcatBootstrap() {
        TomcatBootstrap tomcatBootsrap = null;
		
        if(getTomcatVersion().equals(TOMCAT_VERSION3)) {
            tomcatBootsrap = new Tomcat3Bootstrap();
        }
        if(getTomcatVersion().equals(TOMCAT_VERSION4)) {
             tomcatBootsrap = new Tomcat4Bootstrap();				
        }
        if(getTomcatVersion().equals(TOMCAT_VERSION41)) {
            tomcatBootsrap = new Tomcat41Bootstrap();				
        }		
        if(getTomcatVersion().equals(TOMCAT_VERSION5)) {
            tomcatBootsrap = new Tomcat5Bootstrap();				
        }
				
        return tomcatBootsrap;
    }

Tomcat のバージョンによってブートするためのクラスを変えているんですね。でも、私だったらもう少し効率的に書くけどなぁ。こんな if 文なんか書かなくてもいいと思うんですが。

まぁ、いいや。そんなこと。

で、どのクラスでもだいたい同じだと思うので、Tomcat5Bootstrap クラスを見てみることに。目的のメソッドは start です。

ありゃ、ない。ということは Tomcat5Bootstrap クラスの親クラスの TomcatBootstrap ですね。

    public void start() throws CoreException {
        this.runTomcatBootsrap(getStartCommand(), true, RUN);
    }

ということは、stop メソッドは

    public void start() throws CoreException {
        this.runTomcatBootsrap(getStopCommand(), false, RUN);
    }

ということで、同じメソッド runTomcatBootstrap メソッドをコールしてました。

で、runTomcatBootstrap メソッドですが... 長い ^^;;

後は明日。