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