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 */
016package org.opengion.hayabusa.taglib;
017
018import static org.opengion.fukurou.util.StringUtil.nval;
019
020import java.io.File;
021
022import org.opengion.fukurou.util.StringUtil;
023import org.opengion.fukurou.util.ToString;                                              // 6.1.1.0 (2015/01/17)
024import org.opengion.hayabusa.common.HybsSystem;
025import org.opengion.hayabusa.report2.DocConverter_OOO;
026
027/**
028 * ドキュメントの変換・マージを行うタグです。
029 *
030 * 変換を行うことのできる入出力のフォーマット以下の通りです。
031 *
032 * [対応フォーマット]
033 *  入力[Calc(ods)   ,Excel(xls)     ] ⇒ 出力[Calc(ods)   ,Excel(xls)     ,PDF]
034 *  入力[Writer(odt) ,Word(doc)      ] ⇒ 出力[Writer(odt) ,Word(doc)      ,PDF]
035 *  入力[Impress(odp),PowerPoint(ppt)] ⇒ 出力[Impress(odp),PowerPoint(ppt),PDF]
036 *
037 * 入出力のフォーマットは、入出力ファイルの拡張子により自動判別されます。
038 * また、入出力ファイル名が同じ場合は何も処理されません。
039 *
040 * 入力ファイルを、CSV形式で複数指定することで、複数の入力ファイルをマージして
041 * 出力することもできます。
042 *
043 * ※2 現状は、ファイルのマージは、入力ファイルがExcelまたはCalcの場合のみ対応しています。
044 * ※1 この機能を利用するには、OpenOfficeが正しく設定されている必要があります。
045 *
046 * @og.formSample
047 * ●形式:<og:docConvert fileURL="…" inputFile="…" outputFile="…" />
048 * ●body:なし
049 *
050 * ●Tag定義:
051 *   <og:docConvert
052 *       fileURL            【TAG】操作するファイルのディレクトリを指定します (初期値:FILE_URL[=filetemp/])
053 *       inputFile        ○【TAG】入力ファイル名を指定します(必須)。
054 *       outputFile       ○【TAG】出力ファイル名を指定します(必須)。
055 *       delInput           【TAG】ドキュメント変換後、元のファイルを削除するかどうかを指定します(初期値:false[=削除しない])
056 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
057 *   />
058 *
059 * ●使用例
060 *    ・Calc(ods)ファイルをPDFに変換
061 *        <og:docConvert inputFile="temp.ods" outputFile="out.pdf" />
062 *
063 *    ・Excel(xls)ファイルを連結
064 *        <og:docConvert inputFile="temp1.xls,temp2.xls" outputFile="out.xls" />
065 *
066 * @og.group その他部品
067 *
068 * @version  4.0
069 * @author       Hiroki Nakamura
070 * @since    JDK5.0,
071 */
072public class DocConvertTag extends CommonTagSupport {
073        /** このプログラムのVERSION文字列を設定します。   {@value} */
074        private static final String VERSION = "6.4.2.1 (2016/02/05)" ;
075        private static final long serialVersionUID = 642120160205L ;
076
077        private String  fileURL         = HybsSystem.sys( "FILE_URL" );
078        private String[]inputFile       ;
079        private String  outputFile      ;
080        private boolean delInput        ;
081
082        /**
083         * デフォルトコンストラクター
084         *
085         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
086         */
087        public DocConvertTag() { super(); }             // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
088
089        /**
090         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
091         *
092         * @return      後続処理の指示( SKIP_BODY )
093         */
094        @Override
095        public int doStartTag() {
096                return SKIP_BODY ;
097        }
098
099        /**
100         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
101         *
102         * @return      後続処理の指示
103         */
104        @Override
105        public int doEndTag() {
106                debugPrint();
107
108                // 出力ファイルで拡張子だけが指定された場合は、入力ファイル名を付加する
109                if( outputFile.indexOf( '.' ) < 0 ) {
110                        final int inSufIdx = inputFile[0].lastIndexOf( '.' );
111                        if( inSufIdx >= 0 ) {
112                                outputFile = inputFile[0].substring( 0, inSufIdx ) + "." + outputFile;
113                        }
114                }
115
116                final String directory = HybsSystem.url2dir( fileURL );
117                String[] input = new String[inputFile.length];
118                for( int i=0; i<input.length; i++ ) {
119                        input[i] = StringUtil.urlAppend( directory,inputFile[i] );
120                }
121                final String output = StringUtil.urlAppend( directory,outputFile );
122
123                // ドキュメント変換
124                DocConverter_OOO.convert( input, output );
125
126                if( delInput ) {
127                        for( int i=0; i<input.length; i++ ) {
128                                if( !( new File( input[i] ) ).delete() ) {
129                                        System.err.println( "入力ファイルの削除に失敗しました。file=[" + input[i] + "]" );
130                                }
131                        }
132                }
133
134                return EVAL_PAGE ;
135        }
136
137        /**
138         * タグリブオブジェクトをリリースします。
139         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
140         *
141         */
142        @Override
143        protected void release2() {
144                super.release2();
145                fileURL         = HybsSystem.sys( "FILE_URL" );
146                inputFile       = null;
147                outputFile      = null;
148                delInput        = false;
149        }
150
151        /**
152         * 【TAG】操作するファイルのディレクトリを指定します
153         *              (初期値:FILE_URL[={@og.value SystemData#FILE_URL}])。
154         *
155         * @og.tag
156         * この属性で指定されるディレクトリのファイルを操作します。
157         * 指定方法は、通常の fileURL 属性と同様に、先頭が、'/' (UNIX) または、2文字目が、
158         * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、
159         * (初期値:システム定数のFILE_URL[={@og.value SystemData#FILE_URL}])。
160         *
161         * @og.rev 6.4.2.1 (2016/02/05) URLの最後に、"/" を追加する処理を廃止。
162         *
163         * @param       url ファイルURL
164         * @see         org.opengion.hayabusa.common.SystemData#FILE_URL
165         */
166        public void setFileURL( final String url ) {
167                final String furl = nval( getRequestParameter( url ),null );
168                if( furl != null ) {
169                        fileURL = StringUtil.urlAppend( fileURL,furl );
170                }
171        }
172
173        /**
174         * 【TAG】入力ファイル名を指定します。
175         *
176         * @og.tag
177         * 入力ファイル名を指定します。
178         *
179         * 入力ファイルは、CSV形式で複数指定することができます。
180         * この場合、複数の入力ファイルをマージして出力を行います。
181         *
182         * ※現状は、ファイルのマージは、入力ファイルがExcelまたはCalcの場合のみ対応しています。
183         *   また、マージを行う場合、印刷範囲など、ドキュメントに関連する情報は、1つ目のファイルの
184         *   情報が使用されます。
185         *
186         * @param       fname 入力ファイル名
187         */
188        public void setInputFile( final String fname ) {
189                inputFile = getCSVParameter( fname );
190        }
191
192        /**
193         * 【TAG】出力ファイル名を指定します。
194         *
195         * @og.tag
196         * 出力ファイル名を指定します。
197         * 出力ファイルには、拡張子のみ(xls,ods等)を指定することもできます。
198         * この場合、出力ファイル名は、入力ファイル名と同じになります。(拡張子のみが変換される)
199         *
200         * @param       fname 出力ファイル名
201         */
202        public void setOutputFile( final String fname ) {
203                outputFile = nval( getRequestParameter( fname ),outputFile );
204        }
205
206        /**
207         * 【TAG】ドキュメント変換後、元のファイルを削除するかどうかを指定します(初期値:false[=削除しない])。
208         *
209         * @og.tag
210         * ドキュメント変換後、元のファイルを削除するかどうかを指定します。
211         * 初期値は、false(削除しない)です。
212         *
213         * @param       flag 元ファイルの削除 [true:する/false:しない]
214         */
215        public void setDelInput( final String flag ) {
216                delInput = nval( getRequestParameter( flag ),delInput );
217        }
218
219        /**
220         * このオブジェクトの文字列表現を返します。
221         * 基本的にデバッグ目的に使用します。
222         *
223         * @return このクラスの文字列表現
224         * @og.rtnNotNull
225         */
226        @Override
227        public String toString() {
228                return ToString.title( this.getClass().getName() )
229                                .println( "VERSION"             ,VERSION        )
230                                .println( "fileURL"             ,fileURL        )
231                                .println( "inputFile"   ,inputFile              )
232                                .println( "outputFile"  ,outputFile             )
233                                .println( "Other..."    ,getAttributes().getAttribute() )
234                                .fixForm().toString() ;
235        }
236}