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 *     <listener>
048 *         <listener-class>
049 *             org.opengion.hayabusa.common.HybsContextListener
050 *         </listener-class>
051 *     </listener>
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         * このスレッドは、2秒間スリープ後に、初期処理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}