    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.hayabusa.common;
    017
    018import java.io.PrintWriter;
    019import java.io.IOException;
    020import java.io.UnsupportedEncodingException;
    021import java.lang.reflect.Field;
    022import java.lang.reflect.Modifier;
    023import java.net.MalformedURLException;
    024import java.net.URL;
    025import java.sql.Connection;
    026import java.sql.PreparedStatement;
    027import java.sql.ResultSet;
    028import java.sql.SQLException;
    029import java.util.ArrayList;
    030import java.util.Date;
    031import java.util.Enumeration;
    032import java.util.HashMap;
    033import java.util.LinkedHashMap;
    034import java.util.TreeMap;
    035import java.util.List;
    036import java.util.Locale;
    037import java.util.Map;
    038import java.util.Set;
    039import java.util.Collections;                                                                                   // 6.4.3.2 (2016/02/19)
    040import java.util.Calendar;                                                                                              // 6.9.7.0 (2018/05/14)
    041
    042import jakarta.servlet.ServletContext;
    043import jakarta.servlet.FilterRegistration;                                                              // 6.9.3.1 (2018/04/02)
    044import jakarta.servlet.ServletRegistration;                                                             // 6.9.3.1 (2018/04/02)
    045
    046import org.opengion.fukurou.db.ConnectionFactory;
    047import org.opengion.fukurou.system.BuildNumber;                                                 // 6.4.2.0 (2016/01/29) hayabusa.common.BuildNumber → fukurou.system.BuildNumber に移動
    048import org.opengion.fukurou.system.Closer;
    049import org.opengion.fukurou.system.LogWriter;
    050import org.opengion.fukurou.system.ThrowUtil;                                                   // 6.4.2.0 (2016/01/29)
    051import org.opengion.fukurou.system.DateSet;                                                             // 6.9.7.0 (2018/05/14)
    052import org.opengion.fukurou.util.FindClassFiles;
    053import org.opengion.fukurou.util.StringUtil;
    054import org.opengion.fukurou.xml.XMLFileLoader;                                                  // 6.0.0.0 (2014/04/11)
    055import org.opengion.fukurou.system.HybsConst;                                                   // 7.2.3.1 (2020/04/17)
    056import static org.opengion.fukurou.system.HybsConst.CR;                                 // 6.1.0.0 (2014/12/26)
    057import static org.opengion.fukurou.system.HybsConst.BUFFER_MIDDLE;              // 6.1.0.0 (2014/12/26) refactoring
    058import static org.opengion.fukurou.system.HybsConst.DB_FETCH_SIZE;              // 6.9.4.1 (2018/04/09)
    059import org.opengion.fukurou.fileexec.MainProcess;                                               // 7.2.5.3 (2020/06/16)
    060
    061/**
    062 * ﾛｸﾞｲﾝしたｻｰﾌﾞﾚｯﾄｺﾝﾃｷｽﾄに対応したｼｽﾃﾑﾊﾟﾗﾒｰﾀﾃﾞｰﾀを取得するｸﾗｽです｡
    063 *
    064 * ｼｽﾃﾑﾊﾟﾗﾒｰﾀﾃﾞｰﾀ(GE12)は、ﾊﾟﾗﾒｰﾀ(PARAM_ID)に対して、各種設定値(PARAM)を
    065 * 持っています｡
    066 * 従来は、resource.ｼｽﾃﾑﾊﾟﾗﾒｰﾀ の一般設定用の ｼｽﾃﾑﾊﾟﾗﾒｰﾀ ﾌｧｲﾙと
    067 * ｴﾝｼﾞﾝ内部で持っている org/hsgw/hayabusa/resource/properties の
    068 * ｼｽﾃﾑﾊﾟﾗﾒｰﾀ ﾌｧｲﾙにより維持されていましたが、ｼｽﾃﾑﾊﾟﾗﾒｰﾀ
    069 * 定義ﾃｰﾌﾞﾙ(GE12)と、commom/SystemData.java ｸﾗｽによる管理に変更されました｡
    070 *
    071 * ｼｽﾃﾑﾊﾟﾗﾒｰﾀは、ＤＢへのｱｸｾｽを決定するため、初期設定値を定義する必要があります｡
    072 * これは、、ｱﾌﾟﾘｹｰｼｮﾝ･ﾃﾞｨｽｸﾘﾌﾟﾀ(WEB-INF/web.xml)に、context-param として、
    073 * ｷｰと値のｾｯﾄで、初期ｱｸｾｽ用の情報を渡します｡
    074 * ｼｽﾃﾑﾊﾟﾗﾒｰﾀ定義ﾃｰﾌﾞﾙ(GE12)には、SYSTEM_IDとして、通常のｼｽﾃﾑIDと、
    075 * ｴﾝｼﾞﾝﾊﾟﾗﾒｰﾀがあります｡ｴﾝｼﾞﾝﾊﾟﾗﾒｰﾀは、SYSTEM_ID='**'として、登録
    076 * されています｡
    077 *
    078 * <table class="plain">
    079 *   <caption>ｼｽﾃﾑﾊﾟﾗﾒｰﾀの説明</caption>
    080 *   <tr><th>種類       </th><th>SYSTEM_ID</th><th>作成区分</th><th>説明</th></tr>
    081 *   <tr><td>ｴﾝｼﾞﾝ共通    </td><td>**             </td><td>0:ｴﾝｼﾞﾝ</td><td>ｴﾝｼﾞﾝ共通で定義しているﾊﾟﾗﾒｰﾀ                   </td></tr>
    082 *   <tr><td>ｴﾝｼﾞﾝ個別    </td><td>個別     </td><td>0:ｴﾝｼﾞﾝ</td><td>ｼｽﾃﾑ毎にｴﾝｼﾞﾝが登録しているﾊﾟﾗﾒｰﾀ               </td></tr>
    083 *   <tr><td>ｼｽﾃﾑ共通     </td><td>**             </td><td>1:ｼｽﾃﾑ </td><td>ｼｽﾃﾑ毎にｴﾝｼﾞﾝが登録しているﾊﾟﾗﾒｰﾀ               </td></tr>
    084 *   <tr><td>ｼｽﾃﾑ個別     </td><td>個別     </td><td>1:ｼｽﾃﾑ </td><td>ｼｽﾃﾑ毎に各自が独自に登録しているﾊﾟﾗﾒｰﾀ       </td></tr>
    085 * </table>
    086 *
    087 * <table class="plain">
    088 *   <caption>ｱﾌﾟﾘｹｰｼｮﾝ･ﾃﾞｨｽｸﾘﾌﾟﾀ(WEB-INF/web.xml)設定情報</caption>
    089 *   <tr><th>ﾊﾟﾗﾒｰﾀ             </th><th>設定値例                           </th><th>解説                                     </th></tr>
    090 *   <tr><td>SYSTEM_ID  </td><td>GE                                             </td><td>このｱﾌﾟﾘｹｰｼｮﾝのｼｽﾃﾑID     </td></tr>
    091 *   <tr><td>TOMCAT_PORT</td><td>8823                                   </td><td>Tomcat起動時ﾎﾟｰﾄ番号        </td></tr>
    092 *   <tr><td>LOG_FILE   </td><td>log/log_$(yyyyMMdd).txt</td><td>JSPｱｸｾｽﾛｸﾞ出力先          </td></tr>
    093 * </table>
    094 *
    095 * ※ 5.6.7.0 (2013/07/27)
    096 *    InitFileLoader により、特定のｸﾗｽﾊﾟｽ内の 拡張XDK 形式の xml ﾌｧｲﾙ を処理します｡
    097 *    ｸﾗｽﾊﾟｽが、"/resource" 以下のすべての xml ﾌｧｲﾙは、DBIDが RESOURCE の接続先に対して処理されます｡
    098 *    ｸﾗｽﾊﾟｽが、"/xml" 以下のすべての xml ﾌｧｲﾙは、DBIDが DEFAULT の接続先に対して処理されます｡
    099 *    各ｸﾗｽﾊﾟｽ以下のﾌｧｲﾙは、実ﾌｫﾙﾀﾞでも、jar形式に圧縮された形式でも処理されます｡
    100 *
    101 * ※ 6.0.0.0 (2014/04/11)
    102 *    InitFileLoader が廃止になり、代わりに、XMLFileLoader を使用します｡処理自体は、ほぼ同様です｡
    103 *
    104 * @og.rev 4.0.0.0 (2005/01/31) 新規作成
    105 * @og.rev 4.0.0.0 (2007/10/26) loadDBResourceのｺﾈｸｼｮﾝをFactoryから取るように変更
    106 * @og.group 初期化
    107 *
    108 * @version     4.0
    109 * @author      Kazuhiko Hasegawa
    110 * @since       JDK5.0,
    111 */
    112public final class SystemParameter {
    113
    114        /** plugin ｸﾗｽの取得用ｸﾗｽﾊﾟｽ指定      {@value}        */
    115        public static final String PLUGIN = "org/opengion/plugin";
    116
    117        // 4.0.0.0 (2007/10/05) CONTXT_PATH に、DEFAULT '**' NOT NULL 制約を付ける｡
    118        /** ｼｽﾃﾑ共通/個別ﾊﾟﾗﾒｰﾀ(SYSTEM_ID in ('**',?) and KBSAKU &gt; '0')の一括読込のｸｴﾘｰ        {@value}        */
    119        public static final String QUERY = "SELECT PARAM_ID,PARAM,FGCRYPT"
    120                                                                        + " FROM GE12 WHERE SYSTEM_ID IN (?,'**')"
    121                                                                        + " AND CONTXT_PATH IN (?,'**')"
    122                                                                        + " AND FGJ='1' AND KBSAKU > '0'"
    123                                                                        + " ORDER BY SYSTEM_ID,CONTXT_PATH,FGJ,KBSAKU,SEQNO" ;
    124
    125        /** ｼｽﾃﾑ共通/個別ﾊﾟﾗﾒｰﾀ(SYSTEM_ID in ('**',?) and KBSAKU &gt; '0')の一括登録のｸｴﾘｰ        {@value}        */
    126        public static final String INS_SYS = "INSERT INTO GE12"
    127//                                                                      + " ( SYSTEM_ID,CONTXT_PATH,PARAM_ID,SEQNO,PARAM,TITLE,CONTENTS,PARAM_LVL,FGJ,KBSAKU )"
    128                                                                        + " ( SYSTEM_ID,CONTXT_PATH,PARAM_ID,SEQNO,PARAM,TITLE,CONTENTS,PARAM_LVL,FGJ,KBSAKU,DYSET )"   // 6.9.7.0 (2018/05/14)
    129                                                                        + " SELECT"
    130//                                                                      + " ?,?,?,?,?,TITLE,CONTENTS,PARAM_LVL,'1','0'"
    131                                                                        + " ?,?,?,?,?,TITLE,CONTENTS,PARAM_LVL,'1','0',?"                                                                                               // 6.9.7.0 (2018/05/14)
    132                                                                        + " FROM GE12 WHERE SYSTEM_ID='**' AND FGJ='1' AND KBSAKU='0' AND PARAM_ID=?" ;
    133
    134//      /** ｴﾝｼﾞﾝ個別(SYSTEM_ID='個別' KBSAKU='0' CONTXT_PATH='自身')ﾊﾟﾗﾒｰﾀの一括削除のｸｴﾘｰ {@value}        */
    135//      public static final String DEL_SYS = "DELETE FROM GE12 WHERE SYSTEM_ID=? AND KBSAKU='0' AND CONTXT_PATH=?";
    136
    137        /** ｴﾝｼﾞﾝ個別(SYSTEM_ID='個別' KBSAKU='0' CONTXT_PATH='自身')ﾊﾟﾗﾒｰﾀの一括削除と、過去情報の削除ｸｴﾘｰ {@value}        */
    138        public static final String DEL_SYS = "DELETE FROM GE12 WHERE ( SYSTEM_ID=? AND KBSAKU='0' AND CONTXT_PATH=? )"                                  // 6.9.7.0 (2018/05/14)
    139                                                                        + " OR ( SYSTEM_ID != '**' AND PARAM_LVL='9' AND ( DYSET < ? OR DYSET IS NULL ) )" ;                    // 過去のﾃﾞｰﾀを考慮(DYSET is null)
    140
    141        /** 6.9.7.0 (2018/05/14) DYSET ﾌｫｰﾏｯﾄ   {@value}        */
    142        public static final String DYSET_FORMAT = "yyyyMMddHHmmss" ;                    // 6.9.7.0 (2018/05/14)
    143
    144//      /** 6.9.3.0 (2018/03/26) ﾃﾞｰﾀ検索時のﾌｪｯﾁｻｲｽﾞ       {@value}        */
    145//      private static final int DB_FETCH_SIZE = 1001 ;                                                 // HybsSystem に設定する前なので、HybsSystem.sysInt では取得できない。
    146
    147        /** ｼｽﾃﾑﾊﾟﾗﾒｰﾀ構築中のｴﾗｰをｾｯﾄしていきます｡ */
    148        private static final List<String> ERR_MSG_LIST = new ArrayList<>();             // 6.4.1.1 (2016/01/16) errMsgList → ERR_MSG_LIST refactoring
    149
    150        /**
    151         *      ﾃﾞﾌｫﾙﾄｺﾝｽﾄﾗｸﾀｰをprivateにして、
    152         *      ｵﾌﾞｼﾞｪｸﾄの生成をさせないようにする｡
    153         *
    154         */
    155        private SystemParameter() {}
    156
    157        /**
    158         * ｺﾝﾃｷｽﾄ毎に ｼｽﾃﾑﾊﾟﾗﾒｰﾀｵﾌﾞｼﾞｪｸﾄを作成します｡
    159         * このｸﾗｽのｽﾀｰﾄﾎﾟｲﾝﾄﾒｿｯﾄﾞになります｡
    160         *
    161         * @og.rev 4.1.0.1 (2008/01/23) ﾛｸﾞ出力先の変更(全てLogWriter経由で出力)
    162         * @og.rev 5.5.4.4 (2012/07/20) LogWriter.log 追加
    163         * @og.rev 5.5.4.4 (2012/07/20) SQLException は、catch しているので、loadDBResource からは、throws されない｡
    164         * @og.rev 5.7.2.0 (2014/01/10) Throwable の情報をもう少し詳細に出します｡
    165         * @og.rev 6.4.3.2 (2016/02/19) engParamとsysParamを初期設定して、同期化しておく｡
    166         * @og.rev 6.4.7.1 (2016/06/17) ｾｷｭﾘﾃｨの関連で、ﾛｸﾞの詳細を出していませんでしたが、出すように変更します｡
    167         * @og.rev 6.8.6.0 (2018/01/19) ImageIO.write で、Java9で、NumberFormatException が出てしまう(暫定)対策｡
    168         * @og.rev 7.2.5.3 (2020/06/16) MainProcessは、SystemParameterへ移動
    169         * @og.rev 7.3.2.3 (2021/04/09) ｼｽﾃﾑ定数のICON_DIRやIMAGE_DIRを使用します｡
    170         *
    171         * @param       context Servletｺﾝﾃｷｽﾄ
    172         *
    173         * @return      ｼｽﾃﾑﾊﾟﾗﾒｰﾀのﾏｯﾌﾟ
    174         */
    175        public static Map<String,String> makeSystemParameter( final ServletContext context ) {
    176                ERR_MSG_LIST.clear() ;  // 呼び出し都度、ｴﾗｰﾘｽﾄをｸﾘｱします｡
    177
    178                // 6.4.3.2 (2016/02/19)
    179                final Map<String,String> engParam = new LinkedHashMap<>();      // 最終的にﾏｰｼﾞして返す。
    180                final Map<String,String> sysParam = new LinkedHashMap<>();      // DB書き戻し等あるので、設定中は分けておく。
    181
    182                try {
    183                        // 6.8.6.0 (2018/01/19) ImageIO.write (暫定)対策
    184                        // ※ ImageIO.getReaderMIMETypes(); での Java 9 has java.specification.version == 9 で、
    185                        // Caused by: java.lang.NumberFormatException: For input string: "" が発生する対応
    186                        // https://github.com/jai-imageio/jai-imageio-core/issues/24
    187                        final String javaSpecVer = System.getProperty( "java.specification.version" );
    188                        if( !javaSpecVer.startsWith( "1." ) ) {
    189                                System.setProperty( "java.specification.version" , "1." + javaSpecVer );        // "java.specification.version" , "9" の場合、"1.9" に無理やり変更します。
    190                        }
    191
    192                        final String contextName = getContextName( context );
    193
    194                        System.out.println( "Context Initialized [" + contextName + "] " + new Date() );
    195                        System.out.print( "  Version [" + BuildNumber.VERSION_NO + " " );
    196                        System.out.print( BuildNumber.BUILD_TYPE );
    197                        System.out.println( "]" );
    198
    199                        // ｼｽﾃﾑﾃﾞｰﾀｸﾗｽより、ｴﾝｼﾞﾝﾊﾟﾗﾒｰﾀ情報を初期設定します｡
    200                        // ｴﾝｼﾞﾝﾊﾟﾗﾒｰﾀは、SystemData ｸﾗｽの public static ﾒﾝﾊﾞｰです｡
    201                        loadParameter( engParam , SystemData.class );                           // 6.4.3.2 (2016/02/19)
    202
    203                        // ｺﾝﾃｷｽﾄより取得できるｼｽﾃﾑﾊﾟﾗﾒｰﾀ情報を取得します｡
    204                        // web.xml で設定したﾊﾟﾗﾒｰﾀを取得します｡
    205                        // SYSTEM_ID,DB_DRIVER,DB_URL などは、loadDBResource で使用します｡
    206                        loadInitialParameter( sysParam , context , contextName );       // 6.4.3.2 (2016/02/19)
    207
    208                        // ｼｽﾃﾑ個別に設定される、ｴﾝｼﾞﾝ起動時情報を初期設定します｡
    209                        // ｴﾝｼﾞﾝ起動時情報は、BuildNumber ｸﾗｽの public static ﾒﾝﾊﾞｰです｡
    210                        loadParameter( sysParam , BuildNumber.class );                          // 6.4.3.2 (2016/02/19)
    211                        loadParameter( sysParam , PLUGIN );
    212
    213                        // GE12 ﾃﾞｰﾀﾍﾞｰｽより読み取ります｡
    214                        // 引数のMapに読み込んだ値を追加した Map を返します｡
    215                        // つまり、ｼｽﾃﾑﾊﾟﾗﾒｰﾀ情報の上書きを行います｡
    216                        // 5.5.4.4 (2012/07/20) SQLException は、catch しているので、loadDBResource からは、throws されない。
    217        //              try {
    218                                loadDBResource( sysParam );                                                             // 6.4.3.2 (2016/02/19)
    219        //              }
    220        //              catch( final SQLException ex ) {
    221        //              final String errMsg = "DB終了(close)処理を実行できませんでした。" + CR
    222        //                                              + ex.getMessage() + ":" + ex.getSQLState() ;
    223        //                      LogWriter.log( ex );                                    // 5.5.4.4 (2012/07/20) LogWriter.log 追加
    224        //                      ERR_MSG_LIST.add( errMsg );
    225        //              }
    226
    227                        // 7.2.5.3 (2020/06/16) MainProcessは、SystemParameterへ移動
    228                        // 7.2.5.0 (2020/06/01) org.opengion.fukurou.fileexec.MainProcess処理
    229                        // InitialCallURL() の起動が一番最後なので、その前に入れます。
    230                        if( "GE".equalsIgnoreCase( contextName ) ) {
    231                                if( "true".equalsIgnoreCase( sysParam.get( "USE_FILEEXEC" ) ) ) {
    232                                        MainProcess.start();
    233                                }
    234                                else {
    235                                        MainProcess.shutdown( false );
    236                                }
    237                        }
    238
    239                        // 7.3.2.3 (2021/04/09) ｼｽﾃﾑ定数のICON_DIRやIMAGE_DIRを使用します。
    240                        // GE12の初期値のSQLは、KBSAKU > '0' しか取得しないので、初期値を、engParam から取ってくる。
    241                        final String JSP                = sysParam.get( "JSP" );
    242                        final String ICON_DIR   = StringUtil.nval( sysParam.get( "ICON_DIR"  ),engParam.get( "ICON_DIR"  ) );
    243                        final String IMAGE_DIR  = StringUtil.nval( sysParam.get( "IMAGE_DIR" ),engParam.get( "IMAGE_DIR" ) );
    244                        sysParam.put( "JSP_ICON",JSP+"/"+ICON_DIR  );
    245                        sysParam.put( "JSP_IMG" ,JSP+"/"+IMAGE_DIR );
    246                }
    247                catch( final Throwable th ) {                                   // 3.6.1.0 (2005/01/05)
    248                        LogWriter.log( th );                                            // 5.5.4.4 (2012/07/20) LogWriter.log 追加
    249                        // 5.7.2.0 (2014/01/10) Throwable の情報をもう少し詳細に出します。
    250                        final String errMsg = "処理を実行できませんでした。"  + CR ;
    251        //                                      + th.getMessage()                                               + CR
    252        //                                      + StringUtil.ogStackTrace( th ) ;
    253        //              ERR_MSG_LIST.add( errMsg );
    254        //              final String errMsg = "処理を実行できませんでした。"  + CR ;                  // 6.4.7.1 (2016/06/17)
    255                        ERR_MSG_LIST.add( ThrowUtil.ogStackTrace( errMsg,th ) );                                // 6.4.2.0 (2016/01/29)
    256                }
    257                finally {
    258                        // 初期値のｴﾝｼﾞﾝﾊﾟﾗﾒｰﾀに個別のｼｽﾃﾑﾊﾟﾗﾒｰﾀを追加設定します｡
    259                        // つまり、ｴﾝｼﾞﾝﾊﾟﾗﾒｰﾀ情報に上書きを行います｡
    260                        // 6.3.9.1 (2015/11/27) engParam が null になることは無い(findbugs)。
    261                                engParam.putAll( sysParam );
    262
    263                        final int errCnt = ERR_MSG_LIST.size();
    264                        if( errCnt > 0 ) {
    265                                final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE )
    266                                        .append( "【システムパラメータの初期化に失敗しました。】" )
    267                                        .append( CR )
    268                                        .append( "Tomcat の設定状況をご確認ください。" )
    269                                        .append( CR )
    270                                        .append( "========================================" )
    271                                        .append( CR );
    272
    273                                for( int i=0; i<errCnt; i++ ) {
    274                                        buf.append( ERR_MSG_LIST.get(i) )
    275                                                .append( CR )
    276                                                .append( "----------------------------------------" )
    277                                                .append( CR );
    278                                }
    279                                System.out.println( buf );
    280                                engParam.put( HybsSystem.LOCAL_CONTX_ERR_KEY,buf.toString() );
    281                        }
    282                }
    283                return Collections.synchronizedMap( engParam ) ;                // 6.4.3.2 (2016/02/19) 同期化しておく。
    284        }
    285
    286        /**
    287         * ｺﾝﾃｷｽﾄより、ｱﾌﾟﾘｹｰｼｮﾝ設定情報を取得します｡
    288         * 初期値は、ｱﾌﾟﾘｹｰｼｮﾝ･ﾃﾞｨｽｸﾘﾌﾟﾀ(WEB-INF/web.xml)に
    289         * context-param として、ｷｰと値のｾｯﾄで、初期ｱｸｾｽ用の情報を渡します｡
    290         * ﾃﾞｰﾀﾍﾞｰｽへの接続は、WEB-INF の DBConfig.xml で設定された情報を使用します｡
    291         *
    292         * ここでは、各ｺﾝﾃｷｽﾄ毎の内部情報を取得します｡その中には、
    293         * BuildNumber ｸﾗｽで定義されている各種ﾌｨｰﾙﾄﾞ属性も含まれます｡
    294         *
    295         * REAL_PATH      : ｱﾄﾞﾚｽ(/)に対する、実ﾃﾞｨﾚｸﾄﾘﾊﾟｽ
    296         * CONTEXT_NAME   : ｱｸｾｽ先の仮想ﾌｫﾙﾀﾞ名(URLのｺﾝﾃｷｽﾄ名)
    297         * JSP            : ｱｸｾｽ先のJSPﾌｫﾙﾀﾞ名(/URLのｺﾝﾃｷｽﾄ名/jsp)
    298         * SYS_LOG_URL    : jsp以下のﾛｸﾞﾌｧｲﾙ名                                                                              // 7.1.0.0 (2020/01/20) jsp以下のﾛｸﾞﾌｧｲﾙ名
    299         * SYSTEM_ID      : web.xml で指定する、SYSTEM_ID の設定値
    300         * TOMCAT_PORT    : web.xml で指定する、Tomcat起動時ﾎﾟｰﾄ番号(8823)
    301         * LOG_FILE       : web.xml で指定する、JSPｱｸｾｽﾛｸﾞ出力先(log/log_$(yyyyMMdd).txt)
    302         * SERVLET_INFO   : ｻｰﾌﾞﾚｯﾄ情報 [例： Apache Tomcat/5.5.9 ]
    303         * TOMCAT_WORK    : Tomcatﾜｰｸの位置 [例： H:\java\tomcat5.5.17\work\Catalina\localhost\ver4 ]
    304         * TOMCAT_HOME    : Tomcat環境の位置 [例： H:\java\tomcat5.5.17 ]
    305         * LOGS_DIR       : Tomcatのﾛｸﾞﾌｫﾙﾀﾞ                                                                             // 7.1.0.0 (2020/01/20) Tomcatのﾛｸﾞﾌｫﾙﾀﾞ
    306         * JAVA_HOME      : Java実行環境の位置 [例： H:\java\jdk150\jre ]
    307         * HOST_NAME      : ﾎｽﾄの名前
    308         * HOST_ADRS      : ﾎｽﾄのｱﾄﾞﾚｽ
    309         * SERVER_INFO    : ｻｰﾊﾞｰ情報 [例： HN50G5 ( 200.1.50.165 ) ]
    310         * ENGINE_INFO    : ﾊﾞｰｼﾞｮﾝ番号 [例： 4.3.6.6 ]
    311         * RESOURCE_DBID  : "RESOURCE" 固定値を設定｡WEB-INF/web.xml で指定しても無効です｡
    312         * OFFICE_HOME    : ｵﾌｨｰｽのHOME                                                                                          // 7.1.0.0 (2020/01/20) ｵﾌｨｰｽのHOME
    313         * EXT_DIR        : 拡張jarﾌｫﾙﾀﾞ                                                                                  // 7.1.0.0 (2020/01/20) 拡張jarﾌｫﾙﾀﾞ
    314         * IS_SERVICE     : ｻｰﾋﾞｽ起動かどうか [ｻｰﾋﾞｽ起動時はtrue]                                 // 7.1.0.0 (2020/01/20) ｻｰﾋﾞｽ起動
    315         *
    316         * @og.rev 4.1.0.0 (2007/12/27) web.xmlからTOMCAT_PORTを読む処理を追加
    317         * @og.rev 4.2.0.0 (2008/02/18) TOMCAT_PORTを環境変数から取得するよう変更
    318         * @og.rev 4.2.0.0 (2008/02/20) web.xmlでSYSTEM_IDが空白の場合に大文字ｺﾝﾃｷｽﾄ名が設定されるよう変更
    319         * @og.rev 4.3.6.6 (2009/05/15) ｺﾝﾃｷｽﾄ単位にｴﾝｼﾞﾝﾊﾞｰｼﾞｮﾝ情報を持つ(ﾊﾞｰｼﾞｮﾝｱｯﾌﾟ判定用)
    320         * @og.rev 5.6.7.1 (2013/08/09) RESOURCE_DBID の値に、"RESOURCE" を設定しておきます｡
    321         * @og.rev 5.6.7.3 (2013/08/23) TOMCAT_HOME を追加
    322         * @og.rev 5.7.3.2 (2014/02/28) Tomcat8 対応｡getRealPath( "/" ) の互換性のための修正｡
    323         * @og.rev 6.2.4.1 (2015/05/22) REAL_PATH 対応｡realPath は、HybsSystem経由で、取得する｡
    324         * @og.rev 6.4.3.2 (2016/02/19) returnをやめて、引数のMapに直接値を設定します｡
    325         * @og.rev 6.9.0.1 (2018/02/05) RequestParam で設定される値を、できるだけ構築しておきます｡
    326         * @og.rev 6.9.3.1 (2018/04/02) web.xml で定義されている filter、servlet のｷｰ名称を取得し、あれば、true を設定します｡
    327         * @og.rev 7.1.0.0 (2020/01/20) OFFICE_HOME,EXT_DIR,IS_SERVICE 環境変数の追加
    328         * @og.rev 7.2.3.1 (2020/04/17) System.getenv → HybsConst.getenv 変更(ｻｰﾋﾞｽ化対応)
    329         * @og.rev 8.4.0.0 (2022/12/23) HybsConst.getenv の 初期値使用
    330         *
    331         * @param       map                     読み書きするMapｵﾌﾞｼﾞｪｸﾄ
    332         * @param       context         Servletｺﾝﾃｷｽﾄ
    333         * @param       contextName     ｺﾝﾃｷｽﾄ名
    334         */
    335        private static void loadInitialParameter( final Map<String,String> map,final ServletContext context,final String contextName ) {
    336                // ｺﾝﾃｷｽﾄの初期化ﾊﾟﾗﾒｰﾀ他の情報を登録しておきます｡
    337                final Enumeration<?> enume = context.getInitParameterNames() ;                  // 4.3.3.6 (2008/11/15) Generics警告対応
    338                while( enume.hasMoreElements() ) {
    339                        final String key = (String)enume.nextElement();
    340                        String val = context.getInitParameter( key );
    341                        if( val != null && val.isEmpty() ) { val = null; }
    342                        map.put( key,val );
    343                }
    344
    345                // SYSTEM_IDがnullの場合は大文字のｺﾝﾃｷｽﾄ名を設定
    346                if( map.get( "SYSTEM_ID" ) == null ){ // 4.2.0.0 (2008/02/20)
    347                        map.put( "SYSTEM_ID", contextName.toUpperCase( Locale.JAPAN ) );
    348                }
    349
    350                // 6.2.4.1 (2015/05/22) REAL_PATH 対応。realPath は、HybsSystem経由で、取得する。
    351                final String REAL_PATH = context.getRealPath( "" ) ;                                    // 7.1.0.0 (2020/01/20)
    352//              HybsSystem.setRealPath( context.getRealPath( "" ) );
    353                HybsSystem.setRealPath( REAL_PATH );                                                                    // 7.1.0.0 (2020/01/20)
    354
    355                // 各種ｼｽﾃﾑ情報を登録しておきます｡
    356//              map.put( "REAL_PATH"    ,HybsSystem.getRealPath() );                                    // 6.2.4.1 (2015/05/22)
    357                map.put( "REAL_PATH"    ,REAL_PATH );                                                                   // 6.2.4.1 (2015/05/22) 7.1.0.0 (2020/01/20)
    358                map.put( "CONTEXT_NAME" ,contextName );
    359                map.put( "JSP"                  ,"/" + contextName + "/jsp" );
    360//              map.put( "SYS_LOG_URL"  ,REAL_PATH + System.getenv( "SYS_LOG_URL" ) );  // 7.1.0.0 (2020/01/20) jsp以下のﾛｸﾞﾌｧｲﾙ名
    361
    362                map.put( "SERVLET_INFO" ,context.getServerInfo() );
    363                map.put( "TOMCAT_WORK"  ,String.valueOf( context.getAttribute( "jakarta.servlet.context.tempdir" ) ) );
    364
    365                // 7.1.0.0 (2020/01/20) TOMCAT_HOME を先に取得しておく。
    366                final String TOMCAT_HOME = System.getProperty( "catalina.home" );
    367//              map.put( "TOMCAT_HOME"  ,System.getProperty( "catalina.home" ) );                                               // 5.6.7.3 (2013/08/23)
    368                map.put( "TOMCAT_HOME"  ,TOMCAT_HOME );                                                                                                 // 7.1.0.0 (2020/01/20) TomcatのHOMEﾌｫﾙﾀﾞ
    369                map.put( "TOMCAT_LOGS"  ,TOMCAT_HOME + "/logs" );                                                                               // 7.1.0.0 (2020/01/20) Tomcatのﾛｸﾞﾌｫﾙﾀﾞ
    370//              map.put( "LOGS_DIR"             ,System.getProperty( "logsDir" ) );                                                             // 7.1.0.0 (2020/01/20) Tomcatのﾛｸﾞﾌｫﾙﾀﾞ(ｺﾝﾃｷｽﾄ単位)
    371//              map.put( "SERVICE_NAME" ,StringUtil.nval( System.getenv( "SERVICE_NAME" ),"" ) );               // 7.1.0.0 (2020/01/20) ｻｰﾋﾞｽ起動時のｻｰﾋﾞｽ名
    372//              map.put( "SERVICE_NAME" ,StringUtil.nval( HybsConst.getenv( "SERVICE_NAME" ),"" ) );    // 7.2.3.1 (2020/04/17) ｻｰﾋﾞｽ起動時のｻｰﾋﾞｽ名
    373                map.put( "SERVICE_NAME" ,HybsConst.getenv( "SERVICE_NAME","" ) )                                ;               // 8.4.0.0 (2022/12/23) ｻｰﾋﾞｽ起動時のｻｰﾋﾞｽ名 getenvの初期値を使用
    374
    375                map.put( "JAVA_HOME"    ,System.getProperty( "java.home" ) );
    376
    377                map.put( "HOST_NAME"    ,HybsSystem.HOST_NAME );
    378                map.put( "HOST_ADRS"    ,HybsSystem.HOST_ADRS );
    379                map.put( "SERVER_INFO"  ,HybsSystem.HOST_NAME + " ( " + HybsSystem.HOST_ADRS + " )" );
    380                map.put( "ENGINE_INFO"  ,BuildNumber.ENGINE_INFO );
    381                // 5.6.7.1 (2013/08/09) RESOURCE_DBID の値に、"RESOURCE" を設定しておきます。
    382                map.put( "RESOURCE_DBID", "RESOURCE" );
    383
    384                // 7.1.0.0 (2020/01/20) OFFICE_HOME,EXT_DIR 環境変数の追加
    385//              map.put( "OFFICE_HOME"  ,System.getenv( "OFFICE_HOME" ) );                              // 7.1.0.0 (2020/01/20) ｵﾌｨｰｽのHOME
    386                map.put( "OFFICE_HOME"  ,HybsConst.getenv( "OFFICE_HOME" ) );                   // 7.2.3.1 (2020/04/17) ｵﾌｨｰｽのHOME
    387//              map.put( "EXT_DIR"              ,System.getenv( "EXT_DIR" ) );                                  // 7.1.0.0 (2020/01/20) 拡張jarﾌｫﾙﾀﾞ
    388                map.put( "EXT_DIR"              ,HybsConst.getenv( "EXT_DIR" ) );                               // 7.2.3.1 (2020/04/17) 拡張jarﾌｫﾙﾀﾞ
    389
    390                // 7.1.0.0 (2020/01/20) ﾊﾞｯﾁ起動の場合は、sun.java.command = "org.apache.catalina.startup.Bootstrap start" , ｻｰﾋﾞｽ起動時は、未設定
    391                final boolean IS_SERVICE = null == System.getProperty( "sun.java.command" );
    392                map.put( "IS_SERVICE"   , String.valueOf( IS_SERVICE ) );                               // 7.1.0.0 (2020/01/20) ｻｰﾋﾞｽなら、true
    393
    394                // 6.3.9.1 (2015/11/27) final化にともない、ﾛｼﾞｯｸ整理
    395//              final String TOMCAT_PORT = StringUtil.nval( System.getenv( "CONNECTOR_PORT" ) , map.get( "TOMCAT_PORT" ) );
    396//              final String TOMCAT_PORT = StringUtil.nval( HybsConst.getenv( "CONNECTOR_PORT" ) , map.get( "TOMCAT_PORT" ) );  // 7.2.3.1 (2020/04/17)
    397                final String TOMCAT_PORT = HybsConst.getenv( "CONNECTOR_PORT" , map.get( "TOMCAT_PORT" ) );     // 8.4.0.0 (2022/12/23) getenvの初期値を使用
    398
    399                // 6.3.9.1 (2015/11/27) final化にともない、、ﾛｼﾞｯｸ整理
    400                final String HOST_URL = TOMCAT_PORT == null || TOMCAT_PORT.isEmpty()
    401                                                                        ? "**" : HybsSystem.HOST_NAME + ":" + TOMCAT_PORT + "/" + contextName + "/";
    402                map.put( "HOST_URL", HOST_URL );
    403
    404                // 6.9.0.1 (2018/02/05) RequestParam で設定される値を、できるだけ構築しておきます。
    405                map.put( "SERVER_NAME"  , "localhost" );                                                // HybsSystem.HOST_NAME でも良いかも。
    406                map.put( "SERVER_URL"   , "http://localhost:" + TOMCAT_PORT + "/" );
    407                map.put( "CONTEXT_URL"  , "http://localhost:" + TOMCAT_PORT + "/" + contextName + "/" );
    408
    409                // 6.9.3.1 (2018/04/02) web.xml で定義されている filter、servlet のｷｰ名称を取得し、あれば、true を設定します｡
    410                // キーワードは、USE_(大文字のフィルター名) です。
    411                final Map<String,? extends FilterRegistration> filterMap = context.getFilterRegistrations();
    412                for( final String fkey : filterMap.keySet() ) {
    413                        map.put( "USE_" + fkey.toUpperCase( Locale.JAPAN ) , "true" );
    414                }
    415
    416                // 6.9.3.1 (2018/04/02) web.xml で定義されている filter、servlet のｷｰ名称を取得し、あれば、true を設定します｡
    417                // ｷｰﾜｰﾄﾞは、USE_(大文字のﾌｨﾙﾀｰ名) です｡
    418                final Map<String,? extends ServletRegistration> servletMap = context.getServletRegistrations();
    419                for( final String skey : servletMap.keySet() ) {
    420                        map.put( "USE_" + skey.toUpperCase( Locale.JAPAN ) , "true" );
    421                }
    422
    423                System.out.println( "    Load Initial Parameter [" + map.size() + "] finished." );
    424        }
    425
    426        /**
    427         * ｱﾌﾟﾘｹｰｼｮﾝ個別に設定しているﾘｿｰｽDB(GE12)を取得します｡
    428         *
    429         * ﾃﾞｰﾀﾍﾞｰｽへの接続は、WEB-INF の DBConfig.xml で設定された情報を元に、
    430         * org.opengion.fukurou.db.ConnectionFactory で接続先を取得します｡
    431         * ここでは、web.xml で定義された各ｱﾌﾟﾘｹｰｼｮﾝ個別のﾊﾟﾗﾒ―ﾀを取得します｡
    432         * SYSTEM_ID(必須) です｡
    433         *
    434         * @og.rev 4.0.0.0 (2007/10/10) 接続先情報の管理見直し(ｺﾝﾃｷｽﾄ初期設定)
    435         * @og.rev 4.0.0.0 (2007/10/26) ｺﾈｸｼｮﾝをﾌｧｸﾄﾘｰから取ってくるように変更
    436         * @og.rev 4.3.6.5 (2009/05/08) dataﾊﾟｽ内のXMLﾌｧｲﾙも読み取るようにする
    437         * @og.rev 4.3.6.6 (2009/05/15) ↑を廃止｡自動ｲﾝｽﾄｰﾙ対応｡
    438         * @og.rev 5.1.2.0 (2010/01/01) connection.setAutoCommit は、ConnectionFactory で設定済みなので、ｺﾒﾝﾄｱｳﾄ
    439         * @og.rev 5.1.9.0 (2010/08/01) 自動ｲﾝｽﾄｰﾙの設定見直し(画面からのｲﾝｽﾄｰﾙ対応)
    440         * @og.rev 5.5.4.4 (2012/07/20) SQLException は、catch しているので、このﾒｿｯﾄﾞからは、throws されない｡
    441         * @og.rev 5.5.4.5 (2012/07/27) 初期起動時のDB接続先は、RESOURCE_DBID とする｡
    442         * @og.rev 5.6.6.1 (2013/07/12) xml ﾊﾟｽ内のXMLﾌｧｲﾙがあれば、DB登録します｡
    443         * @og.rev 5.6.7.0 (2013/07/27) InitFileLoader で、resource以下は、DBID=RESOURCE xml以下は、DBID=DEFAULT に登録します｡
    444         * @og.rev 5.6.7.3 (2013/08/23) DBID=RESOURCE 漏れ
    445         * @og.rev 5.7.2.0 (2014/01/10) RuntimeException は、catch しないようにします｡
    446         * @og.rev 6.4.2.1 (2016/02/05) try-with-resources 文で記述｡
    447         * @og.rev 6.4.3.2 (2016/02/19) returnをやめて、引数のMapに直接値を設定します｡
    448         * @og.rev 6.4.7.1 (2016/06/17) ｾｷｭﾘﾃｨの関連で、ﾛｸﾞの詳細を出していませんでしたが、出すように変更します｡
    449         * @og.rev 6.9.3.0 (2018/03/26) ﾃﾞｰﾀ検索時のﾌｪｯﾁｻｲｽﾞを設定｡
    450         * @og.rev 8.5.0.0 (2023/04/21) 対象外の resource を読込んでいた為、判定条件を変更
    451         *
    452         * @param       sysParam        入力ｼｽﾃﾑﾊﾟﾗﾒｰﾀﾏｯﾌﾟ
    453         */
    454        private static void loadDBResource( final Map<String,String> sysParam ) {
    455                final String SYSTEM_ID          = sysParam.get( "SYSTEM_ID" );
    456
    457                // 必須項目ﾁｪｯｸを行います｡SYSTEM_IDは必須です｡
    458                // これは、web.xml で定義が必要です。
    459                // 4.0.0.0 (2007/10/23)接続情報XML化につきDB_URLﾁｪｯｸを削除
    460                if( SYSTEM_ID == null || SYSTEM_ID.isEmpty() ) {
    461                        final String errMsg = "システムパラメータの必須項目(SYSTEM_ID,DB_URL)が null です。" + CR
    462                                                        + "SYSTEM_ID=[" + SYSTEM_ID + "] " + CR
    463                                                        + "Versino=[" + BuildNumber.VERSION_NO + "] " + CR ;
    464                        ERR_MSG_LIST.add( errMsg );
    465                        return ;                                                                                // 6.4.3.2 (2016/02/19)
    466                }
    467
    468                Connection      defConn                 = null;                                 // 5.6.7.0 (2013/07/27) DBID=DEFAULT  のｺﾈｸｼｮﾝ
    469                Connection      rscConn                 = null;                                 // 5.6.7.0 (2013/07/27) DBID=RESOURCE のｺﾈｸｼｮﾝ
    470                boolean         errFlag                 = true;
    471                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid declaring a variable if it is unreferenced before a possible exit point.
    472                final String CONTEXT_NAME       = sysParam.get( "CONTEXT_NAME" );       // ｺﾝﾃｷｽﾄ別ｼｽﾃﾑﾘｿｰｽ
    473                final String HOST_URL           = sysParam.get( "HOST_URL" );           // 4.1.0.0 (2007/12/21) TOMCATへのｱｸｾｽ用
    474                final String RESOURCE_DBID      = sysParam.get( "RESOURCE_DBID" );      // 5.5.4.5 (2012/07/27) 初期起動時のDB接続先
    475                try {
    476
    477                        // 4.0.0.0(2007/10/25)ConnectionをConnectionFactory経由で取得するように変更する。
    478                        // ｺﾝﾃｷｽﾄ名で接続しにいく｡ApplicationInfoは使わないのでnull
    479                        ConnectionFactory.init( CONTEXT_NAME, null );   // ConnectionFactoryの初期化
    480
    481                        defConn = ConnectionFactory.connection( null, null );                   // 5.6.7.0 (2013/07/27) DBID=DEFAULT のｺﾈｸｼｮﾝ
    482                        rscConn = ConnectionFactory.connection( RESOURCE_DBID, null );  // 5.6.7.0 (2013/07/27) DBID=RESOURCE のｺﾈｸｼｮﾝ
    483
    484                        // 4.3.6.6 (2009/05/15)
    485                        // 5.1.9.0 (2010/08/01) 自動ｲﾝｽﾄｰﾙの設定見直し(画面からのｲﾝｽﾄｰﾙ対応)
    486                        final SystemInstaller installer = new SystemInstaller( defConn , rscConn , new PrintWriter( System.out, true ) );
    487                        installer.autoInsUpd( SYSTEM_ID, CONTEXT_NAME, HOST_URL );
    488
    489                        // resource ﾊﾟｽ内のXMLﾌｧｲﾙがあれば、先にDB登録します｡(DBID=RESOURCE)
    490                        // 6.0.0.0 (2014/04/11) XMLFileLoader に変更｡
    491                        // 7.0.1.4 (2018/11/26) XMLFileLoader をfinal宣言(どうせ、new してるので使い回しを止める｡)
    492//                      XMLFileLoader loader = new XMLFileLoader( rscConn,true );                       // ﾘｿｰｽｺﾈｸｼｮﾝとuseTimeStamp=true 指定
    493//                      loader.loadClassPathFiles( "resource" ) ;
    494                        final XMLFileLoader rscLoad = new XMLFileLoader( rscConn,true );        // ﾘｿｰｽｺﾈｸｼｮﾝとuseTimeStamp=true 指定
    495//                      rscLoad.loadClassPathFiles( "resource" ) ;
    496                        // 8.5.0.0 (2023/04/21) C:/opengionVX/apps/LibreOfficeX.X.X/program/resource を対象外にする
    497                        rscLoad.loadClassPathFiles( "resource", "webapps" ) ;
    498
    499                        // 5.6.6.1 (2013/07/12) xml ﾊﾟｽ内のXMLﾌｧｲﾙがあれば、DB登録します｡
    500                        // 6.0.0.0 (2014/04/11) XMLFileLoader に変更｡
    501                        // 7.0.1.4 (2018/11/26) XMLFileLoader をfinal宣言(どうせ、new してるので使い回しを止める｡)
    502//                      loader = new XMLFileLoader( defConn,true );                                                     // ﾃﾞﾌｫﾙﾄｺﾈｸｼｮﾝとuseTimeStamp=true 指定
    503//                      loader.loadClassPathFiles( "xml" ) ;
    504                        final XMLFileLoader xmlLoad = new XMLFileLoader( defConn,true );        // ﾃﾞﾌｫﾙﾄｺﾈｸｼｮﾝとuseTimeStamp=true 指定
    505                        xmlLoad.loadClassPathFiles( "xml" ) ;
    506
    507                        // ｺﾝﾃｷｽﾄ単位のｼｽﾃﾑﾊﾟﾗﾒｰﾀを GE12 に設定します｡
    508                        // dbXMLResourceInsert の後に登録する必要があります｡
    509                        dbResourceUpdate( rscConn,sysParam );                   // 5.6.7.0 (2013/07/27) DBID=RESOURCE のｺﾈｸｼｮﾝ
    510                        rscConn.commit();
    511        //              Closer.commit( rscConn );
    512
    513                        final Map<String,String> userMap = new HashMap<>(100);
    514                        // 6.4.2.1 (2016/02/05) try-with-resources 文
    515                        try( PreparedStatement pstmt = rscConn.prepareStatement( QUERY ) ) {
    516                                pstmt.setFetchSize( DB_FETCH_SIZE );            // 6.9.3.0 (2018/03/26) ﾃﾞｰﾀ検索時のﾌｪｯﾁｻｲｽﾞ
    517                                pstmt.setString( 1,SYSTEM_ID );
    518                                pstmt.setString( 2,HOST_URL );                          // 4.1.0.0 (2007/12/21)
    519                                try( ResultSet resultSet = pstmt.executeQuery() ) {
    520
    521                                        while( resultSet.next() ) {
    522                                                final String key = resultSet.getString(1);
    523                                                final String val = resultSet.getString(2);
    524                                                // 6.4.3.2 (2016/02/19) null値の登録はやめます。
    525                                                userMap.put( key,val == null ? "" : val );              // 6.4.3.2 (2016/02/19)
    526                                        }
    527                                }
    528                        }
    529
    530                        // DBを検索して、ﾕｰｻﾞｰ設定ﾘｿｰｽ情報を取得します｡
    531                        System.out.println( "    Load DB Resource [" + userMap.size() + "] finished." );
    532                        // ﾘｿｰｽをﾏｰｼﾞします｡
    533                        sysParam.putAll( userMap );
    534                        errFlag = false;        // ｴﾗｰでない
    535                }
    536                catch( final SQLException ex ) {
    537                        Closer.rollback( defConn );                     // 5.6.7.0 (2013/07/27) DBID=DEFAULT のｺﾈｸｼｮﾝ
    538                        Closer.rollback( rscConn );                     // 5.6.7.0 (2013/07/27) DBID=RESOURCE のｺﾈｸｼｮﾝ
    539                        LogWriter.log( ex );
    540                        final String errMsg = ex.getMessage() + ":" + ex.getSQLState() ;
    541                        ERR_MSG_LIST.add( errMsg );
    542                }
    543                catch( final UnsupportedEncodingException ex ) {
    544                        Closer.rollback( defConn );                     // 5.6.7.0 (2013/07/27) DBID=DEFAULT のｺﾈｸｼｮﾝ
    545                        Closer.rollback( rscConn );                     // 5.6.7.0 (2013/07/27) DBID=RESOURCE のｺﾈｸｼｮﾝ
    546                        LogWriter.log( ex );
    547                        final String errMsg = "UTF-8 がサポートされていない Java VM は、正規VMではありません。"
    548                                                        + ex.getMessage();
    549                        ERR_MSG_LIST.add( errMsg );
    550                }
    551                catch( final RuntimeException ex ) {
    552                        Closer.rollback( defConn );                     // 5.6.7.0 (2013/07/27) DBID=DEFAULT のｺﾈｸｼｮﾝ
    553                        Closer.rollback( rscConn );                     // 5.6.7.0 (2013/07/27) DBID=RESOURCE のｺﾈｸｼｮﾝ
    554                        // 5.7.2.0 (2014/01/10) RuntimeException は、catch しないようにします。
    555                        // 6.4.7.1 (2016/06/17)
    556                        final String errMsg = "システムパラメータの設定で、エラーが発生しました。"
    557                                                        + ex.getMessage();
    558                        ERR_MSG_LIST.add( errMsg );
    559
    560                        throw new HybsSystemException( ex );            // 6.4.3.2 (2016/02/19) 生のRuntimeExceptionをﾗｯﾌﾟしてthrowする。
    561                }
    562                finally {
    563                        if( errFlag ) {
    564                                ConnectionFactory.remove( defConn, null );                              // 5.6.7.0 (2013/07/27) DBID=DEFAULT のｺﾈｸｼｮﾝ
    565                                ConnectionFactory.remove( rscConn, RESOURCE_DBID );             // 5.6.7.3 (2013/08/23) DBID=RESOURCE 漏れ
    566                        }
    567                        else {
    568                                ConnectionFactory.close( defConn, null );                               // 5.6.7.0 (2013/07/27) DBID=DEFAULT のｺﾈｸｼｮﾝ
    569                                ConnectionFactory.close( rscConn, RESOURCE_DBID );              // 5.6.7.3 (2013/08/23) DBID=RESOURCE 漏れ
    570                        }
    571                }
    572        }
    573
    574        /**
    575         * ｴﾝｼﾞﾝ内部定義の初期ﾘｿｰｽ情報をDB(GE12)に登録します｡
    576         *
    577         * 初期ﾘｿｰｽ情報は、KBSAKU='0' で登録されている情報で、一旦すべて削除
    578         * してから、全てのﾘｿｰｽ情報を追加するという形をとります｡
    579         * ただし、属性情報(名称や概要など)を別途登録する場合は、全てを
    580         * 削除せずに、UPDATE する方向で検討したいと思います｡
    581         * なお、この情報をDB登録する理由は、ﾘｿｰｽの設定値を変えたい場合に、
    582         * ｷｰが判らない(JavaDOCからしか読み取れない)のでは不便な為に
    583         * 用意しておくだけで、内部では SystemData ｵﾌﾞｼﾞｪｸﾄとして定義
    584         * されている値を使用するため、このﾃﾞｰﾀﾍﾞｰｽ値は、使用していません｡
    585         *
    586         * ※ 6.9.7.0 (2018/05/14)
    587         *    自身のｻｰﾊﾞｰで追記した情報以外を消すため、登録日付が古いﾃﾞｰﾀは削除します｡
    588         *    現状は、1ヶ月にしています｡
    589         *
    590         * @og.rev 6.9.7.0 (2018/05/14) DYSETの登録と、旧ﾃﾞｰﾀ（1ヶ月前）の削除を行います｡
    591         *
    592         * @param       conn    登録用ｺﾈｸｼｮﾝ(ﾘｿｰｽ用)
    593         * @param       map             入力ｼｽﾃﾑﾊﾟﾗﾒｰﾀﾏｯﾌﾟ
    594         * @throws      SQLException    ﾃﾞｰﾀﾍﾞｰｽｱｸｾｽｴﾗｰ
    595         */
    596        private static void dbResourceUpdate( final Connection conn,final Map<String,String> map ) throws SQLException {
    597
    598                final String SYSTEM_ID = map.get( "SYSTEM_ID" );
    599                final String HOST_URL  = map.get( "HOST_URL" );         // 4.1.0.0 (2007/12/21)
    600
    601                // 6.9.7.0 (2018/05/14) 現在時刻から、1ヶ月を引いた日付と比較して、削除ﾃﾞｰﾀを決めます｡
    602                final Calendar now = Calendar.getInstance();
    603                now.add( Calendar.MONTH , -1 );
    604                final String OLD_DATE  = DateSet.getDate( now.getTimeInMillis() , DYSET_FORMAT );
    605
    606                // 既存の設定値を全件DELETEします。
    607                int delCnt;
    608                PreparedStatement pstmt = null;
    609                try {
    610                        pstmt = conn.prepareStatement( DEL_SYS );
    611                        pstmt.setString( 1, SYSTEM_ID );
    612                        pstmt.setString( 2, HOST_URL );                                         // 4.1.0.0 (2007/12/21)
    613                        pstmt.setString( 3, OLD_DATE );                                         // 6.9.7.0 (2018/05/14) 古いﾃﾞｰﾀを消します。
    614                        delCnt = pstmt.executeUpdate();
    615                }
    616                finally {
    617                        Closer.stmtClose( pstmt );
    618                }
    619
    620                // 新設定値を全件INSERTします。
    621                final Set<String> keyset = map.keySet();
    622                final String[] keys = keyset.toArray( new String[keyset.size()] );
    623
    624                final String DYSET = DateSet.getDate( DYSET_FORMAT );   // 6.9.7.0 (2018/05/14)
    625                int insCnt = 0;
    626                try {
    627                        pstmt = conn.prepareStatement( INS_SYS );
    628                        for( int i=0; i<keys.length; i++ ) {
    629                                pstmt.setString( 1,SYSTEM_ID );                                 // SYSTEM_ID
    630                                pstmt.setString( 2,HOST_URL);                                   // CONTXT_PATH
    631                                pstmt.setString( 3,keys[i] );                                   // PARAM_ID
    632                                pstmt.setInt(    4,( i + 1 ) * 10 );                    // SEQNO
    633                                pstmt.setString( 5,map.get( keys[i] ) );                // PARAM
    634                                pstmt.setString( 6,DYSET );                                             // DYSET 6.9.7.0 (2018/05/14)
    635                                pstmt.setString( 7,keys[i] );                                   // PARAM_ID
    636                                insCnt += pstmt.executeUpdate();
    637                        }
    638                }
    639                finally {
    640                        Closer.stmtClose( pstmt );
    641                }
    642
    643                System.out.print( "    DB Context Resource Reconfiguration " );
    644                System.out.println( "DELETE=[" + delCnt + "],INSERT=[" + insCnt + "] finished." );
    645        }
    646
    647        /**
    648         * ServletContext の名称を取得します｡
    649         *
    650         * ｺﾝﾃｷｽﾄのｱｸｾｽされたﾊﾟｽ( /training など )の名称を、
    651         * 取得します｡(ｱｸｾｽ先の仮想ﾌｫﾙﾀﾞ名)
    652         * 以前は、配備記述子(WEB-INF/web.xml)の display-name 要素を見て、
    653         * 無ければ、実ﾌｫﾙﾀﾞ名を返していました｡
    654         * ※ warﾌｧｲﾙのﾊﾞｰｼﾞｮﾝ管理（ｾｯｼｮﾝ管理）対応として、## 以下の文字列を削除します｡
    655         *    ## は、war化の際に、"%23%23" に変換されるため、それも取り除き処理の対象とします｡
    656         *
    657         * @og.rev 6.6.0.0 (2016/12/01) ｺﾝﾃｷｽﾄﾊﾟｽから、##ﾊﾞｰｼﾞｮﾝ番号を取り去った値を返すようにします｡
    658         *
    659         * @param       context Servletｺﾝﾃｷｽﾄ
    660         *
    661         * @return      ｺﾝﾃｷｽﾄのｺﾝﾃｷｽﾄ名
    662         */
    663        private static String getContextName( final ServletContext context ) {
    664                String name = null;
    665                try {
    666                        final String path = context.getResource( "/" ).getFile();
    667                        final int st = path.lastIndexOf( '/',path.length()-2 );         // 後ろから '/' を検索した位置(一番後ろは、'/' が付いているので注意)
    668                        int ed = path.indexOf( "##",st+1 );                                                     // '/' 以降で、"##" を検索した位置
    669                        if( ed < 0 ) {
    670                                ed = path.indexOf( "%23%23",st+1 );                                             // '/' 以降で、"%23%23" を検索した位置
    671                        }
    672                        final int ed2 = ed > 0 ? ed : path.length()-1 ;                         // ## が無ければ、一番最後の文字を含まない、一つ前まで。あれば、そこまで
    673                        name = path.substring( st+1,ed2 );
    674                }
    675                catch( final MalformedURLException ex ) {
    676                        LogWriter.log( ex );
    677                        final String errMsg = "このパス名は、正しいフォームではありません。 "
    678                                                + ex.getMessage();
    679                        ERR_MSG_LIST.add( errMsg );
    680                }
    681                return name ;
    682        }
    683
    684        /**
    685         * 指定のｸﾗｽの public static なﾌｨｰﾙﾄﾞｷｰと値のﾏｯﾌﾟを作成します｡
    686         * 主に、ｴﾝｼﾞﾝ関連のｸﾗｽにﾊﾟﾗﾒｰﾀﾌｧｲﾙをｸﾗｽとして定義し、
    687         * ｴﾝｼﾞﾝとともに配布します｡配布されたｸﾗｽを元に、ﾊﾟﾗﾒｰﾀを
    688         * 読み取ります｡
    689         * この処理は ﾘﾌﾚｸｼｮﾝを使用してｸﾗｽの public static ﾌｨｰﾙﾄﾞを
    690         * 取得し、LinkedHashMap により、取得順をｷｰﾌﾟしたまま、Mapを返します｡
    691         *
    692         * @og.rev 5.7.2.0 (2014/01/10) ERR_MSG_LIST は、一旦文字列に変換してから追加します｡
    693         * @og.rev 6.4.3.2 (2016/02/19) returnをやめて、引数のMapに直接値を設定します｡
    694         *
    695         * @param       map     読み書きするMapｵﾌﾞｼﾞｪｸﾄ
    696         * @param       cls     ｸﾗｽｵﾌﾞｼﾞｪｸﾄ
    697         */
    698        private static void loadParameter( final Map<String,String> map , final Class<?> cls ) {
    699
    700                int cnt = 0;
    701                try {
    702                //      final Field[] field = cls.getFields(); の取得。public ﾌｨｰﾙﾄﾞのみ
    703                        for( final Field fld : cls.getFields() ) {
    704                                if( Modifier.isStatic( fld.getModifiers() ) ) {
    705                                        map.put( fld.getName() , (String)fld.get( null ) );
    706                                        cnt++ ;
    707                                }
    708                        }
    709                }
    710                catch( final IllegalAccessException ex ) {
    711                        LogWriter.log( ex );
    712                        // 5.7.2.0 (2014/01/10) ERR_MSG_LIST は、一旦文字列に変換してから追加します。
    713                        final String errMsg = "クラスから、パラメータを取得できませんでした。" + CR
    714                                                                + "  クラス名=[" + cls.getName() + "]"                              + CR
    715                                                                + ex.getMessage();
    716                        ERR_MSG_LIST.add( errMsg );
    717                }
    718
    719                System.out.println( "    ClassLoad " + cls.getName() + " Parameter [" + cnt + "] finished." );
    720        }
    721
    722        /**
    723         * 指定のｷｰﾜｰﾄﾞのﾌｧｲﾙをｸﾗｽﾊﾟｽより取得し、ｷｰと値のﾏｯﾌﾟを作成します｡
    724         * 主に、ｴﾝｼﾞﾝ関連のｸﾗｽにﾊﾟﾗﾒｰﾀﾌｧｲﾙをPlugInｸﾗｽとして定義し、配布します｡
    725         * この処理の取得に、ｸﾗｽﾊﾟｽの順序が関係します｡最初に取得されたｷｰは、あとから
    726         * 読み取られたｸﾗｽﾊﾟｽは、再ｾｯﾄしません｡
    727         *
    728         * @og.rev 5.3.6.0 (2011/06/01) 並び順を、ｷｰの名称順とする｡
    729         * @og.rev 5.7.2.0 (2014/01/10) ERR_MSG_LIST は、一旦文字列に変換してから追加します｡
    730         * @og.rev 5.7.2.0 (2014/01/10) RuntimeException は、catch しないようにします｡
    731         * @og.rev 6.4.3.2 (2016/02/19) returnをやめて、引数のMapに直接値を設定します｡
    732         * @og.rev 6.6.0.0 (2016/12/01) ｺﾝﾃｷｽﾄﾊﾟｽから、##ﾊﾞｰｼﾞｮﾝ番号を取り去った値を返すようにします｡
    733         *
    734         * @param       ioMap   読み書きするMapｵﾌﾞｼﾞｪｸﾄ
    735         * @param       keyword ｸﾗｽｵﾌﾞｼﾞｪｸﾄを検索する元
    736         */
    737        private static void loadParameter( final Map<String,String> ioMap , final String keyword ) {
    738                final Map<String,String> map = new TreeMap<>();         // 5.3.6.0 (2011/06/01) 並び順を、ｷｰの名称順とする。
    739                try {
    740                        final ClassLoader loader = Thread.currentThread().getContextClassLoader();
    741                        final Enumeration<URL> enume = loader.getResources( keyword );          // 4.3.3.6 (2008/11/15) Generics警告対応
    742                        while( enume != null && enume.hasMoreElements() ) {
    743                                final URL url = enume.nextElement();            // 4.3.3.6 (2008/11/15) Generics警告対応
    744                                // jar:file:/実ディレクトリ または、file:/実ディレクトリ
    745                                final String dir = url.getFile().replaceAll( "%23%23","##" );   // 6.6.0.0 (2016/12/01)
    746
    747                                final FindClassFiles filenames = new FindClassFiles( dir,keyword );
    748                                final String[] names = filenames.getFilenames();
    749                                for( int i=0; i<names.length; i++ ) {
    750                                        final String val = names[i];
    751                                        final String key = val.substring( val.lastIndexOf( '.' )+1 );
    752                                        if( key.indexOf( '_' ) >= 0 && !map.containsKey( key ) && key.indexOf( '$' ) < 0 ) {
    753                                                map.put( key , val );
    754                                        }
    755                                }
    756                                System.out.println( "    FileCheck " + dir + " [" + names.length + "] find." );
    757                        }
    758                }
    759                catch( final IOException ex ) {
    760                        LogWriter.log( ex );
    761                        // 5.7.2.0 (2014/01/10) ERR_MSG_LIST は、一旦文字列に変換してから追加します。
    762                        final String errMsg = "キーワードから、パラメータを取得できませんでした。"       + CR
    763                                                + "  キーワード名=[" + keyword + "]"                                          + CR
    764                                                + ex.getMessage();
    765                        ERR_MSG_LIST.add( errMsg );
    766                }
    767                // 5.7.2.0 (2014/01/10) RuntimeException は、catch しないようにします。
    768                System.out.println( "    FileLoad " + keyword + " Parameter [" + map.size() + "] finished." );
    769                ioMap.putAll( map );            // TreeMap で、ｷｰの名称順に並んだMapを、LinkedHashMapに登録順に設定する。
    770        }
    771}