/* * Copyright 2014-2016 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.dsl.file; import java.io.File; import java.util.Comparator; import org.springframework.beans.factory.BeanCreationException; import org.springframework.integration.dsl.core.MessageSourceSpec; import org.springframework.integration.file.DirectoryScanner; import org.springframework.integration.file.FileLocker; import org.springframework.integration.file.FileReadingMessageSource; import org.springframework.integration.file.config.FileListFilterFactoryBean; import org.springframework.integration.file.filters.AcceptAllFileListFilter; 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.integration.file.filters.RegexPatternFileListFilter; import org.springframework.integration.file.filters.SimplePatternFileListFilter; import org.springframework.integration.file.locking.NioFileLocker; import org.springframework.util.Assert; /** * A {@link MessageSourceSpec} for a {@link FileReadingMessageSource}. * * @author Artem Bilan */ public class FileInboundChannelAdapterSpec extends MessageSourceSpec<FileInboundChannelAdapterSpec, FileReadingMessageSource> { private final FileListFilterFactoryBean fileListFilterFactoryBean = new FileListFilterFactoryBean(); private FileLocker locker; FileInboundChannelAdapterSpec() { this.target = new FileReadingMessageSource(); } FileInboundChannelAdapterSpec(Comparator<File> receptionOrderComparator) { this.target = new FileReadingMessageSource(receptionOrderComparator) { @Override protected void onInit() { try { setFilter(FileInboundChannelAdapterSpec.this.fileListFilterFactoryBean.getObject()); } catch (Exception e) { throw new BeanCreationException("The bean for the [" + this + "] can not be instantiated.", e); } super.onInit(); } }; } /** * @param directory the directory. * @return the spec. * @see FileReadingMessageSource#setDirectory(File) */ FileInboundChannelAdapterSpec directory(File directory) { this.target.setDirectory(directory); return _this(); } /** * @param scanner the scanner. * @return the spec. * @see FileReadingMessageSource#setScanner(DirectoryScanner) */ public FileInboundChannelAdapterSpec scanner(DirectoryScanner scanner) { this.target.setScanner(scanner); return _this(); } /** * @param autoCreateDirectory the autoCreateDirectory. * @return the spec. * @see FileReadingMessageSource#setAutoCreateDirectory(boolean) */ public FileInboundChannelAdapterSpec autoCreateDirectory(boolean autoCreateDirectory) { this.target.setAutoCreateDirectory(autoCreateDirectory); return _this(); } /** * Configure the filter. * @param filter the filter. * @return the spec. * @see FileReadingMessageSource#setFilter(FileListFilter) */ public FileInboundChannelAdapterSpec filter(FileListFilter<File> filter) { this.fileListFilterFactoryBean.setFilter(filter); return _this(); } /** * Configure the filter; if {@code preventDuplicates == true}, the filter is combined with an * {@link AcceptOnceFileListFilter} in a {@link CompositeFileListFilter}. * @param filter the filter. * @param preventDuplicates true to prevent duplicates. * @return the spec. * @see CompositeFileListFilter * @see AcceptOnceFileListFilter * @deprecated since 1.1 in favor of the bunch of methods usage. */ @Deprecated public FileInboundChannelAdapterSpec filter(FileListFilter<File> filter, boolean preventDuplicates) { return filter(filter) .preventDuplicates(preventDuplicates); } /** * Configure an {@link AcceptOnceFileListFilter} if {@code preventDuplicates == true}, * otherwise nothing changed. * @param preventDuplicates true to configure an {@link AcceptOnceFileListFilter}. * @return the spec. * @see #preventDuplicates * @deprecated since 1.1 in favor of the bunch of methods usage. */ @Deprecated public FileInboundChannelAdapterSpec preventDuplicatesFilter(boolean preventDuplicates) { return preventDuplicates(preventDuplicates); } /** * Configure an {@link AcceptOnceFileListFilter} if {@code preventDuplicates == true}, * otherwise - {@link AcceptAllFileListFilter}. * @param preventDuplicates true to configure an {@link AcceptOnceFileListFilter}. * @return the spec. * @since 1.1.3 */ public FileInboundChannelAdapterSpec preventDuplicates(boolean preventDuplicates) { this.fileListFilterFactoryBean.setPreventDuplicates(preventDuplicates); return _this(); } /** * Configure an {@link AcceptOnceFileListFilter}. * @return the spec. * @since 1.1 * @deprecated since 1.1.3 in favor of {@link #preventDuplicates(boolean)} */ @Deprecated public FileInboundChannelAdapterSpec preventDuplicates() { return filter(new AcceptOnceFileListFilter<File>()); } /** * Configure an {@link IgnoreHiddenFileListFilter}. * @return the spec. * @since 1.1 * @deprecated since 1.1.3 in favor of {@link #ignoreHidden(boolean)} */ @Deprecated public FileInboundChannelAdapterSpec ignoreHidden() { return filter(new IgnoreHiddenFileListFilter()); } /** /** * Configure an {@link IgnoreHiddenFileListFilter} if {@code ignoreHidden == true}. * @param ignoreHidden true to configure an {@link IgnoreHiddenFileListFilter}. * @return the spec. * @since 1.1.3 */ public FileInboundChannelAdapterSpec ignoreHidden(boolean ignoreHidden) { this.fileListFilterFactoryBean.setIgnoreHidden(ignoreHidden); return _this(); } /** * Configure a {@link SimplePatternFileListFilter}. * @param pattern The pattern. * @return the spec. * @see FileReadingMessageSource#setFilter(FileListFilter) * @see #filter(FileListFilter, boolean) */ public FileInboundChannelAdapterSpec patternFilter(String pattern) { this.fileListFilterFactoryBean.setFilenamePattern(pattern); return _this(); } /** * Configure a {@link SimplePatternFileListFilter}. * @param pattern The pattern. * @param preventDuplicates the preventDuplicates. * @return the spec. * @see FileReadingMessageSource#setFilter(FileListFilter) * @see #filter(FileListFilter, boolean) * @see #preventDuplicates * @deprecated since 1.1 in favor of the bunch of methods usage. */ @Deprecated public FileInboundChannelAdapterSpec patternFilter(String pattern, boolean preventDuplicates) { return patternFilter(pattern) .preventDuplicates(preventDuplicates); } /** * Configure a {@link RegexPatternFileListFilter}. * @param regex The regex. * @return the spec. * @see FileReadingMessageSource#setFilter(FileListFilter) * @see #filter(FileListFilter, boolean) */ public FileInboundChannelAdapterSpec regexFilter(String regex) { this.fileListFilterFactoryBean.setFilenameRegex(regex); return _this(); } /** * Configure a {@link RegexPatternFileListFilter}. * @param regex The regex. * @param preventDuplicates the preventDuplicates. * @return the spec. * @see FileReadingMessageSource#setFilter(FileListFilter) * @see #filter(FileListFilter, boolean) * @see #preventDuplicates * @deprecated since 1.1 in favor of the bunch of methods usage. */ @Deprecated public FileInboundChannelAdapterSpec regexFilter(String regex, boolean preventDuplicates) { return regexFilter(regex) .preventDuplicates(preventDuplicates); } /** * @param locker the locker. * @return the spec. * @see FileReadingMessageSource#setLocker(FileLocker) */ public FileInboundChannelAdapterSpec locker(FileLocker locker) { Assert.isNull(this.locker, "The 'locker' (" + this.locker + ") is already configured for the FileReadingMessageSource"); this.locker = locker; this.target.setLocker(locker); return _this(); } /** * Configure an {@link NioFileLocker}. * @return the spec. * @see #locker(FileLocker) */ public FileInboundChannelAdapterSpec nioLocker() { return locker(new NioFileLocker()); } /** * @param scanEachPoll the scanEachPoll. * @return the spec. * @see FileReadingMessageSource#setScanEachPoll(boolean) */ public FileInboundChannelAdapterSpec scanEachPoll(boolean scanEachPoll) { this.target.setScanEachPoll(scanEachPoll); return _this(); } /** * Switch this {@link FileReadingMessageSource} to use its internal * {@link java.nio.file.WatchService} directory scanner. * @param useWatchService the {@code boolean} flag to enable the use * of a {@link java.nio.file.WatchService}. * @return the spec. * @since 1.2 * @see #watchEvents * @see FileReadingMessageSource#setUseWatchService(boolean) */ public FileInboundChannelAdapterSpec useWatchService(boolean useWatchService) { this.target.setUseWatchService(useWatchService); return this; } /** * The {@link java.nio.file.WatchService} event types. * If {@link #useWatchService} isn't {@code true}, this option is ignored. * @param watchEvents the set of {@link FileReadingMessageSource.WatchEventType}. * @return the spec. * @since 1.2 * @see #useWatchService * @see FileReadingMessageSource#setWatchEvents */ public FileInboundChannelAdapterSpec watchEvents(FileReadingMessageSource.WatchEventType... watchEvents) { this.target.setWatchEvents(watchEvents); return this; } }