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 }