You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ch...@apache.org on 2007/05/14 20:25:33 UTC

svn commit: r537937 - in /activemq/camel/trunk: camel-core/src/main/java/org/apache/camel/ camel-mail/src/main/java/org/apache/camel/component/mail/ camel-mail/src/test/java/org/apache/camel/component/mail/

Author: chirino
Date: Mon May 14 11:25:32 2007
New Revision: 537937

URL: http://svn.apache.org/viewvc?view=rev&rev=537937
Log:
Updaed the mail component so that mail headers are correctly copied over from message to message.  This highlighted the fact
that th TO: should always be what is specified on the outbound endpoint instead of the To: in the message.
Added a test the validates headers are preserved.


Modified:
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelTemplate.java
    activemq/camel/trunk/camel-mail/src/main/java/org/apache/camel/component/mail/MailBinding.java
    activemq/camel/trunk/camel-mail/src/main/java/org/apache/camel/component/mail/MailMessage.java
    activemq/camel/trunk/camel-mail/src/main/java/org/apache/camel/component/mail/MessageHeaderNamesAccessException.java
    activemq/camel/trunk/camel-mail/src/test/java/org/apache/camel/component/mail/MailRouteTest.java

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelTemplate.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelTemplate.java?view=diff&rev=537937&r1=537936&r2=537937
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelTemplate.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelTemplate.java Mon May 14 11:25:32 2007
@@ -146,6 +146,26 @@
         });
         return extractResultBody(result);
     }
+    
+    /**
+     * Sends the body to an endpoint with the specified headers and header values
+     *
+     * @param endpointUri the endpoint URI to send to
+     * @param body        the payload send
+     * @return the result
+     */
+    public Object sendBody(String endpointUri, final Object body, final Map<String, Object> headers) {
+        E result = send(endpointUri, new Processor() {
+            public void process(Exchange exchange) {
+                Message in = exchange.getIn();
+                for (Map.Entry<String, Object> header : headers.entrySet()) {
+                    in.setHeader(header.getKey(), header.getValue());
+				}
+                in.setBody(body);
+            }
+        });
+        return extractResultBody(result);
+    }
 
     // Methods using the default endpoint
     //-----------------------------------------------------------------------

Modified: activemq/camel/trunk/camel-mail/src/main/java/org/apache/camel/component/mail/MailBinding.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-mail/src/main/java/org/apache/camel/component/mail/MailBinding.java?view=diff&rev=537937&r1=537936&r2=537937
==============================================================================
--- activemq/camel/trunk/camel-mail/src/main/java/org/apache/camel/component/mail/MailBinding.java (original)
+++ activemq/camel/trunk/camel-mail/src/main/java/org/apache/camel/component/mail/MailBinding.java Mon May 14 11:25:32 2007
@@ -17,15 +17,16 @@
  */
 package org.apache.camel.component.mail;
 
-import org.apache.camel.Exchange;
+import java.util.Map;
+import java.util.Set;
 
+import javax.mail.Address;
 import javax.mail.Message;
 import javax.mail.MessagingException;
-import javax.mail.Address;
-import javax.mail.internet.MimeMessage;
 import javax.mail.internet.InternetAddress;
-import java.util.Map;
-import java.util.Set;
+import javax.mail.internet.MimeMessage;
+
+import org.apache.camel.Exchange;
 
 /**
  * A Strategy used to convert between a Camel {@Exchange} and {@Message} to and from a
@@ -38,11 +39,11 @@
         try {
             appendMailHeaders(mimeMessage, exchange.getIn());
 
-            if (empty(mimeMessage.getAllRecipients())) {
-                // lets default the address to the endpoint destination
-                String destination = endpoint.getConfiguration().getDestination();
+            String destination = endpoint.getConfiguration().getDestination();
+            if (destination != null ) {
                 mimeMessage.setRecipients(Message.RecipientType.TO, destination);
             }
+                        
             if (empty(mimeMessage.getFrom())) {
                 // lets default the address to the endpoint destination
                 String from = endpoint.getConfiguration().getFrom();
@@ -84,7 +85,23 @@
             Object headerValue = entry.getValue();
             if (headerValue != null) {
                 if (shouldOutputHeader(camelMessage, headerName, headerValue)) {
-                    mimeMessage.setHeader(headerName, headerValue.toString());
+                	
+            		String[] values = new String[]{};
+            		Class stringArrayClazz = values.getClass();
+            		
+            		// Mail messages can repeat the same header...
+            		if( headerValue.getClass() == stringArrayClazz ) {
+            			mimeMessage.removeHeader(headerName);
+                		values = (String[]) headerValue;
+                		for (int i = 0; i < values.length; i++) {
+                            mimeMessage.addHeader(headerName, values[i]);
+						}
+            		} else if( headerValue.getClass() == String.class ) {
+                        mimeMessage.setHeader(headerName, (String) headerValue);
+            		} else {
+                		// Unknown type? then use toString()
+                        mimeMessage.setHeader(headerName, headerValue.toString());
+                	}
                 }
             }
         }

Modified: activemq/camel/trunk/camel-mail/src/main/java/org/apache/camel/component/mail/MailMessage.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-mail/src/main/java/org/apache/camel/component/mail/MailMessage.java?view=diff&rev=537937&r1=537936&r2=537937
==============================================================================
--- activemq/camel/trunk/camel-mail/src/main/java/org/apache/camel/component/mail/MailMessage.java (original)
+++ activemq/camel/trunk/camel-mail/src/main/java/org/apache/camel/component/mail/MailMessage.java Mon May 14 11:25:32 2007
@@ -19,6 +19,7 @@
 
 import org.apache.camel.impl.DefaultMessage;
 
+import javax.mail.Header;
 import javax.mail.Message;
 import javax.mail.MessagingException;
 import java.util.Enumeration;
@@ -67,7 +68,7 @@
     }
 
     public Object getHeader(String name) {
-        Object answer = null;
+        String[] answer = null;
         if (mailMessage != null) {
             try {
                 answer = mailMessage.getHeader(name);
@@ -77,9 +78,12 @@
             }
         }
         if (answer == null) {
-            answer = super.getHeader(name);
+            return super.getHeader(name);
         }
-        return answer;
+        if( answer.length > 0 ) {
+        	return answer[0];
+        }
+        return null;
     }
 
     @Override
@@ -105,15 +109,16 @@
             catch (MessagingException e) {
                 throw new MessageHeaderNamesAccessException(e);
             }
-            while (names.hasMoreElements()) {
-                String name = names.nextElement().toString();
-                try {
-                    Object value = mailMessage.getHeader(name);
-                    map.put(name, value);
-                }
-                catch (MessagingException e) {
-                    throw new MessageHeaderAccessException(name, e);
-                }
+            
+            System.out.println("Copying....");
+            try {
+	            while (names.hasMoreElements()) {
+	                Header header = (Header) names.nextElement();
+	                map.put(header.getName(), header.getValue());
+	                System.out.println("Set: "+header.getName()+"="+header.getValue());
+	            }
+            }catch (Throwable e) {
+                throw new MessageHeaderNamesAccessException(e);                
             }
         }
     }

Modified: activemq/camel/trunk/camel-mail/src/main/java/org/apache/camel/component/mail/MessageHeaderNamesAccessException.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-mail/src/main/java/org/apache/camel/component/mail/MessageHeaderNamesAccessException.java?view=diff&rev=537937&r1=537936&r2=537937
==============================================================================
--- activemq/camel/trunk/camel-mail/src/main/java/org/apache/camel/component/mail/MessageHeaderNamesAccessException.java (original)
+++ activemq/camel/trunk/camel-mail/src/main/java/org/apache/camel/component/mail/MessageHeaderNamesAccessException.java Mon May 14 11:25:32 2007
@@ -17,7 +17,6 @@
  */
 package org.apache.camel.component.mail;
 
-import javax.mail.MessagingException;
 
 /**
  * @version $Revision:520964 $
@@ -25,7 +24,7 @@
 public class MessageHeaderNamesAccessException extends RuntimeMailException {
     private static final long serialVersionUID = -6744171518099741324L;
 
-    public MessageHeaderNamesAccessException(MessagingException e) {
+    public MessageHeaderNamesAccessException(Throwable e) {
         super("Failed to acess the Mail message property names", e);
     }
 }

Modified: activemq/camel/trunk/camel-mail/src/test/java/org/apache/camel/component/mail/MailRouteTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-mail/src/test/java/org/apache/camel/component/mail/MailRouteTest.java?view=diff&rev=537937&r1=537936&r2=537937
==============================================================================
--- activemq/camel/trunk/camel-mail/src/test/java/org/apache/camel/component/mail/MailRouteTest.java (original)
+++ activemq/camel/trunk/camel-mail/src/test/java/org/apache/camel/component/mail/MailRouteTest.java Mon May 14 11:25:32 2007
@@ -18,6 +18,7 @@
 package org.apache.camel.component.mail;
 
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.builder.RouteBuilder;
 import static org.apache.camel.util.ObjectHelper.asString;
@@ -27,6 +28,7 @@
 import javax.mail.Message;
 import javax.mail.MessagingException;
 import java.io.IOException;
+import java.util.HashMap;
 
 /**
  * @version $Revision: 1.1 $
@@ -38,7 +40,9 @@
         resultEndpoint = (MockEndpoint) resolveMandatoryEndpoint("mock:result");
         resultEndpoint.expectedBodiesReceived("hello world!");
 
-        template.sendBody("smtp://james@localhost", "hello world!");
+        HashMap<String, Object> headers = new HashMap<String, Object>();
+        headers.put("reply-to", "reply1@localhost");
+        template.sendBody("smtp://james@localhost", "hello world!", headers);
 
         // lets test the first sent worked
         assertMailboxReceivedMessages("james@localhost");
@@ -48,7 +52,12 @@
 
         // lets test the receive worked
         resultEndpoint.assertIsSatisfied();
-
+        
+        // Validate that the headers were preserved.
+        Exchange exchange = resultEndpoint.getReceivedExchanges().get(0);
+        String replyTo = (String) exchange.getIn().getHeader("reply-to");
+        assertEquals( "reply1@localhost", replyTo);
+        
         assertMailboxReceivedMessages("copy@localhost");
     }