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