Author: bago
Date: Sat Aug  5 05:07:03 2006
New Revision: 428989

URL: http://svn.apache.org/viewvc?rev=428989&view=rev
Log:
Another attempt to fix JAMES-584.
Add more mail.dispose() calls to mailets that creates new MailImpls.
Add some try/finally code to make sure mail.dispose is called even if 
exceptions happens in the middle.
Change MailImpl.setMessage() to make sure to dispose a previous message if any.

Modified:
    james/server/trunk/src/java/org/apache/james/James.java
    james/server/trunk/src/java/org/apache/james/core/MailImpl.java
    
james/server/trunk/src/java/org/apache/james/transport/mailets/AbstractRedirect.java
    
james/server/trunk/src/java/org/apache/james/transport/mailets/AbstractVirtualUserTable.java
    
james/server/trunk/src/java/org/apache/james/transport/mailets/DSNBounce.java
    
james/server/trunk/src/java/org/apache/james/transport/mailets/ToMultiRepository.java

Modified: james/server/trunk/src/java/org/apache/james/James.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/James.java?rev=428989&r1=428988&r2=428989&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/James.java (original)
+++ james/server/trunk/src/java/org/apache/james/James.java Sat Aug  5 05:07:03 
2006
@@ -479,9 +479,12 @@
     public void sendMail(MailAddress sender, Collection recipients, 
MimeMessage message, String state)
             throws MessagingException {
         MailImpl mail = new MailImpl(getId(), sender, recipients, message);
-        mail.setState(state);
-        sendMail(mail);
-        ContainerUtil.dispose(mail);
+        try {
+            mail.setState(state);
+            sendMail(mail);
+        } finally {
+            ContainerUtil.dispose(mail);
+        }
     }
 
     /**

Modified: james/server/trunk/src/java/org/apache/james/core/MailImpl.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/core/MailImpl.java?rev=428989&r1=428988&r2=428989&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/core/MailImpl.java (original)
+++ james/server/trunk/src/java/org/apache/james/core/MailImpl.java Sat Aug  5 
05:07:03 2006
@@ -388,6 +388,12 @@
      * @param message the new MimeMessage associated with this MailImpl
      */
     public void setMessage(MimeMessage message) {
+        // If a setMessage is called on a Mail that already have a message
+        // (discouraged) we have to make sure that the message we remove is
+        // correctly unreferenced and disposed, otherwise it will keep locks
+        if (this.message != null) {
+            ContainerUtil.dispose(this.message);
+        }
         this.message = message;
     }
     /**
@@ -539,8 +545,7 @@
      * @return Serializable of the entire attributes collection
      * @since 2.2.0
      **/
-    public HashMap getAttributesRaw ()
-    {
+    public HashMap getAttributesRaw () {
         return attributes;
     }
     

Modified: 
james/server/trunk/src/java/org/apache/james/transport/mailets/AbstractRedirect.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/transport/mailets/AbstractRedirect.java?rev=428989&r1=428988&r2=428989&view=diff
==============================================================================
--- 
james/server/trunk/src/java/org/apache/james/transport/mailets/AbstractRedirect.java
 (original)
+++ 
james/server/trunk/src/java/org/apache/james/transport/mailets/AbstractRedirect.java
 Sat Aug  5 05:07:03 2006
@@ -978,98 +978,103 @@
 
         // duplicates the Mail object, to be able to modify the new mail 
keeping the original untouched
         MailImpl newMail = new MailImpl(originalMail,newName(originalMail));
-        // We don't need to use the original Remote Address and Host,
-        // and doing so would likely cause a loop with spam detecting
-        // matchers.
         try {
-            
newMail.setRemoteAddr(java.net.InetAddress.getLocalHost().getHostAddress());
-            
newMail.setRemoteHost(java.net.InetAddress.getLocalHost().getHostName());
-        } catch (java.net.UnknownHostException _) {
-            newMail.setRemoteAddr("127.0.0.1");
-            newMail.setRemoteHost("localhost");
-        }
-
-        if (isDebug) {
-            log("New mail - sender: " + newMail.getSender()
-                       + ", recipients: " + 
arrayToString(newMail.getRecipients().toArray())
-                       + ", name: " + newMail.getName()
-                       + ", remoteHost: " + newMail.getRemoteHost()
-                       + ", remoteAddr: " + newMail.getRemoteAddr()
-                       + ", state: " + newMail.getState()
-                       + ", lastUpdated: " + newMail.getLastUpdated()
-                       + ", errorMessage: " + newMail.getErrorMessage());
-        }
-
-        //Create the message
-        if(getInLineType(originalMail) != UNALTERED) {
+            // We don't need to use the original Remote Address and Host,
+            // and doing so would likely cause a loop with spam detecting
+            // matchers.
+            try {
+                
newMail.setRemoteAddr(java.net.InetAddress.getLocalHost().getHostAddress());
+                
newMail.setRemoteHost(java.net.InetAddress.getLocalHost().getHostName());
+            } catch (java.net.UnknownHostException _) {
+                newMail.setRemoteAddr("127.0.0.1");
+                newMail.setRemoteHost("localhost");
+            }
+    
             if (isDebug) {
-                log("Alter message");
+                log("New mail - sender: " + newMail.getSender()
+                           + ", recipients: " + 
arrayToString(newMail.getRecipients().toArray())
+                           + ", name: " + newMail.getName()
+                           + ", remoteHost: " + newMail.getRemoteHost()
+                           + ", remoteAddr: " + newMail.getRemoteAddr()
+                           + ", state: " + newMail.getState()
+                           + ", lastUpdated: " + newMail.getLastUpdated()
+                           + ", errorMessage: " + newMail.getErrorMessage());
             }
-            newMail.setMessage(new 
MimeMessage(Session.getDefaultInstance(System.getProperties(),
-                                                               null)));
-
-            // handle the new message if altered
-            buildAlteredMessage(newMail, originalMail);
-
-        } else {
-            // if we need the original, create a copy of this message to 
redirect
-            if (getPassThrough(originalMail)) {
-                newMail.setMessage(new MimeMessage(originalMail.getMessage()) {
-                    protected void updateHeaders() throws MessagingException {
-                        if (getMessageID() == null) super.updateHeaders();
-                        else {
-                            modified = false;
+    
+            //Create the message
+            if(getInLineType(originalMail) != UNALTERED) {
+                if (isDebug) {
+                    log("Alter message");
+                }
+                newMail.setMessage(new 
MimeMessage(Session.getDefaultInstance(System.getProperties(),
+                                                                   null)));
+    
+                // handle the new message if altered
+                buildAlteredMessage(newMail, originalMail);
+    
+            } else {
+                // if we need the original, create a copy of this message to 
redirect
+                if (getPassThrough(originalMail)) {
+                    newMail.setMessage(new 
MimeMessage(originalMail.getMessage()) {
+                        protected void updateHeaders() throws 
MessagingException {
+                            if (getMessageID() == null) super.updateHeaders();
+                            else {
+                                modified = false;
+                            }
                         }
-                    }
-                });
+                    });
+                }
+                if (isDebug) {
+                    log("Message resent unaltered.");
+                }
+                keepMessageId = true;
             }
-            if (isDebug) {
-                log("Message resent unaltered.");
+    
+            //Set additional headers
+    
+            setRecipients(newMail, getRecipients(originalMail), originalMail);
+    
+            setTo(newMail, getTo(originalMail), originalMail);
+    
+            setSubjectPrefix(newMail, getSubjectPrefix(originalMail), 
originalMail);
+    
+            if(newMail.getMessage().getHeader(RFC2822Headers.DATE) == null) {
+                newMail.getMessage().setHeader(RFC2822Headers.DATE, 
rfc822DateFormat.format(new Date()));
             }
-            keepMessageId = true;
-        }
-
-        //Set additional headers
-
-        setRecipients(newMail, getRecipients(originalMail), originalMail);
-
-        setTo(newMail, getTo(originalMail), originalMail);
-
-        setSubjectPrefix(newMail, getSubjectPrefix(originalMail), 
originalMail);
-
-        if(newMail.getMessage().getHeader(RFC2822Headers.DATE) == null) {
-            newMail.getMessage().setHeader(RFC2822Headers.DATE, 
rfc822DateFormat.format(new Date()));
-        }
-
-        setReplyTo(newMail, getReplyTo(originalMail), originalMail);
-
-        setReversePath(newMail, getReversePath(originalMail), originalMail);
-
-        setSender(newMail, getSender(originalMail), originalMail);
-
-        setIsReply(newMail, isReply(originalMail), originalMail);
-
-        newMail.getMessage().saveChanges();
-
-        if (keepMessageId) {
-            setMessageId(newMail, originalMail);
-        }
-
-        if (senderDomainIsValid(newMail)) {
-            //Send it off...
-            getMailetContext().sendMail(newMail);
-        } else {
-            StringBuffer logBuffer = new StringBuffer(256)
-                                    .append(getMailetName())
-                                    .append(" mailet cannot forward ")
-                                    .append(originalMail.getName())
-                                    .append(". Invalid sender domain for ")
-                                    .append(newMail.getSender())
-                                    .append(". Consider using the Resend 
mailet ")
-                                    .append("using a different sender.");
-            throw new MessagingException(logBuffer.toString());
+    
+            setReplyTo(newMail, getReplyTo(originalMail), originalMail);
+    
+            setReversePath(newMail, getReversePath(originalMail), 
originalMail);
+    
+            setSender(newMail, getSender(originalMail), originalMail);
+    
+            setIsReply(newMail, isReply(originalMail), originalMail);
+    
+            newMail.getMessage().saveChanges();
+    
+            if (keepMessageId) {
+                setMessageId(newMail, originalMail);
+            }
+    
+            if (senderDomainIsValid(newMail)) {
+                //Send it off...
+                getMailetContext().sendMail(newMail);
+            } else {
+                StringBuffer logBuffer = new StringBuffer(256)
+                                        .append(getMailetName())
+                                        .append(" mailet cannot forward ")
+                                        .append(originalMail.getName())
+                                        .append(". Invalid sender domain for ")
+                                        .append(newMail.getSender())
+                                        .append(". Consider using the Resend 
mailet ")
+                                        .append("using a different sender.");
+                throw new MessagingException(logBuffer.toString());
+            }
+    
+        } finally {
+            newMail.dispose();
         }
-
+        
         if(!getPassThrough(originalMail)) {
             originalMail.setState(Mail.GHOST);
         }

Modified: 
james/server/trunk/src/java/org/apache/james/transport/mailets/AbstractVirtualUserTable.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/transport/mailets/AbstractVirtualUserTable.java?rev=428989&r1=428988&r2=428989&view=diff
==============================================================================
--- 
james/server/trunk/src/java/org/apache/james/transport/mailets/AbstractVirtualUserTable.java
 (original)
+++ 
james/server/trunk/src/java/org/apache/james/transport/mailets/AbstractVirtualUserTable.java
 Sat Aug  5 05:07:03 2006
@@ -163,15 +163,19 @@
             // duplicates the Mail object, to be able to modify the new mail 
keeping the original untouched
             MailImpl newMail = new MailImpl(mail,newName(mail));
             try {
-                
newMail.setRemoteAddr(java.net.InetAddress.getLocalHost().getHostAddress());
-                
newMail.setRemoteHost(java.net.InetAddress.getLocalHost().getHostName());
-            } catch (java.net.UnknownHostException _) {
-                newMail.setRemoteAddr("127.0.0.1");
-                newMail.setRemoteHost("localhost");
+                try {
+                    
newMail.setRemoteAddr(java.net.InetAddress.getLocalHost().getHostAddress());
+                    
newMail.setRemoteHost(java.net.InetAddress.getLocalHost().getHostName());
+                } catch (java.net.UnknownHostException _) {
+                    newMail.setRemoteAddr("127.0.0.1");
+                    newMail.setRemoteHost("localhost");
+                }
+                newMail.setRecipients(recipientsToAddForward);
+                newMail.setAttribute(MARKER, Boolean.TRUE);
+                getMailetContext().sendMail(newMail);
+            } finally {
+                newMail.dispose();
             }
-            newMail.setRecipients(recipientsToAddForward);
-            newMail.setAttribute(MARKER, Boolean.TRUE);
-            getMailetContext().sendMail(newMail);
         }
 
         // If there are no recipients left, Ghost the message

Modified: 
james/server/trunk/src/java/org/apache/james/transport/mailets/DSNBounce.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/transport/mailets/DSNBounce.java?rev=428989&r1=428988&r2=428989&view=diff
==============================================================================
--- 
james/server/trunk/src/java/org/apache/james/transport/mailets/DSNBounce.java 
(original)
+++ 
james/server/trunk/src/java/org/apache/james/transport/mailets/DSNBounce.java 
Sat Aug  5 05:07:03 2006
@@ -151,89 +151,93 @@
 
         // duplicates the Mail object, to be able to modify the new mail 
keeping the original untouched
         MailImpl newMail = new MailImpl(originalMail,newName(originalMail));
-        // We don't need to use the original Remote Address and Host,
-        // and doing so would likely cause a loop with spam detecting
-        // matchers.
         try {
-            
newMail.setRemoteAddr(java.net.InetAddress.getLocalHost().getHostAddress());
-            
newMail.setRemoteHost(java.net.InetAddress.getLocalHost().getHostName());
-        } catch (java.net.UnknownHostException _) {
-            newMail.setRemoteAddr("127.0.0.1");
-            newMail.setRemoteHost("localhost");
-        }
-
-        if (originalMail.getSender() == null) {
+            // We don't need to use the original Remote Address and Host,
+            // and doing so would likely cause a loop with spam detecting
+            // matchers.
+            try {
+                
newMail.setRemoteAddr(java.net.InetAddress.getLocalHost().getHostAddress());
+                
newMail.setRemoteHost(java.net.InetAddress.getLocalHost().getHostName());
+            } catch (java.net.UnknownHostException _) {
+                newMail.setRemoteAddr("127.0.0.1");
+                newMail.setRemoteHost("localhost");
+            }
+    
+            if (originalMail.getSender() == null) {
+                if (isDebug)
+                    log("Processing a bounce request for a message with an 
empty reverse-path.  No bounce will be sent.");
+                if(!getPassThrough(originalMail)) {
+                    originalMail.setState(Mail.GHOST);
+                }
+                return;
+            }
+    
+            MailAddress reversePath = originalMail.getSender();
             if (isDebug)
-                log("Processing a bounce request for a message with an empty 
reverse-path.  No bounce will be sent.");
-            if(!getPassThrough(originalMail)) {
-                originalMail.setState(Mail.GHOST);
+                log("Processing a bounce request for a message with a reverse 
path.  The bounce will be sent to " + reversePath);
+    
+            Collection newRecipients = new HashSet();
+            newRecipients.add(reversePath);
+            newMail.setRecipients(newRecipients);
+    
+            if (isDebug) {
+                log("New mail - sender: " + newMail.getSender()
+                    + ", recipients: " +
+                    arrayToString(newMail.getRecipients().toArray())
+                    + ", name: " + newMail.getName()
+                    + ", remoteHost: " + newMail.getRemoteHost()
+                    + ", remoteAddr: " + newMail.getRemoteAddr()
+                    + ", state: " + newMail.getState()
+                    + ", lastUpdated: " + newMail.getLastUpdated()
+                    + ", errorMessage: " + newMail.getErrorMessage());
             }
-            return;
-        }
-
-        MailAddress reversePath = originalMail.getSender();
-        if (isDebug)
-            log("Processing a bounce request for a message with a reverse 
path.  The bounce will be sent to " + reversePath);
-
-        Collection newRecipients = new HashSet();
-        newRecipients.add(reversePath);
-        newMail.setRecipients(newRecipients);
-
-        if (isDebug) {
-            log("New mail - sender: " + newMail.getSender()
-                + ", recipients: " +
-                arrayToString(newMail.getRecipients().toArray())
-                + ", name: " + newMail.getName()
-                + ", remoteHost: " + newMail.getRemoteHost()
-                + ", remoteAddr: " + newMail.getRemoteAddr()
-                + ", state: " + newMail.getState()
-                + ", lastUpdated: " + newMail.getLastUpdated()
-                + ", errorMessage: " + newMail.getErrorMessage());
-        }
-
-        // create the bounce message
-        MimeMessage newMessage =
-            new MimeMessage(Session.getDefaultInstance(System.getProperties(),
-                                                       null));
-
-        MimeMultipartReport multipart = new MimeMultipartReport ();
-        multipart.setReportType ("delivery-status");
-        
-        // part 1: descripive text message
-        MimeBodyPart part1 = createTextMsg(originalMail);
-        multipart.addBodyPart(part1);
-
-        // part 2: DSN
-        MimeBodyPart part2 = createDSN(originalMail);
-        multipart.addBodyPart(part2);
-
-
-        // part 3: original mail (optional)
-        if (getAttachmentType() != NONE) {
-            MimeBodyPart part3 = 
createAttachedOriginal(originalMail,getAttachmentType());
-            multipart.addBodyPart(part3);
-        }
-
-
-        // stuffing all together
-        newMessage.setContent(multipart);
-        newMessage.setHeader(RFC2822Headers.CONTENT_TYPE, 
multipart.getContentType());
-        newMail.setMessage(newMessage);
-
-        //Set additional headers
-        setRecipients(newMail, getRecipients(originalMail), originalMail);
-        setTo(newMail, getTo(originalMail), originalMail);
-        setSubjectPrefix(newMail, getSubjectPrefix(originalMail), 
originalMail);
-        if(newMail.getMessage().getHeader(RFC2822Headers.DATE) == null) {
-            
newMail.getMessage().setHeader(RFC2822Headers.DATE,rfc822DateFormat.format(new 
Date()));
+    
+            // create the bounce message
+            MimeMessage newMessage =
+                new 
MimeMessage(Session.getDefaultInstance(System.getProperties(),
+                                                           null));
+    
+            MimeMultipartReport multipart = new MimeMultipartReport ();
+            multipart.setReportType ("delivery-status");
+            
+            // part 1: descripive text message
+            MimeBodyPart part1 = createTextMsg(originalMail);
+            multipart.addBodyPart(part1);
+    
+            // part 2: DSN
+            MimeBodyPart part2 = createDSN(originalMail);
+            multipart.addBodyPart(part2);
+    
+    
+            // part 3: original mail (optional)
+            if (getAttachmentType() != NONE) {
+                MimeBodyPart part3 = 
createAttachedOriginal(originalMail,getAttachmentType());
+                multipart.addBodyPart(part3);
+            }
+    
+    
+            // stuffing all together
+            newMessage.setContent(multipart);
+            newMessage.setHeader(RFC2822Headers.CONTENT_TYPE, 
multipart.getContentType());
+            newMail.setMessage(newMessage);
+    
+            //Set additional headers
+            setRecipients(newMail, getRecipients(originalMail), originalMail);
+            setTo(newMail, getTo(originalMail), originalMail);
+            setSubjectPrefix(newMail, getSubjectPrefix(originalMail), 
originalMail);
+            if(newMail.getMessage().getHeader(RFC2822Headers.DATE) == null) {
+                
newMail.getMessage().setHeader(RFC2822Headers.DATE,rfc822DateFormat.format(new 
Date()));
+            }
+            setReplyTo(newMail, getReplyTo(originalMail), originalMail);
+            setReversePath(newMail, getReversePath(originalMail), 
originalMail);
+            setSender(newMail, getSender(originalMail), originalMail);
+            setIsReply(newMail, isReply(originalMail), originalMail);
+    
+            newMail.getMessage().saveChanges();
+            getMailetContext().sendMail(newMail);
+        } finally {
+            newMail.dispose();
         }
-        setReplyTo(newMail, getReplyTo(originalMail), originalMail);
-        setReversePath(newMail, getReversePath(originalMail), originalMail);
-        setSender(newMail, getSender(originalMail), originalMail);
-        setIsReply(newMail, isReply(originalMail), originalMail);
-
-        newMail.getMessage().saveChanges();
-        getMailetContext().sendMail(newMail);
 
         // ghosting the original mail
         if(!getPassThrough(originalMail)) {

Modified: 
james/server/trunk/src/java/org/apache/james/transport/mailets/ToMultiRepository.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/transport/mailets/ToMultiRepository.java?rev=428989&r1=428988&r2=428989&view=diff
==============================================================================
--- 
james/server/trunk/src/java/org/apache/james/transport/mailets/ToMultiRepository.java
 (original)
+++ 
james/server/trunk/src/java/org/apache/james/transport/mailets/ToMultiRepository.java
 Sat Aug  5 05:07:03 2006
@@ -220,16 +220,19 @@
 
         Collection recipients = new HashSet();
         recipients.add(recipient);
-        Mail mail = new MailImpl(getId(), sender, recipients, message);
-        MailRepository userInbox = getRepository(username);
-        if (userInbox == null) {
-            StringBuffer errorBuffer = new StringBuffer(128).append(
-                    "The repository for user ").append(username).append(
-                    " was not found on this server.");
-            throw new MessagingException(errorBuffer.toString());
+        MailImpl mail = new MailImpl(getId(), sender, recipients, message);
+        try {
+            MailRepository userInbox = getRepository(username);
+            if (userInbox == null) {
+                StringBuffer errorBuffer = new StringBuffer(128).append(
+                        "The repository for user ").append(username).append(
+                        " was not found on this server.");
+                throw new MessagingException(errorBuffer.toString());
+            }
+            userInbox.store(mail);
+        } finally {
+            mail.dispose();
         }
-        userInbox.store(mail);
-        ContainerUtil.dispose(mail);
     }
 
     /**



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

Reply via email to