/*
 * Copyright (c) 2009 The openGion Project.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 * either express or implied. See the License for the specific language
 * governing permissions and limitations under the License.
 */
package org.opengion.fukurou.util;

// import org.opengion.fukurou.system.DateSet ;						// 6.8.0.0 (2017/06/02)
import org.opengion.fukurou.system.OgRuntimeException ;				// 6.4.2.0 (2016/01/29)
import static org.opengion.fukurou.system.HybsConst.CR;				// 6.1.0.0 (2014/12/26) refactoring
import static org.opengion.fukurou.system.HybsConst.BUFFER_MIDDLE;	// 6.1.0.0 (2014/12/26) refactoring

import java.io.File;
import java.io.FileFilter;
import java.util.List;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.StringTokenizer;
import java.util.Locale;											// 6.3.1.1 (2015/07/10)
import java.util.Arrays;											// 6.8.0.0 (2017/06/02)
import java.util.function.BiPredicate;								// 7.2.6.0 (2020/06/30)
import java.util.regex.Pattern;
// import java.util.regex.Matcher;

/**
 * HybsFileFilter.java は、複数の FileFilter を順次実行する フィルタクラスです。
 *
 * FileFilter インターフェースを継承し、File クラスの listFiles(FileFilter) メソッドに
 * 渡すことができます。
 * Filterに設定された複数のフィルタすべてを満たす場合の時のみ、accept(File pathname)
 * メソッドは、true を返します。
 *
 * ※ 6.3.1.1 (2015/07/10)
 *    各フィルター登録時に、自分自身を返す、メソッドチェーンに対応します。
 *    大文字/小文字の区別なしで判定する、(ignoreCase=true)属性を追加します。
 *    大文字小文字は、すべての文字判定型フィルターに適用されます。
 *
 * ※ 6.4.0.2 (2015/12/11)
 *    prefix,suffix,instr,equals に、("|"で複数指定可) の説明をJavaDocに追加。
 *    useDIR 属性に、onlyパラメータを追加[false:File/true:File+Dir/only:Dir]。
 * ※ 7.2.6.0 (2020/06/30)
 *    useDIR 属性は廃止。
 *
 * この実装は同期化されません。
 *
 * @og.rev 6.3.1.1 (2015/07/10) メソッドチェーン化と、大文字/小文字の区別なし(ignoreCase=true)対応
 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
 *
 * @version  7.2
 * @author   Kazuhiko Hasegawa
 * @since    JDK11.0,
 */
public final class HybsFileFilter implements FileFilter {

//	private static final boolean IS_DIR  = true;
//	private static final boolean IS_FILE = !IS_DIR;

	private final List<FileFilter> listF = new ArrayList<>();	// 7.2.6.0 (2020/06/30) ﾌｧｲﾙ判定用
	private final List<FileFilter> listD = new ArrayList<>();	// 7.2.6.0 (2020/06/30) ﾃﾞｨﾚｸﾄﾘ判定用
//	private final boolean isUseFile ;		// 6.4.0.2 (2015/12/11) useDIR 属性に、onlyパラメータを追加[false:File/true:File+Dir/only:Dir]。
//	private final boolean isUseDIR  ;		// 7.2.6.0 (2020/06/30) useDIR 属性 廃止

	private final boolean ignoreCase ;		// 6.3.1.1 (2015/07/10) 大文字/小文字の区別[true:しない/false:する]
	private final boolean notEquals	;		// 6.8.0.0 (2017/06/02) 判定結果を反転させて処理します。

	/**
	 * 指定された抽象パス名がパス名リストに含まれる必要がある場合、スルー(選択)されます。
	 * ここでの判定ロジックでは、ファイルについてのみ処理します。
	 * ディレクトリは、常に、true を返します。
	 * notEquals 属性で、判定結果を反転させることができます。
	 *
	 * ignoreCase の初期値は、大文字/小文字の区別しない(true)です。
	 *
	 * @og.rev 6.3.1.1 (2015/07/10) 大文字/小文字の区別[true:しない/false:する]
	 * @og.rev 6.4.0.2 (2015/12/11) useDIR 属性に、onlyパラメータを追加します[false:File/true:File+Dir/only:Dir]。
	 * @og.rev 6.8.0.0 (2017/06/02) 判定結果を反転させて処理する notEquals 属性を追加します。
	 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
	 */
	public HybsFileFilter() {
//		this( "false" , true , false );		// 6.8.0.0 (2017/06/02)
		this( true , false );				// 7.2.6.0 (2020/06/30) useDIR 属性 廃止
	}

	/**
	 * 引数に、ディレクトリの判定を行うかどうかを指定するコンストラクタです。
	 * ここで、true を指定すると、ファイル、ディレクトリの両方に対して
	 * 処理を実施します。
	 * ディレクトリの判定の場合、acceptメソッドで、false が返ると
	 * それ以下の処理も実行されません。
	 *
	 * @og.rev 5.1.2.0 (2010/01/01) 引数つきコンストラクタ追加
	 * @og.rev 6.3.1.1 (2015/07/10) 大文字/小文字の区別[true:しない/false:する]
	 * @og.rev 6.4.0.2 (2015/12/11) useDIR 属性に、onlyパラメータを追加します[false:File/true:File+Dir/only:Dir]。
	 * @og.rev 6.8.0.0 (2017/06/02) 判定結果を反転させて処理する notEquals 属性を追加します。
	 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
	 *
//	 * @param	useDIR		判定対象を指定します[false:File/true:File+Dir/only:Dir]。
	 * @param	ignoreCase	大文字/小文字の区別[true:しない/false:する]
	 */
//	public HybsFileFilter( final String useDIR , final boolean ignoreCase ) {
//		this( useDIR , ignoreCase , false );		// 6.8.0.0 (2017/06/02)
	public HybsFileFilter( final boolean ignoreCase ) {
		this( ignoreCase , false );					// 7.2.6.0 (2020/06/30) useDIR 属性 廃止
	}

	/**
	 * 引数に、ディレクトリの判定を行うかどうかを指定するコンストラクタです。
	 * ここで、true を指定すると、ファイル、ディレクトリの両方に対して
	 * 処理を実施します。
	 * ディレクトリの判定の場合、acceptメソッドで、false が返ると
	 * それ以下の処理も実行されません。
	 *
	 * @og.rev 5.1.2.0 (2010/01/01) 引数つきコンストラクタ追加
	 * @og.rev 6.3.1.1 (2015/07/10) 大文字/小文字の区別[true:しない/false:する]
	 * @og.rev 6.4.0.2 (2015/12/11) useDIR 属性に、onlyパラメータを追加します[false:File/true:File+Dir/only:Dir]。
	 * @og.rev 6.8.0.0 (2017/06/02) 判定結果を反転させて処理する notEquals 属性を追加します。
	 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
	 *
//	 * @param	useDIR		判定対象を指定します[false:File/true:File+Dir/only:Dir]。
	 * @param	ignoreCase	大文字/小文字の区別[true:しない/false:する]
	 * @param	notEquals	判定結果を反転させて処理するかどうか[true:反転する/false:通常]
	 */
//	public HybsFileFilter( final String useDIR , final boolean ignoreCase , final boolean notEquals ) {
	public HybsFileFilter( final boolean ignoreCase , final boolean notEquals ) {		// 7.2.6.0 (2020/06/30) useDIR 属性 廃止
		super();

		this.ignoreCase = ignoreCase;		// 6.3.1.1 (2015/07/10)
		this.notEquals  = notEquals;		// 6.8.0.0 (2017/06/02)

//		// 7.2.6.0 (2020/06/30) useDIR 属性 廃止
//		// 6.4.0.2 (2015/12/11) useDIR 属性に、onlyパラメータを追加[false:File/true:File+Dir/only:Dir]。
//		isUseDIR  = "true".equalsIgnoreCase( useDIR ) || "only".equalsIgnoreCase( useDIR ) ;
//		// 6.8.0.0 (2017/06/02) only 以外にします。(nullも許容します。)
//		isUseFile = !"only".equalsIgnoreCase( useDIR );
	}

	/**
	 * 指定された抽象パス名がパス名リストに含まれる必要がある場合、スルー(選択)されます。
	 * ここでの判定ロジックでは、ファイルについてのみ処理します。
	 * ディレクトリは、常に、true を返します。
	 *
	 * @og.rev 6.4.0.2 (2015/12/11) useDIR 属性に、onlyパラメータを追加します[false:File/true:File+Dir/only:Dir]。
	 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
	 *
	 * @param	pathname	ファイルオブジェクト
	 *
	 * @return	パス名リストに含まれるかどうか
	 * @see java.io.FileFilter#accept(File)
	 */
	public boolean accept( final File pathname ) {
		if( pathname != null ) {
			// 7.2.6.0 (2020/06/30) ﾌｧｲﾙﾁｪｯｸとﾃﾞｨﾚｸﾄﾘﾁｪｯｸを分ける。
			final List<FileFilter> list = pathname.isFile() ? listF : listD ;
			for( final FileFilter filter : list ) {
				if( !filter.accept( pathname ) ) {
					return false;
				}
			}
		}
		return true;

		// 7.2.6.0 (2020/06/30) useDIR 属性 廃止
//		if( pathname != null && (pathname.isFile() && isUseFile || pathname.isDirectory() && isUseDIR) ) {	// 6.4.0.2 (2015/12/11)
//			final int size = list.size();
//			for( int i=0; i<size; i++ ) {
//				final FileFilter filter = list.get(i);
//				if( !filter.accept( pathname ) ) {
//					return false;
//				}
//			}
//		}
//		return true;
	}

//	/**
//	 * 外部指定フィルタ： 内部判定条件に、フィルタを追加します。
//	 * 引数が null の場合は、追加しません。
//	 *
//	 * @og.rev 6.3.1.1 (2015/07/10) 自分自身を返します。
//	 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
//	 *
//	 * @param	filter 外部指定フィルタ
//	 * @param	isDir	ディレクトリ判定を[true:行う/false:行わない]
//	 * @return	自分自身(this)
//	 */
//	public HybsFileFilter addFileFilter( final FileFilter filter, final boolean isDir ) {
////		if( filter != null ) { list.add( filter ); }
//		if( filter != null ) {
//			if( isDir ) { listD.add( filter ); }
//			else {		  listF.add( filter ); }
//		}
//		return this;		// 6.3.1.1 (2015/07/10)
//	}

	/**
	 * 指定された接頭辞で始まる場合に選択される FileFilter インターフェースの実装内部クラスです。
	 * 引数に、'|' 区切り文字で複数設定した場合は、OR 判断(どれかが一致)します。
	 *
	 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
	 *
	 * @version  7.2
	 * @author   Kazuhiko Hasegawa
	 * @since    JDK11.0,
	 */
	private static final class DefaultFilter implements FileFilter {
		private final String[] tkens ;
		private final int      cnt  ;
		private final boolean  rvse ;
		private final boolean  igCase ;		// 6.3.1.1 (2015/07/10)

		private BiPredicate<String,String> biPred = (nm,tkn) -> true;	// 初期値

		/**
		 * 接頭辞フィルターオブジェクトを作成します。
		 *
		 * @param	tokens	判定のキーワード("|"で複数指定可)
		 * @param	reverse	true:結果を反転する
		 * @param	ignoreCase	大文字/小文字の区別[true:しない/false:する]
		 */
		DefaultFilter( final String tokens,final boolean reverse,final boolean ignoreCase ) {
			rvse		= reverse;
			igCase		= ignoreCase;		// 6.3.1.1 (2015/07/10)

			final StringTokenizer token = new StringTokenizer( tokens, "|" );
			cnt = token.countTokens();

			tkens = new String[cnt];
			for( int i=0; i<cnt; i++ ) {
				// 6.3.1.1 (2015/07/10) ignoreCase 対応
				final String tkn = token.nextToken();
				tkens[i] = igCase ? tkn.toLowerCase( Locale.JAPAN ) : tkn ;
			}
		}

		/**
		 * 関数型インタフェースをセットします。
		 *
		 * ﾌｧｲﾙ/ﾌｫﾙﾀﾞ名称と判定のｷｰﾜｰﾄﾞの2つの引数を持つBiPredicateインターフェースをセットします。
		 *
		 * @param	biPred	関数型インタフェース
		 * @see java.util.function.BiPredicate
		 */
		public void setPred( final BiPredicate<String,String> biPred ) {
			this.biPred = biPred;
		}

		/**
		 * FileFilter インターフェースの accept( File ) メソッド。
		 *
		 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
		 *
		 * @param	pathname	ファイルオブジェクト
		 * @return	true:処理対象 / false:処理非対象
		 * @see java.io.FileFilter#accept( File )
		 */
		public boolean accept( final File pathname ) {
//			if( pathname.isFile() && !isDir || pathname.isDirectory() && isDir ) {
			if( biPred != null ) {
				final String org  = pathname.getName() ;
				final String name = igCase ? org.toLowerCase( Locale.JAPAN ) : org ;
				for( int i=0; i<cnt; i++ ) {
					if( biPred.test( name,tkens[i] ) ) {
						return !rvse;					// true ^ rvse
					}
				}
			}
			return rvse;								// false ^ rvse
		}

		/**
		 * このオブジェクトの文字列表現を返します。
		 * 基本的にデバッグ目的に使用します。
		 *
		 * @return このクラスの文字列表現
		 * @og.rtnNotNull
		 */
		@Override
		public String toString() {
			final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE )
				.append( getClass()      ).append( ':' )
				.append( " tokens="      ).append( Arrays.toString( tkens ) )
				.append( " reverse="     ).append( rvse )
				.append( " ignoreCase="  ).append( igCase );
//				.append( " isDirectory=" ).append( isDir );

			return buf.toString();
		}
	}

	/**
	 * 内部判定フィルタ： 指定された接頭辞で始まる場合、スルー(選択)されます。
	 * 引数が null の場合は、追加しません。
	 * 引数に、'|' 区切り文字で複数設定した場合は、OR 判断(どれかが一致)します。
	 *
	 * @og.rev 6.3.1.1 (2015/07/10) 自分自身を返します。
	 * @og.rev 6.8.0.0 (2017/06/02) 判定結果を反転させて処理する notEquals 属性を追加します。
	 *
	 * @param    prefix 接頭辞("|"で複数指定可)
	 * @return	自分自身(this)
	 * @see java.lang.String#startsWith(String)
	 */
	public HybsFileFilter startsWith( final String prefix ) {
		return startsWith( prefix, notEquals );	// notEquals 属性
	}

	/**
	 * 内部判定フィルタ： 指定された接頭辞で始まる場合、スルー(選択)されます。
	 * 引数が null の場合は、追加しません。
	 * 引数に、'|' 区切り文字で複数設定した場合は、OR 判断(どれかが一致)します。
	 * reverse = true に設定すると、結果を反転させます。
	 *
	 * @og.rev 5.1.2.0 (2010/01/01) reverse属性の追加
	 * @og.rev 6.3.1.1 (2015/07/10) 自分自身を返します。
	 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
	 *
	 * @param    prefix		接頭辞("|"で複数指定可)
	 * @param    reverse	true:結果を反転する
	 * @return	自分自身(this)
	 * @see java.lang.String#startsWith(String)
	 */
	public HybsFileFilter startsWith( final String prefix,final boolean reverse ) {
		if( prefix != null ) {
//			list.add( new StartsWithFilter( prefix,reverse,ignoreCase ) );
			final DefaultFilter filter = new DefaultFilter( prefix,reverse,ignoreCase );
			filter.setPred( (name,tkn) -> name.startsWith( tkn ) );
			listF.add( filter );
		}
		return this;		// 6.3.1.1 (2015/07/10)
	}

//	/**
//	 * 指定された接頭辞で始まる場合に選択される FileFilter インターフェースの実装内部クラスです。
//	 * 引数に、'|' 区切り文字で複数設定した場合は、OR 判断(どれかが一致)します。
//	 *
//	 * @og.rev 5.1.2.0 (2010/01/01) '|' 区切り文字で複数設定処理の追加、reverse属性の追加
//	 * @og.rev 6.3.1.1 (2015/07/10) ignoreCase による 大文字小文字の判定方法指定
//	 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
//	 *
//	 * @version  4.0
//	 * @author   Kazuhiko Hasegawa
//	 * @since    JDK5.0,
//	 */
//	private static final class StartsWithFilter implements FileFilter {
//		private final String[] pfix ;
//		private final int      cnt  ;
//		private final boolean  rvse ;
//		private final boolean  igCase ;		// 6.3.1.1 (2015/07/10)
//		private final boolean  isDir ;		// 7.2.6.0 (2020/06/30)
//
//		/**
//		 * 接頭辞フィルターオブジェクトを作成します。
//		 *
//		 * @param	prefix	接頭辞("|"で複数指定可)
//		 * @param	reverse	true:結果を反転する
//		 * @param	ignoreCase	大文字/小文字の区別[true:しない/false:する]
//		 * @param	isDirectory	ﾃﾞｨﾚｸﾄﾘに対して処理する場合は、true
//		 */
////		StartsWithFilter( final String prefix,final boolean reverse,final boolean ignoreCase ) {
//		StartsWithFilter( final String prefix,final boolean reverse,final boolean ignoreCase,final boolean isDirectory ) {
//			rvse   = reverse;
//			igCase = ignoreCase;			// 6.3.1.1 (2015/07/10)
//			isDir  = isDirectory;			// 7.2.6.0 (2020/06/30)
//
//			final StringTokenizer token = new StringTokenizer( prefix, "|" );
//			cnt = token.countTokens();
//
//			pfix = new String[cnt];
//			for( int i=0; i<cnt; i++ ) {
//				// 6.3.1.1 (2015/07/10) ignoreCase 対応
//				final String tkn = token.nextToken();
//				pfix[i] = igCase ? tkn.toLowerCase( Locale.JAPAN ) : tkn ;
//			}
//		}
//
//		/**
//		 * FileFilter インターフェースの accept( File ) メソッド。
//		 *
//		 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
//		 *
//		 * @param	pathname	ファイルオブジェクト
//		 * @return	true:処理対象 / false:処理非対象
//		 * @see java.io.FileFilter#accept( File )
//		 */
//		public boolean accept( final File pathname ) {
//			return isDir ? check( pathname.getParentFile() ) : check( pathname ) ;
//		}
//
//		/**
//		 * FileFilter インターフェースの accept( File ) メソッド。
//		 *
//		 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
//		 *
//		 * @param	pathname	ファイルオブジェクト
//		 * @return	true:処理対象 / false:処理非対象
//		 * @see java.io.FileFilter#accept( File )
//		 */
//		private boolean check( final File pathname ) {
//			if( pathname != null ) {						// 7.2.6.0 (2020/06/30)
//				// 6.3.1.1 (2015/07/10) ignoreCase 対応
//				final String org  = pathname.getName() ;
//				final String name = igCase ? org.toLowerCase( Locale.JAPAN ) : org ;
//				for( int i=0; i<cnt; i++ ) {
//					if( name.startsWith( pfix[i] ) ) {
//						return !rvse;						// true ^ rvse
//					}
//				}
//			}
//			return rvse;								// false ^ rvse
//		}
//
//		/**
//		 * このオブジェクトの文字列表現を返します。
//		 * 基本的にデバッグ目的に使用します。
//		 *
//		 * @return このクラスの文字列表現
//		 * @og.rtnNotNull
//		 */
//		@Override
//		public String toString() {
//			final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE )
//				.append( getClass() ).append( ':' )
//				.append( " prefix=" ).append( Arrays.toString( pfix ) )
//				.append( " reverse=" ).append( rvse )
//				.append( " ignoreCase=" ).append( igCase );
//
//			return buf.toString();
//		}
//	}

	/**
	 * 内部判定フィルタ： 指定された接頭辞で始まるディレクトリの場合、スルー(選択)されます。
	 * 引数が null の場合は、追加しません。
	 * 引数に、'|' 区切り文字で複数設定した場合は、OR 判断(どれかが一致)します。
	 *
	 * @og.rev 6.4.3.2 (2016/02/19) ディレクトリの先頭一致対応
	 * @og.rev 6.8.0.0 (2017/06/02) 判定結果を反転させて処理する notEquals 属性を追加します。
	 *
	 * @param    prefix 接頭辞("|"で複数指定可)
	 * @return	自分自身(this)
	 * @see java.lang.String#startsWith(String)
	 */
	public HybsFileFilter startsDir( final String prefix ) {
		return startsDir( prefix, notEquals );	// notEquals 属性
	}

	/**
	 * 内部判定フィルタ： 指定された接頭辞で始まるディレクトリの場合、スルー(選択)されます。
	 * 引数が null の場合は、追加しません。
	 * 引数に、'|' 区切り文字で複数設定した場合は、OR 判断(どれかが一致)します。
	 * reverse = true に設定すると、結果を反転させます。
	 *
	 * @og.rev 6.4.3.2 (2016/02/19) ディレクトリの先頭一致対応
	 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
	 *
	 * @param    prefix		接頭辞("|"で複数指定可)
	 * @param    reverse	true:結果を反転する
	 * @return	自分自身(this)
	 * @see java.lang.String#startsWith(String)
	 */
	public HybsFileFilter startsDir( final String prefix,final boolean reverse ) {
		if( prefix != null ) {
//			list.add( new StartsDirFilter( prefix,reverse,ignoreCase ) );
			final DefaultFilter filter = new DefaultFilter( prefix,reverse,ignoreCase );
			filter.setPred( (name,tkn) -> name.startsWith( tkn ) );
			listD.add( filter );
		}
		return this;		// 6.3.1.1 (2015/07/10)
	}

//	/**
//	 * 指定された接頭辞で始まるディレクトリが選択される FileFilter インターフェースの実装内部クラスです。
//	 * 引数に、'|' 区切り文字で複数設定した場合は、OR 判断(どれかが一致)します。
//	 *
//	 * @og.rev 6.4.3.2 (2016/02/19) ディレクトリの先頭一致対応
//	 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
//	 *
//	 * @version  4.0
//	 * @author   Kazuhiko Hasegawa
//	 * @since    JDK5.0,
//	 */
//	private static final class StartsDirFilter implements FileFilter {
//		private final String[] pfix ;
//		private final int      cnt  ;
//		private final boolean  rvse ;
//		private final boolean  igCase ;		// 6.3.1.1 (2015/07/10)
//
//		/**
//		 * 接頭辞フィルターオブジェクトを作成します。
//		 *
//		 * @param	prefix	接頭辞("|"で複数指定可)
//		 * @param	reverse	true:結果を反転する
//		 * @param	ignoreCase	大文字/小文字の区別[true:しない/false:する]
//		 */
//		StartsDirFilter( final String prefix,final boolean reverse,final boolean ignoreCase ) {
//			rvse   = reverse;
//			igCase = ignoreCase;			// 6.3.1.1 (2015/07/10)
//
//			final StringTokenizer token = new StringTokenizer( prefix, "|" );
//			cnt = token.countTokens();
//
//			pfix = new String[cnt];
//			for( int i=0; i<cnt; i++ ) {
//				// 6.3.1.1 (2015/07/10) ignoreCase 対応
//				final String tkn = token.nextToken();
//				pfix[i] = igCase ? tkn.toLowerCase( Locale.JAPAN ) : tkn ;
//			}
//		}
//
//		/**
//		 * FileFilter インターフェースの accept( File ) メソッド。
//		 *
//		 * @param	pathname	ファイルオブジェクト
//		 * @return	true:処理対象 / false:処理非対象
//		 * @see java.io.FileFilter#accept( File )
//		 */
//		public boolean accept( final File pathname ) {
//			final File parent = pathname.getParentFile();
//			if( parent != null && parent.isDirectory() ) {		// まず、ディレクトリのはず
//				final String org = parent.getName();
//				final String name = igCase ? org.toLowerCase( Locale.JAPAN ) : org ;
//				for( int i=0; i<cnt; i++ ) {
//					if( name.startsWith( pfix[i] ) ) {
//						return !rvse;
//					}
//				}
//			}
//			return rvse;
//		}
//
//		/**
//		 * このオブジェクトの文字列表現を返します。
//		 * 基本的にデバッグ目的に使用します。
//		 *
//		 * @return このクラスの文字列表現
//		 * @og.rtnNotNull
//		 */
//		@Override
//		public String toString() {
//			final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE )
//				.append( getClass() ).append( ':' )
//				.append( " prefix=" ).append( Arrays.toString( pfix ) )
//				.append( " reverse=" ).append( rvse )
//				.append( " ignoreCase=" ).append( igCase );
//
//			return buf.toString();
//		}
//	}

	/**
	 * 内部判定フィルタ： 指定された接頭辞で終わる場合、スルー(選択)されます。
	 * 引数が null の場合は、追加しません。
	 * 引数に、'|' 区切り文字で複数設定した場合は、OR 判断(どれかが一致)します。
	 *
	 * @og.rev 6.3.1.1 (2015/07/10) 自分自身を返します。
	 * @og.rev 6.8.0.0 (2017/06/02) 判定結果を反転させて処理する notEquals 属性を追加します。
	 *
	 * @param    suffix 接尾辞("|"で複数指定可)
	 * @return	自分自身(this)
	 * @see java.lang.String#endsWith(String)
	 */
	public HybsFileFilter endsWith( final String suffix ) {
		return endsWith( suffix, notEquals );	// notEquals 属性
	}

	/**
	 * 内部判定フィルタ： 指定された接頭辞で終わる場合、スルー(選択)されます。
	 * 引数が null の場合は、追加しません。
	 * 引数に、'|' 区切り文字で複数設定した場合は、OR 判断(どれかが一致)します。
	 * reverse = true に設定すると、結果を反転させます。
	 *
	 * @og.rev 5.1.2.0 (2010/01/01) reverse属性の追加
	 * @og.rev 6.3.1.1 (2015/07/10) 自分自身を返します。
	 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
	 *
	 * @param	suffix	接尾辞("|"で複数指定可)
	 * @param	reverse	true:結果を反転する
	 * @return	自分自身(this)
	 * @see java.lang.String#endsWith(String)
	 */
	public HybsFileFilter endsWith( final String suffix,final boolean reverse ) {
		if( suffix != null ) {
//			list.add( new EndsWithFilter( suffix,reverse,ignoreCase ) );
			final DefaultFilter filter = new DefaultFilter( suffix,reverse,ignoreCase );
			filter.setPred( (name,tkn) -> name.endsWith( tkn ) );
			listF.add( filter );
		}
		return this;		// 6.3.1.1 (2015/07/10)
	}

//	/**
//	 * 指定された接頭辞で終わる場合に選択される FileFilter インターフェースの実装内部クラスです。
//	 * 引数に、'|' 区切り文字で複数設定した場合は、OR 判断(どれかが一致)します。
//	 *
//	 * @og.rev 5.1.2.0 (2010/01/01) '|' 区切り文字で複数設定処理の追加、reverse属性の追加
//	 * @og.rev 6.3.1.1 (2015/07/10) ignoreCase による 大文字小文字の判定方法指定
//	 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
//	 *
//	 * @version  4.0
//	 * @author   Kazuhiko Hasegawa
//	 * @since    JDK5.0,
//	 */
//	private static final class EndsWithFilter implements FileFilter {
//		private final String[] sfix ;
//		private final int      cnt  ;
//		private final boolean  rvse ;
//		private final boolean  igCase ;		// 6.3.1.1 (2015/07/10)
//
//		/**
//		 * 接頭辞フィルターオブジェクトを作成します。
//		 *
//		 * @param	suffix	接頭辞("|"で複数指定可)
//		 * @param	reverse	true:結果を反転する
//		 * @param	ignoreCase	大文字/小文字の区別[true:しない/false:する]
//		 */
//		EndsWithFilter( final String suffix,final boolean reverse,final boolean ignoreCase ) {
//			rvse = reverse;
//			igCase = ignoreCase;			// 6.3.1.1 (2015/07/10)
//
//			final StringTokenizer token = new StringTokenizer( suffix, "|" );
//			cnt = token.countTokens();
//
//			sfix = new String[cnt];
//			for( int i=0; i<cnt; i++ ) {
//				// 6.3.1.1 (2015/07/10) ignoreCase 対応
//				final String tkn = token.nextToken();
//				sfix[i] = igCase ? tkn.toLowerCase( Locale.JAPAN ) : tkn ;
//			}
//		}
//
//		/**
//		 * FileFilter インターフェースの accept( File ) メソッド。
//		 *
//		 * @param	pathname	ファイルオブジェクト
//		 * @return	true:処理対象 / false:処理非対象
//		 * @see java.io.FileFilter#accept( File )
//		 */
//		public boolean accept( final File pathname ) {
//			// 6.3.1.1 (2015/07/10) ignoreCase 対応
//			final String org  = pathname.getName() ;
//			final String name = igCase ? org.toLowerCase( Locale.JAPAN ) : org ;
//			for( int i=0; i<cnt; i++ ) {
//				if( name.endsWith( sfix[i] ) ) {
//					return !rvse;
//				}
//			}
//			return rvse;
//		}
//
//		/**
//		 * このオブジェクトの文字列表現を返します。
//		 * 基本的にデバッグ目的に使用します。
//		 *
//		 * @return このクラスの文字列表現
//		 * @og.rtnNotNull
//		 */
//		@Override
//		public String toString() {
//			final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE )
//				.append( getClass() ).append( ':' )
//				.append( " suffix=" ).append( Arrays.toString( sfix ) )
//				.append( " reverse=" ).append( rvse )
//				.append( " ignoreCase=" ).append( igCase );
//
//			return buf.toString();
//		}
//	}

	/**
	 * 内部判定フィルタ： 指定された文字列がファイル名に含まれる場合、スルー(選択)されます。
	 * 引数が null の場合は、追加しません。
	 * 引数に、'|' 区切り文字で複数設定した場合は、OR 判断(どれかが一致)します。
	 *
	 * @og.rev 6.3.1.1 (2015/07/10) 自分自身を返します。
	 * @og.rev 6.8.0.0 (2017/06/02) 判定結果を反転させて処理する notEquals 属性を追加します。
	 *
	 * @param    str 指定の部分文字列("|"で複数指定可)
	 * @return	自分自身(this)
	 */
	public HybsFileFilter instr( final String str ) {
		return instr( str, notEquals );	// notEquals 属性
	}

	/**
	 * 内部判定フィルタ： 指定された文字列がファイル名に含まれる場合、スルー(選択)されます。
	 * 引数が null の場合は、追加しません。
	 * 引数に、'|' 区切り文字で複数設定した場合は、OR 判断(どれかが一致)します。
	 * reverse = true に設定すると、結果を反転させます。
	 *
	 * @og.rev 5.1.2.0 (2010/01/01) reverse属性の追加
	 * @og.rev 6.3.1.1 (2015/07/10) 自分自身を返します。
	 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
	 *
	 * @param	str	指定の部分文字列("|"で複数指定可)
	 * @param	reverse	結果を反転させるかどうか(true:反転)
	 * @return	自分自身(this)
	 */
	public HybsFileFilter instr( final String str,final boolean reverse ) {
		if( str != null ) {
//			list.add( new InstrFilter( str,reverse,ignoreCase ) );
			final DefaultFilter filter = new DefaultFilter( str,reverse,ignoreCase );
			filter.setPred( (name,tkn) -> name.contains( tkn ) );
			listF.add( filter );
		}
		return this;		// 6.3.1.1 (2015/07/10)
	}

	/**
	 * 内部判定フィルタ： 指定された文字列がフォルダ名に含まれる場合、スルー(選択)されます。
	 * 引数が null の場合は、追加しません。
	 * 引数に、'|' 区切り文字で複数設定した場合は、OR 判断(どれかが一致)します。
	 *
	 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
	 *
	 * @param    str 指定の部分文字列("|"で複数指定可)
	 * @return	自分自身(this)
	 */
	public HybsFileFilter instrDir( final String str ) {
		return instrDir( str, notEquals );	// notEquals 属性
	}

	/**
	 * 内部判定フィルタ： 指定された文字列がフォルダ名に含まれる場合、スルー(選択)されます。
	 * 引数が null の場合は、追加しません。
	 * 引数に、'|' 区切り文字で複数設定した場合は、OR 判断(どれかが一致)します。
	 * reverse = true に設定すると、結果を反転させます。
	 *
	 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
	 *
	 * @param	str	指定の部分文字列("|"で複数指定可)
	 * @param	reverse	結果を反転させるかどうか(true:反転)
	 * @return	自分自身(this)
	 */
	public HybsFileFilter instrDir( final String str,final boolean reverse ) {
		if( str != null ) {
//			list.add( new InstrFilter( str,reverse,ignoreCase ) );
			final DefaultFilter filter = new DefaultFilter( str,reverse,ignoreCase );
			filter.setPred( (name,tkn) -> name.contains( tkn ) );
			listD.add( filter );
		}
		return this;		// 6.3.1.1 (2015/07/10)
	}

//	/**
//	 * 指定された文字列がファイル名に含まれる場合に選択される FileFilter インターフェースの実装内部クラスです。
//	 * 引数に、'|' 区切り文字で複数設定した場合は、OR 判断(どれかが一致)します。
//	 *
//	 * @og.rev 5.1.2.0 (2010/01/01) '|' 区切り文字で複数設定処理の追加、reverse属性の追加
//	 * @og.rev 6.3.1.1 (2015/07/10) ignoreCase による 大文字小文字の判定方法指定
//	 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
//	 *
//	 * @version  4.0
//	 * @author   Kazuhiko Hasegawa
//	 * @since    JDK5.0,
//	 */
//	private static final class InstrFilter implements FileFilter {
//		private final String[] instr ;
//		private final int      cnt  ;
//		private final boolean  rvse ;
//		private final boolean  igCase ;		// 6.3.1.1 (2015/07/10)
//
//		/**
//		 * 文字列包含フィルターオブジェクトを作成します。
//		 *
//		 * @param	str	包含を判定する文字列("|"で複数指定可)
//		 * @param	reverse	true:結果を反転する
//		 * @param	ignoreCase	大文字/小文字の区別[true:しない/false:する]
//		 */
//		InstrFilter( final String str,final boolean reverse,final boolean ignoreCase ) {
//			rvse   = reverse;
//			igCase = ignoreCase;			// 6.3.1.1 (2015/07/10)
//
//			final StringTokenizer token = new StringTokenizer( str, "|" );
//			cnt = token.countTokens();
//
//			instr = new String[cnt];
//			for( int i=0; i<cnt; i++ ) {
//				// 6.3.1.1 (2015/07/10) ignoreCase 対応
//				final String tkn = token.nextToken();
//				instr[i] = igCase ? tkn.toLowerCase( Locale.JAPAN ) : tkn ;
//			}
//		}
//
//		/**
//		 * FileFilter インターフェースの accept( File ) メソッド。
//		 *
//		 * @param	pathname	ファイルオブジェクト
//		 * @return	true:処理対象 / false:処理非対象
//		 * @see java.io.FileFilter#accept( File )
//		 */
//		public boolean accept( final File pathname ) {
//			// 6.3.1.1 (2015/07/10) ignoreCase 対応
//			final String org  = pathname.getName() ;
//			final String name = igCase ? org.toLowerCase( Locale.JAPAN ) : org ;
//			for( int i=0; i<cnt; i++ ) {
//				if( name.indexOf( instr[i] ) >= 0 ) {
//					return !rvse;
//				}
//			}
//			return rvse;
//		}
//
//		/**
//		 * このオブジェクトの文字列表現を返します。
//		 * 基本的にデバッグ目的に使用します。
//		 *
//		 * @return このクラスの文字列表現
//		 * @og.rtnNotNull
//		 */
//		@Override
//		public String toString() {
//			final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE )
//				.append( getClass() ).append( ':' )
//				.append( " instr=" ).append( Arrays.toString( instr ) )
//				.append( " reverse=" ).append( rvse )
//				.append( " ignoreCase=" ).append( igCase );
//
//			return buf.toString();
//		}
//	}

	/**
	 * 内部判定フィルタ： ファイル名が一致する場合、スルー(選択)されます。
	 * 引数が null の場合は、追加しません。
	 * 引数に、'|' 区切り文字で複数設定した場合は、OR 判断(どれかが一致)します。
	 *
	 * @og.rev 6.3.1.1 (2015/07/10) 自分自身を返します。
	 *
	 * @param    str ファイル名文字列("|"で複数指定可)
	 * @return	自分自身(this)
	 */
	public HybsFileFilter fileEquals( final String str ) {
		return fileEquals( str, false );	// 反転しない
	}

	/**
	 * 内部判定フィルタ： ファイル名が一致する場合、スルー(選択)されます。
	 * 引数が null の場合は、追加しません。
	 * 引数に、'|' 区切り文字で複数設定した場合は、OR 判断(どれかが一致)します。
	 * reverse = true に設定すると、結果を反転させます。
	 *
	 * @og.rev 5.1.2.0 (2010/01/01) reverse属性の追加
	 * @og.rev 6.3.1.1 (2015/07/10) 自分自身を返します。
	 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
	 *
	 * @param    str ファイル名文字列("|"で複数指定可)
	 * @param    reverse	true:結果を反転する
	 * @return	自分自身(this)
	 */
	public HybsFileFilter fileEquals( final String str,final boolean reverse ) {
		if( str != null ) {
//			list.add( new EqualsFilter( str,reverse,ignoreCase ) );
			final DefaultFilter filter = new DefaultFilter( str,reverse,ignoreCase );
			filter.setPred( (name,tkn) -> name.equals( tkn ) );
			listF.add( filter );
		}
		return this;		// 6.3.1.1 (2015/07/10)
	}

//	/**
//	 * ファイル名が一致する場合に選択される FileFilter インターフェースの実装内部クラスです。
//	 * 引数に、'|' 区切り文字で複数設定した場合は、OR 判断(どれかが一致)します。
//	 *
//	 * @og.rev 5.1.2.0 (2010/01/01) '|' 区切り文字で複数設定処理の追加、reverse属性の追加
//	 * @og.rev 6.3.1.1 (2015/07/10) ignoreCase による 大文字小文字の判定方法指定
//	 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
//	 *
//	 * @version  4.0
//	 * @author   Kazuhiko Hasegawa
//	 * @since    JDK5.0,
//	 */
//	private static final class EqualsFilter implements FileFilter {
//		private final String[] eqstr ;
//		private final int      cnt  ;
//		private final boolean  rvse ;
//		private final boolean  igCase ;		// 6.3.1.1 (2015/07/10)
//
//		/**
//		 * ファイル名一致フィルターオブジェクトを作成します。
//		 *
//		 * @param	str	ファイル名一致判定用文字列("|"で複数指定可)
//		 * @param	reverse	true:結果を反転する
//		 * @param	ignoreCase	大文字/小文字の区別[true:しない/false:する]
//		 */
//		EqualsFilter( final String str,final boolean reverse,final boolean ignoreCase ) {
//			rvse   = reverse;
//			igCase = ignoreCase;			// 6.3.1.1 (2015/07/10)
//
//			final StringTokenizer token = new StringTokenizer( str, "|" );
//			cnt = token.countTokens();
//
//			eqstr = new String[cnt];
//			for( int i=0; i<cnt; i++ ) {
//				eqstr[i] = token.nextToken();
//			}
//		}
//
//		/**
//		 * FileFilter インターフェースの accept( File ) メソッド。
//		 *
//		 * @param	pathname	ファイルオブジェクト
//		 * @return	true:処理対象 / false:処理非対象
//		 * @see java.io.FileFilter#accept( File )
//		 */
//		public boolean accept( final File pathname ) {
//			// 6.3.1.1 (2015/07/10) ignoreCase 対応
//			final String name  = pathname.getName() ;
//			for( int i=0; i<cnt; i++ ) {
//				if( ( igCase ? name.equalsIgnoreCase( eqstr[i] ) : name.equals( eqstr[i] ) ) ) {
//					return !rvse;
//				}
//			}
//			return rvse;
//		}
//
//		/**
//		 * このオブジェクトの文字列表現を返します。
//		 * 基本的にデバッグ目的に使用します。
//		 *
//		 * @return このクラスの文字列表現
//		 * @og.rtnNotNull
//		 */
//		@Override
//		public String toString() {
//			final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE )
//				.append( getClass() ).append( ':' )
//				.append( " eqstr=" ).append( Arrays.toString( eqstr ) )
//				.append( " reverse=" ).append( rvse )
//				.append( " ignoreCase=" ).append( igCase );
//
//			return buf.toString();
//		}
//	}

	/**
	 * 内部判定フィルタ： ファイル名が、指定された
	 * <a href="/java/api14/api/java/util/regex/Pattern.html#sum">正規表現</a>
	 * と一致する場合、スルー(選択)されます
	 * 大文字小文字の区別は、ignoreCase で切り替えます。
	 * ignoreCase ? Pattern.compile( str,Pattern.CASE_INSENSITIVE ) : Pattern.compile( str ) ;
	 * pattern.matcher( pathname.getName() ).find() == true と同じ結果が得られます。
	 * 引数が null の場合は、追加しません。
	 *
	 * @og.rev 6.3.1.1 (2015/07/10) 自分自身を返します。
	 * @og.rev 6.8.0.0 (2017/06/02) 判定結果を反転させて処理する notEquals 属性を追加します。
	 *
	 * @param    str ファイル名文字列(正規表現)
	 * @return	自分自身(this)
	 * @see java.util.regex.Pattern#compile(String,int)
	 * @see java.util.regex.Matcher#find()
	 */
	public HybsFileFilter matches( final String str ) {
		return matches( str, notEquals );	// notEquals 属性
	}

	/**
	 * 内部判定フィルタ： ファイル名が、指定された
	 * <a href="/java/api14/api/java/util/regex/Pattern.html#sum">正規表現</a>
	 * と一致する場合、スルー(選択)されます
	 * 大文字小文字の区別は、ignoreCase で切り替えます。
	 * ignoreCase ? Pattern.compile( str,Pattern.CASE_INSENSITIVE ) : Pattern.compile( str ) ;
	 * pattern.matcher( pathname.getName() ).find() == true と同じ結果が得られます。
	 * 引数が null の場合は、追加しません。
	 * reverse = true に設定すると、結果を反転させます。
	 *
	 * @og.rev 5.1.2.0 (2010/01/01) reverse属性の追加
	 * @og.rev 6.3.1.1 (2015/07/10) 自分自身を返します。
	 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
	 *
	 * @param    str ファイル名文字列(正規表現)
	 * @param    reverse	true:結果を反転する
	 * @return	自分自身(this)
	 * @see java.util.regex.Pattern#compile(String,int)
	 * @see java.util.regex.Matcher#find()
	 */
	public HybsFileFilter matches( final String str,final boolean reverse ) {
		if( str != null ) {
//			list.add( new MatchesFilter( str,reverse,ignoreCase ) );

			final Pattern pattern = ignoreCase
							? Pattern.compile( str,Pattern.CASE_INSENSITIVE )
							: Pattern.compile( str ) ;
			// ﾌｫﾙﾀﾞは、無条件でOK
//			list.add( file -> file.isDirectory() || pattern.matcher( file.getName() ).find() ^ reverse );
			listF.add( file -> pattern.matcher( file.getName() ).find() ^ reverse );
		}

		return this;		// 6.3.1.1 (2015/07/10)
	}

	/**
	 * 内部判定フィルタ： フォルダが、指定された
	 * <a href="/java/api14/api/java/util/regex/Pattern.html#sum">正規表現</a>
	 * と一致する場合、スルー(選択)されます
	 * 大文字小文字の区別は、ignoreCase で切り替えます。
	 * ignoreCase ? Pattern.compile( str,Pattern.CASE_INSENSITIVE ) : Pattern.compile( str ) ;
	 * pattern.matcher( pathname.getName() ).find() == true と同じ結果が得られます。
	 * 引数が null の場合は、追加しません。
	 *
	 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
	 *
	 * @param    str ファイル名文字列(正規表現)
	 * @return	自分自身(this)
	 * @see java.util.regex.Pattern#compile(String,int)
	 * @see java.util.regex.Matcher#find()
	 */
	public HybsFileFilter matchDir( final String str ) {
		return matchDir( str, notEquals );	// notEquals 属性
	}

	/**
	 * 内部判定フィルタ： フォルダが、指定された
	 * <a href="/java/api14/api/java/util/regex/Pattern.html#sum">正規表現</a>
	 * と一致する場合、スルー(選択)されます
	 * 大文字小文字の区別は、ignoreCase で切り替えます。
	 * ignoreCase ? Pattern.compile( str,Pattern.CASE_INSENSITIVE ) : Pattern.compile( str ) ;
	 * pattern.matcher( pathname.getName() ).find() == true と同じ結果が得られます。
	 * 引数が null の場合は、追加しません。
	 * reverse = true に設定すると、結果を反転させます。
	 *
	 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
	 *
	 * @param    str ファイル名文字列(正規表現)
	 * @param    reverse	true:結果を反転する
	 * @return	自分自身(this)
	 * @see java.util.regex.Pattern#compile(String,int)
	 * @see java.util.regex.Matcher#find()
	 */
	public HybsFileFilter matchDir( final String str,final boolean reverse ) {
		if( str != null ) {
//			list.add( new MatchesFilter( str,reverse,ignoreCase,true ) );

			final Pattern pattern = ignoreCase
							? Pattern.compile( str,Pattern.CASE_INSENSITIVE )
							: Pattern.compile( str ) ;
			// ﾌｧｲﾙは、無条件でOK
//			list.add( file -> file.isFile() || pattern.matcher( file.getName() ).find() ^ reverse );
			listD.add( file -> pattern.matcher( file.getName() ).find() ^ reverse );
		}
		return this;		// 6.3.1.1 (2015/07/10)
	}

//	/**
//	 * ファイル名が、指定された正規表現と一致する場合に選択される FileFilter インターフェースの実装内部クラスです。
//	 *
//	 * @og.rev 5.1.2.0 (2010/01/01) reverse属性の追加
//	 * @og.rev 6.3.1.1 (2015/07/10) ignoreCase による 大文字小文字の判定方法指定
//	 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
//	 *
//	 * @version  4.0
//	 * @author   Kazuhiko Hasegawa
//	 * @since    JDK5.0,
//	 */
//	private static final class MatchesFilter implements FileFilter {
//		private final Pattern pattern ;
//		private final boolean  rvse ;
//		private final boolean  isDir ;		// 7.2.6.0 (2020/06/30)
//
//		/**
//		 * 正規表現一致フィルターオブジェクトを作成します。
//		 * 大文字小文字の区別は、ignoreCase で切り替えます。
//		 * ignoreCase ? Pattern.compile( str,Pattern.CASE_INSENSITIVE ) : Pattern.compile( str ) ;
//		 *
//		 * @param	str	正規表現一致
//		 * @param	reverse	true:結果を反転する
//		 * @param	ignoreCase	大文字/小文字の区別[true:しない/false:する]
//		 * @param	isDirectory	ﾃﾞｨﾚｸﾄﾘに対して処理する場合は、true
//		 */
////		MatchesFilter( final String str,final boolean reverse,final boolean ignoreCase ) {
//		MatchesFilter( final String str,final boolean reverse,final boolean ignoreCase,final boolean isDirectory ) {
//			pattern = ignoreCase ? Pattern.compile( str,Pattern.CASE_INSENSITIVE ) : Pattern.compile( str ) ;
//			rvse	= reverse;
//			isDir	= isDirectory;			// 7.2.6.0 (2020/06/30)
//		}
//
//		/**
//		 * FileFilter インターフェースの accept( File ) メソッド。
//		 *
//		 * @param	pathname	ファイルオブジェクト
//		 * @return	true:処理対象 / false:処理非対象
//		 * @see java.io.FileFilter#accept( File )
//		 */
//		public boolean accept( final File pathname ) {
//			return isDir ? check( pathname.getParentFile() ) : check( pathname ) ;
//
////			final Matcher match = pattern.matcher( pathname.getName() );
////			// 6.4.1.1 (2016/01/16) PMD refactoring. A method should have only one exit point, and that should be the last statement in the method
////			// 排他的論理輪
////			return match.find() ^ rvse ;
//		}
//
//		/**
//		 * FileFilter インターフェースの accept( File ) メソッド。
//		 *
//		 * @param	pathname	ファイルオブジェクト
//		 * @return	true:処理対象 / false:処理非対象
//		 * @see java.io.FileFilter#accept( File )
//		 */
//		private boolean check( final File pathname ) {
//			if( pathname != null ) {						// 7.2.6.0 (2020/06/30)
//				final Matcher match = pattern.matcher( pathname.getName() );
//				// 6.4.1.1 (2016/01/16) PMD refactoring. A method should have only one exit point, and that should be the last statement in the method
//				// 排他的論理輪
//				return match.find() ^ rvse ;
//			}
//			return rvse;								// false ^ rvse
//		}
//
//		/**
//		 * このオブジェクトの文字列表現を返します。
//		 * 基本的にデバッグ目的に使用します。
//		 *
//		 * @return このクラスの文字列表現
//		 * @og.rtnNotNull
//		 */
//		@Override
//		public String toString() {
//			final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE )
//				.append( getClass() ).append( ':' )
//				.append( " pattern=" ).append( pattern )
//				.append( " reverse=" ).append( rvse );
//
//			return buf.toString();
//		}
//	}

	/**
	 * 内部判定フィルタ： 指定のタイムスタンプ以後に変更されている場合、スルー(選択)されます。
	 * ディレクトリは、ここの判定では無視します。(必ず true を返します)
	 * 日付けの指定に、YYYYMMDD 形式の ８文字数字文字列以外に、
	 * TODAY や YESTERDAY なども使用できます。
	 * TODAY は、実行日の 00:00:00 を基準時刻とし、YESTERDAY は、その前日になります。
	 * 引数が null の場合は、追加しません。
	 *
	 * @og.rev 6.3.1.1 (2015/07/10) 自分自身を返します。
	 * @og.rev 6.8.0.0 (2017/06/02) 判定結果を反転させて処理する notEquals 属性を追加します。
	 *
	 * @param    modify 時刻を表す long 値(ミリ秒単位)
	 * @return	自分自身(this)
	 */
	public HybsFileFilter lastModified( final String modify ) {
		return lastModified( modify, notEquals );	// notEquals 属性
	}

	/**
	 * 内部判定フィルタ： 指定のタイムスタンプ以後に変更されている場合、スルー(選択)されます。
	 * ディレクトリは、ここの判定では無視します。(必ず true を返します)
	 * 日付けの指定に、YYYYMMDD 形式の ８文字数字文字列以外に、
	 * TODAY や YESTERDAY なども使用できます。
	 * TODAY は、実行日の 00:00:00 を基準時刻とし、YESTERDAY は、その前日になります。
	 * 引数が null の場合は、追加しません。
	 *
	 * @og.rev 6.3.1.1 (2015/07/10) 自分自身を返します。
	 * @og.rev 6.8.0.0 (2017/06/02) 判定結果を反転させて処理する notEquals 属性を追加します。
	 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
	 *
	 * @param	modify 時刻を表す long 値(ミリ秒単位)
	 * @return	自分自身(this)
	 * @param	reverse	true:結果を反転する
	 */
	public HybsFileFilter lastModified( final String modify,final boolean reverse ) {
		if( modify != null ) {
//			list.add( new ModifyFileFilter( modify,reverse ) );

			final long time = modifyTime( modify );
			// 反転は日付判定の箇所のみ。	6.9.7.0 (2018/05/14) PMD Useless parentheses.
//			list.add( file -> file.isDirectory() || file.lastModified() >= time ^ reverse );
			listF.add( file -> file.lastModified() >= time ^ reverse );
		}
		return this;		// 6.3.1.1 (2015/07/10)
	}

	/**
	 * 日付けの指定に対するミリ秒で表される現在の時間を返します。
	 *
	 * 日付けの指定方法には、実日付け(YYYYMMDD形式 例：20040323)と
	 * 仮想日付け(TODAY,YESTERDAY など)が指定できます。
	 *
	 *     YYYYMMDD   YYYYMMDD形式の指定日の 00:00:00 を基準時刻
	 *     TODAY      実行日の 00:00:00 を基準時刻
	 *     YESTERDAY  実行日前日の 00:00:00 を基準時刻
	 *     LAST_WEEK  実行日の先週(7日前) 00:00:00 を基準時刻
	 *     MONTH      実行月の 1日 00:00:00 を基準時刻
	 *     LAST_MONTH 実行前月の 同日 00:00:00 を基準時刻
	 *     LAST_YEAR  実行前年の 同月同日 00:00:00 を基準時刻
	 *
	 * @og.rev 7.2.6.0 (2020/06/30) ディレクトリ処理を統一します。
	 *
	 * @param	value 指定日付け
	 * @return	ミリ秒で表される現在の時間
	 */
	private static long modifyTime( final String value ) {
		// 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
		if( value == null ) {
			throw new OgRuntimeException( "ModifyTime Error! modify valus is not null" );
		}

		final Calendar cal = Calendar.getInstance();

		cal.set( Calendar.HOUR_OF_DAY, 0 );		// 5.3.5.0 (2011/05/01) 時間の解決規則が適用されるため、｢時｣だけは、setメソッドで 0 にセットする。
		cal.clear( Calendar.MINUTE );
		cal.clear( Calendar.SECOND );
		cal.clear( Calendar.MILLISECOND );

		if( "YESTERDAY".equalsIgnoreCase( value ) ) {
			cal.add( Calendar.DATE, -1 );
		}
		else if( "LAST_WEEK".equalsIgnoreCase( value ) ) {
			cal.add( Calendar.DATE, -7 );
		}
		else if( "MONTH".equalsIgnoreCase( value ) ) {
			cal.set( Calendar.DATE, 1 );
		}
		else if( "LAST_MONTH".equalsIgnoreCase( value ) ) {
			cal.add( Calendar.MONTH, -1 );
		}
		else if( "LAST_YEAR".equalsIgnoreCase( value ) ) {
			cal.add( Calendar.YEAR, -1 );
		}
		else if( value.length() == 8 ) {
			cal.set( Integer.parseInt( value.substring( 0,4 ) ) ,
					 Integer.parseInt( value.substring( 4,6 ) ) - 1,
					 Integer.parseInt( value.substring( 6,8 ) ) );
		}
		else if( ! "TODAY".equalsIgnoreCase( value ) ) {
			final String errMsg = "ModifyFileFilter Error! modify Format [" + value + "]"	+ CR
					 + "日付けの指定方法には、実日付け(YYYYMMDD形式 例：20040323)と"		+ CR
					 + "仮想日付け(TODAY,YESTERDAY など)が指定できます。"					+ CR
					 + "    YYYYMMDD   YYYYMMDD形式の指定日の 00:00:00 を基準時刻"			+ CR
					 + "    TODAY      実行日の 00:00:00 を基準時刻"						+ CR
					 + "    YESTERDAY  実行日前日の 00:00:00 を基準時刻"					+ CR
					 + "    LAST_WEEK  実行日の先週(7日前) 00:00:00 を基準時刻"				+ CR
					 + "    MONTH      実行月の 1日 00:00:00 を基準時刻"					+ CR
					 + "    LAST_MONTH 実行前月の 同日 00:00:00 を基準時刻"					+ CR
					 + "    LAST_YEAR  実行前年の 同月同日 00:00:00 を基準時刻"				+ CR ;
			throw new OgRuntimeException( errMsg );
		}
		return cal.getTimeInMillis() ;
	}

//	/**
//	 * ModifyFileFilter.java は、最終変更日付けのフィルタークラスです。
//	 *
//	 * FileFilter インターフェースを継承し、コンストラクタで指定の日付けよりも
//	 * 最終変更日付け が新しいファイルを、選択します。
//	 * このクラスでは、ディレクトリは、変更日付けに無関係に選択します。
//	 *
//	 * 日付けの指定に、YYYYMMDD 形式の ８文字数字文字列以外に、TODAY や YESTERDAY なども使用できます。
//	 * TODAY は、実行日の 00:00:00 を基準時刻とし、YESTERDAY は、その前日になります。
//	 * バッチ処理等で、前日分の再編成や、先月分を再編成する場合に、実日付けを指定せずに
//	 * 使用できます。
//	 *
//	 * この実装は同期化されません。
//	 *
//	 * @version  4.0
//	 * @author   Kazuhiko Hasegawa
//	 * @since    JDK5.0,
//	 */
//	private static final class ModifyFileFilter implements FileFilter {
//		private final long		modify ;
//		private final boolean	rvse ;		// 6.8.0.0 (2017/06/02)
//
//		/**
//		 * コンストラクター
//		 *
//		 * 日付けの指定方法には、実日付け(YYYYMMDD形式 例：20040323)と
//		 * 仮想日付け(TODAY,YESTERDAY など)が指定できます。
//		 *
//		 *     YYYYMMDD   YYYYMMDD形式の指定日の 00:00:00 を基準時刻
//		 *     TODAY      実行日の 00:00:00 を基準時刻
//		 *     YESTERDAY  実行日前日の 00:00:00 を基準時刻
//		 *     LAST_WEEK  実行日の先週(7日前) 00:00:00 を基準時刻
//		 *     MONTH      実行月の 1日 00:00:00 を基準時刻
//		 *     LAST_MONTH 実行前月の 同日 00:00:00 を基準時刻
//		 *     LAST_YEAR  実行前年の 同月同日 00:00:00 を基準時刻
//		 *
//		 * @og.rev 5.3.5.0 (2011/05/01) ｢時｣のクリアミスの修正
//		 * @og.rev 6.8.0.0 (2017/06/02) 判定結果を反転させて処理する notEquals 属性を追加します。
//		 *
//		 * @param value 指定日付け
//		 * @param	reverse	true:結果を反転する
//		 */
//		ModifyFileFilter( final String value , final boolean reverse ) {
//			rvse = reverse;				// 6.8.0.0 (2017/06/02)
//
//			// 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
//			if( value == null ) {
//				throw new OgRuntimeException( "ModifyFileFilter Error! modify valus is not null" );
//			}
//
//	//		if( value != null ) {
//				final Calendar cal = Calendar.getInstance();
//
//				cal.set( Calendar.HOUR_OF_DAY, 0 );		// 5.3.5.0 (2011/05/01) 時間の解決規則が適用されるため、｢時｣だけは、setメソッドで 0 にセットする。
//				cal.clear( Calendar.MINUTE );
//				cal.clear( Calendar.SECOND );
//				cal.clear( Calendar.MILLISECOND );
//
//				if( "YESTERDAY".equalsIgnoreCase( value ) ) {
//					cal.add( Calendar.DATE, -1 );
//				}
//				else if( "LAST_WEEK".equalsIgnoreCase( value ) ) {
//					cal.add( Calendar.DATE, -7 );
//				}
//				else if( "MONTH".equalsIgnoreCase( value ) ) {
//					cal.set( Calendar.DATE, 1 );
//				}
//				else if( "LAST_MONTH".equalsIgnoreCase( value ) ) {
//					cal.add( Calendar.MONTH, -1 );
//				}
//				else if( "LAST_YEAR".equalsIgnoreCase( value ) ) {
//					cal.add( Calendar.YEAR, -1 );
//				}
//				else if( value.length() == 8 ) {
//					cal.set( Integer.parseInt( value.substring( 0,4 ) ) ,
//							 Integer.parseInt( value.substring( 4,6 ) ) - 1,
//							 Integer.parseInt( value.substring( 6,8 ) ) );
//				}
//				else if( ! "TODAY".equalsIgnoreCase( value ) ) {
//					final String errMsg = "ModifyFileFilter Error! modify Format [" + value + "]"	+ CR
//							 + "日付けの指定方法には、実日付け(YYYYMMDD形式 例：20040323)と"		+ CR
//							 + "仮想日付け(TODAY,YESTERDAY など)が指定できます。"					+ CR
//							 + "    YYYYMMDD   YYYYMMDD形式の指定日の 00:00:00 を基準時刻"			+ CR
//							 + "    TODAY      実行日の 00:00:00 を基準時刻"						+ CR
//							 + "    YESTERDAY  実行日前日の 00:00:00 を基準時刻"					+ CR
//							 + "    LAST_WEEK  実行日の先週(7日前) 00:00:00 を基準時刻"				+ CR
//							 + "    MONTH      実行月の 1日 00:00:00 を基準時刻"					+ CR
//							 + "    LAST_MONTH 実行前月の 同日 00:00:00 を基準時刻"					+ CR
//							 + "    LAST_YEAR  実行前年の 同月同日 00:00:00 を基準時刻"				+ CR ;
//					throw new OgRuntimeException( errMsg );
//				}
//				modify = cal.getTimeInMillis() ;
//	//		}
//	//		else {
//	//			throw new OgRuntimeException( "ModifyFileFilter Error! modify valus is not null" );
//	//		}
//		}
//
//		/**
//		 * FileFilter インターフェースの accept( File ) メソッド。
//		 *
//		 * @og.rev 6.8.0.0 (2017/06/02) 判定結果を反転させて処理する notEquals 属性を追加します。
//		 *
//		 * @param	file	ファイルオブジェクト
//		 *
//		 * @return	true:処理対象 / false:処理非対象
//		 * @see java.io.FileFilter#accept( File )
//		 */
//		public boolean accept( final File file ) {
////			return file.isDirectory() || ( ( file.lastModified() >= modify ) ^ rvse ) ;		// 反転は日付判定の箇所のみ。
//			return file.isDirectory() || file.lastModified() >= modify ^ rvse ;				// 反転は日付判定の箇所のみ。	6.9.7.0 (2018/05/14) PMD Useless parentheses.
//		}
//
//		/**
//		 * このオブジェクトの文字列表現を返します。
//		 * 基本的にデバッグ目的に使用します。
//		 *
//		 * @return このクラスの文字列表現
//		 * @og.rtnNotNull
//		 */
//		@Override
//		public String toString() {
//			final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE )
//				.append( getClass()  ).append( ':' )
//				.append( " modify="  ).append( DateSet.getDate( modify,"yyyy/MM/dd" ) )
//				.append( " reverse=" ).append( rvse );
//
//			return buf.toString();
//		}
//	}

	/**
	 * 共通処理：単位記号の付与されたバイト文字列から、long値であるバイトを求めます。
	 * 現時点では、K , KB , M , MB , G , GB のみ単位指定可能です。
	 * それぞれ、元の値に対して、1024倍されます。
	 *
	 * 処理が正常に出来ない場合は、-1L を返します。
	 *
	 * @og.rev 5.7.4.3 (2014/03/28) 新規追加
	 *
	 * @param	slen 単位記号付きバイト値
	 * @return	longに換算したバイト値
	 */
//	private long getByteSize( final String slen ) {
	private static long getByteSize( final String slen ) {
		if( slen == null ) { return -1L; }

		String buf  = slen;
		int    size = buf.length();

		// 'B' は、単位換算に関係ない為、あれば削除します。
		if( size > 0 && 'B' == buf.charAt( size-1 ) ) {
			buf = buf.substring( 0,size-1 );			// 'B' が削除された文字列
			size--;
		}

		long rtn = -1L;

		long tani = -1L;								// 変換されたかどうかの判定も兼ねる。
		if( size > 0 ) {
			final char ch = buf.charAt( size-1 );				// 'K' , 'M' , 'G' のチェック
			switch( ch ) {
				case 'K' : tani=1024L; break;
				case 'M' : tani=1024L * 1024L ; break;
				case 'G' : tani=1024L * 1024L * 1024L ; break;
				default  : break;
			}
			if( tani > 0L ) {	// つまり、単位換算が行われた場合。
				buf = buf.substring( 0,size-1 );		// 'K','M','G' が削除された文字列
				size--;									// ここで空文字列になる可能性がある。
			}
			else {
				tani = 1L;		// 単位換算がない場合は、１倍。
			}
		}

		if( size > 0 ) {
			// 先の単位換算で、1L(=１倍)を設定して、if を無くしたが、long の掛け算なので、なんとなく抵抗がある。
			rtn = tani * Long.parseLong( buf );			// buf はすでに数字だけになっているハズ。
		}

		return rtn ;
	}

	/**
	 * 内部判定フィルタ： 指定の大きさより大きいファイルの場合、スルー(選択)されます。
	 *
	 * 指定はバイト単位ですが、**KB , **MB , **GB などの単位を付ける事も可能です。
	 * 現時点では、K , KB , M , MB , G , GB のみ指定可能です。
	 *
	 * @og.rev 5.7.4.3 (2014/03/28) isLarger,isSmaller属性を文字列に変更
	 * @og.rev 6.3.1.1 (2015/07/10) 自分自身を返します。
	 *
	 * @param	slen 	ファイルの大きさ(バイト単位)。同値を含む
	 * @return	自分自身(this)
	 */
	public HybsFileFilter isLarger( final String slen ) {
		final long size = getByteSize( slen );

		if( size >= 0L ) {
//			list.add( new IsLargerFilter( len ) );

//			list.add( file -> file.isDirectory() || file.length() >= size );
			listF.add( file -> file.length() >= size );
		}
		return this;		// 6.3.1.1 (2015/07/10)
	}

//	/**
//	 * 指定の大きさより大きいファイルの場合に選択される FileFilter インターフェースの実装内部クラスです。
//	 *
//	 * @version  4.0
//	 * @author   Kazuhiko Hasegawa
//	 * @since    JDK5.0,
//	 */
//	private static final class IsLargerFilter implements FileFilter {
//		private final long size ;
//
//		/**
//		 * 大きいファイルフィルターオブジェクトを作成します。
//		 *
//		 * @og.rev 5.7.4.3 (2014/03/28) isLarger,isSmaller属性をlongに変更
//		 *
//		 * @param	len 	ファイルの大きさ(バイト単位)。同値を含む
//		 */
//		IsLargerFilter( final long len ) {
//			size = len ;
//		}
//
//		/**
//		 * FileFilter インターフェースの accept( File ) メソッド。
//		 *
//		 * @param	pathname	ファイルオブジェクト
//		 * @return	true:処理対象 / false:処理非対象
//		 * @see java.io.FileFilter#accept( File )
//		 */
//		public boolean accept( final File pathname ) {
//			return pathname.length() >= size;
//		}
//
//		/**
//		 * このオブジェクトの文字列表現を返します。
//		 * 基本的にデバッグ目的に使用します。
//		 *
//		 * @return このクラスの文字列表現
//		 * @og.rtnNotNull
//		 */
//		@Override
//		public String toString() {
//			final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE )
//				.append( getClass() ).append( ':' )
//				.append( " size=" ).append( size );
//
//			return buf.toString();
//		}
//	}

	/**
	 * 内部判定フィルタ： 指定の大きさより小さいファイルの場合、スルー(選択)されます。
	 * 引数が 0以下(マイナス) の場合は、追加しません。
	 *
	 * @og.rev 5.7.4.3 (2014/03/28) isLarger,isSmaller属性を文字列に変更
	 * @og.rev 6.3.1.1 (2015/07/10) 自分自身を返します。
	 *
	 * @param    slen ファイルの大きさ(バイト単位)。同値を含まない。
	 * @return	自分自身(this)
	 */
	public HybsFileFilter isSmaller( final String slen ) {
		final long size = getByteSize( slen );

		if( size >= 0L ) {
//			list.add( new IsSmallerFilter( len ) );

//			list.add( file -> file.isDirectory() || file.length() < size );
			listF.add( file -> file.length() < size );
		}
		return this;		// 6.3.1.1 (2015/07/10)
	}

//	/**
//	 * 指定の大きさより小さいファイルの場合選択される FileFilter インターフェースの実装内部クラスです。
//	 *
//	 * @version  4.0
//	 * @author   Kazuhiko Hasegawa
//	 * @since    JDK5.0,
//	 */
//	private static final class IsSmallerFilter implements FileFilter {
//		private final long size ;
//
//		/**
//		 * 小さいファイルフィルターオブジェクトを作成します。
//		 *
//		 * @og.rev 5.7.4.3 (2014/03/28) isLarger,isSmaller属性をlongに変更
//		 *
//		 * @param    len ファイルの大きさ(バイト単位)。同値を含まない。
//		 */
//		IsSmallerFilter( final long len ) {
//			size = len ;
//		}
//
//		/**
//		 * FileFilter インターフェースの accept( File ) メソッド。
//		 *
//		 * @param	pathname	ファイルオブジェクト
//		 * @return	true:処理対象 / false:処理非対象
//		 * @see java.io.FileFilter#accept( File )
//		 */
//		public boolean accept( final File pathname ) {
//			return pathname.length() < size;
//		}
//
//		/**
//		 * このオブジェクトの文字列表現を返します。
//		 * 基本的にデバッグ目的に使用します。
//		 *
//		 * @return このクラスの文字列表現
//		 * @og.rtnNotNull
//		 */
//		@Override
//		public String toString() {
//			final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE )
//				.append( getClass() ).append( ':' )
//				.append( " size=" ).append( size );
//
//			return buf.toString();
//		}
//	}

	/**
	 * 内部判定フィルタ： ファイルが hidden の場合、スルー(選択)されます。
	 * 引数がtrueの場合は、hiddenファイルのみを選択します。
	 * falseの場合は、hiddenファイル以外を選択します。(つまり hiddenファイルをブロックします。)
	 * hidden をブロックしたい場合は、false を設定し、すべて選択したい場合は、filter設定をしない事になります。
	 * 引数が null の場合は、追加しません。
	 *
	 * @og.rev 5.7.5.0 (2014/04/04) 新規追加
	 * @og.rev 6.3.1.1 (2015/07/10) 自分自身を返します。
	 * @og.rev 6.8.0.0 (2017/06/02) 判定結果を反転させて処理する notEquals 属性を追加します。
	 *
	 * @param	flag [true:/false]
	 * @return	自分自身(this)
	 */
	public HybsFileFilter isHidden( final String flag ) {
		return isHidden( flag, notEquals );			// notEquals 属性
	}

	/**
	 * 内部判定フィルタ： ファイルが hidden の場合、スルー(選択)されます。
	 * 引数がtrueの場合は、hiddenファイルのみを選択します。
	 * falseの場合は、hiddenファイル以外を選択します。(つまり hiddenファイルをブロックします。)
	 * hidden をブロックしたい場合は、false を設定し、すべて選択したい場合は、filter設定をしない事になります。
	 * reverse = true に設定すると、結果を反転させます。
	 *
	 * @og.rev 5.7.5.0 (2014/04/04) 新規追加
	 * @og.rev 6.3.1.1 (2015/07/10) 自分自身を返します。
	 *
	 * @param	flag [true:/false]
	 * @param	reverse	true:結果を反転する
	 * @return	自分自身(this)
	 */
	public HybsFileFilter isHidden( final String flag,final boolean reverse ) {
		if( flag != null ) {
//			list.add( new IsHiddenFilter( flag,reverse ) );

			final boolean flg = Boolean.parseBoolean( flag );
//			list.add( file -> (file.isHidden() ^ !flg) ^ reverse );
			listF.add( file -> (file.isHidden() ^ !flg) ^ reverse );		// ﾚｱｹｰｽなので、fileのみcheckします
				//  isHidden()		flg		!flg	rvse	⇒ 結果
				// ======================================================
				//	true(hidden)	true	false	false	⇒ true	 選択
				//	true(hidden)	false	true	false	⇒ false 除外
				//	false(normal)	true	false	false	⇒ false 除外
				//	false(normal)	false	true	false	⇒ true	 選択

				//	true(hidden)	true	false	true	⇒ false 除外
				//	true(hidden)	false	true	true	⇒ true	 選択
				//	false(normal)	true	false	true	⇒ true	 選択
				//	false(normal)	false	true	true	⇒ false 除外
		}
		return this;		// 6.3.1.1 (2015/07/10)
	}

//	/**
//	 * ファイルが hidden の場合に選択される FileFilter インターフェースの実装内部クラスです。
//	 * 引数がtrueの場合は、hiddenファイルのみを選択します。
//	 * falseの場合は、hiddenファイル以外を選択します。(つまり hiddenファイルをブロックします。)
//	 * hidden をブロックしたい場合は、false を設定し、すべて選択したい場合は、filter設定をしない事になります。
//	 *
//	 * @og.rev 5.7.5.0 (2014/04/04) 新規追加
//	 *
//	 * @version  6.0
//	 * @author   Kazuhiko Hasegawa
//	 * @since    JDK6.0,
//	 */
//	private static final class IsHiddenFilter implements FileFilter {
//		private final boolean  flg  ;
//		private final boolean  rvse ;
//
//		/**
//		 * hiddenフィルターオブジェクトを作成します。
//		 *
//		 * @param	flag	true:hiddenのみ / false:
//		 * @param	reverse	true:結果を反転する
//		 */
//		IsHiddenFilter( final String flag,final boolean reverse ) {
//			flg  = Boolean.parseBoolean( flag );
//			rvse = reverse;
//		}
//
//		/**
//		 * FileFilter インターフェースの accept( File ) メソッド。
//		 *
//		 * @param	pathname	ファイルオブジェクト
//		 * @return	true:処理対象 / false:処理非対象
//		 * @see java.io.FileFilter#accept( File )
//		 */
//		public boolean accept( final File pathname ) {
//			return (pathname.isHidden()  ^  !flg) ^ rvse ;
//				//  isHidden()		flg		!flg	rvse	⇒ 結果
//				// ======================================================
//				//	true(hidden)	true	false	false	⇒ true	 選択
//				//	true(hidden)	false	true	false	⇒ false 除外
//				//	false(normal)	true	false	false	⇒ false 除外
//				//	false(normal)	false	true	false	⇒ true	 選択
//
//				//	true(hidden)	true	false	true	⇒ false 除外
//				//	true(hidden)	false	true	true	⇒ true	 選択
//				//	false(normal)	true	false	true	⇒ true	 選択
//				//	false(normal)	false	true	true	⇒ false 除外
//		}
//
//		/**
//		 * このオブジェクトの文字列表現を返します。
//		 * 基本的にデバッグ目的に使用します。
//		 *
//		 * @return このクラスの文字列表現
//		 * @og.rtnNotNull
//		 */
//		@Override
//		public String toString() {
//			final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE )
//				.append( getClass() ).append( ':' )
//				.append( " flag=" ).append( flg )
//				.append( " reverse=" ).append( rvse );
//
//			return buf.toString();
//		}
//	}

//	/**
//	 * このオブジェクトの文字列表現を返します。
//	 * 基本的にデバッグ目的に使用します。
//	 *
//	 * @return このクラスの文字列表現
//	 * @og.rtnNotNull
//	 */
//	@Override
//	public String toString() {
//		final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE );
//		final int size = list.size();
//		for( int i=0; i<size; i++ ) {
//			buf.append( "no[" ).append( i ).append( "]=" );
//			buf.append( list.get(i) ).append( CR );
//		}
//
//		return buf.toString();
//	}
}
