Author: norman
Date: Wed May 12 17:46:39 2010
New Revision: 943594
URL: http://svn.apache.org/viewvc?rev=943594&view=rev
Log:
Merge JCRMessage and JcrMailboxMembership. It just makes more sense to have it
in one node in JCR
Removed:
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMailboxMembership.java
Modified:
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/mail/JCRMessageMapper.java
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMessage.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/JCRMailbox.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailbox.java?rev=943594&r1=943593&r2=943594&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
Wed May 12 17:46:39 2010
@@ -30,7 +30,7 @@ import org.apache.commons.logging.Log;
import org.apache.james.imap.jcr.mail.JCRMailboxMapper;
import org.apache.james.imap.jcr.mail.JCRMessageMapper;
import org.apache.james.imap.jcr.mail.model.JCRHeader;
-import org.apache.james.imap.jcr.mail.model.JCRMailboxMembership;
+import org.apache.james.imap.jcr.mail.model.JCRMessage;
import org.apache.james.imap.mailbox.MailboxException;
import org.apache.james.imap.mailbox.MailboxSession;
import org.apache.james.imap.mailbox.util.MailboxEventDispatcher;
@@ -60,7 +60,7 @@ public class JCRMailbox extends StoreMai
@Override
protected MailboxMembership<String> copyMessage(MailboxMembership<String>
originalMessage, long uid, MailboxSession session) throws MailboxException {
- MailboxMembership<String> newRow = new
JCRMailboxMembership(getMailboxId(), uid, (JCRMailboxMembership)
originalMessage, log);
+ MailboxMembership<String> newRow = new JCRMessage(getMailboxId(), uid,
(JCRMessage) originalMessage, log);
return newRow;
}
@@ -75,7 +75,7 @@ public class JCRMailbox extends StoreMai
for (Header header: headers) {
jcrHeaders.add((JCRHeader) header);
}
- final MailboxMembership<String> message = new
JCRMailboxMembership(getMailboxId(), uid, internalDate,
+ final MailboxMembership<String> message = new
JCRMessage(getMailboxId(), uid, internalDate,
size, flags, document, bodyStartOctet, jcrHeaders,
propertyBuilder, log);
return message;
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=943594&r1=943593&r2=943594&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
Wed May 12 17:46:39 2010
@@ -38,7 +38,7 @@ import org.apache.jackrabbit.commons.Jcr
import org.apache.jackrabbit.util.Locked;
import org.apache.james.imap.api.display.HumanReadableText;
import org.apache.james.imap.jcr.AbstractJCRMapper;
-import org.apache.james.imap.jcr.mail.model.JCRMailboxMembership;
+import org.apache.james.imap.jcr.mail.model.JCRMessage;
import org.apache.james.imap.mailbox.MessageRange;
import org.apache.james.imap.mailbox.SearchQuery;
import org.apache.james.imap.mailbox.StorageException;
@@ -66,7 +66,7 @@ public class JCRMessageMapper extends Ab
public long countMessagesInMailbox() throws StorageException {
try {
// we use order by because without it count will always be 0 in
jackrabbit
- String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:mailboxMembership)[@" +
JCRMailboxMembership.MAILBOX_UUID_PROPERTY +"='" + uuid +"'] order by @" +
JCRMailboxMembership.UID_PROPERTY;
+ String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY +"='" + uuid
+"'] order by @" + JCRMessage.UID_PROPERTY;
QueryManager manager =
getSession().getWorkspace().getQueryManager();
QueryResult result = manager.createQuery(queryString,
Query.XPATH).execute();
NodeIterator nodes = result.getNodes();
@@ -97,7 +97,7 @@ public class JCRMessageMapper extends Ab
try {
// we use order by because without it count will always be 0 in
jackrabbit
- String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:mailboxMembership)[@" +
JCRMailboxMembership.MAILBOX_UUID_PROPERTY +"='" + uuid +"'] AND [@" +
JCRMailboxMembership.SEEN_PROPERTY +"='false'] order by @" +
JCRMailboxMembership.UID_PROPERTY;
+ String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY +"='" + uuid
+"'] AND [@" + JCRMessage.SEEN_PROPERTY +"='false'] order by @" +
JCRMessage.UID_PROPERTY;
QueryManager manager =
getSession().getWorkspace().getQueryManager();
QueryResult result = manager.createQuery(queryString,
Query.XPATH).execute();
NodeIterator nodes = result.getNodes();
@@ -126,7 +126,7 @@ public class JCRMessageMapper extends Ab
* .imap.store.mail.model.MailboxMembership)
*/
public void delete(MailboxMembership<String> message) throws
StorageException {
- JCRMailboxMembership membership = (JCRMailboxMembership) message;
+ JCRMessage membership = (JCRMessage) message;
if (membership.isPersistent()) {
try {
@@ -175,42 +175,42 @@ public class JCRMessageMapper extends Ab
private List<MailboxMembership<String>>
findMessagesInMailboxAfterUID(String uuid, long uid) throws RepositoryException
{
List<MailboxMembership<String>> list = new
ArrayList<MailboxMembership<String>>();
- String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:mailboxMembership)[@" +
JCRMailboxMembership.MAILBOX_UUID_PROPERTY + "='" + uuid + "'] AND [@" +
JCRMailboxMembership.UID_PROPERTY + ">=" + uid + "] order by @" +
JCRMailboxMembership.UID_PROPERTY;
+ String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY + "='" + uuid
+ "'] AND [@" + JCRMessage.UID_PROPERTY + ">=" + uid + "] order by @" +
JCRMessage.UID_PROPERTY;
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(),
getLogger()));
+ list.add(new JCRMessage(iterator.nextNode(), getLogger()));
}
return list;
}
private List<MailboxMembership<String>>
findMessagesInMailboxWithUID(String uuid, long uid) throws RepositoryException
{
List<MailboxMembership<String>> list = new
ArrayList<MailboxMembership<String>>();
- String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:mailboxMembership)[@" +
JCRMailboxMembership.MAILBOX_UUID_PROPERTY + "='" + uuid + "'] AND [@" +
JCRMailboxMembership.UID_PROPERTY + "=" + uid + "] order by @" +
JCRMailboxMembership.UID_PROPERTY;
+ String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY + "='" + uuid
+ "'] AND [@" + JCRMessage.UID_PROPERTY + "=" + uid + "] order by @" +
JCRMessage.UID_PROPERTY;
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(),
getLogger()));
+ list.add(new JCRMessage(iterator.nextNode(), getLogger()));
}
return list;
}
private List<MailboxMembership<String>>
findMessagesInMailboxBetweenUIDs(String uuid, long from, long to) throws
RepositoryException {
List<MailboxMembership<String>> list = new
ArrayList<MailboxMembership<String>>();
- String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:mailboxMembership)[@" +
JCRMailboxMembership.MAILBOX_UUID_PROPERTY + "='" + uuid + "'] AND [@" +
JCRMailboxMembership.UID_PROPERTY + ">=" + from + "] AND [@" +
JCRMailboxMembership.UID_PROPERTY + "<=" + to + "] order by @" +
JCRMailboxMembership.UID_PROPERTY;
+ String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY + "='" + uuid
+ "'] AND [@" + JCRMessage.UID_PROPERTY + ">=" + from + "] AND [@" +
JCRMessage.UID_PROPERTY + "<=" + to + "] order by @" + JCRMessage.UID_PROPERTY;
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(),
getLogger()));
+ list.add(new JCRMessage(iterator.nextNode(), getLogger()));
}
return list;
}
@@ -218,13 +218,13 @@ public class JCRMessageMapper extends Ab
private List<MailboxMembership<String>> findMessagesInMailbox(String uuid)
throws RepositoryException {
List<MailboxMembership<String>> list = new
ArrayList<MailboxMembership<String>>();
- String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:mailboxMembership)[@" +
JCRMailboxMembership.MAILBOX_UUID_PROPERTY +"='" + uuid +"'] order by @" +
JCRMailboxMembership.UID_PROPERTY;
+ String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY +"='" + uuid
+"'] order by @" + JCRMessage.UID_PROPERTY;
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(),
getLogger()));
+ list.add(new JCRMessage(iterator.nextNode(), getLogger()));
}
return list;
}
@@ -233,27 +233,27 @@ public class JCRMessageMapper extends Ab
private List<MailboxMembership<String>>
findDeletedMessagesInMailboxAfterUID(String uuid, long uid) throws
RepositoryException {
List<MailboxMembership<String>> list = new
ArrayList<MailboxMembership<String>>();
- String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:mailboxMembership)[@" +
JCRMailboxMembership.MAILBOX_UUID_PROPERTY + "='" + uuid + "'] AND [@" +
JCRMailboxMembership.UID_PROPERTY + ">=" + uid + "] AND [@" +
JCRMailboxMembership.DELETED_PROPERTY+ "='true'] order by @" +
JCRMailboxMembership.UID_PROPERTY;
+ String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY + "='" + uuid
+ "'] AND [@" + JCRMessage.UID_PROPERTY + ">=" + uid + "] AND [@" +
JCRMessage.DELETED_PROPERTY+ "='true'] order by @" + JCRMessage.UID_PROPERTY;
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(),
getLogger()));
+ list.add(new JCRMessage(iterator.nextNode(), getLogger()));
}
return list;
}
private List<MailboxMembership<String>>
findDeletedMessagesInMailboxWithUID(String uuid, long uid) throws
RepositoryException {
List<MailboxMembership<String>> list = new
ArrayList<MailboxMembership<String>>();
- String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:mailboxMembership)[@" +
JCRMailboxMembership.MAILBOX_UUID_PROPERTY + "='" + uuid + "'] AND [@" +
JCRMailboxMembership.UID_PROPERTY + "=" + uid + "] AND [@" +
JCRMailboxMembership.DELETED_PROPERTY+ "='true'] order by @" +
JCRMailboxMembership.UID_PROPERTY;
+ String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY + "='" + uuid
+ "'] AND [@" + JCRMessage.UID_PROPERTY + "=" + uid + "] AND [@" +
JCRMessage.DELETED_PROPERTY+ "='true'] order by @" + JCRMessage.UID_PROPERTY;
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(), getLogger());
+ JCRMessage member = new JCRMessage(iterator.nextNode(),
getLogger());
list.add(member);
}
return list;
@@ -261,14 +261,14 @@ public class JCRMessageMapper extends Ab
private List<MailboxMembership<String>>
findDeletedMessagesInMailboxBetweenUIDs(String uuid, long from, long to) throws
RepositoryException {
List<MailboxMembership<String>> list = new
ArrayList<MailboxMembership<String>>();
- String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:mailboxMembership)[@" +
JCRMailboxMembership.MAILBOX_UUID_PROPERTY + "='" + uuid + "'] AND [@" +
JCRMailboxMembership.UID_PROPERTY + ">=" + from + "] AND [@" +
JCRMailboxMembership.UID_PROPERTY + "<=" + to + "] AND [@" +
JCRMailboxMembership.DELETED_PROPERTY+ "='true'] order by @" +
JCRMailboxMembership.UID_PROPERTY;
+ String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY + "='" + uuid
+ "'] AND [@" + JCRMessage.UID_PROPERTY + ">=" + from + "] AND [@" +
JCRMessage.UID_PROPERTY + "<=" + to + "] AND [@" + JCRMessage.DELETED_PROPERTY+
"='true'] order by @" + JCRMessage.UID_PROPERTY;
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(),
getLogger()));
+ list.add(new JCRMessage(iterator.nextNode(), getLogger()));
}
return list;
}
@@ -276,14 +276,14 @@ public class JCRMessageMapper extends Ab
private List<MailboxMembership<String>>
findDeletedMessagesInMailbox(String uuid) throws RepositoryException {
List<MailboxMembership<String>> list = new
ArrayList<MailboxMembership<String>>();
- String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:mailboxMembership)[@" +
JCRMailboxMembership.MAILBOX_UUID_PROPERTY +"='" + uuid +"'] AND [@" +
JCRMailboxMembership.DELETED_PROPERTY+ "='true'] order by @" +
JCRMailboxMembership.UID_PROPERTY;
+ String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY +"='" + uuid
+"'] AND [@" + JCRMessage.DELETED_PROPERTY+ "='true'] order by @" +
JCRMessage.UID_PROPERTY;
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(), getLogger());
+ JCRMessage member = new JCRMessage(iterator.nextNode(),
getLogger());
list.add(member);
}
return list;
@@ -335,14 +335,14 @@ public class JCRMessageMapper extends Ab
try {
List<MailboxMembership<String>> list = new
ArrayList<MailboxMembership<String>>();
- String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:mailboxMembership)[@" +
JCRMailboxMembership.MAILBOX_UUID_PROPERTY +"='" + uuid +"'] AND [@" +
JCRMailboxMembership.RECENT_PROPERTY +"='true'] order by @" +
JCRMailboxMembership.UID_PROPERTY;
+ String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY +"='" + uuid
+"'] AND [@" + JCRMessage.RECENT_PROPERTY +"='true'] order by @" +
JCRMessage.UID_PROPERTY;
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(),
getLogger()));
+ list.add(new JCRMessage(iterator.nextNode(), getLogger()));
}
return list;
} catch (RepositoryException e) {
@@ -359,14 +359,14 @@ public class JCRMessageMapper extends Ab
public List<MailboxMembership<String>> findUnseenMessagesInMailbox()
throws StorageException {
try {
List<MailboxMembership<String>> list = new
ArrayList<MailboxMembership<String>>();
- String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:mailboxMembership)[@" +
JCRMailboxMembership.MAILBOX_UUID_PROPERTY +"='" + uuid +"'] AND [@" +
JCRMailboxMembership.SEEN_PROPERTY +"='false'] order by @" +
JCRMailboxMembership.UID_PROPERTY;
+ String queryString = "//" + MAILBOXES_PATH +
"//element(*,imap:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY +"='" + uuid
+"'] AND [@" + JCRMessage.SEEN_PROPERTY +"='false'] order by @" +
JCRMessage.UID_PROPERTY;
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(),
getLogger()));
+ list.add(new JCRMessage(iterator.nextNode(), getLogger()));
}
return list;
} catch (RepositoryException e) {
@@ -383,7 +383,7 @@ public class JCRMessageMapper extends Ab
* imap.store.mail.model.MailboxMembership)
*/
public void save(MailboxMembership<String> message) throws
StorageException {
- final JCRMailboxMembership membership = (JCRMailboxMembership) message;
+ final JCRMessage membership = (JCRMessage) message;
try {
//JCRUtils.createNodeRecursive(getSession().getRootNode(),
mailboxN);
Node messageNode = null;
@@ -444,7 +444,7 @@ public class JCRMessageMapper extends Ab
@Override
protected Object run(Node dayNode) throws
RepositoryException {
- Node messageNode =
dayNode.addNode("message-"+String.valueOf(membership.getUid()),"imap:mailboxMembership");
+ Node messageNode =
dayNode.addNode("message-"+String.valueOf(membership.getUid()),"imap:message");
try {
membership.merge(messageNode);
} catch (IOException e) {
@@ -489,7 +489,7 @@ public class JCRMessageMapper extends Ab
NodeIterator it = result.getNodes();
while (it.hasNext()) {
- list.add(new JCRMailboxMembership(it.nextNode(), getLogger()));
+ list.add(new JCRMessage(it.nextNode(), getLogger()));
}
return list;
} catch (RepositoryException e) {
@@ -507,7 +507,7 @@ public class JCRMessageMapper extends Ab
*/
private String formulateXPath(String uuid, SearchQuery query) {
final StringBuilder queryBuilder = new StringBuilder(50);
- queryBuilder.append("//" + MAILBOXES_PATH +
"//element(*,imap:mailboxMembership)[@" +
JCRMailboxMembership.MAILBOX_UUID_PROPERTY +"='" + uuid +"'] ");
+ queryBuilder.append("//" + MAILBOXES_PATH +
"//element(*,imap:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY +"='" + uuid
+"'] ");
final List<Criterion> criteria = query.getCriterias();
if (criteria.size() == 1) {
final Criterion firstCriterion = criteria.get(0);
@@ -519,16 +519,16 @@ public class JCRMessageMapper extends Ab
final long high = ranges[i].getHighValue();
if (low == Long.MAX_VALUE) {
- queryBuilder.append(" AND [@" +
JCRMailboxMembership.UID_PROPERTY +"<=").append(high).append("]");
+ queryBuilder.append(" AND [@" +
JCRMessage.UID_PROPERTY +"<=").append(high).append("]");
} else if (low == high) {
- queryBuilder.append(" AND [@" +
JCRMailboxMembership.UID_PROPERTY +"=").append(low).append("]");
+ queryBuilder.append(" AND [@" +
JCRMessage.UID_PROPERTY +"=").append(low).append("]");
} else {
- queryBuilder.append(" AND [@" +
JCRMailboxMembership.UID_PROPERTY +"<=").append(high).append("] AND [@" +
JCRMailboxMembership.UID_PROPERTY + ">=").append(low).append("]");
+ queryBuilder.append(" AND [@" +
JCRMessage.UID_PROPERTY +"<=").append(high).append("] AND [@" +
JCRMessage.UID_PROPERTY + ">=").append(low).append("]");
}
}
}
}
- queryBuilder.append(" order by @" + JCRMailboxMembership.UID_PROPERTY);
+ queryBuilder.append(" order by @" + JCRMessage.UID_PROPERTY);
final String jql = queryBuilder.toString();
return jql;
}
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=943594&r1=943593&r2=943594&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
Wed May 12 17:46:39 2010
@@ -22,21 +22,28 @@ import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
import java.util.List;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
+import javax.mail.Flags;
import org.apache.commons.logging.Log;
import org.apache.jackrabbit.JcrConstants;
+import org.apache.jackrabbit.commons.JcrUtils;
import org.apache.jackrabbit.util.Text;
+import org.apache.james.imap.api.display.HumanReadableText;
import org.apache.james.imap.jcr.JCRImapConstants;
import org.apache.james.imap.jcr.Persistent;
+import org.apache.james.imap.mailbox.MailboxException;
import org.apache.james.imap.store.StreamUtils;
import org.apache.james.imap.store.mail.model.AbstractDocument;
import org.apache.james.imap.store.mail.model.Document;
import org.apache.james.imap.store.mail.model.Header;
+import org.apache.james.imap.store.mail.model.MailboxMembership;
import org.apache.james.imap.store.mail.model.Property;
import org.apache.james.imap.store.mail.model.PropertyBuilder;
@@ -44,21 +51,43 @@ import org.apache.james.imap.store.mail.
* JCR implementation of {...@link Document}
*
*/
-public class JCRMessage extends AbstractDocument implements JCRImapConstants,
Persistent{
+public class JCRMessage extends AbstractDocument implements
MailboxMembership<String>, JCRImapConstants, Persistent{
private Node node;
private final Log logger;
private InputStream content;
private List<JCRHeader> headers;
- private long fullContentOctets;
private String mediaType;
private Long textualLineCount;
private String subType;
private List<JCRProperty> properties;
private int bodyStartOctet;
+ private String mailboxUUID;
+ private long uid;
+ private Date internalDate;
+ private int size;
+ private boolean answered;
+ private boolean deleted;
+ private boolean draft;
+ private boolean flagged;
+ private boolean recent;
+ private boolean seen;
+
+ private static final String TOSTRING_SEPARATOR = " ";
+
+ public final static String MAILBOX_UUID_PROPERTY = "imap:mailboxUUID";
+ public final static String UID_PROPERTY = "imap:uid";
+ public final static String SIZE_PROPERTY = "imap:size";
+ public final static String ANSWERED_PROPERTY = "imap:answered";
+ public final static String DELETED_PROPERTY = "imap:deleted";
+ public final static String DRAFT_PROPERTY = "imap:draft";
+ public final static String FLAGGED_PROPERTY = "imap:flagged";
+ public final static String RECENT_PROPERTY = "imap:recent";
+ public final static String SEEN_PROPERTY = "imap:seen";
+ public final static String INTERNAL_DATE_PROPERTY = "imap:internalDate";
+
public final static String BODY_START_OCTET_PROPERTY =
"imap:messageBodyStartOctet";
- public final static String FULL_CONTENT_OCTETS_PROPERTY =
"imap:messageFullContentOctets";
public final static String HEADERS_NODE_TYPE = "imap:messageHeaders";
public final static String HEADERS_NODE = "messageHeaders";
@@ -73,11 +102,19 @@ public class JCRMessage extends Abstract
this.node = node;
}
- public JCRMessage(InputStream content, final long contentOctets, final int
bodyStartOctet, final List<JCRHeader> headers, final PropertyBuilder
propertyBuilder, Log logger) {
+ public JCRMessage(String mailboxUUID, long uid,
+ Date internalDate, int size, Flags flags, InputStream content,
+ int bodyStartOctet, final List<JCRHeader> headers,
+ final PropertyBuilder propertyBuilder, Log logger) {
super();
+ this.mailboxUUID = mailboxUUID;
+ this.uid = uid;
+ this.internalDate = internalDate;
+ this.size = size;
this.logger = logger;
+ setFlags(flags);
+
this.content = content;
- this.fullContentOctets = contentOctets;
this.bodyStartOctet = bodyStartOctet;
this.headers = new ArrayList<JCRHeader>(headers);
@@ -100,11 +137,25 @@ public class JCRMessage extends Abstract
* @param message
* @throws IOException
*/
- public JCRMessage(JCRMessage message, Log logger) throws IOException {
+ public JCRMessage(String mailboxUUID, long uid, JCRMessage message, Log
logger) throws MailboxException {
+ this.mailboxUUID = mailboxUUID;
+ this.uid = uid;
+ this.internalDate = message.getInternalDate();
+ this.size = message.getSize();
+ this.answered = message.isAnswered();
+ this.deleted = message.isDeleted();
+ this.draft = message.isDraft();
+ this.flagged = message.isFlagged();
+ this.recent = message.isRecent();
+ this.seen = message.isSeen();
+
this.logger = logger;
- this.content = new
ByteArrayInputStream(StreamUtils.toByteArray(message.getFullContent()));
+ try {
+ this.content = new
ByteArrayInputStream(StreamUtils.toByteArray(message.getFullContent()));
+ } catch (IOException e) {
+ throw new MailboxException(HumanReadableText.FAILURE_MAIL_PARSE,e);
+ }
- this.fullContentOctets = message.getFullContentOctets();
this.bodyStartOctet = (int) (message.getFullContentOctets() -
message.getBodyOctets());
this.headers = new ArrayList<JCRHeader>();
@@ -132,14 +183,14 @@ public class JCRMessage extends Abstract
public long getFullContentOctets() {
if (isPersistent()) {
try {
- return
node.getProperty(FULL_CONTENT_OCTETS_PROPERTY).getLong();
+ return node.getProperty(SIZE_PROPERTY).getLong();
} catch (RepositoryException e) {
- logger.error("Unable to retrieve property " +
FULL_CONTENT_OCTETS_PROPERTY, e);
+ logger.error("Unable to retrieve property " + SIZE_PROPERTY,
e);
}
return 0;
}
- return fullContentOctets;
+ return size;
}
/*
@@ -263,16 +314,32 @@ 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 contentNode;
- if (node.hasNode(JcrConstants.JCR_CONTENT) == false) {
- contentNode = node.addNode(JcrConstants.JCR_CONTENT,
JcrConstants.NT_RESOURCE);
- } else {
- contentNode = node.getNode(JcrConstants.JCR_CONTENT);
+ node.setProperty(MAILBOX_UUID_PROPERTY, getMailboxId());
+ 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, 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);
+
contentNode.setProperty(JcrConstants.JCR_DATA, getFullContent());
contentNode.setProperty(JcrConstants.JCR_MIMETYPE, getMediaType());
- node.setProperty(FULL_CONTENT_OCTETS_PROPERTY, getFullContentOctets());
if (getTextualLineCount() != null) {
node.setProperty(TEXTUAL_LINE_COUNT_PROPERTY,
getTextualLineCount());
}
@@ -368,14 +435,6 @@ public class JCRMessage extends Abstract
@Override
- public int hashCode() {
- final int PRIME = 31;
- int result = 1;
- result = PRIME * result + getUUID().hashCode();
- return result;
- }
-
- @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
@@ -383,19 +442,17 @@ public class JCRMessage extends Abstract
return false;
if (getClass() != obj.getClass())
return false;
+
final JCRMessage other = (JCRMessage) obj;
if (getUUID() != other.getUUID())
return false;
+ if (getMailboxId() != other.getMailboxId())
+ return false;
+ if (getId() != other.getId())
+ return false;
return true;
}
- public String toString() {
- final String retValue =
- "message("
- + "uuid = " + getUUID()
- + " )";
- return retValue;
- }
@Override
protected InputStream getRawFullContent() {
@@ -412,4 +469,333 @@ public class JCRMessage extends Abstract
return content;
}
+
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.james.imap.store.mail.model.MailboxMembership#createFlags()
+ */
+ public Flags createFlags() {
+ final Flags flags = new Flags();
+
+ if (isAnswered()) {
+ flags.add(Flags.Flag.ANSWERED);
+ }
+ if (isDeleted()) {
+ flags.add(Flags.Flag.DELETED);
+ }
+ if (isDraft()) {
+ flags.add(Flags.Flag.DRAFT);
+ }
+ if (isFlagged()) {
+ flags.add(Flags.Flag.FLAGGED);
+ }
+ if (isRecent()) {
+ flags.add(Flags.Flag.RECENT);
+ }
+ if (isSeen()) {
+ flags.add(Flags.Flag.SEEN);
+ }
+ return flags;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.james.imap.store.mail.model.MailboxMembership#getDocument()
+ */
+ public Document getDocument() {
+ if (isPersistent()) {
+ return new JCRMessage(node, logger);
+
+ }
+ return this;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.james.imap.store.mail.model.MailboxMembership#getInternalDate
+ * ()
+ */
+ public Date getInternalDate() {
+ if (isPersistent()) {
+ try {
+ return
node.getProperty(INTERNAL_DATE_PROPERTY).getDate().getTime();
+
+ } catch (RepositoryException e) {
+ logger.error("Unable to access property " + FLAGGED_PROPERTY,
+ e);
+ }
+ return null;
+ }
+ return internalDate;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.james.imap.store.mail.model.MailboxMembership#getMailboxId()
+ */
+ public String getMailboxId() {
+ if (isPersistent()) {
+ try {
+ return node.getProperty(MAILBOX_UUID_PROPERTY).getString();
+ } catch (RepositoryException e) {
+ logger.error("Unable to access property "
+ + MAILBOX_UUID_PROPERTY, e);
+ }
+ }
+ return mailboxUUID;
+ }
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.james.imap.store.mail.model.MailboxMembership#getSize()
+ */
+ public int getSize() {
+ if (isPersistent()) {
+ try {
+ return new Long(node.getProperty(SIZE_PROPERTY).getLong())
+ .intValue();
+
+ } catch (RepositoryException e) {
+ logger
+ .error("Unable to access property " + SIZE_PROPERTY,
+ e);
+ }
+ return 0;
+ }
+ return size;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.james.imap.store.mail.model.MailboxMembership#getUid()
+ */
+ public long getUid() {
+ if (isPersistent()) {
+ try {
+ return node.getProperty(UID_PROPERTY).getLong();
+
+ } catch (RepositoryException e) {
+ logger.error("Unable to access property " + UID_PROPERTY, e);
+ }
+ return 0;
+ }
+ return uid;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.james.imap.store.mail.model.MailboxMembership#isAnswered()
+ */
+ public boolean isAnswered() {
+ if (isPersistent()) {
+ try {
+ return node.getProperty(ANSWERED_PROPERTY).getBoolean();
+
+ } catch (RepositoryException e) {
+ logger.error("Unable to access property " + ANSWERED_PROPERTY,
+ e);
+ }
+ return false;
+ }
+ return answered;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
org.apache.james.imap.store.mail.model.MailboxMembership#isDeleted()
+ */
+ public boolean isDeleted() {
+ if (isPersistent()) {
+ try {
+ return node.getProperty(DELETED_PROPERTY).getBoolean();
+
+ } catch (RepositoryException e) {
+ logger.error("Unable to access property " + DELETED_PROPERTY,
+ e);
+ }
+ return false;
+ }
+ return deleted;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.james.imap.store.mail.model.MailboxMembership#isDraft()
+ */
+ public boolean isDraft() {
+ if (isPersistent()) {
+ try {
+ return node.getProperty(DRAFT_PROPERTY).getBoolean();
+
+ } catch (RepositoryException e) {
+ logger.error("Unable to access property " + DRAFT_PROPERTY, e);
+ }
+ return false;
+ }
+ return draft;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
org.apache.james.imap.store.mail.model.MailboxMembership#isFlagged()
+ */
+ public boolean isFlagged() {
+ if (isPersistent()) {
+ try {
+ return node.getProperty(FLAGGED_PROPERTY).getBoolean();
+
+ } catch (RepositoryException e) {
+ logger.error("Unable to access property " + FLAGGED_PROPERTY,
+ e);
+ }
+ return false;
+ }
+ return flagged;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.james.imap.store.mail.model.MailboxMembership#isRecent()
+ */
+ public boolean isRecent() {
+ if (isPersistent()) {
+ try {
+ return node.getProperty(RECENT_PROPERTY).getBoolean();
+
+ } catch (RepositoryException e) {
+ logger.error("Unable to access property " + RECENT_PROPERTY,
e);
+ }
+ return false;
+ }
+ return recent;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.james.imap.store.mail.model.MailboxMembership#isSeen()
+ */
+ public boolean isSeen() {
+ if (isPersistent()) {
+ try {
+ return node.getProperty(SEEN_PROPERTY).getBoolean();
+
+ } catch (RepositoryException e) {
+ logger.error("Unable to access property " + SEEN_PROPERTY, e);
+ }
+ return false;
+ }
+ return seen;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.james.imap.store.mail.model.MailboxMembership#setFlags(javax
+ * .mail.Flags)
+ */
+ public void setFlags(Flags flags) {
+ if (isPersistent()) {
+ try {
+ node.setProperty(ANSWERED_PROPERTY,
+ flags.contains(Flags.Flag.ANSWERED));
+ node.setProperty(DELETED_PROPERTY,
+ flags.contains(Flags.Flag.DELETED));
+ node.setProperty(DRAFT_PROPERTY,
+ flags.contains(Flags.Flag.DRAFT));
+ node.setProperty(FLAGGED_PROPERTY,
+ flags.contains(Flags.Flag.FLAGGED));
+ node.setProperty(RECENT_PROPERTY,
+ flags.contains(Flags.Flag.RECENT));
+ node.setProperty(SEEN_PROPERTY,
+ flags.contains(Flags.Flag.SEEN));
+ } catch (RepositoryException e) {
+ logger.error("Unable to set flags", e);
+ }
+ } else {
+ answered = flags.contains(Flags.Flag.ANSWERED);
+ deleted = flags.contains(Flags.Flag.DELETED);
+ draft = flags.contains(Flags.Flag.DRAFT);
+ flagged = flags.contains(Flags.Flag.FLAGGED);
+ recent = flags.contains(Flags.Flag.RECENT);
+ seen = flags.contains(Flags.Flag.SEEN);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.james.imap.store.mail.model.MailboxMembership#unsetRecent()
+ */
+ public void unsetRecent() {
+ if (isPersistent()) {
+ try {
+ node.setProperty(RECENT_PROPERTY, false);
+
+ } catch (RepositoryException e) {
+ logger.error("Unable to access property " + RECENT_PROPERTY,
e);
+ }
+ } else {
+ recent = false;
+ }
+ }
+
+
+
+ public String getId() {
+ if (isPersistent()) {
+ try {
+ return node.getUUID();
+ } catch (RepositoryException e) {
+ logger.error("Unable to access property " +
JcrConstants.JCR_UUID, e);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 31;
+ int result = 1;
+ result = PRIME * result + getUUID().hashCode();
+ result = PRIME * result + getMailboxId().hashCode();
+ return result;
+ }
+
+
+ public String toString() {
+ final String retValue =
+ "message("
+ + "uuid = " + getUUID()
+ + "mailboxUUID = " + this.getMailboxId() + TOSTRING_SEPARATOR
+ + "uuid = " + this.getId() + TOSTRING_SEPARATOR
+ + "internalDate = " + this.getInternalDate() + TOSTRING_SEPARATOR
+ + "size = " + this.getSize() + TOSTRING_SEPARATOR
+ + "answered = " + this.isAnswered() + TOSTRING_SEPARATOR
+ + "deleted = " + this.isDeleted() + TOSTRING_SEPARATOR
+ + "draft = " + this.isDraft() + TOSTRING_SEPARATOR
+ + "flagged = " + this.isFlagged() + TOSTRING_SEPARATOR
+ + "recent = " + this.isRecent() + TOSTRING_SEPARATOR
+ + "seen = " + this.isSeen() + TOSTRING_SEPARATOR
+ + " )";
+
+ return retValue;
+ }
}
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=943594&r1=943593&r2=943594&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 May 12 17:46:39 2010
@@ -33,8 +33,17 @@
- imap:propertyOrder (Long) mandatory
[imap:message] > mix:referenceable, nt:file
+ - imap:mailboxUUID (String) mandatory
+ - imap:uid (LONG) mandatory
+ - imap:size (LONG) mandatory
+ - imap:answered (BOOLEAN) mandatory
+ - imap:deleted (BOOLEAN) mandatory
+ - imap:draft (BOOLEAN) mandatory
+ - imap:flagged (BOOLEAN) mandatory
+ - imap:recent (BOOLEAN) mandatory
+ - imap:seen (BOOLEAN) mandatory
+ - imap:internalDate (DATE) mandatory
- imap:messageBodyStartOctet (LONG) mandatory
- - imap:messageFullContentOctets (LONG) mandatory
- imap:messageTextualLineCount (LONG)
- imap:messageSubType (String) mandatory
+ messageHeaders (imap:messageHeaders)
@@ -50,18 +59,4 @@
- imap:mailboxUidValidity (LONG) mandatory
- imap:mailboxName (STRING) mandatory
- imap:mailboxLastUid (LONG) mandatory
- + *
-
-
-[imap:mailboxMembership] > mix:referenceable, nt:hierarchyNode
- - imap:mailboxUUID (String) mandatory
- - imap:uid (LONG) mandatory
- - imap:size (LONG) mandatory
- - imap:answered (BOOLEAN) mandatory
- - imap:deleted (BOOLEAN) mandatory
- - imap:draft (BOOLEAN) mandatory
- - imap:flagged (BOOLEAN) mandatory
- - imap:recent (BOOLEAN) mandatory
- - imap:seen (BOOLEAN) mandatory
- - imap:internalDate (DATE) mandatory
- + message (imap:message) mandatory
+ + * (nt:folder)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]