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    }