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]