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.plugin.table;
017
018 import java.io.File;
019 import java.util.Locale;
020 import java.util.Map ;
021 import java.util.LinkedHashMap ;
022
023 import org.opengion.hayabusa.common.HybsSystemException;
024 import org.opengion.hayabusa.common.HybsSystem;
025 import org.opengion.hayabusa.db.AbstractTableFilter;
026 import org.opengion.hayabusa.db.DBTableModel;
027
028 import org.opengion.fukurou.util.ErrorMessage;
029 import org.opengion.fukurou.util.StringUtil;
030 import org.opengion.fukurou.util.ImageResizer;
031
032 /**
033 * TableFilter_THUMBNAIL は、TableFilter インターフェースを継承した、DBTableModel 処ç�?”¨の
034 * 実è£?‚¯ラスですã?
035 *
036 * ここでは、オリジナルファイルのサãƒ?ƒ�イルファイルを作æ?しますã?
037 * keys と vals にæŒ?®šするå?を以下に示しますã?
038 *
039 * <table border="1" frame="box" rules="all" >
040 * <caption>keys と vals にæŒ?®šするå?</caption>
041 * <tr><th>KEY </th><th>VAL </th><th>(å¿??) </th><th>初期値 </th><th>解説 </th></tr>
042 * <tr><td>PATH_CLM </td><td>å…?ƒ•ァイルのPATHカラãƒ?D </td><td>å¿?? </td><td> </td><td>å…?ƒ•ァイルのコンãƒ?‚ストパスが登録されてã�?‚‹カラãƒ?D </td></tr>
043 * <tr><td>FILE_CLM </td><td>å…?ƒ•ァイルのFILEカラãƒ?D </td><td>å¿?? </td><td> </td><td>å…?ƒ•ァイルのファイル名が登録されてã�?‚‹カラãƒ?D </td></tr>
044 * <tr><td>THUMB_CLM </td><td>サãƒ?ƒ�イルのカラãƒ?D </td><td> </td><td> </td><td>サãƒ?ƒ�イルのPATH/FILEが登録、またã?書き戻し用のカラãƒ?D </td></tr>
045 * <tr><td>THUMB_DIR </td><td>サãƒ?ƒ�イルの管ç�?ƒ•ォルãƒ? </td><td> </td><td>_thumb/</td><td>サãƒ?ƒ�イルを作æ?する中間管ç�?ƒ•ォルãƒ?�� </td></tr>
046 * <tr><td>THUMB_SUFIX</td><td>サãƒ?ƒ�イルの拡張å? </td><td> </td><td>AUTO </td><td>サãƒ?ƒ�イルの拡張子をæŒ?®šしますã?AUTOは、å?のままですã? </td></tr>
047 * <tr><td>OVERWRITE </td><td>上書きするかどã�?�‹ </td><td> </td><td>false </td><td>サãƒ?ƒ�イルを作æ?する時ã?上書きするかどã�?�‹を指定しますã? </td></tr>
048 * <tr><td>MAX_SIZE </td><td>サãƒ?ƒ�イルのæœ?¤§ピクセル数 </td><td> </td><td>128 </td><td>サãƒ?ƒ�イルを作æ?する時ã?画像ファイルの大きさ。比率はキープされますã? </td></tr>
049 * </table>
050 *
051 * 【解説ã€?
052 * ?‘.PATH_CLM ??FILE_CLMのカラãƒ??の値がã?å…?ƒ•ァイルのコンãƒ?‚ストパス以下ã?ファイルのアドレスになりますã?
053 * ?’.サãƒ?ƒ�イルは通常、å?フォルãƒ?�«管ç�?ƒ•ォルãƒ?‚’作æ?しã?そã?下に、å?ファイルと同じ名前のサãƒ?ƒ�イルファイルを作æ?しますã?
054 * つまりã?PATH_CLM ??THUMB_DIR ??FILE_CLM ??拡張子が、サãƒ?ƒ�イルのファイル名になりますã?
055 * ?“.THUMB_SUFIX を指定したå?合ã?、サãƒ?ƒ�イルの拡張子を変更できますã?初期値は、AUTOですã?
056 * AUTOの場合ã?、å?ファイルと同じ拡張子が使われますã?自åˆ?�§æŒ?®šするå?合ã?、拡張子違ã�??å…?ƒ•ァイルがあれã?重è¤?�—ますã?で注意がå¿?¦�ですã?
057 * ?”.サãƒ?ƒ�イルを作æ?できるのは、bmp/jpeg/png/gif/tif ã�?�‘ですã?それ以外ã?ファイルにつã�?�¦は、ICONレンãƒ?ƒ©ー等を使用して、è?åˆ?�§サãƒ?ƒ�イル表示するようにして下さã�??
058 * ただしã?å°?�¥çš?�«は、xls/ppt/doc/pdf などの主要なファイルフォーマットã?サãƒ?ƒ�イルは作æ?したã�?�¨è€?�ˆてã�?�¾すã?
059 * ?•.THUMB_CLM にサãƒ?ƒ�イルのファイル名が記述されてã�?‚‹場合ã?そã?名前でサãƒ?ƒ�イルを作æ?しますã?こã?ときã?OVERWRITE=true の場合ã?、既存ファイルの有無に関係なã�?
060 * 上書き(å?作æ??‰されますã?OVERWRITE=false(初期値)の場合ã?、すでに存在してã�?‚Œば、そのままとしますã?
061 * ?–.THUMB_CLM にサãƒ?ƒ�イルのファイル名が記述されてã�?�ªã�??合ã?、標準ã?ファイル名でサãƒ?ƒ�イルを作æ?して、THUMB_CLMカラãƒ?�«書き戻しますã?
062 * こã?場合ã?既存ファイルの有無に関係なくã?上書き(å?作æ??‰されますã?
063 * ?—.THUMB_CLM が指定されてã�?�ªã�??合ã?、カラãƒ?�«書き戻しå?ç�?‚’行いませんã€??–.と同じで、書き戻しを行いませんã€?
064 * ?˜.MAX_SIZE は、サãƒ?ƒ�イルを作æ?する場合ã?縦、横のæœ?¤§ピクセルに、縮小されますã?比率は変わりません。これã?物ç�?š„なサãƒ?ƒ�イルファイルのサイズですã?
065 *
066 * なおã?ドキュメント管ç�?³»で、è?動スキャン取込みで、ファイルã‚?ƒ•ォルãƒ??先é?に、アンãƒ??バã?がつã�?�¦ã�?‚‹場合ã?、スキャン対象から外しますã?
067 * ドキュメントシスãƒ?ƒ から見た場合ã?ã€?š しファイルの扱ã�?�§すã?サãƒ?ƒ�イルもã?ãƒ?ƒ•ォルトでは、アンãƒ??バã?付ã?フォルãƒ?�«作æ?しますã?
068 * これは、è?動スキャンで、サãƒ?ƒ�イルのサãƒ?ƒ�イルを作æ?することを避ける意味合いもありますã?
069 * またã?サãƒ?ƒ�イルのä¸?‹¬削除などに都合が良ã�?�¨思いますã?
070 *
071 * パラメータは、tableFilterタグの keys, vals にそれぞれ記述するかã?BODY 部にCSS形式で記述しますã?
072 * @og.formSample
073 * ●形式ï¼?
074 * â‘?<og:tableFilter classId="THUMBNAIL" keys="PATH_CLM,FILE_CLM" vals='"PATH,NMFILE"' />
075 *
076 * ② <og:tableFilter classId="THUMBNAIL" >
077 * {
078 * PATH_CLM : å…?ƒ•ァイルのPATHカラãƒ?D (å¿??) å…?ƒ•ァイルのコンãƒ?‚ストパスが登録されてã�?‚‹カラãƒ?D
079 * FILE_CLM : å…?ƒ•ァイルのFILEカラãƒ?D (å¿??) å…?ƒ•ァイルのファイル名が登録されてã�?‚‹カラãƒ?D
080 * THUMB_CLM : サãƒ?ƒ�イルのカラãƒ?D サãƒ?ƒ�イルのPATH/FILEが登録、またã?書き戻し用のカラãƒ?D
081 * THUMB_DIR : サãƒ?ƒ�イルの管ç�?ƒ•ォルãƒ? 初期値 _thumb/ サãƒ?ƒ�イルを作æ?する中間管ç�?ƒ•ォルãƒ?��
082 * THUMB_SUFIX : サãƒ?ƒ�イルの拡張å? 初期値 AUTO AUTOはå…?�¨同じ拡張子を使ã�?�¾すã?
083 * OVERWRITE : 上書きするかどã�?�‹ 初期値 false サãƒ?ƒ�イルを作æ?する時ã?上書きするかどã�?�‹を指定しますã?
084 * MAX_SIZE : サãƒ?ƒ�イルのæœ?¤§ピクセル数 初期値 128 サãƒ?ƒ�イルを作æ?する時ã?画像ファイルの大きさ。比率はキープされますã?
085 * }
086 * </og:tableFilter>
087 *
088 * @og.rev 5.6.5.1 (2013/06/14) 新規追åŠ?
089 * @og.rev 5.6.6.0 (2013/07/05) keys の整合æ?チェãƒ?‚¯を追åŠ?
090 *
091 * @version 0.9.0 2000/10/17
092 * @author Kazuhiko Hasegawa
093 * @since JDK1.1,
094 */
095 public class TableFilter_THUMBNAIL extends AbstractTableFilter {
096 //* こã?プログラãƒ??VERSIONæ–?—å?を設定しますã? {@value} */
097 private static final String VERSION = "5.6.6.1 (2013/07/12)" ;
098
099 private static final String REAL_PATH = HybsSystem.sys( "REAL_PATH" );
100
101 /**
102 * keys の整合æ?チェãƒ?‚¯を行うための初期設定を行いますã?
103 *
104 * @og.rev 5.6.6.1 (2013/07/12) keys の整合æ?チェãƒ?‚¯対å¿?
105 *
106 * @param keysMap keys の整合æ?チェãƒ?‚¯を行うための Map
107 */
108 @Override
109 protected void init( final Map<String,String> keysMap ) {
110 keysMap.put( "PATH_CLM" , "å…?ƒ•ァイルのPATHカラãƒ?D (å¿??)" );
111 keysMap.put( "FILE_CLM" , "å…?ƒ•ァイルのFILEカラãƒ?D (å¿??)" );
112 keysMap.put( "THUMB_CLM" , "サãƒ?ƒ�イルのカラãƒ?D" );
113 keysMap.put( "THUMB_DIR" , "サãƒ?ƒ�イルの管ç�?ƒ•ォルãƒ? (初期値 _thumb/)" );
114 keysMap.put( "THUMB_SUFIX" , "サãƒ?ƒ�イルの拡張å? (初期値 AUTO)" ); // 5.6.6.1 (2013/07/12)
115 keysMap.put( "OVERWRITE" , "上書きするかどã�?�‹ (初期値 false" );
116 keysMap.put( "MAX_SIZE" , "サãƒ?ƒ�イルのæœ?¤§ピクセル数 (初期値 128" );
117 }
118
119 /**
120 * DBTableModel処ç�?‚’実行しますã?
121 *
122 * @og.rev 5.6.6.1 (2013/07/12) THUMB_SUFIXを追åŠ?
123 *
124 * @return 処ç�?µ�果のDBTableModel
125 */
126 public DBTableModel execute() {
127 DBTableModel table = getDBTableModel(); // 5.5.2.6 (2012/05/25) インターフェースにgetterメソãƒ?ƒ‰追åŠ?
128
129 String path_clm = StringUtil.nval( getValue( "PATH_CLM" ) , null ); // å¿??é ?›®
130 String file_clm = StringUtil.nval( getValue( "FILE_CLM" ) , null ); // å¿??é ?›®
131 String thumb_clm = StringUtil.nval( getValue( "THUMB_CLM" ) , null ); // なければ、å?戻しをしなã�??
132 String thumb_dir = StringUtil.nval( getValue( "THUMB_DIR" ) , "_thumb/" ); // サãƒ?ƒ�イルフォルãƒ?
133 String thumb_sufix = StringUtil.nval( getValue( "THUMB_SUFIX" ) , "AUTO" ); // 5.6.6.1 (2013/07/12) サãƒ?ƒ�イルの拡張å?
134 boolean isOverwrite = StringUtil.nval( getValue( "OVERWRITE" ) , false ); // サãƒ?ƒ�イルの再作æ?有無
135 int max_size = StringUtil.nval( getValue( "MAX_SIZE" ) , 128 );
136
137 int path_clmNo = table.getColumnNo( path_clm , true ); // 存在しなã�??合ã?、エラー
138 int file_clmNo = table.getColumnNo( file_clm , true ); // 存在しなã�??合ã?、エラー
139 int thumb_clmNo = table.getColumnNo( thumb_clm , false ); // 存在しなã�??合ã?ã€?1 を返すã€?
140
141 ErrorMessage errMessage = null;
142 int rowCnt = table.getRowCount();
143 for( int row=0; row<rowCnt; row++ ) {
144 try {
145 // オリジナルのファイルを構築しますã?
146 String pathClmVal = table.getValue( row,path_clmNo );
147 String fileClmVal = table.getValue( row,file_clmNo );
148 File orgFile = new File( StringUtil.urlAppend( REAL_PATH , pathClmVal ),fileClmVal ); // オリジナルファイルå�?
149 if( !orgFile.exists() ) {
150 // String errMsg = "å…?ƒ•ァイルが存在しませんã€?" + orgFile.toString() + "]" ; // ファイルがなければエラー
151 // throw new RuntimeException( errMsg );
152 continue; // 5.6.6.0 (2013/07/05) なければ無è¦?
153 }
154
155 // â‘?サãƒ?ƒ�イル作æ?対象の拡張子ã?場合ã?み処ç�?�—ますã?よって、sufix は存在することが保障されますã?
156 if( ImageResizer.isReaderSuffix( fileClmVal ) ) {
157 // サãƒ?ƒ�イルのファイルを構築しますã?
158 File thumbFile = null;
159 String thumbClmVal = null;
160 if( thumb_clmNo >= 0 ) {
161 thumbClmVal = table.getValue( row,thumb_clmNo );
162 if( thumbClmVal != null && thumbClmVal.length() > 0 ) { // サãƒ?ƒ�イルファイル名がæŒ?®šされた場å�?
163 thumbFile = new File( REAL_PATH , thumbClmVal );
164 if( !isOverwrite && thumbFile.exists() ) { continue; } // ファイルが存在した場合ã?、å?ç�?�—なã�?
165 }
166 else {
167 thumbClmVal = null;
168 }
169 }
170
171 // â‘?1 thumbClmVal が未定義(=null)の場合ã?、è?åˆ?�§ファイル名を構築すã‚?
172 if( thumbClmVal == null ) {
173 // å…?ƒ•ァイルの拡張子を取り出しますã?(小文字化も行いますã?)
174 String sufix = ImageResizer.getSuffix( fileClmVal );
175 String thumbName = fileClmVal ;
176 // 5.6.6.1 (2013/07/12) サãƒ?ƒ�イルの拡張å?
177 if( ! "AUTO".equalsIgnoreCase( thumb_sufix ) ) { // AUTO以外がæŒ?®šされた場å�?
178 thumbName = fileClmVal.substring( 0,fileClmVal.length()-sufix.length() ) + thumb_sufix ;
179 }
180 // 5.6.6.1 (2013/07/12) 拡張子が bmp の場合ã?、png に置き換えã?しなã�??
181 // if( "bmp".equalsIgnoreCase( sufix ) ) {
182 // thumbName = fileClmVal.substring( 0,fileClmVal.length()-3 ) + "png" ; // 拡張子が bmp の場合ã?、png に置き換えますã?
183 // }
184
185 thumbClmVal = StringUtil.urlAppend( pathClmVal,thumb_dir,thumbName ); // サãƒ?ƒ�イルのアドレス/ファイルå�?
186 thumbFile = new File( REAL_PATH , thumbClmVal );
187
188 if( thumb_clmNo >= 0) {
189 table.setValueAt( thumbClmVal,row,thumb_clmNo ); // サãƒ?ƒ�イルファイル名ã?書き戻ã�?
190 }
191 }
192
193 // サãƒ?ƒ�イル保存å?のãƒ?‚£レクトリ作æ?
194 File parent = thumbFile.getParentFile();
195 if( !parent.exists() && !parent.mkdirs() ) {
196 String errMsg = "サãƒ?ƒ�イル保存å?のãƒ?‚£レクトリ作æ?に失敗しました。file=[" + parent.toString() + "]";
197 throw new HybsSystemException( errMsg );
198 }
199
200 // 実際のサãƒ?ƒ�イルの作æ?処ç�?
201 ImageResizer imgRes = new ImageResizer( orgFile.getAbsolutePath() ); // 変換å…??ファイルå�?
202 imgRes.resizeByPixel( thumbFile.getAbsolutePath() , max_size ); // 変換先ã?ファイル名と画像ã?大きさ
203 }
204 }
205 catch( RuntimeException ex ) {
206 if( errMessage == null ) { errMessage = makeErrorMessage( "TableFilter_THUMBNAIL Error",ErrorMessage.NG ); }
207 errMessage.addMessage( row+1,ErrorMessage.NG,ex.getMessage() );
208 }
209 }
210
211 return table;
212 }
213 }