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 &gt; '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 &gt; '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    }