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