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