INT-1527 MetadataStore refactoring
This commit is contained in:
@@ -13,6 +13,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.integration.feed;
|
||||
|
||||
import static junit.framework.Assert.assertEquals;
|
||||
@@ -29,42 +30,47 @@ import java.util.List;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import org.springframework.integration.Message;
|
||||
import org.springframework.integration.context.metadata.PropertiesPersistingMetadataStore;
|
||||
|
||||
import com.sun.syndication.feed.synd.SyndEntry;
|
||||
import com.sun.syndication.feed.synd.SyndFeed;
|
||||
|
||||
/**
|
||||
* @author Oleg Zhurakousky
|
||||
*
|
||||
* @author Mark Fisher
|
||||
* @since 2.0
|
||||
*/
|
||||
public class FeedEntryReaderMessageSourceTests {
|
||||
|
||||
@Before
|
||||
public void prepare(){
|
||||
File persisterFile = new File(System.getProperty("java.io.tmpdir") + "/spring-integration/", "feedReader.last.entry");
|
||||
if (persisterFile.exists()){
|
||||
persisterFile.delete();
|
||||
public void prepare() {
|
||||
File metadataStoreFile = new File(System.getProperty("java.io.tmpdir") + "/spring-integration/", "metadata-store.properties");
|
||||
if (metadataStoreFile.exists()) {
|
||||
metadataStoreFile.delete();
|
||||
}
|
||||
}
|
||||
|
||||
@Test(expected=IllegalArgumentException.class)
|
||||
public void testFailureWhenNotInitialized(){
|
||||
public void testFailureWhenNotInitialized() {
|
||||
FeedEntryReaderMessageSource feedEntrySource = new FeedEntryReaderMessageSource(mock(FeedReaderMessageSource.class));
|
||||
feedEntrySource.receive();
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testReceieveFeedWithNoEntries(){
|
||||
public void testReceiveFeedWithNoEntries() {
|
||||
FeedReaderMessageSource feedReaderSource = mock(FeedReaderMessageSource.class);
|
||||
SyndFeed feed = mock(SyndFeed.class);
|
||||
when(feedReaderSource.receiveSyndFeed()).thenReturn(feed);
|
||||
FeedEntryReaderMessageSource feedEntrySource = new FeedEntryReaderMessageSource(feedReaderSource);
|
||||
feedEntrySource.setPersistentIdentifier("feedReader");
|
||||
feedEntrySource.setBeanName("feedReader");
|
||||
feedEntrySource.afterPropertiesSet();
|
||||
assertNull(feedEntrySource.receive());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReceieveFeedWithEntriesSorted(){
|
||||
public void testReceiveFeedWithEntriesSorted() {
|
||||
FeedReaderMessageSource feedReaderSource = mock(FeedReaderMessageSource.class);
|
||||
SyndFeed feed = mock(SyndFeed.class);
|
||||
SyndEntry entry1 = mock(SyndEntry.class);
|
||||
@@ -79,7 +85,7 @@ public class FeedEntryReaderMessageSourceTests {
|
||||
when(feedReaderSource.receiveSyndFeed()).thenReturn(feed);
|
||||
|
||||
FeedEntryReaderMessageSource feedEntrySource = new FeedEntryReaderMessageSource(feedReaderSource);
|
||||
feedEntrySource.setPersistentIdentifier("feedReader");
|
||||
feedEntrySource.setComponentName("feedReader");
|
||||
feedEntrySource.afterPropertiesSet();
|
||||
Message<SyndEntry> entryMessage = feedEntrySource.receive();
|
||||
assertEquals(entry2, entryMessage.getPayload());
|
||||
@@ -89,15 +95,18 @@ public class FeedEntryReaderMessageSourceTests {
|
||||
entryMessage = feedEntrySource.receive();
|
||||
assertNull(entryMessage);
|
||||
}
|
||||
// will test, that last feed entry is remembered between the sessions
|
||||
|
||||
// will test that last feed entry is remembered between the sessions
|
||||
// and no duplicate entries are retrieved
|
||||
@Test
|
||||
public void testReceieveFeedWithRealEntriesAndRepeatWithPersistentIdentifier() throws Exception{
|
||||
FeedReaderMessageSource feedReaderSource =
|
||||
new FeedReaderMessageSource(new URL("file:src/test/java/org/springframework/integration/feed/sample.rss"));
|
||||
|
||||
public void testReceiveFeedWithRealEntriesAndRepeatWithPersistentMetadataStore() throws Exception {
|
||||
URL url = new URL("file:src/test/java/org/springframework/integration/feed/sample.rss");
|
||||
FeedReaderMessageSource feedReaderSource = new FeedReaderMessageSource(url);
|
||||
FeedEntryReaderMessageSource feedEntrySource = new FeedEntryReaderMessageSource(feedReaderSource);
|
||||
feedEntrySource.setPersistentIdentifier("feedReader");
|
||||
feedEntrySource.setBeanName("feedReader");
|
||||
PropertiesPersistingMetadataStore metadataStore = new PropertiesPersistingMetadataStore();
|
||||
metadataStore.afterPropertiesSet();
|
||||
feedEntrySource.setMetadataStore(metadataStore);
|
||||
feedEntrySource.afterPropertiesSet();
|
||||
SyndEntry entry1 = feedEntrySource.receive().getPayload();
|
||||
SyndEntry entry2 = feedEntrySource.receive().getPayload();
|
||||
@@ -113,23 +122,29 @@ public class FeedEntryReaderMessageSourceTests {
|
||||
assertEquals("Spring Integration adapters", entry3.getTitle().trim());
|
||||
assertEquals(1272044098000L, entry3.getPublishedDate().getTime());
|
||||
|
||||
metadataStore.destroy();
|
||||
metadataStore.afterPropertiesSet();
|
||||
|
||||
// now test that what's been read is no longer retrieved
|
||||
feedEntrySource = new FeedEntryReaderMessageSource(feedReaderSource);
|
||||
feedEntrySource.setPersistentIdentifier("feedReader");
|
||||
feedEntrySource.setBeanName("feedReader");
|
||||
metadataStore = new PropertiesPersistingMetadataStore();
|
||||
metadataStore.afterPropertiesSet();
|
||||
feedEntrySource.setMetadataStore(metadataStore);
|
||||
feedEntrySource.afterPropertiesSet();
|
||||
assertNull(feedEntrySource.receive());
|
||||
assertNull(feedEntrySource.receive());
|
||||
assertNull(feedEntrySource.receive());
|
||||
}
|
||||
// will test, that last feed entry is NOT remembered between the sessions, since
|
||||
// persister is not used due to the lack of persistentIdentifier (id attribute in xml)
|
||||
// and the same entries are retrieved again
|
||||
|
||||
// will test that last feed entry is NOT remembered between the sessions, since
|
||||
// no persistent MetadataStore is provided and the same entries are retrieved again
|
||||
@Test
|
||||
public void testReceieveFeedWithRealEntriesAndRepeatNoPersistentIdentifier() throws Exception{
|
||||
FeedReaderMessageSource feedReaderSource =
|
||||
new FeedReaderMessageSource(new URL("file:src/test/java/org/springframework/integration/feed/sample.rss"));
|
||||
|
||||
public void testReceiveFeedWithRealEntriesAndRepeatNoPersistentMetadataStore() throws Exception {
|
||||
URL url = new URL("file:src/test/java/org/springframework/integration/feed/sample.rss");
|
||||
FeedReaderMessageSource feedReaderSource = new FeedReaderMessageSource(url);
|
||||
FeedEntryReaderMessageSource feedEntrySource = new FeedEntryReaderMessageSource(feedReaderSource);
|
||||
feedEntrySource.setBeanName("feedReader");
|
||||
feedEntrySource.afterPropertiesSet();
|
||||
SyndEntry entry1 = feedEntrySource.receive().getPayload();
|
||||
SyndEntry entry2 = feedEntrySource.receive().getPayload();
|
||||
@@ -148,6 +163,7 @@ public class FeedEntryReaderMessageSourceTests {
|
||||
// UNLIKE the previous test
|
||||
// now test that what's been read is read AGAIN
|
||||
feedEntrySource = new FeedEntryReaderMessageSource(feedReaderSource);
|
||||
feedEntrySource.setBeanName("feedReader");
|
||||
feedEntrySource.afterPropertiesSet();
|
||||
entry1 = feedEntrySource.receive().getPayload();
|
||||
entry2 = feedEntrySource.receive().getPayload();
|
||||
@@ -162,5 +178,6 @@ public class FeedEntryReaderMessageSourceTests {
|
||||
|
||||
assertEquals("Spring Integration adapters", entry3.getTitle().trim());
|
||||
assertEquals(1272044098000L, entry3.getPublishedDate().getTime());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -5,19 +5,19 @@
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
|
||||
http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration-2.0.xsd
|
||||
http://www.springframework.org/schema/integration/feed http://www.springframework.org/schema/integration/feed/spring-integration-feed-2.0.xsd">
|
||||
|
||||
|
||||
|
||||
<int-feed:inbound-channel-adapter id="feedAdapter"
|
||||
channel="feedChannel"
|
||||
auto-startup="false"
|
||||
metadata-store="metaStore"
|
||||
metadata-store="customMetadataStore"
|
||||
feed-url="file:src/test/java/org/springframework/integration/feed/config/sample.rss">
|
||||
<int:poller fixed-rate="10000" max-messages-per-poll="100" />
|
||||
</int-feed:inbound-channel-adapter>
|
||||
|
||||
|
||||
<int:channel id="feedChannel">
|
||||
<int:queue/>
|
||||
</int:channel>
|
||||
|
||||
<bean id="metaStore" class="org.springframework.integration.feed.config.FeedMessageSourceBeanDefinitionParserTests.SampleMetadataStore"/>
|
||||
|
||||
<bean id="customMetadataStore" class="org.springframework.integration.feed.config.FeedMessageSourceBeanDefinitionParserTests.SampleMetadataStore"/>
|
||||
|
||||
</beans>
|
||||
@@ -18,4 +18,6 @@
|
||||
<bean class="org.springframework.integration.feed.config.FeedMessageSourceBeanDefinitionParserTests$SampleService" />
|
||||
</int:service-activator>
|
||||
|
||||
</beans>
|
||||
<bean id="metadataStore" class="org.springframework.integration.context.metadata.PropertiesPersistingMetadataStore"/>
|
||||
|
||||
</beans>
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.integration.feed.config;
|
||||
|
||||
import static junit.framework.Assert.assertEquals;
|
||||
@@ -31,6 +32,7 @@ import org.junit.Before;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.mockito.Mockito;
|
||||
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||
import org.springframework.integration.Message;
|
||||
@@ -51,32 +53,35 @@ import com.sun.syndication.fetcher.impl.HttpURLFeedFetcher;
|
||||
|
||||
/**
|
||||
* @author Oleg Zhurakousky
|
||||
*
|
||||
* @author Mark Fisher
|
||||
* @since 2.0
|
||||
*/
|
||||
public class FeedMessageSourceBeanDefinitionParserTests {
|
||||
|
||||
private static CountDownLatch latch;
|
||||
|
||||
@Before
|
||||
public void prepare(){
|
||||
public void prepare() {
|
||||
File persisterFile = new File(System.getProperty("java.io.tmpdir") + "/spring-integration/", "feedAdapter.last.entry");
|
||||
if (persisterFile.exists()){
|
||||
if (persisterFile.exists()) {
|
||||
persisterFile.delete();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void validateSuccessfullConfigurationWithCustomMetastore(){
|
||||
ClassPathXmlApplicationContext context =
|
||||
new ClassPathXmlApplicationContext("FeedMessageSourceBeanDefinitionParserTests-file-context.xml", this.getClass());
|
||||
public void validateSuccessfulConfigurationWithCustomMetadataStore() {
|
||||
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
|
||||
"FeedMessageSourceBeanDefinitionParserTests-file-context.xml", this.getClass());
|
||||
SourcePollingChannelAdapter adapter = context.getBean("feedAdapter", SourcePollingChannelAdapter.class);
|
||||
FeedEntryReaderMessageSource source = (FeedEntryReaderMessageSource) TestUtils.getPropertyValue(adapter, "source");
|
||||
MetadataStore metaStore = (MetadataStore) TestUtils.getPropertyValue(source, "metadataStore");
|
||||
assertTrue(metaStore instanceof SampleMetadataStore);
|
||||
MetadataStore metadataStore = (MetadataStore) TestUtils.getPropertyValue(source, "metadataStore");
|
||||
assertTrue(metadataStore instanceof SampleMetadataStore);
|
||||
assertEquals(metadataStore, context.getBean("customMetadataStore"));
|
||||
FeedReaderMessageSource feedReaderMessageSource = (FeedReaderMessageSource) TestUtils.getPropertyValue(source, "feedReaderMessageSource");
|
||||
AbstractFeedFetcher fetcher = (AbstractFeedFetcher) TestUtils.getPropertyValue(feedReaderMessageSource, "fetcher");
|
||||
assertTrue(fetcher instanceof FileUrlFeedFetcher);
|
||||
|
||||
context =
|
||||
new ClassPathXmlApplicationContext("FeedMessageSourceBeanDefinitionParserTests-http-context.xml", this.getClass());
|
||||
context = new ClassPathXmlApplicationContext(
|
||||
"FeedMessageSourceBeanDefinitionParserTests-http-context.xml", this.getClass());
|
||||
adapter = context.getBean("feedAdapter", SourcePollingChannelAdapter.class);
|
||||
source = (FeedEntryReaderMessageSource) TestUtils.getPropertyValue(adapter, "source");
|
||||
feedReaderMessageSource = (FeedReaderMessageSource) TestUtils.getPropertyValue(source, "feedReaderMessageSource");
|
||||
@@ -84,69 +89,72 @@ public class FeedMessageSourceBeanDefinitionParserTests {
|
||||
assertTrue(fetcher instanceof HttpURLFeedFetcher);
|
||||
context.destroy();
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void validateSuccessfullNewsRetrievalWithFileUrlAndMessageHistory() throws Exception{
|
||||
File persisterFile = new File(System.getProperty("java.io.tmpdir") + "/spring-integration/", "feedAdapterUsage.last.entry");
|
||||
if (persisterFile.exists()){
|
||||
public void validateSuccessfulNewsRetrievalWithFileUrlAndMessageHistory() throws Exception {
|
||||
File persisterFile = new File(System.getProperty("java.io.tmpdir") + "/spring-integration/", "message-store.properties");
|
||||
if (persisterFile.exists()) {
|
||||
persisterFile.delete();
|
||||
}
|
||||
//Test file samples.rss has 3 news items
|
||||
latch = spy(new CountDownLatch(3));
|
||||
ClassPathXmlApplicationContext context =
|
||||
new ClassPathXmlApplicationContext("FeedMessageSourceBeanDefinitionParserTests-file-usage-context.xml", this.getClass());
|
||||
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
|
||||
"FeedMessageSourceBeanDefinitionParserTests-file-usage-context.xml", this.getClass());
|
||||
latch.await(5, TimeUnit.SECONDS);
|
||||
verify(latch, times(3)).countDown();
|
||||
context.destroy();
|
||||
|
||||
|
||||
// since we are not deleting the persister file
|
||||
// in this iteration no new feeds will be received and the latch will timeout
|
||||
latch = spy(new CountDownLatch(3));
|
||||
context =
|
||||
new ClassPathXmlApplicationContext("FeedMessageSourceBeanDefinitionParserTests-file-usage-context.xml", this.getClass());
|
||||
context = new ClassPathXmlApplicationContext(
|
||||
"FeedMessageSourceBeanDefinitionParserTests-file-usage-context.xml", this.getClass());
|
||||
latch.await(5, TimeUnit.SECONDS);
|
||||
verify(latch, times(0)).countDown();
|
||||
context.destroy();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void validateSuccessfullNewsRetrievalWithFileUrlNoPersistentIdentifier() throws Exception{
|
||||
public void validateSuccessfulNewsRetrievalWithFileUrlNoPersistentIdentifier() throws Exception{
|
||||
//Test file samples.rss has 3 news items
|
||||
latch = spy(new CountDownLatch(3));
|
||||
ClassPathXmlApplicationContext context =
|
||||
new ClassPathXmlApplicationContext("FeedMessageSourceBeanDefinitionParserTests-file-usage-noid-context.xml", this.getClass());
|
||||
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
|
||||
"FeedMessageSourceBeanDefinitionParserTests-file-usage-noid-context.xml", this.getClass());
|
||||
latch.await(5, TimeUnit.SECONDS);
|
||||
verify(latch, times(3)).countDown();
|
||||
context.destroy();
|
||||
|
||||
|
||||
// since we are not deleting the persister file
|
||||
// in this iteration no new feeds will be received and the latch will timeout
|
||||
latch = spy(new CountDownLatch(3));
|
||||
context =
|
||||
new ClassPathXmlApplicationContext("FeedMessageSourceBeanDefinitionParserTests-file-usage-noid-context.xml", this.getClass());
|
||||
context = new ClassPathXmlApplicationContext(
|
||||
"FeedMessageSourceBeanDefinitionParserTests-file-usage-noid-context.xml", this.getClass());
|
||||
latch.await(5, TimeUnit.SECONDS);
|
||||
verify(latch, times(3)).countDown();
|
||||
context.destroy();
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
@Ignore // goes against the real feed
|
||||
public void validateSuccessfullNewsRetrievalWithHttpUrl() throws Exception{
|
||||
public void validateSuccessfulNewsRetrievalWithHttpUrl() throws Exception{
|
||||
final CountDownLatch latch = new CountDownLatch(3);
|
||||
MessageHandler handler = spy(new MessageHandler() {
|
||||
public void handleMessage(Message<?> message) throws MessagingException {
|
||||
latch.countDown();
|
||||
}
|
||||
});
|
||||
ApplicationContext context =
|
||||
new ClassPathXmlApplicationContext("FeedMessageSourceBeanDefinitionParserTests-http-context.xml", this.getClass());
|
||||
ApplicationContext context = new ClassPathXmlApplicationContext(
|
||||
"FeedMessageSourceBeanDefinitionParserTests-http-context.xml", this.getClass());
|
||||
DirectChannel feedChannel = context.getBean("feedChannel", DirectChannel.class);
|
||||
feedChannel.subscribe(handler);
|
||||
latch.await(5, TimeUnit.SECONDS);
|
||||
verify(handler, atLeast(3)).handleMessage(Mockito.any(Message.class));
|
||||
}
|
||||
|
||||
public static class SampleService{
|
||||
public void receiveFeedEntry(Message<?> message){
|
||||
|
||||
|
||||
public static class SampleService {
|
||||
|
||||
public void receiveFeedEntry(Message<?> message) {
|
||||
MessageHistory history = MessageHistory.read(message);
|
||||
assertTrue(history.size() == 3);
|
||||
Properties historyItem = history.get(0);
|
||||
@@ -163,20 +171,24 @@ public class FeedMessageSourceBeanDefinitionParserTests {
|
||||
latch.countDown();
|
||||
}
|
||||
}
|
||||
|
||||
public static class SampleServiceNoHistory{
|
||||
public void receiveFeedEntry(SyndEntry entry){
|
||||
|
||||
|
||||
public static class SampleServiceNoHistory {
|
||||
|
||||
public void receiveFeedEntry(SyndEntry entry) {
|
||||
latch.countDown();
|
||||
}
|
||||
}
|
||||
|
||||
public static class SampleMetadataStore implements MetadataStore{
|
||||
|
||||
public void write(Properties metadata) {
|
||||
|
||||
public static class SampleMetadataStore implements MetadataStore {
|
||||
|
||||
public void put(String key, String value) {
|
||||
}
|
||||
|
||||
public Properties load() {
|
||||
return new Properties();
|
||||
public String get(String key) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user