Author: bago
Date: Sat Aug 5 05:26:23 2006
New Revision: 428992
URL: http://svn.apache.org/viewvc?rev=428992&view=rev
Log:
Backport r428989 (latest fix to 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/branches/v2.3/src/java/org/apache/james/James.java
james/server/branches/v2.3/src/java/org/apache/james/core/MailImpl.java
james/server/branches/v2.3/src/java/org/apache/james/transport/mailets/AbstractRedirect.java
james/server/branches/v2.3/src/java/org/apache/james/transport/mailets/AbstractVirtualUserTable.java
james/server/branches/v2.3/src/java/org/apache/james/transport/mailets/DSNBounce.java
james/server/branches/v2.3/src/java/org/apache/james/transport/mailets/ToMultiRepository.java
Modified: james/server/branches/v2.3/src/java/org/apache/james/James.java
URL:
http://svn.apache.org/viewvc/james/server/branches/v2.3/src/java/org/apache/james/James.java?rev=428992&r1=428991&r2=428992&view=diff
==============================================================================
--- james/server/branches/v2.3/src/java/org/apache/james/James.java (original)
+++ james/server/branches/v2.3/src/java/org/apache/james/James.java Sat Aug 5
05:26:23 2006
@@ -447,9 +447,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/branches/v2.3/src/java/org/apache/james/core/MailImpl.java
URL:
http://svn.apache.org/viewvc/james/server/branches/v2.3/src/java/org/apache/james/core/MailImpl.java?rev=428992&r1=428991&r2=428992&view=diff
==============================================================================
--- james/server/branches/v2.3/src/java/org/apache/james/core/MailImpl.java
(original)
+++ james/server/branches/v2.3/src/java/org/apache/james/core/MailImpl.java Sat
Aug 5 05:26:23 2006
@@ -384,6 +384,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;
}
/**
@@ -535,8 +541,7 @@
* @return Serializable of the entire attributes collection
* @since 2.2.0
**/
- public HashMap getAttributesRaw ()
- {
+ public HashMap getAttributesRaw () {
return attributes;
}
Modified:
james/server/branches/v2.3/src/java/org/apache/james/transport/mailets/AbstractRedirect.java
URL:
http://svn.apache.org/viewvc/james/server/branches/v2.3/src/java/org/apache/james/transport/mailets/AbstractRedirect.java?rev=428992&r1=428991&r2=428992&view=diff
==============================================================================
---
james/server/branches/v2.3/src/java/org/apache/james/transport/mailets/AbstractRedirect.java
(original)
+++
james/server/branches/v2.3/src/java/org/apache/james/transport/mailets/AbstractRedirect.java
Sat Aug 5 05:26:23 2006
@@ -974,98 +974,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/branches/v2.3/src/java/org/apache/james/transport/mailets/AbstractVirtualUserTable.java
URL:
http://svn.apache.org/viewvc/james/server/branches/v2.3/src/java/org/apache/james/transport/mailets/AbstractVirtualUserTable.java?rev=428992&r1=428991&r2=428992&view=diff
==============================================================================
---
james/server/branches/v2.3/src/java/org/apache/james/transport/mailets/AbstractVirtualUserTable.java
(original)
+++
james/server/branches/v2.3/src/java/org/apache/james/transport/mailets/AbstractVirtualUserTable.java
Sat Aug 5 05:26:23 2006
@@ -159,15 +159,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/branches/v2.3/src/java/org/apache/james/transport/mailets/DSNBounce.java
URL:
http://svn.apache.org/viewvc/james/server/branches/v2.3/src/java/org/apache/james/transport/mailets/DSNBounce.java?rev=428992&r1=428991&r2=428992&view=diff
==============================================================================
---
james/server/branches/v2.3/src/java/org/apache/james/transport/mailets/DSNBounce.java
(original)
+++
james/server/branches/v2.3/src/java/org/apache/james/transport/mailets/DSNBounce.java
Sat Aug 5 05:26:23 2006
@@ -147,89 +147,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/branches/v2.3/src/java/org/apache/james/transport/mailets/ToMultiRepository.java
URL:
http://svn.apache.org/viewvc/james/server/branches/v2.3/src/java/org/apache/james/transport/mailets/ToMultiRepository.java?rev=428992&r1=428991&r2=428992&view=diff
==============================================================================
---
james/server/branches/v2.3/src/java/org/apache/james/transport/mailets/ToMultiRepository.java
(original)
+++
james/server/branches/v2.3/src/java/org/apache/james/transport/mailets/ToMultiRepository.java
Sat Aug 5 05:26:23 2006
@@ -216,16 +216,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]