    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.hayabusa.common;
    017
    018import org.opengion.fukurou.db.ConnectionFactory;
    019import org.opengion.fukurou.util.Cleanable;
    020import org.opengion.fukurou.util.HybsEntry;
    021import org.opengion.fukurou.util.URLConnect;
    022import org.opengion.fukurou.util.LogWriter;
    023import java.util.Date;
    024import java.util.Map;
    025
    026import javax.servlet.ServletContextListener;
    027import javax.servlet.ServletContextEvent;
    028import javax.servlet.ServletContext;
    029
    030import java.io.IOException;
    031
    032/**
    033 * ServletContextListener を実装した、コンテキストの監視オブジェクトです。
    034 * これは、コンテキスト(Webアプリケーション)の起動/シャットダウンを監視できる。
    035 *
    036 * ServletContextListener は、
    037 *
    038 *      ConnectionFactory のコネクションプールへのアクセス／開放
    039 *      ResourceFactory   のリソース情報へのアクセス／開放
    040 *
    041 * の作業を行います。
    042 *
    043 * このリスナーは、WEB-INF/web.xml で、組み込みます。
    044 *
    045 * 【WEB-INF/web.xml】
    046 *
    047 *     &lt;listener&gt;
    048 *         &lt;listener-class&gt;
    049 *             org.opengion.hayabusa.common.HybsContextListener
    050 *         &lt;/listener-class&gt;
    051 *     &lt;/listener&gt;
    052 *
    053 * @og.group 初期化
    054 *
    055 * @version  4.0
    056 * @author   Kazuhiko Hasegawa
    057 * @since    JDK5.0,
    058 */
    059public class HybsContextListener implements ServletContextListener {
    060        // 4.0.0.0 (2007/10/26) ConnectionFactoryのhayabusa依存を切るために移動してきた
    061        static {
    062                final Cleanable clr = new Cleanable() {
    063                        public void clear() {
    064                                ConnectionFactory.realClose();
    065                        }
    066                };
    067                SystemManager.addCleanable( clr );
    068        }
    069
    070        /**
    071         *  ServletContextListener インターフェースの実装
    072         *
    073         * Webアプリケーションがリクエストを処理できる状態になったことを
    074         * リスナーに通知する。
    075         *
    076         * @og.rev 3.0.0.0 (2002/12/25) バージョンチェック、HybsSystem初期化追加
    077         * @og.rev 3.4.0.0 (2003/09/01) Contextのpathによる、システムパラメータ の切り替え対応
    078         * @og.rev 3.4.0.3 (2003/09/10) ServletContext の名称を、仮想パス名とする。
    079         * @og.rev 3.5.3.1 (2003/10/31) システムパラメータ ファイルの読み取りタイミングを遅らせます。
    080         * @og.rev 4.0.0.0 (2005/01/31) Ver4 のシステムパラメータ情報の取得処理を追加します。
    081         * @og.rev 4.1.0.1 (2008/01/23) ログ出力先の設定処理を追加
    082         * @og.rev 4.3.4.1 (2008/12/08) ログの環境変数対応
    083         *
    084         * @param  event コンテキストイベント
    085         */
    086        public void contextInitialized( final ServletContextEvent event ) {
    087                ServletContext context = event.getServletContext();
    088
    089//              // 4.0.0.0 (2007/10/26) ConnectionFactoryのhayabusa依存を切るために移動してきた
    090//              final Cleanable clr = new Cleanable() {
    091//                      public void clear() {
    092//                              ConnectionFactory.realClose();
    093//                      }
    094//              };
    095//              SystemManager.addCleanable( clr );
    096
    097                Map<String,String> param = SystemParameter.makeSystemParameter( context );
    098                HybsSystem.setInitialData( param );                     // 4.0.0 (2005/01/31)
    099
    100                // 4.3.4.1 (2008/12/08) ログの環境変数対応
    101//              LogWriter.init( HybsSystem.url2dir( HybsSystem.sys( "SYS_LOG_URL" ) ) ); // 4.1.0.1 (2008/01/23)
    102                LogWriter.init( HybsSystem.url2dir( System.getProperty( "SYS_LOG_URL" ,HybsSystem.sys( "SYS_LOG_URL" ) ) ) );
    103
    104                // CONTEXT_INITIAL_CALL_URL で登録されたURLを実行します。
    105                // 処理は、contextInitialized が終了してから実行する必要があります。
    106                new Thread( new InitialCallURL() ).start();
    107
    108                System.out.println( "-------" );
    109        }
    110
    111        /**
    112         *  ServletContextListener インターフェースの実装
    113         *
    114         * Webアプリケーションがシャットダウンされることを
    115         * リスナーに通知する。
    116         *
    117         * @og.rev 3.1.1.1 (2003/04/03) キャッシュクリアメソッドを新規追加。
    118         * @og.rev 3.3.3.3 (2003/08/06) HybsTimerTaskManager を終了時にキャンセルするロジックを追加。
    119         * @og.rev 3.5.2.1 (2003/10/27) リンクエラー対策：永続化セッション(SESSIONS.ser)からオブジェクトを削除しておく。
    120         * @og.rev 3.6.0.0 (2004/09/17) CalendarFactory.clear() を追加します。
    121         * @og.rev 4.0.0.0 (2005/01/31) コンテキスト名の取り方を変更します。
    122         * @og.rev 4.0.0.0 (2005/01/31) Cleanable インターフェースによる初期化処理
    123         * @og.rev 4.0.0.0 (2005/01/31) HybsTimerTaskManager は、Cleanable インターフェースによる初期化
    124         * @og.rev 4.1.0.0 (2007/12/27) GE12のクリア処理追加
    125         * @og.rev 4.3.0.0 (2008/07/18) soffice.binのタスクを削除する処理を追加
    126         * @og.rev 5.0.2.0 (2009/11/01) 再編成機能追加
    127         *
    128         * @param  event コンテキストイベント
    129         */
    130        public void contextDestroyed( final ServletContextEvent event ) {
    131                String name = HybsSystem.sys( "CONTEXT_NAME" );
    132                System.out.println( "Context Destroyed [" + name + "]  " + new Date() );
    133
    134                // 4.1.0.0 (2007/12/26) GE12からSystemParameterで設定したコンテキスト関係の情報
    135                SystemManager.clearGE12();
    136
    137                // 4.0.0 (2005/01/31) Cleanable インターフェースによる初期化処理
    138                SystemManager.allClear( true ) ;
    139
    140                // 4.3.0.0 (2008/07/18) soffice.binを全てkillします
    141//              SystemManager.sofficeKill();
    142
    143                SystemManager.sessionDestroyed();               // 3.5.2.1 (2003/10/27)
    144
    145                SystemManager.deleteGUIAccessInfo();    // 5.0.2.0 (2009/11/01)
    146
    147                System.out.println( "-------" );
    148        }
    149
    150        /**
    151         * CONTEXT_INITIAL_CALL_URL を起動する為のスレッド内部クラスです。
    152         *
    153         * HybsContextListener が正常終了しないと、Tomcatが起動したことになっていない為、
    154         * 通常のJSP処理が出来ません。
    155         * ここでは、Tomcat起動時に初期処理URL(CONTEXT_INITIAL_CALL_URL)をコールする為に、
    156         * 時間差を利用する為、スレッド化して実行させます。
    157         * このスレッドは、２秒間スリープ後に、初期処理URLを呼び出します。
    158         *
    159         * @og.rev 4.2.2.0 (2008/05/22) 初期URLの接続ユーザーをシステムリソースより取得
    160         *
    161         * @og.group ログイン制御
    162         *
    163         * @version  4.0
    164         * @author   Kazuhiko Hasegawa
    165         * @since    JDK5.0,
    166         */
    167        private static class InitialCallURL implements Runnable {
    168                /**
    169                 * スレッドの処理開始メソッド
    170                 *
    171                 */
    172                public void run() {
    173                        try {
    174                                Thread.sleep( 2000 );
    175                        }
    176                        catch ( InterruptedException ex) {
    177                                LogWriter.log( "InterruptedException:" + ex.getMessage() );
    178                        }
    179
    180                        HybsEntry[] urls = HybsSystem.sysEntry( "CONTEXT_INITIAL_CALL_URL" );
    181//                      String userPass = "SYSTEM:MANAGER" ;
    182                        String userPass = HybsSystem.sys( "CONTEXT_INITIAL_CALL_USERPASS" );
    183                        boolean isCall = false;
    184                        for( int i=0; i<urls.length; i++ ) {
    185                                String url = urls[i].getValue();
    186                                if( url == null || url.length() == 0 ) { continue; }
    187                                URLConnect conn = new URLConnect( url,userPass );
    188                                try {
    189                                        conn.connect();
    190                                        String msg = conn.getCode() + ":" + conn.getMessage() ;
    191                                        conn.disconnect();
    192                                        System.out.println( "    URL[" + i + "]:" + url );
    193                                        System.out.println( "           " + msg );
    194                                        isCall = true ;
    195                                }
    196                                catch( IOException ex ) {
    197                                        LogWriter.log( "    URL[" + i + "]:" + url );
    198                                        LogWriter.log( "           " + ex.getMessage() );
    199                                }
    200                        }
    201                        if( isCall ) {
    202                                System.out.println( "  CONTEXT_INITIAL_CALL_URL" );
    203                                System.out.println( "-------" );
    204                        }
    205                }
    206        }
    207}