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 }