Author: jukka
Date: Thu May 17 03:42:30 2007
New Revision: 538867
URL: http://svn.apache.org/viewvc?view=rev&rev=538867
Log:
james-jcr: Support for separate inbox folders
Modified:
james/server/sandbox/james-jcr/src/main/java/org/apache/james/jcr/AvalonJCRMailRepository.java
james/server/sandbox/james-jcr/src/main/java/org/apache/james/jcr/JCRMailRepository.java
Modified:
james/server/sandbox/james-jcr/src/main/java/org/apache/james/jcr/AvalonJCRMailRepository.java
URL:
http://svn.apache.org/viewvc/james/server/sandbox/james-jcr/src/main/java/org/apache/james/jcr/AvalonJCRMailRepository.java?view=diff&rev=538867&r1=538866&r2=538867
==============================================================================
---
james/server/sandbox/james-jcr/src/main/java/org/apache/james/jcr/AvalonJCRMailRepository.java
(original)
+++
james/server/sandbox/james-jcr/src/main/java/org/apache/james/jcr/AvalonJCRMailRepository.java
Thu May 17 03:42:30 2007
@@ -59,6 +59,19 @@
if (workspace != null) {
setWorkspace(workspace);
}
+
+ String path =
+ configuration.getAttribute("destinationURL", "james:repository");
+ if (path.startsWith("jcr://")) {
+ path = path.substring("jcr://".length());
+ }
+ while (path.startsWith("/")) {
+ path = path.substring(1);
+ }
+ while (path.endsWith("/")) {
+ path = path.substring(0, path.length() - 1);
+ }
+ setPath(path);
}
//-------------------------------------------------------< Initializable >
@@ -78,6 +91,11 @@
clazz.getResourceAsStream("james.cnd"),
JackrabbitNodeTypeManager.TEXT_X_JCR_CND);
}
+ }
+
+ if (!session.getRootNode().hasNode(getPath())) {
+ session.getRootNode().addNode(getPath(), "nt:folder");
+ session.save();
}
} finally {
session.logout();
Modified:
james/server/sandbox/james-jcr/src/main/java/org/apache/james/jcr/JCRMailRepository.java
URL:
http://svn.apache.org/viewvc/james/server/sandbox/james-jcr/src/main/java/org/apache/james/jcr/JCRMailRepository.java?view=diff&rev=538867&r1=538866&r2=538867
==============================================================================
---
james/server/sandbox/james-jcr/src/main/java/org/apache/james/jcr/JCRMailRepository.java
(original)
+++
james/server/sandbox/james-jcr/src/main/java/org/apache/james/jcr/JCRMailRepository.java
Thu May 17 03:42:30 2007
@@ -29,6 +29,7 @@
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
+import java.util.Date;
import java.util.Iterator;
import java.util.Properties;
import java.util.logging.Logger;
@@ -86,6 +87,11 @@
private String workspace;
/**
+ * Path (relative to root) of the mail repository within the workspace.
+ */
+ private String path = "james:repository";
+
+ /**
* Retuns the JCR content repository used as the mail repository.
*
* @return JCR content repository
@@ -143,6 +149,24 @@
this.workspace = workspace;
}
+ /**
+ * Returns the path of the mail repository within the workspace.
+ *
+ * @return repository path
+ */
+ public String getPath() {
+ return path;
+ }
+
+ /**
+ * Sets the path of the mail repository within the workspace.
+ *
+ * @param path repository path
+ */
+ public void setPath(String path) {
+ this.path = path;
+ }
+
//------------------------------------------------------< MailRepository >
public Iterator list() throws MessagingException {
@@ -153,7 +177,8 @@
Collection keys = new ArrayList();
QueryManager manager =
session.getWorkspace().getQueryManager();
Query query = manager.createQuery(
- "//element(*,james:mail)", Query.XPATH);
+ "/jcr:root/" + path + "//element(*,james:mail)",
+ Query.XPATH);
NodeIterator iterator = query.execute().getNodes();
while (iterator.hasNext()) {
String name = iterator.nextNode().getName();
@@ -178,7 +203,8 @@
String name = ISO9075.encode(Text.escapeIllegalJcrChars(key));
QueryManager manager =
session.getWorkspace().getQueryManager();
Query query = manager.createQuery(
- "//element(" + name + ",james:mail)", Query.XPATH);
+ "/jcr:root/" + path + "//element(" + name +
",james:mail)",
+ Query.XPATH);
NodeIterator iterator = query.execute().getNodes();
if (iterator.hasNext()) {
return getMail(iterator.nextNode());
@@ -207,17 +233,17 @@
String name = Text.escapeIllegalJcrChars(mail.getName());
QueryManager manager =
session.getWorkspace().getQueryManager();
Query query = manager.createQuery(
- "//element(" + name + ",james:mail)", Query.XPATH);
+ "/jcr:root/" + path + "//element(" + name +
",james:mail)",
+ Query.XPATH);
NodeIterator iterator = query.execute().getNodes();
if (iterator.hasNext()) {
while (iterator.hasNext()) {
setMail(iterator.nextNode(), mail);
}
} else {
- Node root = session.getRootNode();
- Node node = root.addNode(name, "james:mail");
+ Node parent = session.getRootNode().getNode(path);
+ Node node = parent.addNode(name, "james:mail");
Node resource = node.addNode("jcr:content", "nt:resource");
- resource.setProperty("jcr:lastModified",
Calendar.getInstance());
resource.setProperty("jcr:mimeType", "message/rfc822");
setMail(node, mail);
}
@@ -245,13 +271,18 @@
String name = ISO9075.encode(Text.escapeIllegalJcrChars(key));
QueryManager manager =
session.getWorkspace().getQueryManager();
Query query = manager.createQuery(
- "//element(" + name + ",james:mail)", Query.XPATH);
+ "/jcr:root/" + path + "//element(" + name +
",james:mail)",
+ Query.XPATH);
NodeIterator nodes = query.execute().getNodes();
- while (nodes.hasNext()) {
- nodes.nextNode().remove();
+ if (nodes.hasNext()) {
+ while (nodes.hasNext()) {
+ nodes.nextNode().remove();
+ }
+ session.save();
+ logger.info("Mail " + key + " removed from repository");
+ } else {
+ logger.warning("Mail " + key + " not found");
}
- session.save();
- logger.info("Mail " + key + " removed from repository");
} finally {
session.logout();
}
@@ -275,22 +306,22 @@
Iterator iterator = mails.iterator();
while (iterator.hasNext()) {
Mail mail = (Mail) iterator.next();
- String name = ISO9075.encode(Text.escapeIllegalJcrChars(
- mail.getName()));
- Query query = manager.createQuery(
- "//element(" + name + ",james:mail)", Query.XPATH);
- NodeIterator nodes = query.execute().getNodes();
- while (nodes.hasNext()) {
- nodes.nextNode().remove();
+ try {
+ String name = ISO9075.encode(
+ Text.escapeIllegalJcrChars(mail.getName()));
+ Query query = manager.createQuery(
+ "/jcr:root/" + path + "//element(" + name +
",james:mail)",
+ Query.XPATH);
+ NodeIterator nodes = query.execute().getNodes();
+ while (nodes.hasNext()) {
+ nodes.nextNode().remove();
+ }
+ } catch (PathNotFoundException e) {
+ logger.warning("Mail " + mail.getName() + " not
found");
}
}
session.save();
- iterator = mails.iterator();
- while (iterator.hasNext()) {
- Mail mail = (Mail) iterator.next();
- logger.info(
- "Mail " + mail.getName() + " removed from
repository");
- }
+ logger.info("Mail collection removed from repository");
} finally {
session.logout();
}
@@ -327,6 +358,7 @@
name, getSender(node), getRecipients(node),
getMessage(node));
mail.setState(getState(node));
+ mail.setLastUpdated(getLastUpdated(node));
mail.setErrorMessage(getError(node));
mail.setRemoteHost(getRemoteHost(node));
mail.setRemoteAddr(getRemoteAddr(node));
@@ -346,6 +378,7 @@
private void setMail(Node node, Mail mail)
throws MessagingException, RepositoryException, IOException {
setState(node, mail.getState());
+ setLastUpdated(node, mail.getLastUpdated());
setError(node, mail.getErrorMessage());
setRemoteHost(node, mail.getRemoteHost());
setRemoteAddr(node, mail.getRemoteAddr());
@@ -379,6 +412,43 @@
*/
private void setState(Node node, String state) throws RepositoryException {
node.setProperty("james:state", state);
+ }
+
+ /**
+ * Reads the update timestamp from the jcr:content/jcr:lastModified
property.
+ *
+ * @param node mail node
+ * @return update timestamp
+ * @throws RepositoryException if a repository error occurs
+ */
+ private Date getLastUpdated(Node node) throws RepositoryException {
+ try {
+ node = node.getNode("jcr:content");
+ } catch (PathNotFoundException e) {
+ node = node.getProperty("jcr:content").getNode();
+ }
+ return node.getProperty("jcr:lastModified").getDate().getTime();
+ }
+
+ /**
+ * Writes the update timestamp to the jcr:content/jcr:lastModified
property.
+ *
+ * @param node mail node
+ * @param updated update timestamp, or <code>null</code> if not set
+ * @throws RepositoryException if a repository error occurs
+ */
+ private void setLastUpdated(Node node, Date updated)
+ throws RepositoryException {
+ try {
+ node = node.getNode("jcr:content");
+ } catch (PathNotFoundException e) {
+ node = node.getProperty("jcr:content").getNode();
+ }
+ Calendar calendar = Calendar.getInstance();
+ if (updated != null) {
+ calendar.setTime(updated);
+ }
+ node.setProperty("jcr:lastModified", calendar);
}
/**
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]