Author: bago Date: Thu Apr 27 02:49:37 2006 New Revision: 397496 URL: http://svn.apache.org/viewcvs?rev=397496&view=rev Log: Moved messagesize calculator to MimeMessageUtil, fixed message size in MimeMessageWrapper (maybe fix JAMES-466)
Modified: james/server/trunk/src/java/org/apache/james/core/MailImpl.java james/server/trunk/src/java/org/apache/james/core/MimeMessageCopyOnWriteProxy.java james/server/trunk/src/java/org/apache/james/core/MimeMessageUtil.java james/server/trunk/src/java/org/apache/james/core/MimeMessageWrapper.java Modified: james/server/trunk/src/java/org/apache/james/core/MailImpl.java URL: http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/core/MailImpl.java?rev=397496&r1=397495&r2=397496&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 Thu Apr 27 02:49:37 2006 @@ -41,7 +41,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Date; -import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; @@ -60,30 +59,6 @@ public class MailImpl implements Disposable, Mail { /** - * Slow method to calculate the exact size of a message! - */ - private static final class SizeCalculatorOutputStream extends OutputStream { - long size = 0; - - public void write(int arg0) throws IOException { - size++; - } - - public long getSize() { - return size; - } - - public void write(byte[] arg0, int arg1, int arg2) throws IOException { - size += arg2; - } - - public void write(byte[] arg0) throws IOException { - size += arg0.length; - } - } - - - /** * We hardcode the serialVersionUID so that from James 1.2 on, * MailImpl will be deserializable (so your mail doesn't get lost) */ @@ -392,53 +367,7 @@ * @throws MessagingException if a problem occurs while computing the message size */ public long getMessageSize() throws MessagingException { - return getMessageSize(message); - } - - /** - * @return size of full message including headers - * - * @throws MessagingException if a problem occours while computing the message size - */ - public static long getMessageSize(MimeMessage message) throws MessagingException { - //If we have a MimeMessageWrapper, then we can ask it for just the - // message size and skip calculating it - long size = -1; - - if (message instanceof MimeMessageWrapper) { - MimeMessageWrapper wrapper = (MimeMessageWrapper) message; - size = wrapper.getMessageSize(); - } else if (message instanceof MimeMessageCopyOnWriteProxy) { - MimeMessageCopyOnWriteProxy wrapper = (MimeMessageCopyOnWriteProxy) message; - size = wrapper.getMessageSize(); - } else { - //SK: Should probably eventually store this as a locally - // maintained value (so we don't have to load and reparse - // messages each time). - size = message.getSize(); - if (size != -1) { - Enumeration e = message.getAllHeaderLines(); - if (e.hasMoreElements()) { - size += 2; - } - while (e.hasMoreElements()) { - // add 2 bytes for the CRLF - size += ((String) e.nextElement()).length()+2; - } - } - } - - if (size == -1) { - SizeCalculatorOutputStream out = new SizeCalculatorOutputStream(); - try { - message.writeTo(out); - } catch (IOException e) { - // should never happen as SizeCalculator does not actually throw IOExceptions. - throw new MessagingException("IOException wrapped by getMessageSize",e); - } - size = out.getSize(); - } - return size; + return MimeMessageUtil.getMessageSize(message); } /** Modified: james/server/trunk/src/java/org/apache/james/core/MimeMessageCopyOnWriteProxy.java URL: http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/core/MimeMessageCopyOnWriteProxy.java?rev=397496&r1=397495&r2=397496&view=diff ============================================================================== --- james/server/trunk/src/java/org/apache/james/core/MimeMessageCopyOnWriteProxy.java (original) +++ james/server/trunk/src/java/org/apache/james/core/MimeMessageCopyOnWriteProxy.java Thu Apr 27 02:49:37 2006 @@ -778,8 +778,7 @@ if (wrapped instanceof MimeMessageWrapper) { return ((MimeMessageWrapper) wrapped).getMessageSize(); } else { - // this is already handled by MailImpl. - return -1; + return MimeMessageUtil.getMessageSize(this); } } Modified: james/server/trunk/src/java/org/apache/james/core/MimeMessageUtil.java URL: http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/core/MimeMessageUtil.java?rev=397496&r1=397495&r2=397496&view=diff ============================================================================== --- james/server/trunk/src/java/org/apache/james/core/MimeMessageUtil.java (original) +++ james/server/trunk/src/java/org/apache/james/core/MimeMessageUtil.java Thu Apr 27 02:49:37 2006 @@ -189,4 +189,74 @@ } + /** + * Slow method to calculate the exact size of a message! + */ + private static final class SizeCalculatorOutputStream extends OutputStream { + long size = 0; + + public void write(int arg0) throws IOException { + size++; + } + + public long getSize() { + return size; + } + + public void write(byte[] arg0, int arg1, int arg2) throws IOException { + size += arg2; + } + + public void write(byte[] arg0) throws IOException { + size += arg0.length; + } + } + + /** + * @return size of full message including headers + * + * @throws MessagingException if a problem occours while computing the message size + */ + public static long getMessageSize(MimeMessage message) throws MessagingException { + //If we have a MimeMessageWrapper, then we can ask it for just the + // message size and skip calculating it + long size = -1; + + if (message instanceof MimeMessageWrapper) { + MimeMessageWrapper wrapper = (MimeMessageWrapper) message; + size = wrapper.getMessageSize(); + } else if (message instanceof MimeMessageCopyOnWriteProxy) { + MimeMessageCopyOnWriteProxy wrapper = (MimeMessageCopyOnWriteProxy) message; + size = wrapper.getMessageSize(); + } else { + //SK: Should probably eventually store this as a locally + // maintained value (so we don't have to load and reparse + // messages each time). + size = message.getSize(); + if (size != -1) { + Enumeration e = message.getAllHeaderLines(); + if (e.hasMoreElements()) { + size += 2; + } + while (e.hasMoreElements()) { + // add 2 bytes for the CRLF + size += ((String) e.nextElement()).length()+2; + } + } + } + + if (size == -1) { + SizeCalculatorOutputStream out = new SizeCalculatorOutputStream(); + try { + message.writeTo(out); + } catch (IOException e) { + // should never happen as SizeCalculator does not actually throw IOExceptions. + throw new MessagingException("IOException wrapped by getMessageSize",e); + } + size = out.getSize(); + } + return size; + } + + } Modified: james/server/trunk/src/java/org/apache/james/core/MimeMessageWrapper.java URL: http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/core/MimeMessageWrapper.java?rev=397496&r1=397495&r2=397496&view=diff ============================================================================== --- james/server/trunk/src/java/org/apache/james/core/MimeMessageWrapper.java (original) +++ james/server/trunk/src/java/org/apache/james/core/MimeMessageWrapper.java Thu Apr 27 02:49:37 2006 @@ -319,18 +319,19 @@ } /** - * Returns size of message, ie headers and content. Current implementation - * actually returns number of characters in headers plus number of bytes - * in the internal content byte array. + * Returns size of message, ie headers and content */ public long getMessageSize() throws MessagingException { - try { - return source.getMessageSize(); - } catch (IOException ioe) { - throw new MessagingException("Error retrieving message size", ioe); + if (!isModified()) { + try { + return source.getMessageSize(); + } catch (IOException ioe) { + throw new MessagingException("Error retrieving message size", ioe); + } + } else { + return MimeMessageUtil.getMessageSize(this); } } - /** * We override all the "headers" access methods to be sure that we --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]