Author: norman
Date: Wed Jun 9 11:03:08 2010
New Revision: 952957
URL: http://svn.apache.org/viewvc?rev=952957&view=rev
Log:
Store the subscriptions in the directly in the users node as multi value
property.
Modified:
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/AbstractJCRMapper.java
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/user/JCRSubscriptionMapper.java
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/user/model/JCRSubscription.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/AbstractJCRMapper.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/AbstractJCRMapper.java?rev=952957&r1=952956&r2=952957&view=diff
==============================================================================
---
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/AbstractJCRMapper.java
(original)
+++
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/AbstractJCRMapper.java
Wed Jun 9 11:03:08 2010
@@ -35,7 +35,6 @@ import org.apache.james.imap.store.trans
*/
public abstract class AbstractJCRMapper extends AbstractTransactionalMapper
implements JCRImapConstants {
public final static String MAILBOXES_PATH = "mailboxes";
- public final static String SUBSCRIPTIONS_PATH = "subscriptions";
private final Log logger;
private final MailboxSessionJCRRepository repository;
Modified:
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/user/JCRSubscriptionMapper.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/user/JCRSubscriptionMapper.java?rev=952957&r1=952956&r2=952957&view=diff
==============================================================================
---
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/user/JCRSubscriptionMapper.java
(original)
+++
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/user/JCRSubscriptionMapper.java
Wed Jun 9 11:03:08 2010
@@ -24,7 +24,9 @@ import java.util.List;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.PathNotFoundException;
+import javax.jcr.Property;
import javax.jcr.RepositoryException;
+import javax.jcr.Value;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import javax.jcr.query.QueryResult;
@@ -65,7 +67,20 @@ public class JCRSubscriptionMapper exten
Node node = sub.getNode();
if (node != null) {
- node.remove();
+ Property prop =
node.getProperty(JCRSubscription.MAILBOXES_PROPERTY);
+ Value[] values = prop.getValues();
+ List<String> newValues = new ArrayList<String>();
+ for (int i = 0; i < values.length; i++) {
+ String m = values[i].getString();
+ if (m.equals(sub.getMailbox()) == false) {
+ newValues.add(m);
+ }
+ }
+ if (newValues.isEmpty() == false) {
+ prop.setValue(newValues.toArray(new
String[newValues.size()]));
+ } else {
+ prop.remove();
+ }
}
} catch (PathNotFoundException e) {
// do nothing
@@ -83,14 +98,14 @@ public class JCRSubscriptionMapper exten
*/
public Subscription findFindMailboxSubscriptionForUser(String user, String
mailbox) throws SubscriptionException {
try {
- String queryString = "//" + SUBSCRIPTIONS_PATH +
"//element(*,jamesMailbox:subscription)[@" + JCRSubscription.USERNAME_PROPERTY
+ "='" + user + "'] AND [@" + JCRSubscription.MAILBOX_PROPERTY +"='" + mailbox
+ "']";
+ String queryString = "//" + MAILBOXES_PATH +
"//element(*,jamesMailbox:user)[@" + JCRSubscription.USERNAME_PROPERTY + "='" +
user + "'] AND [@" + JCRSubscription.MAILBOXES_PROPERTY +"='" + mailbox + "']";
QueryManager manager =
getSession().getWorkspace().getQueryManager();
QueryResult result = manager.createQuery(queryString,
Query.XPATH).execute();
NodeIterator nodeIt = result.getNodes();
if (nodeIt.hasNext()) {
- JCRSubscription sub = new JCRSubscription(nodeIt.nextNode(),
getLogger());
+ JCRSubscription sub = new JCRSubscription(nodeIt.nextNode(),
mailbox, getLogger());
return sub;
}
@@ -113,14 +128,20 @@ public class JCRSubscriptionMapper exten
public List<Subscription> findSubscriptionsForUser(String user) throws
SubscriptionException {
List<Subscription> subList = new ArrayList<Subscription>();
try {
- String queryString = "//" + SUBSCRIPTIONS_PATH +
"//element(*,jamesMailbox:subscription)[@" + JCRSubscription.USERNAME_PROPERTY
+ "='" + user + "']";
+ String queryString = "//" + MAILBOXES_PATH +
"//element(*,jamesMailbox:user)[@" + JCRSubscription.USERNAME_PROPERTY + "='" +
user + "']";
QueryManager manager =
getSession().getWorkspace().getQueryManager();
QueryResult result = manager.createQuery(queryString,
Query.XPATH).execute();
NodeIterator nodeIt = result.getNodes();
while (nodeIt.hasNext()) {
- subList.add(new JCRSubscription(nodeIt.nextNode(),
getLogger()));
+ Node node = nodeIt.nextNode();
+ if (node.hasProperty(JCRSubscription.MAILBOXES_PROPERTY)) {
+ Value[] values =
node.getProperty(JCRSubscription.MAILBOXES_PROPERTY).getValues();
+ for (int i = 0; i < values.length; i++) {
+ subList.add(new JCRSubscription(node,
values[i].getString(), getLogger()));
+ }
+ }
}
} catch (PathNotFoundException e) {
// Do nothing just return the empty list later
@@ -151,24 +172,24 @@ public class JCRSubscriptionMapper exten
// its a new subscription
if (sub == null) {
- Node subscriptionsNode =
JcrUtils.getOrAddNode(getSession().getRootNode(), SUBSCRIPTIONS_PATH);
+ Node subscriptionsNode =
JcrUtils.getOrAddNode(getSession().getRootNode(), MAILBOXES_PATH);
// this loop will create a structure like:
- // /mailboxes/u/user/INBOX
+ // /mailboxes/u/user
//
// This is needed to minimize the child nodes a bit
Node userNode = JcrUtils.getOrAddNode(subscriptionsNode,
String.valueOf(username.charAt(0)));
userNode = JcrUtils.getOrAddNode(userNode,
String.valueOf(username));
node = JcrUtils.getOrAddNode(userNode, mailbox,
"nt:unstructured");
- node.addMixin("jamesMailbox:subscription");
+ node.addMixin("jamesMailbox:user");
} else {
node = sub.getNode();
}
+
// Copy new properties to the node
((JCRSubscription)subscription).merge(node);
} catch (RepositoryException e) {
- e.printStackTrace();
throw new SubscriptionException(HumanReadableText.SAVE_FAILED, e);
}
}
Modified:
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/user/model/JCRSubscription.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/user/model/JCRSubscription.java?rev=952957&r1=952956&r2=952957&view=diff
==============================================================================
---
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/user/model/JCRSubscription.java
(original)
+++
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/user/model/JCRSubscription.java
Wed Jun 9 11:03:08 2010
@@ -19,8 +19,13 @@
package org.apache.james.imap.jcr.user.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
import javax.jcr.Node;
import javax.jcr.RepositoryException;
+import javax.jcr.Value;
import org.apache.commons.logging.Log;
import org.apache.james.imap.jcr.Persistent;
@@ -28,14 +33,13 @@ import org.apache.james.imap.jcr.JCRImap
import org.apache.james.imap.store.user.model.Subscription;
/**
- * JCR implementation of a {...@link Subscription}
- *
+ * JCR implementation of a {...@link Subscription}.
*/
public class JCRSubscription implements Subscription, Persistent,
JCRImapConstants {
private static final String TOSTRING_SEPARATOR = " ";
- public final static String USERNAME_PROPERTY =
"jamesMailbox:subscriptionUsername";
- public final static String MAILBOX_PROPERTY =
"jamesMailbox:subscriptionMailbox";
+ public final static String USERNAME_PROPERTY = "jamesMailbox:user";
+ public final static String MAILBOXES_PROPERTY =
"jamesMailbox:subscriptionMailboxes";
private Node node;
private final Log log;
@@ -43,9 +47,10 @@ public class JCRSubscription implements
private String username;
- public JCRSubscription(Node node, Log log) {
+ public JCRSubscription(Node node, String mailbox, Log log) {
this.node = node;
this.log = log;
+ this.mailbox = mailbox;
}
public JCRSubscription(String username, String mailbox, Log log) {
@@ -60,14 +65,6 @@ public class JCRSubscription implements
* @see org.apache.james.imap.store.user.model.Subscription#getMailbox()
*/
public String getMailbox() {
- if (isPersistent()) {
- try {
- return node.getProperty(MAILBOX_PROPERTY).getString();
- } catch (RepositoryException e) {
- log.error("Unable to access Property " + MAILBOX_PROPERTY, e);
- }
- return null;
- }
return mailbox;
}
@@ -112,13 +109,23 @@ public class JCRSubscription implements
*/
public void merge(Node node) throws RepositoryException{
node.setProperty(USERNAME_PROPERTY, getUser());
- node.setProperty(MAILBOX_PROPERTY, getMailbox());
- this.node = node;
+ if (node.hasProperty(MAILBOXES_PROPERTY)) {
+ Value[] mailboxes =
node.getProperty(MAILBOXES_PROPERTY).getValues();
+ List<String>newMailboxes = new ArrayList<String>();
+ for (int i = 0; i< mailboxes.length; i++) {
+ String m = mailboxes[i].getString();
+ newMailboxes.add(m);
+ }
+ if (newMailboxes.contains(getMailbox()) == false) {
+ newMailboxes.add(getMailbox());
- /*
- mailbox = null;
- username = null;
- */
+ }
+
+ node.setProperty(MAILBOXES_PROPERTY, newMailboxes.toArray(new
String[newMailboxes.size()]));
+ } else {
+ node.setProperty(MAILBOXES_PROPERTY, new String[] {getMailbox()});
+ }
+ this.node = node;
}
@Override
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=952957&r1=952956&r2=952957&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
Wed Jun 9 11:03:08 2010
@@ -17,12 +17,14 @@
<jamesMailbox = 'http://james.apache.org/imap/jcr/'>
-[jamesMailbox:subscription] > mix:created
+[jamesMailbox:user] > mix:created
mixin
- - jamesMailbox:subscriptionUsername (STRING) mandatory
- - jamesMailbox:subscriptionMailbox (STRING) mandatory
+ - jamesMailbox:user (String)
+ - jamesMailbox:subscriptionMailboxes (STRING) multiple
+ + * (nt:unstructured) multiple
+
-[jamesMailbox:messageHeader] > mix:created
+[jamesMailbox:messageHeader] > mix:created, mix:lockable
mixin
- jamesMailbox:headerFieldName (STRING) mandatory
- jamesMailbox:headerValue(STRING) mandatory
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]