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