This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit d45176054fecb771c932a995107696be7027cb21
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Mon Jul 8 13:34:33 2019 +0700

    JAMES-2806 bucket name resolving logic
---
 .../objectstorage/ObjectStorageBucketName.java     |   5 +
 .../ObjectStorageBucketNameResolver.java           | 104 +++++++++++++++++
 .../ObjectStorageBucketNameResolverTest.java       | 124 +++++++++++++++++++++
 3 files changed, 233 insertions(+)

diff --git 
a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBucketName.java
 
b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBucketName.java
index 62bd0c0..2eb90c8 100644
--- 
a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBucketName.java
+++ 
b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBucketName.java
@@ -22,12 +22,17 @@ package org.apache.james.blob.objectstorage;
 import java.util.Objects;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.james.blob.api.BucketName;
 
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
 
 class ObjectStorageBucketName {
 
+    static ObjectStorageBucketName of(BucketName bucketName) {
+        return of(bucketName.asString());
+    }
+
     static ObjectStorageBucketName of(String value) {
         return new ObjectStorageBucketName(value);
     }
diff --git 
a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBucketNameResolver.java
 
b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBucketNameResolver.java
new file mode 100644
index 0000000..136e9c7
--- /dev/null
+++ 
b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBucketNameResolver.java
@@ -0,0 +1,104 @@
+/****************************************************************
+ * 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.blob.objectstorage;
+
+import java.util.Optional;
+
+import org.apache.james.blob.api.BucketName;
+
+import com.google.common.base.Preconditions;
+
+class ObjectStorageBucketNameResolver {
+
+    static class Builder {
+
+        @FunctionalInterface
+        interface RequirePrefix {
+            RequireNamespace prefix(Optional<String> prefix);
+
+            default RequireNamespace noPrefix() {
+                return prefix(Optional.empty());
+            }
+
+            default RequireNamespace prefix(String prefix) {
+                return prefix(Optional.ofNullable(prefix));
+            }
+        }
+
+        @FunctionalInterface
+        interface RequireNamespace {
+            ReadyToBuild namespace(Optional<BucketName> namespace);
+
+            default ReadyToBuild namespace(BucketName namespace) {
+                return namespace(Optional.ofNullable(namespace));
+            }
+
+            default ReadyToBuild noNamespace() {
+                return namespace(Optional.empty());
+            }
+        }
+
+        static final class ReadyToBuild {
+            private final Optional<BucketName> namespace;
+            private final Optional<String> prefix;
+
+            ReadyToBuild(Optional<BucketName> namespace, Optional<String> 
prefix) {
+                this.namespace = namespace;
+                this.prefix = prefix;
+            }
+
+            ObjectStorageBucketNameResolver build() {
+                return new ObjectStorageBucketNameResolver(namespace, prefix);
+            }
+        }
+    }
+
+    static Builder.RequirePrefix builder() {
+        return prefix -> namespace -> new Builder.ReadyToBuild(namespace, 
prefix);
+    }
+
+    private final Optional<BucketName> namespace;
+    private final Optional<String> prefix;
+
+    private ObjectStorageBucketNameResolver(Optional<BucketName> namespace, 
Optional<String> prefix) {
+        Preconditions.checkNotNull(namespace);
+        Preconditions.checkNotNull(prefix);
+
+        this.namespace = namespace;
+        this.prefix = prefix;
+    }
+
+    ObjectStorageBucketName resolve(BucketName bucketName) {
+        Preconditions.checkNotNull(bucketName);
+
+        if (isNameSpace(bucketName)) {
+            return ObjectStorageBucketName.of(bucketName);
+        }
+        return prefix
+            .map(bucketPrefix -> ObjectStorageBucketName.of(bucketPrefix + 
bucketName.asString()))
+            .orElse(ObjectStorageBucketName.of(bucketName));
+    }
+
+    private boolean isNameSpace(BucketName bucketName) {
+        return namespace
+            .map(existingNamespace -> existingNamespace.equals(bucketName))
+            .orElse(false);
+    }
+}
diff --git 
a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBucketNameResolverTest.java
 
b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBucketNameResolverTest.java
new file mode 100644
index 0000000..43119d1
--- /dev/null
+++ 
b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBucketNameResolverTest.java
@@ -0,0 +1,124 @@
+/****************************************************************
+ * 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.blob.objectstorage;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import org.apache.james.blob.api.BucketName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+
+class ObjectStorageBucketNameResolverTest {
+
+    @Nested
+    class EmptyPrefix {
+
+        @Test
+        void resolveShouldReturnPassedValue() {
+            ObjectStorageBucketNameResolver resolver = 
ObjectStorageBucketNameResolver.builder()
+                .noPrefix()
+                .namespace(BucketName.of("namespace"))
+                .build();
+
+            assertThat(resolver.resolve(BucketName.of("bucketName")))
+                .isEqualTo(ObjectStorageBucketName.of("bucketName"));
+        }
+
+        @Test
+        void resolveShouldReturnValueWhenNamespace() {
+            ObjectStorageBucketNameResolver resolver = 
ObjectStorageBucketNameResolver.builder()
+                .noPrefix()
+                .namespace(BucketName.of("namespace"))
+                .build();
+
+            assertThat(resolver.resolve(BucketName.of("namespace")))
+                .isEqualTo(ObjectStorageBucketName.of("namespace"));
+        }
+    }
+
+    @Nested
+    class EmptyNamespace {
+
+        @Test
+        void resolveShouldReturnPassedValueWithPrefix() {
+            ObjectStorageBucketNameResolver resolver = 
ObjectStorageBucketNameResolver.builder()
+                .prefix("prefix-")
+                .noNamespace()
+                .build();
+
+            assertThat(resolver.resolve(BucketName.of("bucketName")))
+                .isEqualTo(ObjectStorageBucketName.of("prefix-bucketName"));
+        }
+    }
+
+    @Nested
+    class BothAreEmpty {
+
+        @Test
+        void resolveShouldReturnPassedValue() {
+            ObjectStorageBucketNameResolver resolver = 
ObjectStorageBucketNameResolver.builder()
+                .noPrefix()
+                .noNamespace()
+                .build();
+
+            assertThat(resolver.resolve(BucketName.of("bucketName")))
+                .isEqualTo(ObjectStorageBucketName.of("bucketName"));
+        }
+    }
+
+    @Nested
+    class BothArePresent {
+
+        @Test
+        void resolveShouldReturnPassedValueWithPrefix() {
+            ObjectStorageBucketNameResolver resolver = 
ObjectStorageBucketNameResolver.builder()
+                .prefix("prefix-")
+                .namespace(BucketName.of("namespace"))
+                .build();
+
+            assertThat(resolver.resolve(BucketName.of("bucketName")))
+                .isEqualTo(ObjectStorageBucketName.of("prefix-bucketName"));
+        }
+
+        @Test
+        void resolveShouldReturnNamespaceWhenPassingNamespace() {
+            ObjectStorageBucketNameResolver resolver = 
ObjectStorageBucketNameResolver.builder()
+                .prefix("prefix-")
+                .namespace(BucketName.of("namespace"))
+                .build();
+
+            assertThat(resolver.resolve(BucketName.of("namespace")))
+                .isEqualTo(ObjectStorageBucketName.of("namespace"));
+        }
+    }
+
+
+    @Test
+    void resolveShouldThrowWhenNullBucketName() {
+        ObjectStorageBucketNameResolver resolver = 
ObjectStorageBucketNameResolver.builder()
+            .noPrefix()
+            .noNamespace()
+            .build();
+
+        assertThatThrownBy(() -> resolver.resolve(null))
+            .isInstanceOf(NullPointerException.class);
+    }
+}
\ No newline at end of file


---------------------------------------------------------------------
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