    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.BufferedReader;
    019import java.io.File;
    020import java.io.InputStream;
    021import java.io.InputStreamReader;
    022import java.io.PrintWriter;
    023import java.io.Reader;
    024import java.io.UnsupportedEncodingException;
    025import java.sql.Connection;
    026import java.sql.PreparedStatement;
    027import java.sql.ResultSet;
    028import java.sql.SQLException;
    029import java.sql.Statement;
    030import java.util.ArrayList;
    031import java.util.List;
    032import java.util.Locale;
    033
    034import org.opengion.fukurou.util.Closer;
    035import org.opengion.fukurou.util.FileUtil;
    036import org.opengion.fukurou.util.StringUtil;
    037// import org.opengion.fukurou.util.ZipFileUtil;
    038import org.opengion.fukurou.util.ZipArchive;                    // 6.0.0.0 (2014/04/11) ZIP API変更
    039import org.opengion.fukurou.xml.HybsXMLSave;
    040import org.opengion.fukurou.db.DBUtil;
    041
    042/**
    043 * システムの自動インストールと自動更新を行います。
    044 *
    045 * (1)初期インストール・自動更新(#autoInsUpd)
    046 *   ①初期自動インストールを行うには、起動時の環境変数にINSTALL_CONTEXTSが
    047 *     設定されている必要があります。
    048 *     この環境変数が設定されている場合、システムリソーステーブル(GE12)が存在しなければ、
    049 *     エンジンがインストールされていないと判断し、自動インストールを行います。
    050 *     INSTALL_CONTEXTSにge,gfが指定されている場合は、開発環境を含めたフルバージョンが
    051 *     インストールされます。
    052 *     geのみが指定されている場合は、コアモジュールであるgeのみがインストールされます。
    053 *
    054 *     インストールスクリプトは、
    055 *      webapps/[CONTEXT]/db/[DBNAME]/xml/install                       DBID=DEFAULT
    056 *      webapps/[CONTEXT]/db/[DBNAME]/xml/update                        DBID=DEFAULT
    057 *     以下にあるXMLファイルが全て実行されます。
    058 *     また、同時に
    059 *      webapps/[CONTEXT]/db/common/xml/install                         DBID=DEFAULT
    060 *      webapps/[CONTEXT]/db/common/xml/update                          DBID=DEFAULT
    061 *      webapps/[CONTEXT]/db/resource/xml/install                       DBID=RESOURCE   (5.6.7.0 (2013/07/27) 追加)
    062 *      webapps/[CONTEXT]/db/resource/xml/update                        DBID=RESOURCE   (5.6.7.0 (2013/07/27) 追加)
    063 *     以下にあるデータロードスクリプトも全て実行されます。
    064 *
    065 *   ②自動更新については、システムリソーステーブル(GE12)の更新と、各システムの更新の2つがあります。
    066 *     GE12更新の判断基準は、システムID='**'に格納されているバージョン(同一のGE12を使用し
    067 *     ているシステムの最大バージョン番号)がアップした場合です。
    068 *     この場合に、エンジン内部で保持しているXMLファイルよりシステムリソースの再ロードを行います。
    069 *     各システムの更新の判断基準は、システムID=各システムのバージョン番号がアップされた場合です。
    070 *
    071 *     更新スクリプトは、
    072 *      webapps/[CONTEXT]/db/[DBNAME]/xml/update                        DBID=DEFAULT
    073 *     以下にあるXMLファイルが全て実行されます。
    074 *     また、同時に
    075 *      webapps/[CONTEXT]/db/common/xml/update                          DBID=DEFAULT
    076 *      webapps/[CONTEXT]/db/resource/xml/update                        DBID=RESOURCE   (5.6.7.0 (2013/07/27) 追加)
    077 *     以下にあるデータロードスクリプトも全て実行されます。
    078 *
    079 * (2)インストール(#install)
    080 *  自動インストールは、通常は画面からコンテキストのアーカイブを指定して行います。
    081 *
    082 *  アーカイブの内容としては、アーカイブの直下がコンテキスト名のフォルダとなっている必要があります。
    083 *  このコンテキストフォルダをwebapps以下に展開します。
    084 *
    085 *  また、Tomcatのコンテキストの設定ファイル、([CONTEXT].xml)が"WEB-INFの直下を配置している必要があります。
    086 *
    087 *  このインストールでは、Tomcatに対するコンテキスト定義のXMLファイルの配備及び、
    088 *  各種DB、データのロードを行います。
    089 *
    090 *  インストールスクリプトは、
    091 *   webapps/[CONTEXT]/db/[DBNAME]/xml/install                          DBID=DEFAULT
    092 *  以下にあるXMLファイルが全て実行されます。
    093 *  また、同時に
    094 *   webapps/[CONTEXT]/db/common/xml/install                            DBID=DEFAULT
    095 *   webapps/[CONTEXT]/db/resource/xml/install                          DBID=RESOURCE   (5.6.7.0 (2013/07/27) 追加)
    096 *  以下にあるデータロードスクリプトも全て実行されます。
    097 *
    098 * @og.rev 4.3.6.6 (2009/05/15) 新規作成
    099 * @og.group 初期化
    100 *
    101 * @version  4.0
    102 * @author   Hiroki Nakamura
    103 * @since    JDK5.0,
    104 */
    105public final class SystemInstaller {
    106        private final Connection defConn;               // 5.6.7.0 (2013/07/27) DBID=DEFAULT  のコネクション
    107        private final Connection rscConn;               // 5.6.7.0 (2013/07/27) DBID=RESOURCE のコネクション
    108        private final PrintWriter out;                  // 5.1.9.0 (2010/08/01)
    109        private final String DBNAME;                    // 5.5.4.4 (2012/07/20) 共通化 (DBID=DEFAULT のDB名)
    110
    111        /** エンジン共通パラメータ(SYSTEM_ID='**' KBSAKU='0')のXML ファイルの指定  {@value}        */
    112        public static final String GE12_XML = "org/opengion/hayabusa/common/GE12.xml";
    113
    114        /** エンジン共通パラメータ(SYSTEM_ID='**' KBSAKU='0')のENGINE_INFO 読み取りクエリー {@value}        */
    115        public static final String SEL_MAX_ENG = "select PARAM from GE12"
    116                                                                        + " where SYSTEM_ID='**' and PARAM_ID='ENGINE_INFO'"
    117                                                                        + " and FGJ='1' and KBSAKU='0'" ;
    118
    119        /** エンジン個別(SYSTEM_ID='個別' KBSAKU='0'  CONTXT_PATH='自身')のバージョン情報を取得するクエリーー{@value} 4.3.6.6 (2009/05/15) */
    120        public static final String SEL_SYS_ENG = "select PARAM from GE12"
    121                                                                        + " where SYSTEM_ID=? and PARAM_ID='ENGINE_INFO' and KBSAKU='0' and CONTXT_PATH=? and FGJ='1'";
    122
    123        private static final String FS                  = File.separator ;                                              // 5.5.4.4 (2012/07/20) static化
    124        private static final String APP_BASE    = System.getenv( "APP_BASE" ) + FS;             // 5.5.4.4 (2012/07/20) static化
    125
    126
    127        /**
    128         * データベース処理をおこなうに当たり、処理のタイプを指定するための、enum 定義です。
    129         * 文字列で扱っていた箇所を、enum と置き換えます。
    130         *
    131         * @og.rev 5.5.4.4 (2012/07/20) 新規追加
    132         */
    133        private static enum EXEC_TYPE { INSTALL , UPDATE } ;
    134
    135        /**
    136         * システムインストール・更新クラスのコンストラクタです
    137         *
    138         * なお、このクラスの中の処理で、エラーが発生しても、Connection は、close 等しません。
    139         * 呼び出し元で、try ～ finally で、処理してください。
    140         *
    141         * @og.rev 5.5.4.4 (2012/07/20) VERSIONは、直接 BuildNumber.ENGINE_INFO を使用。
    142         * @og.rev 5.6.7.0 (2013/07/27) アプリケーション登録用とリソース登録用のコネクションを分ける
    143         *
    144         * @param       defConn アプリケーション登録用コネクション
    145         * @param       rscConn リソース登録用コネクション
    146         * @param       out     表示用のWriter
    147         */
    148        public SystemInstaller( final Connection defConn, final Connection rscConn, final PrintWriter out ) {
    149                this.defConn = defConn;                 // 5.6.7.0 (2013/07/27) アプリケーション登録用
    150                this.rscConn = rscConn;                 // 5.6.7.0 (2013/07/27) リソース登録用
    151                this.out = out;
    152
    153                // 5.6.7.0 (2013/07/27) ProductName は、DBUtil 経由で取得する。
    154                DBNAME = DBUtil.getProductName( defConn );              // 5.6.7.0 (2013/07/27) DBID=DEFAULT  のDB名
    155        }
    156
    157        /**
    158         * システムの初期自動インストール・自動更新を行います。
    159         *
    160         * 詳細は、クラスドキュメントを参照して下さい。
    161         *
    162         * @og.rev 5.1.9.0 (2010/08/01) 新規作成
    163         * @og.rev 5.5.4.4 (2012/07/20) VERSIONは、直接 BuildNumber.ENGINE_INFO を使用。
    164         *
    165         * @param systemId システムID
    166         * @param context コンテキスト名
    167         * @param hostUrl ホスト文字列
    168         * @throws UnsupportedEncodingException エンコード名 "UTF-8" が存在しなかった場合。
    169         * @see   #dbXMLResourceInsert()
    170         */
    171        public void autoInsUpd( final String systemId, final String context, final String hostUrl ) throws UnsupportedEncodingException  {
    172                String oldMaxVersion = getOldMaxVersion();
    173                String oldSystemVersion = getOldSystemVersion( systemId, hostUrl );
    174
    175                out.println( "    System Version Information ( " + systemId + " )" );
    176                out.println( "      Load Version [ " + BuildNumber.ENGINE_INFO + " ]" );                // 5.5.4.4 (2012/07/20)
    177                out.println( "        -> Resource Version[ " + oldMaxVersion + " ]" );
    178                out.println( "        -> System   Version[ " + oldSystemVersion + " ]" );
    179
    180                // 初期自動インストール
    181                if( "none".equalsIgnoreCase( oldMaxVersion ) ) {
    182                        out.println( "      !!! openGion ENVIROMENT IS NOT INSTALLED !!!" );
    183
    184                        String INSTALL_CONTEXTS = System.getenv( "INSTALL_CONTEXTS" );
    185                        if( INSTALL_CONTEXTS == null || INSTALL_CONTEXTS.length() == 0 ) {
    186                                out.println( "        !!! \"INSTALL_CONTEXT\" IS NOT CONFIGURED\" !!!" );
    187                                out.println( "        !!! \"SET ENRIVOMENT PARAMETER NAMED \"INSTALL_CONTEXT\" ON INIT_SCRIPT !!!" );
    188                                return;
    189                        }
    190                        out.println( "      Start Initiall Enviroment Install : install type ( " + INSTALL_CONTEXTS + " )" );
    191                        String[] insSys = StringUtil.csv2Array( INSTALL_CONTEXTS );
    192                        for( int i=0; i<insSys.length; i++ ) {
    193                                out.println( "        install    ( " + insSys[i] + " )" );
    194                                loadXMLScript( EXEC_TYPE.INSTALL, insSys[i] );
    195                                out.println( "        completed  ( " + insSys[i] + " )" );
    196                        }
    197
    198                        out.println( "      Start SystemParameter reload" );
    199                        dbXMLResourceInsert();
    200                        out.println( "      completed" );
    201                }
    202                // 自動更新
    203                else {
    204                        if ( oldSystemVersion == null || oldSystemVersion.compareTo( BuildNumber.ENGINE_INFO ) < 0 ){           // 5.5.4.4 (2012/07/20)
    205                                out.println( "      Start Enviroment Update ( " + context + " )" );
    206                                loadXMLScript( EXEC_TYPE.UPDATE , context );
    207                                out.println( "      completed               ( " + context + " )" );
    208                        }
    209
    210                        if( oldMaxVersion == null || oldMaxVersion.compareTo( BuildNumber.ENGINE_INFO ) < 0 ){                          // 5.5.4.4 (2012/07/20)
    211                                out.println( "      Start SystemParameter Reload" );
    212                                dbXMLResourceInsert();
    213                                out.println( "      completed" );
    214                        }
    215                }
    216        }
    217
    218        /**
    219         * システムの自動インストールを行います。
    220         *
    221         * 詳細は、クラスドキュメントを参照して下さい。
    222         *
    223         * @og.rev 5.1.9.0 (2010/08/01) 新規作成
    224         * @og.rev 5.5.4.4 (2012/07/20) FS , APP_BASE を、共通に設定
    225         * @og.rev 6.0.0.0 (2014/04/11) ZIP API変更
    226         *
    227         * @param buildArchive コンテキストのアーカイブファイル
    228         */
    229        public void install( final File buildArchive ) {
    230                final String tempDir  = HybsSystem.sys( "REAL_PATH" ) + HybsSystem.sys( "FILE_URL" ) + System.currentTimeMillis() + FS;
    231                final String ctxtXmlDir = System.getenv( "CATALINA_HOME" ) + FS + "conf" + FS + System.getenv( "ENGINE_NAME" ) + FS + "localhost" + FS;
    232
    233                out.println( "      Check Archive File and Enviroment" );
    234
    235                // アーカイブの存在チェック
    236                if( !buildArchive.exists() ) {
    237                        out.println( "        !!! Archive File does not exists File=[ " + buildArchive.getAbsolutePath() + "] !!!" );
    238                        out.println( "        !!! Install Aborted !!! " );
    239                        return;
    240                }
    241
    242                // アーカイブを一時ファイルに展開します。
    243//              ZipFileUtil.unCompress( tempDir, buildArchive.getAbsolutePath() );
    244                ZipArchive.unCompress( new File( tempDir ), buildArchive );                             // 6.0.0.0 (2014/04/11) ZIP API変更
    245
    246                // アーカイブの内容チェック
    247                File[] ctxts = new File( tempDir ).listFiles();
    248                for( File ctxt : ctxts ) {
    249                        // 5.1.9.0 (2010/08/01) if の条件を入れ替えます。(Avoid if (x != y) ..; else ..;)
    250                        String context = ctxt.getName();
    251                        if( ctxt.isDirectory() ) {
    252                                // アーカイブ中に[CONTEXT].xmlが存在していない場合はエラー(何も処理しない)
    253                                File srcCtxtXml = new File( tempDir + context + FS + "WEB-INF" + FS + context + ".xml" );
    254                                if( !srcCtxtXml.exists() ) {
    255                                        out.println( "        !!! Context XML Does not exists =[ " + srcCtxtXml.getAbsolutePath() + "] !!!" );
    256                                        out.println( "        !!! Install Aborted !!! " );
    257                                        return;
    258                                }
    259
    260                                // [CONTEXT].xmlが既に存在している場合はエラー(何も処理しない)
    261                                File ctxtXml = new File(  ctxtXmlDir + context + ".xml" );
    262                                if( ctxtXml.exists() ) {
    263                                        out.println( "        !!! Context XML File Already Installed File=[ " + ctxtXml.getAbsolutePath() + "] !!!" );
    264                                        out.println( "        !!! Install Aborted !!! " );
    265                                        return;
    266                                }
    267
    268                                // webapps/[CONTEXT]が既に存在している場合はエラー(何も処理しない)
    269                                File webAppsDir = new File( APP_BASE + context );
    270                                if( webAppsDir.exists() ) {
    271                                        out.println( "        !!! Context Path Already Exists Path=[ " + webAppsDir.getAbsolutePath() + "] !!!" );
    272                                        out.println( "        !!! Install Aborted !!! " );
    273                                        return;
    274                                }
    275
    276                                out.println( "        This Archive includes SYSTEM ( " + context + " ) for Install" );                  // 5.5.4.4 (2012/07/20)
    277                        }
    278                        // ファイルが含まれている場合はエラー(何も処理しない)
    279                        else {
    280                                out.println( "        !!! This Archive is not Installer. Because include FILE not DIRECTORY. File=[ " + context + "] !!!" );    // 5.5.4.4 (2012/07/20)
    281                                out.println( "        !!! Install Aborted !!! " );
    282                                return;
    283                        }
    284                }
    285
    286                // アーカイブをコンテキストファイル以下にコピー
    287                for( File ctxt : ctxts ) {
    288                        String context = ctxt.getName();
    289                        out.println( "      Start Enviroment Install ( " + context + " )" );
    290
    291                        // コンテキストのファイルをコピーします。
    292                        FileUtil.copyDirectry( tempDir + context, APP_BASE + context );
    293
    294                        // [CONTEXT].xmlをTomcatのconf以下に展開します。
    295                        FileUtil.copy( tempDir + context + FS + "WEB-INF" + FS + context + ".xml", ctxtXmlDir + context + ".xml" );
    296
    297                        // DBスクリプトをロードします。
    298                        loadXMLScript( EXEC_TYPE.INSTALL , context );
    299                        out.println( "      completed                ( " + context + " )" );
    300                }
    301                out.println( "      Install Process All Completed." );
    302        }
    303
    304        /**
    305         * インストール、更新用のXMLスクリプトをロードします。
    306         *
    307         * @og.rev 5.0.0.2 (2009/09/15) .xmlファイル以外は読み込まないように修正
    308         * @og.rev 5.1.1.0 (2009/12/01) コメントを出して、処理中ということが判る様にします。
    309         * @og.rev 5.1.9.0 (2010/08/01) DB非依存の定義・データの読み込み対応
    310         * @og.rev 5.5.4.4 (2012/07/20) FS , APP_BASE , DBNAME を、共通に設定
    311         * @og.rev 5.6.7.0 (2013/07/27) アプリケーション登録用とリソース登録用のコネクションを分ける
    312         *
    313         * @param       type    更新タイプ[EXEC_TYPE.INSTALL/EXEC_TYPE.UPDATE]
    314         * @param       context コンテキスト名
    315         */
    316        private void loadXMLScript( final EXEC_TYPE type, final String context ) {
    317                // DB名からスクリプトを格納しているフォルダを探します。
    318                String scriptBase = APP_BASE + context.toLowerCase( Locale.JAPAN ) + FS + "db";
    319                File[] dbDir = new File( scriptBase ).listFiles();
    320                if( dbDir == null || dbDir.length == 0 ) {
    321                        out.println( "             DB Folder not found. [" + scriptBase + "]"  );
    322                        return;
    323                }
    324
    325                String scriptPath = null;
    326                for ( int i = 0; i < dbDir.length; i++ ) {
    327                        if ( DBNAME.indexOf( dbDir[i].getName() ) >= 0 ) {
    328                                scriptPath = dbDir[i].getAbsolutePath();
    329                                break;
    330                        }
    331                }
    332                if( scriptPath == null ) {
    333                        out.println( "             !!! Script Folder for [ " + DBNAME + " ] not found !!!" );
    334                        return;
    335                }
    336
    337                // webapps/[CONTEXT]/db/[DBNAME]/
    338                execScripts( type , scriptPath , defConn );             // 5.6.7.0 (2013/07/27) DBID=DEFAULT に登録
    339
    340                // 5.1.9.0 (2010/08/01) DB非依存の定義・データの読み込み対応
    341                // webapps/[CONTEXT]/db/common/
    342                execScripts( type , scriptBase + FS + "common" , defConn );             // 5.6.7.0 (2013/07/27) DBID=DEFAULT に登録
    343
    344                // 5.6.7.0 (2013/07/27) DBID=RESOURCE に登録
    345                // webapps/[CONTEXT]/db/resource/
    346                execScripts( type , scriptBase + FS + "resource" , rscConn );   // 5.6.7.0 (2013/07/27) DBID=RESOURCE に登録
    347        }
    348
    349        /**
    350         * XMLファイルで定義されたDBスクリプトを実行します。
    351         *
    352         * 引数のtypeに応じて、処理するフォルダが異なります。
    353         *   type=INSTALL の場合は、[scriptPath]/xml/install と、[scriptPath]/xml/update 以下の xml ファイル
    354         *   type=それ以外の場合は、[scriptPath]/xml/update 以下の xml ファイル
    355         * です。
    356         *
    357         * 現時点では、scriptPath には、下記の ３種類のアドレスが渡され、それぞれ、登録するコネクションが異なります。
    358         *   webapps/[CONTEXT]/db/[DBNAME]/                     DBID=DEFAULT
    359         *   webapps/[CONTEXT]/db/common/                       DBID=DEFAULT
    360         *   webapps/[CONTEXT]/db/resource/                     DBID=RESOURCE
    361         *
    362         * @og.rev 5.1.9.0 (2010/08/01) 新規作成
    363         * @og.rev 5.5.4.4 (2012/07/20) FS , APP_BASE を、共通に設定
    364         * @og.rev 5.5.8.4 (2012/11/22) firebird対応。フォルダ単位commitを行う
    365         * @og.rev 5.6.7.0 (2013/07/27) Connection引数追加。リソースとアプリを切り分ける。
    366         * @og.rev 5.6.9.2 (2013/10/18) EXEC_SQL のエラー時に Exception を発行しない。
    367         *
    368         * @param       type            更新タイプ[EXEC_TYPE.INSTALL/EXEC_TYPE.UPDATE]
    369         * @param       scriptPath      XMLファイルのあるパス
    370         * @param       conn            コネクションオブジェクト
    371         */
    372        private void execScripts( final EXEC_TYPE type, final String scriptPath, final Connection conn ) {
    373                // webapps/[CONTEXT]/db/[DBNAME]/xml/(install|update) 内のスクリプトを実行します
    374                List<String> list = new ArrayList<String>();
    375
    376                if( type == EXEC_TYPE.INSTALL ) {
    377                        FileUtil.getFileList( new File( scriptPath  + FS + "xml" + FS + "install" ), true, list );
    378                        FileUtil.getFileList( new File( scriptPath  + FS + "xml" + FS + "update"  ), true, list );
    379                }
    380                else {
    381                        FileUtil.getFileList( new File( scriptPath  + FS + "xml" + FS + "update"  ), true, list );
    382
    383                        /*******************************************************************************
    384                         * updateの場合に、更新前のバージョンからの変更スクリプトを実行する機能が必要
    385                         *******************************************************************************/
    386                }
    387
    388                if( ! list.isEmpty() ) {
    389                        String dir1 = null;             // 5.1.1.0 (2009/12/01)
    390                        for ( String name : list ) {
    391                                if( name.endsWith( ".xml" ) ) {         // 5.0.0.2 (2009/09/15)
    392                                        File xml = new File( name );
    393                                        // 5.1.1.0 (2009/12/01) 処理中コメント：フォルダ単位に表示
    394                                        String dir2 = xml.getParent();
    395                                        if( dir1 == null || !dir1.equalsIgnoreCase( dir2 ) ) {
    396                                                out.println( "            processing ... " + dir2 );
    397                                                dir1 = dir2;
    398                                                Closer.commit( conn );                  // 5.6.7.0 (2013/07/27) Connection引数追加
    399                                        }
    400
    401                                        Reader reader = new BufferedReader( FileUtil.getBufferedReader( xml, "UTF-8" ) );
    402                                        HybsXMLSave save = new HybsXMLSave( conn, xml.getName() );                      // 5.6.7.0 (2013/07/27) Connection引数追加
    403                                        save.onExecErrException( false );               // 5.6.9.2 (2013/10/18) EXEC_SQL のエラー時に Exception を発行しない。
    404                                        save.insertXML( reader );
    405                                }
    406                        }
    407                        Closer.commit( conn );                  // 5.6.7.0 (2013/07/27) メソッド内でコミット処理を行う。
    408                        out.println( "            DB Enviroment " + type + "ed , [ " + list.size() + " ] scripts loaded " );
    409                }
    410        }
    411
    412        /**
    413         * 最後に起動された際のバージョン番号を取得します。(システムID='**')
    414         *
    415         * エンジンがまだインストールされていない等の原因でエラーが発生した場合は、
    416         * "none"という文字列を返します。
    417         *
    418         * @og.rev 5.1.1.0 (2009/12/01) 実行エラー時に、rollback を追加(PostgreSQL対応)
    419         * @og.rev 5.6.7.0 (2013/07/27) リソース用コネクションから取り出します。
    420         * @og.rev 5.7.2.0 (2014/01/10) テーブルが無いのに正常終了するケースがある為、ver の初期値を "none" にしておきます。
    421         *
    422         * @return      バージョン番号
    423         */
    424        private String getOldMaxVersion() {
    425                // エンジンパラメータのエンジン情報(バージョン番号 + ビルドタイプ)を取得します。
    426                Statement                       stmt            = null;
    427                ResultSet                       resultSet       = null;
    428                String                          ver             = "none";                               // 5.7.2.0 (2014/01/10) 初期値を null ⇒ "none" へ変更。
    429                try {
    430                        stmt = rscConn.createStatement();                                       // 5.6.7.0 (2013/07/27)
    431                        resultSet = stmt.executeQuery( SEL_MAX_ENG );
    432                        while( resultSet.next() ) {
    433                                ver = resultSet.getString(1);
    434                        }
    435                }
    436                catch( SQLException ex ) {
    437                        Closer.rollback( rscConn );                     // 5.6.7.0 (2013/07/27)
    438                }
    439                finally {
    440                        Closer.resultClose( resultSet );
    441                        Closer.stmtClose( stmt );
    442                }
    443                return ver;
    444        }
    445
    446        /**
    447         * 最後に起動された際のバージョン番号を取得します。(システムID=各システム)
    448         *
    449         * @og.rev 5.1.1.0 (2009/12/01) 実行エラー時に、rollback を追加(PostgreSQL対応)
    450         * @og.rev 5.6.7.0 (2013/07/27) リソース用コネクションから取り出します。
    451         *
    452         * @param       systemId        システムID
    453         * @param       hostUrl         ホストURL
    454         *
    455         * @return      バージョン番号
    456         */
    457        private String getOldSystemVersion( final String systemId, final String hostUrl ) {
    458                // エンジンパラメータのエンジン情報(バージョン番号 + ビルドタイプ)を取得します。
    459                PreparedStatement       pstmt           = null;
    460                ResultSet                       resultSet       = null;
    461                String                          ver             = null;
    462                try {
    463                        pstmt = rscConn.prepareStatement( SEL_SYS_ENG );                // 5.6.7.0 (2013/07/27)
    464                        pstmt.setString( 1, systemId );
    465                        pstmt.setString( 2, hostUrl );
    466                        resultSet = pstmt.executeQuery();
    467                        while( resultSet.next() ) {
    468                                ver = resultSet.getString(1);
    469                        }
    470                }
    471                catch( SQLException ex ) {
    472                        Closer.rollback( rscConn );                     // 5.6.7.0 (2013/07/27)
    473                }
    474                finally {
    475                        Closer.resultClose( resultSet );
    476                        Closer.stmtClose( pstmt );
    477                }
    478                return ver;
    479        }
    480
    481        /**
    482         * エンジン内部定義の初期リソース情報をDB(GE12)に登録します。
    483         *
    484         * 初期リソース情報は、KBSAKU='0' で登録されている情報で、一旦すべて削除
    485         * してから、全てのリソース情報を追加するという形をとります。
    486         * リソースは、すでに、Oracle XDK により XMLファイル化してあります。
    487         * なお、この情報をDB登録する理由は、リソースの設定値を変えたい場合に、
    488         * キーが判らない(JavaDOCからしか読み取れない)のでは不便な為に
    489         * 用意しておくだけで、内部では SystemData オブジェクトとして定義
    490         * されている値を使用するため、このデータベース値は、使用していません。
    491         *
    492         * @og.rev 4.3.6.6 (2009/05/15) バージョン判定部分を分離
    493         * @og.rev 5.6.7.0 (2013/07/27) リソース用コネクションに登録します。
    494         * @og.rev 5.6.9.2 (2013/10/18) EXEC_SQL のエラー時に Exception を発行しない。
    495         *
    496         * @throws UnsupportedEncodingException エンコード名 "UTF-8" が存在しなかった場合。
    497         */
    498        private void dbXMLResourceInsert() throws UnsupportedEncodingException {
    499                // 新設定値を全件INSERTします。
    500                // common フォルダにセットして、ClassLoader で読み取る方法
    501                ClassLoader loader = Thread.currentThread().getContextClassLoader();
    502                InputStream stream = loader.getResourceAsStream( GE12_XML );
    503
    504                Reader reader = new BufferedReader( new InputStreamReader( stream,"UTF-8" ) );
    505                HybsXMLSave save = new HybsXMLSave( rscConn,"GE12" );                   // 5.6.7.0 (2013/07/27)
    506                save.onExecErrException( false );               // 5.6.9.2 (2013/10/18) EXEC_SQL のエラー時に Exception を発行しない。
    507                save.insertXML( reader );
    508                int insCnt = save.getInsertCount();
    509                int delCnt = save.getDeleteCount();
    510
    511                out.print( "        XML Engine Resource Reconfiguration " );
    512                out.println( "DELETE=[" + delCnt + "],INSERT=[" + insCnt + "] finished." );
    513
    514                // 5.6.7.0 (2013/07/27) コミットをメソッドの中で処理します。
    515                Closer.commit( rscConn );
    516        }
    517}