Author: norman
Date: Thu May 13 15:53:35 2010
New Revision: 943920
URL: http://svn.apache.org/viewvc?rev=943920&view=rev
Log:
More work on re-layout JCR data (IMAP-140). Only subscriptions need to get
reviewed now
Modified:
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailbox.java
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
james/imap/trunk/jcr/src/main/resources/org/apache/james/imap/jcr/imap.cnd
Modified:
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailbox.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailbox.java?rev=943920&r1=943919&r2=943920&view=diff
==============================================================================
---
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailbox.java
(original)
+++
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailbox.java
Thu May 13 15:53:35 2010
@@ -85,7 +85,7 @@ public class JCRMailbox extends StoreMai
@Override
protected MessageMapper<String> createMessageMapper(MailboxSession
session) throws MailboxException {
- JCRMessageMapper messageMapper = new JCRMessageMapper(jcrSession,
getMailboxId(), log, delimiter);
+ JCRMessageMapper messageMapper = new JCRMessageMapper(jcrSession,
getMailboxId(), log);
return messageMapper;
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=943920&r1=943919&r2=943920&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
Thu May 13 15:53:35 2010
@@ -24,6 +24,7 @@ import java.util.List;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.PathNotFoundException;
+import javax.jcr.PropertyIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.query.Query;
@@ -31,7 +32,9 @@ import javax.jcr.query.QueryManager;
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.mail.model.JCRMailbox;
@@ -65,7 +68,7 @@ public class JCRMailboxMapper extends Ab
try {
QueryManager manager =
getSession().getWorkspace().getQueryManager();
- String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:mailbox)[@" + JCRMailbox.NAME_PROPERTY + "='" + name + "']
order by @"+ JCRMailbox.NAME_PROPERTY;
+ String queryString = "//"+ MAILBOXES_PATH +
"//element(*,imap:mailbox)[@" + JCRMailbox.NAME_PROPERTY + "='" + name + "']
order by @"+ JCRMailbox.NAME_PROPERTY;
QueryResult result = manager.createQuery(queryString,
Query.XPATH).execute();
NodeIterator it = result.getNodes();
long resultSize = it.getSize();
@@ -94,7 +97,28 @@ public class JCRMailboxMapper extends Ab
*/
public void delete(Mailbox<String> mailbox) throws StorageException {
try {
- getSession().getNodeByUUID(((JCRMailbox)
mailbox).getMailboxId()).remove();
+ Node node = getSession().getNodeByUUID(((JCRMailbox)
mailbox).getMailboxId());
+
+ // if the node has subnodes we need to just cleanup the properties
and emails, because it
+ // seems like it holding an other mailbox
+ if (node.hasNodes()) {
+ NodeIterator it = node.getNodes();
+ while(it.hasNext()) {
+ Node n = it.nextNode();
+ // check if we have nodes which hold emails, and if so
delete the nodes
+ if (n.isNodeType("imap:mailbox") == false &&
n.isNodeType("nt:folder")) {
+ n.remove();
+ }
+
+ }
+ // remove all imap specifc properties
+ PropertyIterator propIt = node.getProperties("imap:*");
+ while(propIt.hasNext()) {
+ propIt.nextProperty().remove();
+ }
+ } else {
+ node.remove();
+ }
} catch (PathNotFoundException e) {
// mailbox does not exists..
} catch (RepositoryException e) {
@@ -115,7 +139,6 @@ public class JCRMailboxMapper extends Ab
} catch (PathNotFoundException e) {
// nothing todo
} catch (RepositoryException e) {
- e.printStackTrace();
throw new StorageException(HumanReadableText.DELETED_FAILED, e);
}
}
@@ -131,7 +154,7 @@ public class JCRMailboxMapper extends Ab
public boolean existsMailboxStartingWith(String mailboxName) throws
StorageException {
try {
QueryManager manager =
getSession().getWorkspace().getQueryManager();
- String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:mailbox)[jcr:like(@" + JCRMailbox.NAME_PROPERTY + ",'"
+mailboxName+"%')]";
+ String queryString = "//"+ MAILBOXES_PATH +
"//element(*,imap:mailbox)[jcr:like(@" + JCRMailbox.NAME_PROPERTY + ",'"
+mailboxName+"%')]";
QueryResult result = manager.createQuery(queryString,
Query.XPATH).execute();
NodeIterator it = result.getNodes();
return it.hasNext();
@@ -164,16 +187,15 @@ public class JCRMailboxMapper extends Ab
*/
public Mailbox<String> findMailboxByName(String name) throws
StorageException, MailboxNotFoundException {
try {
- QueryManager manager =
getSession().getWorkspace().getQueryManager();
- String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:mailbox)[@" + JCRMailbox.NAME_PROPERTY + "='" + name + "']";
- QueryResult result = manager.createQuery(queryString,
Query.XPATH).execute();
- NodeIterator it = result.getNodes();
- if (it.hasNext()) {
+ QueryManager manager =
getSession().getWorkspace().getQueryManager();
+ String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:mailbox)[@" + JCRMailbox.NAME_PROPERTY + "='" + name + "']";
+ QueryResult result = manager.createQuery(queryString,
Query.XPATH).execute();
+ NodeIterator it = result.getNodes();
+ if (it.hasNext()) {
return new JCRMailbox(it.nextNode(), getLogger());
- }
+ }
throw new MailboxNotFoundException(name);
} catch (PathNotFoundException e) {
- e.printStackTrace();
throw new MailboxNotFoundException(name);
} catch (RepositoryException e) {
throw new StorageException(HumanReadableText.SEARCH_FAILED, e);
@@ -189,14 +211,14 @@ public class JCRMailboxMapper extends Ab
*/
public List<Mailbox<String>> findMailboxWithNameLike(String name) throws
StorageException {
List<Mailbox<String>> mailboxList = new ArrayList<Mailbox<String>>();
- try {
- QueryManager manager =
getSession().getWorkspace().getQueryManager();
- String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:mailbox)[jcr:like(@" + JCRMailbox.NAME_PROPERTY + ",'%" +
name + "%')]";
- QueryResult result = manager.createQuery(queryString,
Query.XPATH).execute();
- NodeIterator it = result.getNodes();
- while (it.hasNext()) {
+ try {
+ QueryManager manager =
getSession().getWorkspace().getQueryManager();
+ String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:mailbox)[jcr:like(@" + JCRMailbox.NAME_PROPERTY + ",'%" +
name + "%')]";
+ QueryResult result = manager.createQuery(queryString,
Query.XPATH).execute();
+ NodeIterator it = result.getNodes();
+ while (it.hasNext()) {
mailboxList.add(new JCRMailbox(it.nextNode(), getLogger()));
- }
+ }
} catch (PathNotFoundException e) {
// nothing todo
} catch (RepositoryException e) {
@@ -215,21 +237,49 @@ public class JCRMailboxMapper extends Ab
public void save(Mailbox<String> mailbox) throws StorageException {
try {
- JCRMailbox jcrMailbox = (JCRMailbox)mailbox;
+ final JCRMailbox jcrMailbox = (JCRMailbox)mailbox;
Node node = null;
if (jcrMailbox.isPersistent()) {
node = getSession().getNodeByUUID(jcrMailbox.getMailboxId());
}
if (node == null) {
- Node mailboxNode =
JcrUtils.getOrAddNode(getSession().getRootNode(), MAILBOXES_PATH);
- node = JcrUtils.getOrAddNode(mailboxNode, mailbox.getName(),
"imap:mailbox");
- }
-
- jcrMailbox.merge(node);
+ Node rootNode = getSession().getRootNode();
+ Node mailboxNode;
+ if (rootNode.hasNode(MAILBOXES_PATH) == false) {
+ mailboxNode = rootNode.addNode(MAILBOXES_PATH);
+ mailboxNode.addMixin(JcrConstants.MIX_LOCKABLE);
+ getSession().save();
+ } else {
+ mailboxNode = rootNode.getNode(MAILBOXES_PATH);
+ }
+ new Locked() {
+ @Override
+ protected Object run(Node node) throws RepositoryException
{
+ final String name = jcrMailbox.getName();
+
+ //split the name so we can construct a nice node tree
+ final String nameParts[] = name.split("\\"
+String.valueOf(delimiter));
+
+ for (int i = 0; i < nameParts.length; i++) {
+ node = JcrUtils.getOrAddNode(node, nameParts[i],
"imap:mailbox");
+ }
+ jcrMailbox.merge(node);
+
+ getSession().save();
+ return null;
+ }
+
+ }.with(mailboxNode, true);
+
+ } else {
+ jcrMailbox.merge(node);
+ }
+
} catch (RepositoryException e) {
- e.printStackTrace();
+ throw new StorageException(HumanReadableText.SAVE_FAILED, e);
+ } catch (InterruptedException e) {
throw new StorageException(HumanReadableText.SAVE_FAILED, e);
}
}
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=943920&r1=943919&r2=943920&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
Thu May 13 15:53:35 2010
@@ -51,12 +51,10 @@ import org.apache.james.imap.store.mail.
public class JCRMessageMapper extends AbstractJCRMapper implements
MessageMapper<String> {
private final String uuid;
- private char delimiter;
- public JCRMessageMapper(final Session session, final String uuid, final
Log logger, char delimiter) {
+ public JCRMessageMapper(final Session session, final String uuid, final
Log logger) {
super(session, logger);
this.uuid = uuid;
- this.delimiter = delimiter;
}
/*
Modified:
james/imap/trunk/jcr/src/main/resources/org/apache/james/imap/jcr/imap.cnd
URL:
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/resources/org/apache/james/imap/jcr/imap.cnd?rev=943920&r1=943919&r2=943920&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/resources/org/apache/james/imap/jcr/imap.cnd
(original)
+++ james/imap/trunk/jcr/src/main/resources/org/apache/james/imap/jcr/imap.cnd
Thu May 13 15:53:35 2010
@@ -33,7 +33,6 @@
- imap:propertyOrder (Long) mandatory
[imap:message] > mix:referenceable, nt:file
- ORDERABLE
- imap:mailboxUUID (String) mandatory
- imap:uid (LONG) mandatory
- imap:size (LONG) mandatory
@@ -49,7 +48,7 @@
- imap:messageSubType (String) mandatory
+ messageHeader (imap:messageHeader) multiple
+ messageProperty (imap:messageProperty) multiple
-
+
[imap:mailbox] > mix:referenceable, mix:lockable, nt:folder
- imap:mailboxUidValidity (LONG)
- imap:mailboxName (STRING)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]