/* * Copyright 2002-2017 the original author or authors. * * 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.springframework.integration.file; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.springframework.integration.file.filters.AcceptOnceFileListFilter; import org.springframework.integration.file.filters.CompositeFileListFilter; import org.springframework.integration.file.filters.FileListFilter; import org.springframework.integration.file.filters.IgnoreHiddenFileListFilter; import org.springframework.messaging.MessagingException; /** * Default directory scanner and base class for other directory scanners. * Manages the default interrelations between filtering, scanning and locking. * * @author Iwein Fuld * @author Gunnar Hillert * @author Artem Bilan * * @since 2.0 */ public class DefaultDirectoryScanner implements DirectoryScanner { private volatile FileListFilter<File> filter; private volatile FileLocker locker; /** * Initializes {@link DefaultDirectoryScanner#filter} with a default list of * {@link FileListFilter}s using a {@link CompositeFileListFilter}: * <ul> * <li>{@link IgnoreHiddenFileListFilter}</li> * <li>{@link AcceptOnceFileListFilter}</li> * </ul> */ public DefaultDirectoryScanner() { final List<FileListFilter<File>> defaultFilters = new ArrayList<>(2); defaultFilters.add(new IgnoreHiddenFileListFilter()); defaultFilters.add(new AcceptOnceFileListFilter<>()); this.filter = new CompositeFileListFilter<>(defaultFilters); } @Override public void setFilter(FileListFilter<File> filter) { this.filter = filter; } protected FileListFilter<File> getFilter() { return this.filter; } @Override public final void setLocker(FileLocker locker) { this.locker = locker; } protected FileLocker getLocker() { return this.locker; } /** * This class takes the minimal implementation and merely delegates to the locker if set. * @param file the file to try to claim. */ @Override public boolean tryClaim(File file) { return (this.locker == null) || this.locker.lock(file); } @Override public List<File> listFiles(File directory) throws IllegalArgumentException { File[] files = listEligibleFiles(directory); if (files == null) { throw new MessagingException("The path [" + directory + "] does not denote a properly accessible directory."); } return (this.filter != null) ? this.filter.filterFiles(files) : Arrays.asList(files); } /** * Subclasses may refine the listing strategy by overriding this method. The * files returned here are passed onto the filter. * @param directory root directory to use for listing * @return the files this scanner should consider */ protected File[] listEligibleFiles(File directory) { return directory.listFiles(); } }