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