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