From: Camille T. <tus...@us...> - 2003-01-28 08:28:42
|
Update of /cvsroot/wonder/Wonder/Common/Frameworks/ERJavaMail/Sources/er/javamail In directory sc8-pr-cvs1:/tmp/cvs-serv5715 Modified Files: ERMailDelivery.java ERMailSender.java ERMailUtils.java ERMessage.java Log Message: - Corrected a bug in which email addresses written with personal name and containing accented characters caused an encoding problem. The API has slightly changed (3 methods were added in ERMailDelivery) - Made ERMailSender more robust by trapping an unexpected exception and logging it. Index: ERMailDelivery.java =================================================================== RCS file: /cvsroot/wonder/Wonder/Common/Frameworks/ERJavaMail/Sources/er/javamail/ERMailDelivery.java,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** ERMailDelivery.java 11 Dec 2002 21:34:15 -0000 1.6 --- ERMailDelivery.java 28 Jan 2003 08:28:39 -0000 1.7 *************** *** 71,75 **** public static String callBackMethodName = null; ! public static String DefaultCharset = "ISO-8859-1"; public String _charset = DefaultCharset; --- 71,75 ---- public static String callBackMethodName = null; ! public static String DefaultCharset = System.getProperty ("er.javamail.defaultEncoding"); public String _charset = DefaultCharset; *************** *** 159,162 **** --- 159,186 ---- } + protected InternetAddress internetAddressWithEmailAndPersonal (String email, String personal) throws AddressException { + InternetAddress address = null; + + if (personal != null) { + address = new InternetAddress (); + address.setAddress (email); + + try { + address.setPersonal (personal, this.charset ()); + } catch (java.io.UnsupportedEncodingException ex) { + // set the string anyway. + try { + address.setPersonal (personal); + } catch (Exception e) { + // give up ... + } + } + } else { + address = new InternetAddress (email); + } + + return address; + } + /** Sets the from address for the current message instance */ public void setFromAddress (String fromAddress) throws MessagingException, AddressException { *************** *** 164,172 **** } ! /** Sets the reply-to address for the current message instance */ ! public void setReplyToAddress (String replyToAddress) throws MessagingException, AddressException { ! this.mimeMessage ().setReplyTo (new InternetAddress [] { ! new InternetAddress (replyToAddress) ! }); } --- 188,207 ---- } ! /** Sets the from address for the current message instance using an email and the personal name. */ ! public void setFromAddress (String fromAddress, String personalName) throws MessagingException, AddressException { ! InternetAddress address = ! this.internetAddressWithEmailAndPersonal (fromAddress, personalName); ! this.mimeMessage ().setFrom (address); ! } ! ! public void setToAddress (String toAddress) throws MessagingException, AddressException { ! this.setToAddresses (new NSArray (toAddress)); ! } ! ! /** Sets the to address for the current message instance using an email and the personal name. */ ! public void setToAddress (String toAddress, String personalName) throws MessagingException, AddressException { ! InternetAddress address = ! this.internetAddressWithEmailAndPersonal (toAddress, personalName); ! setInternetAddresses (new NSArray (address), Message.RecipientType.TO); } *************** *** 176,181 **** } ! public void setToAddress (String toAddress) throws MessagingException, AddressException { ! this.setToAddresses (new NSArray (toAddress)); } --- 211,219 ---- } ! /** Sets the reply-to address for the current message instance */ ! public void setReplyToAddress (String replyToAddress) throws MessagingException, AddressException { ! this.mimeMessage ().setReplyTo (new InternetAddress [] { ! new InternetAddress (replyToAddress) ! }); } *************** *** 200,210 **** /** Sets the subject for the current message instance */ public void setSubject (String subject) throws MessagingException { ! String encoded = null; ! try { ! encoded = MimeUtility.encodeText (subject, charset(), !charset().equals(DefaultCharset) ? "B" : null); ! } catch (Exception e) { ! encoded = subject; ! } ! this.mimeMessage ().setSubject (encoded); } --- 238,242 ---- /** Sets the subject for the current message instance */ public void setSubject (String subject) throws MessagingException { ! this.mimeMessage ().setSubject (ERMailUtils.encodeString (subject, this.charset ())); } *************** *** 332,337 **** // in the System properties if ((this.xMailerHeader () == null) && ! (ERJavaMail.sharedInstance ().defaultXMailerHeader () != null)) this.setXMailerHeader (ERJavaMail.sharedInstance ().defaultXMailerHeader ()); this.mimeMessage ().setSentDate (new Date ()); --- 364,370 ---- // in the System properties if ((this.xMailerHeader () == null) && ! (ERJavaMail.sharedInstance ().defaultXMailerHeader () != null)) { this.setXMailerHeader (ERJavaMail.sharedInstance ().defaultXMailerHeader ()); + } this.mimeMessage ().setSentDate (new Date ()); *************** *** 345,349 **** } ! /** * Sets addresses regarding their recipient type in the current message. --- 378,401 ---- } ! /** ! * Sets addresses using an NSArray of InternetAddress objects. ! * This method, unlike 'setAddresses' does not have the ability to ! * filter black & white list. ! */ ! public void setInternetAddresses (NSArray addresses, ! Message.RecipientType type) throws MessagingException { ! if ((type == null) || (addresses == null) || (addresses.count () == 0)) { ! // don't do anything. ! return; ! } ! ! InternetAddress [] internetAddresses = new InternetAddress [addresses.count ()]; ! for (int i=0 ; i<addresses.count () ; i++) { ! internetAddresses [i] = (InternetAddress) addresses.objectAtIndex (i); ! } ! ! this.mimeMessage ().setRecipients (type, internetAddresses); ! } ! /** * Sets addresses regarding their recipient type in the current message. *************** *** 357,371 **** InternetAddress [] addresses = null; ! if (filterAddresses) addressesArray = ERJavaMail.sharedInstance().filterEmailAddresses(addressesArray); ! ! if (!ERJavaMail.sharedInstance ().centralize ()) addresses = ERMailUtils.convertNSArrayToInternetAddresses (addressesArray); ! else addresses = new InternetAddress [] { new InternetAddress (ERJavaMail.sharedInstance ().adminEmail ()) }; this.mimeMessage ().setRecipients (type, addresses); } ! /** * Abstract method called by subclasses for doing pre-processing before sending the mail. --- 409,425 ---- InternetAddress [] addresses = null; ! if (filterAddresses) { addressesArray = ERJavaMail.sharedInstance().filterEmailAddresses(addressesArray); ! } ! ! if (!ERJavaMail.sharedInstance ().centralize ()) { addresses = ERMailUtils.convertNSArrayToInternetAddresses (addressesArray); ! } else { addresses = new InternetAddress [] { new InternetAddress (ERJavaMail.sharedInstance ().adminEmail ()) }; + } this.mimeMessage ().setRecipients (type, addresses); } ! /** * Abstract method called by subclasses for doing pre-processing before sending the mail. Index: ERMailSender.java =================================================================== RCS file: /cvsroot/wonder/Wonder/Common/Frameworks/ERJavaMail/Sources/er/javamail/ERMailSender.java,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** ERMailSender.java 19 Dec 2002 04:42:23 -0000 1.12 --- ERMailSender.java 28 Jan 2003 08:28:39 -0000 1.13 *************** *** 1,7 **** /* ! $Id$ ! ERMailSender.java - Camille Troillard - tus...@ma... ! */ package er.javamail; --- 1,7 ---- /* ! $Id$ ! ERMailSender.java - Camille Troillard - tus...@ma... ! */ package er.javamail; *************** *** 19,28 **** /** This class is used to send mails in a threaded way.<BR> This is ! needed in WebObjects because if sending 20 mails takes 40 seconds, ! then the user must wait 40 seconds before attempting to use ! the application. ! @author Camille Troillard <tus...@ma...> ! @author Tatsuya Kawano <tat...@ma...> ! @author Max Muller <max...@ma...> */ public class ERMailSender extends Thread { --- 19,28 ---- /** This class is used to send mails in a threaded way.<BR> This is ! needed in WebObjects because if sending 20 mails takes 40 seconds, ! then the user must wait 40 seconds before attempting to use ! the application. ! @author Camille Troillard <tus...@ma...> ! @author Tatsuya Kawano <tat...@ma...> ! @author Max Muller <max...@ma...> */ public class ERMailSender extends Thread { *************** *** 30,40 **** private static ERMailSender _sharedMailSender; private Stats stats; private MimeMessage message; ! // Holds sending messages. The queue size can be set by // er.javamail.senderQueue.size property ! private ERQueue messages; // For thread management private boolean threadSuspended = false; --- 30,44 ---- private static ERMailSender _sharedMailSender; + private static boolean useSenderDelay = + ERXProperties.booleanForKey ("er.javamail.useSenderDelay"); + private static int senderDelayMillis = + ERXProperties.intForKey ("er.javamail.senderDelayMillis"); private Stats stats; private MimeMessage message; ! // Holds sending messages. The queue size can be set by // er.javamail.senderQueue.size property ! private ERQueue messages; // For thread management private boolean threadSuspended = false; *************** *** 42,51 **** /** ! * Exception class for alerting about a stack overflow */ public static class SizeOverflowException extends Exception { public SizeOverflowException () { super (); } } ! private ERMailSender () { super ("ERMailSender"); --- 46,55 ---- /** ! * Exception class for alerting about a stack overflow */ public static class SizeOverflowException extends Exception { public SizeOverflowException () { super (); } } ! private ERMailSender () { super ("ERMailSender"); *************** *** 56,60 **** if (WOApplication.application ().isDebuggingEnabled ()) milliSecondsWaitRunLoop = 2000; ! if (log.isDebugEnabled()) log.debug("ERMailSender initialized (JVM heap size: " + stats.formattedUsedMemory () + ")"); --- 60,64 ---- if (WOApplication.application ().isDebuggingEnabled ()) milliSecondsWaitRunLoop = 2000; ! if (log.isDebugEnabled()) log.debug("ERMailSender initialized (JVM heap size: " + stats.formattedUsedMemory () + ")"); *************** *** 74,79 **** /** Sends a message in a non-blocking way.<br> This means that the ! thread won't be blocked, but the message will be queued before ! being delivered. */ public void sendMessageDeffered (ERMessage message) throws ERMailSender.SizeOverflowException { try { --- 78,83 ---- /** Sends a message in a non-blocking way.<br> This means that the ! thread won't be blocked, but the message will be queued before ! being delivered. */ public void sendMessageDeffered (ERMessage message) throws ERMailSender.SizeOverflowException { try { *************** *** 87,97 **** //log.debug ("Adding a message in the queue: \n" + allRecipientsString); } ! messages.push (message); stats.updateMemoryUsage (); ! if (log.isDebugEnabled ()) log.debug ("(" + stats.formattedUsedMemory () + ") Added the message in the queue: " ! + allRecipientsString); } catch (ERQueue.SizeOverflowException e) { throw new ERMailSender.SizeOverflowException (); --- 91,101 ---- //log.debug ("Adding a message in the queue: \n" + allRecipientsString); } ! messages.push (message); stats.updateMemoryUsage (); ! if (log.isDebugEnabled ()) log.debug ("(" + stats.formattedUsedMemory () + ") Added the message in the queue: " ! + allRecipientsString); } catch (ERQueue.SizeOverflowException e) { throw new ERMailSender.SizeOverflowException (); *************** *** 108,164 **** /** Sends a message immediately.<br> ! This means that the thread could be blocked if the message takes time to be delivered. */ public void sendMessageNow (ERMessage message) { ! Transport transport = this._connectedTransportForSession (ERJavaMail.sharedInstance ().defaultSession ()); ! try { ! this._sendMessageNow (message, transport); ! } catch (MessagingException e) { ! if (log.isDebugEnabled ()) ! log.debug ("Caught exception when sending mail in a non-blocking manner.", e); ! throw new NSForwardException (e); ! } finally { ! // CHECKME (camille): ! // Should we really close this default transport instance? ! // I think there is no need to do so and that it should be closed ! // when the ERMailSender is finalized ! if (transport != null) { ! try { ! transport.close (); ! } catch (MessagingException e) { ! // Fatal exception ... we must at least notify the use ! log.error ("Caught exception when closing transport.", e); ! throw new RuntimeException ("Unable to open nor close the messaging transport channel."); ! } ! } ! } } /** Common method used by 'sendMessageNow' and ! 'sendMessageDeffered' (actully the 'run' method when the ! thread is running) to send a message.<br> This method sends ! the message and increments the processed mail count. If an ! exception occurs while sending the mail, and if a callback ! object has been given, the notifyInvalidEmails method is ! called.<br> If a MessagingException is thrown, then the ! exception is catched and rethrown immediately, thus letting us ! to process another callbacks or not. For example, This is ! used when sendMessageNow is used, the MessagingException is ! encapsulated in a ERMailSender.ForwardException, and thrown to ! the user. */ ! protected void _sendMessageNow (ERMessage message, Transport transport) ! throws MessagingException { boolean debug = log.isDebugEnabled (); ! MimeMessage aMessage = message.mimeMessage (); ! Object callbackObject = message.callbackObject (); ! MessagingException exception = null; ! // Send the message ! try { ! if (debug) log.debug ("Sending a message ..."); ! transport.sendMessage (aMessage, aMessage.getAllRecipients ()); stats.updateMemoryUsage (); ! ! if (debug) { String allRecipientsString = null; try { --- 112,168 ---- /** Sends a message immediately.<br> ! This means that the thread could be blocked if the message takes time to be delivered. */ public void sendMessageNow (ERMessage message) { ! Transport transport = this._connectedTransportForSession (ERJavaMail.sharedInstance ().defaultSession ()); ! try { ! this._sendMessageNow (message, transport); ! } catch (MessagingException e) { ! if (log.isDebugEnabled ()) ! log.debug ("Caught exception when sending mail in a non-blocking manner.", e); ! throw new NSForwardException (e); ! } finally { ! // CHECKME (camille): ! // Should we really close this default transport instance? ! // I think there is no need to do so and that it should be closed ! // when the ERMailSender is finalized ! if (transport != null) { ! try { ! transport.close (); ! } catch (MessagingException e) { ! // Fatal exception ... we must at least notify the use ! log.error ("Caught exception when closing transport.", e); ! throw new RuntimeException ("Unable to open nor close the messaging transport channel."); ! } ! } ! } } /** Common method used by 'sendMessageNow' and ! 'sendMessageDeffered' (actully the 'run' method when the ! thread is running) to send a message.<br> This method sends ! the message and increments the processed mail count. If an ! exception occurs while sending the mail, and if a callback ! object has been given, the notifyInvalidEmails method is ! called.<br> If a MessagingException is thrown, then the ! exception is catched and rethrown immediately, thus letting us ! to process another callbacks or not. For example, This is ! used when sendMessageNow is used, the MessagingException is ! encapsulated in a ERMailSender.ForwardException, and thrown to ! the user. */ ! protected void _sendMessageNow (ERMessage message, Transport transport) throws MessagingException { boolean debug = log.isDebugEnabled (); ! MimeMessage aMessage = message.mimeMessage (); ! Object callbackObject = message.callbackObject (); ! MessagingException exception = null; ! // Send the message ! try { ! if (debug) log.debug ("Sending a message ... " + aMessage); ! transport.sendMessage (aMessage, aMessage.getAllRecipients ()); ! if (debug) log.debug ("Done."); stats.updateMemoryUsage (); ! ! if (debug) { String allRecipientsString = null; try { *************** *** 166,212 **** } catch (MessagingException ex) { allRecipientsString = "(not available)"; ! } log.debug ("(" + stats.formattedUsedMemory() + ") Message sent: " + allRecipientsString); } ! } catch (SendFailedException e) { ! if (debug) ! log.debug ("Failed to send message: \n" + message.allRecipientsAsString() + e.getMessage ()); ! stats.incrementErrorCount (); ! if (callbackObject != null) { ! SendFailedException sfex = (SendFailedException)e; ! NSArray invalidEmails = ERMailUtils.convertInternetAddressesToNSArray ! ((InternetAddress [])sfex.getInvalidAddresses ()); ! this.notifyInvalidEmails (callbackObject, invalidEmails); ! } ! ! exception = e; ! } catch (MessagingException e) { ! exception = e; ! } finally { ! stats.incrementMailCount (); ! if (exception != null) ! throw exception; ! } } /** Utility method that gets the SMTP Transport method for a session and ! connects the Transport before returning it. */ protected Transport _connectedTransportForSession (javax.mail.Session session) { ! Transport transport = null; ! try { ! transport = session.getTransport ("smtp"); ! if (!transport.isConnected()) ! transport.connect(); ! } catch (MessagingException e) { log.error ("Unable to connect to SMTP Transport. MessagingException: " + e.getMessage (), e); ! } ! return transport; } ! /** Don't call this method, this is the thread run loop and is automatically called. */ --- 170,218 ---- } catch (MessagingException ex) { allRecipientsString = "(not available)"; ! } log.debug ("(" + stats.formattedUsedMemory() + ") Message sent: " + allRecipientsString); } ! } catch (SendFailedException e) { ! if (debug) ! log.debug ("Failed to send message: \n" + message.allRecipientsAsString() + e.getMessage ()); ! stats.incrementErrorCount (); ! if (callbackObject != null) { ! SendFailedException sfex = (SendFailedException)e; ! NSArray invalidEmails = ERMailUtils.convertInternetAddressesToNSArray ! ((InternetAddress [])sfex.getInvalidAddresses ()); ! this.notifyInvalidEmails (callbackObject, invalidEmails); ! } ! ! exception = e; ! } catch (MessagingException e) { ! exception = e; ! } catch (Throwable t) { ! log.error ("An unexpected error occured while sending mail.", t); ! } finally { ! stats.incrementMailCount (); ! if (exception != null) ! throw exception; ! } } /** Utility method that gets the SMTP Transport method for a session and ! connects the Transport before returning it. */ protected Transport _connectedTransportForSession (javax.mail.Session session) { ! Transport transport = null; ! try { ! transport = session.getTransport ("smtp"); ! if (!transport.isConnected()) ! transport.connect(); ! } catch (MessagingException e) { log.error ("Unable to connect to SMTP Transport. MessagingException: " + e.getMessage (), e); ! } ! return transport; } ! /** Don't call this method, this is the thread run loop and is automatically called. */ *************** *** 221,266 **** } } catch (InterruptedException e) { ! log.warn ("ERMailSender thread has been interrupted."); threadSuspended = true; return; } ! // If there are still messages pending ... ! if (!messages.empty ()) { ! Session session = null; ! Transport transport = null; ! session = ERJavaMail.sharedInstance ().newSession (); ! transport = this._connectedTransportForSession (session); ! try { ! if (!transport.isConnected ()) ! transport.connect(); ! } catch (MessagingException e) { ! // Notify error in logs ! log.error ("Unable to connect transport.", e); ! // Exit run loop ! throw new RuntimeException ("Unable to connect transport."); ! } ! while (!messages.empty ()) { ! ERMessage message = (ERMessage)messages.pop(); ! try { ! this._sendMessageNow (message, transport); ! } catch (MessagingException e) { ! // Here we get all the exceptions that are ! // not 'SendFailedException's. ! // All we can do is warn the admin. ! log.error ("Fatal Messaging Exception. Can't send the mail.", e); ! } ! } ! try { ! if (transport != null) ! transport.close (); ! } catch (MessagingException e) /* once again ... */ { ! log.warn ("Unable to close transport. Perhaps it has already been closed?", e); ! } ! } threadSuspended = true; --- 227,280 ---- } } catch (InterruptedException e) { ! log.warn ("ERMailSender thread has been interrupted."); threadSuspended = true; return; } ! // If there are still messages pending ... ! if (!messages.empty ()) { ! Session session = null; ! Transport transport = null; ! session = ERJavaMail.sharedInstance ().newSession (); ! transport = this._connectedTransportForSession (session); ! try { ! if (!transport.isConnected ()) { ! transport.connect(); ! } ! } catch (MessagingException e) { ! // Notify error in logs ! log.error ("Unable to connect transport.", e); ! // Exit run loop ! throw new RuntimeException ("Unable to connect transport."); ! } ! while (!messages.empty ()) { ! ERMessage message = (ERMessage)messages.pop(); ! try { ! this._sendMessageNow (message, transport); ! // if (useSenderDelay) { ! // this.wait (senderDelayMillis); ! //} ! } catch (MessagingException e) { ! // Here we get all the exceptions that are ! // not 'SendFailedException's. ! // All we can do is warn the admin. ! log.error ("Fatal Messaging Exception. Can't send the mail.", e); ! }/* catch (InterruptedException e) { ! log.warn ("ERMailSender thread has been interrupted."); ! threadSuspended = true; ! return; ! }*/ ! } ! try { ! if (transport != null) ! transport.close (); ! } catch (MessagingException e) /* once again ... */ { ! log.warn ("Unable to close transport. Perhaps it has already been closed?", e); ! } ! } threadSuspended = true; *************** *** 269,291 **** /** Executes the callback method to notify the calling application of ! any invalid emails. */ protected void notifyInvalidEmails (Object callbackObject, NSArray invalidEmails) { ! // FIXME: We need to refactor this to use NSNotificationCenter !!! ! try { ! Class c = Class.forName (ERMailDelivery.callBackClassName); ! Class[] parameterTypes = new Class[] {callbackObject.getClass(), invalidEmails.getClass()}; ! Method m = c.getMethod (ERMailDelivery.callBackMethodName, parameterTypes); ! Object[] args = new Object[] {callbackObject, invalidEmails}; ! m.invoke (c.newInstance(), args); ! } catch (ClassNotFoundException cnfe) { ! log.error ("ERMailSender. Unable to find class: " + ERMailDelivery.callBackClassName); ! throw new NSForwardException (cnfe); ! } catch (NoSuchMethodException nsme) { ! log.error ("ERMailSender. Unable to find method: " + ERMailDelivery.callBackMethodName); ! throw new NSForwardException (nsme); ! } catch (java.lang.Exception e) { ! log.error ("Exception occured: " + e.getMessage(), e); ! throw new NSForwardException (e); ! } } --- 283,305 ---- /** Executes the callback method to notify the calling application of ! any invalid emails. */ protected void notifyInvalidEmails (Object callbackObject, NSArray invalidEmails) { ! // FIXME: We need to refactor this to use NSNotificationCenter !!! ! try { ! Class c = Class.forName (ERMailDelivery.callBackClassName); ! Class[] parameterTypes = new Class[] {callbackObject.getClass(), invalidEmails.getClass()}; ! Method m = c.getMethod (ERMailDelivery.callBackMethodName, parameterTypes); ! Object[] args = new Object[] {callbackObject, invalidEmails}; ! m.invoke (c.newInstance(), args); ! } catch (ClassNotFoundException cnfe) { ! log.error ("ERMailSender. Unable to find class: " + ERMailDelivery.callBackClassName); ! throw new NSForwardException (cnfe); ! } catch (NoSuchMethodException nsme) { ! log.error ("ERMailSender. Unable to find method: " + ERMailDelivery.callBackMethodName); ! throw new NSForwardException (nsme); ! } catch (java.lang.Exception e) { ! log.error ("Exception occured: " + e.getMessage(), e); ! throw new NSForwardException (e); ! } } *************** *** 299,303 **** private Runtime _runtime; private ERXUnitAwareDecimalFormat _decimalFormatter; ! public Stats() { _decimalFormatter = new ERXUnitAwareDecimalFormat (ERXUnitAwareDecimalFormat.BYTE); --- 313,317 ---- private Runtime _runtime; private ERXUnitAwareDecimalFormat _decimalFormatter; ! public Stats() { _decimalFormatter = new ERXUnitAwareDecimalFormat (ERXUnitAwareDecimalFormat.BYTE); *************** *** 307,311 **** } ! /** Resets statistics information */ public synchronized void reset () { String savedStatsString = this.toString (); --- 321,325 ---- } ! /** Resets statistics information */ public synchronized void reset () { String savedStatsString = this.toString (); *************** *** 315,319 **** updateMemoryUsage(); lastResetTime = new NSTimestamp (); ! if (log.isDebugEnabled()) log.debug(savedStatsString + " has been reset to initial value."); } --- 329,333 ---- updateMemoryUsage(); lastResetTime = new NSTimestamp (); ! if (log.isDebugEnabled()) log.debug(savedStatsString + " has been reset to initial value."); } *************** *** 321,326 **** /** @return the count of error that were encountered during mail seonding process */ public synchronized int errorCount () { ! return errorCount; ! } /** @return the total count of mails being sent. This number does not take in --- 335,340 ---- /** @return the count of error that were encountered during mail seonding process */ public synchronized int errorCount () { ! return errorCount; ! } /** @return the total count of mails being sent. This number does not take in *************** *** 328,349 **** error use 'errorCount - mailCount'. */ public synchronized int mailCount () { ! return mailCount; ! } /** @return the current queue size. This method is useful for simplistic load balancing between apps that are supposed to send mails */ public synchronized int currentQueueSize () { ! return messages.size (); ! } private void incrementErrorCount () { ! errorCount++; ! } ! ! private void incrementMailCount () { ! mailCount++; ! } ! /** @return the timestamp that respresents when the stats object was reset. */ public NSTimestamp lastResetTime () { return lastResetTime; --- 342,363 ---- error use 'errorCount - mailCount'. */ public synchronized int mailCount () { ! return mailCount; ! } /** @return the current queue size. This method is useful for simplistic load balancing between apps that are supposed to send mails */ public synchronized int currentQueueSize () { ! return messages.size (); ! } private void incrementErrorCount () { ! errorCount++; ! } ! private void incrementMailCount () { ! mailCount++; ! } ! ! /** @return the timestamp that respresents when the stats object was reset. */ public NSTimestamp lastResetTime () { return lastResetTime; *************** *** 352,360 **** private void updateMemoryUsage () { long currentMemoryUsed = usedMemory (); ! if (currentMemoryUsed > _peakMemoryUsage) _peakMemoryUsage = currentMemoryUsed; } ! ! public long usedMemory () { long totalMemory = _runtime.totalMemory (); long freeMemory = _runtime.freeMemory (); --- 366,374 ---- private void updateMemoryUsage () { long currentMemoryUsed = usedMemory (); ! if (currentMemoryUsed > _peakMemoryUsage) _peakMemoryUsage = currentMemoryUsed; } ! ! public long usedMemory () { long totalMemory = _runtime.totalMemory (); long freeMemory = _runtime.freeMemory (); *************** *** 362,366 **** return usedMemory; } ! public String formattedUsedMemory () { return _decimalFormatter.format(usedMemory ()); --- 376,380 ---- return usedMemory; } ! public String formattedUsedMemory () { return _decimalFormatter.format(usedMemory ()); *************** *** 377,389 **** /** @return a string representation of the Stats object. */ public String toString () { ! return "<" + getClass ().getName () ! + " lastResetTime: " + lastResetTime () ! + ", mailCount: " + mailCount () ! + ", errorCount: " + errorCount () ! + ", currentQueueSize: " + currentQueueSize () ! + ", peakMemoryUsage: " + formattedPeakMemoryUsage () ! + ">"; } } - } --- 391,402 ---- /** @return a string representation of the Stats object. */ public String toString () { ! return "<" + this.getClass ().getName () ! + " lastResetTime: " + lastResetTime () ! + ", mailCount: " + mailCount () ! + ", errorCount: " + errorCount () ! + ", currentQueueSize: " + currentQueueSize () ! + ", peakMemoryUsage: " + formattedPeakMemoryUsage () ! + ">"; } } } Index: ERMailUtils.java =================================================================== RCS file: /cvsroot/wonder/Wonder/Common/Frameworks/ERJavaMail/Sources/er/javamail/ERMailUtils.java,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** ERMailUtils.java 18 Dec 2002 22:41:53 -0000 1.5 --- ERMailUtils.java 28 Jan 2003 08:28:39 -0000 1.6 *************** *** 10,13 **** --- 10,14 ---- import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; + import javax.mail.internet.MimeUtility; import com.webobjects.appserver.WOComponent; *************** *** 19,23 **** import er.extensions.ERXLogger; - /** * <code>ERMailUtils</code> contains various utility method related --- 20,23 ---- *************** *** 184,189 **** } /** ! * Private method that converts NSArray of String emails to * InternetAddress []. * @param addrs a <code>NSArray</code> value --- 184,201 ---- } + public static String encodeString (String string, String charset) { + String encodedString = null; + + try { + encodedString = MimeUtility.encodeText (string, charset, !charset.equals (ERMailDelivery.DefaultCharset) ? "B" : null); + } catch (Exception e) { + encodedString = string; + } + + return encodedString; + } + /** ! * Method that converts NSArray of String emails to * InternetAddress []. * @param addrs a <code>NSArray</code> value *************** *** 205,209 **** /** ! * Private method that converts NSArray of String emails to * InternetAddress []. * @param addressesArray an <code>InternetAddress[]</code> value --- 217,221 ---- /** ! * Method that converts NSArray of String emails to * InternetAddress []. * @param addressesArray an <code>InternetAddress[]</code> value *************** *** 217,221 **** for (int i = 0 ; i < addressesArray.length ; i++) { InternetAddress anAddress = (InternetAddress) addressesArray[i]; ! addresses.addObject (anAddress.toUnicodeString ()); } --- 229,234 ---- for (int i = 0 ; i < addressesArray.length ; i++) { InternetAddress anAddress = (InternetAddress) addressesArray[i]; ! String emailAddress = anAddress.toUnicodeString (); ! addresses.addObject (emailAddress); } Index: ERMessage.java =================================================================== RCS file: /cvsroot/wonder/Wonder/Common/Frameworks/ERJavaMail/Sources/er/javamail/ERMessage.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** ERMessage.java 18 Dec 2002 06:22:23 -0000 1.3 --- ERMessage.java 28 Jan 2003 08:28:39 -0000 1.4 *************** *** 15,26 **** private MimeMessage message; private Object anObject; ! ! public ERMessage() {}; ! ! public ERMessage(MimeMessage mimeMessage, Object callbackObject ) { ! super(); ! message = mimeMessage; ! anObject = callbackObject; ! } public void setMimeMessage (MimeMessage m) { --- 15,19 ---- private MimeMessage message; private Object anObject; ! public void setMimeMessage (MimeMessage m) { |