/* * Copyright 2014 the original author or authors. * * Licensed 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.gradle.internal.resource.transport.aws.s3; import com.amazonaws.regions.Region; import com.amazonaws.regions.RegionUtils; import com.amazonaws.regions.Regions; import com.google.common.base.Optional; import java.net.URI; import java.util.regex.Matcher; import java.util.regex.Pattern; public class S3RegionalResource { private static final Pattern REGIONAL_ENDPOINT_PATTERN = Pattern.compile("^s3:\\/\\/(.+)?\\.s3[.-]([a-z0-9-]+)\\.amazonaws\\.com(\\.[a-z]+)?\\/(.+)"); private static final Region DEFAULT_REGION = Region.getRegion(Regions.US_EAST_1); private final URI uri; private Optional<Region> region; private String bucketName; private String key; public S3RegionalResource(URI uri) { this.uri = uri; configure(); } public Optional<Region> getRegion() { return region; } public String getBucketName() { return bucketName; } public String getKey() { return key; } private void configure() { Matcher matcher = REGIONAL_ENDPOINT_PATTERN.matcher(uri.toString()); if (matcher.find()) { String bucketName = matcher.group(1); String region = matcher.group(2); String key = matcher.group(4); Region derivedRegion; if (region.equals("external-1")) { derivedRegion = Region.getRegion(Regions.US_EAST_1); } else { derivedRegion = RegionUtils.getRegion(region); } this.region = Optional.of(derivedRegion); this.bucketName = bucketName; this.key = key; } else { this.region = Optional.absent(); this.bucketName = getBucketName(uri.getHost()); this.key = getS3BucketKey(uri); } } private String getS3BucketKey(URI destination) { String path = destination.getPath(); return path.startsWith("/") ? path.substring(1) : path; } private String getBucketName(String bucket) { return bucket.replaceAll("\\.s3\\.amazonaws\\.com", "").replaceAll("\\.s3-external-1\\.amazonaws\\.com", ""); } }