/*
* 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.google.common.base.Optional;
import com.google.common.collect.Sets;
import com.google.common.primitives.Ints;
import org.apache.commons.lang.StringUtils;
import org.gradle.internal.resource.transport.http.HttpProxySettings;
import org.gradle.internal.resource.transport.http.JavaSystemPropertiesHttpProxySettings;
import org.gradle.internal.resource.transport.http.JavaSystemPropertiesSecureHttpProxySettings;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Set;
import static com.amazonaws.services.s3.internal.Constants.S3_HOSTNAME;
import static java.lang.System.getProperty;
public class S3ConnectionProperties {
public static final String S3_ENDPOINT_PROPERTY = "org.gradle.s3.endpoint";
//The maximum number of times to retry a request when S3 responds with a http 5xx error
public static final String S3_MAX_ERROR_RETRY = "org.gradle.s3.maxErrorRetry";
private static final Set<String> SUPPORTED_SCHEMES = Sets.newHashSet("HTTP", "HTTPS");
private final Optional<URI> endpoint;
private final HttpProxySettings proxySettings;
private final HttpProxySettings secureProxySettings;
private final Optional<Integer> maxErrorRetryCount;
public S3ConnectionProperties() {
endpoint = configureEndpoint(getProperty(S3_ENDPOINT_PROPERTY));
proxySettings = new JavaSystemPropertiesHttpProxySettings();
secureProxySettings = new JavaSystemPropertiesSecureHttpProxySettings();
maxErrorRetryCount = configureErrorRetryCount(getProperty(S3_MAX_ERROR_RETRY));
}
public S3ConnectionProperties(HttpProxySettings proxySettings, HttpProxySettings secureProxySettings, URI endpoint, Integer maxErrorRetryCount) {
this.endpoint = Optional.fromNullable(endpoint);
this.proxySettings = proxySettings;
this.secureProxySettings = secureProxySettings;
this.maxErrorRetryCount = Optional.fromNullable(maxErrorRetryCount);
}
private Optional<URI> configureEndpoint(String property) {
URI uri = null;
if (StringUtils.isNotBlank(property)) {
try {
uri = new URI(property);
if (StringUtils.isBlank(uri.getScheme()) || !SUPPORTED_SCHEMES.contains(uri.getScheme().toUpperCase())) {
throw new IllegalArgumentException("System property [" + S3_ENDPOINT_PROPERTY + "=" + property + "] must have a scheme of 'http' or 'https'");
}
} catch (URISyntaxException e) {
throw new IllegalArgumentException("System property [" + S3_ENDPOINT_PROPERTY + "=" + property + "] must be a valid URI");
}
}
return Optional.fromNullable(uri);
}
public Optional<URI> getEndpoint() {
return endpoint;
}
public Optional<HttpProxySettings.HttpProxy> getProxy() {
if (endpoint.isPresent()) {
String host = endpoint.get().getHost();
if (endpoint.get().getScheme().toUpperCase().equals("HTTP")) {
return Optional.fromNullable(proxySettings.getProxy(host));
} else {
return Optional.fromNullable(secureProxySettings.getProxy(host));
}
}
return Optional.fromNullable(secureProxySettings.getProxy(S3_HOSTNAME));
}
private Optional<Integer> configureErrorRetryCount(String property) {
Integer count = null;
if (null != property) {
count = Ints.tryParse(property);
if (null == count || count < 0) {
throw new IllegalArgumentException("System property [" + S3_MAX_ERROR_RETRY + "=" + property + "] must be a valid positive Integer");
}
}
return Optional.fromNullable(count);
}
public Optional<Integer> getMaxErrorRetryCount() {
return maxErrorRetryCount;
}
}