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}