Author: bago Date: Sun May 7 09:04:42 2006 New Revision: 404787 URL: http://svn.apache.org/viewcvs?rev=404787&view=rev Log: Added one level of indirection (field=>getter) over the wrapped message. Now the wrapped message is kept inside the referencetracker (more clean, easier to read)
Modified: james/server/trunk/src/java/org/apache/james/core/MimeMessageCopyOnWriteProxy.java 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=404787&r1=404786&r2=404787&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 Sun May 7 09:04:42 2006 @@ -47,33 +47,23 @@ /** * Used internally to track the reference count + * It is important that this is static otherwise it will keep a reference to + * the parent object. */ - protected static class ReferenceCounter { + protected static class MessageReferenceTracker { /** * reference counter */ private int referenceCount = 1; - - /** - * @param original - * MimeMessageWrapper - * @throws MessagingException - */ - public ReferenceCounter() throws MessagingException { - this(0); - } - + /** - * @param original - * MimeMessage to wrap - * @param writable - * if true we can alter the message itself, otherwise copy on - * write it. - * @throws MessagingException + * The mime message in memory */ - public ReferenceCounter(int startCounter) throws MessagingException { - referenceCount = startCounter; + private MimeMessage wrapped = null; + + public MessageReferenceTracker(MimeMessage ref) { + wrapped = ref; } protected synchronized void incrementReferenceCount() { @@ -82,15 +72,23 @@ protected synchronized void decrementReferenceCount() { referenceCount--; + if (referenceCount<=0) { + ContainerUtil.dispose(wrapped); + wrapped = null; + } } protected synchronized int getReferenceCount() { return referenceCount; } + public MimeMessage getWrapped() { + return wrapped; + } + } - protected ReferenceCounter refCount; + protected MessageReferenceTracker refCount; /** * @param original @@ -124,14 +122,10 @@ throws MessagingException { super(Session.getDefaultInstance(System.getProperties(), null)); - this.wrapped = original; - - if (wrapped instanceof MimeMessageCopyOnWriteProxy) { - refCount = ((MimeMessageCopyOnWriteProxy) wrapped).refCount; - wrapped = ((MimeMessageCopyOnWriteProxy) wrapped).getWrappedMessage(); + if (original instanceof MimeMessageCopyOnWriteProxy) { + refCount = ((MimeMessageCopyOnWriteProxy) original).refCount; } else { - // Experimental: Seel JAMES-474 - refCount = new ReferenceCounter(1); + refCount = new MessageReferenceTracker(original); } if (!writeable) { @@ -141,31 +135,44 @@ /** * Check the number of references over the MimeMessage and clone it if - * needed. + * needed before returning the reference * * @throws MessagingException * exception */ - protected void checkCopyOnWrite() throws MessagingException { + protected MimeMessage getWrappedMessageForWriting() throws MessagingException { synchronized (refCount) { if (refCount.getReferenceCount() > 1) { refCount.decrementReferenceCount(); - refCount = new ReferenceCounter(1); - wrapped = new MimeMessageWrapper(wrapped); + refCount = new MessageReferenceTracker(new MimeMessageWrapper(refCount.getWrapped())); } } + return refCount.getWrapped(); + } + + /** + * @return + */ + public MimeMessage getWrappedMessage() { + return refCount.getWrapped(); } + /** - * The mime message in memory + * @see org.apache.avalon.framework.activity.Disposable#dispose() */ - protected MimeMessage wrapped = null; + public synchronized void dispose() { + if (refCount != null) { + refCount.decrementReferenceCount(); + refCount = null; + } + } /** * Rewritten for optimization purposes */ public void writeTo(OutputStream os) throws IOException, MessagingException { - wrapped.writeTo(os); + getWrappedMessage().writeTo(os); } /** @@ -173,7 +180,7 @@ */ public void writeTo(OutputStream os, String[] ignoreList) throws IOException, MessagingException { - wrapped.writeTo(os, ignoreList); + getWrappedMessage().writeTo(os, ignoreList); } /** @@ -184,7 +191,7 @@ * @see javax.mail.Message#getFrom() */ public Address[] getFrom() throws MessagingException { - return wrapped.getFrom(); + return getWrappedMessage().getFrom(); } /** @@ -192,154 +199,154 @@ */ public Address[] getRecipients(Message.RecipientType type) throws MessagingException { - return wrapped.getRecipients(type); + return getWrappedMessage().getRecipients(type); } /** * @see javax.mail.Message#getAllRecipients() */ public Address[] getAllRecipients() throws MessagingException { - return wrapped.getAllRecipients(); + return getWrappedMessage().getAllRecipients(); } /** * @see javax.mail.Message#getReplyTo() */ public Address[] getReplyTo() throws MessagingException { - return wrapped.getReplyTo(); + return getWrappedMessage().getReplyTo(); } /** * @see javax.mail.Message#getSubject() */ public String getSubject() throws MessagingException { - return wrapped.getSubject(); + return getWrappedMessage().getSubject(); } /** * @see javax.mail.Message#getSentDate() */ public Date getSentDate() throws MessagingException { - return wrapped.getSentDate(); + return getWrappedMessage().getSentDate(); } /** * @see javax.mail.Message#getReceivedDate() */ public Date getReceivedDate() throws MessagingException { - return wrapped.getReceivedDate(); + return getWrappedMessage().getReceivedDate(); } /** * @see javax.mail.Part#getSize() */ public int getSize() throws MessagingException { - return wrapped.getSize(); + return getWrappedMessage().getSize(); } /** * @see javax.mail.Part#getLineCount() */ public int getLineCount() throws MessagingException { - return wrapped.getLineCount(); + return getWrappedMessage().getLineCount(); } /** * @see javax.mail.Part#getContentType() */ public String getContentType() throws MessagingException { - return wrapped.getContentType(); + return getWrappedMessage().getContentType(); } /** * @see javax.mail.Part#isMimeType(java.lang.String) */ public boolean isMimeType(String mimeType) throws MessagingException { - return wrapped.isMimeType(mimeType); + return getWrappedMessage().isMimeType(mimeType); } /** * @see javax.mail.Part#getDisposition() */ public String getDisposition() throws MessagingException { - return wrapped.getDisposition(); + return getWrappedMessage().getDisposition(); } /** * @see javax.mail.internet.MimePart#getEncoding() */ public String getEncoding() throws MessagingException { - return wrapped.getEncoding(); + return getWrappedMessage().getEncoding(); } /** * @see javax.mail.internet.MimePart#getContentID() */ public String getContentID() throws MessagingException { - return wrapped.getContentID(); + return getWrappedMessage().getContentID(); } /** * @see javax.mail.internet.MimePart#getContentMD5() */ public String getContentMD5() throws MessagingException { - return wrapped.getContentMD5(); + return getWrappedMessage().getContentMD5(); } /** * @see javax.mail.Part#getDescription() */ public String getDescription() throws MessagingException { - return wrapped.getDescription(); + return getWrappedMessage().getDescription(); } /** * @see javax.mail.internet.MimePart#getContentLanguage() */ public String[] getContentLanguage() throws MessagingException { - return wrapped.getContentLanguage(); + return getWrappedMessage().getContentLanguage(); } /** * @see javax.mail.internet.MimeMessage#getMessageID() */ public String getMessageID() throws MessagingException { - return wrapped.getMessageID(); + return getWrappedMessage().getMessageID(); } /** * @see javax.mail.Part#getFileName() */ public String getFileName() throws MessagingException { - return wrapped.getFileName(); + return getWrappedMessage().getFileName(); } /** * @see javax.mail.Part#getInputStream() */ public InputStream getInputStream() throws IOException, MessagingException { - return wrapped.getInputStream(); + return getWrappedMessage().getInputStream(); } /** * @see javax.mail.Part#getDataHandler() */ public DataHandler getDataHandler() throws MessagingException { - return wrapped.getDataHandler(); + return getWrappedMessage().getDataHandler(); } /** * @see javax.mail.Part#getContent() */ public Object getContent() throws IOException, MessagingException { - return wrapped.getContent(); + return getWrappedMessage().getContent(); } /** * @see javax.mail.Part#getHeader(java.lang.String) */ public String[] getHeader(String name) throws MessagingException { - return wrapped.getHeader(name); + return getWrappedMessage().getHeader(name); } /** @@ -347,14 +354,14 @@ */ public String getHeader(String name, String delimiter) throws MessagingException { - return wrapped.getHeader(name, delimiter); + return getWrappedMessage().getHeader(name, delimiter); } /** * @see javax.mail.Part#getAllHeaders() */ public Enumeration getAllHeaders() throws MessagingException { - return wrapped.getAllHeaders(); + return getWrappedMessage().getAllHeaders(); } /** @@ -362,7 +369,7 @@ */ public Enumeration getMatchingHeaders(String[] names) throws MessagingException { - return wrapped.getMatchingHeaders(names); + return getWrappedMessage().getMatchingHeaders(names); } /** @@ -370,14 +377,14 @@ */ public Enumeration getNonMatchingHeaders(String[] names) throws MessagingException { - return wrapped.getNonMatchingHeaders(names); + return getWrappedMessage().getNonMatchingHeaders(names); } /** * @see javax.mail.internet.MimePart#getAllHeaderLines() */ public Enumeration getAllHeaderLines() throws MessagingException { - return wrapped.getAllHeaderLines(); + return getWrappedMessage().getAllHeaderLines(); } /** @@ -385,7 +392,7 @@ */ public Enumeration getMatchingHeaderLines(String[] names) throws MessagingException { - return wrapped.getMatchingHeaderLines(names); + return getWrappedMessage().getMatchingHeaderLines(names); } /** @@ -393,84 +400,84 @@ */ public Enumeration getNonMatchingHeaderLines(String[] names) throws MessagingException { - return wrapped.getNonMatchingHeaderLines(names); + return getWrappedMessage().getNonMatchingHeaderLines(names); } /** * @see javax.mail.Message#getFlags() */ public Flags getFlags() throws MessagingException { - return wrapped.getFlags(); + return getWrappedMessage().getFlags(); } /** * @see javax.mail.Message#isSet(javax.mail.Flags.Flag) */ public boolean isSet(Flags.Flag flag) throws MessagingException { - return wrapped.isSet(flag); + return getWrappedMessage().isSet(flag); } /** * @see javax.mail.internet.MimeMessage#getSender() */ public Address getSender() throws MessagingException { - return wrapped.getSender(); + return getWrappedMessage().getSender(); } /** * @see javax.mail.Message#match(javax.mail.search.SearchTerm) */ public boolean match(SearchTerm arg0) throws MessagingException { - return wrapped.match(arg0); + return getWrappedMessage().match(arg0); } /** * @see javax.mail.internet.MimeMessage#getRawInputStream() */ public InputStream getRawInputStream() throws MessagingException { - return wrapped.getRawInputStream(); + return getWrappedMessage().getRawInputStream(); } /** * @see javax.mail.Message#getFolder() */ public Folder getFolder() { - return wrapped.getFolder(); + return getWrappedMessage().getFolder(); } /** * @see javax.mail.Message#getMessageNumber() */ public int getMessageNumber() { - return wrapped.getMessageNumber(); + return getWrappedMessage().getMessageNumber(); } /** * @see javax.mail.Message#isExpunged() */ public boolean isExpunged() { - return wrapped.isExpunged(); + return getWrappedMessage().isExpunged(); } /** * @see java.lang.Object#equals(java.lang.Object) */ public boolean equals(Object arg0) { - return wrapped.equals(arg0); + return getWrappedMessage().equals(arg0); } /** * @see java.lang.Object#hashCode() */ public int hashCode() { - return wrapped.hashCode(); + return getWrappedMessage().hashCode(); } /** * @see java.lang.Object#toString() */ public String toString() { - return wrapped.toString(); + return getWrappedMessage().toString(); } /* @@ -481,24 +488,21 @@ * @see javax.mail.Message#setFrom(javax.mail.Address) */ public void setFrom(Address address) throws MessagingException { - checkCopyOnWrite(); - wrapped.setFrom(address); + getWrappedMessageForWriting().setFrom(address); } /** * @see javax.mail.Message#setFrom() */ public void setFrom() throws MessagingException { - checkCopyOnWrite(); - wrapped.setFrom(); + getWrappedMessageForWriting().setFrom(); } /** * @see javax.mail.Message#addFrom(javax.mail.Address[]) */ public void addFrom(Address[] addresses) throws MessagingException { - checkCopyOnWrite(); - wrapped.addFrom(addresses); + getWrappedMessageForWriting().addFrom(addresses); } /** @@ -506,8 +510,7 @@ */ public void setRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException { - checkCopyOnWrite(); - wrapped.setRecipients(type, addresses); + getWrappedMessageForWriting().setRecipients(type, addresses); } /** @@ -515,24 +518,21 @@ */ public void addRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException { - checkCopyOnWrite(); - wrapped.addRecipients(type, addresses); + getWrappedMessageForWriting().addRecipients(type, addresses); } /** * @see javax.mail.Message#setReplyTo(javax.mail.Address[]) */ public void setReplyTo(Address[] addresses) throws MessagingException { - checkCopyOnWrite(); - wrapped.setReplyTo(addresses); + getWrappedMessageForWriting().setReplyTo(addresses); } /** * @see javax.mail.Message#setSubject(java.lang.String) */ public void setSubject(String subject) throws MessagingException { - checkCopyOnWrite(); - wrapped.setSubject(subject); + getWrappedMessageForWriting().setSubject(subject); } /** @@ -540,48 +540,42 @@ */ public void setSubject(String subject, String charset) throws MessagingException { - checkCopyOnWrite(); - wrapped.setSubject(subject, charset); + getWrappedMessageForWriting().setSubject(subject, charset); } /** * @see javax.mail.Message#setSentDate(java.util.Date) */ public void setSentDate(Date d) throws MessagingException { - checkCopyOnWrite(); - wrapped.setSentDate(d); + getWrappedMessageForWriting().setSentDate(d); } /** * @see javax.mail.Part#setDisposition(java.lang.String) */ public void setDisposition(String disposition) throws MessagingException { - checkCopyOnWrite(); - wrapped.setDisposition(disposition); + getWrappedMessageForWriting().setDisposition(disposition); } /** * @see javax.mail.internet.MimeMessage#setContentID(java.lang.String) */ public void setContentID(String cid) throws MessagingException { - checkCopyOnWrite(); - wrapped.setContentID(cid); + getWrappedMessageForWriting().setContentID(cid); } /** * @see javax.mail.internet.MimePart#setContentMD5(java.lang.String) */ public void setContentMD5(String md5) throws MessagingException { - checkCopyOnWrite(); - wrapped.setContentMD5(md5); + getWrappedMessageForWriting().setContentMD5(md5); } /** * @see javax.mail.Part#setDescription(java.lang.String) */ public void setDescription(String description) throws MessagingException { - checkCopyOnWrite(); - wrapped.setDescription(description); + getWrappedMessageForWriting().setDescription(description); } /** @@ -589,8 +583,7 @@ */ public void setDescription(String description, String charset) throws MessagingException { - checkCopyOnWrite(); - wrapped.setDescription(description, charset); + getWrappedMessageForWriting().setDescription(description, charset); } /** @@ -598,109 +591,99 @@ */ public void setContentLanguage(String[] languages) throws MessagingException { - checkCopyOnWrite(); - wrapped.setContentLanguage(languages); + getWrappedMessageForWriting().setContentLanguage(languages); } /** * @see javax.mail.Part#setFileName(java.lang.String) */ public void setFileName(String filename) throws MessagingException { - checkCopyOnWrite(); - wrapped.setFileName(filename); + getWrappedMessageForWriting().setFileName(filename); } /** * @see javax.mail.Part#setDataHandler(javax.activation.DataHandler) */ public void setDataHandler(DataHandler dh) throws MessagingException { - checkCopyOnWrite(); - wrapped.setDataHandler(dh); + getWrappedMessageForWriting().setDataHandler(dh); } /** * @see javax.mail.Part#setContent(java.lang.Object, java.lang.String) */ public void setContent(Object o, String type) throws MessagingException { - checkCopyOnWrite(); - wrapped.setContent(o, type); + getWrappedMessageForWriting().setContent(o, type); } /** * @see javax.mail.Part#setText(java.lang.String) */ public void setText(String text) throws MessagingException { - checkCopyOnWrite(); - wrapped.setText(text); + getWrappedMessageForWriting().setText(text); } /** * @see javax.mail.internet.MimePart#setText(java.lang.String, java.lang.String) */ public void setText(String text, String charset) throws MessagingException { - checkCopyOnWrite(); - wrapped.setText(text, charset); + getWrappedMessageForWriting().setText(text, charset); } /** * @see javax.mail.Part#setContent(javax.mail.Multipart) */ public void setContent(Multipart mp) throws MessagingException { - checkCopyOnWrite(); - wrapped.setContent(mp); + getWrappedMessageForWriting().setContent(mp); } + /** + * This does not need a writable message + * @see javax.mail.Message#reply(boolean) + */ public Message reply(boolean replyToAll) throws MessagingException { - checkCopyOnWrite(); - return wrapped.reply(replyToAll); + return getWrappedMessage().reply(replyToAll); } /** * @see javax.mail.Part#setHeader(java.lang.String, java.lang.String) */ public void setHeader(String name, String value) throws MessagingException { - checkCopyOnWrite(); - wrapped.setHeader(name, value); + getWrappedMessageForWriting().setHeader(name, value); } /** * @see javax.mail.Part#addHeader(java.lang.String, java.lang.String) */ public void addHeader(String name, String value) throws MessagingException { - checkCopyOnWrite(); - wrapped.addHeader(name, value); + getWrappedMessageForWriting().addHeader(name, value); } /** * @see javax.mail.Part#removeHeader(java.lang.String) */ public void removeHeader(String name) throws MessagingException { - checkCopyOnWrite(); - wrapped.removeHeader(name); + getWrappedMessageForWriting().removeHeader(name); } /** * @see javax.mail.internet.MimePart#addHeaderLine(java.lang.String) */ public void addHeaderLine(String line) throws MessagingException { - checkCopyOnWrite(); - wrapped.addHeaderLine(line); + getWrappedMessageForWriting().addHeaderLine(line); } /** * @see javax.mail.Message#setFlags(javax.mail.Flags, boolean) */ public void setFlags(Flags flag, boolean set) throws MessagingException { - checkCopyOnWrite(); - wrapped.setFlags(flag, set); + getWrappedMessageForWriting().setFlags(flag, set); } /** * @see javax.mail.Message#saveChanges() */ public void saveChanges() throws MessagingException { - checkCopyOnWrite(); - wrapped.saveChanges(); + getWrappedMessageForWriting().saveChanges(); } /* @@ -712,8 +695,7 @@ */ public void addRecipients(Message.RecipientType type, String addresses) throws MessagingException { - checkCopyOnWrite(); - wrapped.addRecipients(type, addresses); + getWrappedMessageForWriting().addRecipients(type, addresses); } /** @@ -721,16 +703,14 @@ */ public void setRecipients(Message.RecipientType type, String addresses) throws MessagingException { - checkCopyOnWrite(); - wrapped.setRecipients(type, addresses); + getWrappedMessageForWriting().setRecipients(type, addresses); } /** * @see javax.mail.internet.MimeMessage#setSender(javax.mail.Address) */ public void setSender(Address arg0) throws MessagingException { - checkCopyOnWrite(); - wrapped.setSender(arg0); + getWrappedMessageForWriting().setSender(arg0); } /** @@ -738,29 +718,14 @@ */ public void addRecipient(RecipientType arg0, Address arg1) throws MessagingException { - checkCopyOnWrite(); - wrapped.addRecipient(arg0, arg1); + getWrappedMessageForWriting().addRecipient(arg0, arg1); } /** * @see javax.mail.Message#setFlag(javax.mail.Flags.Flag, boolean) */ public void setFlag(Flag arg0, boolean arg1) throws MessagingException { - checkCopyOnWrite(); - wrapped.setFlag(arg0, arg1); - } - - /** - * @see org.apache.avalon.framework.activity.Disposable#dispose() - */ - public synchronized void dispose() { - if (wrapped != null) { - refCount.decrementReferenceCount(); - if (refCount.getReferenceCount()<=0) { - ContainerUtil.dispose(wrapped); - } - wrapped = null; - } + getWrappedMessageForWriting().setFlag(arg0, arg1); } /** @@ -776,14 +741,7 @@ * @throws MessagingException */ public long getMessageSize() throws MessagingException { - return MimeMessageUtil.getMessageSize(wrapped); - } - - /** - * @return - */ - public MimeMessage getWrappedMessage() { - return wrapped; + return MimeMessageUtil.getMessageSize(getWrappedMessage()); } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]