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    }