package sk.stuba.fiit.perconik.utilities.io; import java.io.IOException; import java.io.Serializable; import java.nio.file.Files; import java.nio.file.LinkOption; import java.nio.file.Path; import java.util.Arrays; import javax.annotation.Nonnull; import com.google.common.base.Predicate; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Throwables.propagate; public final class PathPredicates { private PathPredicates() {} private static <T extends Path> Predicate<T> cast(final Predicate<? extends Path> predicate) { // only for stateless internal singletons shared across all types @SuppressWarnings("unchecked") Predicate<T> result = (Predicate<T>) predicate; return result; } public static <T extends Path> Predicate<T> startsWith(final T prefix) { return new StartsWithPredicate<>(prefix); } public static <T extends Path> Predicate<T> endsWith(final T suffix) { return new EndsWithPredicate<>(suffix); } static final class StartsWithPredicate<T extends Path> implements Predicate<T>, Serializable { private static final long serialVersionUID = 0L; private final T prefix; StartsWithPredicate(final T prefix) { this.prefix = checkNotNull(prefix); } public boolean apply(@Nonnull final T path) { return path != null ? path.startsWith(this.prefix) : false; } // TODO add equals, hashCode, toString } static final class EndsWithPredicate<T extends Path> implements Predicate<T>, Serializable { private static final long serialVersionUID = 0L; private final T suffix; EndsWithPredicate(final T suffix) { this.suffix = checkNotNull(suffix); } public boolean apply(@Nonnull final T path) { return path != null ? path.endsWith(this.suffix) : false; } // TODO add equals, hashCode, toString } public static <T extends Path> Predicate<T> isDirectory() { return cast(IsDirectoryPredicate.Default.INSTANCE); } public static <T extends Path> Predicate<T> isDirectory(final LinkOption ... options) { return new IsDirectoryPredicate<>(options); } public static <T extends Path> Predicate<T> isRegularFile() { return cast(IsRegularFilePredicate.Default.INSTANCE); } public static <T extends Path> Predicate<T> isRegularFile(final LinkOption ... options) { return new IsRegularFilePredicate<>(options); } public static <T extends Path> Predicate<T> isExecutable() { return cast(IsExecutablePredicate.INSTANCE); } public static <T extends Path> Predicate<T> isReadable() { return cast(IsReadablePredicate.INSTANCE); } public static <T extends Path> Predicate<T> isWritable() { return cast(IsWritablePredicate.INSTANCE); } public static <T extends Path> Predicate<T> isHidden() { return cast(IsHiddenPredicate.INSTANCE); } public static <T extends Path> Predicate<T> isSymbolicLink() { return cast(IsSymbolicLinkPredicate.INSTANCE); } static final class IsDirectoryPredicate<T extends Path> implements Predicate<T>, Serializable { private static final long serialVersionUID = 0L; private final LinkOption[] options; IsDirectoryPredicate(final LinkOption ... options) { this.options = Arrays.copyOf(options, options.length); } public boolean apply(@Nonnull final T path) { return Files.isDirectory(path, this.options); } enum Default implements Predicate<Path> { INSTANCE; public boolean apply(@Nonnull final Path path) { return Files.isDirectory(path); } // TODO add toString } // TODO add equals, hashCode, toString } static final class IsRegularFilePredicate<T extends Path> implements Predicate<T>, Serializable { private static final long serialVersionUID = 0L; private final LinkOption[] options; IsRegularFilePredicate(final LinkOption ... options) { this.options = Arrays.copyOf(options, options.length); } public boolean apply(@Nonnull final T path) { return Files.isRegularFile(path, this.options); } enum Default implements Predicate<Path> { INSTANCE; public boolean apply(@Nonnull final Path path) { return Files.isRegularFile(path); } // TODO add toString } // TODO add equals, hashCode, toString } enum IsExecutablePredicate implements Predicate<Path> { INSTANCE; public boolean apply(@Nonnull final Path path) { return Files.isExecutable(path); } // TODO add toString } enum IsReadablePredicate implements Predicate<Path> { INSTANCE; public boolean apply(@Nonnull final Path path) { return Files.isReadable(path); } // TODO add toString } enum IsWritablePredicate implements Predicate<Path> { INSTANCE; public boolean apply(@Nonnull final Path path) { return Files.isWritable(path); } // TODO add toString } enum IsHiddenPredicate implements Predicate<Path> { INSTANCE; public boolean apply(@Nonnull final Path path) { try { return Files.isHidden(path); } catch (IOException e) { throw propagate(e); } } // TODO add toString } enum IsSymbolicLinkPredicate implements Predicate<Path> { INSTANCE; public boolean apply(@Nonnull final Path path) { return Files.isSymbolicLink(path); } // TODO add toString } }