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    }