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]

Reply via email to