MAILBOX-292 MaildirId should be relying on UUID

As these ids are randomly allocated, using 128 bits instead of 32 allow
to drastically reduce chances of collisions.


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/acdb0da0
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/acdb0da0
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/acdb0da0

Branch: refs/heads/master
Commit: acdb0da00935a83ab4bbc08b891e615f5a688f12
Parents: 7e32da5
Author: Benoit Tellier <btell...@linagora.com>
Authored: Mon Dec 3 10:14:33 2018 +0700
Committer: Benoit Tellier <btell...@linagora.com>
Committed: Tue Dec 4 15:47:47 2018 +0700

----------------------------------------------------------------------
 .../james/mailbox/maildir/MaildirFolder.java    | 13 ++---
 .../apache/james/mailbox/maildir/MaildirId.java | 59 ++++++++------------
 .../maildir/MaildirMailboxIdDeserializer.java   |  2 +-
 .../maildir/mail/MaildirMailboxMapper.java      |  3 +-
 .../MaildirMailboxIdDeserializerTest.java       |  6 +-
 5 files changed, 35 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/acdb0da0/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
----------------------------------------------------------------------
diff --git 
a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
 
b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
index b31b522..bbb7694 100644
--- 
a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
+++ 
b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
@@ -27,6 +27,7 @@ import java.io.FilenameFilter;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.PrintWriter;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedList;
@@ -39,6 +40,7 @@ import java.util.SortedMap;
 import java.util.TreeMap;
 
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.james.mailbox.MailboxPathLocker;
 import org.apache.james.mailbox.MailboxPathLocker.LockAwareExecution;
@@ -324,12 +326,9 @@ public class MaildirFolder {
             saveMailboxId(maildirId);
             return maildirId;
         }
-        try (FileInputStream fis = new FileInputStream(mailboxIdFile);
-             InputStreamReader isr = new InputStreamReader(fis)) {
-            char[] mailboxId = new char[20];
-            int len = isr.read(mailboxId);
-            int idAsInt = Integer.parseInt(String.valueOf(mailboxId, 0, 
len).trim());
-            return MaildirId.of(idAsInt);
+        try (FileInputStream fileInputStream = new 
FileInputStream(mailboxIdFile)) {
+            String serializedMaildirId = IOUtils.toString(fileInputStream, 
StandardCharsets.UTF_8);
+            return MaildirId.fromString(serializedMaildirId);
         }
     }
 
@@ -343,7 +342,7 @@ public class MaildirFolder {
             throw new IOException("Could not create file " + mailboxIdFile);
         }
         try (FileOutputStream fos = new FileOutputStream(mailboxIdFile)) {
-            fos.write(String.valueOf(id.getRawId()).getBytes());
+            fos.write(id.serialize().getBytes(StandardCharsets.UTF_8));
         }
     }
     

http://git-wip-us.apache.org/repos/asf/james-project/blob/acdb0da0/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirId.java
----------------------------------------------------------------------
diff --git 
a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirId.java 
b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirId.java
index 18df444..f620a9d 100644
--- 
a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirId.java
+++ 
b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirId.java
@@ -19,7 +19,8 @@
 package org.apache.james.mailbox.maildir;
 
 import java.io.Serializable;
-import java.security.SecureRandom;
+import java.util.Objects;
+import java.util.UUID;
 
 import org.apache.james.mailbox.model.MailboxId;
 
@@ -28,64 +29,50 @@ public class MaildirId implements MailboxId, Serializable {
     public static class Factory implements MailboxId.Factory {
         @Override
         public MaildirId fromString(String serialized) {
-            return of(Integer.valueOf(serialized));
+            return MaildirId.fromString(serialized);
         }
     }
 
-    private static final SecureRandom RANDOM = new SecureRandom();
-
     public static MaildirId random() {
-        return MaildirId.of(Math.abs(RANDOM.nextInt()));
+        return MaildirId.of(UUID.randomUUID());
     }
 
-    public static MaildirId of(int id) {
+    public static MaildirId of(UUID id) {
         return new MaildirId(id);
     }
 
-    private final int id;
-
-    private MaildirId(int id) {
-        this.id = id;
+    public static MaildirId fromString(String serialized) {
+        return of(UUID.fromString(serialized));
     }
 
-    public int getRawId() {
-        return id;
+    private final UUID id;
+
+    private MaildirId(UUID id) {
+        this.id = id;
     }
 
     @Override
     public String serialize() {
-        return String.valueOf(id);
+        return id.toString();
     }
 
     @Override
     public String toString() {
-        return String.valueOf(id);
-    }
-    
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + id;
-        return result;
+        return id.toString();
     }
 
     @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null) {
-            return false;
-        }
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-        MaildirId other = (MaildirId) obj;
-        if (id != other.id) {
-            return false;
+    public final boolean equals(Object o) {
+        if (o instanceof MaildirId) {
+            MaildirId maildirId = (MaildirId) o;
+
+            return Objects.equals(this.id, maildirId.id);
         }
-        return true;
+        return false;
     }
 
+    @Override
+    public final int hashCode() {
+        return Objects.hash(id);
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/acdb0da0/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxIdDeserializer.java
----------------------------------------------------------------------
diff --git 
a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxIdDeserializer.java
 
b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxIdDeserializer.java
index 16f301c..088b5b8 100644
--- 
a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxIdDeserializer.java
+++ 
b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxIdDeserializer.java
@@ -27,7 +27,7 @@ public class MaildirMailboxIdDeserializer implements 
MailboxIdDeserializer {
     @Override
     public MaildirId deserialize(String serializedMailboxId) throws 
MailboxIdDeserialisationException {
         try {
-            return MaildirId.of(Integer.valueOf(serializedMailboxId));
+            return MaildirId.fromString(serializedMailboxId);
         } catch (Exception e) {
             throw new MailboxIdDeserialisationException("Can not deserialize " 
+ serializedMailboxId, e);
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/acdb0da0/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
----------------------------------------------------------------------
diff --git 
a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
 
b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
index 454d857..173aba6 100644
--- 
a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
+++ 
b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
@@ -24,7 +24,6 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
-import java.util.Random;
 import java.util.regex.Pattern;
 
 import org.apache.commons.io.FileUtils;
@@ -198,7 +197,7 @@ public class MaildirMailboxMapper extends 
NonTransactionalMapper implements Mail
                         FileUtils.forceMkdir(originalFolder.getCurFolder());
                         FileUtils.forceMkdir(originalFolder.getNewFolder());
                         FileUtils.forceMkdir(originalFolder.getTmpFolder());
-                        originalFolder.setMailboxId(MaildirId.of(Math.abs(new 
Random().nextInt())));
+                        originalFolder.setMailboxId(MaildirId.random());
                     } catch (IOException e) {
                         throw new MailboxException("Failed to save Mailbox " + 
mailbox, e);
                     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/acdb0da0/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxIdDeserializerTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxIdDeserializerTest.java
 
b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxIdDeserializerTest.java
index a56a0fc..b1e1667 100644
--- 
a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxIdDeserializerTest.java
+++ 
b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxIdDeserializerTest.java
@@ -21,6 +21,8 @@ package org.apache.james.mailbox.maildir;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+import java.util.UUID;
+
 import 
org.apache.james.mailbox.store.mail.model.MailboxIdDeserialisationException;
 import org.apache.james.mailbox.store.mail.model.MailboxIdDeserializer;
 import org.junit.Before;
@@ -28,9 +30,9 @@ import org.junit.Test;
 
 public class MaildirMailboxIdDeserializerTest {
 
-    private static final String SERIALIZED_ID = "123";
+    private static final String SERIALIZED_ID = 
"2f3a4fcc-ca64-36e3-9bcf-33e92dd93135";
     private static final String MALFORMED_SERIALIZED_ID = "az";
-    private static final MaildirId MAILDIR_ID = 
MaildirId.of(Integer.valueOf(SERIALIZED_ID));
+    private static final MaildirId MAILDIR_ID = 
MaildirId.of(UUID.fromString(SERIALIZED_ID));
 
     private MailboxIdDeserializer mailboxIdDeserializer;
 


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

Reply via email to