You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2008/08/12 14:28:17 UTC
svn commit: r685129 - in /activemq/camel/trunk/components/camel-mail/src:
main/java/org/apache/camel/component/mail/
test/java/org/apache/camel/component/mail/
Author: davsclaus
Date: Tue Aug 12 05:28:15 2008
New Revision: 685129
URL: http://svn.apache.org/viewvc?rev=685129&view=rev
Log:
CAMEL-812: camel mail headers take precedence over pre configuration. Also now its possible to have multiple recipients in a single string with comma or semi colon as separator char.
Added:
activemq/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailHeaderOverrulePreConfigurationRecipientsTest.java (with props)
activemq/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailMultipleRecipientsTest.java (with props)
Modified:
activemq/camel/trunk/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailBinding.java
activemq/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailRouteTest.java
activemq/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailSubjectTest.java
Modified: activemq/camel/trunk/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailBinding.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailBinding.java?rev=685129&r1=685128&r2=685129&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailBinding.java (original)
+++ activemq/camel/trunk/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailBinding.java Tue Aug 12 05:28:15 2008
@@ -63,24 +63,12 @@
public void populateMailMessage(MailEndpoint endpoint, MimeMessage mimeMessage, Exchange exchange)
throws MessagingException, IOException {
- // append the headers from the in message at first
- appendHeadersFromCamel(mimeMessage, exchange, exchange.getIn());
-
- // than override any from the fixed endpoint configuraiton
- Map<Message.RecipientType, String> recipients = endpoint.getConfiguration().getRecipients();
- if (recipients.containsKey(Message.RecipientType.TO)) {
- mimeMessage.setRecipients(Message.RecipientType.TO, recipients.get(Message.RecipientType.TO));
- }
- if (recipients.containsKey(Message.RecipientType.CC)) {
- mimeMessage.setRecipients(Message.RecipientType.CC, recipients.get(Message.RecipientType.CC));
- }
- if (recipients.containsKey(Message.RecipientType.BCC)) {
- mimeMessage.setRecipients(Message.RecipientType.BCC, recipients.get(Message.RecipientType.BCC));
- }
-
- // fallback to use destination if no TO provided at all
- if (mimeMessage.getRecipients(Message.RecipientType.TO) == null) {
- mimeMessage.setRecipients(Message.RecipientType.TO, endpoint.getConfiguration().getDestination());
+ // camel message headers takes presedence over endpoint configuration
+ if (hasRecipientHeaders(exchange.getIn())) {
+ setRecipientFromCamelMessage(mimeMessage, exchange, exchange.getIn());
+ } else {
+ // fallback to endpoint configuration
+ setRecipientFromEndpointConfiguration(mimeMessage, endpoint);
}
// must have at least one recipients otherwise we do not know where to send the mail
@@ -88,6 +76,9 @@
throw new IllegalArgumentException("The mail message does not have any recipients set.");
}
+ // append the rest of the headers (no recipients) that could be subject, reply-to etc.
+ appendHeadersFromCamelMessage(mimeMessage, exchange, exchange.getIn());
+
if (empty(mimeMessage.getFrom())) {
// lets default the address to the endpoint destination
String from = endpoint.getConfiguration().getFrom();
@@ -122,8 +113,8 @@
/**
* Appends the Mail headers from the Camel {@link MailMessage}
*/
- protected void appendHeadersFromCamel(MimeMessage mimeMessage, Exchange exchange,
- org.apache.camel.Message camelMessage)
+ protected void appendHeadersFromCamelMessage(MimeMessage mimeMessage, Exchange exchange,
+ org.apache.camel.Message camelMessage)
throws MessagingException {
for (Map.Entry<String, Object> entry : camelMessage.getHeaders().entrySet()) {
@@ -132,6 +123,12 @@
if (headerValue != null) {
if (headerFilterStrategy != null
&& !headerFilterStrategy.applyFilterToCamelHeaders(headerName, headerValue)) {
+
+ if (isRecipientHeader(headerName)) {
+ // skip any recipients as they are handled specially
+ continue;
+ }
+
// Mail messages can repeat the same header...
if (ObjectConverter.isCollection(headerValue)) {
Iterator iter = ObjectConverter.iterator(headerValue);
@@ -147,20 +144,50 @@
}
}
+ private void setRecipientFromCamelMessage(MimeMessage mimeMessage, Exchange exchange,
+ org.apache.camel.Message camelMessage)
+ throws MessagingException {
+
+ for (Map.Entry<String, Object> entry : camelMessage.getHeaders().entrySet()) {
+ String headerName = entry.getKey();
+ Object headerValue = entry.getValue();
+ if (headerValue != null && isRecipientHeader(headerName)) {
+ // special handling of recipients
+ if (ObjectConverter.isCollection(headerValue)) {
+ Iterator iter = ObjectConverter.iterator(headerValue);
+ while (iter.hasNext()) {
+ Object recipient = iter.next();
+ appendRecipientToMimeMessage(mimeMessage, headerName, asString(exchange, recipient));
+ }
+ } else {
+ appendRecipientToMimeMessage(mimeMessage, headerName, asString(exchange, headerValue));
+ }
+ }
+ }
+ }
+
/**
- * Does the given camel message contain any To, CC or BCC header names?
+ * Appends the Mail headers from the endpoint configuraiton.
*/
- private static boolean hasRecipientHeaders(org.apache.camel.Message camelMessage) {
- for (String key : camelMessage.getHeaders().keySet()) {
- if (Message.RecipientType.TO.toString().equals(key)) {
- return true;
- } else if (Message.RecipientType.CC.toString().equals(key)) {
- return true;
- } else if (Message.RecipientType.BCC.toString().equals(key)) {
- return true;
- }
+ protected void setRecipientFromEndpointConfiguration(MimeMessage mimeMessage, MailEndpoint endpoint)
+ throws MessagingException {
+
+ Map<Message.RecipientType, String> recipients = endpoint.getConfiguration().getRecipients();
+ if (recipients.containsKey(Message.RecipientType.TO)) {
+ appendRecipientToMimeMessage(mimeMessage, Message.RecipientType.TO.toString(), recipients.get(Message.RecipientType.TO));
+ }
+ if (recipients.containsKey(Message.RecipientType.CC)) {
+ appendRecipientToMimeMessage(mimeMessage, Message.RecipientType.CC.toString(), recipients.get(Message.RecipientType.CC));
+ }
+ if (recipients.containsKey(Message.RecipientType.BCC)) {
+ appendRecipientToMimeMessage(mimeMessage, Message.RecipientType.BCC.toString(), recipients.get(Message.RecipientType.BCC));
+ }
+
+ // fallback to use destination if no TO provided at all
+ String destination = endpoint.getConfiguration().getDestination();
+ if (destination != null && mimeMessage.getRecipients(Message.RecipientType.TO) == null) {
+ appendRecipientToMimeMessage(mimeMessage, Message.RecipientType.TO.toString(), destination);
}
- return false;
}
/**
@@ -209,15 +236,7 @@
return true;
}
- private static boolean empty(Address[] addresses) {
- return addresses == null || addresses.length == 0;
- }
-
- private static String asString(Exchange exchange, Object value) {
- return exchange.getContext().getTypeConverter().convertTo(String.class, value);
- }
-
- public Map<String, Object> extractHeadersFromMail(Message mailMessage) throws MessagingException {
+ protected Map<String, Object> extractHeadersFromMail(Message mailMessage) throws MessagingException {
Map<String, Object> answer = new HashMap<String, Object>();
Enumeration names = mailMessage.getAllHeaders();
@@ -238,4 +257,64 @@
return answer;
}
+ private static void appendRecipientToMimeMessage(MimeMessage mimeMessage, String type, String recipient)
+ throws MessagingException {
+
+ // we support that multi recipient can be given as a string seperated by comma or semi colon
+ String[] lines = recipient.split("[,|;]");
+ for (String line : lines) {
+ line = line.trim();
+ mimeMessage.addRecipients(asRecipientType(type), line);
+ }
+ }
+
+ /**
+ * Does the given camel message contain any To, CC or BCC header names?
+ */
+ private static boolean hasRecipientHeaders(org.apache.camel.Message camelMessage) {
+ for (String key : camelMessage.getHeaders().keySet()) {
+ if (isRecipientHeader(key)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Is the given key a mime message recipient header (To, CC or BCC)
+ */
+ private static boolean isRecipientHeader(String key) {
+ if (Message.RecipientType.TO.toString().equalsIgnoreCase(key)) {
+ return true;
+ } else if (Message.RecipientType.CC.toString().equalsIgnoreCase(key)) {
+ return true;
+ } else if (Message.RecipientType.BCC.toString().equalsIgnoreCase(key)) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Returns the RecipientType object.
+ */
+ private static Message.RecipientType asRecipientType(String type) {
+ if (Message.RecipientType.TO.toString().equalsIgnoreCase(type)) {
+ return Message.RecipientType.TO;
+ } else if (Message.RecipientType.CC.toString().equalsIgnoreCase(type)) {
+ return Message.RecipientType.CC;
+ } else if (Message.RecipientType.BCC.toString().equalsIgnoreCase(type)) {
+ return Message.RecipientType.BCC;
+ }
+ throw new IllegalArgumentException("Unknown recipient type: " + type);
+ }
+
+
+ private static boolean empty(Address[] addresses) {
+ return addresses == null || addresses.length == 0;
+ }
+
+ private static String asString(Exchange exchange, Object value) {
+ return exchange.getContext().getTypeConverter().convertTo(String.class, value);
+ }
+
}
Added: activemq/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailHeaderOverrulePreConfigurationRecipientsTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailHeaderOverrulePreConfigurationRecipientsTest.java?rev=685129&view=auto
==============================================================================
--- activemq/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailHeaderOverrulePreConfigurationRecipientsTest.java (added)
+++ activemq/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailHeaderOverrulePreConfigurationRecipientsTest.java Tue Aug 12 05:28:15 2008
@@ -0,0 +1,60 @@
+/**
+ * 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 java.util.Map;
+import java.util.HashMap;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.jvnet.mock_javamail.Mailbox;
+
+/**
+ * Unit test to verify that message headers override pre configuration.
+ */
+public class MailHeaderOverrulePreConfigurationRecipientsTest extends ContextTestSupport {
+
+ public void testSendWithRecipientsInHeaders() throws Exception {
+ Mailbox.clearAll();
+
+ MockEndpoint mock = getMockEndpoint("mock:result");
+ mock.expectedMessageCount(1);
+ mock.expectedBodiesReceived("Hello World");
+ mock.expectedHeaderReceived("to", "claus@localhost");
+ mock.expectedHeaderReceived("cc", "willem@localhost");
+ mock.expectedHeaderReceived("bcc", "hadrian@localhost");
+
+ Map<String, Object> headers = new HashMap<String, Object>();
+ headers.put("to", "claus@localhost");
+ headers.put("cc", "willem@localhost");
+ headers.put("bcc", "hadrian@localhost");
+
+ template.sendBodyAndHeaders("smtp://james3@localhost", "Hello World", headers);
+
+ mock.assertIsSatisfied();
+ }
+
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ public void configure() throws Exception {
+ from("pop3://claus@localhost?To=someone@outhere.com&CC=none@world.com&consumer.delay=1000").to("mock:result");
+ }
+ };
+ }
+
+}
Propchange: activemq/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailHeaderOverrulePreConfigurationRecipientsTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: activemq/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailHeaderOverrulePreConfigurationRecipientsTest.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: activemq/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailMultipleRecipientsTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailMultipleRecipientsTest.java?rev=685129&view=auto
==============================================================================
--- activemq/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailMultipleRecipientsTest.java (added)
+++ activemq/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailMultipleRecipientsTest.java Tue Aug 12 05:28:15 2008
@@ -0,0 +1,85 @@
+/**
+ * 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 java.util.Map;
+import java.util.HashMap;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.jvnet.mock_javamail.Mailbox;
+
+/**
+ * Unit test to verift that we can have multiple recipients in To, CC and BCC
+ */
+public class MailMultipleRecipientsTest extends ContextTestSupport {
+
+ public void testSendWithMultipleRecipientsInHeader() throws Exception {
+ Mailbox.clearAll();
+
+ // START SNIPPET: e1
+ Map<String, Object> headers = new HashMap<String, Object>();
+ // test with both comma and semi colon as Camel supports both kind of separators
+ headers.put("to", "claus@localhost, willem@localhost ; hadrian@localhost");
+ headers.put("cc", "james@localhost");
+
+ assertMailbox("claus");
+ assertMailbox("willem");
+ assertMailbox("hadrian");
+
+ template.sendBodyAndHeaders("smtp://localhost", "Hello World", headers);
+ // END SNIPPET: e1
+
+ assertMockEndpointsSatisifed();
+ }
+
+ public void testSendWithMultipleRecipientsPreConfigured() throws Exception {
+ Mailbox.clearAll();
+
+ assertMailbox("claus");
+ assertMailbox("willem");
+
+ // START SNIPPET: e2
+ // here we have preconfigued the to recievs to claus and willem. Notice we use comma to seperate
+ // the two recipeients. Camel also support using colon as seperator char
+ template.sendBody("smtp://localhost?To=claus@localhost,willem@localhost&CC=james@localhost", "Hello World");
+ // END SNIPPET: e2
+
+ assertMockEndpointsSatisifed();
+ }
+
+ private void assertMailbox(String name) throws Exception {
+ MockEndpoint mock = getMockEndpoint("mock:" + name);
+ mock.expectedMessageCount(1);
+ mock.expectedBodiesReceived("Hello World");
+ mock.expectedHeaderReceived("cc", "james@localhost");
+ }
+
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ public void configure() throws Exception {
+ from("pop3://claus@localhost?consumer.delay=1000").to("mock:claus");
+
+ from("pop3://willem@localhost?consumer.delay=1000").to("mock:willem");
+
+ from("pop3://hadrian@localhost?consumer.delay=1000").to("mock:hadrian");
+ }
+ };
+ }
+
+}
Propchange: activemq/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailMultipleRecipientsTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: activemq/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailMultipleRecipientsTest.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: activemq/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailRouteTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailRouteTest.java?rev=685129&r1=685128&r2=685129&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailRouteTest.java (original)
+++ activemq/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailRouteTest.java Tue Aug 12 05:28:15 2008
@@ -21,6 +21,7 @@
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
+import javax.mail.Address;
import org.apache.camel.ContextTestSupport;
import org.apache.camel.Exchange;
@@ -68,7 +69,13 @@
assertNotNull(name + " should have received at least one mail!", message);
assertEquals("hello world!", message.getContent());
assertEquals("camel@localhost", message.getFrom()[0].toString());
- assertEquals(name, message.getRecipients(RecipientType.TO)[0].toString());
+ boolean found = false;
+ for (Address adr : message.getRecipients(RecipientType.TO)) {
+ if (name.equals(adr.toString())) {
+ found = true;
+ }
+ }
+ assertTrue("Should have found the recpient to in the mail: " + name, found);
}
@Override
@@ -80,9 +87,11 @@
// must use fixed to option to send the mail to the given reciever, as we have polled
// a mail from a mailbox where it already has the 'old' To as header value
+ // here we send the mail to 2 recievers. notice we can use a plain string with semi colon
+ // to seperate the mail addresses
from("direct:a")
- .to("smtp://localhost?to=route-test-result@localhost",
- "smtp://localhost?to=route-test-copy@localhost");
+ .setHeader("to", constant("route-test-result@localhost; route-test-copy@localhost"))
+ .to("smtp://localhost");
from("pop3://route-test-result@localhost?consumer.delay=1000")
.convertBodyTo(String.class).to("mock:result");
Modified: activemq/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailSubjectTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailSubjectTest.java?rev=685129&r1=685128&r2=685129&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailSubjectTest.java (original)
+++ activemq/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailSubjectTest.java Tue Aug 12 05:28:15 2008
@@ -31,12 +31,14 @@
Mailbox.clearAll();
String body = "Hello Claus.\nYes it does.\n\nRegards James.";
- template.sendBody("direct:a", body);
MockEndpoint mock = getMockEndpoint("mock:result");
mock.expectedMessageCount(1);
mock.expectedHeaderReceived("subject", subject);
mock.expectedBodiesReceived(body);
+
+ template.sendBody("direct:a", body);
+
mock.assertIsSatisfied();
}