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    }