You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2010/06/07 08:08:44 UTC
svn commit: r952111 - in
/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail:
JCRMailboxMapper.java JCRMessageMapper.java
Author: norman
Date: Mon Jun 7 06:08:44 2010
New Revision: 952111
URL: http://svn.apache.org/viewvc?rev=952111&view=rev
Log:
Use the NodeLocker to lock Nodes (IMAP-148).
Modified:
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMailboxMapper.java
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java
Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMailboxMapper.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMailboxMapper.java?rev=952111&r1=952110&r2=952111&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMailboxMapper.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMailboxMapper.java Mon Jun 7 06:08:44 2010
@@ -32,11 +32,11 @@ import javax.jcr.query.QueryResult;
import org.apache.commons.logging.Log;
import org.apache.jackrabbit.JcrConstants;
import org.apache.jackrabbit.commons.JcrUtils;
-import org.apache.jackrabbit.util.Locked;
import org.apache.james.imap.api.display.HumanReadableText;
import org.apache.james.imap.jcr.AbstractJCRMapper;
import org.apache.james.imap.jcr.MailboxSessionJCRRepository;
import org.apache.james.imap.jcr.NodeLocker;
+import org.apache.james.imap.jcr.NodeLocker.NodeLockedExecution;
import org.apache.james.imap.jcr.mail.model.JCRMailbox;
import org.apache.james.imap.mailbox.MailboxNotFoundException;
import org.apache.james.imap.mailbox.MailboxSession;
@@ -136,11 +136,15 @@ public class JCRMailboxMapper extends Ab
*/
public boolean existsMailboxStartingWith(String mailboxName) throws StorageException {
try {
- QueryManager manager = getSession().getWorkspace().getQueryManager();
- String queryString = "//"+ MAILBOXES_PATH + "//element(*,jamesMailbox:mailbox)[jcr:like(@" + JCRMailbox.NAME_PROPERTY + ",'" +mailboxName+"%')]";
- QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
- NodeIterator it = result.getNodes();
- return it.hasNext();
+ QueryManager manager = getSession().getWorkspace()
+ .getQueryManager();
+ String queryString = "//" + MAILBOXES_PATH
+ + "//element(*,jamesMailbox:mailbox)[jcr:like(@"
+ + JCRMailbox.NAME_PROPERTY + ",'" + mailboxName + "%')]";
+ QueryResult result = manager.createQuery(queryString, Query.XPATH)
+ .execute();
+ NodeIterator it = result.getNodes();
+ return it.hasNext();
} catch (RepositoryException e) {
throw new StorageException(HumanReadableText.SEARCH_FAILED, e);
}
@@ -235,10 +239,10 @@ public class JCRMailboxMapper extends Ab
} else {
mailboxNode = rootNode.getNode(MAILBOXES_PATH);
}
- new Locked() {
+ NodeLocker locker = getNodeLocker();
+ locker.execute(new NodeLockedExecution<Void>() {
- @Override
- protected Object run(Node node) throws RepositoryException {
+ public Void execute(Node node) throws RepositoryException {
final String name = jcrMailbox.getName();
//split the name so we can construct a nice node tree
@@ -262,8 +266,12 @@ public class JCRMailboxMapper extends Ab
getSession().save();
return null;
}
+
+ public boolean isDeepLocked() {
+ return true;
+ }
- }.with(mailboxNode, true);
+ }, mailboxNode, Void.class);
} else {
jcrMailbox.merge(node);
Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java?rev=952111&r1=952110&r2=952111&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java Mon Jun 7 06:08:44 2010
@@ -34,11 +34,11 @@ import javax.jcr.query.QueryResult;
import org.apache.commons.logging.Log;
import org.apache.jackrabbit.JcrConstants;
import org.apache.jackrabbit.commons.JcrUtils;
-import org.apache.jackrabbit.util.Locked;
import org.apache.james.imap.api.display.HumanReadableText;
import org.apache.james.imap.jcr.AbstractJCRMapper;
import org.apache.james.imap.jcr.MailboxSessionJCRRepository;
import org.apache.james.imap.jcr.NodeLocker;
+import org.apache.james.imap.jcr.NodeLocker.NodeLockedExecution;
import org.apache.james.imap.jcr.mail.model.JCRMessage;
import org.apache.james.imap.mailbox.MailboxSession;
import org.apache.james.imap.mailbox.MessageRange;
@@ -410,17 +410,19 @@ public class JCRMessageMapper extends Ab
String dayNodePath = year + NODE_DELIMITER + month + NODE_DELIMITER + day;
boolean found = mailboxNode.hasNode(dayNodePath);
+ NodeLocker locker = getNodeLocker();
+
// check if the node for the day already exists. if not we need to create the structure
if (found == false) {
+
// we lock the whole mailbox with all its childs while
// adding the folder structure for the date
// TODO: Maybe we should just lock the last child folder
- dayNode = (Node) new Locked() {
+ dayNode = locker.execute(new NodeLocker.NodeLockedExecution<Node>() {
- @Override
- protected Object run(Node mailboxNode) throws RepositoryException {
+ public Node execute(Node node) throws RepositoryException {
- Node yearNode = JcrUtils.getOrAddFolder(mailboxNode, year);
+ Node yearNode = JcrUtils.getOrAddFolder(node, year);
yearNode.addMixin(JcrConstants.MIX_LOCKABLE);
Node monthNode = JcrUtils.getOrAddFolder(yearNode, month);
@@ -432,7 +434,12 @@ public class JCRMessageMapper extends Ab
getSession().save();
return dayNode;
}
- }.with(mailboxNode, true);
+
+ public boolean isDeepLocked() {
+ return true;
+ }
+ }, mailboxNode, Node.class);
+
} else {
dayNode = mailboxNode.getNode(dayNodePath);
@@ -440,11 +447,10 @@ public class JCRMessageMapper extends Ab
// lock the day node and add the message
- new Locked() {
+ locker.execute(new NodeLockedExecution<Void>() {
- @Override
- protected Object run(Node dayNode) throws RepositoryException {
- Node messageNode = dayNode.addNode(String.valueOf(membership.getUid()),"jamesMailbox:message");
+ public Void execute(Node node) throws RepositoryException {
+ Node messageNode = node.addNode(String.valueOf(membership.getUid()),"jamesMailbox:message");
try {
membership.merge(messageNode);
} catch (IOException e) {
@@ -455,10 +461,12 @@ public class JCRMessageMapper extends Ab
return null;
}
-
- }.with(dayNode,false);
+
+ public boolean isDeepLocked() {
+ return true;
+ }
+ }, dayNode, Void.class);
-
} else {
membership.merge(messageNode);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org