    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 * ●形式：&lt;og:docConvert fileURL="…" inputFile="…" outputFile="…" /&gt;
    048 * ●body：なし
    049 *
    050 * ●Tag定義：
    051 *   &lt;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 *   /&gt;
    058 *
    059 * ●使用例
    060 *    ・Calc(ods)ファイルをPDFに変換
    061 *        &lt;og:docConvert inputFile="temp.ods" outputFile="out.pdf" /&gt;
    062 *
    063 *    ・Excel(xls)ファイルを連結
    064 *        &lt;og:docConvert inputFile="temp1.xls,temp2.xls" outputFile="out.xls" /&gt;
    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) または、２文字目が、
    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}