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