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; 019 020import org.opengion.hayabusa.common.HybsSystemException; 021import org.opengion.hayabusa.common.HybsSystem; 022import org.opengion.hayabusa.db.AbstractTableFilter; 023import org.opengion.hayabusa.db.DBTableModel; 024 025import org.opengion.fukurou.util.ErrorMessage; 026import org.opengion.fukurou.util.StringUtil; 027import org.opengion.fukurou.util.ImageResizer; 028import org.opengion.fukurou.util.ImageUtil; // 6.0.2.3 (2014/10/10) ImageUtil 使用 029 030/** 031 * TableFilter_THUMBNAIL は、TableFilter インターフェースを継承した、DBTableModel 処理用の 032 * 実装クラスです。 033 * 034 * ここでは、オリジナルファイルのサムネイルファイルを作成します。 035 * keys と vals に指定する値を以下に示します。 036 * 037 * <table class="plain"> 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 ; 077 * FILE_CLM : NMFILE ; 078 * } 079 * </og:tableFilter> 080 * 081 * @og.rev 5.6.5.1 (2013/06/14) 新規追加 082 * @og.rev 5.6.6.0 (2013/07/05) keys の整合性チェックを追加 083 * 084 * @version 0.9.0 2000/10/17 085 * @author Kazuhiko Hasegawa 086 * @since JDK1.1, 087 */ 088public class TableFilter_THUMBNAIL extends AbstractTableFilter { 089 /** このプログラムのVERSION文字列を設定します。 {@value} */ 090 private static final String VERSION = "6.5.0.1 (2016/10/21)" ; 091 092 private static final String REAL_PATH = HybsSystem.sys( "REAL_PATH" ); 093 094 /** 095 * デフォルトコンストラクター 096 * 097 * @og.rev 6.4.1.1 (2016/01/16) keysMap を、サブクラスから設定させるように変更。 098 */ 099 public TableFilter_THUMBNAIL() { 100 super(); 101 initSet( "PATH_CLM" , "元ファイルのPATHカラムID (必須)" ); 102 initSet( "FILE_CLM" , "元ファイルのFILEカラムID (必須)" ); 103 initSet( "THUMB_CLM" , "サムネイルのカラムID" ); 104 initSet( "THUMB_DIR" , "サムネイルの管理フォルダ (初期値 _thumb/)" ); 105 initSet( "THUMB_SUFIX" , "サムネイルの拡張子 (初期値 AUTO)" ); // 5.6.6.1 (2013/07/12) 106 initSet( "OVERWRITE" , "上書きするかどうか (初期値 false" ); 107 initSet( "MAX_SIZE" , "サムネイルの最大ピクセル数 (初期値 128" ); 108 } 109 110 /** 111 * DBTableModel処理を実行します。 112 * 113 * @og.rev 5.6.6.1 (2013/07/12) THUMB_SUFIXを追加 114 * @og.rev 6.0.2.3 (2014/10/10) ImageResizer → ImageUtil に変更 115 * @og.rev 6.5.0.1 (2016/10/21) ErrorMessage をまとめるのと、直接 Throwable を渡します。 116 * 117 * @return 処理結果のDBTableModel 118 */ 119 public DBTableModel execute() { 120 final DBTableModel table = getDBTableModel(); // 5.5.2.6 (2012/05/25) インターフェースにgetterメソッド追加 121 122 final String path_clm = StringUtil.nval( getValue( "PATH_CLM" ) , null ); // 必須項目 123 final String file_clm = StringUtil.nval( getValue( "FILE_CLM" ) , null ); // 必須項目 124 final String thumb_clm = StringUtil.nval( getValue( "THUMB_CLM" ) , null ); // なければ、値戻しをしない。 125 final String thumb_dir = StringUtil.nval( getValue( "THUMB_DIR" ) , "_thumb/" ); // サムネイルフォルダ 126 final String thumb_sufix = StringUtil.nval( getValue( "THUMB_SUFIX" ) , "AUTO" ); // 5.6.6.1 (2013/07/12) サムネイルの拡張子 127 final boolean isOverwrite = StringUtil.nval( getValue( "OVERWRITE" ) , false ); // サムネイルの再作成有無 128 final int max_size = StringUtil.nval( getValue( "MAX_SIZE" ) , 128 ); 129 130 final int path_clmNo = table.getColumnNo( path_clm , true ); // 存在しない場合は、エラー 131 final int file_clmNo = table.getColumnNo( file_clm , true ); // 存在しない場合は、エラー 132 final int thumb_clmNo = table.getColumnNo( thumb_clm , false ); // 存在しない場合は、-1 を返す。 133 134 ErrorMessage errMessage = null; 135 final int rowCnt = table.getRowCount(); 136 for( int row=0; row<rowCnt; row++ ) { 137 try { 138 // オリジナルのファイルを構築します。 139 final String pathClmVal = table.getValue( row,path_clmNo ); 140 final String fileClmVal = table.getValue( row,file_clmNo ); 141 final File orgFile = new File( StringUtil.urlAppend( REAL_PATH , pathClmVal ),fileClmVal ); // オリジナルファイル名 142 if( !orgFile.exists() ) { 143 // final String errMsg = "元ファイルが存在しません。[" + orgFile.toString() + "]" ; // ファイルがなければエラー 144 // throw new OgRuntimeException( errMsg ); 145 continue; // 5.6.6.0 (2013/07/05) なければ無視 146 } 147 148 // ① サムネイル作成対象の拡張子の場合のみ処理します。よって、sufix は存在することが保障されます。 149 if( ImageUtil.isReaderSuffix( fileClmVal ) ) { // 6.0.2.3 (2014/10/10) ImageResizer → ImageUtil に変更 150 // サムネイルのファイルを構築します。 151 File thumbFile = null; 152 String thumbClmVal = null; 153 if( thumb_clmNo >= 0 ) { 154 thumbClmVal = table.getValue( row,thumb_clmNo ); 155 if( thumbClmVal != null && thumbClmVal.length() > 0 ) { // サムネイルファイル名が指定された場合 156 thumbFile = new File( REAL_PATH , thumbClmVal ); 157 if( !isOverwrite && thumbFile.exists() ) { continue; } // ファイルが存在した場合は、処理しない 158 } 159 else { 160 thumbClmVal = null; 161 } 162 } 163 164 // ①-1 thumbClmVal が未定義(=null)の場合は、自分でファイル名を構築する 165 if( thumbClmVal == null ) { 166 // 元ファイルの拡張子を取り出します。(小文字化も行います。) 167 final String sufix = ImageUtil.getSuffix( fileClmVal ); // 6.0.2.3 (2014/10/10) ImageResizer → ImageUtil に変更 168 // 6.3.9.1 (2015/11/27) Found 'DD'-anomaly for variable(PMD) 169 final String thumbName = "AUTO".equalsIgnoreCase( thumb_sufix ) ? fileClmVal : fileClmVal.substring( 0,fileClmVal.length()-sufix.length() ) + thumb_sufix ; 170 171 thumbClmVal = StringUtil.urlAppend( pathClmVal,thumb_dir,thumbName ); // サムネイルのアドレス/ファイル名 172 thumbFile = new File( REAL_PATH , thumbClmVal ); 173 174 if( thumb_clmNo >= 0) { 175 table.setValueAt( thumbClmVal,row,thumb_clmNo ); // サムネイルファイル名の書き戻し 176 } 177 } 178 179 // サムネイル保存先のディレクトリ作成 180 final File parent = thumbFile.getParentFile(); 181 if( !parent.exists() && !parent.mkdirs() ) { 182 final String errMsg = "サムネイル保存先のディレクトリ作成に失敗しました。file=[" + parent.toString() + "]"; 183 throw new HybsSystemException( errMsg ); 184 } 185 186 // 実際のサムネイルの作成処理 187 final ImageResizer imgRes = new ImageResizer( orgFile.getAbsolutePath() ); // 変換元のファイル名 188 imgRes.resizeByPixel( thumbFile.getAbsolutePath() , max_size ); // 変換先のファイル名と画像の大きさ 189 } 190 } 191 catch( final RuntimeException ex ) { 192 // 6.5.0.1 (2016/10/21) ErrorMessage をまとめるのと、直接 Throwable を渡します。 193 if( errMessage == null ) { errMessage = makeErrorMessage( "TableFilter_THUMBNAIL Error",ErrorMessage.NG ); } 194 errMessage.addMessage( row+1,ErrorMessage.NG,"THUMBNAIL" ) 195 .addMessage( ex ); 196 } 197 } 198 199 return table; 200 } 201}