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]

Reply via email to