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 */
016 package org.opengion.hayabusa.common;
017
018 import java.io.IOException;
019 import java.io.PrintWriter;
020 import java.io.UnsupportedEncodingException;
021 import java.lang.reflect.Field;
022 import java.lang.reflect.Modifier;
023 import java.net.MalformedURLException;
024 import java.net.URL;
025 import java.sql.Connection;
026 import java.sql.PreparedStatement;
027 import java.sql.ResultSet;
028 import java.sql.SQLException;
029 import java.util.ArrayList;
030 import java.util.Date;
031 import java.util.Enumeration;
032 import java.util.HashMap;
033 import java.util.LinkedHashMap;
034 import java.util.TreeMap;
035 import java.util.List;
036 import java.util.Locale;
037 import java.util.Map;
038 import java.util.Set;
039
040 import javax.servlet.ServletContext;
041
042 import org.opengion.fukurou.db.ConnectionFactory;
043 import org.opengion.fukurou.util.Closer;
044 import org.opengion.fukurou.util.FindClassFiles;
045 import org.opengion.fukurou.util.LogWriter;
046
047 /**
048 * ログインしたサーブレ?コン?ストに対応したシス?パラメータ??タを取得するクラスです?
049 *
050 * シス?パラメータ??タ(GE12)は、パラメータ(PARAM_ID)に対して、各種設定?(PARAM)?
051 * 持って?す?
052 * 従来は、resource.シス?パラメータ の?設定用の シス?パラメータ ファイルと
053 * エンジン?で持って? org/hsgw/hayabusa/resource/properties の
054 * シス?パラメータ ファイルにより維持されて?したが?シス?パラメータ
055 * 定義??ブル(GE12)と、commom/SystemData.java クラスによる管?変更されました?
056 *
057 * シス?パラメータは??へのアクセスを決定するため?初期設定?を定義する?があります?
058 * これは、?アプリケーション・?スクリプタ(WEB-INF/web.xml)に、context-param として?
059 * キーと値のセ?で、?期アクセス用の??を渡します?
060 * シス?パラメータ定義??ブル(GE12)には、SYSTEM_IDとして??常のシス?IDと?
061 * エンジンパラメータがあります?エンジンパラメータは、SYSTEM_ID='**'として、登録
062 * されて?す?
063 *
064 * <table border="1" frame="box" rules="all" >
065 * <tr><th>種? </th><th>SYSTEM_ID</th><th>KBSAKU</th><th>説?/th></tr>
066 * <tr><td>エンジン共?/td><td>** </td><td>0 </td><td>エンジン共通で定義して?パラメータ</td></tr>
067 * <tr><td>エンジン個別</td><td>個別 </td><td>0 </td><td>シス?毎にエンジンが登録して?パラメータ</td></tr>
068 * <tr><td>シス?共?/td><td>** </td><td>1 </td><td>シス?毎にエンジンが登録して?パラメータ</td></tr>
069 * <tr><td>シス?個別</td><td>個別 </td><td>1 </td><td>シス?毎に??が独自に登録して?パラメータ</td></tr>
070 * </table>
071 *
072 * アプリケーション・?スクリプタ(WEB-INF/web.xml)設定情報
073 * <table border="1" frame="box" rules="all" >
074 * <tr><th>パラメータ </th><th>設定??/th><th>解説</th></tr>
075 * <tr><td>SYSTEM_ID </td><td>GE </td>こ?アプリケーションのシス?ID</tr>
076 * <tr><td>TOMCAT_PORT</td><td>8823 </td>Tomcat起動時ポ?ト番号</tr>
077 * <tr><td>LOG_FILE </td><td>log/log_$(yyyyMMdd).txt</td>JSPアクセスログ出力?</tr>
078 * </table>
079 *
080 * ※ 5.6.7.0 (2013/07/27)
081 * InitFileLoader により、特定?クラスパス?? 拡張XDK 形式? xml ファイル を??ます?
082 * クラスパスが?"/resource" 以下?すべての xml ファイルは、DBID?RESOURCE の接続?に対して処?れます?
083 * クラスパスが?"/xml" 以下?すべての xml ファイルは、DBID?DEFAULT の接続?に対して処?れます?
084 * ?ラスパス以下?ファイルは、実フォル?も?jar形式に圧縮された形式でも??れます?
085 *
086 * @og.rev 4.0.0.0 (2005/01/31) 新規作?
087 * @og.rev 4.0.0.0 (2007/10/26) loadDBResourceのコネクションをFactoryから取るように変更
088 * @og.group 初期?
089 *
090 * @version 4.0
091 * @author Kazuhiko Hasegawa
092 * @since JDK5.0,
093 */
094 public final class SystemParameter {
095
096 /**
097 * ?ォルトコンストラクターをprivateにして?
098 * オブジェクト?生?をさせな??する?
099 *
100 */
101 private SystemParameter() {}
102
103 /** plugin クラスの取得用クラスパス??{@value} */
104 public static final String PLUGIN = "org/opengion/plugin";
105
106 /** シス?共?個別パラメータ(SYSTEM_ID in ('**',?) KBSAKU != '0')の?読込のクエリー {@value} */
107 // public static final String QUERY = "SELECT PARAM_ID,PARAM,FGCRYPT"
108 // + " FROM GE12 WHERE SYSTEM_ID IN (?,'**')"
109 // + " AND ( CONTXT_PATH IS NULL OR CONTXT_PATH = ?)"
110 // + " AND FGJ='1' AND KBSAKU != '0'"
111 // + " ORDER BY SYSTEM_ID,CONTXT_PATH DESC,KBSAKU,SEQNO" ;
112 // 4.0.0.0 (2007/10/05) CONTXT_PATH に、DEFAULT '**' NOT NULL 制?付ける?
113 /** シス?共?個別パラメータ(SYSTEM_ID in ('**',?) KBSAKU > '0')の?読込のクエリー {@value} */
114 public static final String QUERY = "SELECT PARAM_ID,PARAM,FGCRYPT"
115 + " FROM GE12 WHERE SYSTEM_ID IN (?,'**')"
116 + " AND CONTXT_PATH IN (?,'**')"
117 + " AND FGJ='1' AND KBSAKU > '0'"
118 + " ORDER BY SYSTEM_ID,CONTXT_PATH,FGJ,KBSAKU,SEQNO" ;
119
120 /** シス?共?個別パラメータ(SYSTEM_ID in ('**',?) KBSAKU > '0')の?登録のクエリー {@value} */
121 public static final String INS_SYS = "INSERT INTO GE12"
122 + " ( SYSTEM_ID,CONTXT_PATH,PARAM_ID,SEQNO,PARAM,TITLE,CONTENTS,PARAM_LVL,FGJ,KBSAKU )"
123 + " SELECT"
124 + " ?,?,?,?,?,TITLE,CONTENTS,PARAM_LVL,'1','0'"
125 + " FROM GE12 WHERE SYSTEM_ID='**' AND FGJ='1' AND KBSAKU='0' AND PARAM_ID=?" ;
126
127 /** エンジン個別(SYSTEM_ID='個別' KBSAKU='0' CONTXT_PATH='自身')パラメータの?削除のクエリー {@value} */
128 public static final String DEL_SYS = "DELETE FROM GE12 WHERE SYSTEM_ID=? AND KBSAKU='0' AND CONTXT_PATH=?";
129
130 /** シス?パラメータ構築中のエラーをセ?して?ます? */
131 private static final List<String> errMsgList = new ArrayList<String>();
132
133 /**
134 * コン?スト毎に シス?パラメータオブジェクトを作?します?
135 * こ?クラスのスタート?イントメソ?になります?
136 *
137 * @og.rev 4.1.0.1 (2008/01/23) ログ出力?の変更(全てLogWriter経由で出?
138 * @og.rev 5.5.4.4 (2012/07/20) LogWriter.log 追?
139 * @og.rev 5.5.4.4 (2012/07/20) SQLException は、catch して?ので、loadDBResource からは、throws されな??
140 *
141 * @param context Servletコン?ス?
142 *
143 * @return シス?パラメータのマッ?
144 */
145 public static Map<String,String> makeSystemParameter( final ServletContext context ) {
146 // 4.1.0.1 (2008/01/23) ログ出力?全てLogWriterで行うため、?
147 // try {
148 // String file = context.getInitParameter( "LOG_FILE" );
149 // if( file != null ) {
150 // // 日付フォー??ファイル名を変換します?
151 // DateSet dateSet = new DateSet();
152 // file = dateSet.changeString( file );
153 // // 4.1.0.0 (2008/01/12) 絶対パスでな??合?連?
154 // if( ! new File( file ).isAbsolute() ) {
155 // String path = context.getRealPath( "/" );
156 // file = path + file;
157 // }
158 //
159 // // append モードで自動フラ?ュON
160 // System.setErr( new PrintStream( new FileOutputStream( file,true ),true ) );
161 // }
162 // }
163 // catch( FileNotFoundException ex ) {
164 // LogWriter.log( "web.xml InitParameter \"LOG_FILE\" is abusion." );
165 // LogWriter.log( ex.getMessage() );
166 // }
167
168 errMsgList.clear() ; // 呼び出し?度、エラーリストをクリアします?
169
170 Map<String,String> engParam = null;
171 Map<String,String> sysParam = null;
172 try {
173 String contextName = getContextName( context );
174
175 System.out.println( "Context Initialized [" + contextName + "] " + new Date() );
176 System.out.print( " Version [" + BuildNumber.VERSION_NO + " " );
177 System.out.print( BuildNumber.BUILD_TYPE );
178 System.out.println( "]" );
179
180 // シス???タクラスより、エンジンパラメータ??を?期設定します?
181 // エンジンパラメータは、SystemData クラスの public static メンバ?です?
182 engParam = loadParameter( SystemData.class );
183
184 // コン?ストより取得できるシス?パラメータ??を取得します?
185 // web.xml で設定したパラメータを取得します?
186 // SYSTEM_ID,DB_DRIVER,DB_URL などは、loadDBResource で使用します?
187 sysParam = loadInitialParameter( context,contextName );
188
189 // シス?個別に設定される、エンジン起動時??を?期設定します?
190 // エンジン起動時??は、BuildNumber クラスの public static メンバ?です?
191 sysParam.putAll( loadParameter( BuildNumber.class ) );
192 sysParam.putAll( loadParameter( PLUGIN ) );
193
194 // GE12 ??タベ?スより読み取ります?
195 // 引数のMapに読み込んだ値を追??Map を返します?
196 // つまり?シス?パラメータ??の上書きを行います?
197 // 5.5.4.4 (2012/07/20) SQLException は、catch して?ので、loadDBResource からは、throws されな??
198 // try {
199 sysParam = loadDBResource( sysParam );
200 // }
201 // catch( SQLException ex ) {
202 // String errorMsg = "DB終?close)処?実行できませんでした? + HybsSystem.CR
203 // + ex.getMessage() + ":" + ex.getSQLState() ;
204 // LogWriter.log( ex ); // 5.5.4.4 (2012/07/20) LogWriter.log 追?
205 // errMsgList.add( errorMsg );
206 // }
207 }
208 catch( Throwable th ) { // 3.6.1.0 (2005/01/05)
209 LogWriter.log( th ); // 5.5.4.4 (2012/07/20) LogWriter.log 追?
210 errMsgList.add( th.getMessage() );
211 }
212 finally {
213 // 初期値のエンジンパラメータに個別のシス?パラメータを追?定します?
214 // つまり?エンジンパラメータ??に上書きを行います?
215 if( engParam != null ) {
216 engParam.putAll( sysParam );
217 }
218 else {
219 engParam = new HashMap<String,String>();
220 }
221
222 int errCnt = errMsgList.size();
223 if( errCnt > 0 ) {
224 StringBuilder buf = new StringBuilder();
225 buf.append( "【シス?パラメータの初期化に失敗しました。?" );
226 buf.append( HybsSystem.CR );
227 buf.append( "Tomcat の設定状況をご確認く???" );
228 buf.append( HybsSystem.CR );
229 buf.append( "========================================" );
230 buf.append( HybsSystem.CR );
231
232 for( int i=0; i<errCnt; i++ ) {
233 buf.append( errMsgList.get(i) );
234 buf.append( HybsSystem.CR );
235 buf.append( "----------------------------------------" );
236 buf.append( HybsSystem.CR );
237 }
238 System.out.println( buf );
239 engParam.put( HybsSystem.LOCAL_CONTX_ERR_KEY,buf.toString() );
240 }
241 }
242 return engParam ;
243 }
244
245 /**
246 * コン?ストより?アプリケーション設定情報を取得します?
247 * 初期値は、アプリケーション・?スクリプタ(WEB-INF/web.xml)に
248 * context-param として、キーと値のセ?で、?期アクセス用の??を渡します?
249 * ??タベ?スへの接続?、WEB-INF の DBConfig.xml で設定された??を使用します?
250 *
251 * ここでは、各コン?スト毎????を取得します?そ?中には?
252 * BuildNumber クラスで定義されて??フィールド属?も含まれます?
253 *
254 * REAL_PATH : アドレス(/)に対する、実ディレクトリパス
255 * CONTEXT_NAME : アクセス先?仮想フォル?(URLのコン?スト名)
256 * JSP : アクセス先?JSPフォル?(/URLのコン?スト名/jsp)
257 * SYSTEM_ID : web.xml で?する?SYSTEM_ID の設定?
258 * TOMCAT_PORT : web.xml で?する?Tomcat起動時ポ?ト番号(8823)
259 * LOG_FILE : web.xml で?する?JSPアクセスログ出力?(log/log_$(yyyyMMdd).txt)
260 * SERVER_INFO : サーバ??? [例?HN50G5 ( 200.1.50.165 ) ]
261 * SERVLET_INFO : サーブレ??? [例?Apache Tomcat/5.5.9 ]
262 * TOMCAT_WORK : Tomcatワークの位置 [例?H:\java\tomcat5.5.17\work\Catalina\localhost\ver4 ]
263 * JAVA_HOME : Java実行環??位置 [例?H:\java\jdk150\jre ]
264 * ENGINE_INFO : バ?ジョン番号 [例?4.3.6.6 ]
265 *
266 * @og.rev 4.1.0.0 (2007/12/27) web.xmlからTOMCAT_PORTを読???追?
267 * @og.rev 4.2.0.0 (2008/02/18) TOMCAT_PORTを環?数から取得するよ?更
268 * @og.rev 4.2.0.0 (2008/02/20) web.xmlでSYSTEM_IDが空白の場合に大?コン?スト名が設定されるよう変更
269 * @og.rev 4.3.6.6 (2009/05/15) コン?スト単位にエンジンバ?ジョン??を持つ(バ?ジョンア??判定用)
270 *
271 * @param context Servletコン?ス?
272 * @param contextName コン?スト名
273 *
274 * @return シス?パラメータのマッ?
275 */
276 private static Map<String,String> loadInitialParameter( final ServletContext context,final String contextName ) {
277 Map<String,String> map = new LinkedHashMap<String,String>();
278
279 // コン?スト?初期化パラメータ他???を登録しておきます?
280 Enumeration<?> enume = context.getInitParameterNames() ; // 4.3.3.6 (2008/11/15) Generics警告対?
281 while( enume.hasMoreElements() ) {
282 String key = (String)enume.nextElement();
283 String val = context.getInitParameter( key );
284 if( val != null && val.length() == 0 ) { val = null; }
285 map.put( key,val );
286 }
287
288 // SYSTEM_IDがnullの場合?大??コン?スト名を設?
289 if( map.get( "SYSTEM_ID" ) == null ){ // 4.2.0.0 (2008/02/20)
290 map.put( "SYSTEM_ID", contextName.toUpperCase( Locale.JAPAN ) );
291 }
292
293 // ?シス???を登録しておきます?
294 map.put( "REAL_PATH" ,context.getRealPath( "/" ) );
295 map.put( "CONTEXT_NAME" ,contextName );
296 map.put( "JSP" ,"/" + contextName + "/jsp" );
297 map.put( "SERVLET_INFO" ,context.getServerInfo() );
298 map.put( "TOMCAT_WORK" ,String.valueOf( context.getAttribute( "javax.servlet.context.tempdir" ) ) );
299 map.put( "JAVA_HOME" ,System.getProperty( "java.home" ) );
300
301 map.put( "HOST_NAME" ,HybsSystem.HOST_NAME );
302 map.put( "HOST_ADRS" ,HybsSystem.HOST_ADRS );
303 map.put( "SERVER_INFO" ,HybsSystem.HOST_NAME + " ( " + HybsSystem.HOST_ADRS + " )" );
304 map.put( "ENGINE_INFO" ,BuildNumber.ENGINE_INFO );
305 String TOMCAT_PORT = System.getenv( "CONNECTOR_PORT" ); // 4.2.0.0 (2008/02/18) ポ?ト番号を環?数から取得に変更
306 if( TOMCAT_PORT == null || TOMCAT_PORT.length() == 0 ) { // 互換性のためweb.xmlからの取得を残す
307 TOMCAT_PORT = map.get( "TOMCAT_PORT" ); // 4.1.0.0 (2007/12/27)
308 }
309
310 String HOST_URL;
311 if( TOMCAT_PORT == null || TOMCAT_PORT.length() == 0 ) { // 両?も?が取得できな??合?**
312 HOST_URL = "**";
313 }
314 else {
315 HOST_URL = HybsSystem.HOST_NAME + ":" + TOMCAT_PORT + "/" + contextName + "/";
316 }
317 map.put( "HOST_URL", HOST_URL );
318
319 System.out.println( " Load Initial Parameter [" + map.size() + "] finished." );
320 return map ;
321 }
322
323 /**
324 * アプリケーション個別に設定して?リソース??(GE12)を取得します?
325 *
326 * ??タベ?スへの接続?、WEB-INF の DBConfig.xml で設定された??を?に?
327 * org.opengion.fukurou.db.ConnectionFactory で接続?を取得します?
328 * ここでは、web.xml で定義された各アプリケーション個別のパラメ―タを取得します?
329 * SYSTEM_ID(??) です?
330 *
331 * @og.rev 4.0.0.0 (2007/10/10) 接続???の管?直?コン?スト?期設?
332 * @og.rev 4.0.0.0 (2007/10/26) コネクションをファクトリーから取ってくるように変更
333 * @og.rev 4.3.6.5 (2009/05/08) dataパス??XMLファイルも読み取るようにする
334 * @og.rev 4.3.6.6 (2009/05/15) ↑を?。?動インスト?ル対応?
335 * @og.rev 5.1.2.0 (2010/01/01) connection.setAutoCommit は、ConnectionFactory で設定済みなので、コメントアウ?
336 * @og.rev 5.1.9.0 (2010/08/01) 自動インスト?ルの設定見直?画面からのインスト?ル対?
337 * @og.rev 5.5.4.4 (2012/07/20) SQLException は、catch して?ので、このメソ?からは、throws されな??
338 * @og.rev 5.5.4.5 (2012/07/27) 初期起動時のDB接続?は、RESOURCE_DBID とする?
339 * @og.rev 5.6.6.1 (2013/07/12) xml パス??XMLファイルがあれ?、DB登録します?
340 * @og.rev 5.6.7.0 (2013/07/27) InitFileLoader で、resource以下?、DBID=RESOURCE xml以下?、DBID=DEFAULT に登録します?
341 *
342 * @param sysParam 入力シス?パラメータマッ?
343 *
344 * @return シス?パラメータのマッ?
345 */
346 // private static Map<String,String> loadDBResource( final Map<String,String> sysParam ) throws SQLException {
347 private static Map<String,String> loadDBResource( final Map<String,String> sysParam ) {
348 String SYSTEM_ID = sysParam.get( "SYSTEM_ID" );
349 String CONTEXT_NAME = sysParam.get( "CONTEXT_NAME" ); // コン?スト別シス?リソース
350 String HOST_URL = sysParam.get( "HOST_URL" ); // 4.1.0.0 (2007/12/21) TOMCATへのアクセス用
351 String RESOURCE_DBID = sysParam.get( "RESOURCE_DBID" ); // 5.5.4.5 (2012/07/27) 初期起動時のDB接続?
352
353 // ???チェ?を行います?SYSTEM_IDは??です?
354 // これは、web.xml で定義が?です?
355 // 4.0.0.0 (2007/10/23)接続情報XML化につきDB_URLチェ?を削除
356 if( ( SYSTEM_ID == null || SYSTEM_ID.length() == 0 ) ) {
357 String errorMsg = "シス?パラメータの???(SYSTEM_ID,DB_URL)?null です?" + HybsSystem.CR
358 + "SYSTEM_ID=[" + SYSTEM_ID + "] " + HybsSystem.CR
359 + "Versino=[" + BuildNumber.VERSION_NO + "] " + HybsSystem.CR ;
360 errMsgList.add( errorMsg );
361 return sysParam ;
362 }
363
364 // Connection connection = null;
365 Connection defConn = null; // 5.6.7.0 (2013/07/27) DBID=DEFAULT のコネクション
366 Connection rscConn = null; // 5.6.7.0 (2013/07/27) DBID=RESOURCE のコネクション
367 PreparedStatement pstmt = null;
368 ResultSet resultSet = null;
369 boolean errFlag = true;
370 try {
371 // 4.0.0.0(2007/10/25)ConnectionをConnectionFactory経由で取得するよ?変更する?
372 // コン?スト名で接続しに??pplicationInfoは使わな??でnull
373 ConnectionFactory.init( CONTEXT_NAME, null ); // ConnectionFactoryの初期?
374 // connection = ConnectionFactory.connection( null, null );
375 // connection = ConnectionFactory.connection( RESOURCE_DBID, null ); // 5.5.4.5 (2012/07/27) 初期起動時のDB接続?は、RESOURCE_DBID とする?
376 // connection.setAutoCommit( false ); // 5.1.2.0 (2010/01/01)
377
378 defConn = ConnectionFactory.connection( null, null ); // 5.6.7.0 (2013/07/27) DBID=DEFAULT のコネクション
379 rscConn = ConnectionFactory.connection( RESOURCE_DBID, null ); // 5.6.7.0 (2013/07/27) DBID=RESOURCE のコネクション
380
381 // 4.3.6.6 (2009/05/15)
382 // 5.1.9.0 (2010/08/01) 自動インスト?ルの設定見直?画面からのインスト?ル対?
383 // SystemInstaller installer = new SystemInstaller( connection, new PrintWriter( System.out, true ) );
384 SystemInstaller installer = new SystemInstaller( defConn , rscConn , new PrintWriter( System.out, true ) );
385 installer.autoInsUpd( SYSTEM_ID, CONTEXT_NAME, HOST_URL );
386
387 // resource パス??XMLファイルがあれ?、?にDB登録します?(DBID=RESOURCE)
388 // InitFileLoader loader = new InitFileLoader( connection );
389 InitFileLoader loader = new InitFileLoader( rscConn ); // こ?コンストラクタは/resource フォル?検索します?
390 loader.loadInitFiles( true ) ;
391
392 // 5.6.6.1 (2013/07/12) xml パス??XMLファイルがあれ?、DB登録します?
393 // loader = new InitFileLoader( connection, "xml" );
394 loader = new InitFileLoader( defConn, "xml" );
395 loader.loadInitFiles( true ) ;
396
397 // コン?スト単位?シス?パラメータ?GE12 に設定します?
398 // dbXMLResourceInsert の後に登録する?があります?
399 // dbResourceUpdate( connection,sysParam );
400 // connection.commit();
401 dbResourceUpdate( rscConn,sysParam ); // 5.6.7.0 (2013/07/27) DBID=RESOURCE のコネクション
402 rscConn.commit();
403
404 // DBを検索して、ユーザー設定リソース??を取得します?
405 // pstmt = connection.prepareStatement( QUERY );
406 pstmt = rscConn.prepareStatement( QUERY ); // 5.6.7.0 (2013/07/27) DBID=RESOURCE のコネクション
407 pstmt.setString( 1,SYSTEM_ID );
408 pstmt.setString( 2,HOST_URL ); // 4.1.0.0 (2007/12/21)
409 Map<String,String> userMap = new HashMap<String,String>(100);
410 resultSet = pstmt.executeQuery();
411
412 while( resultSet.next() ) {
413 String key = resultSet.getString(1);
414 String val = resultSet.getString(2);
415 if( val != null && val.length() == 0 ) { val = null; }
416 userMap.put( key,val );
417 }
418
419 System.out.println( " Load DB Resource [" + userMap.size() + "] finished." );
420 // リソースを?ージします?
421 sysParam.putAll( userMap );
422 errFlag = false; // エラーでな?
423 }
424 catch (SQLException ex) {
425 // Closer.rollback( connection );
426 Closer.rollback( defConn ); // 5.6.7.0 (2013/07/27) DBID=DEFAULT のコネクション
427 Closer.rollback( rscConn ); // 5.6.7.0 (2013/07/27) DBID=RESOURCE のコネクション
428 LogWriter.log( ex );
429 String errorMsg = ex.getMessage() + ":" + ex.getSQLState() ;
430 errMsgList.add( errorMsg );
431 }
432 catch (UnsupportedEncodingException ex) {
433 // Closer.rollback( connection );
434 Closer.rollback( defConn ); // 5.6.7.0 (2013/07/27) DBID=DEFAULT のコネクション
435 Closer.rollback( rscConn ); // 5.6.7.0 (2013/07/27) DBID=RESOURCE のコネクション
436 LogWriter.log( ex );
437 String errorMsg = "UTF-8 がサポ?トされて??Java VM は、正規VMではありません?
438 + ex.getMessage();
439 errMsgList.add( errorMsg );
440 }
441 catch (RuntimeException ex) {
442 // Closer.rollback( connection );
443 Closer.rollback( defConn ); // 5.6.7.0 (2013/07/27) DBID=DEFAULT のコネクション
444 Closer.rollback( rscConn ); // 5.6.7.0 (2013/07/27) DBID=RESOURCE のコネクション
445 LogWriter.log( ex );
446 String errorMsg = "処?実行できませんでした? + HybsSystem.CR
447 + " SYSTEM_ID = [" + SYSTEM_ID + "]" + HybsSystem.CR
448 + ex.getMessage() ;
449 errMsgList.add( errorMsg );
450 }
451 finally {
452 Closer.resultClose( resultSet );
453 Closer.stmtClose( pstmt );
454 if( errFlag ) {
455 // ConnectionFactory.remove( connection, null );
456 ConnectionFactory.remove( defConn, null ); // 5.6.7.0 (2013/07/27) DBID=DEFAULT のコネクション
457 ConnectionFactory.remove( rscConn, null ); // 5.6.7.0 (2013/07/27) DBID=RESOURCE のコネクション
458 }
459 else {
460 // ConnectionFactory.close( connection, null );
461 ConnectionFactory.close( defConn, null ); // 5.6.7.0 (2013/07/27) DBID=DEFAULT のコネクション
462 ConnectionFactory.close( rscConn, null ); // 5.6.7.0 (2013/07/27) DBID=RESOURCE のコネクション
463 }
464 }
465
466 return sysParam ;
467 }
468
469 /**
470 * エンジン?定義の初期リソース??をDB(GE12)に登録します?
471 *
472 * 初期リソース??は、KBSAKU='0' で登録されて???で、?すべて削除
473 * してから、?てのリソース??を追?ると?形をとります?
474 * ただし?属???(名称?要など)を別途登録する場合?、?て?
475 * 削除せずに、UPDATE する方向で検討したいと思います?
476 * なお?こ???をDB登録する?は、リソースの設定?を変えたい場合に?
477 * キーが判らな?JavaDOCからしか読み取れな?のでは不便な為に
478 * 用意しておく?で、?部では SystemData オブジェクトとして定義
479 * されて?値を使用するため、この??タベ?ス値は、使用して?せん?
480 *
481 * @param conn 登録用コネクション(リソース用)
482 * @param map 入力シス?パラメータマッ?
483 * @throws SQLException
484 */
485 private static void dbResourceUpdate( final Connection conn,final Map<String,String> map )
486 throws SQLException {
487
488 String systemId = map.get( "SYSTEM_ID" );
489 String HOST_URL = map.get( "HOST_URL" ); // 4.1.0.0 (2007/12/21)
490
491 // 既存?設定?を?件DELETEします?
492 int delCnt;
493 PreparedStatement pstmt = null;
494 try {
495 pstmt = conn.prepareStatement( DEL_SYS );
496 pstmt.setString( 1, systemId );
497 pstmt.setString( 2, HOST_URL ); // 4.1.0.0 (2007/12/21)
498 delCnt = pstmt.executeUpdate();
499 }
500 finally {
501 Closer.stmtClose( pstmt );
502 }
503
504 // 新設定?を?件INSERTします?
505 Set<String> keyset = map.keySet();
506 String[] keys = keyset.toArray( new String[keyset.size()] );
507
508 int insCnt = 0;
509 try {
510 pstmt = conn.prepareStatement( INS_SYS );
511 for( int i=0; i<keys.length; i++ ) {
512 pstmt.setString( 1,systemId );
513 pstmt.setString( 2,HOST_URL);
514 pstmt.setString( 3,keys[i] );
515 pstmt.setInt( 4,( i + 1 ) * 10 );
516 pstmt.setString( 5,map.get( keys[i] ) );
517 pstmt.setString( 6,keys[i] );
518 insCnt += pstmt.executeUpdate();
519 }
520 }
521 finally {
522 Closer.stmtClose( pstmt );
523 }
524
525 System.out.print( " DB Context Resource Reconfiguration " );
526 System.out.println( "DELETE=[" + delCnt + "],INSERT=[" + insCnt + "] finished." );
527 }
528
529 /**
530 * ServletContext の名称を取得します?
531 *
532 * コン?スト?アクセスされたパス( /training など )の名称を?
533 * 取得します?(アクセス先?仮想フォル?)
534 * 以前???備記述?WEB-INF/web.xml)の display-name 要?見て?
535 * 無ければ、実フォル?を返して?した?
536 *
537 * @param context Servletコン?ス?
538 *
539 * @return コン?スト?コン?スト名
540 */
541 private static String getContextName( final ServletContext context ) {
542 String name = null;
543 try {
544 String path = context.getResource( "/" ).getFile();
545 int idx = path.lastIndexOf( '/',path.length()-2 );
546 name = path.substring( idx+1,path.length()-1 );
547 }
548 catch( MalformedURLException ex ) {
549 String errMsg = "こ?パス名?、正しいフォー?はありません?"
550 + ex.getMessage();
551 LogWriter.log( ex );
552 errMsgList.add( errMsg );
553 }
554 return name ;
555 }
556
557 /**
558 * ??クラスの public static なフィールドキーと値のマップを作?します?
559 * 主に、エンジン関連のクラスにパラメータファイルをクラスとして定義し?
560 * エンジンとともに配?ます?配?れたクラスを?に、パラメータ?
561 * 読み取ります?
562 * こ?処?? リフレクションを使用してクラスの public static フィールドを
563 * 取得し、LinkedHashMap により、取得?をキープしたまま、Mapを返します?
564 *
565 * @param cls クラスオブジェク?
566 *
567 * @return シス?パラメータのマッ?
568 */
569 private static Map<String,String> loadParameter( final Class<?> cls ) { // 4.3.3.6 (2008/11/15) Generics警告対?
570 Field[] field = cls.getFields(); // public フィールド?み
571 Map<String,String> map = new LinkedHashMap<String,String>( (int)(field.length * 1.5) ); // ?係数より大きい目に取る?
572
573 try {
574 for( int i=0; i<field.length; i++ ) {
575 if( Modifier.isStatic( field[i].getModifiers() ) ) {
576 map.put( field[i].getName() , (String)field[i].get( null ) );
577 }
578 }
579 }
580 catch( IllegalAccessException ex ) {
581 LogWriter.log( ex );
582 errMsgList.add( ex.getMessage() );
583 }
584
585 System.out.println( " ClassLoad " + cls.getName() + " Parameter [" + map.size() + "] finished." );
586 return map;
587 }
588
589 /**
590 * ??キーワード?ファイルをクラスパスより取得し、キーと値のマップを作?します?
591 * 主に、エンジン関連のクラスにパラメータファイルをPlugInクラスとして定義し?配?ます?
592 * こ?処??取得に、クラスパスの?が関係します???に取得されたキーは、あとから
593 * 読み取られたクラスパスは、?セ?しません?
594 *
595 * @og.rev 5.3.6.0 (2011/06/01) 並び?、キーの名称?する?
596 *
597 * @param keyword クラスオブジェクトを検索する?
598 *
599 * @return キーと値のマッ?
600 */
601 private static Map<String,String> loadParameter( final String keyword ) {
602 // Map<String,String> map = new HashMap<String,String>();
603 Map<String,String> map = new TreeMap<String,String>(); // 5.3.6.0 (2011/06/01) 並び?、キーの名称?する?
604 try {
605 ClassLoader loader = Thread.currentThread().getContextClassLoader();
606 Enumeration<URL> enume = loader.getResources( keyword ); // 4.3.3.6 (2008/11/15) Generics警告対?
607 while( enume != null && enume.hasMoreElements() ) {
608 URL url = enume.nextElement(); // 4.3.3.6 (2008/11/15) Generics警告対?
609 // jar:file:/実ディレクトリ また?、file:/実ディレクトリ
610 String dir = url.getFile();
611 // System.out.println( dir );
612
613 FindClassFiles filenames = new FindClassFiles( dir,keyword );
614 String[] names = filenames.getFilenames();
615 for( int i=0; i<names.length; i++ ) {
616 String val = names[i];
617 String key = val.substring( val.lastIndexOf( '.' )+1 );
618 if( key.indexOf( '_' ) >= 0 && !map.containsKey( key ) && key.indexOf( '$' ) < 0 ) {
619 map.put( key , val );
620 }
621 }
622 System.out.println( " FileCheck " + dir + " [" + names.length + "] find." );
623 }
624 }
625 catch( IOException ex ) {
626 LogWriter.log( ex );
627 errMsgList.add( ex.getMessage() );
628 }
629 catch( RuntimeException ex ) {
630 LogWriter.log( ex );
631 errMsgList.add( ex.getMessage() );
632 }
633 System.out.println( " FileLoad " + keyword + " Parameter [" + map.size() + "] finished." );
634 return map;
635 }
636 }