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
117                final String directory = HybsSystem.url2dir( fileURL );
118                String[] input = new String[inputFile.length];
119                for( int i=0; i<input.length; i++ ) {
120                        input[i] = StringUtil.urlAppend( directory,inputFile[i] );
121                }
122                final String output = StringUtil.urlAppend( directory,outputFile );
123
124                // ドキュメント変換
125                DocConverter_OOO.convert( input, output );
126
127                if( delInput ) {
128                        for( int i=0; i<input.length; i++ ) {
129                                if( !( new File( input[i] ) ).delete() ) {
130                                        System.err.println( "入力ファイルの削除に失敗しました。file=[" + input[i] + "]" );
131                                }
132                        }
133                }
134
135                return EVAL_PAGE ;
136        }
137
138        /**
139         * タグリブオブジェクトをリリースします。
140         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
141         *
142         */
143        @Override
144        protected void release2() {
145                super.release2();
146                fileURL         = HybsSystem.sys( "FILE_URL" );
147                inputFile       = null;
148                outputFile      = null;
149                delInput        = false;
150        }
151
152        /**
153         * 【TAG】操作するファイルのディレクトリを指定します
154         *              (初期値:FILE_URL[={@og.value SystemData#FILE_URL}])。
155         *
156         * @og.tag
157         * この属性で指定されるディレクトリのファイルを操作します。
158         * 指定方法は、通常の fileURL 属性と同様に、先頭が、'/' (UNIX) または、2文字目が、
159         * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、
160         * (初期値:システム定数のFILE_URL[={@og.value SystemData#FILE_URL}])。
161         *
162         * @og.rev 6.4.2.1 (2016/02/05) URLの最後に、"/" を追加する処理を廃止。
163         *
164         * @param       url ファイルURL
165         * @see         org.opengion.hayabusa.common.SystemData#FILE_URL
166         */
167        public void setFileURL( final String url ) {
168                final String furl = nval( getRequestParameter( url ),null );
169                if( furl != null ) {
170                        fileURL = StringUtil.urlAppend( fileURL,furl );
171                }
172        }
173
174        /**
175         * 【TAG】入力ファイル名を指定します。
176         *
177         * @og.tag
178         * 入力ファイル名を指定します。
179         *
180         * 入力ファイルは、CSV形式で複数指定することができます。
181         * この場合、複数の入力ファイルをマージして出力を行います。
182         *
183         * ※現状は、ファイルのマージは、入力ファイルがExcelまたはCalcの場合のみ対応しています。
184         *   また、マージを行う場合、印刷範囲など、ドキュメントに関連する情報は、1つ目のファイルの
185         *   情報が使用されます。
186         *
187         * @param       fname 入力ファイル名
188         */
189        public void setInputFile( final String fname ) {
190                inputFile = getCSVParameter( fname );
191        }
192
193        /**
194         * 【TAG】出力ファイル名を指定します。
195         *
196         * @og.tag
197         * 出力ファイル名を指定します。
198         * 出力ファイルには、拡張子のみ(xls,ods等)を指定することもできます。
199         * この場合、出力ファイル名は、入力ファイル名と同じになります。(拡張子のみが変換される)
200         *
201         * @param       fname 出力ファイル名
202         */
203        public void setOutputFile( final String fname ) {
204                outputFile = nval( getRequestParameter( fname ),outputFile );
205        }
206
207        /**
208         * 【TAG】ドキュメント変換後、元のファイルを削除するかどうかを指定します(初期値:false[=削除しない])。
209         *
210         * @og.tag
211         * ドキュメント変換後、元のファイルを削除するかどうかを指定します。
212         * 初期値は、false(削除しない)です。
213         *
214         * @param       flag 元ファイルの削除 [true:する/false:しない]
215         */
216        public void setDelInput( final String flag ) {
217                delInput = nval( getRequestParameter( flag ),delInput );
218        }
219
220        /**
221         * このオブジェクトの文字列表現を返します。
222         * 基本的にデバッグ目的に使用します。
223         *
224         * @return このクラスの文字列表現
225         * @og.rtnNotNull
226         */
227        @Override
228        public String toString() {
229                return ToString.title( this.getClass().getName() )
230                                .println( "VERSION"             ,VERSION        )
231                                .println( "fileURL"             ,fileURL        )
232                                .println( "inputFile"   ,inputFile              )
233                                .println( "outputFile"  ,outputFile             )
234                                .println( "Other..."    ,getAttributes().getAttribute() )
235                                .fixForm().toString() ;
236        }
237}