CAMEL-7872 Post processing action for input mail box Add a possibility to register a post processing action for input mail box. This can be used for example to clean up the mail box after messages have been retrieved.
Add copyright headers Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/e1a04be0 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/e1a04be0 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/e1a04be0 Branch: refs/heads/master Commit: e1a04be088809faec94886e680ed6b7cc4a75650 Parents: 1149fae Author: Christian Amann <christian.am...@qaware.de> Authored: Wed Sep 24 14:00:02 2014 +0200 Committer: Willem Jiang <willem.ji...@gmail.com> Committed: Mon Oct 20 11:34:18 2014 +0800 ---------------------------------------------------------------------- .../mail/MailBoxPostProcessAction.java | 32 +++++ .../camel/component/mail/MailConsumer.java | 5 + .../camel/component/mail/MailEndpoint.java | 16 +++ .../mail/MailPostProcessActionTest.java | 127 +++++++++++++++++++ 4 files changed, 180 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/e1a04be0/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailBoxPostProcessAction.java ---------------------------------------------------------------------- diff --git a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailBoxPostProcessAction.java b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailBoxPostProcessAction.java new file mode 100644 index 0000000..ea42b09 --- /dev/null +++ b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailBoxPostProcessAction.java @@ -0,0 +1,32 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.camel.component.mail; + +import javax.mail.Folder; + +/** + * Is used for doing post processing tasks on the mailbox once the normal processing ended. This includes for example + * cleaning up old emails. + */ +public interface MailBoxPostProcessAction { + /** + * Process the given mail folder + * + * @param folder Folder to process + */ + void process(Folder folder) throws Exception; +} http://git-wip-us.apache.org/repos/asf/camel/blob/e1a04be0/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConsumer.java ---------------------------------------------------------------------- diff --git a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConsumer.java b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConsumer.java index 29835aa..2015cca 100644 --- a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConsumer.java +++ b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConsumer.java @@ -115,6 +115,11 @@ public class MailConsumer extends ScheduledBatchPollingConsumer { Message[] messages = retrieveMessages(); polledMessages = processBatch(CastUtils.cast(createExchanges(messages))); + + final MailBoxPostProcessAction postProcessor = getEndpoint().getPostProcessAction(); + if (postProcessor != null) { + postProcessor.process(folder); + } } else if (count == -1) { throw new MessagingException("Folder: " + folder.getFullName() + " is closed"); } http://git-wip-us.apache.org/repos/asf/camel/blob/e1a04be0/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailEndpoint.java ---------------------------------------------------------------------- diff --git a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailEndpoint.java b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailEndpoint.java index a875612..1a6b34f 100644 --- a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailEndpoint.java +++ b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailEndpoint.java @@ -43,6 +43,8 @@ public class MailEndpoint extends ScheduledPollEndpoint { private SearchTerm searchTerm; private SortTerm[] sortTerm; + private MailBoxPostProcessAction postProcessAction; + public MailEndpoint() { } @@ -197,4 +199,18 @@ public class MailEndpoint extends ScheduledPollEndpoint { this.sortTerm = (sortTerm == null ? null : sortTerm.clone()); } + /** + * @return Post processor that can e.g. delete old email. Gets called once the messages have been polled and + * processed. + */ + public MailBoxPostProcessAction getPostProcessAction() { + return postProcessAction; + } + + /** + * @param postProcessAction {@link #getPostProcessAction()} + */ + public void setPostProcessAction(MailBoxPostProcessAction postProcessAction) { + this.postProcessAction = postProcessAction; + } } http://git-wip-us.apache.org/repos/asf/camel/blob/e1a04be0/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailPostProcessActionTest.java ---------------------------------------------------------------------- diff --git a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailPostProcessActionTest.java b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailPostProcessActionTest.java new file mode 100644 index 0000000..97c1aa4 --- /dev/null +++ b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailPostProcessActionTest.java @@ -0,0 +1,127 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.camel.component.mail; + +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.impl.JndiRegistry; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.junit.Test; +import org.jvnet.mock_javamail.Mailbox; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.mail.Folder; +import javax.mail.Message; +import javax.mail.Store; +import javax.mail.internet.MimeMessage; + +/** + * Tests if post process action is called if it is set + */ +public class MailPostProcessActionTest extends CamelTestSupport { + private static final Logger LOG = LoggerFactory.getLogger(MailPostProcessActionTest.class); + + private TestPostProcessAction action; + + @Override + public void setUp() throws Exception { + prepareMailbox(); + action = new TestPostProcessAction(); + super.setUp(); + } + + @Override + protected JndiRegistry createRegistry() throws Exception { + JndiRegistry jndi = super.createRegistry(); + jndi.bind("postProcessAction", action); + return jndi; + } + + @Test + public void testActionCalled() throws Exception { + Mailbox mailbox = Mailbox.get("bill@localhost"); + assertEquals(1, mailbox.size()); + + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedBodiesReceivedInAnyOrder("TestText"); + + assertMockEndpointsSatisfied(); + waitForActionCalled(); + } + + private void waitForActionCalled() throws InterruptedException { + // Wait for a maximum of 500 ms for the action to be called + for (int i = 0; i < 50; i++) { + if(action.hasBeenCalled()) { + break; + } + LOG.debug("Sleeping for 10 millis to wait for action call"); + Thread.sleep(10); + } + assertEquals(true, action.hasBeenCalled()); + } + + private void prepareMailbox() throws Exception { + // connect to mailbox + Mailbox.clearAll(); + JavaMailSender sender = new DefaultJavaMailSender(); + Store store = sender.getSession().getStore("pop3"); + store.connect("localhost", 25, "bill", "secret"); + Folder folder = store.getFolder("INBOX"); + folder.open(Folder.READ_WRITE); + folder.expunge(); + + // inserts 1 new message + Message[] messages = new Message[1]; + messages[0] = new MimeMessage(sender.getSession()); + messages[0].setSubject("TestSubject"); + messages[0].setText("TestText"); + + folder.appendMessages(messages); + folder.close(true); + } + + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + from("pop3://bill@localhost?password=secret&postProcessAction=#postProcessAction").to("mock:result"); + } + }; + } + + private class TestPostProcessAction implements MailBoxPostProcessAction { + private boolean called; + + @Override + public void process(Folder folder) throws Exception { + // Assert that we are looking at the correct folder with our message + final Message[] messages = folder.getMessages(); + assertEquals(1, messages.length); + assertEquals("TestSubject", messages[0].getSubject()); + // And mark ourselves as "called" + called = true; + } + + /** + * @return true if the action has been called + */ + public boolean hasBeenCalled() { + return called; + } + } +}