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 er...@apache.org on 2013/01/03 16:03:16 UTC

svn commit: r1428384 - in /james/mailbox/trunk: maildir/src/main/java/org/apache/james/mailbox/maildir/ maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/ maildir/src/test/java/org/apache/james/mailbox/maildir/ spring/src/main/resources...

Author: eric
Date: Thu Jan  3 15:03:15 2013
New Revision: 1428384

URL: http://svn.apache.org/viewvc?rev=1428384&view=rev
Log:
Support lenian and strict file name parsing for maildir mailbox impl, patch contributed by Eike Kettner (MAILBOX-187)

Added:
    james/mailbox/trunk/maildir/src/test/java/org/apache/james/mailbox/maildir/MailderMessageNameTest.java
Modified:
    james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
    james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMessageName.java
    james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
    james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMessage.java
    james/mailbox/trunk/spring/src/main/resources/META-INF/org/apache/james/spring-mailbox-maildir.xml
    james/mailbox/trunk/spring/src/main/resources/mailbox-maildir.properties

Modified: james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java?rev=1428384&r1=1428383&r2=1428384&view=diff
==============================================================================
--- james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java (original)
+++ james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java Thu Jan  3 15:03:15 2013
@@ -72,6 +72,7 @@ public class MaildirFolder {
     private int messageCount = 0;
     private long uidValidity = -1;
     private MailboxACL acl;
+    private boolean messageNameStrictParse = false;
 
     private final MailboxPathLocker locker;
 
@@ -92,8 +93,36 @@ public class MaildirFolder {
         this.locker = locker;
         this.path = path;
     }
-    
+
+    private MaildirMessageName newMaildirMessageName(MaildirFolder folder, String fullName) {
+        MaildirMessageName mdn = new MaildirMessageName(folder, fullName);
+        mdn.setMessageNameStrictParse(isMessageNameStrictParse());
+        return mdn;
+    }
+
     /**
+     * Returns whether the names of message files in this folder are parsed in
+     * a strict manner ({@code true}), which means a size field and flags are
+     * expected.
+     *
+     * @return
+     */
+    public boolean isMessageNameStrictParse() {
+        return messageNameStrictParse;
+    }
+
+    /**
+     * Specifies whether the names of message files in this folder are parsed in
+     * a strict manner ({@code true}), which means a size field and flags are
+     * expected.
+     *
+     * @param messageNameStrictParse
+     */
+    public void setMessageNameStrictParse(boolean messageNameStrictParse) {
+        this.messageNameStrictParse = messageNameStrictParse;
+    }
+
+  /**
      * Returns the {@link File} of this Maildir folder.
      * @return the root folder
      */
@@ -323,7 +352,7 @@ public class MaildirFolder {
                             }
                             
                             if (line.substring(0, gap).equals(uidString)) {
-                                return new MaildirMessageName(MaildirFolder.this, line.substring(gap + 1));
+                                return newMaildirMessageName(MaildirFolder.this, line.substring(gap + 1));
                             }
                         }
                     }
@@ -499,7 +528,7 @@ public class MaildirFolder {
                             String name = line.substring(gap + 1, line.length());
                             for (String recentFile : recentFiles) {
                                 if (recentFile.equals(name)) {
-                                    recentMessages.put(uid, new MaildirMessageName(MaildirFolder.this, recentFile));
+                                    recentMessages.put(uid, newMaildirMessageName(MaildirFolder.this, recentFile));
                                     counter++;
                                     break;
                                 }
@@ -533,7 +562,7 @@ public class MaildirFolder {
             messageCount = curFiles.length + newFiles.length;
             String[] allFiles = (String[]) ArrayUtils.addAll(curFiles, newFiles);
             for (String file : allFiles)
-                uidMap.put(getNextUid(), new MaildirMessageName(MaildirFolder.this, file));
+                uidMap.put(getNextUid(), newMaildirMessageName(MaildirFolder.this, file));
             //uidMap = new TreeMap<Long, MaildirMessageName>(uidMap);
             pw = new PrintWriter(uidList);
             pw.println(createUidListHeader());
@@ -580,7 +609,7 @@ public class MaildirFolder {
             }
             String[] allFiles = (String[]) ArrayUtils.addAll(curFiles, newFiles);
             for (String file : allFiles) {
-                MaildirMessageName messageName = new MaildirMessageName(MaildirFolder.this, file);
+                MaildirMessageName messageName = newMaildirMessageName(MaildirFolder.this, file);
                 Long uid = reverseUidMap.get(messageName.getBaseName());
                 if (uid == null)
                     uid = getNextUid();
@@ -630,7 +659,7 @@ public class MaildirFolder {
                         if (to != -1 && uid > to)
                             break;
                         String name = line.substring(gap + 1, line.length());
-                        uidMap.put(uid, new MaildirMessageName(MaildirFolder.this, name));
+                        uidMap.put(uid, newMaildirMessageName(MaildirFolder.this, name));
                     }
                 }
             }
@@ -859,7 +888,7 @@ public class MaildirFolder {
                         }
                         
                         if (uid == Long.valueOf(line.substring(0, line.indexOf(" ")))) {
-                            deletedMessage = new MaildirMessageName(MaildirFolder.this, line.substring(gap + 1, line.length()));
+                            deletedMessage = newMaildirMessageName(MaildirFolder.this, line.substring(gap + 1, line.length()));
                             messageCount--;
                         }
                         else {

Modified: james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMessageName.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMessageName.java?rev=1428384&r1=1428383&r2=1428384&view=diff
==============================================================================
--- james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMessageName.java (original)
+++ james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMessageName.java Thu Jan  3 15:03:15 2013
@@ -103,12 +103,21 @@ public class MaildirMessageName {
     private Date internalDate;
     private Long size;
     private Flags flags;
+    private boolean messageNameStrictParse = false;
     
     public MaildirMessageName(MaildirFolder parentFolder, String fullName) {
         this.parentFolder = parentFolder;
         setFullName(fullName);
     }
 
+    public boolean isMessageNameStrictParse() {
+        return messageNameStrictParse;
+    }
+
+    public void setMessageNameStrictParse(boolean messageNameStrictParse) {
+        this.messageNameStrictParse = messageNameStrictParse;
+    }
+
     /**
      * Tests whether the file or directory belonging to this {@link MaildirFolder} exists.
      * If the file exists, its absolute path is written to absPath.
@@ -241,16 +250,37 @@ public class MaildirMessageName {
      * into its components hostname, size and flags and fills the respective variables.
      */
     private void splitHostNameAndMeta() {
-        int firstEnd = hostnameAndMeta.indexOf(',');
-        int secondEnd = hostnameAndMeta.indexOf(':', firstEnd + 1);
-        hostname = hostnameAndMeta.substring(0, firstEnd);
-        // there are flags
-        if (secondEnd != -1) {
-            sizeString = hostnameAndMeta.substring(firstEnd, secondEnd);
-            flagsString = hostnameAndMeta.substring(secondEnd, hostnameAndMeta.length());
+        String[] hostnamemetaFlags = hostnameAndMeta.split(":", 2);
+        if (hostnamemetaFlags.length >= 1) {
+          this.hostnameAndMeta = hostnamemetaFlags[0];
+          int firstEnd = hostnameAndMeta.indexOf(',');
+
+          // read size field if existent
+          if (firstEnd > 0) {
+            hostname = hostnameAndMeta.substring(0, firstEnd);
+            String attrStr = hostnameAndMeta.substring(firstEnd);
+            String[] fields = attrStr.split(",");
+            for (String field : fields) {
+              if (field.startsWith("S=")) {
+                  sizeString = "," + field;
+              }
+            }
+          } else {
+            sizeString = null;
+            hostname = this.hostnameAndMeta;
+          }
         }
-        else {
-            sizeString = hostnameAndMeta.substring(firstEnd, hostnameAndMeta.length());
+
+        if (hostnamemetaFlags.length >= 2) {
+            this.flagsString = ":" + hostnamemetaFlags[1];
+        }
+        if (isMessageNameStrictParse()) {
+            if (sizeString == null) {
+                throw new IllegalArgumentException("No message size found in message name: "+ fullName);
+            }
+            if (flagsString == null) {
+                throw new IllegalArgumentException("No flags found in message name: "+ fullName);
+            }
         }
     }
     
@@ -276,7 +306,8 @@ public class MaildirMessageName {
             split();
             if (flagsString == null)
                 return null;
-            flags = decodeFlags(flagsString.substring(3)); // skip the ":2," part
+            if (flagsString.length() >= 3)
+                flags = decodeFlags(flagsString.substring(3)); // skip the ":2," part
         }
         return flags;
     }
@@ -290,6 +321,8 @@ public class MaildirMessageName {
             split();
             if (sizeString == null)
                 return null;
+            if (!sizeString.startsWith(",S="))
+                return null;
             size = Long.valueOf(sizeString.substring(3)); // skip the ",S=" part
         }
         return size;

Modified: james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java?rev=1428384&r1=1428383&r2=1428384&view=diff
==============================================================================
--- james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java (original)
+++ james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java Thu Jan  3 15:03:15 2013
@@ -33,7 +33,6 @@ import org.apache.james.mailbox.store.JV
 import org.apache.james.mailbox.store.mail.ModSeqProvider;
 import org.apache.james.mailbox.store.mail.UidProvider;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
-import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
 
 public class MaildirStore implements UidProvider<Integer>, ModSeqProvider<Integer>{
 
@@ -48,7 +47,9 @@ public class MaildirStore implements Uid
     
     private File maildirRootFile;
     private final MailboxPathLocker locker;
-    
+
+    private boolean messageNameStrictParse = false;
+
     /**
      * Construct a MaildirStore with a location. The location String
      * currently may contain the
@@ -78,7 +79,9 @@ public class MaildirStore implements Uid
      * @return The MaildirFolder
      */
     public MaildirFolder createMaildirFolder(Mailbox<Integer> mailbox) {
-        return new MaildirFolder(getFolderName(mailbox), new MailboxPath(mailbox.getNamespace(), mailbox.getUser(), mailbox.getName()), locker);
+        MaildirFolder mf = new MaildirFolder(getFolderName(mailbox), new MailboxPath(mailbox.getNamespace(), mailbox.getUser(), mailbox.getName()), locker);
+        mf.setMessageNameStrictParse(isMessageNameStrictParse());
+        return mf;
     }
 
     /**
@@ -105,7 +108,7 @@ public class MaildirStore implements Uid
     public Mailbox<Integer> loadMailbox(MailboxSession session, MailboxPath mailboxPath)
     throws MailboxNotFoundException, MailboxException {
         MaildirFolder folder = new MaildirFolder(getFolderName(mailboxPath), mailboxPath, locker);
-
+        folder.setMessageNameStrictParse(isMessageNameStrictParse());
         if (!folder.exists())
             throw new MailboxNotFoundException(mailboxPath);
         return loadMailbox(session, folder.getRootFile(), mailboxPath);
@@ -120,6 +123,7 @@ public class MaildirStore implements Uid
      */
     private Mailbox<Integer> loadMailbox(MailboxSession session, File mailboxFile, MailboxPath mailboxPath) throws MailboxException {
         MaildirFolder folder = new MaildirFolder(mailboxFile.getAbsolutePath(), mailboxPath, locker);
+        folder.setMessageNameStrictParse(isMessageNameStrictParse());
         try {
             return new MaildirMailbox<Integer>(session, mailboxPath, folder);
         } catch (IOException e) {
@@ -261,4 +265,27 @@ public class MaildirStore implements Uid
     public long lastUid(MailboxSession session, Mailbox<Integer> mailbox) throws MailboxException {
        return createMaildirFolder(mailbox).getLastUid(session);
     }
+
+    /**
+     * Returns whether the names of message files in this store are parsed in
+     * a strict manner ({@code true}), which means a size field and flags are
+     * expected.
+     * @return
+     */
+    public boolean isMessageNameStrictParse() {
+        return messageNameStrictParse;
+    }
+
+    /**
+     * Specifies whether the names of message files in this store are parsed in
+     * a strict manner ({@code true}), which means a size field and flags are
+     * expected.
+     *
+     * Default is {@code false}.
+     *
+     * @param messageNameStrictParse
+     */
+    public void setMessageNameStrictParse(boolean messageNameStrictParse) {
+        this.messageNameStrictParse = messageNameStrictParse;
+    }
 }

Modified: james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMessage.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMessage.java?rev=1428384&r1=1428383&r2=1428384&view=diff
==============================================================================
--- james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMessage.java (original)
+++ james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMessage.java Thu Jan  3 15:03:15 2013
@@ -18,18 +18,6 @@
  ****************************************************************/
 package org.apache.james.mailbox.maildir.mail.model;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PushbackInputStream;
-import java.util.Date;
-import java.util.List;
-
-import javax.mail.Flags;
-import javax.mail.util.SharedFileInputStream;
-
 import org.apache.commons.io.IOUtils;
 import org.apache.james.mailbox.maildir.MaildirFolder;
 import org.apache.james.mailbox.maildir.MaildirMessageName;
@@ -47,6 +35,12 @@ import org.apache.james.mime4j.stream.Mi
 import org.apache.james.mime4j.stream.MimeTokenStream;
 import org.apache.james.mime4j.stream.RecursionMode;
 
+import javax.mail.Flags;
+import javax.mail.util.SharedFileInputStream;
+import java.io.*;
+import java.util.Date;
+import java.util.List;
+
 public class MaildirMessage extends AbstractMessage<Integer> {
 
     private MaildirMessageName messageName;
@@ -78,6 +72,8 @@ public class MaildirMessage extends Abst
         } else {
             // if the message resist in the new folder its RECENT
             if (file.getParentFile().getName().equals(MaildirFolder.NEW)) {
+                if (flags == null)
+                    flags = new Flags();
                 flags.add(Flags.Flag.RECENT);
             }
         }
@@ -378,7 +374,16 @@ public class MaildirMessage extends Abst
      */
     @Override
     public long getFullContentOctets() {
-        return messageName.getSize();
+        Long size = messageName.getSize();
+        if (size != null) {
+            return size;
+        } else {
+            try {
+                return messageName.getFile().length();
+            } catch (FileNotFoundException e) {
+                return -1;
+            }
+        }
     }
 
     /**

Added: james/mailbox/trunk/maildir/src/test/java/org/apache/james/mailbox/maildir/MailderMessageNameTest.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/test/java/org/apache/james/mailbox/maildir/MailderMessageNameTest.java?rev=1428384&view=auto
==============================================================================
--- james/mailbox/trunk/maildir/src/test/java/org/apache/james/mailbox/maildir/MailderMessageNameTest.java (added)
+++ james/mailbox/trunk/maildir/src/test/java/org/apache/james/mailbox/maildir/MailderMessageNameTest.java Thu Jan  3 15:03:15 2013
@@ -0,0 +1,235 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.mailbox.maildir;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNull;
+import static junit.framework.Assert.fail;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.mail.Flags;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(value = Parameterized.class)
+public class MailderMessageNameTest {
+
+    private String invalidName;
+    private String validName;
+    private Parts parts;
+
+    public MailderMessageNameTest(String invalidName, Parts parts) {
+        this.invalidName = invalidName;
+        this.validName = parts.fullName;
+        this.parts = parts;
+    }
+
+    @Parameterized.Parameters
+    public static List<Object[]> testData() {
+        List<Object[]> args = new ArrayList<Object[]>();
+        // no size, two flags
+        Parts parts = Parts.fullName("1328026049.19146_0.km1111:2,RS").timeSeconds(1328026049)
+                .baseName("1328026049.19146_0.km1111").flagAnswered().flagSeen();
+        args.add(valid(parts));
+
+        // size and flag
+        parts = Parts.fullName("1328613172.M569643P1862V0000000000000902I00EE42CE_0.km1111,S=13103:2,S")
+                .timeSeconds(1328613172).size(13103L)
+                .baseName("1328613172.M569643P1862V0000000000000902I00EE42CE_0.km1111").flagSeen();
+        args.add(valid(parts));
+
+        // size, no flags
+        parts = Parts.fullName("1340124194.M723289P3184V0000000000000902I006780E9_6.km1111,S=1344:2,")
+                .baseName("1340124194.M723289P3184V0000000000000902I006780E9_6.km1111").timeSeconds(1340124194)
+                .size(1344L);
+        args.add(valid(parts));
+
+        // three flags, no size
+        parts = Parts.fullName("1106685752.12132_0.km1111:2,FRS").baseName("1106685752.12132_0.km1111")
+                .timeSeconds(1106685752).flagFlagged().flagAnswered().flagSeen();
+        args.add(valid(parts));
+
+        // with dovecot attributes
+        parts = Parts.fullName("1035478339.27041_118.foo.org,S=1000,W=1030:2,S")
+                .baseName("1035478339.27041_118.foo.org").timeSeconds(1035478339).size(1000L).flagSeen();
+        args.add(valid(parts));
+
+        parts = parts.copy();
+        parts.fullName = "1035478339.27041_118.foo.org,W=1030,S=1000:2,S";
+        args.add(valid(parts));
+
+        // new mail, no info part at all. found in courier maildirs
+        parts = Parts.fullName("1355543030.15049_0.foo.org").baseName("1355543030.15049_0.foo.org")
+                .timeSeconds(1355543030).noFlags();
+        args.add(valid(parts));
+
+        // new mail, generated by james
+        parts = Parts.fullName("1356001301.e563087e30181513.foohost,S=629:2,")
+                .baseName("1356001301.e563087e30181513.foohost").timeSeconds(1356001301).size(629L);
+        args.add(valid(parts));
+
+        parts = Parts.fullName("1355675588.5c7e107958851103.foohost,S=654:2,S").timeSeconds(1355675588)
+                .baseName("1355675588.5c7e107958851103.foohost").size(654L).flagSeen();
+        args.add(valid(parts));
+
+        parts = Parts.fullName("1355675651.f3dd564265174501.foohost,S=661:2,")
+                .baseName("1355675651.f3dd564265174501.foohost").timeSeconds(1355675651).size(661L);
+        args.add(valid(parts));
+
+        return args;
+    }
+
+    private static Object[] valid(Parts parts) {
+        return invalidAndValid(null, parts);
+    }
+
+    private static Object[] invalid(String invalidName) {
+        return invalidAndValid(invalidName, null);
+    }
+
+    private static Object[] invalidAndValid(String invalidName, Parts validName) {
+        return new Object[] { invalidName, validName };
+    }
+
+    @Test
+    public void testParsing() throws Exception {
+        if (validName != null) {
+            try {
+                parseValidName(validName, parts);
+            } catch (Throwable e) {
+                throw new Exception("Valid name '" + validName + "' failed.", e);
+            }
+        }
+        if (invalidName != null) {
+            try {
+                parseInvalidName(invalidName);
+                fail("No error reported for invalid name: " + invalidName);
+            } catch (Exception e) {
+                // test successful
+            }
+        }
+    }
+
+    private void parseValidName(String name, Parts parts) throws Exception {
+        MaildirMessageName mn = new MaildirMessageName(null, name);
+        mn.setMessageNameStrictParse(false);
+        if (parts.time == null) {
+            assertNull("date", mn.getInternalDate());
+        } else {
+            assertEquals("date", mn.getInternalDate().getTime(), parts.time.longValue());
+        }
+        assertEquals("fullName", parts.fullName, mn.getFullName());
+        assertEquals("flags", parts.flags, mn.getFlags());
+        assertEquals("size", parts.size, mn.getSize());
+        assertEquals("baseName", parts.baseName, mn.getBaseName());
+    }
+
+    private void parseInvalidName(String name) throws Exception {
+    }
+
+    static class Parts {
+        public Long time;
+        public String fullName;
+        public String baseName;
+        public Long size;
+        public Flags flags = new Flags();
+
+        private Parts(String fullName) {
+            this.fullName = fullName;
+        }
+
+        public static Parts fullName(String fullName) {
+            return new Parts(fullName);
+        }
+
+        public Parts noFlags() {
+            this.flags = null;
+            return this;
+        }
+
+        public Parts flagSeen() {
+            this.flags.add(Flags.Flag.SEEN);
+            return this;
+        }
+
+        public Parts flagRecent() {
+            this.flags.add(Flags.Flag.RECENT);
+            return this;
+        }
+
+        public Parts flagAnswered() {
+            this.flags.add(Flags.Flag.ANSWERED);
+            return this;
+        }
+
+        public Parts flagFlagged() {
+            this.flags.add(Flags.Flag.FLAGGED);
+            return this;
+        }
+
+        public Parts flagDeleted() {
+            this.flags.add(Flags.Flag.DELETED);
+            return this;
+        }
+
+        public Parts flagDraft() {
+            this.flags.add(Flags.Flag.DRAFT);
+            return this;
+        }
+
+        public Parts baseName(String baseName) {
+            this.baseName = baseName;
+            return this;
+        }
+
+        public Parts size(Long size) {
+            this.size = size;
+            return this;
+        }
+
+        public Parts timeSeconds(Long time) {
+            if (time != null) {
+                this.time = time * 1000;
+            } else {
+                this.time = null;
+            }
+            return this;
+        }
+
+        public Parts timeMillis(Long time) {
+            this.time = time;
+            return this;
+        }
+
+        public Parts timeSeconds(Integer time) {
+            return timeSeconds(time != null ? time.longValue() : null);
+        }
+
+        public Parts copy() {
+            Parts p = Parts.fullName(fullName).baseName(baseName).size(size).timeMillis(time);
+            p.flags = (Flags) this.flags.clone();
+            return p;
+        }
+    }
+
+}

Modified: james/mailbox/trunk/spring/src/main/resources/META-INF/org/apache/james/spring-mailbox-maildir.xml
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/spring/src/main/resources/META-INF/org/apache/james/spring-mailbox-maildir.xml?rev=1428384&r1=1428383&r2=1428384&view=diff
==============================================================================
--- james/mailbox/trunk/spring/src/main/resources/META-INF/org/apache/james/spring-mailbox-maildir.xml (original)
+++ james/mailbox/trunk/spring/src/main/resources/META-INF/org/apache/james/spring-mailbox-maildir.xml Thu Jan  3 15:03:15 2013
@@ -49,6 +49,7 @@
     </bean>
     <bean id="maildirStore" class="org.apache.james.mailbox.maildir.MaildirStore">
         <constructor-arg index="0" value="${maildir.folder}"/>
+        <property name="messageNameStrictParse" value="${maildir.messageNameParser.strictMode}"/>
     </bean>
     <alias name="jvm-locker" alias="maildir-locker"/>
 

Modified: james/mailbox/trunk/spring/src/main/resources/mailbox-maildir.properties
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/spring/src/main/resources/mailbox-maildir.properties?rev=1428384&r1=1428383&r2=1428384&view=diff
==============================================================================
--- james/mailbox/trunk/spring/src/main/resources/mailbox-maildir.properties (original)
+++ james/mailbox/trunk/spring/src/main/resources/mailbox-maildir.properties Thu Jan  3 15:03:15 2013
@@ -17,3 +17,4 @@
 #
 
 maildir.folder=../var/store/maildir/%domain/%user
+maildir.messageNameParser.strictMode=false



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