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/15 15:57:09 UTC

svn commit: r923276 - in /james/imap/trunk: deployment/src/test/java/org/apache/james/imap/functional/jcr/ jcr/src/main/java/org/apache/james/imap/jcr/ jcr/src/main/java/org/apache/james/imap/jcr/mail/ jcr/src/main/java/org/apache/james/imap/jcr/mail/m...

Author: norman
Date: Mon Mar 15 14:57:08 2010
New Revision: 923276

URL: http://svn.apache.org/viewvc?rev=923276&view=rev
Log:
Some more fixes for JCR (IMAP-93). Still investigate in bugs..

Modified:
    james/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jcr/JCRHostSystem.java
    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/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/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/JCRHeader.java
    james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMailbox.java
    james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMailboxMembership.java
    james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMessage.java
    james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRProperty.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/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java
    james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java

Modified: james/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jcr/JCRHostSystem.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jcr/JCRHostSystem.java?rev=923276&r1=923275&r2=923276&view=diff
==============================================================================
--- james/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jcr/JCRHostSystem.java (original)
+++ james/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jcr/JCRHostSystem.java Mon Mar 15 14:57:08 2010
@@ -92,12 +92,7 @@ public class JCRHostSystem extends ImapH
     public void resetData() throws Exception {
         resetUserMetaData();
 
-    	Session session = repository.login(new SimpleCredentials("user", new char[0]), "default");
-        javax.jcr.Node root = session.getRootNode();
-        if (root.hasNode("mailboxes")) {
-        	root.getNode("mailboxes").remove();
-        }
-        session.save();
+        mailboxManager.deleteEverything();
         //repository.shutdown();
     }
     

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=923276&r1=923275&r2=923276&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 Mon Mar 15 14:57:08 2010
@@ -26,12 +26,15 @@ import javax.jcr.Session;
 import javax.jcr.SimpleCredentials;
 
 import org.apache.james.imap.api.display.HumanReadableText;
+import org.apache.james.imap.jcr.mail.JCRMailboxMapper;
 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.MailboxMapper;
 import org.apache.james.imap.store.mail.model.Mailbox;
+import org.apache.james.imap.store.transaction.TransactionalMapper;
 
 /**
  * JCR based MailboxManager which use the same username and password to obtain a
@@ -56,6 +59,20 @@ public class JCRGlobalUserMailboxManager
     }
 
 
+    public void deleteEverything() throws MailboxException {
+        Session session = getSession(null);
+        final MailboxMapper mapper = new JCRMailboxMapper(session,getLog());
+        mapper.execute(new TransactionalMapper.Transaction() {
+
+            public void run() throws MailboxException {
+                mapper.deleteAll(); 
+                mailboxes.clear();
+            }
+            
+        });
+        session.logout();
+    }
+    
     @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());

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=923276&r1=923275&r2=923276&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 Mon Mar 15 14:57:08 2010
@@ -100,12 +100,15 @@ public class JCRMailbox extends StoreMai
     @Override
     protected MessageMapper createMessageMapper(MailboxSession session) throws MailboxException {
         PasswordAwareUser user = (PasswordAwareUser)getMailboxSession().getUser();
+       
+        
         JCRMessageMapper messageMapper = (JCRMessageMapper) session.getAttributes().get(MESSAGE_MAPPER);
         if (messageMapper == null) {
             messageMapper = new JCRMessageMapper(getSession(user), getMailboxUUID(), log);
             session.getAttributes().put(MESSAGE_MAPPER, messageMapper);
         }
         return messageMapper;
+     
     }
 
     protected JCRMailboxMapper createMailboxMapper(MailboxSession session) throws MailboxException {
@@ -116,6 +119,7 @@ public class JCRMailbox extends StoreMai
             session.getAttributes().put(MAILBOX_MAPPER, mapper);
         }
         return mapper;
+
     }
     
     @Override
@@ -166,13 +170,10 @@ public class JCRMailbox extends StoreMai
 
     @Override
     protected void onLogout(MailboxSession session) {
+        
         JCRMessageMapper mapper =  (JCRMessageMapper) session.getAttributes().get(MESSAGE_MAPPER);
         if (mapper != null) {
             mapper.destroy();
         }
-        JCRMailboxMapper mailboxMapper = (JCRMailboxMapper) session.getAttributes().get(MAILBOX_MAPPER);
-        if (mailboxMapper != null) {
-            mailboxMapper.destroy();
-        }
     }
 }

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=923276&r1=923275&r2=923276&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 Mon Mar 15 14:57:08 2010
@@ -55,13 +55,13 @@ public class JCRMailboxManager extends S
     private final Repository repository;
     private final String workspace;
     private final Log logger = LogFactory.getLog(JCRMailboxManager.class);
-    public final static String MAPPER = "MAILBOX_MAPPER";
     public JCRMailboxManager(final Authenticator authenticator, final Subscriber subscriber, final Repository repository, final String workspace) {
         super(authenticator, subscriber);
         this.repository = repository;
         this.workspace = workspace;
     }
 
+    
     @Override
     protected StoreMailbox createMailbox(Mailbox mailboxRow, MailboxSession session) {
         JCRMailbox mailbox = new JCRMailbox((org.apache.james.imap.jcr.mail.model.JCRMailbox) mailboxRow, session, getRepository(), getWorkspace(), getLog());
@@ -70,10 +70,11 @@ public class JCRMailboxManager extends S
 
     @Override
     protected MailboxMapper createMailboxMapper(MailboxSession session) throws MailboxException {
-        JCRMailboxMapper mapper = (JCRMailboxMapper) session.getAttributes().get(MAPPER);
+
+        JCRMailboxMapper mapper = (JCRMailboxMapper) session.getAttributes().get(JCRMailbox.MAILBOX_MAPPER);
         if (mapper == null) {
             mapper = new JCRMailboxMapper(getSession(session), logger);
-            session.getAttributes().put(MAPPER, mapper);
+            session.getAttributes().put(JCRMailbox.MAILBOX_MAPPER, mapper);
         }
         return mapper;
 
@@ -144,7 +145,7 @@ public class JCRMailboxManager extends S
 
     @Override
     protected void onLogout(MailboxSession session) {
-        JCRMailboxMapper mapper = (JCRMailboxMapper) session.getAttributes().get(MAPPER);
+        JCRMailboxMapper mapper = (JCRMailboxMapper) session.getAttributes().get(JCRMailbox.MAILBOX_MAPPER);
         if (mapper != null) {
             mapper.destroy();
         }

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=923276&r1=923275&r2=923276&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 Mar 15 14:57:08 2010
@@ -66,6 +66,8 @@ public class JCRMailboxMapper extends JC
     public long countMailboxesWithName(String name) throws StorageException {
        
         try {
+            getSession().refresh(true);
+
         	QueryManager manager = getSession().getWorkspace().getQueryManager();
         	String queryString =  "//" + PATH + "//element(*)[@" + JCRMailbox.NAME_PROPERTY + "='" + name + "']";
         	QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
@@ -96,6 +98,8 @@ public class JCRMailboxMapper extends JC
      */
     public void delete(Mailbox mailbox) throws StorageException {
         try {
+            getSession().refresh(true);
+
         	getSession().getNodeByUUID(((JCRMailbox) mailbox).getUUID()).remove();
             getSession().save();
         } catch (PathNotFoundException e) {
@@ -113,6 +117,8 @@ public class JCRMailboxMapper extends JC
      */
     public void deleteAll() throws StorageException {
         try {
+            getSession().refresh(true);
+
             getSession().getRootNode().getNode(PATH).remove();
             getSession().save();
 
@@ -134,6 +140,8 @@ public class JCRMailboxMapper extends JC
      */
     public boolean existsMailboxStartingWith(String mailboxName) throws StorageException {
         try {
+            getSession().refresh(true);
+
         	QueryManager manager = getSession().getWorkspace().getQueryManager();
         	String queryString = "//" + PATH + "//element(*)[jcr:like(@" + JCRMailbox.NAME_PROPERTY + ",'" +mailboxName+"%')]";
         	QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
@@ -155,6 +163,8 @@ public class JCRMailboxMapper extends JC
 
     public Mailbox findMailboxByUUID(String uuid) throws StorageException, MailboxNotFoundException {
     	try {
+            getSession().refresh(true);
+
             return new JCRMailbox(getSession().getNodeByUUID(uuid),logger);
         } catch (PathNotFoundException e) {
             throw new MailboxNotFoundException(uuid);
@@ -172,6 +182,8 @@ public class JCRMailboxMapper extends JC
      */
     public Mailbox findMailboxByName(String name) throws StorageException, MailboxNotFoundException {
         try {
+            getSession().refresh(true);
+
         	QueryManager manager = getSession().getWorkspace().getQueryManager();
         	String queryString = "//" + PATH + "//element(*)[@" + JCRMailbox.NAME_PROPERTY + "='" + name + "']";
         	QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
@@ -197,7 +209,9 @@ public class JCRMailboxMapper extends JC
      */
     public List<Mailbox> findMailboxWithNameLike(String name) throws StorageException {
         List<Mailbox> mailboxList = new ArrayList<Mailbox>();
-        try {        	
+        try {       
+            getSession().refresh(true);
+
         	QueryManager manager = getSession().getWorkspace().getQueryManager();
         	String queryString = "//" + PATH + "//element(*)[jcr:like(@" + JCRMailbox.NAME_PROPERTY + ",'%" + name + "%')]";
         	QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
@@ -224,16 +238,22 @@ public class JCRMailboxMapper extends JC
         
         String nodePath = JCRUtils.createPath(PATH,mailbox.getName());
         try {
+            getSession().refresh(true);
+
             createPathIfNotExists();
+            JCRMailbox jcrMailbox = (JCRMailbox)mailbox;
+            
 
             Node node;
-            if (getSession().getRootNode().hasNode(nodePath)) {
-                node = getSession().getRootNode().getNode(nodePath);
-            } else {
+            if (jcrMailbox.isPersistent() == false) {
                 node = getSession().getRootNode().addNode(nodePath);
                 node.addMixin(JcrConstants.MIX_REFERENCEABLE);
+            } else {
+                node = jcrMailbox.getNode();
             }
-            ((JCRMailbox)mailbox).merge(node);
+            
+            jcrMailbox.merge(node);
+
             getSession().save();
         } catch (RepositoryException e) {
         	e.printStackTrace();
@@ -246,6 +266,8 @@ public class JCRMailboxMapper extends JC
         JCRMailbox mailbox = (JCRMailbox) findMailboxByUUID(uuid);
         mailbox.consumeUid();
         try {
+            getSession().refresh(true);
+
             getSession().save();
         } catch (PathNotFoundException e) {
             throw new MailboxNotFoundException(uuid);
@@ -257,6 +279,8 @@ public class JCRMailboxMapper extends JC
     }
     
     protected void createPathIfNotExists() throws RepositoryException, PathNotFoundException {
+        getSession().refresh(true);
+
         if (getSession().getRootNode().hasNode(JCRUtils.createPath(PATH)) == false) {
             getSession().getRootNode().addNode(JCRUtils.createPath(PATH));
         }

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=923276&r1=923275&r2=923276&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 Mar 15 14:57:08 2010
@@ -49,7 +49,7 @@ public class JCRMessageMapper extends JC
 
     private final static String PATH = PROPERTY_PREFIX + "mailboxMemberships";
     private final Log logger;
-    private String uuid;
+    private final String uuid;
 
     public JCRMessageMapper(final Session session, final String uuid, final Log logger) {
         super(session);
@@ -64,8 +64,10 @@ public class JCRMessageMapper extends JC
      * org.apache.james.imap.store.mail.MessageMapper#countMessagesInMailbox()
      */
     public long countMessagesInMailbox() throws StorageException {
-       
+        
         try {
+            getSession().refresh(true);
+
             String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY +"='" + uuid +"']";
             QueryManager manager = getSession().getWorkspace().getQueryManager();
             QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
@@ -97,6 +99,8 @@ public class JCRMessageMapper extends JC
     public long countUnseenMessagesInMailbox() throws StorageException {
         
         try {
+            getSession().refresh(true);
+
             String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY +"='" + uuid +"'] AND [@" + JCRMailboxMembership.SEEN_PROPERTY +"='false']";
             QueryManager manager = getSession().getWorkspace().getQueryManager();
             QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
@@ -129,6 +133,8 @@ public class JCRMessageMapper extends JC
         JCRMailboxMembership membership = (JCRMailboxMembership) message;
         if (membership.isPersistent()) {
             try {
+                getSession().refresh(true);
+
                 getSession().getNodeByUUID(membership.getUUID()).remove();
                 getSession().save();
             } catch (RepositoryException e) {
@@ -175,7 +181,10 @@ public class JCRMessageMapper extends JC
 
     private List<MailboxMembership> findMessagesInMailboxAfterUID(String uuid, long uid) throws RepositoryException {
         List<MailboxMembership> list = new ArrayList<MailboxMembership>();
-        String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY + "='" + uuid + "'] AND [@" + JCRMailboxMembership.UID_PROPERTY + ">" + uid + "]";
+        String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY + "='" + uuid + "'] AND [@" + JCRMailboxMembership.UID_PROPERTY + ">=" + uid + "]";
+
+        getSession().refresh(true);
+
         QueryManager manager = getSession().getWorkspace().getQueryManager();
         QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
 
@@ -189,6 +198,9 @@ public class JCRMessageMapper extends JC
     private List<MailboxMembership> findMessagesInMailboxWithUID(String uuid, long uid) throws RepositoryException  {
         List<MailboxMembership> list = new ArrayList<MailboxMembership>();
         String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY + "='" + uuid + "'] AND [@" + JCRMailboxMembership.UID_PROPERTY + "=" + uid + "]";
+
+        getSession().refresh(true);
+
         QueryManager manager = getSession().getWorkspace().getQueryManager();
         QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
 
@@ -201,7 +213,29 @@ public class JCRMessageMapper extends JC
 
     private List<MailboxMembership> findMessagesInMailboxBetweenUIDs(String uuid, long from, long to) throws RepositoryException {
         List<MailboxMembership> list = new ArrayList<MailboxMembership>();
-        String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY + "='" + uuid + "'] AND [@" + JCRMailboxMembership.UID_PROPERTY + ">" + from + "] AND [@" + JCRMailboxMembership.UID_PROPERTY + "<" + to + "]";
+        String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY + "='" + uuid + "'] AND [@" + JCRMailboxMembership.UID_PROPERTY + ">=" + from + "] AND [@" + JCRMailboxMembership.UID_PROPERTY + "<=" + to + "]";
+       
+        getSession().refresh(true);
+
+        
+        QueryManager manager = getSession().getWorkspace().getQueryManager();
+        QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
+
+        NodeIterator iterator = result.getNodes();
+        while (iterator.hasNext()) {
+            list.add(new JCRMailboxMembership(iterator.nextNode(), logger));
+        }
+        return list;
+    }
+    
+    private List<MailboxMembership> findMessagesInMailbox(String uuid) throws RepositoryException {        
+        List<MailboxMembership> list = new ArrayList<MailboxMembership>();
+        
+        String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY +"='" + uuid +"']";
+        
+        getSession().refresh(true);
+
+        
         QueryManager manager = getSession().getWorkspace().getQueryManager();
         QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
 
@@ -212,10 +246,48 @@ public class JCRMessageMapper extends JC
         return list;
     }
 
-    private List<MailboxMembership> findMessagesInMailbox(String uuid) throws RepositoryException {
+    
+    
+    private List<MailboxMembership> findDeletedMessagesInMailboxAfterUID(String uuid, long uid) throws RepositoryException {
+        List<MailboxMembership> list = new ArrayList<MailboxMembership>();
+        String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY + "='" + uuid + "'] AND [@" + JCRMailboxMembership.UID_PROPERTY + ">=" + uid + "] AND [@" + JCRMailboxMembership.DELETED_PROPERTY+ "='true']";
         
+        getSession().refresh(true);
+
+        
+        QueryManager manager = getSession().getWorkspace().getQueryManager();
+        QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
+
+        NodeIterator iterator = result.getNodes();
+        while (iterator.hasNext()) {
+            list.add(new JCRMailboxMembership(iterator.nextNode(), logger));
+        }
+        return list;
+    }
+
+    private List<MailboxMembership> findDeletedMessagesInMailboxWithUID(String uuid, long uid) throws RepositoryException  {
         List<MailboxMembership> list = new ArrayList<MailboxMembership>();
-        String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY +"='" + uuid +"']";
+        String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY + "='" + uuid + "'] AND [@" + JCRMailboxMembership.UID_PROPERTY + "=" + uid + "] AND [@" + JCRMailboxMembership.DELETED_PROPERTY+ "='true']";
+
+        getSession().refresh(true);
+
+        QueryManager manager = getSession().getWorkspace().getQueryManager();
+        QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
+
+        NodeIterator iterator = result.getNodes();
+        while (iterator.hasNext()) {
+            JCRMailboxMembership member = new JCRMailboxMembership(iterator.nextNode(), logger);
+            list.add(member);
+        }
+        return list;
+    }
+
+    private List<MailboxMembership> findDeletedMessagesInMailboxBetweenUIDs(String uuid, long from, long to) throws RepositoryException {
+        List<MailboxMembership> list = new ArrayList<MailboxMembership>();
+        String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY + "='" + uuid + "'] AND [@" + JCRMailboxMembership.UID_PROPERTY + ">=" + from + "] AND [@" + JCRMailboxMembership.UID_PROPERTY + "<=" + to + "] AND [@" + JCRMailboxMembership.DELETED_PROPERTY+ "='true']";
+       
+        getSession().refresh(true);
+
         QueryManager manager = getSession().getWorkspace().getQueryManager();
         QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
 
@@ -225,6 +297,24 @@ public class JCRMessageMapper extends JC
         }
         return list;
     }
+    
+    private List<MailboxMembership> findDeletedMessagesInMailbox(String uuid) throws RepositoryException {
+        
+        List<MailboxMembership> list = new ArrayList<MailboxMembership>();
+        String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY +"='" + uuid +"'] AND [@" + JCRMailboxMembership.DELETED_PROPERTY+ "='true']";
+        
+        getSession().refresh(true);
+
+        QueryManager manager = getSession().getWorkspace().getQueryManager();
+        QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
+
+        NodeIterator iterator = result.getNodes();
+        while (iterator.hasNext()) {
+            JCRMailboxMembership member = new JCRMailboxMembership(iterator.nextNode(), logger);
+            list.add(member);
+        }
+        return list;
+    }
 
     /*
      * (non-Javadoc)
@@ -235,16 +325,26 @@ public class JCRMessageMapper extends JC
      */
     public List<MailboxMembership> findMarkedForDeletionInMailbox(MessageRange set) throws StorageException {
         try {
-            List<MailboxMembership> list = new ArrayList<MailboxMembership>();
-            String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY +"='" + uuid +"'] AND [@" + JCRMailboxMembership.DELETED_PROPERTY +"='true']";
-            QueryManager manager = getSession().getWorkspace().getQueryManager();
-            QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
-            
-            NodeIterator iterator = result.getNodes();
-            while(iterator.hasNext()) {
-                list.add(new JCRMailboxMembership(iterator.nextNode(), logger));
+            final List<MailboxMembership> results;
+            final long from = set.getUidFrom();
+            final long to = set.getUidTo();
+            final Type type = set.getType();
+            switch (type) {
+                default:
+                case ALL:
+                    results = findDeletedMessagesInMailbox(uuid);
+                    break;
+                case FROM:
+                    results = findDeletedMessagesInMailboxAfterUID(uuid, from);
+                    break;
+                case ONE:
+                    results = findDeletedMessagesInMailboxWithUID(uuid, from);
+                    break;
+                case RANGE:
+                    results = findDeletedMessagesInMailboxBetweenUIDs(uuid, from, to);
+                    break;       
             }
-            return list;
+            return results;
         } catch (RepositoryException e) {
             e.printStackTrace();
             throw new StorageException(HumanReadableText.SEARCH_FAILED, e);
@@ -263,6 +363,9 @@ public class JCRMessageMapper extends JC
         try {
             List<MailboxMembership> list = new ArrayList<MailboxMembership>();
             String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY +"='" + uuid +"'] AND [@" + JCRMailboxMembership.RECENT_PROPERTY +"='true']";
+            
+            getSession().refresh(true);
+
             QueryManager manager = getSession().getWorkspace().getQueryManager();
             QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
             
@@ -286,7 +389,10 @@ public class JCRMessageMapper extends JC
     public List<MailboxMembership> findUnseenMessagesInMailboxOrderByUid() throws StorageException {
         try {
             List<MailboxMembership> list = new ArrayList<MailboxMembership>();
-            String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY +"='" + uuid +"'] AND [@" + JCRMailboxMembership.SEEN_PROPERTY +"='false'] order by @" + JCRMailboxMembership.UID_PROPERTY;
+            String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY +"='" + uuid +"'] AND [@" + JCRMailboxMembership.SEEN_PROPERTY +"='false'] order by @" + JCRMailboxMembership.UID_PROPERTY + " ASC";
+          
+            getSession().refresh(true);
+
             QueryManager manager = getSession().getWorkspace().getQueryManager();
             QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
             
@@ -309,18 +415,23 @@ public class JCRMessageMapper extends JC
      * imap.store.mail.model.MailboxMembership)
      */
     public void save(MailboxMembership message) throws StorageException {
-        Node messageNode;
         JCRMailboxMembership membership = (JCRMailboxMembership) message;
         try {
+            getSession().refresh(true);
+
             createPathIfNotExists();
-            
-            if (membership.isPersistent()) {
-                messageNode = getSession().getNodeByUUID(membership.getUUID());
-            } else {
+            Node messageNode;
+
+            if (membership.isPersistent() == false) {
                 messageNode = getSession().getRootNode().addNode(JCRUtils.createPath(PATH, String.valueOf(membership.getUid())));
                 messageNode.addMixin(JcrConstants.MIX_REFERENCEABLE);
+
+            } else {
+                messageNode = membership.getNode();
             }
+            
             membership.merge(messageNode);
+
             getSession().save();
 
        
@@ -342,6 +453,10 @@ public class JCRMessageMapper extends JC
         try {
             List<MailboxMembership> list = new ArrayList<MailboxMembership>();
             final String xpathQuery = formulateXPath(uuid, query);
+           
+            getSession().refresh(true);
+
+            
             QueryManager manager = getSession().getWorkspace().getQueryManager();
             QueryResult result = manager.createQuery(xpathQuery, Query.XPATH).execute();
             
@@ -392,6 +507,8 @@ public class JCRMessageMapper extends JC
     
 
     protected void createPathIfNotExists() throws RepositoryException, PathNotFoundException {
+        getSession().refresh(true);
+
         if (getSession().getRootNode().hasNode(JCRUtils.createPath(PATH)) == false) {
             getSession().getRootNode().addNode(JCRUtils.createPath(PATH));
         }

Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRHeader.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRHeader.java?rev=923276&r1=923275&r2=923276&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRHeader.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRHeader.java Mon Mar 15 14:57:08 2010
@@ -133,14 +133,16 @@ public class JCRHeader extends AbstractC
      * @see org.apache.james.imap.jcr.IsPersistent#merge(javax.jcr.Node)
      */
     public void merge(Node node) throws RepositoryException {
-        node.setProperty(FIELDNAME_PROPERTY, fieldName);
-        node.setProperty(LINENUMBER_PROPERTY, lineNumber);
-        node.setProperty(VALUE_PROPERTY, value);
+        node.setProperty(FIELDNAME_PROPERTY, getFieldName());
+        node.setProperty(LINENUMBER_PROPERTY, getLineNumber());
+        node.setProperty(VALUE_PROPERTY, getValue());
         
+        /*
         this.node = node;
         
         this.fieldName = null;
         this.lineNumber = 0;
         this.value = null;
+        */
     }
 }

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=923276&r1=923275&r2=923276&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 Mon Mar 15 14:57:08 2010
@@ -91,7 +91,7 @@ public class JCRMailbox implements Mailb
             try {
                 return node.getProperty(LASTUID_PROPERTY).getLong();
             } catch (RepositoryException e) {
-                logger.error("Unable to access property " + ID_PROPERTY, e);
+                logger.error("Unable to access property " + LASTUID_PROPERTY, e);
             }
         }
         return lastUid;
@@ -173,16 +173,18 @@ public class JCRMailbox implements Mailb
      * @see org.apache.james.imap.jcr.Persistent#merge(javax.jcr.Node)
      */
     public void  merge(Node node) throws RepositoryException {
-        node.setProperty(ID_PROPERTY,  id);
-        node.setProperty(NAME_PROPERTY, name);
-        node.setProperty(UIDVALIDITY_PROPERTY, uidValidity);
-        node.setProperty(LASTUID_PROPERTY, lastUid);   
+        node.setProperty(ID_PROPERTY,  getMailboxId());
+        node.setProperty(NAME_PROPERTY, getName());
+        node.setProperty(UIDVALIDITY_PROPERTY, getUidValidity());
+        node.setProperty(LASTUID_PROPERTY, getLastUid());   
         
         this.node = node;
+        /*
         id = 0;
         lastUid = 0;
         name = null;
         uidValidity = 0;
+        */
     }
     
     public String getUUID() {

Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMailboxMembership.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMailboxMembership.java?rev=923276&r1=923275&r2=923276&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMailboxMembership.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMailboxMembership.java Mon Mar 15 14:57:08 2010
@@ -124,6 +124,14 @@ public class JCRMailboxMembership extend
 	 * org.apache.james.imap.store.mail.model.MailboxMembership#getDocument()
 	 */
 	public Document getDocument() {
+	    if (isPersistent()) {
+	        try {
+	            return new JCRMessage(node.getNode(MESSAGE_NODE), logger);
+	        } catch (RepositoryException e) {
+                logger.error("Unable to access node " + MESSAGE_NODE,
+                                e);
+            }
+	    }
 		return message;
 	}
 
@@ -137,12 +145,10 @@ public class JCRMailboxMembership extend
 	public Date getInternalDate() {
 		if (isPersistent()) {
 			try {
-				return node.getProperty(INTERNAL_DATE_PROPERTY).getDate()
-						.getTime();
+				return node.getProperty(INTERNAL_DATE_PROPERTY).getDate().getTime();
 
 			} catch (RepositoryException e) {
-				logger
-						.error("Unable to access property " + FLAGGED_PROPERTY,
+				logger.error("Unable to access property " + FLAGGED_PROPERTY,
 								e);
 			}
 			return null;
@@ -413,32 +419,38 @@ public class JCRMailboxMembership extend
 	 * @see org.apache.james.imap.jcr.Persistent#merge(javax.jcr.Node)
 	 */
 	public void merge(Node node) throws RepositoryException {
-		node.setProperty(MAILBOX_UUID_PROPERTY, mailboxUUID);
-		node.setProperty(UID_PROPERTY, uid);
-		node.setProperty(SIZE_PROPERTY, size);
-		node.setProperty(ANSWERED_PROPERTY, answered);
-		node.setProperty(DELETED_PROPERTY, deleted);
-		node.setProperty(DRAFT_PROPERTY, draft);
-		node.setProperty(FLAGGED_PROPERTY, flagged);
-		node.setProperty(RECENT_PROPERTY, recent);
+		node.setProperty(MAILBOX_UUID_PROPERTY, getMailboxUUID());
+		node.setProperty(UID_PROPERTY, getUid());
+		node.setProperty(SIZE_PROPERTY, getSize());
+		node.setProperty(ANSWERED_PROPERTY, isAnswered());
+		node.setProperty(DELETED_PROPERTY, isDeleted());
+		node.setProperty(DRAFT_PROPERTY, isDraft());
+		node.setProperty(FLAGGED_PROPERTY, isFlagged());
+		node.setProperty(RECENT_PROPERTY, isRecent());
 		
-		node.setProperty(SEEN_PROPERTY, seen);
+		node.setProperty(SEEN_PROPERTY, isSeen());
+		
+		if (getInternalDate() == null) {
+		    internalDate = new Date();
+		}
 		
 		Calendar cal = Calendar.getInstance();
-		cal.setTime(internalDate);
+		
+		cal.setTime(getInternalDate());
 		node.setProperty(INTERNAL_DATE_PROPERTY, cal);
 
 		Node messageNode;
 		if (node.hasNode(MESSAGE_NODE)) {
 		    messageNode = node.getNode(MESSAGE_NODE);
 		} else {
-	        messageNode = node.addNode("message");
+	        messageNode = node.addNode(MESSAGE_NODE);
 	        messageNode.addMixin(JcrConstants.MIX_REFERENCEABLE);
 		}
-		message.merge(messageNode);
+		((JCRMessage)getDocument()).merge(messageNode);
 
 		this.node = node;
 
+		/*
 		answered = false;
 		deleted = false;
 		draft = false;
@@ -450,6 +462,7 @@ public class JCRMailboxMembership extend
 		seen = false;
 		size = 0;
 		uid = 0;
+		*/
 	}
 
 }

Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMessage.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMessage.java?rev=923276&r1=923275&r2=923276&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMessage.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMessage.java Mon Mar 15 14:57:08 2010
@@ -292,15 +292,15 @@ public class JCRMessage extends Abstract
         } else {
             contentNode = node.getNode(JcrConstants.JCR_CONTENT);
         }
-        contentNode.setProperty(JcrConstants.JCR_DATA, new ByteArrayInputStream(content));
-        contentNode.setProperty(JcrConstants.JCR_MIMETYPE, mediaType);
+        contentNode.setProperty(JcrConstants.JCR_DATA, new ByteArrayInputStream(getFullContent().array()));
+        contentNode.setProperty(JcrConstants.JCR_MIMETYPE, getMediaType());
 
-        node.setProperty(FULL_CONTENT_OCTETS_PROPERTY, fullContentOctets);
-        if (textualLineCount != null) {
-            node.setProperty(TEXTUAL_LINE_COUNT_PROPERTY, textualLineCount);
+        node.setProperty(FULL_CONTENT_OCTETS_PROPERTY, getFullContentOctets());
+        if (getTextualLineCount() != null) {
+            node.setProperty(TEXTUAL_LINE_COUNT_PROPERTY, getTextualLineCount());
         }
-        node.setProperty(SUBTYPE_PROPERTY, subType);
-        node.setProperty(BODY_START_OCTET_PROPERTY, new Long(bodyStartOctet));
+        node.setProperty(SUBTYPE_PROPERTY, getSubType());
+        node.setProperty(BODY_START_OCTET_PROPERTY, getBodyStartOctet());
 
         Node headersNode;
         if (node.hasNode(HEADERS_NODE)) {
@@ -310,8 +310,8 @@ public class JCRMessage extends Abstract
             headersNode = node.addNode(HEADERS_NODE);
         }
         
-        for (int i = 0; i < headers.size(); i++) {
-            JCRHeader header = (JCRHeader) headers.get(i);
+        for (int i = 0; i < getHeaders().size(); i++) {
+            JCRHeader header = (JCRHeader) getHeaders().get(i);
             Node headerNode = headersNode.addNode(header.getFieldName());
             header.merge(headerNode);
         }
@@ -325,22 +325,24 @@ public class JCRMessage extends Abstract
             propertiesNode = node.addNode(PROPERTIES_NODE);
         }
         
-        for (int i = 0; i < properties.size(); i++) {
-            JCRProperty prop = (JCRProperty) properties.get(i);
+        for (int i = 0; i < getProperties().size(); i++) {
+            JCRProperty prop = (JCRProperty) getProperties().get(i);
             Node propNode = propertiesNode.addNode(JCRUtils.createPath(prop.getNamespace()+ "." + prop.getLocalName()));
             prop.merge(propNode);
         }
       
         this.node = node;
 
+        /*
         content = null;
-        headers = null;
+        headers = new ArrayList<JCRHeader>();
         fullContentOctets = 0;
         mediaType = null;
         textualLineCount = null;
         subType = null;
         properties = null;
         bodyStartOctet = 0;
+        */
 
     }
     

Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRProperty.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRProperty.java?rev=923276&r1=923275&r2=923276&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRProperty.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRProperty.java Mon Mar 15 14:57:08 2010
@@ -156,16 +156,17 @@ public class JCRProperty extends Abstrac
      * @see org.apache.james.imap.jcr.IsPersistent#merge(javax.jcr.Node)
      */
     public void merge(Node node) throws RepositoryException {
-        node.setProperty(NAMESPACE_PROPERTY, namespace);
-        node.setProperty(ORDER_PROPERTY, order);
-        node.setProperty(LOCALNAME_PROPERTY, localName);
-        node.setProperty(VALUE_PROPERTY, value);
+        node.setProperty(NAMESPACE_PROPERTY, getNamespace());
+        node.setProperty(ORDER_PROPERTY, getOrder());
+        node.setProperty(LOCALNAME_PROPERTY, getLocalName());
+        node.setProperty(VALUE_PROPERTY, getValue());
 
         this.node = node;
-        
+        /*
         namespace = null;
         order = 0;
         localName = null;
         value = null;
+        */
     }
 }

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=923276&r1=923275&r2=923276&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 Mon Mar 15 14:57:08 2010
@@ -142,22 +142,19 @@ public class JCRSubscriptionMapper exten
     public void save(Subscription subscription) throws SubscriptionException {
         String username = subscription.getUser();
         String mailbox = subscription.getMailbox();
-        String nodename = JCRUtils.createPath(username, mailbox);
+        String nodename = JCRUtils.createPath(PATH, username, mailbox);
         try {
             createPathIfNotExists(PATH);
-            Node node = getSession().getRootNode().getNode(PATH);
-            Node subNode;
-            if (node.hasNode(nodename)) {
-                subNode = node.getNode(nodename);
+            Node node;
+            JCRSubscription sub = (JCRSubscription) subscription;
+            if (sub.isPersistent() == false) {
+                 node = getSession().getRootNode().getNode(nodename);
+               
             } else {
-                if (node.hasNode(username) == false) {
-                    node.addNode(username);
-                }
-                subNode = node.addNode(nodename);
+                node = sub.getNode();
             }
-
             // Copy new properties to the node
-            ((JCRSubscription)subscription).merge(subNode);
+            sub.merge(node);
 
             getSession().save();
         } catch (RepositoryException 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=923276&r1=923275&r2=923276&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 Mon Mar 15 14:57:08 2010
@@ -109,12 +109,14 @@ public class JCRSubscription implements 
      * @see org.apache.james.imap.jcr.IsPersistent#merge(javax.jcr.Node)
      */
     public void merge(Node node) throws RepositoryException{
+        node.setProperty(USERNAME_PROPERTY, getUser());
+        node.setProperty(MAILBOX_PROPERTY, getMailbox());
         this.node = node;
-        node.setProperty(USERNAME_PROPERTY, username);
-        node.setProperty(MAILBOX_PROPERTY, mailbox);
 
+        /*
         mailbox = null;
         username = null;
+        */
     }
 
 }

Modified: james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java?rev=923276&r1=923275&r2=923276&view=diff
==============================================================================
--- james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java (original)
+++ james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java Mon Mar 15 14:57:08 2010
@@ -358,6 +358,9 @@ public abstract class StoreMailbox imple
                     results.add(member.getUid());
                     if (reset) {
                         member.unsetRecent();
+                        
+                        // persist this to db
+                        mapper.save(member);
                     }
                 }
             }
@@ -439,6 +442,7 @@ public abstract class StoreMailbox imple
 
             public void run() throws MailboxException {
                 final List<MailboxMembership> members = mapper.findInMailbox(set);
+                System.out.println("FOUND=" + members.size());
                 for (final MailboxMembership member:members) {
                     originalFlagsByUid.put(member.getUid(), member.createFlags());
                     if (replace) {

Modified: james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java?rev=923276&r1=923275&r2=923276&view=diff
==============================================================================
--- james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java (original)
+++ james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java Mon Mar 15 14:57:08 2010
@@ -136,7 +136,7 @@ public abstract class StoreMailboxManage
                     mailboxes.put(mailboxName, result);
                     
                     // store the mailbox in the session so we can cleanup things later
-                    session.getAttributes().put(MAILBOX, result);
+                    //session.getAttributes().put(MAILBOX, result);
                 }
                 return result;
             }



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org