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