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    }