    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                Map<String,String> param = SystemParameter.makeSystemParameter( context );
    090                HybsSystem.setInitialData( param );                     // 4.0.0 (2005/01/31)
    091
    092                // 4.3.4.1 (2008/12/08) ログの環境変数対応
    093                LogWriter.init( HybsSystem.url2dir( System.getProperty( "SYS_LOG_URL" ,HybsSystem.sys( "SYS_LOG_URL" ) ) ) );
    094
    095                // CONTEXT_INITIAL_CALL_URL で登録されたURLを実行します。
    096                // 処理は、contextInitialized が終了してから実行する必要があります。
    097                new Thread( new InitialCallURL() ).start();
    098
    099                System.out.println( "-------" );
    100        }
    101
    102        /**
    103         *  ServletContextListener インターフェースの実装
    104         *
    105         * Webアプリケーションがシャットダウンされることを
    106         * リスナーに通知する。
    107         *
    108         * @og.rev 3.1.1.1 (2003/04/03) キャッシュクリアメソッドを新規追加。
    109         * @og.rev 3.3.3.3 (2003/08/06) HybsTimerTaskManager を終了時にキャンセルするロジックを追加。
    110         * @og.rev 3.5.2.1 (2003/10/27) リンクエラー対策：永続化セッション(SESSIONS.ser)からオブジェクトを削除しておく。
    111         * @og.rev 3.6.0.0 (2004/09/17) CalendarFactory.clear() を追加します。
    112         * @og.rev 4.0.0.0 (2005/01/31) コンテキスト名の取り方を変更します。
    113         * @og.rev 4.0.0.0 (2005/01/31) Cleanable インターフェースによる初期化処理
    114         * @og.rev 4.0.0.0 (2005/01/31) HybsTimerTaskManager は、Cleanable インターフェースによる初期化
    115         * @og.rev 4.1.0.0 (2007/12/27) GE12のクリア処理追加
    116         * @og.rev 4.3.0.0 (2008/07/18) soffice.binのタスクを削除する処理を追加
    117         * @og.rev 5.0.2.0 (2009/11/01) 再編成機能追加
    118         *
    119         * @param  event コンテキストイベント
    120         */
    121        public void contextDestroyed( final ServletContextEvent event ) {
    122                String name = HybsSystem.sys( "CONTEXT_NAME" );
    123                System.out.println( "Context Destroyed [" + name + "]  " + new Date() );
    124
    125                // 4.1.0.0 (2007/12/26) GE12からSystemParameterで設定したコンテキスト関係の情報
    126                SystemManager.clearGE12();
    127
    128                // 4.0.0 (2005/01/31) Cleanable インターフェースによる初期化処理
    129                SystemManager.allClear( true ) ;
    130
    131                // 4.3.0.0 (2008/07/18) soffice.binを全てkillします
    132        //      SystemManager.sofficeKill();
    133
    134                SystemManager.sessionDestroyed();               // 3.5.2.1 (2003/10/27)
    135
    136                SystemManager.deleteGUIAccessInfo();    // 5.0.2.0 (2009/11/01)
    137
    138                System.out.println( "-------" );
    139        }
    140
    141        /**
    142         * CONTEXT_INITIAL_CALL_URL を起動する為のスレッド内部クラスです。
    143         *
    144         * HybsContextListener が正常終了しないと、Tomcatが起動したことになっていない為、
    145         * 通常のJSP処理が出来ません。
    146         * ここでは、Tomcat起動時に初期処理URL(CONTEXT_INITIAL_CALL_URL)をコールする為に、
    147         * 時間差を利用する為、スレッド化して実行させます。
    148         * このスレッドは、２秒間スリープ後に、初期処理URLを呼び出します。
    149         *
    150         * @og.rev 4.2.2.0 (2008/05/22) 初期URLの接続ユーザーをシステムリソースより取得
    151         *
    152         * @og.group ログイン制御
    153         *
    154         * @version  4.0
    155         * @author   Kazuhiko Hasegawa
    156         * @since    JDK5.0,
    157         */
    158        private static class InitialCallURL implements Runnable {
    159                /**
    160                 * スレッドの処理開始メソッド
    161                 *
    162                 */
    163                public void run() {
    164                        try {
    165                                Thread.sleep( 2000 );
    166                        }
    167                        catch ( InterruptedException ex) {
    168                                LogWriter.log( "InterruptedException:" + ex.getMessage() );
    169                        }
    170
    171                        HybsEntry[] urls = HybsSystem.sysEntry( "CONTEXT_INITIAL_CALL_URL" );
    172                        String userPass = HybsSystem.sys( "CONTEXT_INITIAL_CALL_USERPASS" );
    173                        boolean isCall = false;
    174                        for( int i=0; i<urls.length; i++ ) {
    175                                String url = urls[i].getValue();
    176                                if( url == null || url.length() == 0 ) { continue; }
    177                                URLConnect conn = new URLConnect( url,userPass );
    178                                try {
    179                                        conn.connect();
    180                                        String msg = conn.getCode() + ":" + conn.getMessage() ;
    181                                        conn.disconnect();
    182                                        System.out.println( "    URL[" + i + "]:" + url );
    183                                        System.out.println( "           " + msg );
    184                                        isCall = true ;
    185                                }
    186                                catch( IOException ex ) {
    187                                        LogWriter.log( "    URL[" + i + "]:" + url );
    188                                        LogWriter.log( "           " + ex.getMessage() );
    189                                }
    190                        }
    191                        if( isCall ) {
    192                                System.out.println( "  CONTEXT_INITIAL_CALL_URL" );
    193                                System.out.println( "-------" );
    194                        }
    195                }
    196        }
    197}