mirror of https://github.com/apache/jclouds.git
Issue 148 Issue 9 cleanup javadoc, removed use of string.replaceAll
git-svn-id: http://jclouds.googlecode.com/svn/trunk@2664 3d8758e0-26b5-11de-8745-db77d3ebf521
This commit is contained in:
parent
2776d12093
commit
27de8ac105
|
@ -18,6 +18,9 @@
|
|||
*/
|
||||
package org.jclouds.atmosonline.saas.filters;
|
||||
|
||||
import static org.jclouds.util.Patterns.NEWLINE_PATTERN;
|
||||
import static org.jclouds.util.Patterns.TWO_SPACE_PATTERN;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Set;
|
||||
|
@ -64,7 +67,7 @@ public class SignRequest implements HttpRequestFilter {
|
|||
Logger logger = Logger.NULL;
|
||||
|
||||
@Resource
|
||||
@Named(HttpConstants.SIGNATURE_LOGGER)
|
||||
@Named(HttpConstants.LOGGER_SIGNATURE)
|
||||
Logger signatureLog = Logger.NULL;
|
||||
|
||||
@Inject
|
||||
|
@ -143,8 +146,11 @@ public class SignRequest implements HttpRequestFilter {
|
|||
// For headers with values that span multiple lines, convert them into one line by
|
||||
// replacing any
|
||||
// newline characters and extra embedded white spaces in the value.
|
||||
for (String value : request.getHeaders().get(header))
|
||||
toSign.append(value.replaceAll("\r?\n", "").replaceAll(" ", " ")).append(" ");
|
||||
for (String value : request.getHeaders().get(header)) {
|
||||
value = Utils.replaceAll(value, TWO_SPACE_PATTERN, " ");
|
||||
value = Utils.replaceAll(value, NEWLINE_PATTERN, "");
|
||||
toSign.append(value).append(' ');
|
||||
}
|
||||
toSign.deleteCharAt(toSign.lastIndexOf(" "));
|
||||
// Concatenate all headers together, using newlines (\n) separating each header from the
|
||||
// next one.
|
||||
|
|
|
@ -22,6 +22,8 @@ import static com.google.common.base.Preconditions.checkNotNull;
|
|||
|
||||
import org.jclouds.aws.ec2.EC2AsyncClient;
|
||||
|
||||
import com.google.common.base.CaseFormat;
|
||||
|
||||
/**
|
||||
*
|
||||
* The current state of the instance..
|
||||
|
@ -62,7 +64,7 @@ public enum InstanceState {
|
|||
STOPPED;
|
||||
|
||||
public String value() {
|
||||
return name().toLowerCase().replaceAll("_", "-");
|
||||
return (CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_HYPHEN, name()));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -71,7 +73,8 @@ public enum InstanceState {
|
|||
}
|
||||
|
||||
public static InstanceState fromValue(String state) {
|
||||
return valueOf(checkNotNull(state, "state").replaceAll("-", "_").toUpperCase());
|
||||
return valueOf(CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(state,
|
||||
"state")));
|
||||
}
|
||||
|
||||
public static InstanceState fromValue(int v) {
|
||||
|
|
|
@ -78,7 +78,7 @@ public class FormSigner implements HttpRequestFilter, RequestSigner {
|
|||
private final Provider<String> dateService;
|
||||
private final EncryptionService encryptionService;
|
||||
@Resource
|
||||
@Named(HttpConstants.SIGNATURE_LOGGER)
|
||||
@Named(HttpConstants.LOGGER_SIGNATURE)
|
||||
private Logger signatureLog = Logger.NULL;
|
||||
|
||||
@Inject
|
||||
|
|
|
@ -52,7 +52,7 @@ public class AWSRedirectionRetryHandler extends RedirectionRetryHandler {
|
|||
&& (response.getStatusCode() == 301 || response.getStatusCode() == 307)) {
|
||||
byte[] content = HttpUtils.closeClientButKeepContentStream(response);
|
||||
if (command.getRequest().getMethod() == HttpMethod.HEAD) {
|
||||
command.redirectAsGet();
|
||||
command.changeToGETRequest();
|
||||
return true;
|
||||
} else {
|
||||
command.incrementRedirectCount();
|
||||
|
@ -66,7 +66,7 @@ public class AWSRedirectionRetryHandler extends RedirectionRetryHandler {
|
|||
// http://developer.amazonwebservices.com/connect/thread.jspa?messageID=72287𑩟
|
||||
return backoffHandler.shouldRetryRequest(command, response);
|
||||
} else {
|
||||
command.redirect(host, command.getRequest().getEndpoint().getPort());
|
||||
command.changeHostAndPortTo(host, command.getRequest().getEndpoint().getPort());
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
package org.jclouds.aws.s3.filters;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import static org.jclouds.util.Patterns.NEWLINE_PATTERN;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
|
@ -69,7 +70,7 @@ public class RequestAuthorizeSignature implements HttpRequestFilter, RequestSign
|
|||
private final EncryptionService encryptionService;
|
||||
|
||||
@Resource
|
||||
@Named(HttpConstants.SIGNATURE_LOGGER)
|
||||
@Named(HttpConstants.LOGGER_SIGNATURE)
|
||||
Logger signatureLog = Logger.NULL;
|
||||
|
||||
@Inject
|
||||
|
@ -138,8 +139,9 @@ public class RequestAuthorizeSignature implements HttpRequestFilter, RequestSign
|
|||
for (String header : headers) {
|
||||
if (header.startsWith("x-amz-")) {
|
||||
toSign.append(header.toLowerCase()).append(":");
|
||||
for (String value : request.getHeaders().get(header))
|
||||
toSign.append(value.replaceAll("\r?\n", "")).append(",");
|
||||
for (String value : request.getHeaders().get(header)) {
|
||||
toSign.append(Utils.replaceAll(value, NEWLINE_PATTERN, "")).append(",");
|
||||
}
|
||||
toSign.deleteCharAt(toSign.lastIndexOf(","));
|
||||
toSign.append("\n");
|
||||
}
|
||||
|
|
|
@ -30,6 +30,7 @@ import org.jclouds.encryption.EncryptionService;
|
|||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.rest.InvocationContext;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
import org.jclouds.util.Utils;
|
||||
|
||||
import com.google.common.annotations.VisibleForTesting;
|
||||
import com.google.common.base.Function;
|
||||
|
@ -63,7 +64,7 @@ public class ParseObjectMetadataFromHeaders implements
|
|||
BlobMetadata base = blobMetadataParser.apply(from);
|
||||
MutableObjectMetadata to = blobToObjectMetadata.apply(base);
|
||||
addETagTo(from, to);
|
||||
to.setContentMD5(encryptionService.fromHexString(to.getETag().replaceAll("\"", "")));
|
||||
to.setContentMD5(encryptionService.fromHexString(Utils.replaceAll(to.getETag(), '"', "")));
|
||||
to.setCacheControl(from.getFirstHeaderOrNull(HttpHeaders.CACHE_CONTROL));
|
||||
to.setContentDisposition(from.getFirstHeaderOrNull("Content-Disposition"));
|
||||
to.setContentEncoding(from.getFirstHeaderOrNull(HttpHeaders.CONTENT_ENCODING));
|
||||
|
|
|
@ -23,6 +23,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
|
|||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.InputStream;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
|
@ -33,7 +34,7 @@ import org.jclouds.blobstore.util.BlobStoreUtils;
|
|||
import org.jclouds.http.HttpCommand;
|
||||
import org.jclouds.http.HttpException;
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.http.HttpUtils;
|
||||
import org.jclouds.util.Patterns;
|
||||
|
||||
/**
|
||||
* Encryption, Hashing, and IO Utilities needed to sign and verify S3 requests and responses.
|
||||
|
@ -60,16 +61,17 @@ public class S3Utils extends BlobStoreUtils {
|
|||
.getBytes()));
|
||||
}
|
||||
|
||||
public static final Pattern BUCKET_NAME_PATTERN = Pattern.compile("^[a-z0-9][-_.a-z0-9]+");
|
||||
|
||||
// TODO add validatorparam so that this is actually used
|
||||
public static String validateBucketName(String bucketName) {
|
||||
checkNotNull(bucketName, "bucketName");
|
||||
checkArgument(bucketName.matches("^[a-z0-9].*"),
|
||||
"bucketName name must start with a number or letter");
|
||||
checkArgument(
|
||||
bucketName.matches("^[-_.a-z0-9]+"),
|
||||
"bucketName name can only contain lowercase letters, numbers, periods (.), underscores (_), and dashes (-)");
|
||||
BUCKET_NAME_PATTERN.matcher(bucketName).matches(),
|
||||
"bucketName name must start with a number or letter and can only contain lowercase letters, numbers, periods (.), underscores (_), and dashes (-)");
|
||||
checkArgument(bucketName.length() > 2 && bucketName.length() < 256,
|
||||
"bucketName name must be between 3 and 255 characters long");
|
||||
checkArgument(!HttpUtils.IP_PATTERN.matcher(bucketName).matches(),
|
||||
checkArgument(!Patterns.IP_PATTERN.matcher(bucketName).matches(),
|
||||
"bucketName name cannot be ip address style");
|
||||
return bucketName;
|
||||
}
|
||||
|
|
|
@ -32,6 +32,7 @@ import org.jclouds.aws.s3.domain.internal.TreeSetListBucketResponse;
|
|||
import org.jclouds.date.DateService;
|
||||
import org.jclouds.encryption.EncryptionService;
|
||||
import org.jclouds.http.functions.ParseSax;
|
||||
import org.jclouds.util.Utils;
|
||||
import org.xml.sax.Attributes;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
|
@ -100,7 +101,7 @@ public class ListBucketHandler extends ParseSax.HandlerWithResult<ListBucketResp
|
|||
currentLastModified = dateParser.iso8601DateParse(currentText.toString().trim());
|
||||
} else if (qName.equals("ETag")) {
|
||||
currentETag = currentText.toString().trim();
|
||||
currentMD5 = encryptionService.fromHexString(currentETag.replaceAll("\"", ""));
|
||||
currentMD5 = encryptionService.fromHexString(Utils.replaceAll(currentETag,'"', ""));
|
||||
} else if (qName.equals("Size")) {
|
||||
currentSize = new Long(currentText.toString().trim());
|
||||
} else if (qName.equals("Owner")) {
|
||||
|
|
|
@ -94,10 +94,10 @@ public class S3UtilsTest {
|
|||
return false;
|
||||
}
|
||||
|
||||
public void redirect(String host, int port) {
|
||||
public void changeHostAndPortTo(String host, int port) {
|
||||
}
|
||||
|
||||
public void redirectAsGet() {
|
||||
public void changeToGETRequest() {
|
||||
}
|
||||
|
||||
public Exception getException() {
|
||||
|
@ -121,7 +121,7 @@ public class S3UtilsTest {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void redirectPath(String newPath) {
|
||||
public void changePathTo(String newPath) {
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -31,8 +31,10 @@ import static org.jclouds.blobstore.reference.BlobStoreConstants.PROPERTY_USER_M
|
|||
|
||||
import java.net.URI;
|
||||
import java.util.Properties;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.jclouds.http.HttpPropertiesBuilder;
|
||||
import org.jclouds.util.Utils;
|
||||
|
||||
/**
|
||||
* Builds properties used in AzureBlob Connections
|
||||
|
@ -60,12 +62,15 @@ public class AzureBlobPropertiesBuilder extends HttpPropertiesBuilder {
|
|||
withCredentials(id, secret);
|
||||
}
|
||||
|
||||
public static final Pattern ACCOUNT_PATTERN = Pattern.compile("\\{account\\}");
|
||||
|
||||
public AzureBlobPropertiesBuilder withCredentials(String id, String secret) {
|
||||
properties
|
||||
.setProperty(PROPERTY_AZURESTORAGE_ACCOUNT, checkNotNull(id, "azureStorageAccount"));
|
||||
properties.setProperty(PROPERTY_AZURESTORAGE_KEY, checkNotNull(secret, "azureStorageKey"));
|
||||
String endpoint = properties.getProperty(PROPERTY_AZUREBLOB_ENDPOINT);
|
||||
properties.setProperty(PROPERTY_AZUREBLOB_ENDPOINT, endpoint.replaceAll("\\{account\\}", id));
|
||||
properties.setProperty(PROPERTY_AZUREBLOB_ENDPOINT, Utils.replaceAll(endpoint,
|
||||
ACCOUNT_PATTERN, id));
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -74,8 +79,8 @@ public class AzureBlobPropertiesBuilder extends HttpPropertiesBuilder {
|
|||
"azureStorageAccount");
|
||||
properties.setProperty(PROPERTY_AZUREBLOB_ENDPOINT, checkNotNull(endpoint, "endpoint")
|
||||
.toString());
|
||||
properties.setProperty(PROPERTY_AZUREBLOB_ENDPOINT, endpoint.toString().replaceAll(
|
||||
"\\{account\\}", account));
|
||||
properties.setProperty(PROPERTY_AZUREBLOB_ENDPOINT, Utils.replaceAll(
|
||||
endpoint.toASCIIString(), ACCOUNT_PATTERN, account));
|
||||
return this;
|
||||
}
|
||||
|
||||
|
|
|
@ -18,6 +18,8 @@
|
|||
*/
|
||||
package org.jclouds.azure.storage.filters;
|
||||
|
||||
import static org.jclouds.util.Patterns.NEWLINE_PATTERN;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Set;
|
||||
|
@ -62,7 +64,7 @@ public class SharedKeyAuthentication implements HttpRequestFilter {
|
|||
private final Provider<String> timeStampProvider;
|
||||
private final EncryptionService encryptionService;
|
||||
@Resource
|
||||
@Named(HttpConstants.SIGNATURE_LOGGER)
|
||||
@Named(HttpConstants.LOGGER_SIGNATURE)
|
||||
Logger signatureLog = Logger.NULL;
|
||||
|
||||
@Inject
|
||||
|
@ -130,8 +132,9 @@ public class SharedKeyAuthentication implements HttpRequestFilter {
|
|||
for (String header : headers) {
|
||||
if (header.startsWith("x-ms-")) {
|
||||
toSign.append(header.toLowerCase()).append(":");
|
||||
for (String value : request.getHeaders().get(header))
|
||||
toSign.append(value.replaceAll("\r?\n", "")).append(",");
|
||||
for (String value : request.getHeaders().get(header)) {
|
||||
toSign.append(Utils.replaceAll(value, NEWLINE_PATTERN, "")).append(",");
|
||||
}
|
||||
toSign.deleteCharAt(toSign.lastIndexOf(","));
|
||||
toSign.append("\n");
|
||||
}
|
||||
|
|
|
@ -23,10 +23,12 @@ import static org.jclouds.azure.storage.reference.AzureStorageConstants.PROPERTY
|
|||
|
||||
import java.net.URI;
|
||||
import java.util.Properties;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.jclouds.azure.storage.queue.reference.AzureQueueConstants;
|
||||
import org.jclouds.azure.storage.reference.AzureStorageConstants;
|
||||
import org.jclouds.http.HttpPropertiesBuilder;
|
||||
import org.jclouds.util.Utils;
|
||||
|
||||
/**
|
||||
* Builds properties used in AzureQueue Connections
|
||||
|
@ -52,14 +54,16 @@ public class AzureQueuePropertiesBuilder extends HttpPropertiesBuilder {
|
|||
withCredentials(id, secret);
|
||||
}
|
||||
|
||||
public static final Pattern ACCOUNT_PATTERN = Pattern.compile("\\{account\\}");
|
||||
|
||||
public AzureQueuePropertiesBuilder withCredentials(String id, String secret) {
|
||||
properties.setProperty(AzureStorageConstants.PROPERTY_AZURESTORAGE_ACCOUNT, checkNotNull(id,
|
||||
"azureStorageAccount"));
|
||||
properties.setProperty(AzureStorageConstants.PROPERTY_AZURESTORAGE_KEY, checkNotNull(secret,
|
||||
"azureStorageKey"));
|
||||
String endpoint = properties.getProperty(AzureQueueConstants.PROPERTY_AZUREQUEUE_ENDPOINT);
|
||||
properties.setProperty(AzureQueueConstants.PROPERTY_AZUREQUEUE_ENDPOINT, endpoint.replaceAll(
|
||||
"\\{account\\}", id));
|
||||
properties.setProperty(AzureQueueConstants.PROPERTY_AZUREQUEUE_ENDPOINT, Utils.replaceAll(
|
||||
endpoint, ACCOUNT_PATTERN, id));
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -69,8 +73,8 @@ public class AzureQueuePropertiesBuilder extends HttpPropertiesBuilder {
|
|||
"azureStorageAccount");
|
||||
properties.setProperty(AzureQueueConstants.PROPERTY_AZUREQUEUE_ENDPOINT, checkNotNull(
|
||||
endpoint, "endpoint").toString());
|
||||
properties.setProperty(AzureQueueConstants.PROPERTY_AZUREQUEUE_ENDPOINT, endpoint.toString()
|
||||
.replaceAll("\\{account\\}", account));
|
||||
properties.setProperty(AzureQueueConstants.PROPERTY_AZUREQUEUE_ENDPOINT, Utils.replaceAll(
|
||||
endpoint.toASCIIString(), ACCOUNT_PATTERN, account));
|
||||
return this;
|
||||
}
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@ import javax.inject.Inject;
|
|||
|
||||
import org.jclouds.blobstore.options.GetOptions;
|
||||
import org.jclouds.date.DateService;
|
||||
import org.jclouds.util.Utils;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
||||
|
@ -40,14 +41,14 @@ public class HttpGetOptionsListToGetOptions implements
|
|||
org.jclouds.blobstore.options.GetOptions to = new org.jclouds.blobstore.options.GetOptions();
|
||||
if (from.length != 0) {
|
||||
if (from[0].getIfMatch() != null) {
|
||||
to.ifETagMatches(from[0].getIfMatch().replaceAll("\"", ""));
|
||||
to.ifETagMatches(Utils.replaceAll(from[0].getIfMatch(), '"', ""));
|
||||
}
|
||||
if (from[0].getIfModifiedSince() != null) {
|
||||
Date time = dateService.rfc822DateParse(from[0].getIfModifiedSince());
|
||||
to.ifModifiedSince(time);
|
||||
}
|
||||
if (from[0].getIfNoneMatch() != null) {
|
||||
to.ifETagDoesntMatch(from[0].getIfNoneMatch().replaceAll("\"", ""));
|
||||
to.ifETagDoesntMatch(Utils.replaceAll(from[0].getIfNoneMatch(), '"', ""));
|
||||
}
|
||||
if (from[0].getIfUnmodifiedSince() != null) {
|
||||
Date time = dateService.rfc822DateParse(from[0].getIfUnmodifiedSince());
|
||||
|
|
|
@ -415,10 +415,10 @@ public class StubAsyncBlobStore implements AsyncBlobStore {
|
|||
return false;
|
||||
}
|
||||
|
||||
public void redirect(String host, int port) {
|
||||
public void changeHostAndPortTo(String host, int port) {
|
||||
}
|
||||
|
||||
public void redirectAsGet() {
|
||||
public void changeToGETRequest() {
|
||||
}
|
||||
|
||||
public Exception getException() {
|
||||
|
@ -442,7 +442,7 @@ public class StubAsyncBlobStore implements AsyncBlobStore {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void redirectPath(String newPath) {
|
||||
public void changePathTo(String newPath) {
|
||||
}
|
||||
}, response);
|
||||
}
|
||||
|
|
|
@ -39,7 +39,7 @@ public class ComputeServiceContextFactory extends
|
|||
*
|
||||
* @throws IOException
|
||||
* if the default properties file cannot be loaded
|
||||
* @see #init
|
||||
* @see RestContextFactory#getProperties
|
||||
*/
|
||||
public ComputeServiceContextFactory() throws IOException {
|
||||
super("compute.properties");
|
||||
|
@ -47,7 +47,7 @@ public class ComputeServiceContextFactory extends
|
|||
|
||||
/**
|
||||
*
|
||||
* Initializes the {@code ComputeServiceContext) definitions from the specified properties.
|
||||
* Initializes the {@code ComputeServiceContext} definitions from the specified properties.
|
||||
*/
|
||||
@Inject
|
||||
public ComputeServiceContextFactory(Properties properties) {
|
||||
|
|
|
@ -28,13 +28,11 @@ import java.util.Map;
|
|||
public interface Size {
|
||||
/**
|
||||
* provider-specific identifier (m1.small, etc)
|
||||
*
|
||||
*/
|
||||
String getId();
|
||||
|
||||
/**
|
||||
* Name provided by the provider (Small CPU, etc)
|
||||
*
|
||||
*/
|
||||
String getName();
|
||||
|
||||
|
@ -59,10 +57,7 @@ public interface Size {
|
|||
Long getBandwidth();
|
||||
|
||||
/**
|
||||
*
|
||||
* Hourly price of this server in USD, estimated if monthly.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
Float getPrice();
|
||||
|
||||
|
|
|
@ -24,15 +24,15 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
|||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.Target;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
*
|
||||
* This class or method has a timeout used for synchronous calls.
|
||||
*
|
||||
* @see SyncClient
|
||||
* @see TimeUnit
|
||||
* @see ListenableFuture#get(long,TimeUnit)
|
||||
* @see Future#get(long,TimeUnit)
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Target( { TYPE, METHOD })
|
||||
|
|
|
@ -23,6 +23,7 @@ import java.text.SimpleDateFormat;
|
|||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
import java.util.SimpleTimeZone;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import net.jcip.annotations.GuardedBy;
|
||||
import net.jcip.annotations.ThreadSafe;
|
||||
|
@ -134,14 +135,19 @@ public class SimpleDateFormatDateService implements DateService {
|
|||
}
|
||||
}
|
||||
|
||||
public static final Pattern NANOS_TO_MILLIS_PATTERN = Pattern
|
||||
.compile(".*[0-9][0-9][0-9][0-9][0-9][0-9]");
|
||||
|
||||
private String trimNanosToMillis(String toParse) {
|
||||
if (toParse.matches(".*[0-9][0-9][0-9][0-9][0-9][0-9]"))
|
||||
if (NANOS_TO_MILLIS_PATTERN.matcher(toParse).matches())
|
||||
toParse = toParse.substring(0, toParse.length() - 3) + 'Z';
|
||||
return toParse;
|
||||
}
|
||||
|
||||
public static final Pattern SECOND_PATTERN = Pattern.compile(".*[0-2][0-9]:00");
|
||||
|
||||
private String trimTZ(String toParse) {
|
||||
if (toParse.length() == 25 && toParse.matches(".*[0-2][0-9]:00"))
|
||||
if (toParse.length() == 25 && SECOND_PATTERN.matcher(toParse).matches())
|
||||
toParse = toParse.substring(0, toParse.length() - 6) + 'Z';
|
||||
return toParse;
|
||||
}
|
||||
|
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.http;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Command whose endpoint is an http service.
|
||||
*
|
||||
|
@ -27,43 +25,68 @@ package org.jclouds.http;
|
|||
*/
|
||||
public interface HttpCommand {
|
||||
|
||||
/**
|
||||
* increments the current number of redirect attempts for this command.
|
||||
*
|
||||
* @see getRedirectCount
|
||||
*/
|
||||
int incrementRedirectCount();
|
||||
|
||||
/**
|
||||
* This displays the current number of redirect attempts for this command.
|
||||
*
|
||||
* @see org.jclouds.http.HttpConstants.PROPERTY_HTTP_MAX_REDIRECTS
|
||||
*/
|
||||
int getRedirectCount();
|
||||
|
||||
/**
|
||||
* Commands need to be replayed, if redirected or on a retryable error. Typically, this implies
|
||||
* the payload carried is not a streaming type.
|
||||
*/
|
||||
boolean isReplayable();
|
||||
|
||||
/**
|
||||
* to allow redirects to work
|
||||
* change the destination of the current http command. typically used in handling redirects.
|
||||
*/
|
||||
void redirect(String host, int port);
|
||||
void changeHostAndPortTo(String host, int port);
|
||||
|
||||
/**
|
||||
* to allow redirects to work on methods that were HEAD
|
||||
* change method from GET to HEAD. typically used in handling redirects.
|
||||
*/
|
||||
void redirectAsGet();
|
||||
void changeToGETRequest();
|
||||
|
||||
/**
|
||||
* change the path of the service
|
||||
* change the path of the service. typically used in handling redirects.
|
||||
*/
|
||||
void redirectPath(String newPath);
|
||||
void changePathTo(String newPath);
|
||||
|
||||
/**
|
||||
* increment the current failure count.
|
||||
*
|
||||
* @see getFailureCount
|
||||
*/
|
||||
int incrementFailureCount();
|
||||
|
||||
/**
|
||||
* This displays the current number of error retries for this command.
|
||||
*
|
||||
* @see org.jclouds.http.HttpConstants.PROPERTY_HTTP_MAX_RETRIES
|
||||
*/
|
||||
int getFailureCount();
|
||||
|
||||
/**
|
||||
* The request associated with this command.
|
||||
*/
|
||||
HttpRequest getRequest();
|
||||
|
||||
/**
|
||||
*
|
||||
* Used to prevent a command from being re-executed.
|
||||
*
|
||||
* Any calls to {@link execute} following this will return the below exception.
|
||||
*
|
||||
* @param exception
|
||||
* Used to prevent a command from being re-executed, or having its response parsed.
|
||||
*/
|
||||
void setException(Exception exception);
|
||||
|
||||
|
||||
/**
|
||||
* @see setException
|
||||
*/
|
||||
Exception getException();
|
||||
|
||||
}
|
||||
|
|
|
@ -19,24 +19,54 @@
|
|||
package org.jclouds.http;
|
||||
|
||||
/**
|
||||
* // TODO: Adrian: Document this!
|
||||
* Constants used in http services.
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public interface HttpConstants {
|
||||
public static final String PROPERTY_HTTP_PROXY_SYSTEM = "jclouds.http.proxy.system";
|
||||
public static final String PROPERTY_HTTP_MAX_RETRIES = "jclouds.http.max-retries";
|
||||
public static final String PROPERTY_HTTP_MAX_REDIRECTS = "jclouds.http.max-redirects";
|
||||
public static final String HTTP_HEADERS_LOGGER = "jclouds.http.headers";
|
||||
public static final String HTTP_WIRE_LOGGER = "jclouds.http.wire";
|
||||
public static final String SIGNATURE_LOGGER = "jclouds.signature";
|
||||
|
||||
/**
|
||||
* Boolean property.
|
||||
* <p/>
|
||||
* Whether or not to use the proxy setup from the underlying operating system.
|
||||
*/
|
||||
public static final String PROPERTY_HTTP_PROXY_SYSTEM = "jclouds.http.proxy.system";
|
||||
/**
|
||||
* Integer property.
|
||||
* <p/>
|
||||
* Commands are retried, if the problem on the server side was a resolvable conflict. However,
|
||||
* the maximum tries of a single command is bounded.
|
||||
*/
|
||||
public static final String PROPERTY_HTTP_MAX_RETRIES = "jclouds.http.max-retries";
|
||||
/**
|
||||
* Integer property.
|
||||
* <p/>
|
||||
* Commands are limited to only a certain amount of redirects.
|
||||
*/
|
||||
public static final String PROPERTY_HTTP_MAX_REDIRECTS = "jclouds.http.max-redirects";
|
||||
/**
|
||||
* Long property.
|
||||
* <p/>
|
||||
* longest time a single request can take before throwing an exception.
|
||||
*/
|
||||
public static final String PROPERTY_HTTP_REQUEST_TIMEOUT = "jclouds.http.request.timeout";
|
||||
/**
|
||||
* allow mismatch between hostname and ssl cerificate.
|
||||
* Boolean property.
|
||||
* <p/>
|
||||
* allow mismatch between hostname and ssl cerificate. Set to true in DNS-based services like
|
||||
* Amazon S3.
|
||||
*/
|
||||
public static final String PROPERTY_HTTP_RELAX_HOSTNAME = "jclouds.http.relax-hostname";
|
||||
/**
|
||||
* Name of the logger that records all http headers from the client and the server.
|
||||
*/
|
||||
public static final String LOGGER_HTTP_HEADERS = "jclouds.http.headers";
|
||||
/**
|
||||
* Name of the logger that records the content sent to and from the server.
|
||||
*/
|
||||
public static final String LOGGER_HTTP_WIRE = "jclouds.http.wire";
|
||||
/**
|
||||
* Name of the logger that records the steps of the request signing process of the HTTP-service.
|
||||
*/
|
||||
public static final String LOGGER_SIGNATURE = "jclouds.signature";
|
||||
|
||||
}
|
||||
|
|
|
@ -26,7 +26,6 @@ import static org.jclouds.http.pool.PoolConstants.PROPERTY_POOL_IO_WORKER_THREAD
|
|||
import static org.jclouds.http.pool.PoolConstants.PROPERTY_POOL_MAX_CONNECTIONS;
|
||||
import static org.jclouds.http.pool.PoolConstants.PROPERTY_POOL_MAX_CONNECTION_REUSE;
|
||||
import static org.jclouds.http.pool.PoolConstants.PROPERTY_POOL_MAX_SESSION_FAILURES;
|
||||
import static org.jclouds.http.pool.PoolConstants.PROPERTY_POOL_REQUEST_INVOKER_THREADS;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
|
@ -40,34 +39,49 @@ import com.google.common.annotations.VisibleForTesting;
|
|||
public class HttpPropertiesBuilder {
|
||||
|
||||
/**
|
||||
* allow mismatches between the certificate and the hostname of ssl requests.
|
||||
* @see org.jclouds.http.HttpConstants.PROPERTY_HTTP_RELAX_HOSTNAME
|
||||
*/
|
||||
public HttpPropertiesBuilder relaxSSLHostname(boolean relax) {
|
||||
properties.setProperty(PROPERTY_HTTP_RELAX_HOSTNAME, relax+"");
|
||||
properties.setProperty(PROPERTY_HTTP_RELAX_HOSTNAME, relax + "");
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.jclouds.http.HttpConstants.PROPERTY_HTTP_PROXY_SYSTEM
|
||||
*/
|
||||
public HttpPropertiesBuilder useSystemProxies(boolean useSystemProxies) {
|
||||
properties.setProperty(PROPERTY_HTTP_PROXY_SYSTEM, useSystemProxies + "");
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.jclouds.http.HttpConstants.PROPERTY_HTTP_MAX_RETRIES
|
||||
*/
|
||||
public HttpPropertiesBuilder withHttpMaxRetries(int httpMaxRetries) {
|
||||
properties.setProperty(PROPERTY_HTTP_MAX_RETRIES, Integer.toString(httpMaxRetries));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.jclouds.http.HttpConstants.PROPERTY_HTTP_MAX_REDIRECTS
|
||||
*/
|
||||
public HttpPropertiesBuilder withHttpMaxRedirects(int httpMaxRedirects) {
|
||||
properties.setProperty(PROPERTY_HTTP_MAX_REDIRECTS, Integer.toString(httpMaxRedirects));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.jclouds.http.HttpConstants.pool.PoolConstants.PROPERTY_POOL_MAX_CONNECTION_REUSE
|
||||
*/
|
||||
public HttpPropertiesBuilder withPoolMaxClientReuse(int poolMaxClientReuse) {
|
||||
properties.setProperty(PROPERTY_POOL_MAX_CONNECTION_REUSE, Integer
|
||||
.toString(poolMaxClientReuse));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.jclouds.http.HttpConstants.pool.PoolConstants.PROPERTY_POOL_MAX_SESSION_FAILURES
|
||||
*/
|
||||
public HttpPropertiesBuilder withPoolMaxSessionFailures(int poolMaxSessionFailures) {
|
||||
properties.setProperty(PROPERTY_POOL_MAX_SESSION_FAILURES, Integer
|
||||
.toString(poolMaxSessionFailures));
|
||||
|
@ -75,13 +89,9 @@ public class HttpPropertiesBuilder {
|
|||
|
||||
}
|
||||
|
||||
public HttpPropertiesBuilder withPoolRequestInvokerThreads(int poolRequestInvokerThreads) {
|
||||
properties.setProperty(PROPERTY_POOL_REQUEST_INVOKER_THREADS, Integer
|
||||
.toString(poolRequestInvokerThreads));
|
||||
return this;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.jclouds.http.HttpConstants.pool.PoolConstants.PROPERTY_POOL_IO_WORKER_THREADS
|
||||
*/
|
||||
public HttpPropertiesBuilder withPoolIoWorkerThreads(int poolIoWorkerThreads) {
|
||||
properties
|
||||
.setProperty(PROPERTY_POOL_IO_WORKER_THREADS, Integer.toString(poolIoWorkerThreads));
|
||||
|
@ -89,6 +99,9 @@ public class HttpPropertiesBuilder {
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.jclouds.http.HttpConstants.pool.PoolConstants.PROPERTY_POOL_MAX_CONNECTIONS
|
||||
*/
|
||||
public HttpPropertiesBuilder withPoolMaxClients(int poolMaxClients) {
|
||||
properties.setProperty(PROPERTY_POOL_MAX_CONNECTIONS, Integer.toString(poolMaxClients));
|
||||
return this;
|
||||
|
|
|
@ -40,7 +40,6 @@ import com.google.inject.internal.Nullable;
|
|||
public class HttpRequest extends HttpMessage {
|
||||
|
||||
private List<HttpRequestFilter> requestFilters = Lists.newArrayList();
|
||||
|
||||
private String method;
|
||||
private URI endpoint;
|
||||
private Payload payload;
|
||||
|
|
|
@ -19,6 +19,13 @@
|
|||
package org.jclouds.http;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkState;
|
||||
import static org.jclouds.util.Patterns.CHAR_TO_ENCODED_PATTERN;
|
||||
import static org.jclouds.util.Patterns.PATTERN_THAT_BREAKS_URI;
|
||||
import static org.jclouds.util.Patterns.PLUS_PATTERN;
|
||||
import static org.jclouds.util.Patterns.STAR_PATTERN;
|
||||
import static org.jclouds.util.Patterns.URI_PATTERN;
|
||||
import static org.jclouds.util.Patterns.URL_ENCODED_PATTERN;
|
||||
import static org.jclouds.util.Patterns._7E_PATTERN;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
|
@ -29,32 +36,26 @@ import java.net.URI;
|
|||
import java.net.URLDecoder;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import org.jclouds.logging.Logger;
|
||||
import org.jclouds.util.Utils;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.base.Joiner;
|
||||
import com.google.common.base.Splitter;
|
||||
import com.google.common.base.Throwables;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.MapMaker;
|
||||
import com.google.common.collect.Multimap;
|
||||
import com.google.common.collect.SortedSetMultimap;
|
||||
import com.google.common.collect.TreeMultimap;
|
||||
import com.google.common.io.ByteStreams;
|
||||
import com.google.common.io.Closeables;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class HttpUtils {
|
||||
public static final Pattern URI_PATTERN = Pattern.compile("([a-z0-9]+)://([^:]*):(.*)@(.*)");
|
||||
public static final Pattern PATTERN_THAT_BREAKS_URI = Pattern.compile("[a-z0-9]+://.*/.*@.*"); // slash
|
||||
|
||||
@Resource
|
||||
protected static Logger logger = Logger.NULL;
|
||||
|
||||
/**
|
||||
* Web browsers do not always handle '+' characters well, use the well-supported '%20' instead.
|
||||
|
@ -63,10 +64,12 @@ public class HttpUtils {
|
|||
if (isUrlEncoded(in))
|
||||
return in;
|
||||
try {
|
||||
String returnVal = URLEncoder.encode(in, "UTF-8").replaceAll("\\+", "%20").replaceAll(
|
||||
"\\*", "%2A").replaceAll("%7E", "~");
|
||||
String returnVal = URLEncoder.encode(in, "UTF-8");
|
||||
returnVal = Utils.replaceAll(returnVal, '+', PLUS_PATTERN, "%20");
|
||||
returnVal = Utils.replaceAll(returnVal, '*', STAR_PATTERN, "%2A");
|
||||
returnVal = Utils.replaceAll(returnVal, _7E_PATTERN, "~");
|
||||
for (char c : skipEncode) {
|
||||
returnVal = returnVal.replaceAll(plainToEncodedChars.get(c + ""), c + "");
|
||||
returnVal = Utils.replaceAll(returnVal, CHAR_TO_ENCODED_PATTERN.get(c), c + "");
|
||||
}
|
||||
return returnVal;
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
|
@ -75,20 +78,9 @@ public class HttpUtils {
|
|||
}
|
||||
|
||||
public static boolean isUrlEncoded(String in) {
|
||||
return in.matches(".*%[a-fA-F0-9][a-fA-F0-9].*");
|
||||
return URL_ENCODED_PATTERN.matcher(in).matches();
|
||||
}
|
||||
|
||||
static Map<String, String> plainToEncodedChars = new MapMaker()
|
||||
.makeComputingMap(new Function<String, String>() {
|
||||
public String apply(String plain) {
|
||||
try {
|
||||
return URLEncoder.encode(plain, "UTF-8");
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new IllegalStateException("Bad encoding on input: " + plain, e);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
public static String urlDecode(String in) {
|
||||
try {
|
||||
return URLDecoder.decode(in, "UTF-8");
|
||||
|
@ -107,7 +99,7 @@ public class HttpUtils {
|
|||
response.setContent(new ByteArrayInputStream(data));
|
||||
return data;
|
||||
} catch (IOException e) {
|
||||
logger.error(e, "Error consuming input");
|
||||
Throwables.propagate(e);
|
||||
} finally {
|
||||
Closeables.closeQuietly(response.getContent());
|
||||
}
|
||||
|
@ -124,7 +116,7 @@ public class HttpUtils {
|
|||
int port = redirectURI.getPort() > 0 ? redirectURI.getPort() : redirectURI.getScheme()
|
||||
.equals("https") ? 443 : 80;
|
||||
String host = redirectURI.getHost();
|
||||
checkState(!host.matches("[/]"), String.format(
|
||||
checkState(host.indexOf('/') == -1, String.format(
|
||||
"header %s didn't parse an http host correctly: [%s]", hostHeader, host));
|
||||
URI endPoint = URI.create(String.format("%s://%s:%d", scheme, host, port));
|
||||
return endPoint;
|
||||
|
@ -165,8 +157,8 @@ public class HttpUtils {
|
|||
String rest = matcher.group(4);
|
||||
String account = matcher.group(2);
|
||||
String key = matcher.group(3);
|
||||
return URI
|
||||
.create(String.format("%s://%s:%s@%s", scheme, urlEncode(account), urlEncode(key), rest));
|
||||
return URI.create(String.format("%s://%s:%s@%s", scheme, urlEncode(account),
|
||||
urlEncode(key), rest));
|
||||
} else {
|
||||
throw new IllegalArgumentException("bad syntax");
|
||||
}
|
||||
|
@ -175,10 +167,6 @@ public class HttpUtils {
|
|||
}
|
||||
}
|
||||
|
||||
public static final Pattern IP_PATTERN = Pattern
|
||||
.compile("b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).)"
|
||||
+ "{3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)b");
|
||||
|
||||
public static void logRequest(Logger logger, HttpRequest request, String prefix) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("%s %s", prefix, request.getRequestLine().toString());
|
||||
|
|
|
@ -83,7 +83,7 @@ public class TransformingHttpCommandImpl<T> implements TransformingHttpCommand<T
|
|||
* <p />
|
||||
* This also removes the Host header in order to avoid ssl problems.
|
||||
*/
|
||||
public void redirect(String host, int port) {
|
||||
public void changeHostAndPortTo(String host, int port) {
|
||||
UriBuilder builder = UriBuilder.fromUri(request.getEndpoint());
|
||||
builder.host(host);
|
||||
builder.port(port);
|
||||
|
@ -96,7 +96,7 @@ public class TransformingHttpCommandImpl<T> implements TransformingHttpCommand<T
|
|||
*
|
||||
* @param method
|
||||
*/
|
||||
public void redirectAsGet() {
|
||||
public void changeToGETRequest() {
|
||||
request.setMethod(HttpMethod.GET);
|
||||
}
|
||||
|
||||
|
@ -130,7 +130,7 @@ public class TransformingHttpCommandImpl<T> implements TransformingHttpCommand<T
|
|||
}
|
||||
|
||||
@Override
|
||||
public void redirectPath(String newPath) {
|
||||
public void changePathTo(String newPath) {
|
||||
request.replacePath(newPath);
|
||||
}
|
||||
|
||||
|
|
|
@ -67,12 +67,12 @@ public class RedirectionRetryHandler implements HttpRetryHandler {
|
|||
if (redirectionUrl.getHost().equals(command.getRequest().getEndpoint().getHost())
|
||||
&& redirectionUrl.getPort() == command.getRequest().getEndpoint().getPort()) {
|
||||
if (!redirectionUrl.getPath().equals(command.getRequest().getEndpoint().getPath())) {
|
||||
command.redirectPath(redirectionUrl.getPath());
|
||||
command.changePathTo(redirectionUrl.getPath());
|
||||
} else {
|
||||
return backoffHandler.shouldRetryRequest(command, response);
|
||||
}
|
||||
} else {
|
||||
command.redirect(redirectionUrl.getHost(), redirectionUrl.getPort());
|
||||
command.changeHostAndPortTo(redirectionUrl.getHost(), redirectionUrl.getPort());
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
|
|
|
@ -50,7 +50,7 @@ public abstract class BaseHttpCommandExecutorService<Q> implements HttpCommandEx
|
|||
@Resource
|
||||
protected Logger logger = Logger.NULL;
|
||||
@Resource
|
||||
@Named(HttpConstants.HTTP_HEADERS_LOGGER)
|
||||
@Named(HttpConstants.LOGGER_HTTP_HEADERS)
|
||||
protected Logger headerLog = Logger.NULL;
|
||||
|
||||
private final HttpWire wire;
|
||||
|
|
|
@ -37,7 +37,7 @@ import org.jclouds.logging.internal.Wire;
|
|||
public class HttpWire extends Wire {
|
||||
|
||||
@Resource
|
||||
@Named(HttpConstants.HTTP_WIRE_LOGGER)
|
||||
@Named(HttpConstants.LOGGER_HTTP_WIRE)
|
||||
Logger wireLog = Logger.NULL;
|
||||
|
||||
@Inject
|
||||
|
|
|
@ -37,7 +37,7 @@ import org.jclouds.logging.internal.Wire;
|
|||
public class SignatureWire extends Wire {
|
||||
|
||||
@Resource
|
||||
@Named(HttpConstants.SIGNATURE_LOGGER)
|
||||
@Named(HttpConstants.LOGGER_SIGNATURE)
|
||||
Logger signatureLog = Logger.NULL;
|
||||
|
||||
@Inject
|
||||
|
|
|
@ -19,14 +19,35 @@
|
|||
package org.jclouds.http.pool;
|
||||
|
||||
/**
|
||||
* // TODO: Adrian: Document this!
|
||||
* Properties used in pooling http engines
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public interface PoolConstants {
|
||||
public static final String PROPERTY_POOL_MAX_CONNECTIONS = "jclouds.pool.max_connections";
|
||||
public static final String PROPERTY_POOL_IO_WORKER_THREADS = "jclouds.http.pool.io_worker_threads";
|
||||
public static final String PROPERTY_POOL_REQUEST_INVOKER_THREADS = "jclouds.http.pool.request_invoker_threads";
|
||||
public static final String PROPERTY_POOL_MAX_SESSION_FAILURES = "jclouds.http.pool.max_session_failures";
|
||||
public static final String PROPERTY_POOL_MAX_CONNECTION_REUSE = "jclouds.http.pool.max_connection_reuse";
|
||||
/**
|
||||
* Integer property. default (12)
|
||||
* <p/>
|
||||
* Limits the amount of connections per host.
|
||||
*/
|
||||
public static final String PROPERTY_POOL_MAX_CONNECTIONS = "jclouds.pool.max_connections";
|
||||
/**
|
||||
* Integer property. default (12)
|
||||
* <p/>
|
||||
* Amount of threads servicing the I/O of http connections
|
||||
*/
|
||||
public static final String PROPERTY_POOL_IO_WORKER_THREADS = "jclouds.http.pool.io_worker_threads";
|
||||
|
||||
/**
|
||||
* Integer property. default (2)
|
||||
* <p/>
|
||||
* Maximum amount of http session failures before a pool is disabled.
|
||||
*/
|
||||
public static final String PROPERTY_POOL_MAX_SESSION_FAILURES = "jclouds.http.pool.max_session_failures";
|
||||
/**
|
||||
* Integer property. default (75)
|
||||
* <p/>
|
||||
* Maximum amount of times to re-use an http connection. Services like Amazon S3 throw errors if
|
||||
* connections are reused too many times.
|
||||
*/
|
||||
public static final String PROPERTY_POOL_MAX_CONNECTION_REUSE = "jclouds.http.pool.max_connection_reuse";
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@ package org.jclouds.rest.internal;
|
|||
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import static org.jclouds.util.Utils.replaceTokens;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.lang.annotation.Annotation;
|
||||
|
@ -436,7 +437,7 @@ public class RestAnnotationProcessor<T> {
|
|||
String key = indexOfFirstEquals == -1 ? parts[partIndex] : parts[partIndex].substring(
|
||||
0, indexOfFirstEquals);
|
||||
String value = indexOfFirstEquals == -1 ? null : parts[partIndex]
|
||||
.substring(indexOfFirstEquals+1);
|
||||
.substring(indexOfFirstEquals + 1);
|
||||
map.put(key, value);
|
||||
}
|
||||
}
|
||||
|
@ -902,13 +903,6 @@ public class RestAnnotationProcessor<T> {
|
|||
|
||||
}
|
||||
|
||||
private String replaceTokens(String value, Collection<Entry<String, String>> tokenValues) {
|
||||
for (Entry<String, String> tokenValue : tokenValues) {
|
||||
value = value.replaceAll("\\{" + tokenValue.getKey() + "\\}", tokenValue.getValue());
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
private Map<String, String> convertUnsafe(Multimap<String, String> in) {
|
||||
Map<String, String> out = Maps.newLinkedHashMap();
|
||||
for (Entry<String, String> entry : in.entries()) {
|
||||
|
|
|
@ -0,0 +1,79 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2009 Global Cloud Specialists, Inc. <info@globalcloudspecialists.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* 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.jclouds.util;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.Map;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.collect.MapMaker;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class Patterns {
|
||||
public static final Pattern TWO_SPACE_PATTERN = Pattern.compile(" ");
|
||||
public static final Pattern URL_ENCODED_PATTERN = Pattern.compile(".*%[a-fA-F0-9][a-fA-F0-9].*");
|
||||
public static final Pattern URI_PATTERN = Pattern.compile("([a-z0-9]+)://([^:]*):(.*)@(.*)");
|
||||
public static final Pattern PATTERN_THAT_BREAKS_URI = Pattern.compile("[a-z0-9]+://.*/.*@.*");
|
||||
public static final Pattern PLUS_PATTERN = Pattern.compile("\\+");
|
||||
public static final Pattern STAR_PATTERN = Pattern.compile("\\*");
|
||||
public static final Pattern _7E_PATTERN = Pattern.compile("%7E");
|
||||
public static final Pattern NEWLINE_PATTERN = Pattern.compile("\r?\n");
|
||||
public static final Pattern SLASH_PATTERN = Pattern.compile("[/]");
|
||||
public static final Pattern IP_PATTERN = Pattern
|
||||
.compile("b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).)"
|
||||
+ "{3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)b");
|
||||
public static final Pattern LEADING_SLASHES = Pattern.compile("^[/]+");
|
||||
public static final Pattern TRAILING_SLASHES = Pattern.compile("[/]*$");
|
||||
|
||||
public final static Map<Character, Pattern> CHAR_TO_ENCODED_PATTERN = new MapMaker()
|
||||
.makeComputingMap(new Function<Character, Pattern>() {
|
||||
public Pattern apply(Character plain) {
|
||||
try {
|
||||
String encoded = URLEncoder.encode(plain + "", "UTF-8");
|
||||
return Pattern.compile(encoded);
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new IllegalStateException("Bad encoding on input: " + plain, e);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
public final static Map<Character, Pattern> CHAR_TO_PATTERN = new MapMaker()
|
||||
.makeComputingMap(new Function<Character, Pattern>() {
|
||||
public Pattern apply(Character plain) {
|
||||
return Pattern.compile(plain + "");
|
||||
}
|
||||
});
|
||||
|
||||
public final static Map<String, Pattern> TOKEN_TO_PATTERN = new MapMaker()
|
||||
.makeComputingMap(new Function<String, Pattern>() {
|
||||
public Pattern apply(String tokenValue) {
|
||||
return Pattern.compile("\\{" + tokenValue + "\\}");
|
||||
}
|
||||
});
|
||||
}
|
|
@ -19,12 +19,16 @@
|
|||
package org.jclouds.util;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import static org.jclouds.util.Patterns.CHAR_TO_PATTERN;
|
||||
import static org.jclouds.util.Patterns.TOKEN_TO_PATTERN;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
|
@ -46,6 +50,33 @@ import com.google.common.io.OutputSupplier;
|
|||
public class Utils {
|
||||
public static final String UTF8_ENCODING = "UTF-8";
|
||||
|
||||
public static String replaceTokens(String value, Collection<Entry<String, String>> tokenValues) {
|
||||
for (Entry<String, String> tokenValue : tokenValues) {
|
||||
value = replaceAll(value, TOKEN_TO_PATTERN.get(tokenValue.getKey()), tokenValue.getValue());
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
public static String replaceAll(String returnVal, Pattern pattern, String replace) {
|
||||
Matcher m = pattern.matcher(returnVal);
|
||||
returnVal = m.replaceAll(replace);
|
||||
return returnVal;
|
||||
}
|
||||
|
||||
public static String replaceAll(String input, char ifMatch, Pattern pattern, String replacement) {
|
||||
if (input.indexOf(ifMatch) != -1) {
|
||||
input = pattern.matcher(input).replaceAll(replacement);
|
||||
}
|
||||
return input;
|
||||
}
|
||||
|
||||
public static String replaceAll(String input, char match, String replacement) {
|
||||
if (input.indexOf(match) != -1) {
|
||||
input = CHAR_TO_PATTERN.get(match).matcher(input).replaceAll(replacement);
|
||||
}
|
||||
return input;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a factory that will supply instances of {@link OutputStream} that read from the given
|
||||
* outputStream.
|
||||
|
@ -80,7 +111,6 @@ public class Utils {
|
|||
@Resource
|
||||
protected static Logger logger = Logger.NULL;
|
||||
|
||||
|
||||
public static String toStringAndClose(InputStream input) throws IOException {
|
||||
try {
|
||||
return new String(ByteStreams.toByteArray(input), Charsets.UTF_8);
|
||||
|
|
|
@ -36,7 +36,6 @@ public class HttpPropertiesBuilderTest {
|
|||
int poolMaxClientReuse = 3932;
|
||||
int poolMaxClients = 3382;
|
||||
int poolMaxSessionFailures = 857;
|
||||
int poolRequestInvokerThreads = 8362;
|
||||
|
||||
HttpPropertiesBuilder builder = new HttpPropertiesBuilder(new Properties());
|
||||
builder.withHttpMaxRetries(httpMaxRetries);
|
||||
|
@ -45,6 +44,5 @@ public class HttpPropertiesBuilderTest {
|
|||
builder.withPoolMaxClientReuse(poolMaxClientReuse);
|
||||
builder.withPoolMaxClients(poolMaxClients);
|
||||
builder.withPoolMaxSessionFailures(poolMaxSessionFailures);
|
||||
builder.withPoolRequestInvokerThreads(poolRequestInvokerThreads);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -158,7 +158,7 @@ public class GaeHttpCommandExecutorService extends BaseHttpCommandExecutorServic
|
|||
HttpRequest request = command.getRequest();
|
||||
String hostHeader = request.getFirstHeaderOrNull(HttpHeaders.HOST);
|
||||
if (hostHeader != null) {
|
||||
command.redirect(hostHeader, request.getEndpoint().getPort());
|
||||
command.changeHostAndPortTo(hostHeader, request.getEndpoint().getPort());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -208,16 +208,29 @@ public class NioHttpCommandConnectionPool extends HttpCommandConnectionPool<NHtt
|
|||
|
||||
class NHttpClientConnectionPoolSessionRequestCallback implements SessionRequestCallback {
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public void completed(SessionRequest request) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @see releaseConnectionAndSetResponseException
|
||||
*/
|
||||
@Override
|
||||
public void cancelled(SessionRequest request) {
|
||||
releaseConnectionAndSetResponseException(request, new CancellationException(
|
||||
"Cancelled request: " + request.getRemoteAddress()));
|
||||
}
|
||||
|
||||
private void releaseConnectionAndSetResponseException(SessionRequest request, Exception e) {
|
||||
/**
|
||||
* Releases a connection and associates the current exception with the request using the
|
||||
* session.
|
||||
*/
|
||||
@VisibleForTesting
|
||||
void releaseConnectionAndSetResponseException(SessionRequest request, Exception e) {
|
||||
allConnections.release();
|
||||
TransformingHttpCommand<?> frequest = (TransformingHttpCommand<?>) request.getAttachment();
|
||||
if (frequest != null) {
|
||||
|
@ -225,6 +238,12 @@ public class NioHttpCommandConnectionPool extends HttpCommandConnectionPool<NHtt
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Disables the pool, if {@code maxSessionFailures} is reached}
|
||||
*
|
||||
* @see releaseConnectionAndSetResponseException
|
||||
*/
|
||||
@Override
|
||||
public void failed(SessionRequest request) {
|
||||
int count = currentSessionFailures.getAndIncrement();
|
||||
releaseConnectionAndSetResponseException(request, request.getException());
|
||||
|
@ -237,6 +256,10 @@ public class NioHttpCommandConnectionPool extends HttpCommandConnectionPool<NHtt
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* @see releaseConnectionAndSetResponseException
|
||||
*/
|
||||
@Override
|
||||
public void timeout(SessionRequest request) {
|
||||
releaseConnectionAndSetResponseException(request, new TimeoutException("Timeout on: "
|
||||
+ request.getRemoteAddress()));
|
||||
|
|
|
@ -63,7 +63,7 @@ public class NioHttpCommandExecutionHandler implements NHttpRequestExecutionHand
|
|||
@Resource
|
||||
protected Logger logger = Logger.NULL;
|
||||
@Resource
|
||||
@Named(HttpConstants.HTTP_HEADERS_LOGGER)
|
||||
@Named(HttpConstants.LOGGER_HTTP_HEADERS)
|
||||
protected Logger headerLog = Logger.NULL;
|
||||
|
||||
@Inject
|
||||
|
|
|
@ -18,12 +18,15 @@
|
|||
*/
|
||||
package org.jclouds.mezeo.pcs2.blobstore.functions;
|
||||
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.blobstore.domain.MutableBlobMetadata;
|
||||
import org.jclouds.blobstore.domain.StorageType;
|
||||
import org.jclouds.blobstore.domain.internal.MutableBlobMetadataImpl;
|
||||
import org.jclouds.mezeo.pcs2.domain.FileInfo;
|
||||
import org.jclouds.util.Utils;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
||||
|
@ -32,10 +35,12 @@ import com.google.common.base.Function;
|
|||
*/
|
||||
@Singleton
|
||||
public class FileInfoToBlobMetadata implements Function<FileInfo, MutableBlobMetadata> {
|
||||
public static final Pattern OBJECTS_PATTERN = Pattern.compile(".*objects/");
|
||||
|
||||
public MutableBlobMetadata apply(FileInfo from) {
|
||||
MutableBlobMetadata to = new MutableBlobMetadataImpl();
|
||||
if (from.getUrl() != null) {
|
||||
to.setId(from.getUrl().getPath().replaceAll(".*objects/", ""));
|
||||
to.setId(Utils.replaceAll(from.getUrl().getPath(), OBJECTS_PATTERN, ""));
|
||||
}
|
||||
to.setUri(from.getUrl());
|
||||
to.setName(from.getName());
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.net.URI;
|
|||
import java.util.Date;
|
||||
import java.util.Map;
|
||||
import java.util.SortedSet;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.inject.Inject;
|
||||
|
@ -34,6 +35,7 @@ import org.jclouds.mezeo.pcs2.domain.ResourceInfo;
|
|||
import org.jclouds.mezeo.pcs2.domain.internal.ContainerInfoImpl;
|
||||
import org.jclouds.mezeo.pcs2.domain.internal.ContainerListImpl;
|
||||
import org.jclouds.mezeo.pcs2.domain.internal.FileInfoImpl;
|
||||
import org.jclouds.util.Utils;
|
||||
import org.xml.sax.Attributes;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
|
@ -171,12 +173,14 @@ public class ContainerHandler extends ParseSax.HandlerWithResult<ContainerList>
|
|||
} else if (qName.equals("metadata-item")) {
|
||||
int index = attributes.getIndex("xlink:href");
|
||||
if (index != -1) {
|
||||
String key = attributes.getValue(index).replaceAll(".*/metadata/", "");
|
||||
String key = Utils.replaceAll(attributes.getValue(index), METADATA_PATTERN, "");
|
||||
metadataItems.put(key.toLowerCase(), URI.create(attributes.getValue(index)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public final Pattern METADATA_PATTERN = Pattern.compile(".*/metadata/");
|
||||
|
||||
@Override
|
||||
public void endElement(String uri, String name, String qName) {
|
||||
if (qName.equals("contents")) {
|
||||
|
|
|
@ -21,6 +21,7 @@ package org.jclouds.mezeo.pcs2.xml;
|
|||
import java.net.URI;
|
||||
import java.util.Date;
|
||||
import java.util.Map;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
|
@ -28,6 +29,7 @@ import org.jclouds.date.DateService;
|
|||
import org.jclouds.http.functions.ParseSax;
|
||||
import org.jclouds.mezeo.pcs2.domain.FileInfoWithMetadata;
|
||||
import org.jclouds.mezeo.pcs2.domain.internal.FileInfoWithMetadataImpl;
|
||||
import org.jclouds.util.Utils;
|
||||
import org.xml.sax.Attributes;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
|
@ -37,6 +39,9 @@ import com.google.common.collect.Maps;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
public class FileHandler extends ParseSax.HandlerWithResult<FileInfoWithMetadata> {
|
||||
private static final Pattern CONTENT_PATTERN = Pattern.compile("/content");
|
||||
private static final Pattern METADATA_PATTERN = Pattern.compile(".*/metadata/");
|
||||
|
||||
protected Map<String, URI> metadataItems = Maps.newHashMap();
|
||||
|
||||
protected URI currentUrl;
|
||||
|
@ -82,7 +87,8 @@ public class FileHandler extends ParseSax.HandlerWithResult<FileInfoWithMetadata
|
|||
int index = attributes.getIndex("xlink:href");
|
||||
if (index != -1) {
|
||||
currentContent = URI.create(attributes.getValue(index));
|
||||
currentUrl = URI.create(attributes.getValue(index).replaceAll("/content", ""));
|
||||
currentUrl = URI.create(Utils.replaceAll(attributes.getValue(index), CONTENT_PATTERN,
|
||||
""));
|
||||
}
|
||||
} else if (qName.equals("permissions")) {
|
||||
int index = attributes.getIndex("xlink:href");
|
||||
|
@ -109,12 +115,11 @@ public class FileHandler extends ParseSax.HandlerWithResult<FileInfoWithMetadata
|
|||
int index = attributes.getIndex("xlink:href");
|
||||
if (index != -1) {
|
||||
currentMetadata = URI.create(attributes.getValue(index));
|
||||
|
||||
}
|
||||
} else if (qName.equals("metadata-item")) {
|
||||
int index = attributes.getIndex("xlink:href");
|
||||
if (index != -1) {
|
||||
String key = attributes.getValue(index).replaceAll(".*/metadata/", "");
|
||||
String key = Utils.replaceAll(attributes.getValue(index), METADATA_PATTERN, "");
|
||||
metadataItems.put(key.toLowerCase(), URI.create(attributes.getValue(index)));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@ import org.jclouds.rackspace.cloudfiles.blobstore.functions.ResourceToObjectInfo
|
|||
import org.jclouds.rackspace.cloudfiles.domain.MutableObjectInfoWithMetadata;
|
||||
import org.jclouds.rest.InvocationContext;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
import org.jclouds.util.Utils;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
||||
|
@ -58,7 +59,8 @@ public class ParseObjectInfoFromHeaders implements
|
|||
MutableObjectInfoWithMetadata to = blobToObjectInfo.apply(base);
|
||||
String eTagHeader = from.getFirstHeaderOrNull("Etag");
|
||||
if (eTagHeader != null) {
|
||||
to.setHash(encryptionService.fromHexString(eTagHeader.replaceAll("\"", "")));
|
||||
String hashString = Utils.replaceAll(eTagHeader, '"', "");
|
||||
to.setHash(encryptionService.fromHexString(hashString));
|
||||
}
|
||||
return to;
|
||||
}
|
||||
|
|
|
@ -25,6 +25,7 @@ import java.util.Collections;
|
|||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.jclouds.scriptbuilder.util.Utils;
|
||||
|
||||
|
@ -182,8 +183,10 @@ public class CreateRunScript implements Statement {
|
|||
"echo %s%s%s>>%s{lf}", quote, line, quote, runScript)));
|
||||
}
|
||||
|
||||
public static final Pattern REDIRECT_FD_PATTERN = Pattern.compile(".*[0-2]>>.*");
|
||||
|
||||
static String addSpaceToEnsureWeDontAccidentallyRedirectFd(String line) {
|
||||
return line.matches(".*[0-2]>>.*") ? line.replace(">>", " >>") : line;
|
||||
return REDIRECT_FD_PATTERN.matcher(line).matches() ? line.replace(">>", " >>") : line;
|
||||
}
|
||||
|
||||
}
|
|
@ -20,6 +20,8 @@ package org.jclouds.vfs.provider.blobstore;
|
|||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import static com.google.common.base.Preconditions.checkState;
|
||||
import static org.jclouds.util.Patterns.LEADING_SLASHES;
|
||||
import static org.jclouds.util.Patterns.TRAILING_SLASHES;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
|
@ -31,6 +33,7 @@ import java.nio.channels.Channels;
|
|||
import java.util.Map;
|
||||
import java.util.NoSuchElementException;
|
||||
import java.util.Set;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.apache.commons.vfs.FileName;
|
||||
import org.apache.commons.vfs.FileNotFolderException;
|
||||
|
@ -58,6 +61,7 @@ import org.jclouds.blobstore.options.ListContainerOptions;
|
|||
import org.jclouds.blobstore.strategy.IsDirectoryStrategy;
|
||||
import org.jclouds.blobstore.strategy.internal.MarkersIsDirectoryStrategy;
|
||||
import org.jclouds.blobstore.util.BlobStoreUtils;
|
||||
import org.jclouds.util.Utils;
|
||||
|
||||
import com.google.common.base.Predicate;
|
||||
import com.google.common.base.Throwables;
|
||||
|
@ -75,6 +79,7 @@ public class BlobStoreFileObject extends AbstractFileObject {
|
|||
private static final IsDirectoryStrategy isDirectoryStrategy = new MarkersIsDirectoryStrategy();
|
||||
private static final ResourceMetadataToRelativePathResourceMetadata resource2Directory = new ResourceMetadataToRelativePathResourceMetadata();
|
||||
private static final Logger logger = Logger.getLogger(BlobStoreFileObject.class);
|
||||
private static final Pattern UNDESCRIBED = Pattern.compile("[^/]*//*");
|
||||
|
||||
public BlobStoreFileObject(FileName fileName, BlobStoreFileSystem fileSystem,
|
||||
BlobStore blobStore, String container) throws FileSystemException {
|
||||
|
@ -138,7 +143,7 @@ public class BlobStoreFileObject extends AbstractFileObject {
|
|||
}
|
||||
|
||||
String getNameTrimLeadingSlashes() {
|
||||
return getName().getPath().replaceAll("^[/]+", "");
|
||||
return Utils.replaceAll(getName().getPath(), LEADING_SLASHES, "");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -176,7 +181,7 @@ public class BlobStoreFileObject extends AbstractFileObject {
|
|||
if (isDirectoryStrategy.execute(md)) {
|
||||
md = resource2Directory.apply(md);
|
||||
}
|
||||
String childName = md.getName().replaceAll("[^/]*//*", "");
|
||||
String childName = Utils.replaceAll(md.getName(), UNDESCRIBED, "");
|
||||
BlobStoreFileObject fo = (BlobStoreFileObject) FileObjectUtils
|
||||
.getAbstractFileObject(getFileSystem().resolveFile(
|
||||
getFileSystem().getFileSystemManager().resolveName(getName(),
|
||||
|
@ -323,7 +328,7 @@ public class BlobStoreFileObject extends AbstractFileObject {
|
|||
}
|
||||
|
||||
public String trimLeadingAndTrailingSlashes(String in) {
|
||||
return in.replaceAll("^[/]*", "").replaceAll("[/]*$", "");
|
||||
return Utils.replaceAll(Utils.replaceAll(in, LEADING_SLASHES, ""), TRAILING_SLASHES, "");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
package org.jclouds.vcloud.terremark.binders;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import static org.jclouds.util.Utils.replaceTokens;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
|
@ -29,6 +30,10 @@ import javax.inject.Singleton;
|
|||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rest.MapBinder;
|
||||
import org.jclouds.rest.binders.BindToStringPayload;
|
||||
import org.jclouds.util.Patterns;
|
||||
import org.jclouds.util.Utils;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -51,14 +56,11 @@ public class BindAddInternetServiceToXmlPayload implements MapBinder {
|
|||
String port = checkNotNull(postParams.get("port"), "port parameter not present");
|
||||
String enabled = checkNotNull(postParams.get("enabled"), "enabled parameter not present");
|
||||
String description = postParams.get("description");
|
||||
|
||||
String payload = xmlTemplate.replaceAll("\\{name\\}", name);
|
||||
payload = payload.replaceAll("\\{protocol\\}", protocol);
|
||||
payload = payload.replaceAll("\\{port\\}", port);
|
||||
payload = payload.replaceAll("\\{enabled\\}", enabled);
|
||||
payload = payload.replaceAll("\\{description\\}", description == null ? "" : String.format(
|
||||
"\n <Description>%s</Description>", description));
|
||||
|
||||
String payload = replaceTokens(xmlTemplate, ImmutableMap.of("name", name, "protocol",
|
||||
protocol, "port", port, "enabled", enabled));
|
||||
payload = Utils.replaceAll(payload, Patterns.TOKEN_TO_PATTERN.get("description"),
|
||||
description == null ? "" : String.format("\n <Description>%s</Description>",
|
||||
description));
|
||||
stringBinder.bindToRequest(request, payload);
|
||||
}
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
package org.jclouds.vcloud.terremark.binders;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import static org.jclouds.util.Utils.replaceTokens;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
|
@ -29,6 +30,10 @@ import javax.inject.Singleton;
|
|||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rest.MapBinder;
|
||||
import org.jclouds.rest.binders.BindToStringPayload;
|
||||
import org.jclouds.util.Patterns;
|
||||
import org.jclouds.util.Utils;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -52,13 +57,11 @@ public class BindAddNodeServiceToXmlPayload implements MapBinder {
|
|||
String enabled = checkNotNull(postParams.get("enabled"), "enabled parameter not present");
|
||||
String description = postParams.get("description");
|
||||
|
||||
String payload = xmlTemplate.replaceAll("\\{ipAddress\\}", ipAddress);
|
||||
payload = payload.replaceAll("\\{name\\}", name);
|
||||
payload = payload.replaceAll("\\{port\\}", port);
|
||||
payload = payload.replaceAll("\\{enabled\\}", enabled);
|
||||
payload = payload.replaceAll("\\{description\\}", description == null ? "" : String.format(
|
||||
"\n <Description>%s</Description>", description));
|
||||
|
||||
String payload = replaceTokens(xmlTemplate, ImmutableMap.of("name", name, "ipAddress",
|
||||
ipAddress, "port", port, "enabled", enabled));
|
||||
payload = Utils.replaceAll(payload, Patterns.TOKEN_TO_PATTERN.get("description"),
|
||||
description == null ? "" : String.format("\n <Description>%s</Description>",
|
||||
description));
|
||||
stringBinder.bindToRequest(request, payload);
|
||||
}
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@ package org.jclouds.vcloud.terremark.domain;
|
|||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
|
@ -36,6 +37,8 @@ public class VAppConfiguration {
|
|||
private List<Long> disks = Lists.newArrayList();
|
||||
private List<Integer> disksToDelete = Lists.newArrayList();
|
||||
|
||||
public static final Pattern NAME_PATTERN = Pattern.compile("^[a-zA-Z][-a-zA-Z0-9]+");
|
||||
|
||||
/**
|
||||
* The vApp name has the following requirements: Name can use uppercase and/or lowercase letters.
|
||||
* Name can contain numbers or hyphens (-). Name may only begin with a letter. A maximum of 15
|
||||
|
@ -44,7 +47,7 @@ public class VAppConfiguration {
|
|||
*/
|
||||
public VAppConfiguration changeNameTo(String name) {
|
||||
checkArgument(
|
||||
name.matches("^[a-zA-Z][-a-zA-Z0-9]+"),
|
||||
NAME_PATTERN.matcher(name).matches(),
|
||||
"Name can use uppercase and/or lowercase letters, numbers or hyphens (-). Name may only begin with a letter.");
|
||||
checkArgument(name.length() <= 15, "A maximum of 15 characters are allowed.");
|
||||
this.name = name;
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
package org.jclouds.vcloud.terremark.functions;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import javax.inject.Singleton;
|
||||
|
||||
|
@ -34,6 +35,8 @@ import com.google.common.base.Function;
|
|||
*/
|
||||
@Singleton
|
||||
public class ReturnVoidOnDeleteDefaultIp implements Function<Exception, Void> {
|
||||
public static final Pattern MESSAGE_PATTERN = Pattern
|
||||
.compile(".*Cannot release this Public IP as it is default oubound IP.*");
|
||||
|
||||
static final Void v;
|
||||
static {
|
||||
|
@ -50,10 +53,8 @@ public class ReturnVoidOnDeleteDefaultIp implements Function<Exception, Void> {
|
|||
public Void apply(Exception from) {
|
||||
if (from instanceof HttpResponseException) {
|
||||
HttpResponseException hre = (HttpResponseException) from;
|
||||
if (hre.getResponse().getStatusCode() == 503
|
||||
|| hre.getResponse().getStatusCode() == 401
|
||||
|| hre.getMessage().matches(
|
||||
".*Cannot release this Public IP as it is default oubound IP.*"))
|
||||
if (hre.getResponse().getStatusCode() == 503 || hre.getResponse().getStatusCode() == 401
|
||||
|| MESSAGE_PATTERN.matcher(hre.getMessage()).matches())
|
||||
return v;
|
||||
}
|
||||
return null;
|
||||
|
|
Loading…
Reference in New Issue