/*
* Copyright 2002-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.resource;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.util.Collection;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.beans.factory.BeanCreationException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.Resource;
import org.springframework.integration.channel.QueueChannel;
import org.springframework.integration.endpoint.SourcePollingChannelAdapter;
import org.springframework.integration.test.util.TestUtils;
import org.springframework.integration.util.CollectionFilter;
import org.springframework.messaging.Message;
/**
* @author Oleg Zhurakousky
* @author Artem Bilan
* @author Gary Russell
* @since 2.1
*/
public class ResourceInboundChannelAdapterParserTests {
private static File workDir;
@BeforeClass
public static void setupClass() {
workDir = new File(System.getProperty("java.io.tmpdir"), "ResourceInboundChannelAdapterParserTests");
workDir.mkdir();
workDir.deleteOnExit();
}
@After
public void cleanUpWorkDir() throws Exception {
File[] listFiles = workDir.listFiles();
for (File file : listFiles) {
file.delete();
}
}
@AfterClass
public static void cleanUp() {
workDir.delete();
}
@Test
public void testDefaultConfig() {
ApplicationContext context = new ClassPathXmlApplicationContext("ResourcePatternResolver-config.xml",
this.getClass());
SourcePollingChannelAdapter resourceAdapter = context.getBean("resourceAdapterDefault",
SourcePollingChannelAdapter.class);
ResourceRetrievingMessageSource source = TestUtils.getPropertyValue(resourceAdapter, "source",
ResourceRetrievingMessageSource.class);
assertNotNull(source);
boolean autoStartup = TestUtils.getPropertyValue(resourceAdapter, "autoStartup", Boolean.class);
assertFalse(autoStartup);
assertEquals("/**/*", TestUtils.getPropertyValue(source, "pattern"));
assertEquals(context, TestUtils.getPropertyValue(source, "patternResolver"));
}
@Test(expected = BeanCreationException.class)
public void testDefaultConfigNoLocationPattern() {
new ClassPathXmlApplicationContext("ResourcePatternResolver-config-fail.xml", this.getClass()).close();
}
@Test
public void testCustomPatternResolver() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"ResourcePatternResolver-config-custom.xml", this.getClass());
SourcePollingChannelAdapter resourceAdapter = context.getBean("resourceAdapterDefault",
SourcePollingChannelAdapter.class);
ResourceRetrievingMessageSource source = TestUtils.getPropertyValue(resourceAdapter, "source",
ResourceRetrievingMessageSource.class);
assertNotNull(source);
assertEquals(context.getBean("customResolver"), TestUtils.getPropertyValue(source, "patternResolver"));
context.close();
}
@SuppressWarnings("unchecked")
@Test
public void testUsage() throws Exception {
for (int i = 0; i < 10; i++) {
File f = new File(workDir, "testUsage" + i);
f.createNewFile();
}
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"ResourcePatternResolver-config-usage.xml", this.getClass());
QueueChannel resultChannel = context.getBean("resultChannel", QueueChannel.class);
Message<Resource[]> message = (Message<Resource[]>) resultChannel.receive(10000);
assertNotNull(message);
Resource[] resources = message.getPayload();
for (Resource resource : resources) {
assertTrue(resource.getURI().toString().contains("testUsage"));
}
context.close();
}
@SuppressWarnings("unchecked")
@Test
public void testUsageWithCustomResourceFilter() throws Exception {
for (int i = 0; i < 10; i++) {
File f = new File(workDir, "testUsageWithRf" + i);
f.createNewFile();
}
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"ResourcePatternResolver-config-usagerf.xml", this.getClass());
SourcePollingChannelAdapter resourceAdapter = context.getBean("resourceAdapterDefault",
SourcePollingChannelAdapter.class);
ResourceRetrievingMessageSource source = TestUtils.getPropertyValue(resourceAdapter, "source",
ResourceRetrievingMessageSource.class);
assertNotNull(source);
TestCollectionFilter customFilter = context.getBean("customFilter", TestCollectionFilter.class);
assertEquals(customFilter, TestUtils.getPropertyValue(source, "filter"));
assertFalse(customFilter.invoked);
resourceAdapter.start();
QueueChannel resultChannel = context.getBean("resultChannel", QueueChannel.class);
Message<Resource[]> message = (Message<Resource[]>) resultChannel.receive(10000);
assertNotNull(message);
assertTrue(customFilter.invoked);
context.close();
}
@Test
public void testUsageWithEmptyFilter() throws Exception {
for (int i = 0; i < 10; i++) {
File f = new File(workDir, "testUsageWithRf" + i);
f.createNewFile();
}
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"ResourcePatternResolver-config-usage-emptyref.xml", this.getClass());
SourcePollingChannelAdapter resourceAdapter = context.getBean("resourceAdapterDefault",
SourcePollingChannelAdapter.class);
ResourceRetrievingMessageSource source = TestUtils.getPropertyValue(resourceAdapter, "source",
ResourceRetrievingMessageSource.class);
assertNotNull(source);
assertNull(TestUtils.getPropertyValue(source, "filter"));
context.close();
}
public static class TestCollectionFilter implements CollectionFilter<Resource> {
private volatile boolean invoked = false;
@Override
public Collection<Resource> filter(Collection<Resource> unfilteredResources) {
this.invoked = true;
return unfilteredResources;
}
}
}