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/06/24 12:55:49 UTC

svn commit: r957505 - /james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMessage.java

Author: norman
Date: Thu Jun 24 10:55:49 2010
New Revision: 957505

URL: http://svn.apache.org/viewvc?rev=957505&view=rev
Log:
Only set the message flags when save a already existing message. This prevent JCR for use to much memory when update messages an improve the performance a lot (IMAP-159)

Modified:
    james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMessage.java

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=957505&r1=957504&r2=957505&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 Thu Jun 24 10:55:49 2010
@@ -313,80 +313,84 @@ public class JCRMessage extends Abstract
      * @see org.apache.james.imap.jcr.Persistent#merge(javax.jcr.Node)
      */
     public void merge(Node node) throws RepositoryException, IOException {
-        node.setProperty(MAILBOX_UUID_PROPERTY, getMailboxId());
-        node.setProperty(UID_PROPERTY, getUid());
-        node.setProperty(SIZE_PROPERTY, getSize());
+
+        // update the flags 
         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, isSeen());
-        
-        if (getInternalDate() == null) {
-            internalDate = new Date();
-        }
-        
-        Calendar cal = Calendar.getInstance();
-        
-        cal.setTime(getInternalDate());
-        node.setProperty(INTERNAL_DATE_PROPERTY, cal);
 
-              
-        Node contentNode = JcrUtils.getOrAddNode(node, JcrConstants.JCR_CONTENT, JcrConstants.NT_RESOURCE);
-        Binary binaryContent = contentNode.getSession().getValueFactory().createBinary(getFullContent());
-        contentNode.setProperty(JcrConstants.JCR_DATA, binaryContent);
-        contentNode.setProperty(JcrConstants.JCR_MIMETYPE, getMediaType());
-
-        if (getTextualLineCount() != null) {
-            node.setProperty(TEXTUAL_LINE_COUNT_PROPERTY, getTextualLineCount());
-        }
-        node.setProperty(SUBTYPE_PROPERTY, getSubType());
-        node.setProperty(BODY_START_OCTET_PROPERTY, getBodyStartOctet());
-
-        // copy the headers and store them in memory as pure pojos
-        List<Header> currentHeaders = getHeaders();
-        List<Header> newHeaders = new ArrayList<Header>();
-        for (int i = 0 ; i < currentHeaders.size(); i++) {
-            newHeaders.add(new JCRHeader(currentHeaders.get(i), logger));
-        }
-        
-           
-        NodeIterator iterator = node.getNodes("messageHeader");
-        // remove old headers
-        while (iterator.hasNext()) {
-            iterator.nextNode().remove();
-        }
-      
-        // add headers to the message again
-        for (int i = 0; i < newHeaders.size(); i++) {
-            JCRHeader header = (JCRHeader) newHeaders.get(i);
-            Node headerNode = node.addNode("messageHeader", "nt:unstructured");
-            headerNode.addMixin(HEADER_NODE_TYPE);
-            header.merge(headerNode);
-        }
-      
-        List<Property> currentProperties = getProperties();
-        List<Property> newProperites = new ArrayList<Property>();
-        for (int i = 0; i < currentProperties.size(); i++) {
-            Property prop = currentProperties.get(i);
-            newProperites.add(new JCRProperty(prop, i, logger));
-        }                    
+        // This stuff is only ever changed on a new message
+        // so if it is persistent we don'T need to set all the of this.
+        //
+        // This also fix https://issues.apache.org/jira/browse/IMAP-159
+        if (isPersistent() == false) {
+            node.setProperty(SIZE_PROPERTY, getSize());
+            node.setProperty(MAILBOX_UUID_PROPERTY, getMailboxId());
+            node.setProperty(UID_PROPERTY, getUid());
+            if (getInternalDate() == null) {
+                internalDate = new Date();
+            }
+
+            Calendar cal = Calendar.getInstance();
+
+            cal.setTime(getInternalDate());
+            node.setProperty(INTERNAL_DATE_PROPERTY, cal);
+
+            Node contentNode = JcrUtils.getOrAddNode(node, JcrConstants.JCR_CONTENT, JcrConstants.NT_RESOURCE);
+            Binary binaryContent = contentNode.getSession().getValueFactory().createBinary(getFullContent());
+            contentNode.setProperty(JcrConstants.JCR_DATA, binaryContent);
+            contentNode.setProperty(JcrConstants.JCR_MIMETYPE, getMediaType());
+
+            if (getTextualLineCount() != null) {
+                node.setProperty(TEXTUAL_LINE_COUNT_PROPERTY, getTextualLineCount());
+            }
+            node.setProperty(SUBTYPE_PROPERTY, getSubType());
+            node.setProperty(BODY_START_OCTET_PROPERTY, getBodyStartOctet());
+
+            // copy the headers and store them in memory as pure pojos
+            List<Header> currentHeaders = getHeaders();
+            List<Header> newHeaders = new ArrayList<Header>();
+            for (int i = 0; i < currentHeaders.size(); i++) {
+                newHeaders.add(new JCRHeader(currentHeaders.get(i), logger));
+            }
+
+            NodeIterator iterator = node.getNodes("messageHeader");
+            // remove old headers
+            while (iterator.hasNext()) {
+                iterator.nextNode().remove();
+            }
+
+            // add headers to the message again
+            for (int i = 0; i < newHeaders.size(); i++) {
+                JCRHeader header = (JCRHeader) newHeaders.get(i);
+                Node headerNode = node.addNode("messageHeader", "nt:unstructured");
+                headerNode.addMixin(HEADER_NODE_TYPE);
+                header.merge(headerNode);
+            }
+
+            List<Property> currentProperties = getProperties();
+            List<Property> newProperites = new ArrayList<Property>();
+            for (int i = 0; i < currentProperties.size(); i++) {
+                Property prop = currentProperties.get(i);
+                newProperites.add(new JCRProperty(prop, i, logger));
+            }
             // remove old properties, we will add a bunch of new ones
-        iterator = node.getNodes("messageProperty");
-        while (iterator.hasNext()) {
-            iterator.nextNode().remove();
-        }
+            iterator = node.getNodes("messageProperty");
+            while (iterator.hasNext()) {
+                iterator.nextNode().remove();
+            }
 
-        // store new properties
-        for (int i = 0; i < newProperites.size(); i++) {
-            JCRProperty prop = (JCRProperty)newProperites.get(i);
-            Node propNode = node.addNode("messageProperty", "nt:unstructured");
-            propNode.addMixin(PROPERTY_NODE_TYPE);
-            prop.merge(propNode);
+            // store new properties
+            for (int i = 0; i < newProperites.size(); i++) {
+                JCRProperty prop = (JCRProperty) newProperites.get(i);
+                Node propNode = node.addNode("messageProperty", "nt:unstructured");
+                propNode.addMixin(PROPERTY_NODE_TYPE);
+                prop.merge(propNode);
+            }
         }
-      
         this.node = node;
 
     }



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