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 */
016package org.opengion.hayabusa.taglib;
017
018import static org.opengion.fukurou.util.StringUtil.nval;
019
020import java.io.File;
021import java.io.PrintWriter;
022import java.sql.Connection;
023
024import org.opengion.fukurou.db.ConnectionFactory;
025import org.opengion.fukurou.util.StringUtil;
026import org.opengion.fukurou.util.ToString;                                              // 6.1.1.0 (2015/01/17)
027import org.opengion.hayabusa.common.HybsSystem;
028import org.opengion.hayabusa.common.HybsSystemException;
029import org.opengion.hayabusa.common.SystemInstaller;
030
031/**
032 * システムのインストールを行うためのタグです。
033 *
034 * システムインストール用のアーカイブ(ZIP)形式を指定することで、以下の設定を自動で行います。
035 * ①webapps以下へのコンテキストファイルの展開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 * ●形式:<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 */
078public class SysInstallTag extends CommonTagSupport {
079        /** このプログラムのVERSION文字列を設定します。   {@value} */
080        private static final String VERSION = "6.4.2.1 (2016/02/05)" ;
081        private static final long serialVersionUID = 642120160205L ;
082
083        private String  insFile         ;
084        private String  fileURL         = HybsSystem.sys( "FILE_URL" );
085        private String  dbid            ;                               // 5.5.4.5 (2012/07/27) 新規追加
086
087        private final String RESOURCE_DBID = HybsSystem.sys( "RESOURCE_DBID" );         // 5.6.7.0 (2013/07/27) リソース系DBID
088
089        /**
090         * デフォルトコンストラクター
091         *
092         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
093         */
094        public SysInstallTag() { super(); }             // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
095
096        /**
097         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
098         *
099         * @return      後続処理の指示( SKIP_BODY )
100         */
101        @Override
102        public int doStartTag() {
103                return SKIP_BODY ;
104        }
105
106        /**
107         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
108         *
109         * @og.rev 5.5.4.5 (2012/07/27) dbid 新規追加
110         * @og.rev 5.6.7.0 (2013/07/27) リソース登録用とアプリケーション登録用のコネクションを分ける
111         * @og.rev 6.4.2.1 (2016/02/05) HybsSystem.url2dir に引数追加。
112         *
113         * @return      後続処理の指示
114         */
115        @Override
116        public int doEndTag() {
117                debugPrint();
118
119                final File buildFile = new File( HybsSystem.url2dir( fileURL , insFile ) );                                     // 6.4.2.1 (2016/02/05)
120
121                // 5.6.7.0 (2013/07/27) リソース登録用とアプリケーション登録用のコネクションを分ける
122                // エラー処理も合わせて、修正しておきます。
123                Connection defConn = null;
124                Connection rscConn = null;
125                boolean errFlag = true;
126                try {
127                        defConn = ConnectionFactory.connection( dbid, getApplicationInfo() );
128                        rscConn = ConnectionFactory.connection( RESOURCE_DBID, getApplicationInfo() );
129                        final PrintWriter out = new PrintWriter( pageContext.getOut() );
130                        final SystemInstaller installer = new SystemInstaller( defConn , rscConn , out );               // 5.6.7.0 (2013/07/27)
131                        installer.install( buildFile );
132                        errFlag = false;                // エラーではない
133                }
134                catch( final Throwable ex ) {
135                        final String errMsg = "インストール中に、DB処理でエラーが発生しました。"
136                                                + ex.getMessage()  + CR ;
137                        throw new HybsSystemException( errMsg, ex );
138                }
139                finally {
140                        // 以下のコーディングの見直しを考える必要有り。
141                        // Connection はプールしている為、close() しても再利用されるだけ。
142                        if( errFlag ) {
143                                ConnectionFactory.remove( defConn,dbid );                       // 削除
144                                ConnectionFactory.remove( rscConn,RESOURCE_DBID );
145                        }
146                        else {
147                                ConnectionFactory.close( defConn,dbid );                        // 返却
148                                ConnectionFactory.close( rscConn,RESOURCE_DBID );
149                        }
150                }
151
152                return EVAL_PAGE ;
153        }
154
155        /**
156         * タグリブオブジェクトをリリースします。
157         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
158         *
159         * @og.rev 5.5.4.5 (2012/07/27) dbid 新規追加
160         */
161        @Override
162        protected void release2() {
163                super.release2();
164                insFile         = null;
165                fileURL         = HybsSystem.sys( "FILE_URL" );
166                dbid            = null;                         // 5.5.4.5 (2012/07/27) 新規追加
167        }
168
169        /**
170         * 【TAG】操作するファイルのディレクトリを指定します
171         *              (初期値:FILE_URL[={@og.value SystemData#FILE_URL}])。
172         *
173         * @og.tag
174         * この属性で指定されるディレクトリのファイルを操作します。
175         * 指定方法は、通常の fileURL 属性と同様に、先頭が、'/' (UNIX) または、2文字目が、
176         * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、
177         * (初期値:システム定数のFILE_URL[={@og.value SystemData#FILE_URL}])。
178         *
179         * @og.rev 6.4.2.1 (2016/02/05) URLの最後に、"/" を追加する処理を廃止。
180         *
181         * @param       url ファイルURL
182         * @see         org.opengion.hayabusa.common.SystemData#FILE_URL
183         */
184        public void setFileURL( final String url ) {
185                final String furl = nval( getRequestParameter( url ),null );
186                if( furl != null ) {
187                        fileURL = StringUtil.urlAppend( fileURL,furl );
188                }
189        }
190
191        /**
192         * 【TAG】インストールファイルを指定します。
193         *
194         * @og.tag
195         * インストールファイルを指定します。
196         * 各コンテキストのインストール用アーカイブを指定する必要があります。
197         *
198         * @param       fname 出力ファイル名
199         */
200        public void setInsFile( final String fname ) {
201                insFile = nval( getRequestParameter( fname ),insFile );
202        }
203
204        /**
205         * 【TAG】(通常は使いません)インストールを行うDB接続IDを指定します(初期値:null)。
206         *
207         * @og.tag Queryオブジェクトを作成する時のDB接続IDを指定します。
208         *
209         * @og.rev 5.5.4.5 (2012/07/27) dbid 新規追加
210         *
211         * @param       id データベース接続ID
212         */
213        public void setDbid( final String id ) {
214                dbid = nval( getRequestParameter( id ),dbid );
215        }
216
217        /**
218         * このオブジェクトの文字列表現を返します。
219         * 基本的にデバッグ目的に使用します。
220         *
221         * @return このクラスの文字列表現
222         * @og.rtnNotNull
223         */
224        @Override
225        public String toString() {
226                return ToString.title( this.getClass().getName() )
227                                .println( "VERSION"             ,VERSION        )
228                                .println( "insFile"             ,insFile        )
229                                .println( "fileURL"             ,fileURL        )
230                                .println( "dbid"                ,dbid           )                               // 5.5.4.5 (2012/07/27) 新規追加
231                                .println( "Other..."    ,getAttributes().getAttribute() )
232                                .fixForm().toString() ;
233        }
234}