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     *      â‘?&lt;og:tableFilter classId="THUMBNAIL" keys="PATH_CLM,FILE_CLM" vals='"PATH,NMFILE"' /&gt;
075     *
076     *      ② &lt;og:tableFilter classId="THUMBNAIL" &gt;
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     *         &lt;/og:tableFilter&gt;
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    }