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