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//              // 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         * このスレッドは、2秒間スリープ後に、初期処理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}