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    }