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 * @throws IOException 入出力エラーが発生した??
402 */
403 private void writeObject( final ObjectOutputStream strm ) throws IOException {
404 strm.defaultWriteObject();
405 }
406
407 /**
408 * シリアライズ用のカスタ?リアライズ読み込みメソ?
409 *
410 * ここでは、transient 宣?れた?変数の??初期化が?なフィールド?み設定します?
411 *
412 * @og.rev 4.0.0.0 (2006/09/31) 新規追?
413 * @serialData ?のオブジェクト?、シリアライズされません?
414 *
415 * @param strm ObjectInputStreamオブジェク?
416 * @see #release2()
417 * @throws IOException シリアライズに関する入出力エラーが発生した??
418 * @throws ClassNotFoundException クラスを見つけることができなかった??
419 */
420 private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
421 strm.defaultReadObject();
422 }
423
424 /**
425 * こ?オブジェクト???表現を返します?
426 * 基本???目?使用します?
427 *
428 * @return こ?クラスの??表現
429 */
430 @Override
431 public String toString() {
432 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
433 .println( "VERSION" ,VERSION )
434 .println( "fileURL" ,fileURL )
435 .println( "listId" ,listId )
436 .println( "outFileURL" ,outFileURL )
437 .println( "outFilename" ,outFilename )
438 .println( "headerKeys" ,headerKeys )
439 .println( "headerVals" ,headerVals )
440 .println( "footerKeys" ,footerKeys )
441 .println( "footerVals" ,footerVals )
442 .println( "pageEndCut" ,pageEndCut )
443 .println( "useLocalResource",useLocalResource )
444 .println( "fgrun" ,fgrun )
445 .println( "printerName" ,printerName )
446 .println( "tableId" ,tableId )
447 .println( "BASE_URL" ,BASE_URL )
448 .println( "Other..." ,getAttributes().getAttribute() )
449 .fixForm().toString() ;
450 }
451 }