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.hayabusa.taglib;
017    
018    import org.opengion.hayabusa.common.HybsSystem;
019    import org.opengion.hayabusa.common.HybsSystemException;
020    import org.opengion.hayabusa.db.DBTableModel;
021    import org.opengion.hayabusa.db.DBTableModelSorter;
022    import org.opengion.hayabusa.db.DBColumn;
023    import org.opengion.hayabusa.db.DBTableModelUtil;
024    import org.opengion.fukurou.util.StringUtil;
025    import org.opengion.fukurou.security.HybsCryptography ;         // 5.7.4.3 (2014/03/28)
026    
027    import static org.opengion.fukurou.util.StringUtil.nval ;
028    
029    import java.util.Arrays;
030    import java.util.List;
031    import java.util.ArrayList;
032    import java.io.File;
033    import java.io.FileFilter;
034    import java.io.ObjectOutputStream;
035    import java.io.ObjectInputStream;
036    import java.io.IOException;
037    
038    /**
039     * ファイルを検索しã?DBTableModel にセãƒ?ƒˆするタグですã?
040     *
041     * ファイルの検索結果は、[WRITABLE],LEVEL,FILE_TYPE,PARENT,NAME,LASTMODIFIED,FILE_LENGTH,RWH,[MD5],[TO_PARENT,TO_NAME],[?¥?¥?¥?¥]
042     * のカラãƒ?‚’持つ DBTableModel にセãƒ?ƒˆ されますã?こã?カラãƒ??、固定ですã?
043     * 並び替えにつã�?�¦は、このタグでæŒ?®šしますが、ファイルの選別(where 条件)はã€?
044     * BODY 部に記述する fileWhere タグでæŒ?®šしますã?(è¤?•°æŒ?®š可能))
045     *
046     * [カラãƒ?��]      検索するファイルの属æ?は、以下ã?カラãƒ?��で作æ?されますã?
047     *     [WRITABLE]       useWritable=trueで、å?頭カラãƒ?�«、WRITABLE カラãƒ?�Œ挿入されますã?
048     *      LEVEL           ãƒ?‚£レクトリを展開する場合ã?レベルã€?
049     *      FILE_TYPE       ファイル(F)かディレクトリ(D)であるか判定ã?
050     *      PARENT          こã?抽象パス名ã?親のパス名文字å?を返しますã?
051     *      NAME            こã?抽象パス名が示すファイルまたã?ãƒ?‚£レクトリの名前を返しますã?
052     *      LASTMODIFIED    æœ?¾Œに変更された時刻を返しますã?
053     *      FILE_LENGTH     ファイルの長さを返しますã?
054     *      RWH             読み込み、書き込みã€?š し属æ?をそれぞれã???w,h で表しますã?
055     *     [MD5]            useMD5=trueで、MD5 とã�?�†カラãƒ?‚’追åŠ?�—たうえで、ファイルのMD5計算を行いますã?
056     *     [TO_PARENT]      useUpdateClms=trueで、fileUpdateタグでCOPYやMOVEを行う時に使用するå¿??となるカラãƒ?TO_PARENT,TO_NAME)を追åŠ?�—ますã?
057     *     [TO_NAME]        同ä¸?
058     *     [?¥?¥?¥?¥]           addClms属æ?でæŒ?®šされたカラãƒ?‚’追åŠ?�—ますã?
059     *
060     * @og.formSample
061     * ●形式ï¼?lt;og:fileQuery from="…" multi="true/false" >
062     *             <og:fileWhere … />
063     *              …
064     *         </og:fileQuery>
065     * ●body?šあã‚?EVAL_BODY_BUFFERED:BODYを評価しã?{@XXXX} を解析しまã�?
066     *
067     * ●Tag定義??
068     *   <og:fileQuery
069     *       from             ○ã?TAG】検索を開始するファイルまたã?ãƒ?‚£レクトリを指定しまã�?å¿??)ã€?
070     *       multi              【TAG】多段階展開するかã??‘レベル展開するかどã�?�‹[true:多段éš?false:?‘レベル]を指定しまã�?初期値:false:?‘レベル)ã€?
071     *       level              【TAG】多段階展開するレベルを指定しまã�?初期値:100)ã€?
072     *       orderBy            【TAG】ソートするカラãƒ?��を指定しまã�?ä¸?�¤のみ)ã€?
073     *       desc               【TAG】表示é ?‚’é€?»¢するかどã�?�‹[true/false]を指定しまã�?初期値:false)ã€?
074     *       useWritable        【TAG】å?頭カラãƒ?�«、WRITABLE カラãƒ?‚’追åŠ?�™るかどã�?�‹[true/false]を指定しまã�?初期値:false)ã€?
075     *       useMD5             【TAG】MD5カラãƒ?‚’追åŠ?�—たうえで、MD5計算を行うかどã�?�‹[true/false]を指定しまã�?初期値:false)ã€?
076     *       useUpdateClms      【TAG】TO_PARENT、TO_NAMEカラãƒ?‚’追åŠ?�™るかどã�?�‹[true/false]を指定しまã�?初期値:false)ã€?
077     *       addClms            【TAG】検索結果のカラãƒ??に追åŠ?�™るカラãƒ?��をã?カンマ区åˆ?‚Šæ–?­—でæŒ?®šしますã?
078     *       fileType           【TAG】選択対象[FILE/DIR]を指定しますã?下位展開はè€??(multi 属æ?準拠)されますã?
079     *       addFrom            【TAG】from属æ?でæŒ?®šされた基準ファイル/フォルãƒ??体をリストに追åŠ?�™るかどã�?�‹[true/false]を指定しまã�?初期値:true)ã€?
080     *       command            【TAG】コマンãƒ?NEW,RENEW)をセãƒ?ƒˆしまã�?"NEW" と "RENEW" 時ã?み実行すã‚?初期値:NEW))ã€?
081     *       maxRowCount        【TAGã€?通常は使ã�?�¾せん)ãƒ??タのæœ?¤§読み込み件数を指定しまã�?(初期値:DB_MAX_ROW_COUNT[=1000])(0:[無制限])ã€?
082     *       displayMsg         【TAG】検索結果を画面上に表示するメãƒ?‚»ージリソースIDを指定しまã�?(初期値:VIEW_DISPLAY_MSG[=])v
083     *       overflowMsg        【TAG】検索ãƒ??タが最大検索数をオーバã?した場合に表示するメãƒ?‚»ージリソースIDを指定しまã�?(初期値:MSG0007[検索結果がã?制限行数をè¶?�ˆましたので、残りはカãƒ?ƒˆされました])ã€?
084     *       notfoundMsg        【TAG】検索結果がゼロ件の場合に表示するメãƒ?‚»ージリソースIDを指定しまã�?初期値:MSG0077[対象ãƒ??タはありませんでした])ã€?
085     *       tableId            【TAGã€?通常は使ã�?�¾せん)結果のDBTableModelをã?sessionに登録するときã?キーを指定しまã�?
086     *       scope              【TAG】キャãƒ?‚·ュする場合ã?スコープ[request/page/session/applicaton]を指定しまã�?初期値:session)ã€?
087     *       debug              【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)ã€?
088     *   >   ... Body ...
089     *   </og:fileQuery>
090     *
091     * ●使用ä¾?
092     *    ・ä¸?ˆ¬çš?�ª属æ?でファイルの検索を行いますã?
093     *         <og:fileQuery
094     *                from    = "d:/webapps/dbdef/jsp/"
095     *                multi   = "true"
096     *                command = "{@command}"  >
097     *            <og:fileWhere endWith=".jsp" />
098     *      </og:fileQuery>
099     *
100     *    ・æœ?µ‚変更日でé€??ソートするã?対象はã€?002/10/01 以降に変更されたファイルã€?
101     *        <og:fileQuery
102     *                from    = "d:/webapps/dbdef/jsp/"
103     *                multi   = "true"
104     *                orderBy = "LASTMODIFIED"
105     *                desc    = "true"
106     *                command = "{@command}"  >
107     *            <og:fileWhere lastModified="20021001000000" />
108     *        </og:fileQuery>
109     *
110     * @og.rev 4.0.0.0 (2005/01/31) å†?ƒ¨ロジãƒ?‚¯改å®?
111     * @og.group そã?他å?åŠ?
112     *
113     * @version  4.0
114     * @author       Kazuhiko Hasegawa
115     * @since    JDK5.0,
116     */
117    public class FileQueryTag extends QueryTag {
118            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
119            private static final String VERSION = "5.7.4.3 (2014/03/28)" ;
120    
121            private static final long serialVersionUID = 574320140328L ;
122    
123            private static final String[] SELECT =
124                                    new String[] { "LEVEL","FILE_TYPE","PARENT","NAME","LASTMODIFIED","FILE_LENGTH","RWH" };
125    
126            // 5.7.4.3 (2014/03/28) WRITABLE 対応ã?ため、固定ア??¾žレスを止めますã?
127    //      private static final int LEVEL                  = 0;
128    //      private static final int FILE_TYPE              = 1;
129    //      private static final int PARENT                 = 2;
130    //      private static final int NAME                   = 3;
131    //      private static final int LASTMODIFIED   = 4;
132    //      private static final int FILE_LENGTH    = 5;
133    //      private static final int RWH                    = 6;
134    
135            private static final String[] USE_UPDATE_CLM = new String[] { "TO_PARENT","TO_NAME" };  // 5.3.4.0 (2011/04/01)
136    
137            private transient FileFilter filter     = null;                                                 // FileWhere でæŒ?®šしたフィルター
138    
139            private boolean         multi                   = false;                                                // 下位層展開?Œラク??
140            private int                     level                   = 100;                                                  // 展開?šベï¾?
141            private String      from                        = HybsSystem.sys( "FILE_URL" ); // 検索起点?Œァ?²??
142            private String          orderBy                 = null;                                                 // 5.3.4.0 (2011/04/01) ソートカラãƒ?
143            private boolean         desc                    = false;                                                // 5.3.4.0 (2011/04/01) ソートã?方å�?true:é€??)
144            private String[]        addClms                 = new String[0];                                // 5.3.4.0 (2011/04/01) 追åŠ?‚«ラãƒ??åˆ?
145    //      private String[]        valClms                 = null;                                                 // 5.3.4.0 (2011/04/01) 追åŠ?‚«ラãƒ??列ã?初期値
146            private String[]        defClms                 = null;                                                 // 5.7.4.3 (2014/03/28) 初期値のカラãƒ??åˆ?
147            private String          fileType                = null;                                                 // 5.3.4.0 (2011/04/01) 選択対象を指å®?FILE,DIR)
148            private boolean         useWritable             = false;                                                // 5.7.4.3 (2014/03/28) 先é?カラãƒ?�«、WRITABLE カラãƒ?‚’追åŠ?�™るかどã�?�‹[true/false](初期値:false)
149            private boolean         useMD5                  = false;                                                // 5.7.4.3 (2014/03/28) MD5カラãƒ?‚’追åŠ?�—たうえで、MD5計算を行うかどã�?�‹[true/false](初期値:false)
150            private boolean         useUpdateClms   = false;                                                // 5.3.4.0 (2011/04/01) TO_PARENT、TO_NAMEカラãƒ?‚’追åŠ?true:追åŠ?
151            private boolean         addFrom                 = true;                                                 // 5.3.9.0 (2011/09/01) from属æ?でæŒ?®šされた基準ファイル/フォルãƒ??体をリストに追åŠ?�™るかどã�?�‹
152    
153            /**
154             * Taglibのタグ本体を処ç�?�™ã‚?doAfterBody() ã‚?オーバã?ライドしますã?
155             *
156             * @og.rev 5.3.4.0 (2011/04/01) æŒ?®šカラãƒ??ソートå?ç�?©Ÿè?追åŠ?
157             * @og.rev 5.3.5.0 (2011/05/01) æœ??のファイルが存在する場合ã?み、実行するã?
158             *
159             * @return      後続å?ç�??æŒ?¤º(SKIP_BODY)
160             */
161            @Override
162            public int doAfterBody() {
163                    executeCount = 0;
164    
165                    table = initDBTable();
166                    if( maxRowCount < 0 ) {
167                            maxRowCount     = sysInt( "DB_MAX_ROW_COUNT" ) ;
168                    }
169    
170    //              execute( new File( from ),0 ) ; // 5.3.5.0 (2011/05/01) å»?­¢
171    
172                    // 5.3.5.0 (2011/05/01) æœ??のファイルが存在する場合ã?み、実行するã?
173                    File fin = new File( from );
174                    if( fin.exists() ) {
175                            execute( fin,0 ) ;
176    
177                            // 5.3.4.0 (2011/04/01) æŒ?®šカラãƒ??ソートå?ç�?
178                            if( orderBy != null ) {
179                                    int clmNo = table.getColumnNo( orderBy );
180                                    DBTableModelSorter temp = new DBTableModelSorter();
181                                    temp.setModel( table );
182                                    temp.sortByColumn( clmNo,!desc );       // 注æ„?desc の値と ソート正é€??、反対ですã?
183                                    table = temp;
184                            }
185                    }
186    
187                    return(SKIP_BODY);
188            }
189    
190            /**
191             * タグリブオブジェクトをリリースしますã?
192             * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
193             *
194             * @og.rev 5.3.4.0 (2011/04/01) æŒ?®šカラãƒ??ソートå?ç�?©Ÿè?、カラãƒ?¿½åŠ?©Ÿè?、fileType追åŠ?
195             * @og.rev 5.3.9.0 (2011/09/01) addFrom属æ?追åŠ?
196             * @og.rev 5.7.4.3 (2014/03/28) useWritable,useMD5属æ?追åŠ??valClms ã‚?defClms に置き換えã?
197             */
198            @Override
199            protected void release2() {
200                    super.release2();
201                    multi                   = false;
202                    level                   = 100;
203                    from                    = HybsSystem.sys( "FILE_URL" );
204                    filter                  = null;
205                    orderBy                 = null;                         // 5.3.4.0 (2011/04/01) ソートカラãƒ?
206                    desc                    = false;                        // 5.3.4.0 (2011/04/01) 降é??Œラク??
207                    addClms                 = new String[0];        // 5.3.4.0 (2011/04/01) 追åŠ?‚«ラãƒ??åˆ?
208    //              valClms                 = null;                         // 5.3.4.0 (2011/04/01) 追åŠ?‚«ラãƒ??列ã?初期値
209                    defClms                 = null;                         // 5.7.4.3 (2014/03/28) 初期値のカラãƒ??åˆ?
210                    fileType                = null;                         // 5.3.4.0 (2011/04/01) 選択対象を指å®?FILE,DIR,ALL)
211                    useWritable             = false;                        // 5.7.4.3 (2014/03/28) 先é?カラãƒ?�«、WRITABLE カラãƒ?‚’追åŠ?�™るかどã�?�‹[true/false](初期値:false)
212                    useMD5                  = false;                        // 5.7.4.3 (2014/03/28) MD5カラãƒ?‚’追åŠ?�—たうえで、MD5計算を行うかどã�?�‹[true/false](初期値:false)
213                    useUpdateClms   = false;                        // 5.3.4.0 (2011/04/01) TO_PARENT、TO_NAMEカラãƒ?‚’追åŠ?true:追åŠ?
214                    addFrom                 = true;                         // 5.3.9.0 (2011/09/01) addFrom属æ?追åŠ?
215            }
216    
217            /**
218             * FileQuery を実行しますã?
219             *
220             * @og.rev 5.3.4.0 (2011/04/01) fileType の条件に合è?する場合だけã?ãƒ??タを作æ?するã€?
221             * @og.rev 5.3.7.0 (2011/07/01) フォルãƒ?�«アクセスできなã�??合ã?、null となるã?でそã?対å¿?
222             * @og.rev 5.3.9.0 (2011/09/01) addFrom属æ?追åŠ?
223             *
224             * @param       fin     検索を開始するファイル/ãƒ?‚£レクトリ
225             * @param       lvl     階層展開レベル
226             */
227            protected void execute( final File fin,final int lvl ) {
228                    if( ( !multi && lvl > 1 ) || lvl > level ) { return; }    // 階層展開する、しなã�?
229                    if( executeCount > maxRowCount ) { table.setOverflow( true ); return; }
230    
231                    boolean isDIR = fin.isDirectory();
232    
233                    if( fileType == null ||
234                            (  isDIR &&  "DIR".equalsIgnoreCase( fileType ) ) ||
235                            ( !isDIR && "FILE".equalsIgnoreCase( fileType ) ) ) {
236                                    if( addFrom || ( !addFrom && lvl > 0 ) ) {
237                                            addFileData( executeCount++,lvl,fin );
238                                    }
239                    }
240    //              if( fin.isDirectory() ) {
241                    if( isDIR ) {
242                            File[] list = fin.listFiles( filter );
243                            // 5.3.7.0 (2011/07/01) フォルãƒ?�«アクセスできなã�??合ã?、null となるã?
244                            if( list != null ) {
245                                    for( int i = 0; i < list.length; i++ ) {
246                                            execute( list[i],lvl+1 );
247                                    }
248                            }
249                    }
250            }
251    
252            /**
253             * 初期化された DBTableModel を返しますã?
254             *
255             * ここでは、useWritable、useMD5、useUpdateClms、addClms を加味した
256             * DBTableModel と初期値ãƒ??タ(defClms)を作æ?しますã?
257             * 以前ã?、TO_PARENT、TO_NAMEと、addClms åˆ??み初期値を持ってã�?�¾したがã?
258             * 5.7.4.3 (2014/03/28)で、å?頭カラãƒ??WRITABLEの初期値をã?DBColumn の初期値ではなã�?
259             * 手動設定するå¿?¦�がある為、すべてのカラãƒ??の初期値を持っておきますã?
260             *
261             * @og.rev 5.3.4.0 (2011/04/01) æŒ?®šカラãƒ?¿½åŠ?©Ÿè?追åŠ?
262             * @og.rev 5.7.4.3 (2014/03/28) useWritable,useMD5属æ?追åŠ?
263             *
264             * @return       ãƒ??ブルモãƒ?ƒ«
265             */
266            private DBTableModel initDBTable() {
267                    DBTableModel tbl = DBTableModelUtil.newDBTable();
268    
269                    // 5.7.4.3 (2014/03/28) 以下ã?処ç�??、ほぼ全面見直ã�?
270                    int size = SELECT.length ;                                                              // 基本カラãƒ??数
271                    if( useWritable   ) { size++ ; }                                                // WRITABLE カラãƒ?‚’追åŠ?
272                    if( useMD5        ) { size++ ; }                                                // MD5 カラãƒ?‚’追åŠ?
273                    if( useUpdateClms ) { size += USE_UPDATE_CLM.length; }  // TO_PARENT、TO_NAMEカラãƒ?‚’追åŠ?
274                    size += addClms.length ;                                                                // addClms(追åŠ?‚«ラãƒ?数を追åŠ?
275    
276                    // DBTableModel の初期化と、å?期å?配å?の確ä¿?
277                    tbl.init( size );
278                    defClms = new String[size];
279    
280                    int ad=0;
281                    // 先é?は、WRITABLE
282                    if( useWritable ) {
283                            DBColumn dbColumn = getDBColumn( "WRITABLE" );
284                            defClms[ad] = "1";                                                                      // WRITABLE を設定するときã?、とりあえず 書き込み許可
285                            tbl.setDBColumn( ad++,dbColumn );
286                    }
287    
288                    // SELECT の 基本カラãƒ??設定ã?(初期値は不è¦?
289                    for( int i=0; i<SELECT.length; i++ ) {
290                            DBColumn dbColumn = getDBColumn( SELECT[i] );
291                            tbl.setDBColumn( ad++,dbColumn );
292                    }
293    
294                    // MD5 カラãƒ?‚’追åŠ??
295                    if( useMD5 ) {
296                            DBColumn dbColumn = getDBColumn( "MD5" );
297                            defClms[ad] = "";                                                                       // ãƒ?‚£レクトリの場合ã?、MD5計算しませんã€?
298                            tbl.setDBColumn( ad++,dbColumn );
299                    }
300    
301                    // TO_PARENT、TO_NAMEカラãƒ?‚’追åŠ?
302                    if( useUpdateClms ) {
303                            for( int i=0; i<USE_UPDATE_CLM.length; i++ ) {
304                                    DBColumn dbColumn = getDBColumn( USE_UPDATE_CLM[i] );
305                                    defClms[ad] = dbColumn.getDefault();                    // 初期値を指定しておく
306                                    tbl.setDBColumn( ad++,dbColumn );
307                            }
308                    }
309    
310                    // 追åŠ?‚«ラãƒ??addClmsカラãƒ?‚’追åŠ?
311                    for( int i=0; i<addClms.length; i++ ) {
312                            DBColumn dbColumn = getDBColumn( addClms[i] );
313                            defClms[ad] = dbColumn.getDefault();                                    // 初期値を指定しておく
314                            tbl.setDBColumn( ad++,dbColumn );
315                    }
316    
317                    return tbl ;
318    
319    //              // TO_PARENT、TO_NAMEカラãƒ?‚’追åŠ?
320    //              int clmSize = addClms.length ;
321    //              if( useUpdateClms ) {
322    //                      if( clmSize == 0 ) {
323    //                              addClms = USE_UPDATE_CLM ;
324    //                      }
325    //                      else {
326    //                              // 追åŠ?‚«ラãƒ?�Œ存在する場合ã?、加算しますã?
327    //                              addClms = Arrays.copyOf( addClms ,clmSize + USE_UPDATE_CLM.length );    // JDK1.6
328    //                              for( int i=0; i<USE_UPDATE_CLM.length; i++ ) {
329    //                                      addClms[clmSize+i] = USE_UPDATE_CLM[i];
330    //                              }
331    //                      }
332    //              }
333    //              valClms = new String[addClms.length];
334    //
335    //              tbl.init( SELECT.length + addClms.length );
336    //              int ad=0;
337    //              for( int i=0; i<SELECT.length; i++ ) {
338    //                      DBColumn dbColumn = getDBColumn( SELECT[i] );
339    //                      tbl.setDBColumn( ad++,dbColumn );
340    //              }
341    //
342    //              for( int i=0; i<addClms.length; i++ ) {
343    //                      DBColumn dbColumn = getDBColumn( addClms[i] );
344    //                      valClms[i] = dbColumn.getDefault();                             // 初期値を指定しておく
345    //                      tbl.setDBColumn( ad++,dbColumn );
346    //              }
347    //
348    //              return tbl ;
349            }
350    
351            /**
352             * DBTableModel に、ファイルæƒ??をセãƒ?ƒˆしますã?
353             * ファイルæƒ??は、[WRITABLE],LEVEL,FILE_TYPE,PARENT,NAME,LASTMODIFIED,FILE_LENGTH,RWH,[MD5],[TO_PARENT,TO_NAME],[?¥?¥?¥?¥] ですã?
354             *
355             * useWritable=true の場合ã?先é?カラãƒ?�«、WRITABLE カラãƒ?‚’追åŠ?�—ますã?
356             * useMD5=true の場合ã?MD5カラãƒ?‚’追åŠ?�—たうえで、MD5計算を行いまã�?ファイルのみ計算しまã�?ã€?
357             * useUpdateClms=true の場å�?O_PARENT、TO_NAMEカラãƒ?‚’追åŠ?�—ますã?
358             * addClms でæŒ?®šされたカラãƒ?‚’そã?後ろに追åŠ?�—ますã?
359             *
360             * @og.rev 5.3.4.0 (2011/04/01) æŒ?®šカラãƒ?¿½åŠ?©Ÿè?追åŠ?
361             * @og.rev 5.7.4.3 (2014/03/28) useWritable,useMD5属æ?追åŠ?
362             *
363             * @param       rowNo   セãƒ?ƒˆする行番号
364             * @param       lvl     セãƒ?ƒˆするレベル
365             * @param       fin             ファイルæƒ??のå…?�¨なるファイルオブジェクãƒ?
366             */
367            private void addFileData( final int rowNo,final int lvl,final File fin ) {
368                    try {
369                            File file = fin.getCanonicalFile();
370    
371                            String rwh = ((file.canRead())?"r":"-" ) +
372                                                            ((file.canWrite())?"w":"-" ) +
373                                                            ((file.isHidden())?"h":"-" ) ;
374    
375                            String lastModified = HybsSystem.getDate( file.lastModified(),"yyyyMMddHHmmss" );
376    
377                            boolean isF = file.isFile();                                                            // File=true,それ以å¤?false
378    
379                            int size = table.getColumnCount() ;
380    //                      String[] data = new String[size];                                                       // 昔ながらの配å?コピã?
381    //                      System.arraycopy( defClms, 0, data, 0, size );
382                            String[] data = Arrays.copyOf( defClms,size );                          // JDK1.6
383    
384                            int ad=0;
385                            if( useWritable ) { ad++ ; }            // 単にひとつ進める。å?期å?はセãƒ?ƒˆ済みã€?
386    
387                            // SELECT の 基本カラãƒ??設å®?
388                            data[ad++] = String.valueOf( lvl ) ;                                            // LEVEL
389                            data[ad++] = (isF) ? "F" : "D" ;                                                        // FILE_TYPE
390                            data[ad++] = file.getParent() ;                                                         // PARENT
391                            data[ad++] = file.getName() ;                                                           // NAME
392                            data[ad++] = lastModified ;                                                                     // LASTMODIFIED
393                            data[ad++] = (isF) ? String.valueOf( file.length() ) : "" ;     // FILE_LENGTH
394                            data[ad++] = rwh ;                                                                                      // RWH
395    
396                            // MD5 カラãƒ?‚’追åŠ?ファイルの場合ã?み計算しまã�?
397                            if( useMD5 && isF ) {
398                                    data[ad++] = HybsCryptography.getMD5( file );
399                            }
400    
401                            // useUpdateClms=true 時ã? TO_PARENT、TO_NAMEカラãƒ?‚„、addClmsの追åŠ?‚«ラãƒ??、å?期å?のみセãƒ?ƒˆ
402                            // 初期値セãƒ?ƒˆは、Arrays.copyOf で、defClms のコピã?で完äº??
403    
404                            table.addColumnValues( data );
405    
406    //                      String[] data = new String[ SELECT.length + addClms.length ];   // 5.3.4.0 (2011/04/01) æŒ?®šカラãƒ?¿½åŠ?©Ÿè?
407    //                      data[LEVEL                      ] = String.valueOf( lvl ) ;
408    //                      data[FILE_TYPE          ] = (file.isFile())?"F":"D" ;
409    //                      data[PARENT                     ] = file.getParent() ;
410    //                      data[NAME                       ] = file.getName() ;
411    //                      data[LASTMODIFIED       ] = lastModified ;
412    //                      data[FILE_LENGTH        ] = String.valueOf( file.length() ) ;
413    //                      data[RWH                        ] = rwh ;
414    //
415    //                      // これ以降ã? data 配å?には、カラãƒ?‚ªブジェクトã?初期値を設定しておくã€?
416    //                      int ad = SELECT.length;
417    //                      for( int i=0; i<addClms.length; i++ ) {
418    //                              data[ad++] = valClms[i];
419    //                      }
420    
421    //                      table.addColumnValues( data );
422                    }
423                    catch( IOException ex ) {
424                            String errMsg = "正式なファイル名ã?取得に失敗しましたã€?" + fin + "]"
425                                                    + " ROW=[" + rowNo + "]"
426                                                    + HybsSystem.CR + ex.getMessage();
427                            throw new HybsSystemException( errMsg,ex );
428                    }
429            }
430    
431            /**
432             * 【TAG】ファイルの検索å…?�¨なるディレクトリを指定しますã?
433             *
434             * @og.tag ファイルの検索å…?�¨なるディレクトリを指定しますã?
435             *
436             * @og.rev 4.0.0.0 (2007/11/20) æŒ?®šされたãƒ?‚£レクトリ名ã?æœ?¾Œが"\"or"/"で終わってã�?�ªã�??合にã€?/"を付加するã€?
437             *
438             * @param       url ファイルの検索å…?�¨なるディレクトリ
439             */
440            public void setFrom( final String url ) {
441                    String furl = nval( getRequestParameter( url ),null );
442                    if( furl != null ) {
443                            char ch = furl.charAt( furl.length()-1 );
444                            if( ch != '/' && ch != '\\' ) { furl = furl + "/"; }
445                    }
446                    furl = StringUtil.urlAppend( from,furl );
447                    furl = StringUtil.urlAppend( furl,"." );
448    
449                    from = HybsSystem.url2dir( furl );
450            }
451    
452            /**
453             * 【TAG】多段階展開するかã??‘レベル展開するかどã�?�‹[true/false]を指定しまã�?初期値:false)ã€?
454             *
455             * @og.tag
456             * 初期値は、false (?‘レベル) ですã?
457             *
458             * @param       mlti 多段階展開するã�?[true:する/false:?‘レベル]
459             */
460            public void setMulti( final String mlti ) {
461                    multi = nval( getRequestParameter( mlti ),multi );
462            }
463    
464            /**
465             * 【TAG】多段階展開するレベルを指定しまã�?初期値:100)ã€?
466             *
467             * @og.tag
468             *
469             * @param       lvl 多段階展開するレベル
470             */
471            public void setLevel( final String lvl ) {
472                    level = nval( getRequestParameter( lvl ),level );
473            }
474    
475            /**
476             * 【TAG】ソートするカラãƒ?��を指定しまã�?ä¸?�¤のみ)ã€?
477             *
478             * @og.tag
479             * ソートするカラãƒ?��をã?"LEVEL","FILE_TYPE","PARENT","NAME","LASTMODIFIED","FILE_LENGTH","RWH"
480             * からä¸?�¤選びますã?
481             * これは、è¤?•°カラãƒ?�§のソートã?できませんã€?
482             * é€??にソートするå?合ã?、desc属æ?ã‚?true にセãƒ?ƒˆくださいã€?
483             * + をつけてもã?無効(カラãƒ?��がなã�?�¨ã�?�†ことでエラーになりますã?
484             *
485             * @og.rev 5.3.4.0 (2011/04/01) 新規追åŠ?
486             *
487             * @param       clm ソートするカラãƒ?��(ä¸?�¤のみ)ã€??é ??、ã?イナスを付けるã?
488             * @see         #setDesc( String )
489             */
490            public void setOrderBy( final String clm ) {
491                    orderBy = nval( getRequestParameter( clm ),orderBy );
492    
493                    if( orderBy != null && ! check( orderBy, SELECT ) ) {
494                            String errMsg = "æŒ?®šã? orderBy は、指定できませんã€? + HybsSystem.CR
495                                                            + "orderBy=[" + orderBy + "] "   + HybsSystem.CR
496                                                            + StringUtil.array2csv( SELECT ) + HybsSystem.CR ;
497    //                      throw new HybsSystemException( errMsg.toString() );
498                            throw new HybsSystemException( errMsg );
499                    }
500            }
501    
502            /**
503             * 【TAG】表示é ?‚’é€?»¢するかどã�?�‹[true/false]を指定しまã�?初期値:false)ã€?
504             *
505             * @og.tag
506             * orderBy 属æ?でæŒ?®šした表示é ?‚’ã€??é ?�«するかどã�?�‹を指定できますã?
507             * 初期値は、false (æ˜??) ですã?
508             *
509             * @og.rev 5.3.4.0 (2011/04/01) 新規追åŠ?
510             *
511             * @param       flag 表示é ?‚’é€?»¢するかどã�?�‹ [é€??:true/正é ?false]
512             * @see         #setOrderBy( String )
513             */
514            public void setDesc( final String flag ) {
515                    desc = nval( getRequestParameter( flag ),desc );
516            }
517    
518            /**
519             * 【TAG】å?頭カラãƒ?�«、WRITABLE カラãƒ?‚’追åŠ?�™るかどã�?�‹[true/false]を指定しまã�?初期値:false)ã€?
520             *
521             * @og.tag
522             * ファイル検索結果の?‘レコード単位に、書き込み許可/禁止属æ?を付けるにはã€?
523             * カラãƒ??の先é?に、WRITABLE カラãƒ?‚’追åŠ?�™るå¿?¦�がありますã?
524             * 初期値は、false (追åŠ?�—なã�? ですã?
525             *
526             * @og.rev 5.7.4.3 (2014/03/28) 新規追åŠ?
527             *
528             * @param       flag 先é?カラãƒ?�«、WRITABLE カラãƒ?‚’追åŠ?�™るかどã�?�‹[true:追åŠ?�™ã‚?false:追åŠ?�—ない]
529             */
530            public void setUseWritable( final String flag ) {
531                    useWritable = nval( getRequestParameter( flag ),useWritable );
532            }
533    
534            /**
535             * 【TAG】MD5カラãƒ?‚’追åŠ?�—たうえで、MD5計算を行うかどã�?�‹[true/false]を指定しまã�?初期値:false)ã€?
536             *
537             * @og.tag
538             * ファイルの改変等をチェãƒ?‚¯するには、ファイルのハッシュ値を拾ã�?¿?¦�がありますã?
539             * タイãƒ?‚¹タンプとサイズ??ASTMODIFIED,FILE_LENGTH?‰でもã?類似の処ç�??可能ですがã€?
540             * より、厳å¯?�ªä¸??をみるならã?MD5でハッシュした結果を突き合わせるのがã?ストですã?
541             * useMD5=true に設定すると、MD5 とã�?�†カラãƒ?‚’追åŠ?�—たうえで、MD5計算結果をセãƒ?ƒˆしますã?
542             * 初期値は、false (追åŠ?�—なã�? ですã?
543             *
544             * @og.rev 5.7.4.3 (2014/03/28) 新規追åŠ?
545             *
546             * @param       flag MD5カラãƒ?‚’追åŠ?�—たうえで、MD5計算を行うかどã�?�‹[true:追åŠ?�™ã‚?false:追åŠ?�—ない]
547             */
548            public void setUseMD5( final String flag ) {
549                    useMD5 = nval( getRequestParameter( flag ),useMD5 );
550            }
551    
552            /**
553             * 【TAG】TO_PARENT、TO_NAMEカラãƒ?‚’追åŠ?�™るかどã�?�‹[true/false]を指定しまã�?初期値:false)ã€?
554             *
555             * @og.tag
556             * fileUpdateタグでは、ファイルのCOPYやMOVEがå?来ますが、そのコピã?先ã?移動å?の
557             * ファイルを行ごとにæŒ?®šするå?合ã?TO_PARENT、TO_NAMEカラãƒ?�¨ã�?�†固定名のカラãƒ?�Œ
558             * å¿?¦�ですã?
559             * これをã?addClms 属æ?でæŒ?®šする代わりに、この属æ?で、true をセãƒ?ƒˆすることでã€?
560             * 自動的に追åŠ?�•れますã?
561             * 初期値は、false (追åŠ?�—なã�? ですã?
562             *
563             * @og.rev 5.3.4.0 (2011/04/01) 新規追åŠ?
564             *
565             * @param       flag TO_PARENT、TO_NAMEカラãƒ?‚’追åŠ?�™るかどã�?�‹ [true:追åŠ?�™ã‚?false:追åŠ?�—ない]
566             * @see         #setAddClms( String )
567             * @see         org.opengion.hayabusa.taglib.FileUpdateTag
568             */
569            public void setUseUpdateClms( final String flag ) {
570                    useUpdateClms = nval( getRequestParameter( flag ),useUpdateClms );
571            }
572    
573            /**
574             * 【TAG】検索結果のカラãƒ??に追åŠ?�™るカラãƒ?��をã?カンマ区åˆ?‚Šæ–?­—でæŒ?®šしますã?
575             *
576             * @og.tag
577             * ãƒ?ƒ•ォルトã?カラãƒ?��、[WRITABLE],LEVEL,FILE_TYPE,PARENT,NAME,LASTMODIFIED,FILE_LENGTH,RWH,[MD5],[TO_PARENT,TO_NAME]
578             * 以外に、指定ã?カラãƒ?��を追åŠ?�™ることが可能ですã?
579             * これは、ファイル検索結果以外ã?é ?›®を追åŠ?�—て、データベã?スに書き込ã‚??合に、利用できますã?
580             * 並びé ??、デフォルトカラãƒ??後ろに、指定ã?カラãƒ??é ?•ªで付きますã?
581             * ここで追åŠ?�—たカラãƒ?�«は、カラãƒ?ƒªソースの初期値がセãƒ?ƒˆされますã?
582             *
583             * @og.rev 5.3.4.0 (2011/04/01) 新規追åŠ?
584             *
585             * @param       clms 検索結果のカラãƒ??に追åŠ?�™るカラãƒ?��をã?カンマ区åˆ?‚Šæ–?­—でæŒ?®šしますã?
586             * @see         #setUseUpdateClms( String )
587             */
588            public void setAddClms( final String clms ) {
589                    String tmpClms = nval( getRequestParameter( clms ),null );
590    
591                    if( tmpClms != null && tmpClms.length() > 0 ) {
592                            addClms = StringUtil.csv2Array( tmpClms );
593                    }
594            }
595    
596            /**
597             * 【TAG】ファイル名が、指定されたファイルタイプ[DIR/FILE]とä¸??した場合ã?スルー(選æŠ?されますã?
598             * @og.tag
599             * 大æ–?­—小文字ã?区別しませんã€?
600             * ファイルタイãƒ?は、DIR,FILE が指定できますã?
601             * DIR は、ディレクトリのみ検索しますã?(階層下がりも行いまã�?
602             * FILEは、ファイルのみ検索しますã?(階層下がりも行いまã�?
603             * 引数ã�?null の場合ã?、追åŠ?�—ませんã€?つまりã?すべてスルーされますã?)
604             *
605             * @og.rev 5.3.4.0 (2011/04/01) fileType メソãƒ?ƒ‰で選択対象æŒ?®šã?追åŠ?
606             *
607             * @param    str æŒ?®šするファイルタイãƒ?DIR,FILE,null)
608             */
609            public void setFileType( final String str ) {
610                    String tmp = nval( getRequestParameter( str ),fileType );
611                    if( tmp == null                                         ||
612                            "DIR".equalsIgnoreCase( tmp )   ||
613                            "FILE".equalsIgnoreCase( tmp ) ) {
614                                    fileType = tmp;
615                    }
616                    else {
617                            // ファイルタイプに不正な値が設定された場合ã?、エラーになるã?
618                            String errMsg = "こã?、fileType 属æ?には、DIR,FILE 以外ã?æŒ?®šできませんã€?"
619                                                    + tmp + "]";
620                            throw new HybsSystemException( errMsg );
621                    }
622            }
623    
624            /**
625             * 【TAG】from属æ?でæŒ?®šされた基準ファイル/フォルãƒ??体をリストに追åŠ?�™るかどã�?�‹[true/false]を指定しまã�?初期値:true)ã€?
626             * @og.tag
627             * 初期値はtrue(追åŠ?�™ã‚?ですã?
628             *
629             * @og.rev 5.3.9.0 (2011/09/01) 新規作æ?
630             *
631             * @param    flg 基準ファイル/フォルãƒ??体をリストに追åŠ?�™るかどã�?�‹ true:追åŠ?�™ã‚?false:追åŠ?�—ない]
632             */
633            public void setAddFrom( final String flg ) {
634                    addFrom = nval( getRequestParameter( flg ),addFrom );
635            }
636    
637            /**
638             * FileFilterオブジェクトをセãƒ?ƒˆしますã?
639             * これは、BODY 部に登録した、FileWhereタグによって設定された
640             * ファイルフィルターですã?
641             *
642             * @param       filter  オブジェクãƒ?
643             */
644            protected void setFileFilter( final FileFilter filter ) {
645                    this.filter = filter;
646            }
647    
648            /**
649             * シリアライズ用のカスタãƒ?‚·リアライズ書き込みメソãƒ?ƒ‰
650             *
651             * @og.rev 4.0.0.0 (2006/09/31) 新規追åŠ?
652             * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
653             *
654             * @param       strm    ObjectOutputStreamオブジェクãƒ?
655             * @throws IOException  シリアライズに関する入出力エラーが発生したå?å�?
656             */
657            private void writeObject( final ObjectOutputStream strm ) throws IOException {
658                    strm.defaultWriteObject();
659            }
660    
661            /**
662             * シリアライズ用のカスタãƒ?‚·リアライズ読み込みメソãƒ?ƒ‰
663             *
664             * ここでは、transient 宣è¨?�•れたå†?ƒ¨変数のå†??初期化がå¿?¦�なフィールドã?み設定しますã?
665             *
666             * @og.rev 4.0.0.0 (2006/09/31) 新規追åŠ?
667             * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
668             *
669             * @param       strm    ObjectInputStreamオブジェクãƒ?
670             * @see #release2()
671             * @throws IOException  シリアライズに関する入出力エラーが発生したå?å�?
672             * @throws ClassNotFoundException       クラスを見つけることができなかったå?å�?
673             */
674            private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
675                    strm.defaultReadObject();
676            }
677    
678            /**
679             * こã?オブジェクトã?æ–?­—å?表現を返しますã?
680             * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
681             *
682             * @return こã?クラスのæ–?­—å?表現
683             */
684            @Override
685            public String toString() {
686                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
687                                    .println( "VERSION"             ,VERSION        )
688                                    .println( "multi"               ,multi  )
689                                    .println( "level"               ,level  )
690                                    .println( "from"                ,from   )
691                                    .fixForm().toString()
692                            + HybsSystem.CR
693                            + super.toString() ;
694            }
695    }