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.File;
021    
022    import org.opengion.fukurou.util.StringUtil;
023    import org.opengion.hayabusa.common.HybsSystem;
024    import org.opengion.hayabusa.report2.DocConverter_OOO;
025    
026    /**
027     * ドキュメントã?変換・マã?ジを行うタグですã?
028     *
029     * 変換を行うことのできる入出力ã?フォーマット以下ã?通りですã?
030     *
031     * [対応フォーマッãƒ?
032     *  入力[Calc(ods)   ,Excel(xls)     ] â‡?出力[Calc(ods)   ,Excel(xls)     ,PDF]
033     *  入力[Writer(odt) ,Word(doc)      ] â‡?出力[Writer(odt) ,Word(doc)      ,PDF]
034     *  入力[Impress(odp),PowerPoint(ppt)] â‡?出力[Impress(odp),PowerPoint(ppt),PDF]
035     *
036     * 入出力ã?フォーマットã?、å?出力ファイルの拡張子により自動判別されますã?
037     * またã?入出力ファイル名が同じ場合ã?何も処ç�?�•れませんã€?
038     *
039     * 入力ファイルをã?カンマ区åˆ?‚Šでè¤?•°æŒ?®šすることで、è¤?•°の入力ファイルをã?ージして
040     * 出力することもできますã?
041     *
042     * ※2 現状は、ファイルのマã?ジは、å?力ファイルがExcelまたã?Calcの場合ã?み対応してã�?�¾すã?
043     * ※1 こã?機è?を利用するには、OpenOfficeが正しく設定されてã�?‚‹å¿?¦�がありますã?
044     *
045     * @og.formSample
046     * ●形式ï¼?lt;og:docConvert fileURL="…" inputFile="…" outputFile="…" />
047     * ●body?šなã�?
048     *
049     * ●Tag定義??
050     *   <og:docConvert
051     *       fileURL            【TAG】操作するファイルのãƒ?‚£レクトリを指定しまã�?(初期値:FILE_URL[=filetemp/])
052     *       inputFile        ○ã?TAG】å?力ファイル名をæŒ?®šしまã�?å¿??)ã€?
053     *       outputFile       ○ã?TAG】å?力ファイル名をæŒ?®šしまã�?å¿??)ã€?
054     *       delInput           【TAG】ドキュメント変換後ã?å…??ファイルを削除するかどã�?�‹を指定しまã�?初期値:false[=削除しない])
055     *       debug              【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
056     *   />
057     *
058     * ●使用ä¾?
059     *    ・Calc(ods)ファイルをPDFに変換
060     *        <og:docConvert inputFile="temp.ods" outputFile="out.pdf" />
061     *
062     *    ・Excel(xls)ファイルをé?çµ?
063     *        <og:docConvert inputFile="temp1.xls,temp2.xls" outputFile="out.xls" />
064     *
065     * @og.group そã?他部å“?
066     *
067     * @version  4.0
068     * @author       Hiroki Nakamura
069     * @since    JDK5.0,
070     */
071    public class DocConvertTag extends CommonTagSupport {
072            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
073            private static final String VERSION = "5.1.6.0 (2010/05/06)" ;
074    
075            private static final long serialVersionUID = 516020100506L ;
076    
077            private String  fileURL         = HybsSystem.sys( "FILE_URL" );
078            private String[]inputFile       = null;
079            private String  outputFile      = null;
080            private boolean delInput        = false;
081    
082            /**
083             * Taglibの開始タグが見つかったときに処ç�?�™ã‚?doStartTag() ã‚?オーバã?ライドしますã?
084             *
085             * @return      後続å?ç�??æŒ?¤º( SKIP_BODY )
086             */
087            @Override
088            public int doStartTag() {
089                    return ( SKIP_BODY );
090            }
091    
092            /**
093             * Taglibの終äº?‚¿グが見つかったときに処ç�?�™ã‚?doEndTag() ã‚?オーバã?ライドしますã?
094             *
095             * @return      後続å?ç�??æŒ?¤º
096             */
097            @Override
098            public int doEndTag() {
099                    debugPrint();
100    
101                    // 出力ファイルで拡張子だけがæŒ?®šされた場合ã?、å?力ファイル名を付加する
102                    if( outputFile.indexOf( '.' ) < 0 ) {
103                            int inSufIdx = inputFile[0].lastIndexOf( '.' );
104                            if( inSufIdx >= 0 ) {
105                                    outputFile = inputFile[0].substring( 0, inSufIdx ) + "." + outputFile;
106                            }
107    
108                    }
109    
110                    String directory = HybsSystem.url2dir( fileURL );
111                    String[] input = new String[inputFile.length];
112                    for( int i=0; i<input.length; i++ ) {
113                            input[i] = StringUtil.urlAppend( directory,inputFile[i] );
114                    }
115                    String output = StringUtil.urlAppend( directory,outputFile );
116    
117                    // ドキュメント変換
118                    DocConverter_OOO.convert( input, output );
119    
120                    if( delInput ) {
121                            for( int i=0; i<input.length; i++ ) {
122                                    if( !( new File( input[i] ) ).delete() ) {
123                                            System.err.println( "入力ファイルの削除に失敗しました。file=[" + input[i] + "]" );
124                                    }
125                            }
126                    }
127    
128                    return( EVAL_PAGE );
129            }
130    
131            /**
132             * タグリブオブジェクトをリリースしますã?
133             * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
134             *
135             */
136            @Override
137            protected void release2() {
138                    super.release2();
139                    fileURL         = HybsSystem.sys( "FILE_URL" );
140                    inputFile       = null;
141                    outputFile      = null;
142                    delInput        = false;
143            }
144    
145            /**
146             * 【TAG】操作するファイルのãƒ?‚£レクトリを指定しまã�?
147             *              (初期値:FILE_URL[={@og.value org.opengion.hayabusa.common.SystemData#FILE_URL}])ã€?
148             *
149             * @og.tag
150             * こã?属æ?でæŒ?®šされるãƒ?‚£レクトリのファイルを操作しますã?
151             * æŒ?®š方法ã?ã€??常の fileURL 属æ?と同様に、å?頭がã?'/' (UNIX) またã?ã€?¼’文字目がã?
152             * ":" (Windows)の場合ã?、指定ã?URLそã?ままのãƒ?‚£レクトリに、そã�?�§なã�??合ã?ã€?
153             * (初期値:シスãƒ?ƒ 定数のFILE_URL[={@og.value org.opengion.hayabusa.common.SystemData#FILE_URL}])ã€?
154             *
155             * @param       url ファイルURL
156             * @see         org.opengion.hayabusa.common.SystemData#FILE_URL
157             */
158            public void setFileURL( final String url ) {
159                    String furl = nval( getRequestParameter( url ),null );
160                    if( furl != null ) {
161                            char ch = furl.charAt( furl.length()-1 );
162                            if( ch != '/' && ch != '\\' ) { furl = furl + "/"; }
163                            fileURL = StringUtil.urlAppend( fileURL,furl );
164                    }
165            }
166    
167            /**
168             * 【TAG】å?力ファイル名をæŒ?®šしますã?
169             *
170             * @og.tag
171             * 入力ファイル名をæŒ?®šしますã?
172             *
173             * 入力ファイルは、カンマ区åˆ?‚Šでè¤?•°æŒ?®šすることができますã?
174             * こã?場合ã?è¤?•°の入力ファイルをã?ージして出力を行いますã?
175             *
176             * ※現状は、ファイルのマã?ジは、å?力ファイルがExcelまたã?Calcの場合ã?み対応してã�?�¾すã?
177             *   またã?マã?ジを行う場合ã?印刷ç¯?›²など、ドキュメントに関連するæƒ??はã€?つ目のファイルの
178             *   æƒ??が使用されますã?
179             *
180             * @param       fname 入力ファイルå�?
181             */
182            public void setInputFile( final String fname ) {
183                    inputFile = getCSVParameter( fname );
184            }
185    
186            /**
187             * 【TAG】å?力ファイル名をæŒ?®šしますã?
188             *
189             * @og.tag
190             * 出力ファイル名をæŒ?®šしますã?
191             * 出力ファイルには、拡張子ã?み(xls,odsç­?を指定することもできますã?
192             * こã?場合ã?出力ファイル名ã?、å?力ファイル名と同じになりますã?(拡張子ã?みが変換されã‚?
193             *
194             * @param       fname 出力ファイルå�?
195             */
196            public void setOutputFile( final String fname ) {
197                    outputFile = nval( getRequestParameter( fname ),outputFile );
198            }
199    
200            /**
201             * 【TAG】ドキュメント変換後ã?å…??ファイルを削除するかどã�?�‹を指定しまã�?初期値:false[=削除しない])ã€?
202             *
203             * @og.tag
204             * ドキュメント変換後ã?å…??ファイルを削除するかどã�?�‹を指定しますã?
205             * (初期値:false(削除しなã�?)
206             *
207             * @param       flg 出力å?のファイルを削除するかどã�?�‹å�?
208             */
209            public void setDelInput( final String flg ) {
210                    delInput = nval( getRequestParameter( flg ),delInput );
211            }
212    
213            /**
214             * こã?オブジェクトã?æ–?­—å?表現を返しますã?
215             * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
216             *
217             * @return こã?クラスのæ–?­—å?表現
218             */
219            @Override
220            public String toString() {
221                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
222                                    .println( "VERSION"             ,VERSION        )
223                                    .println( "fileURL"             ,fileURL        )
224                                    .println( "inputFile"   ,inputFile              )
225                                    .println( "outputFile"  ,outputFile             )
226                                    .println( "Other..."    ,getAttributes().getAttribute() )
227                                    .fixForm().toString() ;
228            }
229    }