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             *
434             * @param       type            更新タイプ[EXEC_TYPE.INSTALL/EXEC_TYPE.UPDATE]
435             * @param       scriptPath      XMLファイルã®ã‚るパス
436             * @param       conn            コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚ªãƒ–ジェクãƒ?
437             */
438    //      private void execScripts( final String scriptPath, final String type ) {
439    //      private void execScripts( final EXEC_TYPE type, final String scriptPath ) {
440            private void execScripts( final EXEC_TYPE type, final String scriptPath, final Connection conn ) {
441    //              final String FS       = File.separator ;
442    
443                    // webapps/[CONTEXT]/db/[DBNAME]/xml/(install|update) å†??スクリプトを実行ã—ã¾ã?
444                    List<String> list = new ArrayList<String>();
445    
446    //              if( "install".equalsIgnoreCase( type ) ) {
447                    if( type == EXEC_TYPE.INSTALL ) {
448                            FileUtil.getFileList( new File( scriptPath  + FS + "xml" + FS + "install" ), true, list );
449    //                      FileUtil.getFileList( new File( scriptPath  + FS + "xml" + FS + "update" + FS + "const" ), true, list );
450                            FileUtil.getFileList( new File( scriptPath  + FS + "xml" + FS + "update"  ), true, list );
451                    }
452                    else {
453    //                      FileUtil.getFileList( new File( scriptPath  + FS + "xml" + FS + "update" + FS + "const" ), true, list );
454                            FileUtil.getFileList( new File( scriptPath  + FS + "xml" + FS + "update"  ), true, list );
455    
456                            /*******************************************************************************
457                             * updateã®å ´åˆã«ã€æ›´æ–°å‰ã?ãƒã?ジョンã‹ã‚‰ã®å¤‰æ›´ã‚¹ã‚¯ãƒªãƒ—トを実行ã™ã‚‹æ©Ÿè?ãŒå¿?¦?
458                             *******************************************************************************/
459                    }
460    
461                    if( ! list.isEmpty() ) {
462                            String dir1 = null;             // 5.1.1.0 (2009/12/01)
463                            for ( String name : list ) {
464                                    if( name.endsWith( ".xml" ) ) {         // 5.0.0.2 (2009/09/15)
465                                            File xml = new File( name );
466                                            // 5.1.1.0 (2009/12/01) 処ç?¸­ã‚³ãƒ¡ãƒ³ãƒˆï¼šãƒ•ォルãƒ?˜ä½ã«è¡¨ç¤º
467                                            String dir2 = xml.getParent();
468                                            if( dir1 == null || !dir1.equalsIgnoreCase( dir2 ) ) {
469                                                    out.println( "            processing ... " + dir2 );
470                                                    dir1 = dir2;
471    //                                              Closer.commit( connection );    // 5.5.8.4 (2012/11/22)
472                                                    Closer.commit( conn );                  // 5.6.7.0 (2013/07/27) Connection引数追�
473                                            }
474    
475                                            Reader reader = new BufferedReader( FileUtil.getBufferedReader( xml, "UTF-8" ) );
476    //                                      HybsXMLSave save = new HybsXMLSave( connection, xml.getName() );
477                                            HybsXMLSave save = new HybsXMLSave( conn, xml.getName() );                      // 5.6.7.0 (2013/07/27) Connection引数追�
478                                            save.insertXML( reader );
479                                    }
480                            }
481                            Closer.commit( conn );                  // 5.6.7.0 (2013/07/27) メソãƒ?ƒ‰å†?§ã‚³ãƒŸãƒƒãƒˆå?ç?‚’行ã†ã€?
482                            out.println( "            DB Enviroment " + type + "ed , [ " + list.size() + " ] scripts loaded " );
483                    }
484            }
485    
486            /**
487             * æœ?¾Œã«èµ·å‹•ã•れãŸéš›ã?ãƒã?ジョン番å·ã‚’å–å¾—ã—ã¾ã™ã?(シスãƒ?ƒ ID='**')
488             *
489             * エンジンãŒã¾ã?‚¤ãƒ³ã‚¹ãƒˆã?ルã•れã¦ã?ªã?­‰ã?原因ã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå?åˆã?ã€?
490             * "none"ã¨ã?†æ–?­—å?ã‚’è¿”ã—ã¾ã™ã?
491             *
492             * @og.rev 5.1.1.0 (2009/12/01) 実行エラー時ã«ã€rollback を追åŠ?PostgreSQL対å¿?
493             * @og.rev 5.6.7.0 (2013/07/27) リソース用コãƒã‚¯ã‚·ãƒ§ãƒ³ã‹ã‚‰å–り出ã—ã¾ã™ã?
494             *
495             * @return      ãƒã?ジョン番å·
496             */
497            private String getOldMaxVersion() {
498                    // エンジンパラメータã®ã‚¨ãƒ³ã‚¸ãƒ³æƒ??(ãƒã?ã‚¸ãƒ§ãƒ³ç•ªå· + ビルドタイãƒ?ã‚’å–å¾—ã—ã¾ã™ã?
499                    Statement                       stmt            = null;
500                    ResultSet                       resultSet       = null;
501                    String                          ver             = null;
502                    try {
503    //                      stmt = connection.createStatement();
504                            stmt = rscConn.createStatement();                                       // 5.6.7.0 (2013/07/27)
505                            resultSet = stmt.executeQuery( SEL_MAX_ENG );
506                            while( resultSet.next() ) {
507                                    ver = resultSet.getString(1);
508                            }
509                    }
510                    catch( SQLException ex ) {
511                            ver = "none";
512    //                      Closer.rollback( connection );          // 5.1.1.0 (2009/12/01)
513                            Closer.rollback( rscConn );                     // 5.6.7.0 (2013/07/27)
514                    }
515                    finally {
516                            Closer.resultClose( resultSet );
517                            Closer.stmtClose( stmt );
518                    }
519                    return ver;
520            }
521    
522            /**
523             * æœ?¾Œã«èµ·å‹•ã•れãŸéš›ã?ãƒã?ジョン番å·ã‚’å–å¾—ã—ã¾ã™ã?(シスãƒ?ƒ ID=å?‚·ã‚¹ãƒ?ƒ )
524             *
525             * @og.rev 5.1.1.0 (2009/12/01) 実行エラー時ã«ã€rollback を追åŠ?PostgreSQL対å¿?
526             * @og.rev 5.6.7.0 (2013/07/27) リソース用コãƒã‚¯ã‚·ãƒ§ãƒ³ã‹ã‚‰å–り出ã—ã¾ã™ã?
527             *
528             * @param       systemId        シスãƒ?ƒ ID
529             * @param       hostUrl         ホス�RL
530             *
531             * @return      ãƒã?ジョン番å·
532             */
533            private String getOldSystemVersion( final String systemId, final String hostUrl ) {
534                    // エンジンパラメータã®ã‚¨ãƒ³ã‚¸ãƒ³æƒ??(ãƒã?ã‚¸ãƒ§ãƒ³ç•ªå· + ビルドタイãƒ?ã‚’å–å¾—ã—ã¾ã™ã?
535                    PreparedStatement       pstmt           = null;
536                    ResultSet                       resultSet       = null;
537                    String                          ver             = null;
538                    try {
539    //                      pstmt = connection.prepareStatement( SEL_SYS_ENG );
540                            pstmt = rscConn.prepareStatement( SEL_SYS_ENG );                // 5.6.7.0 (2013/07/27)
541                            pstmt.setString( 1, systemId );
542                            pstmt.setString( 2, hostUrl );
543                            resultSet = pstmt.executeQuery();
544                            while( resultSet.next() ) {
545                                    ver = resultSet.getString(1);
546                            }
547                    }
548                    catch( SQLException ex ) {
549    //                      Closer.rollback( connection );          // 5.1.1.0 (2009/12/01)
550                            Closer.rollback( rscConn );                     // 5.6.7.0 (2013/07/27)
551                    }
552                    finally {
553                            Closer.resultClose( resultSet );
554                            Closer.stmtClose( pstmt );
555                    }
556                    return ver;
557            }
558    
559            /**
560             * エンジンå†?ƒ¨å®šç¾©ã®åˆæœŸãƒªã‚½ãƒ¼ã‚¹æƒ??ã‚’DB(GE12)ã«ç™»éŒ²ã—ã¾ã™ã?
561             *
562             * åˆæœŸãƒªã‚½ãƒ¼ã‚¹æƒ??ã¯ã€KBSAKU='0' ã§ç™»éŒ²ã•れã¦ã?‚‹æƒ??ã§ã€ä¸?—¦ã™ã¹ã¦å‰Šé™¤
563             * ã—ã¦ã‹ã‚‰ã€å?ã¦ã®ãƒªã‚½ãƒ¼ã‚¹æƒ??を追åŠ?™ã‚‹ã¨ã?†å½¢ã‚’ã¨ã‚Šã¾ã™ã?
564             * リソースã¯ã€ã™ã§ã«ã€Oracle XDK ã«ã‚ˆã‚Š XMLファイル化ã—ã¦ã‚りã¾ã™ã?
565             * ãªãŠã?ã“ã?æƒ??ã‚’DB登録ã™ã‚‹ç?”±ã¯ã€ãƒªã‚½ãƒ¼ã‚¹ã®è¨­å®šå?を変ãˆãŸã„å ´åˆã«ã€?
566             * キーãŒåˆ¤ã‚‰ãªã?JavaDOCã‹ã‚‰ã—ã‹èª­ã¿å–れãªã?ã®ã§ã¯ä¸ä¾¿ãªç‚ºã«
567             * 用æ„ã—ã¦ãŠãã?‘ã§ã€å?部ã§ã¯ SystemData オブジェクトã¨ã—ã¦å®šç¾©
568             * ã•れã¦ã?‚‹å€¤ã‚’使用ã™ã‚‹ãŸã‚ã€ã“ã®ãƒ??タベã?ス値ã¯ã€ä½¿ç”¨ã—ã¦ã?¾ã›ã‚“ã€?
569             *
570             * @og.rev 4.3.6.6 (2009/05/15) ãƒã?ジョン判定部åˆ?‚’åˆ?›¢
571             * @og.rev 5.6.7.0 (2013/07/27) リソース用コãƒã‚¯ã‚·ãƒ§ãƒ³ã«ç™»éŒ²ã—ã¾ã™ã?
572             */
573            private void dbXMLResourceInsert() throws UnsupportedEncodingException {
574                    // 新設定å?ã‚’å?ä»¶INSERTã—ã¾ã™ã?
575                    // common フォルãƒ?«ã‚»ãƒ?ƒˆã—ã¦ã€ClassLoader ã§èª­ã¿å–ã‚‹æ–¹æ³?
576                    ClassLoader loader = Thread.currentThread().getContextClassLoader();
577                    InputStream stream = loader.getResourceAsStream( GE12_XML );
578    
579                    Reader reader = new BufferedReader( new InputStreamReader( stream,"UTF-8" ) );
580    //              HybsXMLSave save = new HybsXMLSave( connection,"GE12" );
581                    HybsXMLSave save = new HybsXMLSave( rscConn,"GE12" );                   // 5.6.7.0 (2013/07/27)
582                    save.insertXML( reader );
583                    int insCnt = save.getInsertCount();
584                    int delCnt = save.getDeleteCount();
585    
586                    out.print( "        XML Engine Resource Reconfiguration " );
587                    out.println( "DELETE=[" + delCnt + "],INSERT=[" + insCnt + "] finished." );
588    
589                    // 5.6.7.0 (2013/07/27) コミットをメソãƒ?ƒ‰ã®ä¸­ã§å‡¦ç?—ã¾ã™ã?
590                    Closer.commit( rscConn );
591            }
592    }