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]