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/03/13 19:50:40 UTC
svn commit: r922647 - in
/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr: ./ mail/
mail/model/
Author: norman
Date: Sat Mar 13 18:50:39 2010
New Revision: 922647
URL: http://svn.apache.org/viewvc?rev=922647&view=rev
Log:
More work on JCR which included some more work on XPath queries (IMAP-93)
Added:
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalMailbox.java
Modified:
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserMailboxManager.java
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserSubscriptionManager.java
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRImapConstants.java
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/JCRMailboxManager.java
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRUtils.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/java/org/apache/james/imap/jcr/mail/model/JCRMailbox.java
Added: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalMailbox.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalMailbox.java?rev=922647&view=auto
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalMailbox.java (added)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalMailbox.java Sat Mar 13 18:50:39 2010
@@ -0,0 +1,60 @@
+/****************************************************************
+ * 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.jcr;
+
+import javax.jcr.LoginException;
+import javax.jcr.NoSuchWorkspaceException;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+
+import org.apache.commons.logging.Log;
+import org.apache.james.imap.api.display.HumanReadableText;
+import org.apache.james.imap.mailbox.MailboxSession;
+import org.apache.james.imap.mailbox.SubscriptionException;
+import org.apache.james.imap.store.PasswordAwareUser;
+
+public class JCRGlobalMailbox extends JCRMailbox{
+
+ private final String username;
+ private final char[] password;
+
+ public JCRGlobalMailbox(final org.apache.james.imap.jcr.mail.model.JCRMailbox mailbox, MailboxSession session,
+ Repository repository, String workspace, String username, char[] password,Log log) {
+ super(mailbox, session, repository, workspace, log);
+ this.username = username;
+ this.password = password;
+ }
+
+ @Override
+ protected Session getSession(PasswordAwareUser user) throws SubscriptionException {
+ try {
+ return getRepository().login(new SimpleCredentials(username, password), getWorkspace());
+ } catch (LoginException e) {
+ throw new SubscriptionException(HumanReadableText.INVALID_LOGIN, e);
+ } catch (NoSuchWorkspaceException e) {
+ throw new SubscriptionException(HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING, e);
+ } catch (RepositoryException e) {
+ throw new SubscriptionException(HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING, e);
+
+ }
+ }
+}
Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserMailboxManager.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserMailboxManager.java?rev=922647&r1=922646&r2=922647&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserMailboxManager.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserMailboxManager.java Sat Mar 13 18:50:39 2010
@@ -29,7 +29,9 @@ import org.apache.james.imap.api.display
import org.apache.james.imap.mailbox.MailboxException;
import org.apache.james.imap.mailbox.MailboxSession;
import org.apache.james.imap.store.Authenticator;
+import org.apache.james.imap.store.StoreMailbox;
import org.apache.james.imap.store.Subscriber;
+import org.apache.james.imap.store.mail.model.Mailbox;
/**
* JCR based MailboxManager which use the same username and password to obtain a
@@ -40,19 +42,30 @@ import org.apache.james.imap.store.Subsc
public class JCRGlobalUserMailboxManager extends JCRMailboxManager {
private final String username;
- private final String password;
+ private final char[] password;
public JCRGlobalUserMailboxManager(final Authenticator authenticator, final Subscriber subscriber, final Repository repository, final String workspace, final String username, final String password) {
super(authenticator, subscriber, repository, workspace);
this.username = username;
- this.password = password;
+ if (password != null) {
+ this.password = password.toCharArray();
+ } else {
+ this.password = new char[0];
+ }
}
+
+ @Override
+ protected StoreMailbox createMailbox(Mailbox mailboxRow, MailboxSession session) {
+ JCRMailbox mailbox = new JCRGlobalMailbox((org.apache.james.imap.jcr.mail.model.JCRMailbox) mailboxRow, session, getRepository(), getWorkspace(), username, password, getLog());
+ return mailbox;
+ }
+
@Override
protected Session getSession(MailboxSession s) throws MailboxException {
try {
- return getRepository().login(new SimpleCredentials(username, password.toCharArray()), getWorkspace());
+ return getRepository().login(new SimpleCredentials(username, password), getWorkspace());
} catch (LoginException e) {
throw new MailboxException(HumanReadableText.INVALID_LOGIN, e);
} catch (NoSuchWorkspaceException e) {
Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserSubscriptionManager.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserSubscriptionManager.java?rev=922647&r1=922646&r2=922647&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserSubscriptionManager.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserSubscriptionManager.java Sat Mar 13 18:50:39 2010
@@ -37,19 +37,23 @@ import org.apache.james.imap.store.Passw
*/
public class JCRGlobalUserSubscriptionManager extends JCRSubscriptionManager {
- private String username;
- private String password;
+ private final String username;
+ private final char[] password;
public JCRGlobalUserSubscriptionManager(final Repository repository, final String workspace, final String username, final String password) {
super(repository, workspace);
this.username = username;
- this.password = password;
+ if (password != null) {
+ this.password = password.toCharArray();
+ } else {
+ this.password = new char[0];
+ }
}
@Override
protected Session getSession(PasswordAwareUser user) throws SubscriptionException {
try {
- return getRepository().login(new SimpleCredentials(username, password.toCharArray()), getWorkspace());
+ return getRepository().login(new SimpleCredentials(username, password), getWorkspace());
} catch (LoginException e) {
throw new SubscriptionException(HumanReadableText.INVALID_LOGIN, e);
} catch (NoSuchWorkspaceException e) {
Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRImapConstants.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRImapConstants.java?rev=922647&r1=922646&r2=922647&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRImapConstants.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRImapConstants.java Sat Mar 13 18:50:39 2010
@@ -32,5 +32,5 @@ public interface JCRImapConstants {
/**
* Prefix for all imap related properties
*/
- public static final String PROPERTY_PREFIX ="imap:";
+ public static final String PROPERTY_PREFIX ="";//"imap:";
}
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=922647&r1=922646&r2=922647&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 Sat Mar 13 18:50:39 2010
@@ -52,7 +52,7 @@ public class JCRMailbox extends StoreMai
private final Repository repository;
private final String workspace;
private final Log log;
- private String uuid;
+ private final String uuid;
public JCRMailbox(final org.apache.james.imap.jcr.mail.model.JCRMailbox mailbox, final MailboxSession session, final Repository repository, final String workspace, final Log log) {
super(mailbox, session );
Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxManager.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxManager.java?rev=922647&r1=922646&r2=922647&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxManager.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxManager.java Sat Mar 13 18:50:39 2010
@@ -35,7 +35,6 @@ import org.apache.james.imap.jcr.mail.JC
import org.apache.james.imap.mailbox.BadCredentialsException;
import org.apache.james.imap.mailbox.MailboxException;
import org.apache.james.imap.mailbox.MailboxSession;
-import org.apache.james.imap.mailbox.StorageException;
import org.apache.james.imap.store.Authenticator;
import org.apache.james.imap.store.PasswordAwareMailboxSession;
import org.apache.james.imap.store.PasswordAwareUser;
@@ -65,8 +64,8 @@ public class JCRMailboxManager extends S
@Override
protected StoreMailbox createMailbox(Mailbox mailboxRow, MailboxSession session) {
- // TODO Auto-generated method stub
- return null;
+ JCRMailbox mailbox = new JCRMailbox((org.apache.james.imap.jcr.mail.model.JCRMailbox) mailboxRow, session, getRepository(), getWorkspace(), getLog());
+ return mailbox;
}
@Override
@@ -117,20 +116,12 @@ public class JCRMailboxManager extends S
*/
public MailboxSession login(String userid, String passwd, Log log) throws BadCredentialsException, MailboxException {
if (login(userid, passwd)) {
-
return new PasswordAwareMailboxSession(randomId(), userid, passwd, log, getDelimiter(), new ArrayList<Locale>());
} else {
throw new BadCredentialsException();
}
}
- public void deleteEverything() throws StorageException {
- try {
- repository.login().getRootNode().remove();
- } catch (RepositoryException e) {
- throw new StorageException(HumanReadableText.DELETED_FAILED, e);
- }
- }
/**
* Return the JCR workspace
Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRUtils.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRUtils.java?rev=922647&r1=922646&r2=922647&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRUtils.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRUtils.java Sat Mar 13 18:50:39 2010
@@ -27,9 +27,11 @@ public class JCRUtils implements JCRImap
for (int i = 0; i < subNodes.length; i++ ) {
String path = subNodes[i];
+ /*
if (path.startsWith(PROPERTY_PREFIX) == false) {
pathBuf.append(PROPERTY_PREFIX);
}
+ */
pathBuf.append(Text.escapeIllegalJcrChars(path));
if (i +1 != subNodes.length) {
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=922647&r1=922646&r2=922647&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 Sat Mar 13 18:50:39 2010
@@ -26,10 +26,12 @@ import javax.jcr.NodeIterator;
import javax.jcr.PathNotFoundException;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
+import javax.jcr.query.Query;
+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.util.Text;
import org.apache.james.imap.api.display.HumanReadableText;
import org.apache.james.imap.jcr.JCRImapConstants;
import org.apache.james.imap.jcr.JCRUtils;
@@ -47,9 +49,8 @@ import org.apache.james.imap.store.trans
*/
public class JCRMailboxMapper extends NonTransactionalMapper implements MailboxMapper,JCRImapConstants {
- private final static String WILDCARD = "*";
private final Session session;
- private final String PATH = PROPERTY_PREFIX + "mailboxes";
+ public final String PATH = PROPERTY_PREFIX + "mailboxes";
private Log logger;
public JCRMailboxMapper(final Session session, final Log logger) {
@@ -65,16 +66,16 @@ public class JCRMailboxMapper extends No
* (java.lang.String)
*/
public long countMailboxesWithName(String name) throws StorageException {
- String nodeName = Text.unescapeIllegalJcrChars(name);
-
try {
- boolean found = session.getRootNode().hasNode(JCRUtils.createPath(PATH, nodeName));
- if (found) {
- return 1;
- }
+ QueryManager manager = session.getWorkspace().getQueryManager();
+ String queryString = "//" + PATH + "//element(*)[@" + JCRMailbox.NAME_PROPERTY + "='" + name + "']";
+ QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
+ NodeIterator it = result.getNodes();
+ return it.getSize();
} catch (PathNotFoundException e) {
// not found
} catch (RepositoryException e) {
+ e.printStackTrace();
throw new StorageException(HumanReadableText.COUNT_FAILED, e);
}
return 0;
@@ -88,9 +89,9 @@ public class JCRMailboxMapper extends No
* .imap.store.mail.model.Mailbox)
*/
public void delete(Mailbox mailbox) throws StorageException {
- String nodeName = Text.unescapeIllegalJcrChars(mailbox.getName());
try {
- session.getRootNode().getNode(JCRUtils.createPath(PATH, nodeName)).remove();
+ session.getNodeByUUID(((JCRMailbox) mailbox).getUUID()).remove();
+ session.save();
} catch (PathNotFoundException e) {
// mailbox does not exists..
} catch (RepositoryException e) {
@@ -111,6 +112,7 @@ public class JCRMailboxMapper extends No
} catch (PathNotFoundException e) {
// nothing todo
} catch (RepositoryException e) {
+
throw new StorageException(HumanReadableText.DELETED_FAILED, e);
}
}
@@ -124,7 +126,11 @@ public class JCRMailboxMapper extends No
*/
public boolean existsMailboxStartingWith(String mailboxName) throws StorageException {
try {
- return session.getRootNode().getNodes(JCRUtils.createPath(PATH, mailboxName) + WILDCARD).hasNext();
+ QueryManager manager = session.getWorkspace().getQueryManager();
+ String queryString = "//" + PATH + "//element(*)[jcr:contains(@" + 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);
}
@@ -158,7 +164,8 @@ public class JCRMailboxMapper extends No
}
public Mailbox findMailboxByUUID(String uuid) throws StorageException, MailboxNotFoundException {
- try {
+ System.out.println("UUID="+uuid);
+ try {
return new JCRMailbox(session.getNodeByUUID(uuid),logger);
} catch (PathNotFoundException e) {
throw new MailboxNotFoundException(uuid);
@@ -176,9 +183,16 @@ public class JCRMailboxMapper extends No
*/
public Mailbox findMailboxByName(String name) throws StorageException, MailboxNotFoundException {
try {
- Node node = session.getRootNode().getNode(JCRUtils.createPath(PATH, name));
- return new JCRMailbox(node, logger);
+ QueryManager manager = session.getWorkspace().getQueryManager();
+ String queryString = "//" + PATH + "//element(*)[@" + JCRMailbox.NAME_PROPERTY + "='" + name + "']";
+ QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
+ NodeIterator it = result.getNodes();
+ if (it.hasNext()) {
+ return new JCRMailbox(it.nextNode(), logger);
+ }
+ throw new MailboxNotFoundException(name);
} catch (PathNotFoundException e) {
+ e.printStackTrace();
throw new MailboxNotFoundException(name);
} catch (RepositoryException e) {
throw new StorageException(HumanReadableText.SEARCH_FAILED, e);
@@ -194,11 +208,14 @@ public class JCRMailboxMapper extends No
*/
public List<Mailbox> findMailboxWithNameLike(String name) throws StorageException {
List<Mailbox> mailboxList = new ArrayList<Mailbox>();
- try {
- NodeIterator it = session.getRootNode().getNodes(PATH + NODE_DELIMITER + WILDCARD + name + WILDCARD);
- while (it.hasNext()) {
+ try {
+ QueryManager manager = session.getWorkspace().getQueryManager();
+ String queryString = "//" + PATH + "//element(*)[jcr:contains(@" + 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(), logger));
- }
+ }
} catch (PathNotFoundException e) {
// nothing todo
} catch (RepositoryException e) {
@@ -219,13 +236,15 @@ public class JCRMailboxMapper extends No
try {
Node node;
if (session.getRootNode().hasNode(nodePath)) {
- node = session.getRootNode().getNode(PATH);
+ node = session.getRootNode().getNode(nodePath);
} else {
- node = session.getRootNode().addNode(PATH, JcrConstants.MIX_REFERENCEABLE);
+ node = session.getRootNode().addNode(nodePath, JcrConstants.MIX_REFERENCEABLE);
}
((JCRMailbox)mailbox).merge(node);
session.save();
+ System.out.println("U="+node.getUUID());
} catch (RepositoryException e) {
+ e.printStackTrace();
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=922647&r1=922646&r2=922647&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 Sat Mar 13 18:50:39 2010
@@ -66,7 +66,7 @@ public class JCRMessageMapper extends No
public long countMessagesInMailbox() throws StorageException {
try {
- String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY +"==" + uuid +"]";
+ String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY +"='" + uuid +"']";
QueryManager manager = session.getWorkspace().getQueryManager();
QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
return result.getNodes().getSize();
@@ -323,6 +323,13 @@ public class JCRMessageMapper extends No
}
}
+ /**
+ * Generate the XPath query for the SearchQuery
+ *
+ * @param uuid
+ * @param query
+ * @return xpathQuery
+ */
private String formulateXPath(String uuid, SearchQuery query) {
final StringBuilder queryBuilder = new StringBuilder(50);
queryBuilder.append("//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY +"='" + uuid +"'] ");
Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMailbox.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMailbox.java?rev=922647&r1=922646&r2=922647&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMailbox.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMailbox.java Sat Mar 13 18:50:39 2010
@@ -188,7 +188,7 @@ public class JCRMailbox implements Mailb
public String getUUID() {
if (isPersistent()) {
try {
- return node.getProperty(JcrConstants.JCR_UUID).getString();
+ return node.getUUID();
} catch (RepositoryException e) {
logger.error("Unable to access property " + JcrConstants.JCR_UUID, e);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org