polishing

This commit is contained in:
Mark Fisher
2010-11-05 14:07:11 -04:00
parent 295af55242
commit 6abae5412b
11 changed files with 249 additions and 248 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2009 the original author or authors.
* Copyright 2002-2010 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.

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2009 the original author or authors.
* Copyright 2002-2010 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.
@@ -31,73 +31,72 @@ import org.springframework.util.xml.DomUtils;
/**
* Parser for the <inbound-channel-adapter> element of the 'file' namespace.
*
*
* @author Iwein Fuld
* @author Mark Fisher
*/
public class FileInboundChannelAdapterParser extends AbstractPollingInboundChannelAdapterParser {
private static final String PACKAGE_NAME = "org.springframework.integration.file";
private static final String PACKAGE_NAME = "org.springframework.integration.file";
@Override
protected BeanMetadataElement parseSource(Element element, ParserContext parserContext) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(
PACKAGE_NAME + ".config.FileReadingMessageSourceFactoryBean");
IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "comparator");
IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "scanner");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "directory");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "auto-create-directory");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "queue-size");
String filterBeanName = this.registerFilter(element, parserContext);
String lockerBeanName = registerLocker(element, parserContext);
if (lockerBeanName != null) {
builder.addPropertyReference("locker", lockerBeanName);
}
builder.addPropertyReference("filter", filterBeanName);
String beanName = BeanDefinitionReaderUtils.registerWithGeneratedName(builder.getBeanDefinition(), parserContext.getRegistry());
return new RuntimeBeanReference(beanName);
}
@Override
protected BeanMetadataElement parseSource(Element element, ParserContext parserContext) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(
PACKAGE_NAME + ".config.FileReadingMessageSourceFactoryBean");
IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "comparator");
IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "scanner");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "directory");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "auto-create-directory");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "queue-size");
String filterBeanName = this.registerFilter(element, parserContext);
String lockerBeanName = registerLocker(element, parserContext);
if (lockerBeanName != null) {
builder.addPropertyReference("locker", lockerBeanName);
}
builder.addPropertyReference("filter", filterBeanName);
String beanName = BeanDefinitionReaderUtils.registerWithGeneratedName(
builder.getBeanDefinition(), parserContext.getRegistry());
return new RuntimeBeanReference(beanName);
}
private String registerLocker(Element element, ParserContext parserContext) {
String lockerBeanName = null;
Element nioLocker = DomUtils.getChildElementByTagName(element, "nio-locker");
if (nioLocker != null) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder
.genericBeanDefinition(PACKAGE_NAME + ".locking.NioFileLocker");
lockerBeanName = BeanDefinitionReaderUtils.registerWithGeneratedName(builder.getBeanDefinition(),
parserContext.getRegistry());
} else {
Element locker = DomUtils.getChildElementByTagName(element, "locker");
if (locker != null) {
lockerBeanName = locker.getAttribute("ref");
}
}
return lockerBeanName;
}
private String registerLocker(Element element, ParserContext parserContext) {
String lockerBeanName = null;
Element nioLocker = DomUtils.getChildElementByTagName(element, "nio-locker");
if (nioLocker != null) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(
PACKAGE_NAME + ".locking.NioFileLocker");
lockerBeanName = BeanDefinitionReaderUtils.registerWithGeneratedName(
builder.getBeanDefinition(), parserContext.getRegistry());
}
else {
Element locker = DomUtils.getChildElementByTagName(element, "locker");
if (locker != null) {
lockerBeanName = locker.getAttribute("ref");
}
}
return lockerBeanName;
}
private String registerFilter(Element element, ParserContext parserContext) {
BeanDefinitionBuilder factoryBeanBuilder = BeanDefinitionBuilder.genericBeanDefinition(
PACKAGE_NAME + ".config.FileListFilterFactoryBean");
factoryBeanBuilder.setRole(BeanDefinition.ROLE_SUPPORT);
String filter = element.getAttribute("filter");
if (StringUtils.hasText(filter)) {
factoryBeanBuilder.addPropertyReference("filterReference", filter);
}
String filenamePattern = element.getAttribute("filename-pattern");
if (StringUtils.hasText(filenamePattern)) {
if (StringUtils.hasText(filter)) {
parserContext.getReaderContext().error(
"At most one of 'filter' and 'filename-pattern' may be provided.", element);
}
factoryBeanBuilder.addPropertyValue("filenamePattern", filenamePattern);
}
String preventDuplicates = element.getAttribute("prevent-duplicates");
if (StringUtils.hasText(preventDuplicates)) {
factoryBeanBuilder.addPropertyValue("preventDuplicates", preventDuplicates);
}
return BeanDefinitionReaderUtils.registerWithGeneratedName(
factoryBeanBuilder.getBeanDefinition(), parserContext.getRegistry());
}
private String registerFilter(Element element, ParserContext parserContext) {
BeanDefinitionBuilder factoryBeanBuilder = BeanDefinitionBuilder.genericBeanDefinition(
PACKAGE_NAME + ".config.FileListFilterFactoryBean");
factoryBeanBuilder.setRole(BeanDefinition.ROLE_SUPPORT);
String filter = element.getAttribute("filter");
if (StringUtils.hasText(filter)) {
factoryBeanBuilder.addPropertyReference("filterReference", filter);
}
String filenamePattern = element.getAttribute("filename-pattern");
if (StringUtils.hasText(filenamePattern)) {
if (StringUtils.hasText(filter)) {
parserContext.getReaderContext().error(
"At most one of 'filter' and 'filename-pattern' may be provided.", element);
}
factoryBeanBuilder.addPropertyValue("filenamePattern", filenamePattern);
}
IntegrationNamespaceUtils.setValueIfAttributeDefined(factoryBeanBuilder, element, "prevent-duplicates");
return BeanDefinitionReaderUtils.registerWithGeneratedName(
factoryBeanBuilder.getBeanDefinition(), parserContext.getRegistry());
}
}

View File

@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.integration.file.config;
import org.springframework.beans.factory.FactoryBean;
@@ -22,107 +23,111 @@ import org.springframework.integration.file.filters.SimplePatternFileListFilter;
import java.io.File;
import java.util.Collection;
/**
* @author Mark Fisher
* @since 1.0.3
*/
public class FileListFilterFactoryBean implements FactoryBean<EntryListFilter<File>> {
private volatile EntryListFilter<File> fileListFilter;
private volatile EntryListFilter<File> filterReference;
private volatile String filenamePattern;
private volatile Boolean preventDuplicates;
private final Object monitor = new Object();
private volatile Collection<EntryListFilter<File>> filterReferences;
private FileEntryNamer fileNamer = new FileEntryNamer();
public void setFilterReferences(Collection<EntryListFilter<File>> filterReferences) {
this.filterReferences = filterReferences;
}
private volatile EntryListFilter<File> fileListFilter;
public void setFilterReference(EntryListFilter<File> filterReference) {
this.filterReference = filterReference;
}
private volatile EntryListFilter<File> filterReference;
public void setFilenamePattern(String filenamePattern) {
this.filenamePattern = filenamePattern;
}
private volatile String filenamePattern;
public void setPreventDuplicates(Boolean preventDuplicates) {
this.preventDuplicates = preventDuplicates;
}
private volatile Boolean preventDuplicates;
public EntryListFilter<File> getObject() throws Exception {
if (this.fileListFilter == null) {
synchronized (this.monitor) {
this.intializeFileListFilter();
}
}
private final Object monitor = new Object();
return this.fileListFilter;
}
private volatile Collection<EntryListFilter<File>> filterReferences;
public Class<?> getObjectType() {
return (this.fileListFilter != null) ? this.fileListFilter.getClass() : EntryListFilter.class;
}
public boolean isSingleton() {
return true;
}
public void setFilterReferences(Collection<EntryListFilter<File>> filterReferences) {
this.filterReferences = filterReferences;
}
private void intializeFileListFilter() {
if (this.fileListFilter != null) {
return;
}
public void setFilterReference(EntryListFilter<File> filterReference) {
this.filterReference = filterReference;
}
EntryListFilter<File> flf ;
public void setFilenamePattern(String filenamePattern) {
this.filenamePattern = filenamePattern;
}
if ((this.filterReference != null) && (this.filenamePattern != null)) {
throw new IllegalArgumentException("The 'filter' reference and " + "'filename-pattern' attributes are mutually exclusive.");
}
public void setPreventDuplicates(Boolean preventDuplicates) {
this.preventDuplicates = preventDuplicates;
}
if (this.filterReference != null) {
if (Boolean.TRUE.equals(this.preventDuplicates)) {
flf = this.createCompositeWithAcceptOnceFilter(this.filterReference);
} else { // preventDuplicates is either FALSE or NULL
flf = this.filterReference;
}
} else if (this.filenamePattern != null) {
SimplePatternFileListFilter patternFilter = new SimplePatternFileListFilter(this.filenamePattern);
public EntryListFilter<File> getObject() throws Exception {
if (this.fileListFilter == null) {
synchronized (this.monitor) {
this.intializeFileListFilter();
}
}
return this.fileListFilter;
}
if (Boolean.FALSE.equals(this.preventDuplicates)) {
flf = patternFilter;
} else { // preventDuplicates is either TRUE or NULL
flf = this.createCompositeWithAcceptOnceFilter(patternFilter);
}
} else if (Boolean.FALSE.equals(this.preventDuplicates)) {
flf = new AcceptAllEntryListFilter<File>();
} else { // preventDuplicates is either TRUE or NULL
flf = new AcceptOnceEntryFileListFilter<File>();
}
public Class<?> getObjectType() {
return (this.fileListFilter != null) ? this.fileListFilter.getClass() : EntryListFilter.class;
}
// finally, it might be that they simply want a {@link CompositeEntryListFilter}
if ((this.filterReferences != null) && (this.filterReferences.size() > 0)) {
CompositeEntryListFilter<File> flfc = new CompositeEntryListFilter<File>();
public boolean isSingleton() {
return true;
}
for (EntryListFilter<File> ff : filterReferences)
flfc.addFilter(ff);
private void intializeFileListFilter() {
if (this.fileListFilter != null) {
return;
}
EntryListFilter<File> filter;
if ((this.filterReference != null) && (this.filenamePattern != null)) {
throw new IllegalArgumentException("The 'filter' reference and "
+ "'filename-pattern' attributes are mutually exclusive.");
}
flf = flfc;
}
if (this.filterReference != null) {
if (Boolean.TRUE.equals(this.preventDuplicates)) {
filter = this.createCompositeWithAcceptOnceFilter(this.filterReference);
}
else { // preventDuplicates is either FALSE or NULL
filter = this.filterReference;
}
}
else if (this.filenamePattern != null) {
SimplePatternFileListFilter patternFilter = new SimplePatternFileListFilter(this.filenamePattern);
if (Boolean.FALSE.equals(this.preventDuplicates)) {
filter = patternFilter;
}
else { // preventDuplicates is either TRUE or NULL
filter = this.createCompositeWithAcceptOnceFilter(patternFilter);
}
}
else if (Boolean.FALSE.equals(this.preventDuplicates)) {
filter = new AcceptAllEntryListFilter<File>();
}
else { // preventDuplicates is either TRUE or NULL
filter = new AcceptOnceEntryFileListFilter<File>();
}
if (flf == null) {
flf = new CompositeEntryListFilter<File>();
}
// finally, it might be that they simply want a {@link CompositeEntryListFilter}
if ((this.filterReferences != null) && (this.filterReferences.size() > 0)) {
CompositeEntryListFilter<File> compositeFilter = new CompositeEntryListFilter<File>();
for (EntryListFilter<File> ff : filterReferences) {
compositeFilter.addFilter(ff);
}
filter = compositeFilter;
}
if (filter == null) {
filter = new CompositeEntryListFilter<File>();
}
this.fileListFilter = filter;
}
this.fileListFilter = flf;
}
private CompositeEntryListFilter<File> createCompositeWithAcceptOnceFilter(EntryListFilter<File> otherFilter) {
CompositeEntryListFilter<File> compositeFilter = new CompositeEntryListFilter<File>();
compositeFilter.addFilter(new AcceptOnceEntryFileListFilter<File>());
compositeFilter.addFilter(otherFilter);
return compositeFilter;
}
private CompositeEntryListFilter<File> createCompositeWithAcceptOnceFilter(EntryListFilter<File> otherFilter) {
CompositeEntryListFilter<File> compositeFilter = new CompositeEntryListFilter<File>();
compositeFilter.addFilter(new AcceptOnceEntryFileListFilter<File>());
compositeFilter.addFilter(otherFilter);
return compositeFilter;
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2009 the original author or authors.
* Copyright 2002-2010 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.

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2009 the original author or authors.
* Copyright 2002-2010 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.

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2009 the original author or authors.
* Copyright 2002-2010 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.

View File

@@ -13,10 +13,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.integration.file.config;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.integration.file.DirectoryScanner;
import org.springframework.integration.file.FileReadingMessageSource;
@@ -27,134 +29,129 @@ import org.springframework.integration.file.locking.AbstractFileLockerFilter;
import java.io.File;
import java.util.Comparator;
/**
* @author Mark Fisher
* @author Iwein Fuld
* @since 1.0.3
*/
public class FileReadingMessageSourceFactoryBean implements FactoryBean<FileReadingMessageSource> {
private static Log logger = LogFactory.getLog(FileReadingMessageSourceFactoryBean.class);
private volatile FileReadingMessageSource source;
private volatile File directory;
private volatile EntryListFilter<File> filter;
private volatile AbstractFileLockerFilter locker;
private volatile Comparator<File> comparator;
private volatile DirectoryScanner scanner;
private volatile Boolean scanEachPoll;
private volatile Boolean autoCreateDirectory;
private volatile Integer queueSize;
private final Object initializationMonitor = new Object();
@SuppressWarnings("unused")
public void setDirectory(File directory) {
this.directory = directory;
}
private static Log logger = LogFactory.getLog(FileReadingMessageSourceFactoryBean.class);
@SuppressWarnings("unused")
public void setComparator(Comparator<File> comparator) {
this.comparator = comparator;
}
private volatile FileReadingMessageSource source;
@SuppressWarnings("unused")
public void setScanner(DirectoryScanner scanner) {
this.scanner = scanner;
}
private volatile File directory;
@SuppressWarnings("unused")
public void setFilter(EntryListFilter<File> filter) {
if (filter instanceof AbstractFileLockerFilter && (this.locker == null)) {
this.setLocker((AbstractFileLockerFilter) filter);
}
private volatile EntryListFilter<File> filter;
this.filter = filter;
}
private volatile AbstractFileLockerFilter locker;
@SuppressWarnings("unused")
public void setScanEachPoll(Boolean scanEachPoll) {
this.scanEachPoll = scanEachPoll;
}
private volatile Comparator<File> comparator;
@SuppressWarnings("unused")
public void setAutoCreateDirectory(Boolean autoCreateDirectory) {
this.autoCreateDirectory = autoCreateDirectory;
}
private volatile DirectoryScanner scanner;
@SuppressWarnings("unused")
public void setQueueSize(Integer queueSize) {
this.queueSize = queueSize;
}
private volatile Boolean scanEachPoll;
public void setLocker(AbstractFileLockerFilter locker) {
this.locker = locker;
}
private volatile Boolean autoCreateDirectory;
public FileReadingMessageSource getObject() throws Exception {
if (this.source == null) {
initSource();
}
private volatile Integer queueSize;
return this.source;
}
private final Object initializationMonitor = new Object();
public Class<?> getObjectType() {
return FileReadingMessageSource.class;
}
public boolean isSingleton() {
return true;
}
public void setDirectory(File directory) {
this.directory = directory;
}
private void initSource() {
synchronized (this.initializationMonitor) {
if (this.source != null) {
return;
}
public void setComparator(Comparator<File> comparator) {
this.comparator = comparator;
}
boolean comparatorSet = this.comparator != null;
boolean queueSizeSet = this.queueSize != null;
public void setScanner(DirectoryScanner scanner) {
this.scanner = scanner;
}
if (comparatorSet) {
if (queueSizeSet) {
logger.warn("'comparator' and 'queueSize' are mutually exclusive. Ignoring 'queueSize'");
}
public void setFilter(EntryListFilter<File> filter) {
if (filter instanceof AbstractFileLockerFilter && (this.locker == null)) {
this.setLocker((AbstractFileLockerFilter) filter);
}
this.filter = filter;
}
this.source = new FileReadingMessageSource(this.comparator);
} else if (queueSizeSet) {
this.source = new FileReadingMessageSource(queueSize);
} else {
this.source = new FileReadingMessageSource();
}
public void setScanEachPoll(Boolean scanEachPoll) {
this.scanEachPoll = scanEachPoll;
}
this.source.setDirectory(this.directory);
public void setAutoCreateDirectory(Boolean autoCreateDirectory) {
this.autoCreateDirectory = autoCreateDirectory;
}
if (this.scanner != null) {
this.source.setScanner(this.scanner);
}
public void setQueueSize(Integer queueSize) {
this.queueSize = queueSize;
}
if (this.filter != null) {
if (this.locker == null) {
this.source.setFilter(this.filter);
} else {
CompositeEntryListFilter<File> fileCompositeEntryListFilter = new CompositeEntryListFilter<File>();
public void setLocker(AbstractFileLockerFilter locker) {
this.locker = locker;
}
public FileReadingMessageSource getObject() throws Exception {
if (this.source == null) {
initSource();
}
return this.source;
}
public Class<?> getObjectType() {
return FileReadingMessageSource.class;
}
public boolean isSingleton() {
return true;
}
private void initSource() {
synchronized (this.initializationMonitor) {
if (this.source != null) {
return;
}
boolean comparatorSet = this.comparator != null;
boolean queueSizeSet = this.queueSize != null;
if (comparatorSet) {
if (queueSizeSet) {
logger.warn("'comparator' and 'queueSize' are mutually exclusive. Ignoring 'queueSize'");
}
this.source = new FileReadingMessageSource(this.comparator);
}
else if (queueSizeSet) {
this.source = new FileReadingMessageSource(queueSize);
}
else {
this.source = new FileReadingMessageSource();
}
this.source.setDirectory(this.directory);
if (this.scanner != null) {
this.source.setScanner(this.scanner);
}
if (this.filter != null) {
if (this.locker == null) {
this.source.setFilter(this.filter);
}
else {
CompositeEntryListFilter<File> fileCompositeEntryListFilter = new CompositeEntryListFilter<File>();
fileCompositeEntryListFilter.addFilter(this.filter);
fileCompositeEntryListFilter.addFilter(this.locker);
this.source.setFilter(fileCompositeEntryListFilter);
this.source.setLocker(locker);
}
}
if (this.scanEachPoll != null) {
this.source.setScanEachPoll(this.scanEachPoll);
}
if (this.autoCreateDirectory != null) {
this.source.setAutoCreateDirectory(this.autoCreateDirectory);
}
this.source.afterPropertiesSet();
}
}
this.source.setFilter(fileCompositeEntryListFilter);
this.source.setLocker(locker);
}
}
if (this.scanEachPoll != null) {
this.source.setScanEachPoll(this.scanEachPoll);
}
if (this.autoCreateDirectory != null) {
this.source.setAutoCreateDirectory(this.autoCreateDirectory);
}
this.source.afterPropertiesSet();
}
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2008 the original author or authors.
* Copyright 2002-2010 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.

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2008 the original author or authors.
* Copyright 2002-2010 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.

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2009 the original author or authors.
* Copyright 2002-2010 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.

View File

@@ -32,8 +32,7 @@ import java.io.File;
* @author Iwein Fuld
* @since 1.0.3
*/
public class FileWritingMessageHandlerFactoryBean implements FactoryBean<FileWritingMessageHandler>,
BeanFactoryAware {
public class FileWritingMessageHandlerFactoryBean implements FactoryBean<FileWritingMessageHandler>, BeanFactoryAware {
private volatile FileWritingMessageHandler handler;
@@ -61,6 +60,7 @@ public class FileWritingMessageHandlerFactoryBean implements FactoryBean<FileWri
private final Object initializationMonitor = new Object();
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}