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