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

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

commit 4320fa45443c6943d3b90c8d9818e62e4891bac8
Author: Rene Cordier <[email protected]>
AuthorDate: Mon Oct 5 10:37:18 2020 +0700

    JAMES-3028 Add BucketNameResolver back with its unit tests
---
 .../blob/objectstorage/aws/BucketNameResolver.java | 103 ++++++++++++++++++
 .../objectstorage/aws/BucketNameResolverTest.java  | 119 +++++++++++++++++++++
 2 files changed, 222 insertions(+)

diff --git 
a/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/BucketNameResolver.java
 
b/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/BucketNameResolver.java
new file mode 100644
index 0000000..a0fcb71
--- /dev/null
+++ 
b/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/BucketNameResolver.java
@@ -0,0 +1,103 @@
+/****************************************************************
+ * 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.aws;
+
+import java.util.Optional;
+
+import org.apache.james.blob.api.BucketName;
+
+import com.google.common.base.Preconditions;
+
+public class BucketNameResolver {
+    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;
+            }
+
+            BucketNameResolver build() {
+                return new BucketNameResolver(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 BucketNameResolver(Optional<BucketName> namespace, 
Optional<String> prefix) {
+        Preconditions.checkNotNull(namespace);
+        Preconditions.checkNotNull(prefix);
+
+        this.namespace = namespace;
+        this.prefix = prefix;
+    }
+
+    BucketName resolve(BucketName bucketName) {
+        Preconditions.checkNotNull(bucketName);
+
+        if (isNameSpace(bucketName)) {
+            return bucketName;
+        }
+        return prefix
+            .map(bucketPrefix -> BucketName.of(bucketPrefix + 
bucketName.asString()))
+            .orElse(bucketName);
+    }
+
+    private boolean isNameSpace(BucketName bucketName) {
+        return namespace
+            .map(existingNamespace -> existingNamespace.equals(bucketName))
+            .orElse(false);
+    }
+}
diff --git 
a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/BucketNameResolverTest.java
 
b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/BucketNameResolverTest.java
new file mode 100644
index 0000000..43e9e84
--- /dev/null
+++ 
b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/BucketNameResolverTest.java
@@ -0,0 +1,119 @@
+/****************************************************************
+ * 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.aws;
+
+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 BucketNameResolverTest {
+    @Nested
+    class EmptyPrefix {
+        @Test
+        void resolveShouldReturnPassedValue() {
+            BucketNameResolver resolver = BucketNameResolver.builder()
+                .noPrefix()
+                .namespace(BucketName.of("namespace"))
+                .build();
+
+            assertThat(resolver.resolve(BucketName.of("bucketName")))
+                .isEqualTo(BucketName.of("bucketName"));
+        }
+
+        @Test
+        void resolveShouldReturnValueWhenNamespace() {
+            BucketNameResolver resolver = BucketNameResolver.builder()
+                .noPrefix()
+                .namespace(BucketName.of("namespace"))
+                .build();
+
+            assertThat(resolver.resolve(BucketName.of("namespace")))
+                .isEqualTo(BucketName.of("namespace"));
+        }
+    }
+
+    @Nested
+    class EmptyNamespace {
+        @Test
+        void resolveShouldReturnPassedValueWithPrefix() {
+            BucketNameResolver resolver = BucketNameResolver.builder()
+                .prefix("bucketPrefix-")
+                .noNamespace()
+                .build();
+
+            assertThat(resolver.resolve(BucketName.of("bucketName")))
+                .isEqualTo(BucketName.of("bucketPrefix-bucketName"));
+        }
+    }
+
+    @Nested
+    class BothAreEmpty {
+        @Test
+        void resolveShouldReturnPassedValue() {
+            BucketNameResolver resolver = BucketNameResolver.builder()
+                .noPrefix()
+                .noNamespace()
+                .build();
+
+            assertThat(resolver.resolve(BucketName.of("bucketName")))
+                .isEqualTo(BucketName.of("bucketName"));
+        }
+    }
+
+    @Nested
+    class BothArePresent {
+        @Test
+        void resolveShouldReturnPassedValueWithPrefix() {
+            BucketNameResolver resolver = BucketNameResolver.builder()
+                .prefix("bucketPrefix-")
+                .namespace(BucketName.of("namespace"))
+                .build();
+
+            assertThat(resolver.resolve(BucketName.of("bucketName")))
+                .isEqualTo(BucketName.of("bucketPrefix-bucketName"));
+        }
+
+        @Test
+        void resolveShouldReturnNamespaceWhenPassingNamespace() {
+            BucketNameResolver resolver = BucketNameResolver.builder()
+                .prefix("bucketPrefix-")
+                .namespace(BucketName.of("namespace"))
+                .build();
+
+            assertThat(resolver.resolve(BucketName.of("namespace")))
+                .isEqualTo(BucketName.of("namespace"));
+        }
+    }
+
+
+    @Test
+    void resolveShouldThrowWhenNullBucketName() {
+        BucketNameResolver resolver = BucketNameResolver.builder()
+            .noPrefix()
+            .noNamespace()
+            .build();
+
+        assertThatThrownBy(() -> resolver.resolve(null))
+            .isInstanceOf(NullPointerException.class);
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to