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 * 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 */
072 public 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) また??文字目が?
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) また??文字目が?
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 * PAGEBREAK で、シートチェンジを行う場合?シート名も指定したい場合があります?
349 * そ?場合?こ?、useSheetName="true" とすることで、PAGEBREAKカラ??値を?シート名として
350 * 使用します?
351 * useSheetName="false" の場合??Page"+ペ?ジ番号+"_Row"+現在行番号 がシート名になります?
352 *
353 * PAGEBREAK は、FIRSTシート雛形にも適用されます?
354 * ちなみに、FIRSTシート雛形は、特殊で、useSheetName="false" の場合でも?
355 * FIRST_**** などと記述した場合??*** ??をシート名に使用します?
356 * FIRST ?の場合?、従来と同じシート名になります?
357 * 初期値は、互換性を?慮し?false:シート名として使用しな?です?
358 *
359 * @og.rev 5.7.6.2 (2014/05/16) 新規追?
360 *
361 * @param useSName PAGEBREAKカラ??シート名使用可否[true:使用/false:使用しない]
362 */
363 public void setUseSheetName( final String useSName ) {
364 useSheetName = nval( getRequestParameter( useSName ),useSheetName );
365 }
366
367 /**
368 * 【TAG】?力方法を?しま?初期値:P(PDF出?)?
369 *
370 * @og.tag
371 * 出力方法?コード?、FGRUNのコードリソースと同じも?が指定できます?
372 * 初期値は "P" (PDF出?です?
373 *
374 * @param flg 出力方?
375 */
376 public void setFgrun( final String flg ) {
377 fgrun= nval( getRequestParameter( flg ),fgrun );
378 }
379
380 /**
381 * 【TAG】?リンター名を?します?
382 *
383 * @og.tag
384 * プリンター名を?します?こ?プリンター名?帳票サーバ?上でのプリンタ名です?
385 * ファイル出力等?紙に印刷しな??合?不要です?
386 *
387 * @param ptnm プリンター?
388 */
389 public void setPrinterName( final String ptnm ) {
390 printerName = nval( getRequestParameter( ptnm ),printerName );
391 }
392
393 /**
394 * 【TAG?通常は使?せん)結果のDBTableModelを?sessionに登録するとき?キーを指定しま?
395 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])?
396 *
397 * @og.tag
398 * 検索結果より、DBTableModelオブジェクトを作?します?これを?下流?viewタグ等に
399 * 渡す?合に??常は、session を利用します?そ?場合?登録キーです?
400 * query タグを同時に実行して、結果を求める?合?同?モリに配置される為?
401 * こ? tableId 属?を利用して、メモリ空間を?ます?
402 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])?
403 *
404 * @param id sessionに登録する時? ID
405 */
406 public void setTableId( final String id ) {
407 tableId = nval( getRequestParameter( id ), tableId );
408 }
409
410 /**
411 * タグの名称を?返します?
412 * 自??身のクラス名より?自動的に取り出せな?め?こ?メソ?をオーバ?ライドします?
413 *
414 * @og.rev 4.0.0.0 (2005/01/31) 新規追?
415 *
416 * @return タグの名称
417 */
418 @Override
419 protected String getTagName() {
420 return "report2" ;
421 }
422
423 /**
424 * シリアライズ用のカスタ?リアライズ書き込みメソ?
425 *
426 * @og.rev 4.0.0.0 (2006/09/31) 新規追?
427 * @serialData ?のオブジェクト?、シリアライズされません?
428 *
429 * @param strm ObjectOutputStreamオブジェク?
430 * @throws IOException 入出力エラーが発生した??
431 */
432 private void writeObject( final ObjectOutputStream strm ) throws IOException {
433 strm.defaultWriteObject();
434 }
435
436 /**
437 * シリアライズ用のカスタ?リアライズ読み込みメソ?
438 *
439 * ここでは、transient 宣?れた?変数の??初期化が?なフィールド?み設定します?
440 *
441 * @og.rev 4.0.0.0 (2006/09/31) 新規追?
442 * @serialData ?のオブジェクト?、シリアライズされません?
443 *
444 * @param strm ObjectInputStreamオブジェク?
445 * @see #release2()
446 * @throws IOException シリアライズに関する入出力エラーが発生した??
447 * @throws ClassNotFoundException クラスを見つけることができなかった??
448 */
449 private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
450 strm.defaultReadObject();
451 }
452
453 /**
454 * こ?オブジェクト???表現を返します?
455 * 基本???目?使用します?
456 *
457 * @return こ?クラスの??表現
458 */
459 @Override
460 public String toString() {
461 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
462 .println( "VERSION" ,VERSION )
463 .println( "fileURL" ,fileURL )
464 .println( "listId" ,listId )
465 .println( "outFileURL" ,outFileURL )
466 .println( "outFilename" ,outFilename )
467 .println( "headerKeys" ,headerKeys )
468 .println( "headerVals" ,headerVals )
469 .println( "footerKeys" ,footerKeys )
470 .println( "footerVals" ,footerVals )
471 .println( "pageEndCut" ,pageEndCut )
472 .println( "useLocalResource",useLocalResource )
473 .println( "fgrun" ,fgrun )
474 .println( "printerName" ,printerName )
475 .println( "tableId" ,tableId )
476 .println( "BASE_URL" ,BASE_URL )
477 .println( "Other..." ,getAttributes().getAttribute() )
478 .fixForm().toString() ;
479 }
480 }