001    /*
002     * Copyright (c) 2009 The openGion Project.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013     * either express or implied. See the License for the specific language
014     * governing permissions and limitations under the License.
015     */
016    package org.opengion.hayabusa.common;
017    
018    import java.io.BufferedReader;
019    import java.io.File;
020    import java.io.InputStream;
021    import java.io.InputStreamReader;
022    import java.io.PrintWriter;
023    import java.io.Reader;
024    import java.io.UnsupportedEncodingException;
025    import java.sql.Connection;
026    import java.sql.PreparedStatement;
027    import java.sql.ResultSet;
028    import java.sql.SQLException;
029    import java.sql.Statement;
030    import java.util.ArrayList;
031    import java.util.List;
032    import java.util.Locale;
033    
034    import org.opengion.fukurou.util.Closer;
035    import org.opengion.fukurou.util.FileUtil;
036    import org.opengion.fukurou.util.StringUtil;
037    import org.opengion.fukurou.util.ZipFileUtil;
038    import org.opengion.fukurou.xml.HybsXMLSave;
039    import org.opengion.fukurou.db.DBUtil;
040    
041    /**
042     * シスãƒ?ƒ の自動インストã?ルと自動更新を行いますã?
043     *
044     * (1)初期インストã?ル・自動更新(#autoInsUpd)
045     *   â‘??期è?動インストã?ルを行うには、起動時の環å¢?¤‰数にINSTALL_CONTEXTSã�?
046     *     設定されてã�?‚‹å¿?¦�がありますã?
047     *     こã?環å¢?¤‰数が設定されてã�?‚‹場合ã?シスãƒ?ƒ リソースãƒ??ブル(GE12)が存在しなければã€?
048     *     エンジンがインストã?ルされてã�?�ªã�?�¨判断しã?自動インストã?ルを行いますã?
049     *     INSTALL_CONTEXTSにge,gfが指定されてã�?‚‹場合ã?ã€?–‹発環å¢?‚’含めたフルバã?ジョンã�?
050     *     インストã?ルされますã?
051     *     geのみが指定されてã�?‚‹場合ã?、コアモジュールであるgeのみがインストã?ルされますã?
052     *
053     *     インストã?ルスクリプトはã€?
054     *      webapps/[CONTEXT]/db/[DBNAME]/xml/install                       DBID=DEFAULT
055     *      <del>webapps/[CONTEXT]/db/[DBNAME]/xml/update/const (5.6.7.0 (2013/07/27))</del>
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     *      <del>webapps/[CONTEXT]/db/[DBNAME]/xml/update/const (5.6.7.0 (2013/07/27))</del>
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.group 初期åŒ?
101     *
102     * @version  4.0
103     * @author   Hiroki Nakamura
104     * @since    JDK5.0,
105     */
106    public final class SystemInstaller {
107    //      private final String VERSION;                   // 5.5.4.4 (2012/07/20) VERSION は、直接 BuildNumber.ENGINE_INFO を使用ã€?
108    //      private final Connection connection;
109            private final Connection defConn;               // 5.6.7.0 (2013/07/27) DBID=DEFAULT  のコネクション
110            private final Connection rscConn;               // 5.6.7.0 (2013/07/27) DBID=RESOURCE のコネクション
111            private final PrintWriter out;                  // 5.1.9.0 (2010/08/01)
112            private final String DBNAME;                    // 5.5.4.4 (2012/07/20) 共通化 (DBID=DEFAULT のDBå�?
113    
114            /** エンジン共通パラメータ(SYSTEM_ID='**' KBSAKU='0')のXML ファイルのæŒ?®?{@value} */
115            public static final String GE12_XML = "org/opengion/hayabusa/common/GE12.xml";
116    
117            /** エンジン共通パラメータ(SYSTEM_ID='**' KBSAKU='0')のENGINE_INFO 読み取りクエリー       {@value}        */
118            public static final String SEL_MAX_ENG = "select PARAM from GE12"
119                                                                            + " where SYSTEM_ID='**' and PARAM_ID='ENGINE_INFO'"
120                                                                            + " and FGJ='1' and KBSAKU='0'" ;
121    
122            /** エンジン個別(SYSTEM_ID='個別' KBSAKU='0'  CONTXT_PATH='自身')のバã?ジョンæƒ??を取得するクエリーー{@value} 4.3.6.6 (2009/05/15) */
123            public static final String SEL_SYS_ENG = "select PARAM from GE12"
124                                                                            + " where SYSTEM_ID=? and PARAM_ID='ENGINE_INFO' and KBSAKU='0' and CONTXT_PATH=? 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    
129    
130            /**
131             * ãƒ??タベã?ス処ç�?‚’おこなã�?�«当たりã?処ç�??タイプをæŒ?®šするためã?、enum 定義ですã?
132             * æ–?­—å?で扱ってã�?�Ÿç®?‰€をã?enum と置き換えますã?
133             *
134             * @og.rev 5.5.4.4 (2012/07/20) 新規追åŠ?
135             */
136            private static enum EXEC_TYPE { INSTALL , UPDATE } ;
137    
138            /**
139             * シスãƒ?ƒ インストã?ル・更新クラスのコンストラクタでã�?
140             *
141             * なおã?こã?クラスの中の処ç�?�§、エラーが発生してもã?Connection は、close 等しませんã€?
142             * 呼び出しå?で、try ??finally で、å?ç�?�—てくださいã€?
143             *
144             * @og.rev 5.5.4.4 (2012/07/20) VERSIONは、直接 BuildNumber.ENGINE_INFO を使用ã€?
145             * @og.rev 5.6.7.0 (2013/07/27) アプリケーション登録用とリソース登録用のコネクションをå?ける
146             *
147             * @param       defConn アプリケーション登録用コネクション
148             * @param       rscConn リソース登録用コネクション
149             * @param       out     表示用のWriter
150             */
151    //      public SystemInstaller( final Connection conn, final PrintWriter out ) {
152            public SystemInstaller( final Connection defConn, final Connection rscConn, final PrintWriter out ) {
153    //              connection = conn;
154                    this.defConn = defConn;                 // 5.6.7.0 (2013/07/27) アプリケーション登録用
155                    this.rscConn = rscConn;                 // 5.6.7.0 (2013/07/27) リソース登録用
156                    this.out = out;
157    
158    //              VERSION = BuildNumber.ENGINE_INFO;
159    
160                    // 5.6.7.0 (2013/07/27) ProductName は、DBUtil 経由で取得するã?
161    //              String dbName ;
162    //              try {
163    //                      dbName = connection.getMetaData().getDatabaseProductName().toLowerCase( Locale.JAPAN );
164    //              }
165    //              catch( SQLException ex ) {
166    //                      out.println( "        -> DatabaseProductName is NONE " + ex.getMessage() );
167    //                      dbName = "none";
168    //              }
169    //              DBNAME = dbName;
170    
171                    DBNAME = DBUtil.getProductName( defConn );              // 5.6.7.0 (2013/07/27) DBID=DEFAULT  のDBå�?
172            }
173    
174            /**
175             * シスãƒ?ƒ の初期自動インストã?ル・自動更新を行いますã?
176             *
177             * 詳細は、クラスドキュメントを参ç?して下さã�??
178             *
179             * @og.rev 5.1.9.0 (2010/08/01) 新規作æ?
180             * @og.rev 5.5.4.4 (2012/07/20) VERSIONは、直接 BuildNumber.ENGINE_INFO を使用ã€?
181             *
182             * @param systemId シスãƒ?ƒ ID
183             * @param context コンãƒ?‚­スト名
184             * @param hostUrl ホスト文字å?
185             * @throws SQLException
186             * @throws UnsupportedEncodingException
187             */
188    //      public void autoInsUpd( final String systemId, final String context, final String hostUrl ) throws SQLException, UnsupportedEncodingException  {
189            public void autoInsUpd( final String systemId, final String context, final String hostUrl ) throws UnsupportedEncodingException  {
190                    String oldMaxVersion = getOldMaxVersion();
191                    String oldSystemVersion = getOldSystemVersion( systemId, hostUrl );
192    
193                    out.println( "    System Version Information ( " + systemId + " )" );
194    //              out.println( "      Load Version [ " + VERSION + " ]" );
195                    out.println( "      Load Version [ " + BuildNumber.ENGINE_INFO + " ]" );                // 5.5.4.4 (2012/07/20)
196                    out.println( "        -> Resource Version[ " + oldMaxVersion + " ]" );
197                    out.println( "        -> System   Version[ " + oldSystemVersion + " ]" );
198    
199                    // 初期自動インストã?ル
200                    if( "none".equalsIgnoreCase( oldMaxVersion ) ) {
201                            out.println( "      !!! openGion ENVIROMENT IS NOT INSTALLED !!!" );
202    
203                            String INSTALL_CONTEXTS = System.getenv( "INSTALL_CONTEXTS" );
204                            if( INSTALL_CONTEXTS == null || INSTALL_CONTEXTS.length() == 0 ) {
205                                    out.println( "        !!! \"INSTALL_CONTEXT\" IS NOT CONFIGURED\" !!!" );
206                                    out.println( "        !!! \"SET ENRIVOMENT PARAMETER NAMED \"INSTALL_CONTEXT\" ON INIT_SCRIPT !!!" );
207                                    return;
208                            }
209                            out.println( "      Start Initiall Enviroment Install : install type ( " + INSTALL_CONTEXTS + " )" );
210                            String[] insSys = StringUtil.csv2Array( INSTALL_CONTEXTS );
211                            for( int i=0; i<insSys.length; i++ ) {
212                                    out.println( "        install    ( " + insSys[i] + " )" );
213    //                              loadXMLScript( "install", insSys[i] );
214                                    loadXMLScript( EXEC_TYPE.INSTALL, insSys[i] );
215    //                              connection.commit();
216    //                              Closer.commit( connection );                            // 5.5.4.4 (2012/07/20) commit で、SQLException を発生させなã�??
217                                    out.println( "        completed  ( " + insSys[i] + " )" );
218                            }
219    
220                            out.println( "      Start SystemParameter reload" );
221                            dbXMLResourceInsert();
222    //                      connection.commit();
223    //                      Closer.commit( connection );                            // 5.5.4.4 (2012/07/20) commit で、SQLException を発生させなã�??
224                            out.println( "      completed" );
225                    }
226                    // 自動更新
227                    else {
228    //                      if ( oldSystemVersion == null || oldSystemVersion.compareTo( VERSION ) < 0 ){
229                            if ( oldSystemVersion == null || oldSystemVersion.compareTo( BuildNumber.ENGINE_INFO ) < 0 ){                // 5.5.4.4 (2012/07/20)
230                                    out.println( "      Start Enviroment Update ( " + context + " )" );
231    //                              loadXMLScript( "update", context );
232                                    loadXMLScript( EXEC_TYPE.UPDATE , context );
233    //                              connection.commit();
234    //                              Closer.commit( connection );                            // 5.5.4.4 (2012/07/20) commit で、SQLException を発生させなã�??
235                                    out.println( "      completed               ( " + context + " )" );
236                            }
237    
238    //                      if( oldMaxVersion == null || oldMaxVersion.compareTo( VERSION ) < 0 ){
239                            if( oldMaxVersion == null || oldMaxVersion.compareTo( BuildNumber.ENGINE_INFO ) < 0 ){                               // 5.5.4.4 (2012/07/20)
240                                    out.println( "      Start SystemParameter Reload" );
241                                    dbXMLResourceInsert();
242    //                              connection.commit();
243    //                              Closer.commit( connection );                            // 5.5.4.4 (2012/07/20) commit で、SQLException を発生させなã�??
244                                    out.println( "      completed" );
245                            }
246                    }
247            }
248    
249            /**
250             * シスãƒ?ƒ の自動インストã?ルを行いますã?
251             *
252             * 詳細は、クラスドキュメントを参ç?して下さã�??
253             *
254             * @og.rev 5.1.9.0 (2010/08/01) 新規作æ?
255             * @og.rev 5.5.4.4 (2012/07/20) FS , APP_BASE をã?共通に設å®?
256             *
257             * @param buildArchive コンãƒ?‚­ストã?アーカイブファイル
258             * @throws SQLException
259             */
260    //      public void install( final File buildArchive ) throws SQLException {
261            public void install( final File buildArchive ) {
262    //              final String FS       = File.separator ;
263    //              final String tempDir  = HybsSystem.sys( "REAL_PATH" ) + HybsSystem.sys( "FILE_URL" ) + String.valueOf( System.currentTimeMillis() + FS );
264                    final String tempDir  = HybsSystem.sys( "REAL_PATH" ) + HybsSystem.sys( "FILE_URL" ) + System.currentTimeMillis() + FS;
265                    final String ctxtXmlDir = System.getenv( "CATALINA_HOME" ) + FS + "conf" + FS + System.getenv( "ENGINE_NAME" ) + FS + "localhost" + FS;
266    //              final String appBase  = System.getenv( "APP_BASE" ) + FS;               // 5.5.4.4 (2012/07/20) APP_BASE をå?通に設å®?
267    
268                    out.println( "      Check Archive File and Enviroment" );
269    
270                    // アーカイブã?存在チェãƒ?‚¯
271                    if( !buildArchive.exists() ) {
272                            out.println( "        !!! Archive File does not exists File=[ " + buildArchive.getAbsolutePath() + "] !!!" );
273                            out.println( "        !!! Install Aborted !!! " );
274                            return;
275                    }
276    
277                    // アーカイブをä¸?™‚ファイルに展開しますã?
278                    ZipFileUtil.unCompress( tempDir, buildArchive.getAbsolutePath() );
279    
280                    // アーカイブã?å†?®¹チェãƒ?‚¯
281                    File[] ctxts = new File( tempDir ).listFiles();
282                    for( File ctxt : ctxts ) {
283                            // 5.1.9.0 (2010/08/01) if の条件をå?れ替えますã?(Avoid if (x != y) ..; else ..;)
284                            String context = ctxt.getName();
285                            if( ctxt.isDirectory() ) {
286    //                              String context = ctxt.getName();
287    
288                                    // アーカイブ中に[CONTEXT].xmlが存在してã�?�ªã�??合ã?エラー(何も処ç�?�—なã�?
289                                    File srcCtxtXml = new File( tempDir + context + FS + "WEB-INF" + FS + context + ".xml" );
290                                    if( !srcCtxtXml.exists() ) {
291                                            out.println( "        !!! Context XML Does not exists =[ " + srcCtxtXml.getAbsolutePath() + "] !!!" );
292                                            out.println( "        !!! Install Aborted !!! " );
293                                            return;
294                                    }
295    
296                                    // [CONTEXT].xmlが既に存在してã�?‚‹場合ã?エラー(何も処ç�?�—なã�?
297                                    File ctxtXml = new File(  ctxtXmlDir + context + ".xml" );
298                                    if( ctxtXml.exists() ) {
299                                            out.println( "        !!! Context XML File Already Installed File=[ " + ctxtXml.getAbsolutePath() + "] !!!" );
300                                            out.println( "        !!! Install Aborted !!! " );
301                                            return;
302                                    }
303    
304                                    // webapps/[CONTEXT]が既に存在してã�?‚‹場合ã?エラー(何も処ç�?�—なã�?
305    //                              File webAppsDir = new File( appBase + context );                // 5.5.4.4 (2012/07/20) APP_BASE をå?通に設å®?
306                                    File webAppsDir = new File( APP_BASE + context );
307                                    if( webAppsDir.exists() ) {
308                                            out.println( "        !!! Context Path Already Exists Path=[ " + webAppsDir.getAbsolutePath() + "] !!!" );
309                                            out.println( "        !!! Install Aborted !!! " );
310                                            return;
311                                    }
312    
313    //                              out.println( "        This Archive includes SYSTEM ( " + ctxt.getName() + " ) for Install" );
314                                    out.println( "        This Archive includes SYSTEM ( " + context + " ) for Install" );                  // 5.5.4.4 (2012/07/20)
315                            }
316                            // ファイルが含まれてã�?‚‹場合ã?エラー(何も処ç�?�—なã�?
317                            else {
318    //                              out.println( "        !!! This Archive is not Installer. Because include FILE not DIRECTORY. File=[ " + ctxt.getName() + "] !!!" );
319                                    out.println( "        !!! This Archive is not Installer. Because include FILE not DIRECTORY. File=[ " + context + "] !!!" );    // 5.5.4.4 (2012/07/20)
320                                    out.println( "        !!! Install Aborted !!! " );
321                                    return;
322                            }
323                    }
324    
325                    // アーカイブをコンãƒ?‚­ストファイル以下にコピã?
326                    for( File ctxt : ctxts ) {
327                            String context = ctxt.getName();
328                            out.println( "      Start Enviroment Install ( " + context + " )" );
329    
330                            // コンãƒ?‚­ストã?ファイルをコピã?しますã?
331    //                      FileUtil.copyDirectry( tempDir + context, appBase + context );          // 5.5.4.4 (2012/07/20) APP_BASE をå?通に設å®?
332                            FileUtil.copyDirectry( tempDir + context, APP_BASE + context );
333    
334                            // [CONTEXT].xmlをTomcatのconf以下に展開しますã?
335                            FileUtil.copy( tempDir + context + FS + "WEB-INF" + FS + context + ".xml", ctxtXmlDir + context + ".xml" );
336    
337                            // DBスクリプトをロードしますã?
338    //                      loadXMLScript( "install", context );
339                            loadXMLScript( EXEC_TYPE.INSTALL , context );
340    //                      connection.commit();
341    //                      Closer.commit( connection );                            // 5.5.4.4 (2012/07/20) commit で、SQLException を発生させなã�??
342                            out.println( "      completed                ( " + context + " )" );
343                    }
344                    out.println( "      Install Process All Completed." );
345            }
346    
347            /**
348             * インストã?ル、更新用のXMLスクリプトをロードしますã?
349             *
350             * @og.rev 5.0.0.2 (2009/09/15) .xmlファイル以外ã?読み込まなã�?‚ˆã�?�«修正
351             * @og.rev 5.1.1.0 (2009/12/01) コメントを出して、å?ç�?¸­とã�?�†ことが判る様にしますã?
352             * @og.rev 5.1.9.0 (2010/08/01) DB非依存ã?定義・ãƒ??タの読み込み対å¿?
353             * @og.rev 5.5.4.4 (2012/07/20) FS , APP_BASE , DBNAME をã?共通に設å®?
354             * @og.rev 5.6.7.0 (2013/07/27) アプリケーション登録用とリソース登録用のコネクションをå?ける
355             *
356             * @param       type    更新タイプ[EXEC_TYPE.INSTALL/EXEC_TYPE.UPDATE]
357             * @param       context コンãƒ?‚­スト名
358             */
359    //      private void loadXMLScript( final String type, final String context ) throws SQLException {
360            private void loadXMLScript( final EXEC_TYPE type, final String context ) {
361    //              final String FS       = File.separator ;
362    //              final String APP_BASE = System.getenv( "APP_BASE" );            // 5.5.4.4 (2012/07/20) APP_BASE をå?通に設å®?
363    //              final String DBNAME   = connection.getMetaData().getDatabaseProductName().toLowerCase( Locale.JAPAN );
364    
365                    // DB名からスクリプトをæ?納してã�?‚‹フォルãƒ?‚’探しますã?
366    //              String scriptBase = APP_BASE + FS + context.toLowerCase( Locale.JAPAN ) + FS + "db";
367                    String scriptBase = APP_BASE + context.toLowerCase( Locale.JAPAN ) + FS + "db";
368                    File[] dbDir = new File( scriptBase ).listFiles();
369                    if( dbDir == null || dbDir.length == 0 ) {
370                            out.println( "             DB Folder not found. [" + scriptBase + "]"  );
371                            return;
372                    }
373    
374                    String scriptPath = null;
375                    for ( int i = 0; i < dbDir.length; i++ ) {
376                            if ( DBNAME.indexOf( dbDir[i].getName() ) >= 0 ) {
377                                    scriptPath = dbDir[i].getAbsolutePath();
378                                    break;
379                            }
380                    }
381                    if( scriptPath == null ) {
382                            out.println( "             !!! Script Folder for [ " + DBNAME + " ] not found !!!" );
383                            return;
384                    }
385    
386                    // webapps/[CONTEXT]/db/[DBNAME]/
387    //              execScripts( scriptPath, type );
388    //              execScripts( type , scriptPath );                               // 5.5.4.4 (2012/07/20) typeのenum化と、引数のé ?•ªを親に合わすã?
389                    execScripts( type , scriptPath , defConn );             // 5.6.7.0 (2013/07/27) DBID=DEFAULT に登録
390    
391                    // 5.1.9.0 (2010/08/01) DB非依存ã?定義・ãƒ??タの読み込み対å¿?
392                    // webapps/[CONTEXT]/db/common/
393    //              execScripts( scriptBase + FS + "common" + FS, type );
394    //              execScripts( type , scriptBase + FS + "common" );                               // 5.5.4.4 (2012/07/20) typeのenum化と、引数のé ?•ªを親に合わすã?
395                    execScripts( type , scriptBase + FS + "common" , defConn );             // 5.6.7.0 (2013/07/27) DBID=DEFAULT に登録
396    
397                    // 5.6.7.0 (2013/07/27) DBID=RESOURCE に登録
398                    // webapps/[CONTEXT]/db/resource/
399                    execScripts( type , scriptBase + FS + "resource" , rscConn );   // 5.6.7.0 (2013/07/27) DBID=RESOURCE に登録
400    
401    //              // webapps/[CONTEXT]/db/xml å†??スクリプトを実行しまã�?
402    //              File[] dataDir = new File( scriptBase + FS + "xml" ).listFiles();
403    //              if( dataDir != null && dataDir.length > 0 ) {
404    //                      for ( int i=0; i<dataDir.length; i++ ) {
405    //                              String dtNm = dataDir[i].getName() ;
406    //                              if( dtNm.endsWith( ".xml" ) ) {         // 5.0.0.2 (2009/09/15)
407    //                                      Reader reader = new BufferedReader( FileUtil.getBufferedReader( dataDir[i], "UTF-8" ) );
408    //                                      HybsXMLSave save = new HybsXMLSave( connection, dtNm );
409    //                                      save.insertXML( reader );
410    //                              }
411    //                      }
412    //                      out.println( "            DB Data Files Installed , [ " + dataDir.length + " ] files loaded " );
413    //              }
414            }
415    
416            /**
417             * XMLファイルで定義されたDBスクリプトを実行しますã?
418             *
419             * 引数のtypeに応じて、å?ç�?�™るフォルãƒ?�Œ異なりますã?
420             *   type=INSTALL の場合ã?、[scriptPath]/xml/install と、[scriptPath]/xml/update 以下ã? xml ファイル
421             *   type=それ以外ã?場合ã?、[scriptPath]/xml/update 以下ã? xml ファイル
422             * ですã?
423             *
424             * 現時点では、scriptPath には、下記ã? ?“種類ã?アドレスが渡され、それぞれã?登録するコネクションが異なりますã?
425             *   webapps/[CONTEXT]/db/[DBNAME]/                     DBID=DEFAULT
426             *   webapps/[CONTEXT]/db/common/                       DBID=DEFAULT
427             *   webapps/[CONTEXT]/db/resource/                     DBID=RESOURCE
428             *
429             * @og.rev 5.1.9.0 (2010/08/01) 新規作æ?
430             * @og.rev 5.5.4.4 (2012/07/20) FS , APP_BASE をã?共通に設å®?
431             * @og.rev 5.5.8.4 (2012/11/22) firebird対応ã?フォルãƒ?�˜位commitを行う
432             * @og.rev 5.6.7.0 (2013/07/27) Connection引数追åŠ??リソースとアプリをå?りå?けるã€?
433             * @og.rev 5.6.9.2 (2013/10/18) EXEC_SQL のエラー時に Exception を発行しなã�??
434             *
435             * @param       type            更新タイプ[EXEC_TYPE.INSTALL/EXEC_TYPE.UPDATE]
436             * @param       scriptPath      XMLファイルのあるパス
437             * @param       conn            コネクションオブジェクãƒ?
438             */
439    //      private void execScripts( final String scriptPath, final String type ) {
440    //      private void execScripts( final EXEC_TYPE type, final String scriptPath ) {
441            private void execScripts( final EXEC_TYPE type, final String scriptPath, final Connection conn ) {
442    //              final String FS       = File.separator ;
443    
444                    // webapps/[CONTEXT]/db/[DBNAME]/xml/(install|update) å†??スクリプトを実行しまã�?
445                    List<String> list = new ArrayList<String>();
446    
447    //              if( "install".equalsIgnoreCase( type ) ) {
448                    if( type == EXEC_TYPE.INSTALL ) {
449                            FileUtil.getFileList( new File( scriptPath  + FS + "xml" + FS + "install" ), true, list );
450    //                      FileUtil.getFileList( new File( scriptPath  + FS + "xml" + FS + "update" + FS + "const" ), true, list );
451                            FileUtil.getFileList( new File( scriptPath  + FS + "xml" + FS + "update"  ), true, list );
452                    }
453                    else {
454    //                      FileUtil.getFileList( new File( scriptPath  + FS + "xml" + FS + "update" + FS + "const" ), true, list );
455                            FileUtil.getFileList( new File( scriptPath  + FS + "xml" + FS + "update"  ), true, list );
456    
457                            /*******************************************************************************
458                             * updateの場合に、更新前ã?バã?ジョンからの変更スクリプトを実行する機è?がå¿?¦?
459                             *******************************************************************************/
460                    }
461    
462                    if( ! list.isEmpty() ) {
463                            String dir1 = null;             // 5.1.1.0 (2009/12/01)
464                            for ( String name : list ) {
465                                    if( name.endsWith( ".xml" ) ) {         // 5.0.0.2 (2009/09/15)
466                                            File xml = new File( name );
467                                            // 5.1.1.0 (2009/12/01) 処ç�?¸­コメント:フォルãƒ?�˜位に表示
468                                            String dir2 = xml.getParent();
469                                            if( dir1 == null || !dir1.equalsIgnoreCase( dir2 ) ) {
470                                                    out.println( "            processing ... " + dir2 );
471                                                    dir1 = dir2;
472    //                                              Closer.commit( connection );    // 5.5.8.4 (2012/11/22)
473                                                    Closer.commit( conn );                  // 5.6.7.0 (2013/07/27) Connection引数追åŠ?
474                                            }
475    
476                                            Reader reader = new BufferedReader( FileUtil.getBufferedReader( xml, "UTF-8" ) );
477    //                                      HybsXMLSave save = new HybsXMLSave( connection, xml.getName() );
478                                            HybsXMLSave save = new HybsXMLSave( conn, xml.getName() );                      // 5.6.7.0 (2013/07/27) Connection引数追åŠ?
479                                            save.onExecErrException( false );               // 5.6.9.2 (2013/10/18) EXEC_SQL のエラー時に Exception を発行しなã�??
480                                            save.insertXML( reader );
481                                    }
482                            }
483                            Closer.commit( conn );                  // 5.6.7.0 (2013/07/27) メソãƒ?ƒ‰å†?�§コミットå?ç�?‚’行うã€?
484                            out.println( "            DB Enviroment " + type + "ed , [ " + list.size() + " ] scripts loaded " );
485                    }
486            }
487    
488            /**
489             * æœ?¾Œに起動された際ã?バã?ジョン番号を取得しますã?(シスãƒ?ƒ ID='**')
490             *
491             * エンジンがまã�?‚¤ンストã?ルされてã�?�ªã�?­‰ã?原因でエラーが発生したå?合ã?ã€?
492             * "none"とã�?�†æ–?­—å?を返しますã?
493             *
494             * @og.rev 5.1.1.0 (2009/12/01) 実行エラー時に、rollback を追åŠ?PostgreSQL対å¿?
495             * @og.rev 5.6.7.0 (2013/07/27) リソース用コネクションから取り出しますã?
496             *
497             * @return      バã?ジョン番号
498             */
499            private String getOldMaxVersion() {
500                    // エンジンパラメータのエンジンæƒ??(バã?ジョン番号 + ビルドタイãƒ?を取得しますã?
501                    Statement                       stmt            = null;
502                    ResultSet                       resultSet       = null;
503                    String                          ver             = null;
504                    try {
505    //                      stmt = connection.createStatement();
506                            stmt = rscConn.createStatement();                                       // 5.6.7.0 (2013/07/27)
507                            resultSet = stmt.executeQuery( SEL_MAX_ENG );
508                            while( resultSet.next() ) {
509                                    ver = resultSet.getString(1);
510                            }
511                    }
512                    catch( SQLException ex ) {
513                            ver = "none";
514    //                      Closer.rollback( connection );          // 5.1.1.0 (2009/12/01)
515                            Closer.rollback( rscConn );                     // 5.6.7.0 (2013/07/27)
516                    }
517                    finally {
518                            Closer.resultClose( resultSet );
519                            Closer.stmtClose( stmt );
520                    }
521                    return ver;
522            }
523    
524            /**
525             * æœ?¾Œに起動された際ã?バã?ジョン番号を取得しますã?(シスãƒ?ƒ ID=å�?‚·スãƒ?ƒ )
526             *
527             * @og.rev 5.1.1.0 (2009/12/01) 実行エラー時に、rollback を追åŠ?PostgreSQL対å¿?
528             * @og.rev 5.6.7.0 (2013/07/27) リソース用コネクションから取り出しますã?
529             *
530             * @param       systemId        シスãƒ?ƒ ID
531             * @param       hostUrl         ホスãƒ?RL
532             *
533             * @return      バã?ジョン番号
534             */
535            private String getOldSystemVersion( final String systemId, final String hostUrl ) {
536                    // エンジンパラメータのエンジンæƒ??(バã?ジョン番号 + ビルドタイãƒ?を取得しますã?
537                    PreparedStatement       pstmt           = null;
538                    ResultSet                       resultSet       = null;
539                    String                          ver             = null;
540                    try {
541    //                      pstmt = connection.prepareStatement( SEL_SYS_ENG );
542                            pstmt = rscConn.prepareStatement( SEL_SYS_ENG );                // 5.6.7.0 (2013/07/27)
543                            pstmt.setString( 1, systemId );
544                            pstmt.setString( 2, hostUrl );
545                            resultSet = pstmt.executeQuery();
546                            while( resultSet.next() ) {
547                                    ver = resultSet.getString(1);
548                            }
549                    }
550                    catch( SQLException ex ) {
551    //                      Closer.rollback( connection );          // 5.1.1.0 (2009/12/01)
552                            Closer.rollback( rscConn );                     // 5.6.7.0 (2013/07/27)
553                    }
554                    finally {
555                            Closer.resultClose( resultSet );
556                            Closer.stmtClose( pstmt );
557                    }
558                    return ver;
559            }
560    
561            /**
562             * エンジンå†?ƒ¨定義の初期リソースæƒ??をDB(GE12)に登録しますã?
563             *
564             * 初期リソースæƒ??は、KBSAKU='0' で登録されてã�?‚‹æƒ??で、ä¸?—¦すべて削除
565             * してから、å?てのリソースæƒ??を追åŠ?�™るとã�?�†形をとりますã?
566             * リソースは、すでに、Oracle XDK により XMLファイル化してありますã?
567             * なおã?こã?æƒ??をDB登録するç�?”±は、リソースの設定å?を変えたい場合にã€?
568             * キーが判らなã�?JavaDOCからしか読み取れなã�?のでは不便な為に
569             * 用意しておくã�?�‘で、å?部では SystemData オブジェクトとして定義
570             * されてã�?‚‹値を使用するため、このãƒ??タベã?ス値は、使用してã�?�¾せんã€?
571             *
572             * @og.rev 4.3.6.6 (2009/05/15) バã?ジョン判定部åˆ?‚’åˆ?›¢
573             * @og.rev 5.6.7.0 (2013/07/27) リソース用コネクションに登録しますã?
574             * @og.rev 5.6.9.2 (2013/10/18) EXEC_SQL のエラー時に Exception を発行しなã�??
575             */
576            private void dbXMLResourceInsert() throws UnsupportedEncodingException {
577                    // 新設定å?をå?件INSERTしますã?
578                    // common フォルãƒ?�«セãƒ?ƒˆして、ClassLoader で読み取る方æ³?
579                    ClassLoader loader = Thread.currentThread().getContextClassLoader();
580                    InputStream stream = loader.getResourceAsStream( GE12_XML );
581    
582                    Reader reader = new BufferedReader( new InputStreamReader( stream,"UTF-8" ) );
583    //              HybsXMLSave save = new HybsXMLSave( connection,"GE12" );
584                    HybsXMLSave save = new HybsXMLSave( rscConn,"GE12" );                   // 5.6.7.0 (2013/07/27)
585                    save.onExecErrException( false );               // 5.6.9.2 (2013/10/18) EXEC_SQL のエラー時に Exception を発行しなã�??
586                    save.insertXML( reader );
587                    int insCnt = save.getInsertCount();
588                    int delCnt = save.getDeleteCount();
589    
590                    out.print( "        XML Engine Resource Reconfiguration " );
591                    out.println( "DELETE=[" + delCnt + "],INSERT=[" + insCnt + "] finished." );
592    
593                    // 5.6.7.0 (2013/07/27) コミットをメソãƒ?ƒ‰の中で処ç�?�—ますã?
594                    Closer.commit( rscConn );
595            }
596    }