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 java.io.File; // 8.0.0.1 (2021/10/08) 019 020import org.opengion.fukurou.util.StringUtil; 021import org.opengion.fukurou.util.ToString; // 6.1.1.0 (2015/01/17) 022import org.opengion.hayabusa.common.HybsSystem; 023import org.opengion.hayabusa.db.DBTableModel; 024import org.opengion.hayabusa.db.DBTableModelUtil; 025import org.opengion.hayabusa.report2.QueueManager_DIRECT; 026import org.opengion.hayabusa.io.HybsFileOperationFactory; // 8.0.0.1 (2021/10/08) 027// import org.opengion.fukurou.model.FileOperation; // 8.0.0.1 (2021/10/08) 028// import org.opengion.fukurou.util.FileUtil; // 8.0.0.1 (2021/10/08) 029 030import static org.opengion.fukurou.util.StringUtil.nval; 031 032/** 033 * 検索結果の DBTableModelオブジェクトをレポート形式に変換するタグです。 034 * 035 * データ(DBTableModel)と、コントローラ(QueueManager_DIRECT クラス)を与えて、 036 * 外部からコントロールすることで、各種形式で データ(DBTableModel)を表示させることが 037 * 可能です。 038 * このタグを使用するには、OpenOffice.orgのモジュールがインストールされてている必要があります。 039 * また、出力するために帳票システム関連のデータ設定やマスタ設定は一切必要ありません。 040 * 041 * @og.formSample 042 * ●形式:<og:report fileURL="[・・・]" listId="[・・・]" ・・・ /> 043 * ●body:なし 044 * 045 * ●Tag定義: 046 * <og:report2 047 * fileURL 【TAG】雛型のHTMLファイルの保存してある ディレクトリを指定します 048 * listId ○【TAG】帳票IDを指定します(必須)。 049 * outFileURL 【TAG】出力HTMLファイルの保存してあるディレクトリを指定します(初期値:FILE_URL[={@og.value SystemData#FILE_URL}]) 050 * outFilename ○【TAG】ファイルを作成するときの出力ファイル名をセットします(必須)。 051 * headerKeys 【TAG】固定部の{@KEY} の KEY 部分をCSV形式で複数指定します 052 * headerVals 【TAG】固定部のKEY に対応する値をCSV形式で複数指定します 053 * footerKeys 【TAG】繰り返し部の終了後に表示する key 部分をCSV形式で複数指定します 054 * footerVals 【TAG】固定部のKEY に対応する値をCSV形式で複数指定します 055 * pageEndCut 【TAG】ボディー部(繰り返し部)がなくなったときに、それ以降を表示するかどうか[true/false]を指定します(初期値:true) 056 * useLocalResource 【TAG】各システムのリソース(ローカルリソース)を使用するか[true/false]を指定します(初期値:true) 057 * useSheetName 【TAG】PAGEBREAKカラムの値を、シート名として使うかどうか[true/false]を指定します(初期値:false) 058 * fgrun 【TAG】出力方法を指定します(初期値:P(PDF出力)) 059 * printerName 【TAG】プリンター名を指定します 060 * useLocal 【TAG】システム定数でクラウド設定されていても、クラウド環境を使用しない場合、trueを指定します(初期値:false) 8.0.1.0 (2021/10/29) 061 * language 【TAG】タグ内部で使用する言語コード[ja/en/zh/…]を指定します 062 * scope 【TAG】キャッシュする場合のスコープ[request/page/session/application]を指定します(初期値:session) 063 * tableId 【TAG】(通常は使いません)sessionから所得する DBTableModelオブジェクトの ID 064 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 065 * /> 066 * 067 * ●使用例 068 * 069 * @og.group その他出力 070 * 071 * @version 4.0 072 * @author Hiroki Nakamura 073 * @since JDK5.0, 074 */ 075public class ReportTableTag2 extends CommonTagSupport { 076 /** このプログラムのVERSION文字列を設定します。 {@value} */ 077 private static final String VERSION = "8.0.1.0 (2021/10/29)" ; 078 private static final long serialVersionUID = 801020211029L ; 079 080 private final String BASE_URL = HybsSystem.sys( "FILE_URL" ); 081 082 private String fileURL = BASE_URL; // 雛形ファイルURL 083 private String listId ; // 帳票ID 084 private String outFileURL = BASE_URL; // 出力ファイルURL 085 private String outFilename ; // 出力ファイル名 086 private String[] headerKeys ; // 固定部の{@KEY} の KEY 部分を指定する。カンマで複数指定できる。 087 private String[] headerVals ; // 固定部のKEY に対応する値を指定する。 {@KEY} に置き換わる。 088 private String[] footerKeys ; // 繰り返し部の終了後に表示する key 部分を指定する。カンマで複数指定できる。 089 private String[] footerVals ; // 繰り返し部の終了後に表示する key に対する値を指定する。 090 private boolean pageEndCut = true; // ページエンドカットをするか 091 private boolean useLocalResource= true; // ローカルリソースを使用するか 092 private boolean useSheetName ; // 5.7.6.2 (2014/05/16) PAGEBREAKカラムの値を、シート名として使うかどうか。 093 private String fgrun = "P"; // PDF出力 094 private String printerName ; // プリンタ名 095 private boolean useLocal ; // 8.0.1.0 (2021/10/29) クラウド設定を使用しない場合は、true 096 097 private String tableId = HybsSystem.TBL_MDL_KEY ; 098 099 private transient DBTableModel body ; 100 private transient DBTableModel header ; 101 private transient DBTableModel footer ; 102 103 /** 104 * デフォルトコンストラクター 105 * 106 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor. 107 */ 108 public ReportTableTag2() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 109 110 /** 111 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 112 * 113 * @og.rev 8.0.0.2 (2021/10/15) ローカルファイルとクラウドファイル間の移動 114 * 115 * @return 後続処理の指示 116 */ 117 @Override 118 public int doEndTag() { 119 debugPrint(); 120 121 final int rtnCode; 122 123 body = (DBTableModel)getObject( tableId ); 124 if( body == null || body.getRowCount() == 0 ) { 125 rtnCode = SKIP_PAGE ; // ページの残りの処理を行わない。 126 } 127 else { 128 exec(); 129 130 // 8.0.0.2 (2021/10/15) ローカルファイルとクラウドファイル間の移動 131 // 5.10.9.0 (2019/03/01) ADD クラウドストレージ指定の場合は、作成されたファイルをアップロードします。 132 final String outFile = HybsSystem.url2dir( outFileURL , outFilename ); 133 HybsFileOperationFactory.local2cloud( useLocal,() -> new File( outFile ) ); 134 135// final FileOperation cloudFile = HybsFileOperationFactory.create( outFile ); 136// if( cloudFile.isCloud() ) { 137// final File localFile = new File( outFile ); 138// FileUtil.copy( localFile, cloudFile ); 139// localFile.delete(); 140// } 141 142 rtnCode = EVAL_PAGE ; 143 } 144 145 return rtnCode ; 146 } 147 148 /** 149 * タグリブオブジェクトをリリースします。 150 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 151 * 152 * @og.rev 5.7.6.2 (2014/05/16) PAGEBREAKカラムの値を、シート名として使うかどうか。 153 * @og.rev 8.0.1.0 (2021/10/29) useLocal 属性を追加。 154 */ 155 @Override 156 protected void release2() { 157 super.release2(); 158 fileURL = BASE_URL; 159 listId = null; 160 outFileURL = BASE_URL; 161 outFilename = null; 162 headerKeys = null; 163 headerVals = null; 164 footerKeys = null; 165 footerVals = null; 166 pageEndCut = true; 167 useLocalResource= true; 168 useSheetName = false; // 5.7.6.2 (2014/05/16) PAGEBREAKカラムの値を、シート名として使うかどうか。 169 fgrun = "P"; 170 printerName = null; 171 useLocal = false; // 8.0.1.0 (2021/10/29) クラウド設定を使用しない場合は、true 172 173 tableId = HybsSystem.TBL_MDL_KEY ; 174 body = null; 175 header = null; 176 footer = null; 177 } 178 179 /** 180 * 帳票処理を行います。 181 * 182 * @og.rev 4.3.3.4 (2008/11/01) ヘッダー、フッター値が設定されていない場合にNullPointerExceptionが出るバグを修正 183 * @og.rev 4.3.3.4 (2008/11/01) 雛形のパス及び、出力先のパスを実ディレクトリのパスに変換 184 * @og.rev 5.7.6.2 (2014/05/16) PAGEBREAKカラムの値を、シート名として使うかどうか。 185 * @og.rev 6.4.2.1 (2016/02/05) HybsSystem.url2dir に引数追加。 186 * 187 */ 188 private void exec() { 189 final QueueManager_DIRECT manager = new QueueManager_DIRECT(); 190 manager.setListId( listId ); 191 manager.setLang( getLanguage() ); 192 manager.setOutputName( HybsSystem.url2dir( outFileURL , outFilename ) ); // 6.4.2.1 (2016/02/05) 193 manager.setOutputType( fgrun ); 194 manager.setTemplateName( HybsSystem.url2dir( fileURL , listId ) ); // 6.4.2.1 (2016/02/05) 195 manager.setPrinterName( printerName ); 196 manager.setFgcut( pageEndCut ); 197 manager.setFglocal( useLocalResource ); 198 manager.setUseSheetName( useSheetName ); // 5.7.6.2 (2014/05/16) PAGEBREAKカラムの値を、シート名として使うかどうか。 199 200 manager.setBody( body ); 201 202 // 4.3.3.4 (2008/11/01) 203 if( headerVals != null && headerVals.length > 0 ) { 204 String[][] hvals = new String[headerVals.length][1]; 205 hvals[0] = headerVals; 206 header = DBTableModelUtil.makeDBTable( headerKeys, hvals, getResource() ); 207 manager.setHeader( header ); 208 } 209 210 // 4.3.3.4 (2008/11/01) 211 if( footerVals != null && footerVals.length > 0 ) { 212 String[][] fvals = new String[footerVals.length][1]; 213 fvals[0] = footerVals; 214 footer = DBTableModelUtil.makeDBTable( footerKeys, fvals, getResource() ); 215 manager.setFooter( footer ); 216 } 217 218 manager.create(); 219 manager.waitExec(); 220 } 221 222 /** 223 * 【TAG】雛型のHTMLファイルの保存してある ディレクトリを指定します。 224 * 225 * @og.tag 226 * この属性で指定されるディレクトリのファイルを読み取ります。 227 * 指定方法は、通常の fileURL 属性と同様に、先頭が、'/' (UNIX) または、2文字目が、 228 * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、 229 * システムパラメータ の FILE_URL 属性で指定のフォルダの下に、作成されます。 230 * fileURL = "{@USER.ID}" と指定すると、FILE_URL 属性で指定のフォルダの下に、 231 * さらに、各個人ID別のフォルダを作成して、そこを操作します。 232 * 233 * @og.rev 6.4.2.1 (2016/02/05) URLの最後に、"/" を追加する処理を廃止。 234 * 235 * @param url 雛型のHTMLファイルのディレクトリ 236 */ 237 public void setFileURL( final String url ) { 238 final String furl = nval( getRequestParameter( url ),null ); 239 if( furl != null ) { 240 fileURL = StringUtil.urlAppend( fileURL,furl ); 241 } 242 } 243 244 /** 245 * 【TAG】帳票IDを指定します。 246 * 247 * @og.tag 248 * 帳票IDを指定します。 249 * 250 * @param listId 帳票ID 251 */ 252 public void setListId( final String listId ) { 253 this.listId = nval( getRequestParameter( listId ), this.listId ); 254 } 255 256 /** 257 * 【TAG】出力HTMLファイルの保存してあるディレクトリを指定します 258 * (初期値:FILE_URL[={@og.value SystemData#FILE_URL}])。 259 * 260 * @og.tag 261 * この属性で指定されるディレクトリにファイルを出力します。 262 * 指定方法は、通常の fileURL 属性と同様に、先頭が、'/' (UNIX) または、2文字目が、 263 * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、 264 * システムパラメータ の FILE_URL 属性で指定のフォルダの下に、作成されます。 265 * fileURL = "{@USER.ID}" と指定すると、FILE_URL 属性で指定のフォルダの下に、 266 * さらに、各個人ID別のフォルダを作成して、そこに出力します。 267 * (初期値:FILE_URL[={@og.value SystemData#FILE_URL}])。 268 * 269 * @og.rev 6.4.2.1 (2016/02/05) URLの最後に、"/" を追加する処理を廃止。 270 * 271 * @param url 出力HTMLファイルのディレクトリ 272 */ 273 public void setOutFileURL( final String url ) { 274 final String furl = nval( getRequestParameter( url ),null ); 275 if( furl != null ) { 276 outFileURL = StringUtil.urlAppend( outFileURL,furl ); 277 } 278 } 279 280 /** 281 * 【TAG】ファイルを作成するときの出力ファイル名をセットします。 282 * 283 * @og.tag 284 * ファイルを作成するときの出力ファイル名をセットします。 285 * 紙に印字する場合などファイルに出力しない場合は不要です。 286 * 287 * @param filename 出力ファイル名 288 */ 289 public void setOutFilename( final String filename ) { 290 this.outFilename = nval( getRequestParameter( filename ),this.outFilename ); 291 } 292 293 /** 294 * 【TAG】固定部の{@KEY} の KEY 部分をCSV形式で複数指定します。 295 * 296 * @og.tag 297 * カンマで複数指定できます。 298 * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。 299 * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。 300 * 301 * @param hKeys 固定部のkey 302 */ 303 public void setHeaderKeys( final String hKeys ) { 304 headerKeys = getCSVParameter( hKeys ); 305 } 306 307 /** 308 * 【TAG】固定部のKEY に対応する値をCSV形式で複数指定します。 309 * 310 * @og.tag 311 * カンマで複数指定で、リクエスト情報でも設定できます。 312 * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。 313 * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。 314 * 315 * @param hVals 固定部の値 316 */ 317 public void setHeaderVals( final String hVals ) { 318 headerVals = getCSVParameter( hVals ); 319 } 320 321 /** 322 * 【TAG】繰り返し部の終了後に表示する key 部分をCSV形式で複数指定します。 323 * 324 * @og.tag 325 * カンマで複数指定できます。 326 * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。 327 * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。 328 * 329 * @param ftKeys 繰り返し部の終了後に表示するkey 330 */ 331 public void setFooterKeys( final String ftKeys ) { 332 footerKeys = getCSVParameter( ftKeys ); 333 } 334 335 /** 336 * 【TAG】固定部のKEY に対応する値をCSV形式で複数指定します。 337 * 338 * @og.tag 339 * カンマで複数指定で、リクエスト情報でも設定できます。 340 * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。 341 * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。 342 * 343 * @param ftVals 繰り返し部の終了後に表示する値 344 */ 345 public void setFooterVals( final String ftVals ) { 346 footerVals = getCSVParameter( ftVals ); 347 } 348 349 /** 350 * 【TAG】ページエンドカットするかどうか[true:する/false:しない]を指定します(初期値:true:カットする)。 351 * 352 * @og.tag 353 * ページエンドカットとは、ボディー部(繰り返し部)がなくなったときに、それ以降の表示を打ち切る(カットする) 354 * 機能で、(true:カットする) を指定すると、それ以降を出力しません。 355 * 初期値は "true" (なくなった時点で、出力しない)です。 356 * 357 * @param peCut ページ終了カット [true:する/false:しない] 358 */ 359 public void setPageEndCut( final String peCut ) { 360 pageEndCut = nval( getRequestParameter( peCut ),pageEndCut ); 361 } 362 363 /** 364 * 【TAG】各システムのリソース(ローカルリソース)を使用するかどうか[true:する/false:しない]を指定します(初期値:true)。 365 * 366 * @og.tag 367 * true の場合、各システムに登録されたリソース情報を使用して帳票データが変換されます。 368 * false の場合は、帳票デーモンが起動しているシステム(通常は'GE')のリソースが適用されます。 369 * 初期値は "true" (ローカルリソースを使用する)です。 370 * 371 * @param fgl ローカルリソースの使用 [true:する/false:しない] 372 */ 373 public void setUseLocalResource( final String fgl ) { 374 useLocalResource = nval( getRequestParameter( fgl ),useLocalResource ); 375 } 376 377 /** 378 * 【TAG】PAGEBREAKカラムの値を、シート名として使うかどうかをセットします(初期値:false)。 379 * 380 * @og.tag 381 * PAGEBREAK で、シートチェンジを行う場合、シート名も指定したい場合があります。 382 * その場合、この、useSheetName="true" とすることで、PAGEBREAKカラムの値を、シート名として 383 * 使用します。 384 * useSheetName="false" の場合は、"Page"+ページ番号+"_Row"+現在行番号 がシート名になります。 385 * 386 * PAGEBREAK は、FIRSTシート雛形にも適用されます。 387 * ちなみに、FIRSTシート雛形は、特殊で、useSheetName="false" の場合でも、 388 * FIRST_**** などと記述した場合は、**** 文字列をシート名に使用します。 389 * FIRST だけの場合は、従来と同じシート名になります。 390 * 初期値は、互換性を考慮し、false:シート名として使用しない です。 391 * 392 * @og.rev 5.7.6.2 (2014/05/16) 新規追加 393 * 394 * @param useSName PAGEBREAKカラムのシート名使用可否 [true:使用/false:使用しない] 395 */ 396 public void setUseSheetName( final String useSName ) { 397 useSheetName = nval( getRequestParameter( useSName ),useSheetName ); 398 } 399 400 /** 401 * 【TAG】出力方法を指定します(初期値:P(PDF出力))。 402 * 403 * @og.tag 404 * 出力方法のコードは、FGRUNのコードリソースと同じものが指定できます。 405 * 初期値は "P" (PDF出力)です。 406 * 407 * @param code 出力方法(FGRUNのコードリソースと同じもの) 408 */ 409 public void setFgrun( final String code ) { 410 fgrun= nval( getRequestParameter( code ),fgrun ); 411 } 412 413 /** 414 * 【TAG】プリンター名を指定します。 415 * 416 * @og.tag 417 * プリンター名を指定します。このプリンター名は帳票サーバー上でのプリンタ名です。 418 * ファイル出力等、紙に印刷しない場合は不要です。 419 * 420 * @param ptnm プリンター名 421 */ 422 public void setPrinterName( final String ptnm ) { 423 printerName = nval( getRequestParameter( ptnm ),printerName ); 424 } 425 426 /** 427 * 【TAG】システム定数でクラウド設定されていても、クラウド環境を使用しない場合、trueを指定します(初期値:false)。 428 * 429 * @og.tag 430 * クラウド設定は、システム定数の『CLOUD_TARGET』と『CLOUD_BUCKET』の設定で自動的に使用しますが、 431 * どうしてもローカルでのみ使いたい場合は、この属性を true に設定します。 432 * 標準はfalse:設定どおりとなります。 433 * 434 * true/false以外を指定した場合はfalse扱いとします。 435 * 436 * @og.rev 8.0.1.0 (2021/10/29) useLocal 属性を追加。 437 * 438 * @param flag ローカル環境のみ [true:ローカルのみ/false:設定どおり] 439 */ 440 public void setUseLocal( final String flag ) { 441 useLocal = nval( getRequestParameter( flag ),useLocal ); 442 } 443 444 /** 445 * 【TAG】(通常は使いません)結果のDBTableModelを、sessionに登録するときのキーを指定します 446 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value HybsSystem#TBL_MDL_KEY}])。 447 * 448 * @og.tag 449 * 検索結果より、DBTableModelオブジェクトを作成します。これを、下流のviewタグ等に 450 * 渡す場合に、通常は、session を利用します。その場合の登録キーです。 451 * query タグを同時に実行して、結果を求める場合、同一メモリに配置される為、 452 * この tableId 属性を利用して、メモリ空間を分けます。 453 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value HybsSystem#TBL_MDL_KEY}])。 454 * 455 * @param id テーブルID (sessionに登録する時のID) 456 */ 457 public void setTableId( final String id ) { 458 tableId = nval( getRequestParameter( id ), tableId ); 459 } 460 461 /** 462 * タグの名称を、返します。 463 * 自分自身のクラス名より、自動的に取り出せないため、このメソッドをオーバーライドします。 464 * 465 * @og.rev 4.0.0.0 (2005/01/31) 新規追加 466 * 467 * @return タグの名称 468 * @og.rtnNotNull 469 */ 470 @Override 471 protected String getTagName() { 472 return "report2" ; 473 } 474 475 /** 476 * このオブジェクトの文字列表現を返します。 477 * 基本的にデバッグ目的に使用します。 478 * 479 * @return このクラスの文字列表現 480 * @og.rtnNotNull 481 */ 482 @Override 483 public String toString() { 484 return ToString.title( this.getClass().getName() ) 485 .println( "VERSION" ,VERSION ) 486 .println( "fileURL" ,fileURL ) 487 .println( "listId" ,listId ) 488 .println( "outFileURL" ,outFileURL ) 489 .println( "outFilename" ,outFilename ) 490 .println( "headerKeys" ,headerKeys ) 491 .println( "headerVals" ,headerVals ) 492 .println( "footerKeys" ,footerKeys ) 493 .println( "footerVals" ,footerVals ) 494 .println( "pageEndCut" ,pageEndCut ) 495 .println( "useLocalResource",useLocalResource ) 496 .println( "fgrun" ,fgrun ) 497 .println( "printerName" ,printerName ) 498 .println( "tableId" ,tableId ) 499 .println( "BASE_URL" ,BASE_URL ) 500 .println( "Other..." ,getAttributes().getAttribute() ) 501 .fixForm().toString() ; 502 } 503}