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/14 14:36:01 UTC

svn commit: r922842 - in /james/imap/trunk: jcr/src/main/java/org/apache/james/imap/jcr/mail/ jcr/src/main/java/org/apache/james/imap/jcr/mail/model/ jcr/src/main/java/org/apache/james/imap/jcr/user/ store/src/main/java/org/apache/james/imap/store/

Author: norman
Date: Sun Mar 14 13:36:01 2010
New Revision: 922842

URL: http://svn.apache.org/viewvc?rev=922842&view=rev
Log:
Fix some bugs in JCR implementation mostly XPath queries (IMAP-93)

Modified:
    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
    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/user/JCRSubscriptionMapper.java
    james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java

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=922842&r1=922841&r2=922842&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 Sun Mar 14 13:36:01 2010
@@ -101,6 +101,7 @@ public class JCRMailboxMapper extends JC
         } catch (PathNotFoundException e) {
             // mailbox does not exists..
         } catch (RepositoryException e) {
+            e.printStackTrace();
             throw new StorageException(HumanReadableText.DELETED_FAILED, e);
         }
     }
@@ -118,12 +119,14 @@ public class JCRMailboxMapper extends JC
         } catch (PathNotFoundException e) {
             // nothing todo
         } catch (RepositoryException e) {
-        	
+        	e.printStackTrace();
             throw new StorageException(HumanReadableText.DELETED_FAILED, e);
         }
     }
 
     /*
+     * TODO: This is not really efficient..
+     * 
      * (non-Javadoc)
      * 
      * @see
@@ -133,10 +136,18 @@ public class JCRMailboxMapper extends JC
     public boolean existsMailboxStartingWith(String mailboxName) throws StorageException {
         try {
         	QueryManager manager = getSession().getWorkspace().getQueryManager();
-        	String queryString = "//" + PATH + "//element(*)[jcr:contains(@" + JCRMailbox.NAME_PROPERTY + ",'" + mailboxName + "*')]";
+        	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();
+        	while (it.hasNext()) {
+        	    Node nextNode = it.nextNode();
+        	    String name = nextNode.getProperty(JCRMailbox.NAME_PROPERTY).getString();
+        	    System.out.println("NAME=" + name);
+        	    if (name.startsWith(mailboxName)) {
+        	        return true;
+        	    }
+        	}
+        	return false;
         } catch (RepositoryException e) {
             throw new StorageException(HumanReadableText.SEARCH_FAILED, e);
         }
@@ -152,7 +163,6 @@ public class JCRMailboxMapper extends JC
     }
 
     public Mailbox findMailboxByUUID(String uuid) throws StorageException, MailboxNotFoundException {
-        System.out.println("UUID="+uuid);
     	try {
             return new JCRMailbox(getSession().getNodeByUUID(uuid),logger);
         } catch (PathNotFoundException e) {
@@ -198,7 +208,7 @@ public class JCRMailboxMapper extends JC
         List<Mailbox> mailboxList = new ArrayList<Mailbox>();
         try {        	
         	QueryManager manager = getSession().getWorkspace().getQueryManager();
-        	String queryString = "//" + PATH + "//element(*)[jcr:contains(@" + JCRMailbox.NAME_PROPERTY + ",'*" + name + "*')]";
+        	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()) {
@@ -234,7 +244,6 @@ public class JCRMailboxMapper extends JC
             }
             ((JCRMailbox)mailbox).merge(node);
             getSession().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=922842&r1=922841&r2=922842&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 Sun Mar 14 13:36:01 2010
@@ -23,6 +23,7 @@ import java.util.List;
 
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
+import javax.jcr.PathNotFoundException;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.query.Query;
@@ -30,6 +31,7 @@ import javax.jcr.query.QueryManager;
 import javax.jcr.query.QueryResult;
 
 import org.apache.commons.logging.Log;
+import org.apache.jackrabbit.JcrConstants;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.jcr.JCRMapper;
 import org.apache.james.imap.jcr.JCRUtils;
@@ -67,8 +69,19 @@ public class JCRMessageMapper extends JC
             String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY +"='" + uuid +"']";
             QueryManager manager = getSession().getWorkspace().getQueryManager();
             QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
-            return result.getNodes().getSize();
+            NodeIterator nodes = result.getNodes();
+            long count = nodes.getSize();
+            
+            if (count == -1) {
+                count = 0;
+                while(nodes.hasNext()) {
+                    nodes.nextNode();
+                    count++;
+                }
+            } 
+            return count;
         } catch (RepositoryException e) {
+            e.printStackTrace();
             throw new StorageException(HumanReadableText.COUNT_FAILED, e);
         }
        
@@ -84,11 +97,23 @@ public class JCRMessageMapper extends JC
     public long countUnseenMessagesInMailbox() throws StorageException {
         
         try {
-            String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY +"='" + uuid +"'] && [@" + JCRMailboxMembership.SEEN_PROPERTY +"='" + false +"']";
+            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();
-            return result.getNodes().getSize();
+            NodeIterator nodes = result.getNodes();
+            long count = nodes.getSize();
+            
+            if (count == -1) {
+                count = 0;
+                while(nodes.hasNext()) {
+                    nodes.nextNode();
+                    
+                    count++;
+                }
+            } 
+            return count;
         } catch (RepositoryException e) {
+            e.printStackTrace();
             throw new StorageException(HumanReadableText.COUNT_FAILED, e);
         }
     }
@@ -106,6 +131,7 @@ public class JCRMessageMapper extends JC
             try {
                 getSession().getNodeByUUID(membership.getUUID()).remove();
             } catch (RepositoryException e) {
+                e.printStackTrace();
                 throw new StorageException(HumanReadableText.DELETED_FAILED, e);
             }
         }
@@ -141,6 +167,7 @@ public class JCRMessageMapper extends JC
             }
             return results;
         } catch (RepositoryException e) {
+            e.printStackTrace();
             throw new StorageException(HumanReadableText.SEARCH_FAILED, e);
         }
     }
@@ -173,7 +200,7 @@ 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 + "'] && [@" + JCRMailboxMembership.UID_PROPERTY + ">" + from + "] && [@" + JCRMailboxMembership.UID_PROPERTY + "<" + to + "]";
+        String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY + "='" + uuid + "'] AND [@" + JCRMailboxMembership.UID_PROPERTY + ">" + from + "] AND [@" + JCRMailboxMembership.UID_PROPERTY + "<" + to + "]";
         QueryManager manager = getSession().getWorkspace().getQueryManager();
         QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
 
@@ -207,7 +234,7 @@ 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 +"'] && [@" + JCRMailboxMembership.DELETED_PROPERTY +"=" + true +"]";
+            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();
             
@@ -217,6 +244,7 @@ public class JCRMessageMapper extends JC
             }
             return list;
         } catch (RepositoryException e) {
+            e.printStackTrace();
             throw new StorageException(HumanReadableText.SEARCH_FAILED, e);
         }
     }
@@ -232,7 +260,7 @@ public class JCRMessageMapper extends JC
         
         try {
             List<MailboxMembership> list = new ArrayList<MailboxMembership>();
-            String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY +"='" + uuid +"'] && [@" + JCRMailboxMembership.RECENT_PROPERTY +"=" + true +"]";
+            String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY +"='" + uuid +"'] AND [@" + JCRMailboxMembership.RECENT_PROPERTY +"='true']";
             QueryManager manager = getSession().getWorkspace().getQueryManager();
             QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
             
@@ -242,6 +270,7 @@ public class JCRMessageMapper extends JC
             }
             return list;
         } catch (RepositoryException e) {
+            e.printStackTrace();
             throw new StorageException(HumanReadableText.SEARCH_FAILED, e);
         }
     }
@@ -255,7 +284,7 @@ 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 +"'] && [@" + 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;
             QueryManager manager = getSession().getWorkspace().getQueryManager();
             QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
             
@@ -265,6 +294,7 @@ public class JCRMessageMapper extends JC
             }
             return list;
         } catch (RepositoryException e) {
+            e.printStackTrace();
             throw new StorageException(HumanReadableText.SEARCH_FAILED, e);
         }
     }
@@ -280,18 +310,22 @@ public class JCRMessageMapper extends JC
         Node messageNode;
         JCRMailboxMembership membership = (JCRMailboxMembership) message;
         try {
+            createPathIfNotExists();
+            
             if (membership.isPersistent()) {
 
                 messageNode = getSession().getNodeByUUID(membership.getUUID());
 
             } else {
                 messageNode = getSession().getRootNode().addNode(JCRUtils.createPath(PATH, String.valueOf(membership.getUid())));
+                messageNode.addMixin(JcrConstants.MIX_REFERENCEABLE);
             }
             membership.merge(messageNode);
             getSession().save();
 
        
         } catch (RepositoryException e) {
+            e.printStackTrace();
             throw new StorageException(HumanReadableText.SAVE_FAILED, e);
         }
 
@@ -317,6 +351,7 @@ public class JCRMessageMapper extends JC
             }
             return list;
         } catch (RepositoryException e) {
+            e.printStackTrace();
             throw new StorageException(HumanReadableText.SEARCH_FAILED, e);
         }
     }
@@ -342,11 +377,11 @@ public class JCRMessageMapper extends JC
                     final long high = ranges[i].getHighValue();
 
                     if (low == Long.MAX_VALUE) {
-                        queryBuilder.append(" and [@" + JCRMailboxMembership.UID_PROPERTY +"<=").append(high).append("]");
+                        queryBuilder.append(" AND [@" + JCRMailboxMembership.UID_PROPERTY +"<=").append(high).append("]");
                     } else if (low == high) {
-                        queryBuilder.append(" and [@" + JCRMailboxMembership.UID_PROPERTY +"=").append(low).append("]");
+                        queryBuilder.append(" AND [@" + JCRMailboxMembership.UID_PROPERTY +"=").append(low).append("]");
                     } else {
-                        queryBuilder.append(" and [@" + JCRMailboxMembership.UID_PROPERTY +"<").append(low).append("] and [@" + JCRMailboxMembership.UID_PROPERTY + ">").append(high).append("]");
+                        queryBuilder.append(" AND [@" + JCRMailboxMembership.UID_PROPERTY +"<").append(low).append("] AND [@" + JCRMailboxMembership.UID_PROPERTY + ">").append(high).append("]");
                     }
                 }
             }
@@ -354,4 +389,11 @@ public class JCRMessageMapper extends JC
         final String jql = queryBuilder.toString();
         return jql;
     }
+    
+
+    protected void createPathIfNotExists() throws RepositoryException, PathNotFoundException {
+        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/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=922842&r1=922841&r2=922842&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 Sun Mar 14 13:36:01 2010
@@ -173,10 +173,10 @@ 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,  getMailboxId());
-        node.setProperty(NAME_PROPERTY, getName());
-        node.setProperty(UIDVALIDITY_PROPERTY, getUidValidity());
-        node.setProperty(LASTUID_PROPERTY, getLastUid());   
+        node.setProperty(ID_PROPERTY,  id);
+        node.setProperty(NAME_PROPERTY, name);
+        node.setProperty(UIDVALIDITY_PROPERTY, uidValidity);
+        node.setProperty(LASTUID_PROPERTY, lastUid);   
         
         this.node = node;
         id = 0;

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=922842&r1=922841&r2=922842&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 Sun Mar 14 13:36:01 2010
@@ -42,14 +42,14 @@ public class JCRMailboxMembership extend
 	public final static String UID_PROPERTY = PROPERTY_PREFIX + "uid";
 	public final static String SIZE_PROPERTY = PROPERTY_PREFIX + "size";
 	public final static String ANSWERED_PROPERTY = PROPERTY_PREFIX
-			+ "flags:answered";
+			+ "answered";
 	public final static String DELETED_PROPERTY = PROPERTY_PREFIX
-			+ "flags:deleted";
-	public final static String DRAFT_PROPERTY = PROPERTY_PREFIX + "flags:draft";
+			+ "deleted";
+	public final static String DRAFT_PROPERTY = PROPERTY_PREFIX + "draft";
 	public final static String FLAGGED_PROPERTY = PROPERTY_PREFIX + "flagged";
 	public final static String RECENT_PROPERTY = PROPERTY_PREFIX
-			+ "flags:recent";
-	public final static String SEEN_PROPERTY = PROPERTY_PREFIX + "flags:seen";
+			+ "recent";
+	public final static String SEEN_PROPERTY = PROPERTY_PREFIX + "seen";
 	public final static String INTERNAL_DATE_PROPERTY = PROPERTY_PREFIX
 			+ "internalDate";
 
@@ -58,7 +58,6 @@ public class JCRMailboxMembership extend
 	private Date internalDate;
 	private int size;
 	private JCRMessage message;
-	private String messageUUID;
 	private boolean answered;
 	private boolean deleted;
 	private boolean draft;
@@ -123,17 +122,6 @@ public class JCRMailboxMembership extend
 	 * org.apache.james.imap.store.mail.model.MailboxMembership#getDocument()
 	 */
 	public Document getDocument() {
-		if (isPersistent()) {
-			try {
-				return new JCRMessage(node.getNode(messageUUID), logger);
-
-			} catch (RepositoryException e) {
-				logger
-						.error("Unable to access property " + FLAGGED_PROPERTY,
-								e);
-			}
-			return null;
-		}
 		return message;
 	}
 
@@ -434,19 +422,19 @@ public class JCRMailboxMembership extend
 		node.setProperty(DRAFT_PROPERTY, draft);
 		node.setProperty(FLAGGED_PROPERTY, flagged);
 		node.setProperty(RECENT_PROPERTY, recent);
-		;
+		
 		node.setProperty(SEEN_PROPERTY, seen);
-		;
+		
 		Calendar cal = Calendar.getInstance();
 		cal.setTime(internalDate);
 		node.setProperty(INTERNAL_DATE_PROPERTY, cal);
 
-		Node messageNode = node.addNode(messageUUID);
+		Node messageNode = node.addNode("message");
+		messageNode.addMixin(JcrConstants.MIX_REFERENCEABLE);
 		message.merge(messageNode);
 
 		this.node = node;
 
-		mailboxUUID = null;
 		answered = false;
 		deleted = false;
 		draft = false;
@@ -454,7 +442,6 @@ public class JCRMailboxMembership extend
 		internalDate = null;
 		mailboxUUID = null;
 		message = null;
-		messageUUID = null;
 		recent = false;
 		seen = false;
 		size = 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=922842&r1=922841&r2=922842&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 Sun Mar 14 13:36:01 2010
@@ -73,7 +73,7 @@ public class JCRMessage extends Abstract
         this.fullContentOctets = content.length;
         this.bodyStartOctet = bodyStartOctet;
         this.headers = new ArrayList<JCRHeader>(headers);
-        textualLineCount = propertyBuilder.getTextualLineCount();
+        this.textualLineCount = propertyBuilder.getTextualLineCount();
         this.mediaType = propertyBuilder.getMediaType();
         this.subType = propertyBuilder.getSubType();
         final List<Property> properties = propertyBuilder.toProperties();
@@ -156,7 +156,7 @@ public class JCRMessage extends Abstract
     public long getFullContentOctets() {
         if (isPersistent()) {
             try {
-                return node.getNode(JcrConstants.JCR_CONTENT).getProperty(FULL_CONTENT_OCTETS_PROPERTY).getLong();
+                return node.getProperty(FULL_CONTENT_OCTETS_PROPERTY).getLong();
             } catch (RepositoryException e) {
                 logger.error("Unable to retrieve property " + FULL_CONTENT_OCTETS_PROPERTY, e);
 
@@ -229,9 +229,9 @@ public class JCRMessage extends Abstract
     public String getSubType() {
         if (isPersistent()) {
             try {
-                return node.getNode(JcrConstants.JCR_CONTENT).getProperty(SUBTYPE_PROPERTY).getString();
+                return node.getProperty(SUBTYPE_PROPERTY).getString();
             } catch (RepositoryException e) {
-                logger.error("Unable to retrieve node " + JcrConstants.JCR_MIMETYPE, e);
+                logger.error("Unable to retrieve node " + SUBTYPE_PROPERTY, e);
             }
             return null;
         }
@@ -245,7 +245,7 @@ public class JCRMessage extends Abstract
     public Long getTextualLineCount() {
         if (isPersistent()) {
             try {
-                return node.getNode(JcrConstants.JCR_CONTENT).getProperty(TEXTUAL_LINE_COUNT_PROPERTY).getLong();
+                return node.getProperty(TEXTUAL_LINE_COUNT_PROPERTY).getLong();
             } catch (RepositoryException e) {
                 logger.error("Unable to retrieve property " + TEXTUAL_LINE_COUNT_PROPERTY, e);
 
@@ -271,6 +271,16 @@ public class JCRMessage extends Abstract
         return node != null;
     }
 
+    public String getUUID() {
+        if (isPersistent()) {
+            try {
+                return node.getUUID();
+            } catch (RepositoryException e) {
+                logger.error("Unable to access UUID", e);
+            }
+        }
+        return null;
+    }
     /*
      * (non-Javadoc)
      * @see org.apache.james.imap.jcr.Persistent#merge(javax.jcr.Node)
@@ -285,22 +295,34 @@ public class JCRMessage extends Abstract
         contentNode.setProperty(JcrConstants.JCR_DATA, new ByteArrayInputStream(content));
         contentNode.setProperty(JcrConstants.JCR_MIMETYPE, mediaType);
 
-        contentNode.setProperty(BODY_START_OCTET_PROPERTY, bodyStartOctet);
-        contentNode.setProperty(FULL_CONTENT_OCTETS_PROPERTY, fullContentOctets);
-        contentNode.setProperty(FULL_CONTENT_OCTETS_PROPERTY, fullContentOctets);
-        contentNode.setProperty(TEXTUAL_LINE_COUNT_PROPERTY, textualLineCount);
-        contentNode.setProperty(SUBTYPE_PROPERTY, subType);
+        node.setProperty(FULL_CONTENT_OCTETS_PROPERTY, fullContentOctets);
+        node.setProperty(TEXTUAL_LINE_COUNT_PROPERTY, textualLineCount);
+        node.setProperty(SUBTYPE_PROPERTY, subType);
+        node.setProperty(BODY_START_OCTET_PROPERTY, new Long(bodyStartOctet));
+
+        Node headersNode;
+        if (node.hasNode(HEADERS_NODE)) {
+            headersNode = node.getNode(HEADERS_NODE);
+            headersNode.remove();
+        } else {
+            headersNode = node.addNode(HEADERS_NODE);
+        }
         
-        Node headersNode = contentNode.getNode(HEADERS_NODE);
-        headersNode.remove();
         for (int i = 0; i < headers.size(); i++) {
             JCRHeader header = (JCRHeader) headers.get(i);
             Node headerNode = headersNode.addNode(header.getFieldName());
             header.merge(headerNode);
         }
       
-        Node propertiesNode = contentNode.getNode(PROPERTIES_NODE);
-        propertiesNode.remove();
+        Node propertiesNode;
+        
+        if (node.hasNode(PROPERTIES_NODE)) {
+            propertiesNode = node.getNode(PROPERTIES_NODE);
+            propertiesNode.remove();
+        } else {
+            propertiesNode = node.addNode(PROPERTIES_NODE);
+        }
+        
         for (int i = 0; i < properties.size(); i++) {
             JCRProperty prop = (JCRProperty) properties.get(i);
             Node propNode = propertiesNode.addNode(JCRUtils.createPath(prop.getNamespace()+ "." + prop.getLocalName()));
@@ -324,7 +346,7 @@ public class JCRMessage extends Abstract
     protected int getBodyStartOctet() {
         if (isPersistent()) {
             try {
-                return new Long(node.getNode(JcrConstants.JCR_CONTENT).getProperty(BODY_START_OCTET_PROPERTY).getLong()).intValue();
+                return new Long(node.getProperty(BODY_START_OCTET_PROPERTY).getLong()).intValue();
             } catch (RepositoryException e) {
                 logger.error("Unable to retrieve property " + TEXTUAL_LINE_COUNT_PROPERTY, e);
 

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=922842&r1=922841&r2=922842&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 Sun Mar 14 13:36:01 2010
@@ -121,6 +121,12 @@ public class JCRSubscriptionMapper exten
 
     }
 
+    protected void createPathIfNotExists(String path) throws RepositoryException, PathNotFoundException {
+        if (getSession().getRootNode().hasNode(JCRUtils.createPath(path)) == false) {
+            getSession().getRootNode().addNode(JCRUtils.createPath(path));
+        }
+    }
+    
     /*
      * (non-Javadoc)
      * 
@@ -133,11 +139,15 @@ public class JCRSubscriptionMapper exten
         String mailbox = subscription.getMailbox();
         String nodename = JCRUtils.createPath(username, mailbox);
         try {
+            createPathIfNotExists(PATH);
             Node node = getSession().getRootNode().getNode(PATH);
             Node subNode;
             if (node.hasNode(nodename)) {
                 subNode = node.getNode(nodename);
             } else {
+                if (node.hasNode(username) == false) {
+                    node.addNode(username);
+                }
                 subNode = node.addNode(nodename);
             }
 
@@ -146,6 +156,7 @@ public class JCRSubscriptionMapper exten
 
             getSession().save();
         } catch (RepositoryException e) {
+            e.printStackTrace();
             throw new SubscriptionException(HumanReadableText.SAVE_FAILED, e);
         }
     }

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=922842&r1=922841&r2=922842&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 Sun Mar 14 13:36:01 2010
@@ -241,10 +241,13 @@ public abstract class StoreMailbox imple
                 tracker.found(uid, message.createFlags());
                 return uid;
             } catch (IOException e) {
+                e.printStackTrace();
                 throw new MailboxException(HumanReadableText.FAILURE_MAIL_PARSE, e);
             } catch (MessagingException e) {
+                e.printStackTrace();
                 throw new MailboxException(HumanReadableText.FAILURE_MAIL_PARSE, e);
             } catch (MimeException e) {
+                e.printStackTrace();
                 throw new MailboxException(HumanReadableText.FAILURE_MAIL_PARSE, e);
             }
         }



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