Author: bago
Date: Sat May 13 05:41:39 2006
New Revision: 406086

URL: http://svn.apache.org/viewcvs?rev=406086&view=rev
Log:
Fix regression introduced with Javamail 1.4: using bind in remoteDelivery 
resulted in failing all connections (JAMES-490)
Introduced a functional test as proof: I added it to the SMTPServerTest because 
it was faster, but this should be considered a RemoteDelivery test.

Modified:
    
james/server/trunk/src/java/org/apache/james/transport/mailets/RemoteDeliverySocketFactory.java
    james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java

Modified: 
james/server/trunk/src/java/org/apache/james/transport/mailets/RemoteDeliverySocketFactory.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/transport/mailets/RemoteDeliverySocketFactory.java?rev=406086&r1=406085&r2=406086&view=diff
==============================================================================
--- 
james/server/trunk/src/java/org/apache/james/transport/mailets/RemoteDeliverySocketFactory.java
 (original)
+++ 
james/server/trunk/src/java/org/apache/james/transport/mailets/RemoteDeliverySocketFactory.java
 Sat May 13 05:41:39 2006
@@ -17,10 +17,13 @@
 
 package org.apache.james.transport.mailets;
 
+import javax.net.SocketFactory;
+
+import java.io.IOException;
 import java.net.InetAddress;
+import java.net.InetSocketAddress;
 import java.net.Socket;
 import java.net.UnknownHostException;
-import java.io.IOException;
 
 /**
  * It is used by RemoteDelivery in order to make possible to bind the client
@@ -31,12 +34,21 @@
  * (current version 1.3) to support a corresonding property, e.g.
  * mail.smtp.bindAdress.
  * 
- * It should be a javax.net.SocketFactory descendant, but 
- * 1. it is not necessary because JavaMail 1.2 uses reflection when accessing
+ * This used to not extend javax.net.SocketFactory descendant, because 
+ * 1. it was not necessary because JavaMail 1.2 uses reflection when accessing
  * this class;
- * 2. it is not desirable because it would require java 1.4.
+ * 2. it was not desirable because it would require java 1.4.
+ * 
+ * But since James 2.3.0a1:
+ * 1. we require Java 1.4 so the dependency on SocketFactory is
+ * not really an issue;
+ * 2. Javamail 1.4 cast the object returned by getDefault to SocketFactory and
+ * fails to create the socket if we don't extend SocketFactory.
+ * 
+ * Note: Javamail 1.4 should correctly support mail.smtp.localaddr so we could
+ * probably get rid of this class and simply add that property to the Session.
  */
-public class RemoteDeliverySocketFactory {
+public class RemoteDeliverySocketFactory extends SocketFactory {
     
     /**
      * @param addr the ip address or host name the delivery socket will bind to
@@ -49,22 +61,25 @@
     /**
      * the same as the similarly named javax.net.SocketFactory operation.
      */
-    public static RemoteDeliverySocketFactory getDefault() {
+    public static SocketFactory getDefault() {
         return new RemoteDeliverySocketFactory();
     }
     
     /**
      * the same as the similarly named javax.net.SocketFactory operation.
      * Just to be safe, it is not used by JavaMail 1.3.
+     * This is the only method used by JavaMail 1.4.
      */
     public Socket createSocket() throws IOException {
-        throw new IOException("Incompatible JavaMail version, " +
-                "cannot bound socket");
+        Socket s = new Socket();
+        s.bind(new InetSocketAddress(bindAddress, 0));
+        return s;
     }
     
     /**
      * the same as the similarly named javax.net.SocketFactory operation.
      * This is the one which is used by JavaMail 1.3.
+     * This is not used by JavaMail 1.4.
      */
     public Socket createSocket(String host, int port)
                             throws IOException, UnknownHostException {
@@ -74,6 +89,7 @@
     /**
      * the same as the similarly named javax.net.SocketFactory operation.
      * Just to be safe, it is not used by JavaMail 1.3.
+     * This is not used by JavaMail 1.4.
      */
     public Socket createSocket(String host,
                                     int port,
@@ -88,6 +104,7 @@
     /**
      * the same as the similarly named javax.net.SocketFactory operation.
      * Just to be safe, it is not used by JavaMail 1.3.
+     * This is not used by JavaMail 1.4.
      */
     public Socket createSocket(InetAddress host, int port) throws IOException {
         return new Socket(host, port, bindAddress, 0);
@@ -96,6 +113,7 @@
     /**
      * the same as the similarly named javax.net.SocketFactory operation.
      * Just to be safe, it is not used by JavaMail 1.3.
+     * This is not used by JavaMail 1.4.
      */
     public Socket createSocket(InetAddress address,
                                     int port,

Modified: 
james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java?rev=406086&r1=406085&r2=406086&view=diff
==============================================================================
--- james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java 
(original)
+++ james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java 
Sat May 13 05:41:39 2006
@@ -912,6 +912,45 @@
     }
     
 
+    /**
+     * This is useful code to run tests on javamail bugs 
+     * http://issues.apache.org/jira/browse/JAMES-52
+     * 
+     * This 
+     * @throws Exception
+     */
+    public void testDeliveryToSelfWithGatewayAndBind() throws Exception {
+        finishSetUp(m_testConfiguration);
+        outgoingSpool = new InMemorySpoolRepository();
+        ((MockStore) m_serviceManager.lookup(Store.ROLE)).add("outgoing", 
outgoingSpool);
+        
+        RemoteDelivery rd = new RemoteDelivery();
+        
+        MockMailContext mmc = new MockMailContext();
+        mmc.setAttribute(Constants.AVALON_COMPONENT_MANAGER,m_serviceManager);
+        mmc.setAttribute(Constants.HELLO_NAME,"localhost");
+        MockMailetConfig mci = new 
MockMailetConfig("Test",mmc,getStandardParameters());
+        mci.setProperty("bind", "127.0.0.1");
+        mci.setProperty("gateway","127.0.0.1");
+        mci.setProperty("gatewayPort",""+m_smtpListenerPort);
+        rd.init(mci);
+        String sources = "Content-Type: text/plain;\r\nSubject: 
test\r\n\r\nBody";
+        String sender = "[EMAIL PROTECTED]";
+        String recipient = "[EMAIL PROTECTED]";
+        MimeMessage mm = new MimeMessage(Session.getDefaultInstance(new 
Properties()),new ByteArrayInputStream(sources.getBytes()));
+        MailImpl mail = new MailImpl("name",new 
MailAddress(sender),Arrays.asList(new MailAddress[] {new 
MailAddress(recipient)}),mm);
+        
+        rd.service(mail);
+        
+        while (outgoingSpool.size() > 0) {
+            Thread.sleep(1000);
+        }
+
+        verifyLastMail(sender, recipient, null);
+        
+        assertEquals(((String) mm.getContent()).trim(),((String) 
((MimeMessage) m_mailServer.getLastMail()[2]).getContent()).trim());
+    }
+
     
     /**
      * This is useful code to run tests on javamail bugs 



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to