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.taglib;
017    
018    import static org.opengion.fukurou.util.StringUtil.nval;
019    
020    import java.io.File;
021    import java.io.PrintWriter;
022    import java.sql.Connection;
023    import java.sql.SQLException;
024    
025    import org.opengion.fukurou.db.ConnectionFactory;
026    import org.opengion.fukurou.util.StringUtil;
027    import org.opengion.hayabusa.common.HybsSystem;
028    import org.opengion.hayabusa.common.HybsSystemException;
029    import org.opengion.hayabusa.common.SystemInstaller;
030    
031    /**
032     * シスãƒ?ƒ のインストã?ルを行うためのタグですã?
033     *
034     * シスãƒ?ƒ インストã?ル用のアーカイãƒ?ZIP)形式をæŒ?®šすることで、以下ã?設定を自動で行いますã?
035     * â‘?ebapps以下へのコンãƒ?‚­ストファイルの展開T
036     * ②Tomcatのコンãƒ?‚­スト設å®?
037     * ③å�?¨®DB環å¢??インストã?ル
038     *
039     * 5.6.7.0 (2013/07/27) 
040     * ※ インストã?ルするãƒ??タベã?スは、dbid パラメータでæŒ?®šできますが、リソースを登録するãƒ??タベã?スは
041     * 実行してã�?‚‹ コンãƒ?‚­ストã? RESOURCE_DBID で、外部からæŒ?®šできません。ご注意くã�?�•ã�??
042     *
043     * こã?アーカイブã?、ルートディレクトリにコンãƒ?‚­ストパスのドキュメントã?ースがé?置されてã�?‚‹å¿?¦�がありますã?
044     *
045     * [アーカイブã?構æ?]
046     * xx.zip - gf - db - ...               (DB環å¢?‚¤ンストã?ル用のスクリプト)
047     *             - filetemp - ...         (ä¸?™‚ファイルの保存å?æ‰?※中身は空)
048     *             - jsp - ...              (画面JSP)
049     *             - log - ...              (ログファイルの保存å?æ‰?※中身は空)
050     *             - WEB-INF -  ...         (接続å?æƒ??、openGionのjarファイル)
051     *                       - [CONTEXT].xml(コンãƒ?‚­スト設定ファイル)
052     *�
053     * ※WEB-INF直下ã?[CONTEXT].xmlは、Tomcatのconfãƒ?‚£レクトリ以下に、コンãƒ?‚­スト設定ファイルとして、コピã?されますã?
054     *   なおã?こã?[CONTEXT].xmlがアーカイブに含まれてã�?�ªã�??合ã?インストã?ルは行われませんã€?
055     *
056     * @og.formSample
057     * ●形式ï¼?lt;og:sysInstall fileURL="…" insFile="…" />
058     * ●body?šなã�?
059     *
060     * ●Tag定義??
061     *   <og:sysInstall
062     *       insFile          ○ã?TAG】インストã?ルファイルを指定しまã�?å¿??)ã€?
063     *       fileURL            【TAG】操作するファイルのãƒ?‚£レクトリを指定しまã�?(初期値:FILE_URL[=filetemp/])
064     *       dbid               【TAGã€?通常は使ã�?�¾せん)インストã?ルを行うDB接続IDを指定しますã?
065     *       debug              【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
066     *   />
067     *
068     * ●使用ä¾?
069     *    ・Calc(ods)ファイルをPDFに変換
070     *        <og:sysInstall insFile="context.zip" />
071     *
072     * @og.group そã?他部å“?
073     *
074     * @version  4.0
075     * @author       Hiroki Nakamura
076     * @since    JDK5.0,
077     */
078    public class SysInstallTag extends CommonTagSupport {
079            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
080            private static final String VERSION = "5.6.7.0 (2013/07/27)";
081    
082            private static final long serialVersionUID = 567020130727L ;
083    
084            private String  insFile         = null;
085            private String  fileURL         = HybsSystem.sys( "FILE_URL" );
086            private String  dbid            = null;                         // 5.5.4.5 (2012/07/27) 新規追åŠ?
087    
088            private final String RESOURCE_DBID = HybsSystem.sys( "RESOURCE_DBID" );         // 5.6.7.0 (2013/07/27) リソース系DBID
089    
090            /**
091             * Taglibの開始タグが見つかったときに処ç�?�™ã‚?doStartTag() ã‚?オーバã?ライドしますã?
092             *
093             * @return      後続å?ç�??æŒ?¤º( SKIP_BODY )
094             */
095            @Override
096            public int doStartTag() {
097                    return ( SKIP_BODY );
098            }
099    
100            /**
101             * Taglibの終äº?‚¿グが見つかったときに処ç�?�™ã‚?doEndTag() ã‚?オーバã?ライドしますã?
102             *
103             * @og.rev 5.5.4.5 (2012/07/27) dbid 新規追åŠ?
104             * @og.rev 5.6.7.0 (2013/07/27) リソース登録用とアプリケーション登録用のコネクションをå?ける
105             *
106             * @return      後続å?ç�??æŒ?¤º
107             */
108            @Override
109            public int doEndTag() {
110                    debugPrint();
111    
112                    String directory = HybsSystem.url2dir( fileURL );
113                    File buildFile = new File( StringUtil.urlAppend( directory,insFile ) );
114    
115    //              Connection conn = ConnectionFactory.connection( null, null );
116    //              Connection conn = ConnectionFactory.connection( dbid, getApplicationInfo() );   // 5.5.4.5 (2012/07/27)
117    //              PrintWriter out = new PrintWriter( pageContext.getOut() );
118    //              SystemInstaller installer = new SystemInstaller( conn, out );
119    
120    //              try {
121    //                      installer.install( buildFile );
122    //              }
123    ////            catch( SQLException ex ) {
124    //              catch( Throwable ex ) {
125    //                      String msg = "インストã?ル中に、DB処ç�?�§エラーが発生しましたã€?;
126    //                      throw new HybsSystemException( msg, ex );
127    //              }
128    
129                    // 5.6.7.0 (2013/07/27) リソース登録用とアプリケーション登録用のコネクションをå?ける
130                    // エラー処ç�?‚‚合わせて、修正しておきますã?
131                    Connection defConn = null;
132                    Connection rscConn = null;
133                    boolean errFlag = true;
134                    try {
135                            defConn = ConnectionFactory.connection( dbid, getApplicationInfo() );
136                            rscConn = ConnectionFactory.connection( RESOURCE_DBID, getApplicationInfo() );
137                            PrintWriter out = new PrintWriter( pageContext.getOut() );
138                            SystemInstaller installer = new SystemInstaller( defConn , rscConn , out );             // 5.6.7.0 (2013/07/27)
139                            installer.install( buildFile );
140                            errFlag = false;                // エラーではなã�?
141                    }
142                    catch( Throwable ex ) {
143                            String errMsg = "インストã?ル中に、DB処ç�?�§エラーが発生しましたã€?
144                                                    + ex.getMessage()  + HybsSystem.CR ;
145                            throw new HybsSystemException( errMsg, ex );
146                    }
147                    finally {
148                            // 以下ã?コーãƒ?‚£ングの見直しをè€?�ˆるå¿?¦�有りã?
149                            // Connection はプã?ルしてã�?‚‹為、close() してもå?利用されるだけã?
150                            if( errFlag ) {
151                                    ConnectionFactory.remove( defConn,dbid );                       // 削除
152                                    ConnectionFactory.remove( rscConn,RESOURCE_DBID );
153                            }
154                            else {
155                                    ConnectionFactory.close( defConn,dbid );                        // 返却
156                                    ConnectionFactory.close( rscConn,RESOURCE_DBID );
157                            }
158                    }
159    
160                    return( EVAL_PAGE );
161            }
162    
163            /**
164             * タグリブオブジェクトをリリースしますã?
165             * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
166             *
167             * @og.rev 5.5.4.5 (2012/07/27) dbid 新規追åŠ?
168             */
169            @Override
170            protected void release2() {
171                    super.release2();
172                    insFile         = null;
173                    fileURL         = HybsSystem.sys( "FILE_URL" );
174                    dbid            = null;                         // 5.5.4.5 (2012/07/27) 新規追åŠ?
175            }
176    
177            /**
178             * 【TAG】操作するファイルのãƒ?‚£レクトリを指定しまã�?
179             *              (初期値:FILE_URL[={@og.value org.opengion.hayabusa.common.SystemData#FILE_URL}])ã€?
180             *
181             * @og.tag
182             * こã?属æ?でæŒ?®šされるãƒ?‚£レクトリのファイルを操作しますã?
183             * æŒ?®š方法ã?ã€??常の fileURL 属æ?と同様に、å?頭がã?'/' (UNIX) またã?ã€?¼’文字目がã?
184             * ":" (Windows)の場合ã?、指定ã?URLそã?ままのãƒ?‚£レクトリに、そã�?�§なã�??合ã?ã€?
185             * (初期値:シスãƒ?ƒ 定数のFILE_URL[={@og.value org.opengion.hayabusa.common.SystemData#FILE_URL}])ã€?
186             *
187             * @param       url ファイルURL
188             * @see         org.opengion.hayabusa.common.SystemData#FILE_URL
189             */
190            public void setFileURL( final String url ) {
191                    String furl = nval( getRequestParameter( url ),null );
192                    if( furl != null ) {
193                            char ch = furl.charAt( furl.length()-1 );
194                            if( ch != '/' && ch != '\\' ) { furl = furl + "/"; }
195                            fileURL = StringUtil.urlAppend( fileURL,furl );
196                    }
197            }
198    
199            /**
200             * 【TAG】インストã?ルファイルを指定しますã?
201             *
202             * @og.tag
203             * インストã?ルファイルを指定しますã?
204             * å�?‚³ンãƒ?‚­ストã?インストã?ル用アーカイブをæŒ?®šするå¿?¦�がありますã?
205             *
206             * @param       fname 出力ファイルå�?
207             */
208            public void setInsFile( final String fname ) {
209                    insFile = nval( getRequestParameter( fname ),insFile );
210            }
211    
212            /**
213             * 【TAGã€?通常は使ã�?�¾せん)インストã?ルを行うDB接続IDを指定しますã?
214             *
215             * @og.tag Queryオブジェクトを作æ?する時ã?DB接続IDを指定しますã?
216             *
217             * @og.rev 5.5.4.5 (2012/07/27) dbid 新規追åŠ?
218             *
219             * @param       id ãƒ??タベã?ス接続ID
220             */
221            public void setDbid( final String id ) {
222                    dbid = nval( getRequestParameter( id ),dbid );
223            }
224    
225            /**
226             * こã?オブジェクトã?æ–?­—å?表現を返しますã?
227             * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
228             *
229             * @return こã?クラスのæ–?­—å?表現
230             */
231            @Override
232            public String toString() {
233                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
234                                    .println( "VERSION"             ,VERSION        )
235                                    .println( "insFile"             ,insFile        )
236                                    .println( "fileURL"             ,fileURL        )
237                                    .println( "dbid"                ,dbid           )                               // 5.5.4.5 (2012/07/27) 新規追åŠ?
238                                    .println( "Other..."    ,getAttributes().getAttribute() )
239                                    .fixForm().toString() ;
240            }
241    }