001/* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package org.apache.commons.io.filefilter; 018 019import java.io.File; 020import java.io.FileFilter; 021import java.io.FilenameFilter; 022import java.io.IOException; 023import java.nio.file.FileVisitResult; 024import java.nio.file.Path; 025import java.nio.file.attribute.BasicFileAttributes; 026import java.util.Objects; 027 028import org.apache.commons.io.file.PathFilter; 029import org.apache.commons.io.file.PathVisitor; 030 031/** 032 * Abstracts the implementation of the {@link FileFilter} (IO), {@link FilenameFilter} (IO), {@link PathFilter} (NIO) 033 * interfaces via our own {@link IOFileFilter} interface. 034 * <p> 035 * Note that a subclass MUST override one of the {@code accept} methods, otherwise that subclass will infinitely loop. 036 * </p> 037 * 038 * @since 1.0 039 */ 040public abstract class AbstractFileFilter implements IOFileFilter, PathVisitor { 041 042 static FileVisitResult toFileVisitResult(final boolean accept, final Path path) { 043 return accept ? FileVisitResult.CONTINUE : FileVisitResult.TERMINATE; 044 } 045 046 /** 047 * Checks to see if the File should be accepted by this filter. 048 * 049 * @param file the File to check 050 * @return true if this file matches the test 051 */ 052 @Override 053 public boolean accept(final File file) { 054 Objects.requireNonNull(file, "file"); 055 return accept(file.getParentFile(), file.getName()); 056 } 057 058 /** 059 * Checks to see if the File should be accepted by this filter. 060 * 061 * @param dir the directory File to check 062 * @param name the file name within the directory to check 063 * @return true if this file matches the test 064 */ 065 @Override 066 public boolean accept(final File dir, final String name) { 067 Objects.requireNonNull(name, "name"); 068 return accept(new File(dir, name)); 069 } 070 071 /** 072 * Handles exceptions caught while accepting. 073 * 074 * @param t the caught Throwable. 075 * @return the given Throwable. 076 * @since 2.9.0 077 */ 078 protected FileVisitResult handle(final Throwable t) { 079 return FileVisitResult.TERMINATE; 080 } 081 082 @Override 083 public FileVisitResult postVisitDirectory(final Path dir, final IOException exc) throws IOException { 084 return FileVisitResult.CONTINUE; 085 } 086 087 @Override 088 public FileVisitResult preVisitDirectory(final Path dir, final BasicFileAttributes attributes) throws IOException { 089 return accept(dir, attributes); 090 } 091 092 /** 093 * Provides a String representation of this file filter. 094 * 095 * @return a String representation 096 */ 097 @Override 098 public String toString() { 099 return getClass().getSimpleName(); 100 } 101 102 @Override 103 public FileVisitResult visitFile(final Path file, final BasicFileAttributes attributes) throws IOException { 104 return accept(file, attributes); 105 } 106 107 @Override 108 public FileVisitResult visitFileFailed(final Path file, final IOException exc) throws IOException { 109 return FileVisitResult.CONTINUE; 110 } 111 112}