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    }