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}