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