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.fukurou.util;
017    
018    import java.io.File;
019    import java.io.FileFilter;
020    import java.util.List;
021    import java.util.ArrayList;
022    import java.util.Calendar;
023    import java.util.StringTokenizer;
024    
025    import java.util.regex.Pattern;
026    import java.util.regex.Matcher;
027    
028    /**
029     * HybsFileFilter.java は、è¤?•°の FileFilter をé?次実行すã‚?フィルタクラスですã?
030     *
031     * FileFilter インターフェースを継承しã?File クラスの listFiles(FileFilter) メソãƒ?ƒ‰に
032     * 渡すことができますã?
033     * Filterに設定されたè¤?•°のフィルタすべてをæº?�Ÿすå?合ã?時ã?み、accept(File pathname)
034     * メソãƒ?ƒ‰は、true を返しますã?
035     *
036     * こã?実è£??同期化されませんã€?
037     *
038     * @version  4.0
039     * @author   Kazuhiko Hasegawa
040     * @since    JDK5.0,
041     */
042    public final class HybsFileFilter implements FileFilter {
043            private final List<FileFilter> list = new ArrayList<FileFilter>();
044            private final boolean isUseDIR ;
045    
046            /**
047             * 引数に、ディレクトリの判定を行うかどã�?�‹を指定するコンストラクタですã?
048             * ここで、true を指定すると、ファイル、ディレクトリの両方に対して
049             * 処ç�?‚’実施しますã?
050             * ãƒ?‚£レクトリの判定ã?場合ã?acceptメソãƒ?ƒ‰で、false が返ると
051             * それ以下ã?処ç�?‚‚実行されませんã€?
052             *
053             * @og.rev 5.1.2.0 (2010/01/01) 引数つきコンストラクタ追åŠ?
054             *
055             * @param       useDIR  判定をãƒ?‚£レクトリでも行うかどã�?�‹
056             */
057            public HybsFileFilter( final boolean useDIR ) {
058                    super();
059                    isUseDIR = useDIR;
060            }
061    
062            /**
063             * æŒ?®šされた抽象パス名がパス名リストに含まれるå¿?¦�がある場合ã?スルー(選æŠ?されますã?
064             * ここでの判定ロジãƒ?‚¯では、ファイルにつã�?�¦のみ処ç�?�—ますã?
065             * ãƒ?‚£レクトリは、常に、true を返しますã?
066             */
067            public HybsFileFilter() {
068                    this( false );
069            }
070    
071            /**
072             * æŒ?®šされた抽象パス名がパス名リストに含まれるå¿?¦�がある場合ã?スルー(選æŠ?されますã?
073             * ここでの判定ロジãƒ?‚¯では、ファイルにつã�?�¦のみ処ç�?�—ますã?
074             * ãƒ?‚£レクトリは、常に、true を返しますã?
075             *
076             * @param       pathname        ファイルオブジェクãƒ?
077             *
078             * @return      パス名リストに含まれるかどã�?�‹
079             * @see java.io.FileFilter#accept(File)
080             */
081            public boolean accept( final File pathname ) {
082                    if( pathname != null && (pathname.isFile() || isUseDIR) ) {     // 5.1.2.0 (2010/01/01)
083                            int size = list.size();
084                            for( int i=0; i<size; i++ ) {
085                                    FileFilter filter = list.get(i);
086                                    if( !filter.accept( pathname ) ) {
087                                            return false;
088                                    }
089                            }
090                    }
091                    return true;
092            }
093    
094            /**
095             * 外部æŒ?®šフィルタ??å†?ƒ¨判定条件に、フィルタを追åŠ?�—ますã?
096             * 引数ã�?null の場合ã?、追åŠ?�—ませんã€?
097             *
098             * @param    filter 外部æŒ?®šフィルタ
099             */
100            public void addFileFilter( final FileFilter filter ) {
101                    if( filter != null ) { list.add( filter ); }
102            }
103    
104            /**
105             * å†?ƒ¨判定フィルタ??æŒ?®šされた接頭辞で始まるå?合ã?スルー(選æŠ?されますã?
106             * 引数ã�?null の場合ã?、追åŠ?�—ませんã€?
107             * 引数にã€?|' 区åˆ?‚Šæ–?­—でè¤?•°設定したå?合ã?、OR 判断(どれかがä¸??)しますã?
108             *
109             * @param    prefix 接頭è¾?
110             * @see java.lang.String#startsWith(String)
111             */
112            public void startsWith( final String prefix ) {
113                    startsWith( prefix, false );    // 反転しなã�?
114    //              if( prefix != null ) {
115    //                      list.add( new StartsWithFilter( prefix ) );
116    //              }
117            }
118    
119            /**
120             * å†?ƒ¨判定フィルタ??æŒ?®šされた接頭辞で始まるå?合ã?スルー(選æŠ?されますã?
121             * 引数ã�?null の場合ã?、追åŠ?�—ませんã€?
122             * 引数にã€?|' 区åˆ?‚Šæ–?­—でè¤?•°設定したå?合ã?、OR 判断(どれかがä¸??)しますã?
123             * reverse = true に設定すると、結果を反転させますã?
124             *
125             * @og.rev 5.1.2.0 (2010/01/01) reverse属æ?の追åŠ?
126             *
127             * @param    prefix             接頭è¾?
128             * @param    reverse    true:結果を反転する
129             * @see java.lang.String#startsWith(String)
130             */
131            public void startsWith( final String prefix,final boolean reverse ) {
132                    if( prefix != null ) {
133                            list.add( new StartsWithFilter( prefix,reverse ) );
134                    }
135            }
136    
137            /**
138             * æŒ?®šされた接頭辞で始まるå?合に選択される FileFilter インターフェースの実è£??部クラスですã?
139             * 引数にã€?|' 区åˆ?‚Šæ–?­—でè¤?•°設定したå?合ã?、OR 判断(どれかがä¸??)しますã?
140             *
141             * @og.rev 5.1.2.0 (2010/01/01) '|' 区åˆ?‚Šæ–?­—でè¤?•°設定å?ç�??追åŠ??reverse属æ?の追åŠ?
142             *
143             * @version  4.0
144             * @author   Kazuhiko Hasegawa
145             * @since    JDK5.0,
146             */
147            private static class StartsWithFilter implements FileFilter {
148    //              private final String pfix ;
149                    private final String[] pfix ;
150                    private final int      cnt  ;
151                    private final boolean  rvse ;
152    
153                    /**
154                     * 接頭辞フィルターオブジェクトを作æ?しますã?
155                     *
156                     * @param       desc    true:æ˜?? / false:降é?
157                     * @param       reverse true:結果を反転する
158                     */
159                    StartsWithFilter( final String prefix,final boolean reverse ) {
160    //                      pfix = prefix;
161                            rvse = reverse;
162    
163                            StringTokenizer token = new StringTokenizer( prefix, "|" );
164                            cnt = token.countTokens();
165    
166                            pfix = new String[cnt];
167    
168                            for( int i=0; i<cnt; i++ ) {
169                                    pfix[i] = token.nextToken();
170                            }
171                    }
172    
173                    /**
174                     * FileFilter インターフェースの accept( File ) メソãƒ?ƒ‰
175                     *
176                     * @param       pathname        ファイルオブジェクãƒ?
177                     * @return      true:処ç�?¯¾象 / false:処ç�?�ž対象
178                     * @see java.io.FileFilter#accept( File )
179                     */
180                    public boolean accept( final File pathname ) {
181    //                      return pathname.getName().startsWith( pfix );
182    
183                            for( int i=0; i<cnt; i++ ) {
184                                    if( pathname.getName().startsWith( pfix[i] ) ) {
185                                            return !rvse;
186                                    }
187                            }
188                            return rvse;
189                    }
190            }
191    
192            /**
193             * å†?ƒ¨判定フィルタ??æŒ?®šされた接頭辞で終わるå?合ã?スルー(選æŠ?されますã?
194             * 引数ã�?null の場合ã?、追åŠ?�—ませんã€?
195             * 引数にã€?|' 区åˆ?‚Šæ–?­—でè¤?•°設定したå?合ã?、OR 判断(どれかがä¸??)しますã?
196             *
197             * @param    suffix 接尾è¾?
198             * @see java.lang.String#endsWith(String)
199             */
200            public void endsWith( final String suffix ) {
201                    endsWith( suffix, false );      // 反転しなã�?
202    //              if( suffix != null ) {
203    //                      list.add( new EndsWithFilter( suffix ) );
204    //              }
205            }
206    
207            /**
208             * å†?ƒ¨判定フィルタ??æŒ?®šされた接頭辞で終わるå?合ã?スルー(選æŠ?されますã?
209             * 引数ã�?null の場合ã?、追åŠ?�—ませんã€?
210             * 引数にã€?|' 区åˆ?‚Šæ–?­—でè¤?•°設定したå?合ã?、OR 判断(どれかがä¸??)しますã?
211             * reverse = true に設定すると、結果を反転させますã?
212             *
213             * @og.rev 5.1.2.0 (2010/01/01) reverse属æ?の追åŠ?
214             *
215             * @param       suffix  接尾è¾?
216             * @param       reverse true:結果を反転する
217             * @see java.lang.String#endsWith(String)
218             */
219            public void endsWith( final String suffix,final boolean reverse ) {
220                    if( suffix != null ) {
221                            list.add( new EndsWithFilter( suffix,reverse ) );
222                    }
223            }
224    
225            /**
226             * æŒ?®šされた接頭辞で終わるå?合に選択される FileFilter インターフェースの実è£??部クラスですã?
227             * 引数にã€?|' 区åˆ?‚Šæ–?­—でè¤?•°設定したå?合ã?、OR 判断(どれかがä¸??)しますã?
228             *
229             * @og.rev 5.1.2.0 (2010/01/01) '|' 区åˆ?‚Šæ–?­—でè¤?•°設定å?ç�??追åŠ??reverse属æ?の追åŠ?
230             *
231             * @version  4.0
232             * @author   Kazuhiko Hasegawa
233             * @since    JDK5.0,
234             */
235            private static class EndsWithFilter implements FileFilter {
236    //              private final String sfix ;
237                    private final String[] sfix ;
238                    private final int      cnt  ;
239                    private final boolean  rvse ;
240    
241                    /**
242                     * 接頭辞フィルターオブジェクトを作æ?しますã?
243                     *
244                     * @param       desc    true:æ˜?? / false:降é?
245                     * @param       reverse true:結果を反転する
246                     */
247                    EndsWithFilter( String suffix,final boolean reverse ) {
248    //                      sfix = suffix;
249                            rvse = reverse;
250    
251                            StringTokenizer token = new StringTokenizer( suffix, "|" );
252                            cnt = token.countTokens();
253    
254                            sfix = new String[cnt];
255    
256                            for( int i=0; i<cnt; i++ ) {
257                                    sfix[i] = token.nextToken();
258                            }
259                    }
260    
261                    /**
262                     * FileFilter インターフェースの accept( File ) メソãƒ?ƒ‰
263                     *
264                     * @param       pathname        ファイルオブジェクãƒ?
265                     * @return      true:処ç�?¯¾象 / false:処ç�?�ž対象
266                     * @see java.io.FileFilter#accept( File )
267                     */
268                    public boolean accept( final File pathname ) {
269    //                      return pathname.getName().endsWith( sfix );
270    
271                            for( int i=0; i<cnt; i++ ) {
272                                    if( pathname.getName().endsWith( sfix[i] ) ) {
273                                            return !rvse;
274                                    }
275                            }
276                            return rvse;
277                    }
278            }
279    
280            /**
281             * å†?ƒ¨判定フィルタ??æŒ?®šされたæ–?­—å?がファイル名に含まれる場合ã?スルー(選æŠ?されますã?
282             * 引数ã�?null の場合ã?、追åŠ?�—ませんã€?
283             * 引数にã€?|' 区åˆ?‚Šæ–?­—でè¤?•°設定したå?合ã?、OR 判断(どれかがä¸??)しますã?
284             *
285             * @param    str æŒ?®šã?部åˆ?–‡字å?
286             */
287            public void instr( final String str ) {
288                    instr( str, false );    // 反転しなã�?
289    //              if( str != null ) {
290    //                      list.add( new InstrFilter( str ) );
291    //              }
292            }
293    
294            /**
295             * å†?ƒ¨判定フィルタ??æŒ?®šされたæ–?­—å?がファイル名に含まれる場合ã?スルー(選æŠ?されますã?
296             * 引数ã�?null の場合ã?、追åŠ?�—ませんã€?
297             * 引数にã€?|' 区åˆ?‚Šæ–?­—でè¤?•°設定したå?合ã?、OR 判断(どれかがä¸??)しますã?
298             * reverse = true に設定すると、結果を反転させますã?
299             *
300             * @og.rev 5.1.2.0 (2010/01/01) reverse属æ?の追åŠ?
301             *
302             * @param       str     æŒ?®šã?部åˆ?–‡字å?
303             * @param       reverse 結果を反転させるかどã�?�‹(true:反転)
304             */
305            public void instr( final String str,final boolean reverse ) {
306                    if( str != null ) {
307                            list.add( new InstrFilter( str,reverse ) );
308                    }
309            }
310    
311            /**
312             * æŒ?®šされたæ–?­—å?がファイル名に含まれる場合に選択される FileFilter インターフェースの実è£??部クラスですã?
313             * 引数にã€?|' 区åˆ?‚Šæ–?­—でè¤?•°設定したå?合ã?、OR 判断(どれかがä¸??)しますã?
314             *
315             * @og.rev 5.1.2.0 (2010/01/01) '|' 区åˆ?‚Šæ–?­—でè¤?•°設定å?ç�??追åŠ??reverse属æ?の追åŠ?
316             *
317             * @version  4.0
318             * @author   Kazuhiko Hasegawa
319             * @since    JDK5.0,
320             */
321            private static class InstrFilter implements FileFilter {
322    //              private final String instr ;
323                    private final String[] instr ;
324                    private final int      cnt  ;
325                    private final boolean  rvse ;
326    
327                    /**
328                     * æ–?­—å?åŒ?�«フィルターオブジェクトを作æ?しますã?
329                     *
330                     * @param       desc    true:æ˜?? / false:降é?
331                     * @param reverse       true:結果を反転する
332                     */
333                    InstrFilter( String str,final boolean reverse ) {
334    //                      instr = str;
335                            rvse = reverse;
336    
337                            StringTokenizer token = new StringTokenizer( str, "|" );
338                            cnt = token.countTokens();
339    
340                            instr = new String[cnt];
341    
342                            for( int i=0; i<cnt; i++ ) {
343                                    instr[i] = token.nextToken();
344                            }
345                    }
346    
347                    /**
348                     * FileFilter インターフェースの accept( File ) メソãƒ?ƒ‰
349                     *
350                     * @param       pathname        ファイルオブジェクãƒ?
351                     * @return      true:処ç�?¯¾象 / false:処ç�?�ž対象
352                     * @see java.io.FileFilter#accept( File )
353                     */
354                    public boolean accept( final File pathname ) {
355    //                      return ( pathname.getName().indexOf( instr ) >= 0 );
356    
357                            for( int i=0; i<cnt; i++ ) {
358                                    if( pathname.getName().indexOf( instr[i] ) >= 0 ) {
359                                            return !rvse;
360                                    }
361                            }
362                            return rvse;
363                    }
364            }
365    
366            /**
367             * å†?ƒ¨判定フィルタ??ファイル名がä¸??する場合ã?スルー(選æŠ?されますã?
368             * 大æ–?­—小文字ã?区別しませんã€?
369             * 引数ã�?null の場合ã?、追åŠ?�—ませんã€?
370             * 引数にã€?|' 区åˆ?‚Šæ–?­—でè¤?•°設定したå?合ã?、OR 判断(どれかがä¸??)しますã?
371             *
372             * @param    str ファイル名文字å?
373             */
374            public void fileEquals( final String str ) {
375                    fileEquals( str, false );       // 反転しなã�?
376    //              if( str != null ) {
377    //                      list.add( new EqualsFilter( str ) );
378    //              }
379            }
380    
381            /**
382             * å†?ƒ¨判定フィルタ??ファイル名がä¸??する場合ã?スルー(選æŠ?されますã?
383             * 大æ–?­—小文字ã?区別しませんã€?
384             * 引数ã�?null の場合ã?、追åŠ?�—ませんã€?
385             * 引数にã€?|' 区åˆ?‚Šæ–?­—でè¤?•°設定したå?合ã?、OR 判断(どれかがä¸??)しますã?
386             * reverse = true に設定すると、結果を反転させますã?
387             *
388             * @og.rev 5.1.2.0 (2010/01/01) reverse属æ?の追åŠ?
389             *
390             * @param    str ファイル名文字å?
391             * @param    reverse    true:結果を反転する
392             */
393            public void fileEquals( final String str,final boolean reverse ) {
394                    if( str != null ) {
395                            list.add( new EqualsFilter( str,reverse ) );
396                    }
397            }
398    
399            /**
400             * ファイル名がä¸??する場合に選択される FileFilter インターフェースの実è£??部クラスですã?
401             * 引数にã€?|' 区åˆ?‚Šæ–?­—でè¤?•°設定したå?合ã?、OR 判断(どれかがä¸??)しますã?
402             *
403             * @og.rev 5.1.2.0 (2010/01/01) '|' 区åˆ?‚Šæ–?­—でè¤?•°設定å?ç�??追åŠ??reverse属æ?の追åŠ?
404             *
405             * @version  4.0
406             * @author   Kazuhiko Hasegawa
407             * @since    JDK5.0,
408             */
409            private static class EqualsFilter implements FileFilter {
410    //              private final String eqstr ;
411                    private final String[] eqstr ;
412                    private final int      cnt  ;
413                    private final boolean  rvse ;
414    
415                    /**
416                     * ファイル名ä¸??フィルターオブジェクトを作æ?しますã?
417                     *
418                     * @param       desc    true:æ˜?? / false:降é?
419                     * @param reverse       true:結果を反転する
420                     */
421                    EqualsFilter( String str,final boolean reverse ) {
422    //                      eqstr = str;
423                            rvse = reverse;
424    
425                            StringTokenizer token = new StringTokenizer( str, "|" );
426                            cnt = token.countTokens();
427    
428                            eqstr = new String[cnt];
429    
430                            for( int i=0; i<cnt; i++ ) {
431                                    eqstr[i] = token.nextToken();
432                            }
433                    }
434    
435                    /**
436                     * FileFilter インターフェースの accept( File ) メソãƒ?ƒ‰
437                     *
438                     * @param       pathname        ファイルオブジェクãƒ?
439                     * @return      true:処ç�?¯¾象 / false:処ç�?�ž対象
440                     * @see java.io.FileFilter#accept( File )
441                     */
442                    public boolean accept( final File pathname ) {
443    //                      return pathname.getName().equalsIgnoreCase( eqstr );
444    
445                            for( int i=0; i<cnt; i++ ) {
446                                    if( pathname.getName().equalsIgnoreCase( eqstr[i] ) ) {
447                                            return !rvse;
448                                    }
449                            }
450                            return rvse;
451                    }
452            }
453    
454            /**
455             * å†?ƒ¨判定フィルタ??ファイル名が、指定された
456             * <a href="/java/api14/api/java/util/regex/Pattern.html#sum">正規表現</a>
457             * とä¸??する場合ã?スルー(選æŠ?されまã�?
458             * 大æ–?­—小文字ã?区別しませんã€?
459             * Pattern.compile( str,Pattern.CASE_INSENSITIVE ) ;
460             * pattern.matcher( pathname.getName() ).find() == true と同じ結果が得られますã?
461             * 引数ã�?null の場合ã?、追åŠ?�—ませんã€?
462             *
463             * @param    str ファイル名文字å?(正規表現)
464             * @see java.util.regex.Pattern#compile(String,int)
465             * @see java.util.regex.Matcher#find()
466             */
467            public void matches( final String str ) {
468                    matches( str, false );  // 反転しなã�?
469    //              if( str != null ) {
470    //                      list.add( new MatchesFilter( str ) );
471    //              }
472            }
473    
474            /**
475             * å†?ƒ¨判定フィルタ??ファイル名が、指定された
476             * <a href="/java/api14/api/java/util/regex/Pattern.html#sum">正規表現</a>
477             * とä¸??する場合ã?スルー(選æŠ?されまã�?
478             * 大æ–?­—小文字ã?区別しませんã€?
479             * Pattern.compile( str,Pattern.CASE_INSENSITIVE ) ;
480             * pattern.matcher( pathname.getName() ).find() == true と同じ結果が得られますã?
481             * 引数ã�?null の場合ã?、追åŠ?�—ませんã€?
482             * reverse = true に設定すると、結果を反転させますã?
483             *
484             * @og.rev 5.1.2.0 (2010/01/01) reverse属æ?の追åŠ?
485             *
486             * @param    str ファイル名文字å?(正規表現)
487             * @param    reverse    true:結果を反転する
488             * @see java.util.regex.Pattern#compile(String,int)
489             * @see java.util.regex.Matcher#find()
490             */
491            public void matches( final String str,final boolean reverse ) {
492                    if( str != null ) {
493                            list.add( new MatchesFilter( str,reverse ) );
494                    }
495            }
496    
497            /**
498             * ファイル名が、指定された正規表現とä¸??する場合に選択される FileFilter インターフェースの実è£??部クラスですã?
499             *
500             * @og.rev 5.1.2.0 (2010/01/01) reverse属æ?の追åŠ?
501             *
502             * @version  4.0
503             * @author   Kazuhiko Hasegawa
504             * @since    JDK5.0,
505             */
506            private static class MatchesFilter implements FileFilter {
507                    private final Pattern pattern ;
508                    private final boolean  rvse ;
509    
510                    /**
511                     * 正規表現ä¸??フィルターオブジェクトを作æ?しますã?
512                     *
513                     * @param       desc    true:æ˜?? / false:降é?
514                     * @param reverse       true:結果を反転する
515                     */
516                    MatchesFilter( final String str,final boolean reverse ) {
517                            pattern = Pattern.compile( str,Pattern.CASE_INSENSITIVE );
518                            rvse = reverse;
519                    }
520    
521                    /**
522                     * FileFilter インターフェースの accept( File ) メソãƒ?ƒ‰
523                     *
524                     * @param       pathname        ファイルオブジェクãƒ?
525                     * @return      true:処ç�?¯¾象 / false:処ç�?�ž対象
526                     * @see java.io.FileFilter#accept( File )
527                     */
528                    public boolean accept( final File pathname ) {
529                            Matcher match = pattern.matcher( pathname.getName() );
530    //                      return match.find() ;
531                            if( match.find() ) { return !rvse; }
532                            else { return rvse; }
533                    }
534            }
535    
536            /**
537             * å†?ƒ¨判定フィルタ??ファイル名が、指定された
538             * <a href="/java/api14/api/java/util/regex/Pattern.html#sum">正規表現</a>
539             * とä¸??しなã�??合ã?スルー(選æŠ?されますã?
540             * 大æ–?­—小文字ã?区別しませんã€?
541             * Pattern.compile( str,Pattern.CASE_INSENSITIVE ) ;
542             * pattern.matcher( pathname.getName() ).find() == false と同じ結果が得られますã?
543             * 引数ã�?null の場合ã?、追åŠ?�—ませんã€?
544             *
545             * @param    str ファイル名文字å?(正規表現) とマッチしなã�?
546             * @see java.util.regex.Pattern#compile(String,int)
547             * @see java.util.regex.Matcher#find()
548             */
549    //      public void unMatches( final String str ) {
550    //              if( str != null ) {
551    //                      list.add( new UnMatchesFilter( str ) );
552    //              }
553    //      }
554    
555            /**
556             * ファイル名が、指定された正規表現とä¸??しなã�??合に選択される FileFilter インターフェースの実è£??部クラスですã?
557             *
558             * @version  4.0
559             * @author   Kazuhiko Hasegawa
560             * @since    JDK5.0,
561             */
562    //      private static class UnMatchesFilter implements FileFilter {
563    //              private final Pattern pattern ;
564    //
565    //              /**
566    //               * 正規表現不ä¸??フィルターオブジェクトを作æ?しますã?
567    //               *
568    //               * @param       desc    true:æ˜?? / false:降é?
569    //               */
570    //              UnMatchesFilter( String str ) {
571    //                      pattern = Pattern.compile( str,Pattern.CASE_INSENSITIVE );
572    //              }
573    //
574    //              /**
575    //               * FileFilter インターフェースの accept( File ) メソãƒ?ƒ‰
576    //               *
577    //               * @param       pathname        ファイルオブジェクãƒ?
578    //               * @return      true:処ç�?¯¾象 / false:処ç�?�ž対象
579    //               * @see java.io.FileFilter#accept( File )
580    //               */
581    //              public boolean accept( final File pathname ) {
582    //                      Matcher match = pattern.matcher( pathname.getName() );
583    //                      return ! match.find() ;
584    //              }
585    //      }
586    
587            /**
588             * å†?ƒ¨判定フィルタ??æŒ?®šã?タイãƒ?‚¹タンプ以後に変更されてã�?‚‹場合ã?スルー(選æŠ?されますã?
589             * ãƒ?‚£レクトリは、ここã?判定では無視しますã?(å¿?�š true を返しまã�?
590             * 日付けのæŒ?®šに、YYYYMMDD 形式ã? ?˜文字数字文字å?以外にã€?
591             * TODAY ã‚?YESTERDAY なども使用できますã?
592             * TODAY は、実行日の 00:00:00 を基準時刻としã?YESTERDAY は、その前日になりますã?
593             * 引数ã�?null の場合ã?、追åŠ?�—ませんã€?
594             *
595             * @param    modify 時刻を表ã�?long 値(ミリ秒単ä½?
596             */
597            public void lastModified( final String modify ) {
598                    if( modify != null ) {
599                            list.add( new ModifyFileFilter( modify ) );
600                    }
601            }
602    
603            /**
604             * å†?ƒ¨判定フィルタ??æŒ?®šã?大きさより大きいファイルの場合ã?スルー(選æŠ?されますã?
605             * 引数ã�?0以ä¸?マイナス) の場合ã?、追åŠ?�—ませんã€?
606             *
607             * @param       len     ファイルの大きさ(Kバイト単ä½?。同値を含ã‚?
608             */
609            public void isLarger( final int len ) {
610                    if( len >= 0 ) {
611                            list.add( new IsLargerFilter( len ) );
612                    }
613            }
614    
615            /**
616             * æŒ?®šã?大きさより大きいファイルの場合に選択される FileFilter インターフェースの実è£??部クラスですã?
617             *
618             * @version  4.0
619             * @author   Kazuhiko Hasegawa
620             * @since    JDK5.0,
621             */
622            private static class IsLargerFilter implements FileFilter {
623                    private final long size ;
624    
625                    /**
626                     * 大きいファイルフィルターオブジェクトを作æ?しますã?
627                     *
628                     * @param       desc    true:æ˜?? / false:降é?
629                     */
630                    IsLargerFilter( int len ) {
631                            size = len ;
632                    }
633    
634                    /**
635                     * FileFilter インターフェースの accept( File ) メソãƒ?ƒ‰
636                     *
637                     * @param       pathname        ファイルオブジェクãƒ?
638                     * @return      true:処ç�?¯¾象 / false:処ç�?�ž対象
639                     * @see java.io.FileFilter#accept( File )
640                     */
641                    public boolean accept( final File pathname ) {
642                            return pathname.length() >= size;
643                    }
644            }
645    
646            /**
647             * å†?ƒ¨判定フィルタ??æŒ?®šã?大きさより小さã�?ƒ•ァイルの場合ã?スルー(選æŠ?されますã?
648             * 引数ã�?0以ä¸?マイナス) の場合ã?、追åŠ?�—ませんã€?
649             *
650             * @param    len ファイルの大きさ(Kバイト単ä½?。同値を含まなã�??
651             */
652            public void isSmaller( final int len ) {
653                    if( len >= 0 ) {
654                            list.add( new IsSmallerFilter( len ) );
655                    }
656            }
657    
658            /**
659             * æŒ?®šã?大きさより小さã�?ƒ•ァイルの場合選択される FileFilter インターフェースの実è£??部クラスですã?
660             *
661             * @version  4.0
662             * @author   Kazuhiko Hasegawa
663             * @since    JDK5.0,
664             */
665            private static class IsSmallerFilter implements FileFilter {
666                    private final long size ;
667    
668                    /**
669                     * 小さã�?ƒ•ァイルフィルターオブジェクトを作æ?しますã?
670                     *
671                     * @param       desc    true:æ˜?? / false:降é?
672                     */
673                    IsSmallerFilter( int len ) {
674                            size = len ;
675                    }
676    
677                    /**
678                     * FileFilter インターフェースの accept( File ) メソãƒ?ƒ‰
679                     *
680                     * @param       pathname        ファイルオブジェクãƒ?
681                     * @return      true:処ç�?¯¾象 / false:処ç�?�ž対象
682                     * @see java.io.FileFilter#accept( File )
683                     */
684                    public boolean accept( final File pathname ) {
685                            return pathname.length() < size;
686                    }
687            }
688    
689            /**
690             * こã?オブジェクトã?æ–?­—å?表現を返しますã?
691             * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
692             *
693             * @return こã?クラスのæ–?­—å?表現
694             */
695            @Override
696            public String toString() {
697                    StringBuilder buf = new StringBuilder();
698                    int size = list.size();
699                    for( int i=0; i<size; i++ ) {
700                            buf.append( "no[" ).append( i ).append( "]=" );
701                            buf.append( list.get(i) ).append( "\n" );
702                    }
703    
704                    return buf.toString();
705            }
706    }
707    
708    /**
709     * ModifyFileFilter.java は、最終変更日付けのフィルタークラスですã?
710     *
711     * FileFilter インターフェースを継承しã?コンストラクタでæŒ?®šã?日付けよりã‚?
712     * æœ?µ‚変更日付け が新しいファイルをã?選択しますã?
713     * こã?クラスでは、ディレクトリは、変更日付けに無関係に選択しますã?
714     *
715     * 日付けのæŒ?®šに、YYYYMMDD 形式ã? ?˜文字数字文字å?以外に、TODAY ã‚?YESTERDAY なども使用できますã?
716     * TODAY は、実行日の 00:00:00 を基準時刻としã?YESTERDAY は、その前日になりますã?
717     * バッチå?ç�?­‰で、前日åˆ??再編成や、å?月å?をå?編成するå?合に、実日付けを指定せずに
718     * 使用できますã?
719     *
720     * こã?実è£??同期化されませんã€?
721     *
722     * @version  4.0
723     * @author   Kazuhiko Hasegawa
724     * @since    JDK5.0,
725     */
726    class ModifyFileFilter implements FileFilter {
727            private final long modify ;
728    
729            /**
730             * コンストラクター
731             *
732             * 日付けのæŒ?®š方法には、実日付け(YYYYMMDD形å¼?例ï¼?0040323)と
733             * 仮想日付け(TODAY,YESTERDAY など)が指定できますã?
734             *
735             *     YYYYMMDD   YYYYMMDD形式ã?æŒ?®š日の 00:00:00 を基準時刻
736             *     TODAY      実行日の 00:00:00 を基準時刻
737             *     YESTERDAY  実行日前日の 00:00:00 を基準時刻
738             *     LAST_WEEK  実行日の先é?(7日å‰? 00:00:00 を基準時刻
739             *     MONTH      実行月の 1日 00:00:00 を基準時刻
740             *     LAST_MONTH 実行前月ã? 同日 00:00:00 を基準時刻
741             *     LAST_YEAR  実行前年の 同月同日 00:00:00 を基準時刻
742             *
743             * @og.rev 5.3.5.0 (2011/05/01) ?¢時」のクリアミスの修正
744             *
745             * @param value æŒ?®š日付け
746             */
747            public ModifyFileFilter( final String value ) {
748                    if( value != null ) {
749                            Calendar cal = Calendar.getInstance();
750    
751    //                      cal.clear( Calendar.HOUR_OF_DAY );
752                            cal.set( Calendar.HOUR_OF_DAY, 0 );             // 5.3.5.0 (2011/05/01) 時間の解決規則が適用されるためã??¢時」ã�?�‘は、setメソãƒ?ƒ‰で 0 にセãƒ?ƒˆするã€?
753                            cal.clear( Calendar.MINUTE );
754                            cal.clear( Calendar.SECOND );
755                            cal.clear( Calendar.MILLISECOND );
756    
757                            if( value.equalsIgnoreCase( "YESTERDAY" ) ) {
758                                    cal.add( Calendar.DATE, -1 );
759                            }
760                            else if( value.equalsIgnoreCase( "LAST_WEEK" ) ) {
761                                    cal.add( Calendar.DATE, -7 );
762                            }
763                            else if( value.equalsIgnoreCase( "MONTH" ) ) {
764                                    cal.set( Calendar.DATE, 1 );
765                            }
766                            else if( value.equalsIgnoreCase( "LAST_MONTH" ) ) {
767                                    cal.add( Calendar.MONTH, -1 );
768                            }
769                            else if( value.equalsIgnoreCase( "LAST_YEAR" ) ) {
770                                    cal.add( Calendar.YEAR, -1 );
771                            }
772                            else if( value.length() == 8 ) {
773                                    cal.set( Integer.parseInt( value.substring( 0,4 ) ) ,
774                                                     Integer.parseInt( value.substring( 4,6 ) ) - 1,
775                                                     Integer.parseInt( value.substring( 6,8 ) ) );
776                            }
777                            else if( ! value.equalsIgnoreCase( "TODAY" ) ) {
778                                    String errMsg = "ModifyFileFilter Error! modify Format [" + value + "]\n"
779                                                     + "日付けのæŒ?®š方法には、実日付け(YYYYMMDD形å¼?例ï¼?0040323)と \n"
780                                                     + "仮想日付け(TODAY,YESTERDAY など)が指定できますã?\n"
781                                                     + "    YYYYMMDD   YYYYMMDD形式ã?æŒ?®š日の 00:00:00 を基準時刻 \n"
782                                                     + "    TODAY      実行日の 00:00:00 を基準時刻 \n"
783                                                     + "    YESTERDAY  実行日前日の 00:00:00 を基準時刻 \n"
784                                                     + "    LAST_WEEK  実行日の先é?(7日å‰? 00:00:00 を基準時刻 \n"
785                                                     + "    MONTH      実行月の 1日 00:00:00 を基準時刻 \n"
786                                                     + "    LAST_MONTH 実行前月ã? 同日 00:00:00 を基準時刻 \n"
787                                                     + "    LAST_YEAR  実行前年の 同月同日 00:00:00 を基準時刻 \n" ;
788                                    throw new RuntimeException( errMsg );
789                            }
790                            modify = cal.getTimeInMillis() ;
791                    }
792                    else {
793                            throw new RuntimeException( "ModifyFileFilter Error! modify valus is not null" );
794                    }
795            }
796    
797            /**
798             * FileFilter インターフェースの accept( File ) メソãƒ?ƒ‰
799             *
800             * @param       file    ファイルオブジェクãƒ?
801             *
802             * @return      true:処ç�?¯¾象 / false:処ç�?�ž対象
803             * @see java.io.FileFilter#accept( File )
804             */
805            public boolean accept( final File file ) {
806                    return file.isDirectory() || ( file.lastModified() >= modify ) ;
807            }
808    }