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]
