Author: rdonkin
Date: Sat Jun 6 06:38:15 2009
New Revision: 782193
URL: http://svn.apache.org/viewvc?rev=782193&view=rev
Log:
IMAP-98 Switch from old concurrent utils to Java 1.5.
https://issues.apache.org/jira/browse/IMAP-98
Added:
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/LockException.java
(with props)
Removed:
james/imap/trunk/stage/concurrent/
Modified:
james/imap/trunk/build-tools/common-build.xml
james/imap/trunk/include.properties
james/imap/trunk/mailbox/pom.xml
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/MailboxException.java
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/StorageException.java
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/SubscriptionException.java
james/imap/trunk/parent/pom.xml
james/imap/trunk/seda/pom.xml
james/imap/trunk/torque/pom.xml
james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java
james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManager.java
Modified: james/imap/trunk/build-tools/common-build.xml
URL:
http://svn.apache.org/viewvc/james/imap/trunk/build-tools/common-build.xml?rev=782193&r1=782192&r2=782193&view=diff
==============================================================================
--- james/imap/trunk/build-tools/common-build.xml (original)
+++ james/imap/trunk/build-tools/common-build.xml Sat Jun 6 06:38:15 2009
@@ -179,7 +179,6 @@
<include name="${javax-activation.jar}"/>
<include name="${commons-logging.jar}"/>
<include name="${commons-lang.jar}"/>
- <include name="${concurrent.jar}"/>
<include name="${mime4j.jar}"/>
<include name="${log4j.jar}"/>
</fileset>
Modified: james/imap/trunk/include.properties
URL:
http://svn.apache.org/viewvc/james/imap/trunk/include.properties?rev=782193&r1=782192&r2=782193&view=diff
==============================================================================
--- james/imap/trunk/include.properties (original)
+++ james/imap/trunk/include.properties Sat Jun 6 06:38:15 2009
@@ -57,7 +57,6 @@
path.lib.commonsio=commons-io/jars
path.lib.derby=org.apache.derby/jars
path.lib.torque=org.apache.torque/jars
-path.lib.concurrent=concurrent/jars
path.lib.commonslogging=commons-logging/jars
path.lib.village=org.apache.torque/jars
path.lib.commonsconfiguration=commons-configuration/jars
@@ -109,9 +108,6 @@
jarname.commons-collections.jar=commons-collections-3.1.jar
commons-collections.jar=${path.lib.commonscollections}/${jarname.commons-collections.jar}
-jarname.concurrent.jar=concurrent-1.3.4.jar
-concurrent.jar=${path.lib.concurrent}/${jarname.concurrent.jar}
-
jarname.derby.jar=derby-10.2.2.0.jar
derby.jar=${path.lib.derby}/${jarname.derby.jar}
Modified: james/imap/trunk/mailbox/pom.xml
URL:
http://svn.apache.org/viewvc/james/imap/trunk/mailbox/pom.xml?rev=782193&r1=782192&r2=782193&view=diff
==============================================================================
--- james/imap/trunk/mailbox/pom.xml (original)
+++ james/imap/trunk/mailbox/pom.xml Sat Jun 6 06:38:15 2009
@@ -38,13 +38,7 @@
<groupId>org.apache.james</groupId>
<artifactId>apache-james-imap-api</artifactId>
</dependency>
-
- <dependency>
- <groupId>concurrent</groupId>
- <artifactId>concurrent</artifactId>
- <!-- <scope>runtime</scope> -->
- </dependency>
-
+
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
Added:
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/LockException.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/LockException.java?rev=782193&view=auto
==============================================================================
---
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/LockException.java
(added)
+++
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/LockException.java
Sat Jun 6 06:38:15 2009
@@ -0,0 +1,55 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.imap.mailbox;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+
+import org.apache.james.imap.api.display.HumanReadableText;
+
+/**
+ * Indicates that required locks cannot be acquired at this time.
+ */
+public class LockException extends MailboxException {
+
+ private static final long serialVersionUID = 698379731076300030L;
+
+ public LockException(HumanReadableText key, String message) {
+ super(key, message);
+ }
+
+ public LockException(HumanReadableText key) {
+ super(key);}
+
+ public LockException(HumanReadableText key, Exception cause) {
+ super(key, cause);
+ }
+
+ public static void tryLock(final Lock lock, final int timeoutInSeconds)
throws LockException {
+ try {
+ if (!lock.tryLock(timeoutInSeconds, TimeUnit.SECONDS)) {
+ throw new LockException(HumanReadableText.LOCK_FAILED);
+ }
+ } catch (InterruptedException e) {
+ throw new LockException(HumanReadableText.LOCK_FAILED, e);
+ }
+ }
+
+}
Propchange:
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/LockException.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified:
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/MailboxException.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/MailboxException.java?rev=782193&r1=782192&r2=782193&view=diff
==============================================================================
---
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/MailboxException.java
(original)
+++
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/MailboxException.java
Sat Jun 6 06:38:15 2009
@@ -40,9 +40,8 @@
this.key = key;
}
- public MailboxException(final HumanReadableText key, Throwable cause) {
- super(key.getDefaultValue());
- initCause(cause);
+ public MailboxException(final HumanReadableText key, Exception cause) {
+ super(key.getDefaultValue(), cause);
this.key = key;
}
Modified:
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/StorageException.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/StorageException.java?rev=782193&r1=782192&r2=782193&view=diff
==============================================================================
---
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/StorageException.java
(original)
+++
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/StorageException.java
Sat Jun 6 06:38:15 2009
@@ -28,7 +28,7 @@
private static final long serialVersionUID = 2708951014093934093L;
- public StorageException(HumanReadableText key, Throwable cause) {
+ public StorageException(HumanReadableText key, Exception cause) {
super(key, cause);
}
}
Modified:
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/SubscriptionException.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/SubscriptionException.java?rev=782193&r1=782192&r2=782193&view=diff
==============================================================================
---
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/SubscriptionException.java
(original)
+++
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/SubscriptionException.java
Sat Jun 6 06:38:15 2009
@@ -32,7 +32,7 @@
super(key);
}
- public SubscriptionException(final HumanReadableText key, Throwable cause)
{
+ public SubscriptionException(final HumanReadableText key, Exception cause)
{
super(key, cause);
}
}
Modified: james/imap/trunk/parent/pom.xml
URL:
http://svn.apache.org/viewvc/james/imap/trunk/parent/pom.xml?rev=782193&r1=782192&r2=782193&view=diff
==============================================================================
--- james/imap/trunk/parent/pom.xml (original)
+++ james/imap/trunk/parent/pom.xml Sat Jun 6 06:38:15 2009
@@ -424,14 +424,8 @@
</dependency>
<!--
END Commons
- -->
-
- <dependency>
- <groupId>concurrent</groupId>
- <artifactId>concurrent</artifactId>
- <version>1.3.4</version>
- </dependency>
-
+ -->
+
<!--
START Testing
-->
Modified: james/imap/trunk/seda/pom.xml
URL:
http://svn.apache.org/viewvc/james/imap/trunk/seda/pom.xml?rev=782193&r1=782192&r2=782193&view=diff
==============================================================================
--- james/imap/trunk/seda/pom.xml (original)
+++ james/imap/trunk/seda/pom.xml Sat Jun 6 06:38:15 2009
@@ -41,10 +41,7 @@
<groupId>org.apache.james</groupId>
<artifactId>apache-james-imap-decode</artifactId>
</dependency>
- <dependency>
- <groupId>concurrent</groupId>
- <artifactId>concurrent</artifactId>
- </dependency>
+
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
Modified: james/imap/trunk/torque/pom.xml
URL:
http://svn.apache.org/viewvc/james/imap/trunk/torque/pom.xml?rev=782193&r1=782192&r2=782193&view=diff
==============================================================================
--- james/imap/trunk/torque/pom.xml (original)
+++ james/imap/trunk/torque/pom.xml Sat Jun 6 06:38:15 2009
@@ -64,10 +64,7 @@
<groupId>org.apache.torque</groupId>
<artifactId>village</artifactId>
</dependency>
- <dependency>
- <groupId>concurrent</groupId>
- <artifactId>concurrent</artifactId>
- </dependency>
+
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
Modified:
james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java?rev=782193&r1=782192&r2=782193&view=diff
==============================================================================
---
james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java
(original)
+++
james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java
Sat Jun 6 06:38:15 2009
@@ -36,12 +36,14 @@
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.TreeSet;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
import javax.mail.Flags;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.apache.james.imap.api.display.HumanReadableText;
+import org.apache.james.imap.mailbox.LockException;
import org.apache.james.imap.mailbox.Mailbox;
import org.apache.james.imap.mailbox.MailboxException;
import org.apache.james.imap.mailbox.MailboxListener;
@@ -69,23 +71,23 @@
import org.apache.torque.TorqueException;
import org.apache.torque.util.Criteria;
-import EDU.oswego.cs.dl.util.concurrent.ReadWriteLock;
-
import com.workingdogs.village.DataSetException;
public class TorqueMailbox implements Mailbox {
+ private static final int LOCK_TIMEOUT = 10;
+
private boolean open = true;
private MailboxRow mailboxRow;
private final UidChangeTracker tracker;
- private final ReadWriteLock lock;
+ private final ReentrantReadWriteLock lock;
private final MessageSearches searches;
- TorqueMailbox(final MailboxRow mailboxRow, final ReadWriteLock lock) {
+ TorqueMailbox(final MailboxRow mailboxRow, final ReentrantReadWriteLock
lock) {
this.searches = new MessageSearches();
this.mailboxRow = mailboxRow;
this.tracker = new UidChangeTracker(mailboxRow.getLastUid());
@@ -98,27 +100,33 @@
}
public int getMessageCount(MailboxSession mailboxSession)
- throws MailboxException {
+ throws MailboxException {
+ lockForReading();
try {
- lock.readLock().acquire();
+ checkAccess();
try {
- checkAccess();
- try {
- return getMailboxRow().countMessages();
- } catch (Exception e) {
- throw new MailboxException(HumanReadableText.COUNT_FAILED,
e);
- }
- } finally {
- lock.readLock().release();
+ return getMailboxRow().countMessages();
+ } catch (Exception e) {
+ throw new MailboxException(HumanReadableText.COUNT_FAILED, e);
}
- } catch (InterruptedException e) {
- throw new MailboxException(HumanReadableText.LOCK_FAILED, e);
+ } finally {
+ unlockAfterReading();
}
}
+ private void lockForWriting() throws LockException {
+ if (!lock.isWriteLockedByCurrentThread()) {
+ LockException.tryLock(this.lock.writeLock(), LOCK_TIMEOUT);
+ }
+ }
+
+ private void lockForReading() throws LockException {
+ LockException.tryLock(lock.readLock(), LOCK_TIMEOUT);
+ }
+
public long appendMessage(byte[] message, Date internalDate,
MailboxSession mailboxSession, boolean isRecent, Flags flags)
- throws MailboxException {
+ throws MailboxException {
try {
checkAccess();
@@ -178,20 +186,20 @@
}
private void populateFlags(MimeMessage message, MessageRow messageRow)
- throws MessagingException, TorqueException {
+ throws MessagingException, TorqueException {
final Flags flags = message.getFlags();
buildFlags(messageRow, flags);
}
private void buildFlags(MessageRow messageRow, final Flags flags)
- throws TorqueException {
+ throws TorqueException {
MessageFlags messageFlags = new MessageFlags();
messageFlags.setFlags(flags);
messageRow.addMessageFlags(messageFlags);
}
private MessageBody populateBody(MimeMessage message) throws IOException,
- MessagingException {
+ MessagingException {
MessageBody mb = new MessageBody();
InputStream is = message.getInputStream();
@@ -202,11 +210,11 @@
}
private void addHeaders(MimeMessage message, MessageRow messageRow)
- throws MessagingException, TorqueException {
+ throws MessagingException, TorqueException {
int line_number = 0;
for (Enumeration lines = message.getAllHeaderLines(); lines
- .hasMoreElements();) {
+ .hasMoreElements();) {
String line = (String) lines.nextElement();
int colon = line.indexOf(": ");
if (colon > 0) {
@@ -222,7 +230,7 @@
}
private int size(MimeMessage message) throws IOException,
- MessagingException {
+ MessagingException {
// TODO very ugly size mesurement
ByteArrayOutputStream sizeBos = new ByteArrayOutputStream();
message.writeTo(new CRLFOutputStream(sizeBos));
@@ -230,34 +238,39 @@
return size;
}
- private void save(MessageRow messageRow) throws TorqueException,
- InterruptedException {
+ private void save(MessageRow messageRow) throws TorqueException,
LockException {
try {
- lock.writeLock().acquire();
+ lockForWriting();
messageRow.save();
} finally {
- lock.writeLock().release();
+ unlockAfterWriting();
}
}
private MailboxRow reserveNextUid() throws InterruptedException,
- MailboxException {
+ MailboxException {
final MailboxRow myMailboxRow;
try {
- lock.writeLock().acquire();
+ lockForWriting();
myMailboxRow = getMailboxRow().consumeNextUid();
} catch (TorqueException e) {
throw new MailboxException(HumanReadableText.COMSUME_UID_FAILED,
e);
} catch (SQLException e) {
throw new MailboxException(HumanReadableText.COMSUME_UID_FAILED,
e);
} finally {
- lock.writeLock().release();
+ unlockAfterWriting();
}
return myMailboxRow;
}
+ private void unlockAfterWriting() {
+ if (lock.isWriteLockedByCurrentThread()) {
+ lock.writeLock().unlock();
+ }
+ }
+
private Criteria criteriaForMessageSet(MessageRange set)
- throws MailboxException {
+ throws MailboxException {
Criteria criteria = new Criteria();
criteria.addAscendingOrderByColumn(MessageRowPeer.UID);
switch (set.getType()) {
@@ -286,26 +299,22 @@
public Iterator getMessages(final MessageRange set, FetchGroup fetchGroup,
MailboxSession mailboxSession) throws MailboxException {
+ lockForReading();
try {
- lock.readLock().acquire();
+ checkAccess();
+ UidRange range = uidRangeForMessageSet(set);
try {
- checkAccess();
- UidRange range = uidRangeForMessageSet(set);
- try {
- Criteria c = criteriaForMessageSet(set);
- c.add(MessageFlagsPeer.MAILBOX_ID, getMailboxRow()
- .getMailboxId());
- return getMessages(fetchGroup, range, c);
- } catch (TorqueException e) {
- throw new
MailboxException(HumanReadableText.SEARCH_FAILED, e);
- } catch (MessagingException e) {
- throw new
MailboxException(HumanReadableText.FAILURE_MAIL_PARSE, e);
- }
- } finally {
- lock.readLock().release();
+ Criteria c = criteriaForMessageSet(set);
+ c.add(MessageFlagsPeer.MAILBOX_ID, getMailboxRow()
+ .getMailboxId());
+ return getMessages(fetchGroup, range, c);
+ } catch (TorqueException e) {
+ throw new MailboxException(HumanReadableText.SEARCH_FAILED, e);
+ } catch (MessagingException e) {
+ throw new
MailboxException(HumanReadableText.FAILURE_MAIL_PARSE, e);
}
- } catch (InterruptedException e) {
- throw new MailboxException(HumanReadableText.LOCK_FAILED, e);
+ } finally {
+ unlockAfterReading();
}
}
@@ -324,7 +333,7 @@
}
private TorqueResultIterator getResults(FetchGroup result, List rows)
- throws TorqueException {
+ throws TorqueException {
Collections.sort(rows, MessageRowUtils.getUidComparator());
final TorqueResultIterator results = new TorqueResultIterator(rows,
result);
@@ -332,7 +341,7 @@
}
private static UidRange uidRangeForMessageSet(MessageRange set)
- throws MailboxException {
+ throws MailboxException {
if (set.getType().equals(MessageRange.Type.ALL)) {
return new UidRange(1, -1);
} else {
@@ -357,34 +366,29 @@
}
public long[] recent(boolean reset, MailboxSession mailboxSession)
- throws MailboxException {
+ throws MailboxException {
+ lockForReading();
try {
- lock.readLock().acquire();
- try {
- checkAccess();
- final Criteria criterion = queryRecentFlagSet();
- final List messageRows = getMailboxRow().getMessageRows(
- criterion);
- final long[] results = new long[messageRows.size()];
- int count = 0;
- for (Iterator it = messageRows.iterator(); it.hasNext();) {
- final MessageRow row = (MessageRow) it.next();
- results[count++] = row.getUid();
- }
+ checkAccess();
+ final Criteria criterion = queryRecentFlagSet();
+ final List messageRows = getMailboxRow().getMessageRows(
+ criterion);
+ final long[] results = new long[messageRows.size()];
+ int count = 0;
+ for (Iterator it = messageRows.iterator(); it.hasNext();) {
+ final MessageRow row = (MessageRow) it.next();
+ results[count++] = row.getUid();
+ }
- if (reset) {
- getMailboxRow().resetRecent();
- }
- return results;
- } catch (TorqueException e) {
- throw new MailboxException(HumanReadableText.SEARCH_FAILED, e);
- } finally {
- lock.readLock().release();
+ if (reset) {
+ getMailboxRow().resetRecent();
}
- } catch (InterruptedException e) {
- throw new MailboxException(HumanReadableText.LOCK_FAILED, e);
+ return results;
+ } catch (TorqueException e) {
+ throw new MailboxException(HumanReadableText.SEARCH_FAILED, e);
+ } finally {
+ unlockAfterReading();
}
-
}
private Criteria queryRecentFlagSet() {
@@ -399,89 +403,76 @@
}
public Long getFirstUnseen(MailboxSession mailboxSession) throws
MailboxException {
+ lockForReading();
try {
- lock.readLock().acquire();
- try {
- checkAccess();
- Criteria c = new Criteria();
- c.addAscendingOrderByColumn(MessageRowPeer.UID);
- c.setLimit(1);
- c.setSingleRecord(true);
-
- c.addJoin(MessageFlagsPeer.MAILBOX_ID,
- MessageRowPeer.MAILBOX_ID);
- c.addJoin(MessageRowPeer.UID, MessageFlagsPeer.UID);
+ checkAccess();
+ Criteria c = new Criteria();
+ c.addAscendingOrderByColumn(MessageRowPeer.UID);
+ c.setLimit(1);
+ c.setSingleRecord(true);
- MessageFlagsPeer.addFlagsToCriteria(new Flags(Flags.Flag.SEEN),
- false, c);
+ c.addJoin(MessageFlagsPeer.MAILBOX_ID,
+ MessageRowPeer.MAILBOX_ID);
+ c.addJoin(MessageRowPeer.UID, MessageFlagsPeer.UID);
- try {
- List messageRows = getMailboxRow().getMessageRows(c);
- if (messageRows.size() > 0) {
- MessageResult messageResult = fillMessageResult(
- (MessageRow) messageRows.get(0),
FetchGroupImpl.MINIMAL);
- if (messageResult != null) {
-
getUidChangeTracker().found(messageResult.getUid(), messageResult.getFlags());
- }
+ MessageFlagsPeer.addFlagsToCriteria(new Flags(Flags.Flag.SEEN),
+ false, c);
- return messageResult.getUid();
- } else {
- return null;
+ try {
+ List messageRows = getMailboxRow().getMessageRows(c);
+ if (messageRows.size() > 0) {
+ MessageResult messageResult = fillMessageResult(
+ (MessageRow) messageRows.get(0),
FetchGroupImpl.MINIMAL);
+ if (messageResult != null) {
+ getUidChangeTracker().found(messageResult.getUid(),
messageResult.getFlags());
}
- } catch (TorqueException e) {
- throw new
MailboxException(HumanReadableText.SEARCH_FAILED, e);
- } catch (MessagingException e) {
- throw new
MailboxException(HumanReadableText.FAILURE_MAIL_PARSE, e);
- } catch (MimeException e) {
- throw new
MailboxException(HumanReadableText.FAILURE_MAIL_PARSE, e);
+
+ return messageResult.getUid();
+ } else {
+ return null;
}
- } finally {
- lock.readLock().release();
+ } catch (TorqueException e) {
+ throw new MailboxException(HumanReadableText.SEARCH_FAILED, e);
+ } catch (MessagingException e) {
+ throw new
MailboxException(HumanReadableText.FAILURE_MAIL_PARSE, e);
+ } catch (MimeException e) {
+ throw new
MailboxException(HumanReadableText.FAILURE_MAIL_PARSE, e);
}
- } catch (InterruptedException e) {
- throw new MailboxException(HumanReadableText.LOCK_FAILED, e);
+ } finally {
+ unlockAfterReading();
}
}
public int getUnseenCount(MailboxSession mailboxSession)
- throws MailboxException {
+ throws MailboxException {
+ lockForReading();
try {
- lock.readLock().acquire();
+ checkAccess();
try {
- checkAccess();
- try {
- final int count = getMailboxRow().countMessages(
- new Flags(Flags.Flag.SEEN), false);
- return count;
- } catch (TorqueException e) {
- throw new MailboxException(HumanReadableText.COUNT_FAILED,
e);
- } catch (DataSetException e) {
- throw new MailboxException(HumanReadableText.COUNT_FAILED,
e);
- }
- } finally {
- lock.readLock().release();
+ final int count = getMailboxRow().countMessages(
+ new Flags(Flags.Flag.SEEN), false);
+ return count;
+ } catch (TorqueException e) {
+ throw new MailboxException(HumanReadableText.COUNT_FAILED, e);
+ } catch (DataSetException e) {
+ throw new MailboxException(HumanReadableText.COUNT_FAILED, e);
}
- } catch (InterruptedException e) {
- throw new MailboxException(HumanReadableText.LOCK_FAILED, e);
+ } finally {
+ unlockAfterReading();
}
}
public Iterator<Long> expunge(MessageRange set, MailboxSession
mailboxSession) throws MailboxException {
+ lockForWriting();
try {
- lock.writeLock().acquire();
- try {
- return doExpunge(set);
- } finally {
- lock.writeLock().release();
- }
-
- } catch (InterruptedException e) {
- throw new MailboxException(HumanReadableText.LOCK_FAILED, e);
+ return doExpunge(set);
+ } finally {
+ unlockAfterWriting();
}
}
private Iterator<Long> doExpunge(final MessageRange set)
- throws MailboxException {
+ throws MailboxException {
checkAccess();
try {
// TODO put this into a serializable transaction
@@ -499,8 +490,8 @@
uids.add(messageRow.getUid());
Criteria todelc = new Criteria();
todelc
- .add(MessageRowPeer.MAILBOX_ID, messageRow
- .getMailboxId());
+ .add(MessageRowPeer.MAILBOX_ID, messageRow
+ .getMailboxId());
todelc.add(MessageRowPeer.UID, messageRow.getUid());
MessageRowPeer.doDelete(todelc);
}
@@ -513,16 +504,11 @@
public Map<Long, Flags> setFlags(Flags flags, boolean value, boolean
replace,
MessageRange set, MailboxSession mailboxSession) throws
MailboxException {
+ lockForWriting();
try {
- lock.writeLock().acquire();
- try {
- return doSetFlags(flags, value, replace, set, mailboxSession);
- } finally {
- lock.writeLock().release();
- }
-
- } catch (InterruptedException e) {
- throw new MailboxException(HumanReadableText.LOCK_FAILED, e);
+ return doSetFlags(flags, value, replace, set, mailboxSession);
+ } finally {
+ unlockAfterWriting();
}
}
@@ -562,58 +548,47 @@
}
public void addListener(MailboxListener listener)
- throws MailboxException {
+ throws MailboxException {
checkAccess();
tracker.addMailboxListener(listener);
}
public long getUidValidity(MailboxSession mailboxSession)
- throws MailboxException {
+ throws MailboxException {
+ lockForReading();
try {
- lock.readLock().acquire();
- try {
- checkAccess();
- final long result = getMailboxRow().getUidValidity();
- return result;
- } finally {
- lock.readLock().release();
- }
-
- } catch (InterruptedException e) {
- throw new MailboxException(HumanReadableText.LOCK_FAILED, e);
+ checkAccess();
+ final long result = getMailboxRow().getUidValidity();
+ return result;
+ } finally {
+ unlockAfterReading();
}
-
}
public long getUidNext(MailboxSession mailboxSession)
- throws MailboxException {
+ throws MailboxException {
+ lockForReading();
try {
- lock.readLock().acquire();
+ checkAccess();
try {
- checkAccess();
- try {
- MailboxRow myMailboxRow = MailboxRowPeer
- .retrieveByPK(mailboxRow.getPrimaryKey());
- if (myMailboxRow != null) {
- mailboxRow = myMailboxRow;
- final long lastUid = mailboxRow.getLastUid();
- return lastUid + 1;
- } else {
- throw new
MailboxException(HumanReadableText.MAILBOX_DELETED);
- }
- } catch (NoRowsException e) {
- throw new
MailboxException(HumanReadableText.COMSUME_UID_FAILED, e);
- } catch (TooManyRowsException e) {
- throw new
MailboxException(HumanReadableText.COMSUME_UID_FAILED, e);
- } catch (TorqueException e) {
- throw new
MailboxException(HumanReadableText.COMSUME_UID_FAILED, e);
- }
- } finally {
- lock.readLock().release();
+ MailboxRow myMailboxRow = MailboxRowPeer
+ .retrieveByPK(mailboxRow.getPrimaryKey());
+ if (myMailboxRow != null) {
+ mailboxRow = myMailboxRow;
+ final long lastUid = mailboxRow.getLastUid();
+ return lastUid + 1;
+ } else {
+ throw new
MailboxException(HumanReadableText.MAILBOX_DELETED);
+ }
+ } catch (NoRowsException e) {
+ throw new
MailboxException(HumanReadableText.COMSUME_UID_FAILED, e);
+ } catch (TooManyRowsException e) {
+ throw new
MailboxException(HumanReadableText.COMSUME_UID_FAILED, e);
+ } catch (TorqueException e) {
+ throw new
MailboxException(HumanReadableText.COMSUME_UID_FAILED, e);
}
-
- } catch (InterruptedException e) {
- throw new MailboxException(HumanReadableText.LOCK_FAILED, e);
+ } finally {
+ unlockAfterReading();
}
}
@@ -636,41 +611,37 @@
}
public Iterator<Long> search(SearchQuery query, MailboxSession
mailboxSession) throws MailboxException {
+ lockForReading();
try {
- lock.readLock().acquire();
- try {
- checkAccess();
+ checkAccess();
- final Criteria criterion = preSelect(query);
- final List rows = MessageRowPeer
- .doSelectJoinMessageFlags(criterion);
- final Set<Long> uids = new TreeSet<Long>();
- for (Iterator it = rows.iterator(); it.hasNext();) {
- final MessageRow row = (MessageRow) it.next();
- try {
- if (searches.isMatch(query, row)) {
- uids.add(row.getUid());
- }
- } catch (TorqueException e) {
- mailboxSession.getLog()
- .info(
- "Cannot test message against search
criteria. Will continue to test other messages.",
- e);
- if (mailboxSession.getLog().isDebugEnabled())
- mailboxSession.getLog().debug("UID: " +
row.getUid());
+ final Criteria criterion = preSelect(query);
+ final List rows = MessageRowPeer
+ .doSelectJoinMessageFlags(criterion);
+ final Set<Long> uids = new TreeSet<Long>();
+ for (Iterator it = rows.iterator(); it.hasNext();) {
+ final MessageRow row = (MessageRow) it.next();
+ try {
+ if (searches.isMatch(query, row)) {
+ uids.add(row.getUid());
}
+ } catch (TorqueException e) {
+ mailboxSession.getLog()
+ .info(
+ "Cannot test message against search criteria. Will
continue to test other messages.",
+ e);
+ if (mailboxSession.getLog().isDebugEnabled())
+ mailboxSession.getLog().debug("UID: " + row.getUid());
}
-
- return uids.iterator();
- } catch (TorqueException e) {
- throw new MailboxException(HumanReadableText.SEARCH_FAILED, e);
- } catch (MimeException e) {
- throw new
MailboxException(HumanReadableText.FAILURE_MAIL_PARSE, e);
- } finally {
- lock.readLock().release();
}
- } catch (InterruptedException e) {
- throw new MailboxException(HumanReadableText.LOCK_FAILED, e);
+
+ return uids.iterator();
+ } catch (TorqueException e) {
+ throw new MailboxException(HumanReadableText.SEARCH_FAILED, e);
+ } catch (MimeException e) {
+ throw new MailboxException(HumanReadableText.FAILURE_MAIL_PARSE,
e);
+ } finally {
+ unlockAfterReading();
}
}
@@ -700,12 +671,12 @@
results.add(MessageRowPeer.UID, low);
} else {
final Criteria.Criterion fromCriterion = results
- .getNewCriterion(MessageRowPeer.UID, new Long(low),
- Criteria.GREATER_EQUAL);
+ .getNewCriterion(MessageRowPeer.UID, new Long(low),
+ Criteria.GREATER_EQUAL);
if (high > 0 && high < Long.MAX_VALUE) {
final Criteria.Criterion toCriterion = results
- .getNewCriterion(MessageRowPeer.UID,
- new Long(high), Criteria.LESS_EQUAL);
+ .getNewCriterion(MessageRowPeer.UID,
+ new Long(high), Criteria.LESS_EQUAL);
fromCriterion.and(toCriterion);
}
results.add(fromCriterion);
@@ -719,31 +690,38 @@
public void copyTo(MessageRange set, TorqueMailbox toMailbox,
MailboxSession session) throws MailboxException {
+ final List rows;
+ lockForReading();
try {
- lock.readLock().acquire();
+ checkAccess();
try {
- checkAccess();
- try {
- Criteria c = criteriaForMessageSet(set);
- c.add(MessageFlagsPeer.MAILBOX_ID, getMailboxRow()
- .getMailboxId());
- List rows = MessageRowPeer.doSelectJoinMessageFlags(c);
- toMailbox.copy(rows, session);
- } catch (TorqueException e) {
- throw new MailboxException(HumanReadableText.SAVE_FAILED,
e);
- } catch (MessagingException e) {
- throw new
MailboxException(HumanReadableText.FAILURE_MAIL_PARSE, e);
- }
- } finally {
- lock.readLock().release();
+ final Criteria c = criteriaForMessageSet(set);
+ c.add(MessageFlagsPeer.MAILBOX_ID, getMailboxRow()
+ .getMailboxId());
+ rows = MessageRowPeer.doSelectJoinMessageFlags(c);
+
+ } catch (TorqueException e) {
+ throw new MailboxException(HumanReadableText.SAVE_FAILED, e);
+ } catch (MessagingException e) {
+ throw new
MailboxException(HumanReadableText.FAILURE_MAIL_PARSE, e);
}
- } catch (InterruptedException e) {
- throw new MailboxException(HumanReadableText.LOCK_FAILED, e);
+ } finally {
+ unlockAfterReading();
+ }
+ // Release read lock before copying
+ toMailbox.copy(rows, session);
+ }
+
+ private void unlockAfterReading() {
+ try {
+ lock.readLock().unlock();
+ } catch (RuntimeException e) {
+ // Swallow
}
}
private void copy(List rows, MailboxSession session)
- throws MailboxException {
+ throws MailboxException {
try {
for (Iterator iter = rows.iterator(); iter.hasNext();) {
MessageRow fromRow = (MessageRow) iter.next();
@@ -771,9 +749,9 @@
final List headers = fromRow.getMessageHeaders();
for (Iterator iterator = headers.iterator(); iterator
- .hasNext();) {
+ .hasNext();) {
final MessageHeader fromHeader = (MessageHeader)
iterator
- .next();
+ .next();
final MessageHeader newHeader = new MessageHeader(
fromHeader.getField(), fromHeader.getValue(),
fromHeader.getLineNumber());
@@ -831,10 +809,10 @@
break;
default:
firstUnseen = null;
- unseenCount = 0;
- break;
+ unseenCount = 0;
+ break;
}
-
+
return new MailboxMetaData(recent, permanentFlags, uidValidity,
uidNext, messageCount, unseenCount, firstUnseen, isWriteable());
}
}
Modified:
james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManager.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManager.java?rev=782193&r1=782192&r2=782193&view=diff
==============================================================================
---
james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManager.java
(original)
+++
james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManager.java
Sat Jun 6 06:38:15 2009
@@ -27,6 +27,7 @@
import java.util.List;
import java.util.Map;
import java.util.Random;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -53,9 +54,6 @@
import org.apache.torque.util.CountHelper;
import org.apache.torque.util.Criteria;
-import EDU.oswego.cs.dl.util.concurrent.ReadWriteLock;
-import EDU.oswego.cs.dl.util.concurrent.ReentrantWriterPreferenceReadWriteLock;
-
public class TorqueMailboxManager implements MailboxManager {
public static final String USER_NAMESPACE_PREFIX = "#mail";
@@ -66,7 +64,7 @@
protected Log log = LogFactory.getLog(TorqueMailboxManager.class);
- private final ReadWriteLock lock;
+ private final ReentrantReadWriteLock lock;
private final Map<String, TorqueMailbox> mailboxes;
@@ -79,7 +77,7 @@
}
public TorqueMailboxManager(final UserManager userManager, final char
delimiter) {
- this.lock = new ReentrantWriterPreferenceReadWriteLock();
+ this.lock = new ReentrantReadWriteLock();
mailboxes = new HashMap<String, TorqueMailbox>();
this.userManager = userManager;
this.delimiter = delimiter;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]