mirror of https://github.com/apache/jclouds.git
Issue 76: Reverted decision to rename binders to decorators. binders are not decorators, as they do not enclose objects and add behavior
git-svn-id: http://jclouds.googlecode.com/svn/trunk@1970 3d8758e0-26b5-11de-8745-db77d3ebf521
This commit is contained in:
parent
06c63e6284
commit
9c3dcdf495
|
@ -34,7 +34,7 @@ import javax.ws.rs.PUT;
|
|||
import javax.ws.rs.Path;
|
||||
import javax.ws.rs.PathParam;
|
||||
|
||||
import org.jclouds.aws.s3.decorators.AddS3ObjectEntity;
|
||||
import org.jclouds.aws.s3.binders.BindS3ObjectToEntity;
|
||||
import org.jclouds.aws.s3.domain.BucketMetadata;
|
||||
import org.jclouds.aws.s3.domain.ListBucketResponse;
|
||||
import org.jclouds.aws.s3.domain.ObjectMetadata;
|
||||
|
@ -55,7 +55,7 @@ import org.jclouds.blobstore.functions.ThrowKeyNotFoundOn404;
|
|||
import org.jclouds.http.functions.ParseETagHeader;
|
||||
import org.jclouds.http.functions.ReturnFalseOn404;
|
||||
import org.jclouds.http.options.GetOptions;
|
||||
import org.jclouds.rest.annotations.DecoratorParam;
|
||||
import org.jclouds.rest.annotations.BinderParam;
|
||||
import org.jclouds.rest.annotations.Endpoint;
|
||||
import org.jclouds.rest.annotations.ExceptionParser;
|
||||
import org.jclouds.rest.annotations.HostPrefixParam;
|
||||
|
@ -181,7 +181,7 @@ public interface S3BlobStore extends BlobStore<BucketMetadata, ObjectMetadata, S
|
|||
@ResponseParser(ParseETagHeader.class)
|
||||
Future<byte[]> putBlob(
|
||||
@HostPrefixParam String bucketName,
|
||||
@PathParam("key") @ParamParser(BlobKey.class) @DecoratorParam(AddS3ObjectEntity.class) S3Object object);
|
||||
@PathParam("key") @ParamParser(BlobKey.class) @BinderParam(BindS3ObjectToEntity.class) S3Object object);
|
||||
|
||||
@PUT
|
||||
@Path("/")
|
||||
|
|
|
@ -34,8 +34,8 @@ import javax.ws.rs.PUT;
|
|||
import javax.ws.rs.Path;
|
||||
import javax.ws.rs.PathParam;
|
||||
|
||||
import org.jclouds.aws.s3.decorators.AddACLAsXMLEntity;
|
||||
import org.jclouds.aws.s3.decorators.AddS3ObjectEntity;
|
||||
import org.jclouds.aws.s3.binders.BindACLToXMLEntity;
|
||||
import org.jclouds.aws.s3.binders.BindS3ObjectToEntity;
|
||||
import org.jclouds.aws.s3.domain.AccessControlList;
|
||||
import org.jclouds.aws.s3.domain.BucketMetadata;
|
||||
import org.jclouds.aws.s3.domain.ListBucketResponse;
|
||||
|
@ -62,7 +62,7 @@ import org.jclouds.blobstore.functions.ThrowKeyNotFoundOn404;
|
|||
import org.jclouds.http.functions.ParseETagHeader;
|
||||
import org.jclouds.http.functions.ReturnFalseOn404;
|
||||
import org.jclouds.http.options.GetOptions;
|
||||
import org.jclouds.rest.annotations.DecoratorParam;
|
||||
import org.jclouds.rest.annotations.BinderParam;
|
||||
import org.jclouds.rest.annotations.Endpoint;
|
||||
import org.jclouds.rest.annotations.ExceptionParser;
|
||||
import org.jclouds.rest.annotations.Headers;
|
||||
|
@ -206,7 +206,7 @@ public interface S3Connection {
|
|||
@ResponseParser(ParseETagHeader.class)
|
||||
Future<byte[]> putObject(
|
||||
@HostPrefixParam String bucketName,
|
||||
@PathParam("key") @ParamParser(BlobKey.class) @DecoratorParam(AddS3ObjectEntity.class) S3Object object,
|
||||
@PathParam("key") @ParamParser(BlobKey.class) @BinderParam(BindS3ObjectToEntity.class) S3Object object,
|
||||
PutObjectOptions... options);
|
||||
|
||||
/**
|
||||
|
@ -375,7 +375,7 @@ public interface S3Connection {
|
|||
@Path("/")
|
||||
@QueryParams(keys = "acl")
|
||||
Future<Boolean> putBucketACL(@HostPrefixParam String bucketName,
|
||||
@DecoratorParam(AddACLAsXMLEntity.class) AccessControlList acl);
|
||||
@BinderParam(BindACLToXMLEntity.class) AccessControlList acl);
|
||||
|
||||
/**
|
||||
* A GET request operation directed at an object or bucket URI with the "acl" parameter retrieves
|
||||
|
@ -418,6 +418,6 @@ public interface S3Connection {
|
|||
@QueryParams(keys = "acl")
|
||||
@Path("{key}")
|
||||
Future<Boolean> putObjectACL(@HostPrefixParam String bucketName, @PathParam("key") String key,
|
||||
@DecoratorParam(AddACLAsXMLEntity.class) AccessControlList acl);
|
||||
@BinderParam(BindACLToXMLEntity.class) AccessControlList acl);
|
||||
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.aws.s3.decorators;
|
||||
package org.jclouds.aws.s3.binders;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
|
@ -37,14 +37,14 @@ import org.jclouds.aws.s3.domain.AccessControlList.Grant;
|
|||
import org.jclouds.aws.s3.domain.AccessControlList.GroupGrantee;
|
||||
import org.jclouds.aws.s3.reference.S3Constants;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rest.decorators.RequestDecorator;
|
||||
import org.jclouds.rest.Binder;
|
||||
import org.jclouds.util.Utils;
|
||||
|
||||
import com.jamesmurty.utils.XMLBuilder;
|
||||
|
||||
public class AddACLAsXMLEntity implements RequestDecorator {
|
||||
public class BindACLToXMLEntity implements Binder {
|
||||
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object entity) {
|
||||
public void bindToRequest(HttpRequest request, Object entity) {
|
||||
AccessControlList from = (AccessControlList) entity;
|
||||
Properties outputProperties = new Properties();
|
||||
outputProperties.put(javax.xml.transform.OutputKeys.OMIT_XML_DECLARATION, "yes");
|
||||
|
@ -57,7 +57,6 @@ public class AddACLAsXMLEntity implements RequestDecorator {
|
|||
Utils.rethrowIfRuntime(e);
|
||||
throw new RuntimeException("error transforming acl: " + from, e);
|
||||
}
|
||||
return request;
|
||||
}
|
||||
|
||||
protected XMLBuilder generateBuilder(AccessControlList acl) throws ParserConfigurationException,
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.aws.s3.decorators;
|
||||
package org.jclouds.aws.s3.binders;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
import static org.jclouds.blobstore.reference.BlobStoreConstants.PROPERTY_USER_METADATA_PREFIX;
|
||||
|
@ -31,17 +31,17 @@ import javax.inject.Named;
|
|||
import javax.ws.rs.core.HttpHeaders;
|
||||
|
||||
import org.jclouds.aws.s3.domain.S3Object;
|
||||
import org.jclouds.blobstore.decorators.AddBlobEntity;
|
||||
import org.jclouds.blobstore.binders.BindBlobToEntity;
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
|
||||
public class AddS3ObjectEntity extends AddBlobEntity {
|
||||
public class BindS3ObjectToEntity extends BindBlobToEntity {
|
||||
@Inject
|
||||
public AddS3ObjectEntity(@Named(PROPERTY_USER_METADATA_PREFIX) String metadataPrefix) {
|
||||
public BindS3ObjectToEntity(@Named(PROPERTY_USER_METADATA_PREFIX) String metadataPrefix) {
|
||||
super(metadataPrefix);
|
||||
}
|
||||
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object entity) {
|
||||
public void bindToRequest(HttpRequest request, Object entity) {
|
||||
Blob<?> object = (Blob<?>) entity;
|
||||
checkArgument(object.getMetadata().getSize() >= 0, "size must be set");
|
||||
checkArgument(object.getContentLength() <= 5 * 1024 * 1024 * 1024,
|
||||
|
@ -63,6 +63,6 @@ public class AddS3ObjectEntity extends AddBlobEntity {
|
|||
s3Object.getMetadata().getContentEncoding());
|
||||
}
|
||||
}
|
||||
return super.decorateRequest(request, entity);
|
||||
super.bindToRequest(request, entity);
|
||||
}
|
||||
}
|
|
@ -32,6 +32,9 @@ import java.util.TreeSet;
|
|||
import java.util.concurrent.atomic.AtomicLong;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import javax.inject.Singleton;
|
||||
import javax.ws.rs.core.HttpHeaders;
|
||||
|
||||
import org.jclouds.aws.s3.reference.S3Constants;
|
||||
|
@ -42,9 +45,6 @@ import org.jclouds.http.HttpUtils;
|
|||
import org.jclouds.util.DateService;
|
||||
|
||||
import com.google.common.annotations.VisibleForTesting;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
import javax.inject.Named;
|
||||
|
||||
/**
|
||||
* Signs the S3 request. This will update timestamps at most once per second.
|
||||
|
@ -102,11 +102,10 @@ public class RequestAuthorizeSignature implements HttpRequestFilter {
|
|||
timeStamp = new AtomicReference<String>(createNewStamp());
|
||||
}
|
||||
|
||||
public HttpRequest filter(HttpRequest request) throws HttpException {
|
||||
public void filter(HttpRequest request) throws HttpException {
|
||||
replaceDateHeader(request);
|
||||
String toSign = createStringToSign(request);
|
||||
calculateAndReplaceAuthHeader(request, toSign);
|
||||
return request;
|
||||
}
|
||||
|
||||
public String createStringToSign(HttpRequest request) {
|
||||
|
|
|
@ -33,6 +33,7 @@ import javax.ws.rs.core.HttpHeaders;
|
|||
import org.jclouds.aws.s3.reference.S3Constants;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.util.DateService;
|
||||
import org.jclouds.util.Jsr330;
|
||||
import org.testng.annotations.BeforeClass;
|
||||
import org.testng.annotations.DataProvider;
|
||||
import org.testng.annotations.Test;
|
||||
|
@ -40,7 +41,6 @@ import org.testng.annotations.Test;
|
|||
import com.google.inject.AbstractModule;
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
import org.jclouds.util.Jsr330;
|
||||
|
||||
@Test(groups = "unit", testName = "s3.RequestAuthorizeSignatureTest")
|
||||
public class RequestAuthorizeSignatureTest {
|
||||
|
@ -72,7 +72,9 @@ public class RequestAuthorizeSignatureTest {
|
|||
String signature = request.getFirstHeaderOrNull(HttpHeaders.AUTHORIZATION);
|
||||
String date = request.getFirstHeaderOrNull(HttpHeaders.DATE);
|
||||
int iterations = 1;
|
||||
while (filter.filter(request).getFirstHeaderOrNull(HttpHeaders.DATE).equals(date)) {
|
||||
while (request.getFirstHeaderOrNull(HttpHeaders.DATE).equals(date)) {
|
||||
date = request.getFirstHeaderOrNull(HttpHeaders.DATE);
|
||||
filter.filter(request);
|
||||
iterations++;
|
||||
assertEquals(signature, request.getFirstHeaderOrNull(HttpHeaders.AUTHORIZATION));
|
||||
}
|
||||
|
@ -111,7 +113,6 @@ public class RequestAuthorizeSignatureTest {
|
|||
assertEquals(builder.toString(), "");
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
void testHeadersGoLowercase() {
|
||||
URI host = URI.create("http://s3.amazonaws.com:80");
|
||||
|
@ -121,6 +122,7 @@ public class RequestAuthorizeSignatureTest {
|
|||
filter.appendBucketName(request, builder);
|
||||
assertEquals(builder.toString(), "");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testAppendBucketNameURIHost() {
|
||||
URI host = URI.create("http://adriancole.s3int5.s3-external-3.amazonaws.com:80");
|
||||
|
@ -154,8 +156,8 @@ public class RequestAuthorizeSignatureTest {
|
|||
protected void configure() {
|
||||
bindConstant().annotatedWith(Jsr330.named(S3Constants.PROPERTY_AWS_ACCESSKEYID)).to(
|
||||
"foo");
|
||||
bindConstant().annotatedWith(Jsr330.named(S3Constants.PROPERTY_AWS_SECRETACCESSKEY)).to(
|
||||
"bar");
|
||||
bindConstant().annotatedWith(Jsr330.named(S3Constants.PROPERTY_AWS_SECRETACCESSKEY))
|
||||
.to("bar");
|
||||
bind(DateService.class);
|
||||
|
||||
}
|
||||
|
|
|
@ -50,15 +50,15 @@ import org.jclouds.azure.storage.domain.BoundedSortedSet;
|
|||
import org.jclouds.azure.storage.filters.SharedKeyAuthentication;
|
||||
import org.jclouds.azure.storage.options.ListOptions;
|
||||
import org.jclouds.azure.storage.reference.AzureStorageHeaders;
|
||||
import org.jclouds.blobstore.decorators.AddBlobEntity;
|
||||
import org.jclouds.blobstore.decorators.AddHeadersWithPrefix;
|
||||
import org.jclouds.blobstore.binders.BindBlobToEntity;
|
||||
import org.jclouds.blobstore.binders.BindMultimapToHeadersWithPrefix;
|
||||
import org.jclouds.blobstore.functions.BlobKey;
|
||||
import org.jclouds.blobstore.functions.ReturnVoidOnNotFoundOr404;
|
||||
import org.jclouds.blobstore.functions.ThrowKeyNotFoundOn404;
|
||||
import org.jclouds.http.functions.ParseETagHeader;
|
||||
import org.jclouds.http.functions.ReturnTrueOn404;
|
||||
import org.jclouds.http.options.GetOptions;
|
||||
import org.jclouds.rest.annotations.DecoratorParam;
|
||||
import org.jclouds.rest.annotations.BinderParam;
|
||||
import org.jclouds.rest.annotations.Endpoint;
|
||||
import org.jclouds.rest.annotations.ExceptionParser;
|
||||
import org.jclouds.rest.annotations.Headers;
|
||||
|
@ -144,7 +144,7 @@ public interface AzureBlobConnection {
|
|||
@Path("{container}")
|
||||
@QueryParams(keys = { "restype", "comp" }, values = { "container", "metadata" })
|
||||
void setContainerMetadata(@PathParam("container") String container,
|
||||
@DecoratorParam(AddHeadersWithPrefix.class) Multimap<String, String> metadata);
|
||||
@BinderParam(BindMultimapToHeadersWithPrefix.class) Multimap<String, String> metadata);
|
||||
|
||||
/**
|
||||
* The Delete Container operation marks the specified container for deletion. The container and
|
||||
|
@ -272,7 +272,7 @@ public interface AzureBlobConnection {
|
|||
@Path("{container}/{key}")
|
||||
@ResponseParser(ParseETagHeader.class)
|
||||
Future<byte[]> putBlob(@PathParam("container") String container,
|
||||
@PathParam("key") @ParamParser(BlobKey.class) @DecoratorParam(AddBlobEntity.class) Blob object);
|
||||
@PathParam("key") @ParamParser(BlobKey.class) @BinderParam(BindBlobToEntity.class) Blob object);
|
||||
|
||||
/**
|
||||
* The Get Blob operation reads or downloads a blob from the system, including its metadata and
|
||||
|
@ -302,7 +302,7 @@ public interface AzureBlobConnection {
|
|||
@Path("{container}/{key}")
|
||||
@QueryParams(keys = { "comp" }, values = { "metadata" })
|
||||
void setBlobMetadata(@PathParam("container") String container, @PathParam("key") String key,
|
||||
@DecoratorParam(AddHeadersWithPrefix.class) Multimap<String, String> metadata);
|
||||
@BinderParam(BindMultimapToHeadersWithPrefix.class) Multimap<String, String> metadata);
|
||||
|
||||
/**
|
||||
* The Delete Blob operation marks the specified blob for deletion. The blob is later deleted
|
||||
|
|
|
@ -35,7 +35,7 @@ import javax.ws.rs.Path;
|
|||
import javax.ws.rs.PathParam;
|
||||
|
||||
import org.jclouds.azure.storage.AzureBlob;
|
||||
import org.jclouds.azure.storage.blob.decorators.GenerateMD5AndAddBlobEntity;
|
||||
import org.jclouds.azure.storage.blob.binders.GenerateMD5AndBindBlobToEntity;
|
||||
import org.jclouds.azure.storage.blob.domain.Blob;
|
||||
import org.jclouds.azure.storage.blob.domain.BlobMetadata;
|
||||
import org.jclouds.azure.storage.blob.domain.ContainerMetadata;
|
||||
|
@ -56,7 +56,7 @@ import org.jclouds.blobstore.functions.ThrowKeyNotFoundOn404;
|
|||
import org.jclouds.http.functions.ParseETagHeader;
|
||||
import org.jclouds.http.functions.ReturnFalseOn404;
|
||||
import org.jclouds.http.options.GetOptions;
|
||||
import org.jclouds.rest.annotations.DecoratorParam;
|
||||
import org.jclouds.rest.annotations.BinderParam;
|
||||
import org.jclouds.rest.annotations.Endpoint;
|
||||
import org.jclouds.rest.annotations.ExceptionParser;
|
||||
import org.jclouds.rest.annotations.Headers;
|
||||
|
@ -149,7 +149,7 @@ public interface AzureBlobStore extends BlobStore<ContainerMetadata, BlobMetadat
|
|||
@ResponseParser(ParseETagHeader.class)
|
||||
Future<byte[]> putBlob(
|
||||
@PathParam("container") String container,
|
||||
@PathParam("key") @ParamParser(BlobKey.class) @DecoratorParam(GenerateMD5AndAddBlobEntity.class) Blob object);
|
||||
@PathParam("key") @ParamParser(BlobKey.class) @BinderParam(GenerateMD5AndBindBlobToEntity.class) Blob object);
|
||||
|
||||
@GET
|
||||
@ResponseParser(ParseBlobFromHeadersAndHttpContent.class)
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.azure.storage.blob.decorators;
|
||||
package org.jclouds.azure.storage.blob.binders;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
import static org.jclouds.blobstore.reference.BlobStoreConstants.PROPERTY_USER_METADATA_PREFIX;
|
||||
|
@ -34,14 +34,14 @@ import org.jclouds.azure.storage.blob.domain.BlobMetadata;
|
|||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
|
||||
public class AddBlobEntity extends org.jclouds.blobstore.decorators.AddBlobEntity {
|
||||
public class BindBlobToEntity extends org.jclouds.blobstore.binders.BindBlobToEntity {
|
||||
@Inject
|
||||
public AddBlobEntity(@Named(PROPERTY_USER_METADATA_PREFIX) String metadataPrefix) {
|
||||
public BindBlobToEntity(@Named(PROPERTY_USER_METADATA_PREFIX) String metadataPrefix) {
|
||||
super(metadataPrefix);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object entity) {
|
||||
public void bindToRequest(HttpRequest request, Object entity) {
|
||||
Blob<?> object = (Blob<?>) entity;
|
||||
checkArgument(object.getMetadata().getSize() >= 0, "size must be set");
|
||||
checkArgument(object.getContentLength() <= 64 * 1024 * 1024,
|
||||
|
@ -57,6 +57,6 @@ public class AddBlobEntity extends org.jclouds.blobstore.decorators.AddBlobEntit
|
|||
request.getHeaders().put(HttpHeaders.CONTENT_ENCODING, md.getContentEncoding());
|
||||
}
|
||||
}
|
||||
return super.decorateRequest(request, entity);
|
||||
super.bindToRequest(request, entity);
|
||||
}
|
||||
}
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.azure.storage.blob.decorators;
|
||||
package org.jclouds.azure.storage.blob.binders;
|
||||
|
||||
import static org.jclouds.blobstore.reference.BlobStoreConstants.PROPERTY_USER_METADATA_PREFIX;
|
||||
|
||||
|
@ -33,15 +33,15 @@ import javax.inject.Named;
|
|||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
|
||||
public class GenerateMD5AndAddBlobEntity extends AddBlobEntity {
|
||||
public class GenerateMD5AndBindBlobToEntity extends BindBlobToEntity {
|
||||
|
||||
@Inject
|
||||
public GenerateMD5AndAddBlobEntity(@Named(PROPERTY_USER_METADATA_PREFIX) String metadataPrefix) {
|
||||
public GenerateMD5AndBindBlobToEntity(@Named(PROPERTY_USER_METADATA_PREFIX) String metadataPrefix) {
|
||||
super(metadataPrefix);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object entity) {
|
||||
public void bindToRequest(HttpRequest request, Object entity) {
|
||||
Blob<?> object = (Blob<?>) entity;
|
||||
if (object.getMetadata().getContentMD5() == null) {
|
||||
try {
|
||||
|
@ -50,6 +50,6 @@ public class GenerateMD5AndAddBlobEntity extends AddBlobEntity {
|
|||
throw new RuntimeException("Could not generate MD5 for " + object.getKey(), e);
|
||||
}
|
||||
}
|
||||
return super.decorateRequest(request, entity);
|
||||
super.bindToRequest(request, entity);
|
||||
}
|
||||
}
|
|
@ -33,10 +33,10 @@ import javax.ws.rs.core.HttpHeaders;
|
|||
|
||||
import org.jclouds.azure.storage.blob.domain.ContainerMetadata;
|
||||
import org.jclouds.http.HttpException;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.http.HttpUtils;
|
||||
import org.jclouds.rest.InvocationContext;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
import org.jclouds.util.DateService;
|
||||
|
||||
import com.google.common.annotations.VisibleForTesting;
|
||||
|
@ -54,8 +54,7 @@ public class ParseContainerMetadataFromHeaders implements
|
|||
|
||||
private final DateService dateParser;
|
||||
private final String metadataPrefix;
|
||||
private HttpRequest request;
|
||||
private Object[] args;
|
||||
private GeneratedHttpRequest<?> request;
|
||||
|
||||
@Inject
|
||||
public ParseContainerMetadataFromHeaders(DateService dateParser,
|
||||
|
@ -65,11 +64,11 @@ public class ParseContainerMetadataFromHeaders implements
|
|||
}
|
||||
|
||||
public ContainerMetadata apply(HttpResponse from) {
|
||||
ContainerMetadata to = new ContainerMetadata(getArgs()[0].toString());
|
||||
ContainerMetadata to = new ContainerMetadata(request.getArgs()[0].toString());
|
||||
addUserMetadataTo(from, to);
|
||||
parseLastModifiedOrThrowException(from, to);
|
||||
addETagTo(from, to);
|
||||
to.setUrl(getRequest().getEndpoint());
|
||||
to.setUrl(request.getEndpoint());
|
||||
return to;
|
||||
}
|
||||
|
||||
|
@ -104,17 +103,8 @@ public class ParseContainerMetadataFromHeaders implements
|
|||
}
|
||||
}
|
||||
|
||||
public Object[] getArgs() {
|
||||
return args;
|
||||
}
|
||||
|
||||
public HttpRequest getRequest() {
|
||||
return request;
|
||||
}
|
||||
|
||||
public void setContext(HttpRequest request, Object[] args) {
|
||||
public void setContext(GeneratedHttpRequest<?> request) {
|
||||
this.request = request;
|
||||
this.args = args;
|
||||
}
|
||||
|
||||
}
|
|
@ -46,7 +46,6 @@ import org.jclouds.blobstore.functions.ReturnVoidOnNotFoundOr404;
|
|||
import org.jclouds.blobstore.reference.BlobStoreConstants;
|
||||
import org.jclouds.concurrent.WithinThreadExecutorService;
|
||||
import org.jclouds.concurrent.config.ExecutorServiceModule;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpUtils;
|
||||
import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
|
||||
import org.jclouds.http.functions.ParseSax;
|
||||
|
@ -56,6 +55,7 @@ import org.jclouds.http.functions.ReturnVoidIf2xx;
|
|||
import org.jclouds.logging.Logger;
|
||||
import org.jclouds.logging.Logger.LoggerFactory;
|
||||
import org.jclouds.rest.config.RestModule;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||
import org.jclouds.util.Jsr330;
|
||||
import org.testng.annotations.BeforeClass;
|
||||
|
@ -81,7 +81,7 @@ public class AzureBlobConnectionTest {
|
|||
Method method = AzureBlobConnection.class.getMethod("listContainers", Array.newInstance(
|
||||
ListOptions.class, 0).getClass());
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] {});
|
||||
GeneratedHttpRequest<AzureBlobConnection> httpMethod = processor.createRequest(method, new Object[] {});
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "myaccount.blob.core.windows.net");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "comp=list");
|
||||
|
@ -89,7 +89,7 @@ public class AzureBlobConnectionTest {
|
|||
assertEquals(httpMethod.getHeaders().size(), 1);
|
||||
assertEquals(httpMethod.getHeaders().get("x-ms-version"), Collections
|
||||
.singletonList("2009-07-17"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseSax.class);
|
||||
// TODO check generic type of response parser
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
|
@ -99,7 +99,7 @@ public class AzureBlobConnectionTest {
|
|||
Method method = AzureBlobConnection.class.getMethod("listContainers", Array.newInstance(
|
||||
ListOptions.class, 0).getClass());
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { maxResults(1).marker(
|
||||
GeneratedHttpRequest<AzureBlobConnection> httpMethod = processor.createRequest(method, new Object[] { maxResults(1).marker(
|
||||
"marker").prefix("prefix") });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "myaccount.blob.core.windows.net");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/");
|
||||
|
@ -111,7 +111,7 @@ public class AzureBlobConnectionTest {
|
|||
assertEquals(httpMethod.getHeaders().size(), 1);
|
||||
assertEquals(httpMethod.getHeaders().get("x-ms-version"), Collections
|
||||
.singletonList("2009-07-17"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseSax.class);
|
||||
// TODO check generic type of response parser
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
|
@ -121,7 +121,7 @@ public class AzureBlobConnectionTest {
|
|||
Method method = AzureBlobConnection.class.getMethod("createContainer", String.class, Array
|
||||
.newInstance(CreateContainerOptions.class, 0).getClass());
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "container" });
|
||||
GeneratedHttpRequest<AzureBlobConnection> httpMethod = processor.createRequest(method, new Object[] { "container" });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "myaccount.blob.core.windows.net");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/container");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "restype=container");
|
||||
|
@ -130,7 +130,7 @@ public class AzureBlobConnectionTest {
|
|||
assertEquals(httpMethod.getHeaders().get("x-ms-version"), Collections
|
||||
.singletonList("2009-07-17"));
|
||||
assertEquals(httpMethod.getHeaders().get("Content-Length"), Collections.singletonList("0"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
// TODO check generic type of response parser
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
|
@ -140,7 +140,7 @@ public class AzureBlobConnectionTest {
|
|||
public void testDeleteContainer() throws SecurityException, NoSuchMethodException {
|
||||
Method method = AzureBlobConnection.class.getMethod("deleteContainer", String.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "container" });
|
||||
GeneratedHttpRequest<AzureBlobConnection> httpMethod = processor.createRequest(method, new Object[] { "container" });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "myaccount.blob.core.windows.net");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/container");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "restype=container");
|
||||
|
@ -148,7 +148,7 @@ public class AzureBlobConnectionTest {
|
|||
assertEquals(httpMethod.getHeaders().size(), 1);
|
||||
assertEquals(httpMethod.getHeaders().get("x-ms-version"), Collections
|
||||
.singletonList("2009-07-17"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnVoidIf2xx.class);
|
||||
// TODO check generic type of response parser
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
|
@ -159,7 +159,7 @@ public class AzureBlobConnectionTest {
|
|||
Method method = AzureBlobConnection.class.getMethod("createContainer", String.class, Array
|
||||
.newInstance(CreateContainerOptions.class, 0).getClass());
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "container",
|
||||
GeneratedHttpRequest<AzureBlobConnection> httpMethod = processor.createRequest(method, new Object[] { "container",
|
||||
withPublicAcl().withMetadata(ImmutableMultimap.of("foo", "bar")) });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "myaccount.blob.core.windows.net");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/container");
|
||||
|
@ -172,7 +172,7 @@ public class AzureBlobConnectionTest {
|
|||
assertEquals(httpMethod.getHeaders().get("x-ms-prop-publicaccess"), Collections
|
||||
.singletonList("true"));
|
||||
assertEquals(httpMethod.getHeaders().get("Content-Length"), Collections.singletonList("0"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
// TODO check generic type of response parser
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
|
@ -183,7 +183,7 @@ public class AzureBlobConnectionTest {
|
|||
Method method = AzureBlobConnection.class.getMethod("createRootContainer", Array.newInstance(
|
||||
CreateContainerOptions.class, 0).getClass());
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] {});
|
||||
GeneratedHttpRequest<AzureBlobConnection> httpMethod = processor.createRequest(method, new Object[] {});
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "myaccount.blob.core.windows.net");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/$root");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "restype=container");
|
||||
|
@ -192,7 +192,7 @@ public class AzureBlobConnectionTest {
|
|||
assertEquals(httpMethod.getHeaders().get("x-ms-version"), Collections
|
||||
.singletonList("2009-07-17"));
|
||||
assertEquals(httpMethod.getHeaders().get("Content-Length"), Collections.singletonList("0"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
// TODO check generic type of response parser
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
|
@ -202,7 +202,7 @@ public class AzureBlobConnectionTest {
|
|||
public void testDeleteRootContainer() throws SecurityException, NoSuchMethodException {
|
||||
Method method = AzureBlobConnection.class.getMethod("deleteRootContainer");
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] {});
|
||||
GeneratedHttpRequest<AzureBlobConnection> httpMethod = processor.createRequest(method, new Object[] {});
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "myaccount.blob.core.windows.net");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/$root");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "restype=container");
|
||||
|
@ -210,7 +210,7 @@ public class AzureBlobConnectionTest {
|
|||
assertEquals(httpMethod.getHeaders().size(), 1);
|
||||
assertEquals(httpMethod.getHeaders().get("x-ms-version"), Collections
|
||||
.singletonList("2009-07-17"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
// TODO check generic type of response parser
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
|
@ -221,7 +221,7 @@ public class AzureBlobConnectionTest {
|
|||
Method method = AzureBlobConnection.class.getMethod("createRootContainer", Array.newInstance(
|
||||
CreateContainerOptions.class, 0).getClass());
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { withPublicAcl()
|
||||
GeneratedHttpRequest<AzureBlobConnection> httpMethod = processor.createRequest(method, new Object[] { withPublicAcl()
|
||||
.withMetadata(ImmutableMultimap.of("foo", "bar")) });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "myaccount.blob.core.windows.net");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/$root");
|
||||
|
@ -234,7 +234,7 @@ public class AzureBlobConnectionTest {
|
|||
assertEquals(httpMethod.getHeaders().get("x-ms-prop-publicaccess"), Collections
|
||||
.singletonList("true"));
|
||||
assertEquals(httpMethod.getHeaders().get("Content-Length"), Collections.singletonList("0"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
// TODO check generic type of response parser
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
|
@ -245,7 +245,7 @@ public class AzureBlobConnectionTest {
|
|||
Method method = AzureBlobConnection.class.getMethod("listBlobs", String.class, Array
|
||||
.newInstance(ListBlobsOptions.class, 0).getClass());
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "container" });
|
||||
GeneratedHttpRequest<AzureBlobConnection> httpMethod = processor.createRequest(method, new Object[] { "container" });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "myaccount.blob.core.windows.net");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/container");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "restype=container&comp=list");
|
||||
|
@ -253,7 +253,7 @@ public class AzureBlobConnectionTest {
|
|||
assertEquals(httpMethod.getHeaders().size(), 1);
|
||||
assertEquals(httpMethod.getHeaders().get("x-ms-version"), Collections
|
||||
.singletonList("2009-07-17"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseSax.class);
|
||||
// TODO check generic type of response parser
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
|
@ -263,7 +263,7 @@ public class AzureBlobConnectionTest {
|
|||
Method method = AzureBlobConnection.class.getMethod("listBlobs", Array.newInstance(
|
||||
ListBlobsOptions.class, 0).getClass());
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] {});
|
||||
GeneratedHttpRequest<AzureBlobConnection> httpMethod = processor.createRequest(method, new Object[] {});
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "myaccount.blob.core.windows.net");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/$root");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "restype=container&comp=list");
|
||||
|
@ -271,7 +271,7 @@ public class AzureBlobConnectionTest {
|
|||
assertEquals(httpMethod.getHeaders().size(), 1);
|
||||
assertEquals(httpMethod.getHeaders().get("x-ms-version"), Collections
|
||||
.singletonList("2009-07-17"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseSax.class);
|
||||
// TODO check generic type of response parser
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
|
@ -280,7 +280,7 @@ public class AzureBlobConnectionTest {
|
|||
public void testContainerProperties() throws SecurityException, NoSuchMethodException {
|
||||
Method method = AzureBlobConnection.class.getMethod("getContainerProperties", String.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "container" });
|
||||
GeneratedHttpRequest<AzureBlobConnection> httpMethod = processor.createRequest(method, new Object[] { "container" });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "myaccount.blob.core.windows.net");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/container");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "restype=container");
|
||||
|
@ -288,7 +288,7 @@ public class AzureBlobConnectionTest {
|
|||
assertEquals(httpMethod.getHeaders().size(), 1);
|
||||
assertEquals(httpMethod.getHeaders().get("x-ms-version"), Collections
|
||||
.singletonList("2009-07-17"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseContainerMetadataFromHeaders.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
}
|
||||
|
@ -297,7 +297,7 @@ public class AzureBlobConnectionTest {
|
|||
Method method = AzureBlobConnection.class.getMethod("setContainerMetadata", String.class,
|
||||
Multimap.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "container",
|
||||
GeneratedHttpRequest<AzureBlobConnection> httpMethod = processor.createRequest(method, new Object[] { "container",
|
||||
ImmutableMultimap.of("key", "value") });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "myaccount.blob.core.windows.net");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/container");
|
||||
|
@ -310,7 +310,7 @@ public class AzureBlobConnectionTest {
|
|||
.singletonList("2009-07-17"));
|
||||
assertEquals(httpMethod.getHeaders().get("x-ms-meta-key"), Collections.singletonList("value"));
|
||||
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnVoidIf2xx.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
}
|
||||
|
@ -318,7 +318,7 @@ public class AzureBlobConnectionTest {
|
|||
public void testSetBlobMetadata() throws SecurityException, NoSuchMethodException {
|
||||
Method method = AzureBlobConnection.class.getMethod("setBlobMetadata", String.class,
|
||||
String.class, Multimap.class);
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "container", "blob",
|
||||
GeneratedHttpRequest<AzureBlobConnection> httpMethod = processor.createRequest(method, new Object[] { "container", "blob",
|
||||
ImmutableMultimap.of("key", "value") });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "myaccount.blob.core.windows.net");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/container/blob");
|
||||
|
@ -331,7 +331,7 @@ public class AzureBlobConnectionTest {
|
|||
.singletonList("0"));
|
||||
assertEquals(httpMethod.getHeaders().get("x-ms-meta-key"), Collections.singletonList("value"));
|
||||
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnVoidIf2xx.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
}
|
||||
|
|
|
@ -42,7 +42,6 @@ import org.jclouds.blobstore.functions.ReturnVoidOnNotFoundOr404;
|
|||
import org.jclouds.blobstore.reference.BlobStoreConstants;
|
||||
import org.jclouds.concurrent.WithinThreadExecutorService;
|
||||
import org.jclouds.concurrent.config.ExecutorServiceModule;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpUtils;
|
||||
import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
|
||||
import org.jclouds.http.functions.ParseETagHeader;
|
||||
|
@ -52,6 +51,7 @@ import org.jclouds.http.functions.ReturnVoidIf2xx;
|
|||
import org.jclouds.logging.Logger;
|
||||
import org.jclouds.logging.Logger.LoggerFactory;
|
||||
import org.jclouds.rest.config.RestModule;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||
import org.jclouds.util.Jsr330;
|
||||
import org.testng.annotations.BeforeClass;
|
||||
|
@ -75,7 +75,7 @@ public class AzureBlobStoreTest {
|
|||
public void testListContainers() throws SecurityException, NoSuchMethodException {
|
||||
Method method = AzureBlobStore.class.getMethod("listContainers");
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] {});
|
||||
GeneratedHttpRequest<AzureBlobStore> httpMethod = processor.createRequest(method, new Object[] {});
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "myaccount.blob.core.windows.net");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "comp=list");
|
||||
|
@ -83,7 +83,7 @@ public class AzureBlobStoreTest {
|
|||
assertEquals(httpMethod.getHeaders().size(), 1);
|
||||
assertEquals(httpMethod.getHeaders().get("x-ms-version"), Collections
|
||||
.singletonList("2009-07-17"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseSax.class);
|
||||
// TODO check generic type of response parser
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
|
@ -92,7 +92,7 @@ public class AzureBlobStoreTest {
|
|||
public void testCreateContainer() throws SecurityException, NoSuchMethodException {
|
||||
Method method = AzureBlobStore.class.getMethod("createContainer", String.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "container" });
|
||||
GeneratedHttpRequest<AzureBlobStore> httpMethod = processor.createRequest(method, new Object[] { "container" });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "myaccount.blob.core.windows.net");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/container");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "restype=container");
|
||||
|
@ -101,7 +101,7 @@ public class AzureBlobStoreTest {
|
|||
assertEquals(httpMethod.getHeaders().get("x-ms-version"), Collections
|
||||
.singletonList("2009-07-17"));
|
||||
assertEquals(httpMethod.getHeaders().get("Content-Length"), Collections.singletonList("0"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
// TODO check generic type of response parser
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
|
@ -111,7 +111,7 @@ public class AzureBlobStoreTest {
|
|||
public void testDeleteContainer() throws SecurityException, NoSuchMethodException {
|
||||
Method method = AzureBlobStore.class.getMethod("deleteContainer", String.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "container" });
|
||||
GeneratedHttpRequest<AzureBlobStore> httpMethod = processor.createRequest(method, new Object[] { "container" });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "myaccount.blob.core.windows.net");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/container");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "restype=container");
|
||||
|
@ -119,7 +119,7 @@ public class AzureBlobStoreTest {
|
|||
assertEquals(httpMethod.getHeaders().size(), 1);
|
||||
assertEquals(httpMethod.getHeaders().get("x-ms-version"), Collections
|
||||
.singletonList("2009-07-17"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnVoidIf2xx.class);
|
||||
// TODO check generic type of response parser
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
|
@ -129,7 +129,7 @@ public class AzureBlobStoreTest {
|
|||
public void testListBlobs() throws SecurityException, NoSuchMethodException {
|
||||
Method method = AzureBlobStore.class.getMethod("listBlobs", String.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "container" });
|
||||
GeneratedHttpRequest<AzureBlobStore> httpMethod = processor.createRequest(method, new Object[] { "container" });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "myaccount.blob.core.windows.net");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/container");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "restype=container&comp=list");
|
||||
|
@ -137,7 +137,7 @@ public class AzureBlobStoreTest {
|
|||
assertEquals(httpMethod.getHeaders().size(), 1);
|
||||
assertEquals(httpMethod.getHeaders().get("x-ms-version"), Collections
|
||||
.singletonList("2009-07-17"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseSax.class);
|
||||
// TODO check generic type of response parser
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
|
@ -148,7 +148,7 @@ public class AzureBlobStoreTest {
|
|||
|
||||
Blob blob = new Blob("test");
|
||||
blob.setData("test");
|
||||
HttpRequest httpMethod = processor
|
||||
GeneratedHttpRequest<AzureBlobStore> httpMethod = processor
|
||||
.createRequest(method, new Object[] { "mycontainer", blob });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "myaccount.blob.core.windows.net");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/mycontainer/test");
|
||||
|
@ -164,7 +164,7 @@ public class AzureBlobStoreTest {
|
|||
assertEquals(httpMethod.getHeaders().get("Content-MD5"), Collections.singletonList(HttpUtils
|
||||
.toBase64String(HttpUtils.md5("test"))));
|
||||
assertEquals(httpMethod.getEntity(), "test");
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseETagHeader.class);
|
||||
}
|
||||
|
||||
|
|
|
@ -30,6 +30,9 @@ import java.util.TreeSet;
|
|||
import java.util.concurrent.atomic.AtomicLong;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import javax.inject.Singleton;
|
||||
import javax.ws.rs.core.HttpHeaders;
|
||||
|
||||
import org.jclouds.azure.storage.reference.AzureStorageConstants;
|
||||
|
@ -40,9 +43,6 @@ import org.jclouds.http.HttpUtils;
|
|||
import org.jclouds.util.DateService;
|
||||
|
||||
import com.google.common.annotations.VisibleForTesting;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
import javax.inject.Named;
|
||||
|
||||
/**
|
||||
* Signs the Azure Storage request. This will update timestamps at most once per second.
|
||||
|
@ -101,11 +101,10 @@ public class SharedKeyAuthentication implements HttpRequestFilter {
|
|||
timeStamp = new AtomicReference<String>(createNewStamp());
|
||||
}
|
||||
|
||||
public HttpRequest filter(HttpRequest request) throws HttpException {
|
||||
public void filter(HttpRequest request) throws HttpException {
|
||||
replaceDateHeader(request);
|
||||
String toSign = createStringToSign(request);
|
||||
calculateAndReplaceAuthHeader(request, toSign);
|
||||
return request;
|
||||
}
|
||||
|
||||
public String createStringToSign(HttpRequest request) {
|
||||
|
@ -154,42 +153,45 @@ public class SharedKeyAuthentication implements HttpRequestFilter {
|
|||
toSign.deleteCharAt(toSign.lastIndexOf(","));
|
||||
toSign.append("\n");
|
||||
}
|
||||
// }
|
||||
// // Retrieve all headers for the resource that begin with x-ms-, including the x-ms-date
|
||||
// // header.
|
||||
// Set<String> matchingHeaders = Sets.filter(request.getHeaders().keySet(),
|
||||
// new Predicate<String>() {
|
||||
// public boolean apply(String input) {
|
||||
// return input.startsWith("x-ms-");
|
||||
// }
|
||||
// });
|
||||
//
|
||||
// // Convert each HTTP header name to lowercase.
|
||||
// // Sort the container of headers lexicographically by header name, in ascending order.
|
||||
// SortedSet<String> lowercaseHeaders = Sets.newTreeSet(Iterables.transform(matchingHeaders,
|
||||
// new Function<String, String>() {
|
||||
// public String apply(String from) {
|
||||
// return from.toLowerCase();
|
||||
// }
|
||||
// }));
|
||||
//
|
||||
// for (String header : lowercaseHeaders) {
|
||||
// // Combine headers with the same name into one header. The resulting header should be a
|
||||
// // name-value pair of the format "header-name:comma-separated-value-list", without any
|
||||
// // white
|
||||
// // space between values.
|
||||
// toSign.append(header).append(":");
|
||||
// // Trim any white space around the colon in the header.
|
||||
// // TODO: not sure why there would be...
|
||||
// for (String value : request.getHeaders().get(header))
|
||||
// // Replace any breaking white space with a single space.
|
||||
// toSign.append(value.replaceAll("\r?\n", " ")).append(",");
|
||||
// toSign.deleteCharAt(toSign.lastIndexOf(","));
|
||||
// // Finally, append a new line character to each canonicalized header in the resulting list.
|
||||
// // Construct the CanonicalizedHeaders string by concatenating all headers in this list into
|
||||
// // a
|
||||
// // single string.
|
||||
// toSign.append("\n");
|
||||
// }
|
||||
// // Retrieve all headers for the resource that begin with x-ms-, including the x-ms-date
|
||||
// // header.
|
||||
// Set<String> matchingHeaders = Sets.filter(request.getHeaders().keySet(),
|
||||
// new Predicate<String>() {
|
||||
// public boolean apply(String input) {
|
||||
// return input.startsWith("x-ms-");
|
||||
// }
|
||||
// });
|
||||
//
|
||||
// // Convert each HTTP header name to lowercase.
|
||||
// // Sort the container of headers lexicographically by header name, in ascending order.
|
||||
// SortedSet<String> lowercaseHeaders =
|
||||
// Sets.newTreeSet(Iterables.transform(matchingHeaders,
|
||||
// new Function<String, String>() {
|
||||
// public String apply(String from) {
|
||||
// return from.toLowerCase();
|
||||
// }
|
||||
// }));
|
||||
//
|
||||
// for (String header : lowercaseHeaders) {
|
||||
// // Combine headers with the same name into one header. The resulting header should be a
|
||||
// // name-value pair of the format "header-name:comma-separated-value-list", without any
|
||||
// // white
|
||||
// // space between values.
|
||||
// toSign.append(header).append(":");
|
||||
// // Trim any white space around the colon in the header.
|
||||
// // TODO: not sure why there would be...
|
||||
// for (String value : request.getHeaders().get(header))
|
||||
// // Replace any breaking white space with a single space.
|
||||
// toSign.append(value.replaceAll("\r?\n", " ")).append(",");
|
||||
// toSign.deleteCharAt(toSign.lastIndexOf(","));
|
||||
// // Finally, append a new line character to each canonicalized header in the resulting
|
||||
// list.
|
||||
// // Construct the CanonicalizedHeaders string by concatenating all headers in this list
|
||||
// into
|
||||
// // a
|
||||
// // single string.
|
||||
// toSign.append("\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -34,6 +34,7 @@ import org.jclouds.azure.storage.reference.AzureStorageConstants;
|
|||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpUtils;
|
||||
import org.jclouds.util.DateService;
|
||||
import org.jclouds.util.Jsr330;
|
||||
import org.testng.annotations.BeforeClass;
|
||||
import org.testng.annotations.DataProvider;
|
||||
import org.testng.annotations.Test;
|
||||
|
@ -41,7 +42,6 @@ import org.testng.annotations.Test;
|
|||
import com.google.inject.AbstractModule;
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
import org.jclouds.util.Jsr330;
|
||||
|
||||
@Test(groups = "unit", testName = "azurestorage.SharedKeyAuthenticationTest")
|
||||
public class SharedKeyAuthenticationTest {
|
||||
|
@ -77,7 +77,9 @@ public class SharedKeyAuthenticationTest {
|
|||
String signature = request.getFirstHeaderOrNull(HttpHeaders.AUTHORIZATION);
|
||||
String date = request.getFirstHeaderOrNull(HttpHeaders.DATE);
|
||||
int iterations = 1;
|
||||
while (filter.filter(request).getFirstHeaderOrNull(HttpHeaders.DATE).equals(date)) {
|
||||
while (request.getFirstHeaderOrNull(HttpHeaders.DATE).equals(date)) {
|
||||
date = request.getFirstHeaderOrNull(HttpHeaders.DATE);
|
||||
filter.filter(request);
|
||||
iterations++;
|
||||
assertEquals(signature, request.getFirstHeaderOrNull(HttpHeaders.AUTHORIZATION));
|
||||
}
|
||||
|
|
|
@ -39,7 +39,6 @@ import org.jclouds.azure.storage.options.ListOptions;
|
|||
import org.jclouds.azure.storage.reference.AzureStorageConstants;
|
||||
import org.jclouds.concurrent.WithinThreadExecutorService;
|
||||
import org.jclouds.concurrent.config.ExecutorServiceModule;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpUtils;
|
||||
import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
|
||||
import org.jclouds.http.functions.ParseSax;
|
||||
|
@ -47,6 +46,7 @@ import org.jclouds.http.functions.ReturnTrueIf2xx;
|
|||
import org.jclouds.logging.Logger;
|
||||
import org.jclouds.logging.Logger.LoggerFactory;
|
||||
import org.jclouds.rest.config.RestModule;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||
import org.jclouds.util.Jsr330;
|
||||
import org.testng.annotations.BeforeClass;
|
||||
|
@ -74,7 +74,8 @@ public class AzureQueueConnectionTest {
|
|||
public void testListQueues() throws SecurityException, NoSuchMethodException {
|
||||
Method method = AzureQueueConnection.class.getMethod("listQueues", listOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] {});
|
||||
GeneratedHttpRequest<AzureQueueConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] {});
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "comp=list");
|
||||
|
@ -82,8 +83,7 @@ public class AzureQueueConnectionTest {
|
|||
assertEquals(httpMethod.getHeaders().size(), 1);
|
||||
assertEquals(httpMethod.getHeaders().get("x-ms-version"), Collections
|
||||
.singletonList("2009-07-17"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
ParseSax.class);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(), ParseSax.class);
|
||||
// TODO check generic type of response parser
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
}
|
||||
|
@ -91,8 +91,8 @@ public class AzureQueueConnectionTest {
|
|||
public void testListQueuesOptions() throws SecurityException, NoSuchMethodException {
|
||||
Method method = AzureQueueConnection.class.getMethod("listQueues", listOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { maxResults(1).marker(
|
||||
"marker").prefix("prefix") });
|
||||
GeneratedHttpRequest<AzureQueueConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { maxResults(1).marker("marker").prefix("prefix") });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/");
|
||||
assert httpMethod.getEndpoint().getQuery().contains("comp=list");
|
||||
|
@ -103,8 +103,7 @@ public class AzureQueueConnectionTest {
|
|||
assertEquals(httpMethod.getHeaders().size(), 1);
|
||||
assertEquals(httpMethod.getHeaders().get("x-ms-version"), Collections
|
||||
.singletonList("2009-07-17"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
ParseSax.class);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(), ParseSax.class);
|
||||
// TODO check generic type of response parser
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
}
|
||||
|
@ -113,7 +112,8 @@ public class AzureQueueConnectionTest {
|
|||
Method method = AzureQueueConnection.class.getMethod("createQueue", String.class,
|
||||
createOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "queue" });
|
||||
GeneratedHttpRequest<AzureQueueConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { "queue" });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/queue");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "restype=queue");
|
||||
|
@ -122,7 +122,7 @@ public class AzureQueueConnectionTest {
|
|||
assertEquals(httpMethod.getHeaders().get("x-ms-version"), Collections
|
||||
.singletonList("2009-07-17"));
|
||||
assertEquals(httpMethod.getHeaders().get("Content-Length"), Collections.singletonList("0"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
// TODO check generic type of response parser
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
|
@ -131,7 +131,8 @@ public class AzureQueueConnectionTest {
|
|||
public void testDeleteQueue() throws SecurityException, NoSuchMethodException {
|
||||
Method method = AzureQueueConnection.class.getMethod("deleteQueue", String.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "queue" });
|
||||
GeneratedHttpRequest<AzureQueueConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { "queue" });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/queue");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "restype=queue");
|
||||
|
@ -139,7 +140,7 @@ public class AzureQueueConnectionTest {
|
|||
assertEquals(httpMethod.getHeaders().size(), 1);
|
||||
assertEquals(httpMethod.getHeaders().get("x-ms-version"), Collections
|
||||
.singletonList("2009-07-17"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
// TODO check generic type of response parser
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
|
@ -149,8 +150,8 @@ public class AzureQueueConnectionTest {
|
|||
Method method = AzureQueueConnection.class.getMethod("createQueue", String.class,
|
||||
createOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "queue",
|
||||
withMetadata(ImmutableMultimap.of("foo", "bar")) });
|
||||
GeneratedHttpRequest<AzureQueueConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { "queue", withMetadata(ImmutableMultimap.of("foo", "bar")) });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/queue");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "restype=queue");
|
||||
|
@ -160,7 +161,7 @@ public class AzureQueueConnectionTest {
|
|||
.singletonList("2009-07-17"));
|
||||
assertEquals(httpMethod.getHeaders().get("x-ms-meta-foo"), Collections.singletonList("bar"));
|
||||
assertEquals(httpMethod.getHeaders().get("Content-Length"), Collections.singletonList("0"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
// TODO check generic type of response parser
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.blobstore.decorators;
|
||||
package org.jclouds.blobstore.binders;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import static org.jclouds.blobstore.reference.BlobStoreConstants.PROPERTY_USER_METADATA_PREFIX;
|
||||
|
@ -33,17 +33,17 @@ import javax.ws.rs.core.HttpHeaders;
|
|||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpUtils;
|
||||
import org.jclouds.rest.decorators.RequestDecorator;
|
||||
import org.jclouds.rest.Binder;
|
||||
|
||||
public class AddBlobEntity implements RequestDecorator {
|
||||
public class BindBlobToEntity implements Binder {
|
||||
private final String metadataPrefix;
|
||||
|
||||
@Inject
|
||||
public AddBlobEntity(@Named(PROPERTY_USER_METADATA_PREFIX) String metadataPrefix) {
|
||||
public BindBlobToEntity(@Named(PROPERTY_USER_METADATA_PREFIX) String metadataPrefix) {
|
||||
this.metadataPrefix = metadataPrefix;
|
||||
}
|
||||
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object entity) {
|
||||
public void bindToRequest(HttpRequest request, Object entity) {
|
||||
Blob<?> object = (Blob<?>) entity;
|
||||
|
||||
for (String key : object.getMetadata().getUserMetadata().keySet()) {
|
||||
|
@ -63,6 +63,5 @@ public class AddBlobEntity implements RequestDecorator {
|
|||
request.getHeaders().put("Content-MD5",
|
||||
HttpUtils.toBase64String(object.getMetadata().getContentMD5()));
|
||||
}
|
||||
return request;
|
||||
}
|
||||
}
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.blobstore.decorators;
|
||||
package org.jclouds.blobstore.binders;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
|
@ -37,7 +37,7 @@ import org.jclouds.blobstore.util.BlobStoreUtils;
|
|||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.MultipartForm;
|
||||
import org.jclouds.http.MultipartForm.Part;
|
||||
import org.jclouds.rest.decorators.RequestDecorator;
|
||||
import org.jclouds.rest.Binder;
|
||||
|
||||
import com.google.common.collect.ImmutableMultimap;
|
||||
import com.google.common.collect.Multimap;
|
||||
|
@ -46,11 +46,11 @@ import com.google.common.collect.Multimap;
|
|||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class AddBlobEntityAsMultipartForm implements RequestDecorator {
|
||||
public class BindBlobToMultipartForm implements Binder {
|
||||
|
||||
public static final String BOUNDARY = "--JCLOUDS--";
|
||||
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object entity) {
|
||||
public void bindToRequest(HttpRequest request, Object entity) {
|
||||
Blob<?> object = (Blob<?>) entity;
|
||||
Key key = BlobStoreUtils.parseKey(new Key("junk", object.getKey()));
|
||||
Multimap<String, String> partHeaders = ImmutableMultimap.of("Content-Disposition", String
|
||||
|
@ -84,6 +84,5 @@ public class AddBlobEntityAsMultipartForm implements RequestDecorator {
|
|||
"multipart/form-data; boundary=" + BOUNDARY);
|
||||
|
||||
request.getHeaders().put(HttpHeaders.CONTENT_LENGTH, form.getSize() + "");
|
||||
return request;
|
||||
}
|
||||
}
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.blobstore.decorators;
|
||||
package org.jclouds.blobstore.binders;
|
||||
|
||||
import static org.jclouds.blobstore.reference.BlobStoreConstants.PROPERTY_USER_METADATA_PREFIX;
|
||||
|
||||
|
@ -31,20 +31,20 @@ import javax.inject.Inject;
|
|||
import javax.inject.Named;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rest.decorators.RequestDecorator;
|
||||
import org.jclouds.rest.Binder;
|
||||
|
||||
import com.google.common.collect.Multimap;
|
||||
|
||||
public class AddHeadersWithPrefix implements RequestDecorator {
|
||||
public class BindMultimapToHeadersWithPrefix implements Binder {
|
||||
private final String metadataPrefix;
|
||||
|
||||
@Inject
|
||||
public AddHeadersWithPrefix(@Named(PROPERTY_USER_METADATA_PREFIX) String metadataPrefix) {
|
||||
public BindMultimapToHeadersWithPrefix(@Named(PROPERTY_USER_METADATA_PREFIX) String metadataPrefix) {
|
||||
this.metadataPrefix = metadataPrefix;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public HttpRequest decorateRequest( HttpRequest request, Object entity) {
|
||||
public void bindToRequest(HttpRequest request, Object entity) {
|
||||
Multimap<String, String> userMetadata = (Multimap<String, String>) entity;
|
||||
for (Entry<String, String> entry : userMetadata.entries()) {
|
||||
if (entry.getKey().startsWith(metadataPrefix)) {
|
||||
|
@ -54,7 +54,6 @@ public class AddHeadersWithPrefix implements RequestDecorator {
|
|||
entry.getValue());
|
||||
}
|
||||
}
|
||||
return request;
|
||||
}
|
||||
|
||||
}
|
|
@ -36,9 +36,9 @@ import org.jclouds.blobstore.domain.ContainerMetadata;
|
|||
import org.jclouds.blobstore.internal.BlobRuntimeException;
|
||||
import org.jclouds.blobstore.reference.BlobStoreConstants;
|
||||
import org.jclouds.blobstore.strategy.ClearContainerStrategy;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpResponseException;
|
||||
import org.jclouds.rest.InvocationContext;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
import org.jclouds.util.Utils;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
@ -62,12 +62,12 @@ public class ClearAndDeleteIfNotEmpty<C extends ContainerMetadata, M extends Blo
|
|||
@Inject(optional = true)
|
||||
@Named(BlobStoreConstants.PROPERTY_BLOBSTORE_TIMEOUT)
|
||||
protected long requestTimeoutMilliseconds = 30000;
|
||||
private Object[] args;
|
||||
private HttpRequest request;
|
||||
|
||||
private final ClearContainerStrategy<C, M, B> clear;
|
||||
private final BlobStore<C, M, B> connection;
|
||||
|
||||
private GeneratedHttpRequest<?> request;
|
||||
|
||||
@Inject
|
||||
protected
|
||||
ClearAndDeleteIfNotEmpty(ClearContainerStrategy<C, M, B> clear, BlobStore<C, M, B> connection) {
|
||||
|
@ -81,31 +81,21 @@ public class ClearAndDeleteIfNotEmpty<C extends ContainerMetadata, M extends Blo
|
|||
if (responseException.getResponse().getStatusCode() == 404) {
|
||||
return v;
|
||||
} else if (responseException.getResponse().getStatusCode() == 409) {
|
||||
clear.execute(connection, args[0].toString());
|
||||
clear.execute(connection, request.getArgs()[0].toString());
|
||||
try {
|
||||
connection.deleteContainer(args[0].toString()).get(requestTimeoutMilliseconds,
|
||||
connection.deleteContainer(request.getArgs()[0].toString()).get(requestTimeoutMilliseconds,
|
||||
TimeUnit.MILLISECONDS);
|
||||
return v;
|
||||
} catch (Exception e) {
|
||||
Utils.<BlobRuntimeException> rethrowIfRuntimeOrSameType(e);
|
||||
throw new BlobRuntimeException("Error deleting container: " + args[0].toString(), e);
|
||||
throw new BlobRuntimeException("Error deleting container: " + request.getArgs()[0].toString(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public Object[] getArgs() {
|
||||
return args;
|
||||
}
|
||||
|
||||
public HttpRequest getRequest() {
|
||||
return request;
|
||||
}
|
||||
|
||||
public void setContext(HttpRequest request, Object[] args) {
|
||||
public void setContext(GeneratedHttpRequest<?> request) {
|
||||
this.request = request;
|
||||
this.args = args;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -30,9 +30,9 @@ import javax.ws.rs.core.HttpHeaders;
|
|||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||
import org.jclouds.http.HttpException;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.rest.InvocationContext;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
|
||||
import com.google.common.annotations.VisibleForTesting;
|
||||
import com.google.common.base.Function;
|
||||
|
@ -91,16 +91,8 @@ public class ParseBlobFromHeadersAndHttpContent<M extends BlobMetadata, B extend
|
|||
}
|
||||
}
|
||||
|
||||
public Object[] getArgs() {
|
||||
return metadataParser.getArgs();
|
||||
}
|
||||
|
||||
public HttpRequest getRequest() {
|
||||
return metadataParser.getRequest();
|
||||
}
|
||||
|
||||
public void setContext(HttpRequest request, Object[] args) {
|
||||
metadataParser.setContext(request, args);
|
||||
public void setContext(GeneratedHttpRequest<?> request) {
|
||||
metadataParser.setContext(request);
|
||||
}
|
||||
|
||||
}
|
|
@ -29,9 +29,9 @@ import javax.ws.rs.core.HttpHeaders;
|
|||
|
||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||
import org.jclouds.http.HttpException;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.rest.InvocationContext;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
|
||||
import com.google.common.annotations.VisibleForTesting;
|
||||
import com.google.common.base.Function;
|
||||
|
@ -42,8 +42,7 @@ import com.google.common.base.Function;
|
|||
public class ParseContentTypeFromHeaders<M extends BlobMetadata> implements
|
||||
Function<HttpResponse, M>, InvocationContext {
|
||||
private final Provider<M> metadataFactory;
|
||||
private HttpRequest request;
|
||||
private Object[] args;
|
||||
private GeneratedHttpRequest<?> request;
|
||||
|
||||
@Inject
|
||||
public ParseContentTypeFromHeaders(Provider<M> metadataFactory) {
|
||||
|
@ -60,7 +59,7 @@ public class ParseContentTypeFromHeaders<M extends BlobMetadata> implements
|
|||
}
|
||||
|
||||
protected String getKeyFor(HttpResponse from) {
|
||||
String objectKey = getRequest().getEndpoint().getPath();
|
||||
String objectKey = request.getEndpoint().getPath();
|
||||
if (objectKey.startsWith("/")) {
|
||||
// Trim initial slash from object key name.
|
||||
objectKey = objectKey.substring(1);
|
||||
|
@ -82,17 +81,8 @@ public class ParseContentTypeFromHeaders<M extends BlobMetadata> implements
|
|||
metadata.setContentType(contentType);
|
||||
}
|
||||
|
||||
public Object[] getArgs() {
|
||||
return args;
|
||||
}
|
||||
|
||||
public HttpRequest getRequest() {
|
||||
return request;
|
||||
}
|
||||
|
||||
public void setContext(HttpRequest request, Object[] args) {
|
||||
public void setContext(GeneratedHttpRequest<?> request) {
|
||||
this.request = request;
|
||||
this.args = args;
|
||||
}
|
||||
|
||||
}
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.blobstore.decorators;
|
||||
package org.jclouds.blobstore.binders;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
|
@ -32,7 +32,6 @@ import java.net.URI;
|
|||
import javax.ws.rs.core.HttpHeaders;
|
||||
import javax.ws.rs.core.MediaType;
|
||||
|
||||
import org.jclouds.blobstore.decorators.AddBlobEntityAsMultipartForm;
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
|
@ -44,10 +43,10 @@ import org.testng.annotations.Test;
|
|||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(testName = "blobstore.AddBlobEntityAsMultipartFormTest")
|
||||
public class AddBlobEntityAsMultipartFormTest {
|
||||
@Test(testName = "blobstore.BindBlobToMultipartFormTest")
|
||||
public class BindBlobToMultipartFormTest {
|
||||
|
||||
public static String BOUNDRY = AddBlobEntityAsMultipartForm.BOUNDARY;
|
||||
public static String BOUNDRY = BindBlobToMultipartForm.BOUNDARY;
|
||||
public static final String EXPECTS;
|
||||
public static final Blob<BlobMetadata> TEST_BLOB;
|
||||
|
||||
|
@ -65,10 +64,10 @@ public class AddBlobEntityAsMultipartFormTest {
|
|||
|
||||
assertEquals(EXPECTS.length(), 131);
|
||||
|
||||
AddBlobEntityAsMultipartForm binder = new AddBlobEntityAsMultipartForm();
|
||||
BindBlobToMultipartForm binder = new BindBlobToMultipartForm();
|
||||
|
||||
HttpRequest request = new HttpRequest("GET", URI.create("http://localhost:8001"));
|
||||
binder.decorateRequest(request, TEST_BLOB);
|
||||
binder.bindToRequest(request, TEST_BLOB);
|
||||
|
||||
assertEquals(Utils.toStringAndClose((InputStream) request.getEntity()), EXPECTS);
|
||||
assertEquals(request.getFirstHeaderOrNull(HttpHeaders.CONTENT_LENGTH), 131 + "");
|
|
@ -23,6 +23,9 @@
|
|||
*/
|
||||
package org.jclouds.blobstore.functions;
|
||||
|
||||
import static org.easymock.EasyMock.expect;
|
||||
import static org.easymock.classextension.EasyMock.createMock;
|
||||
import static org.easymock.classextension.EasyMock.replay;
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.net.URI;
|
||||
|
@ -34,9 +37,9 @@ import javax.ws.rs.core.MediaType;
|
|||
|
||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||
import org.jclouds.http.HttpException;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.http.HttpUtils;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
import org.jclouds.util.DateService;
|
||||
import org.testng.annotations.BeforeTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
@ -60,9 +63,11 @@ public class ParseBlobMetadataFromHeadersTest {
|
|||
|
||||
parser = new ParseSystemAndUserMetadataFromHeaders<BlobMetadata>(new DateService(), "prefix",
|
||||
blobMetadataProvider);
|
||||
parser
|
||||
.setContext(new HttpRequest("GET", URI.create("http://localhost/key")),
|
||||
new Object[] {});
|
||||
|
||||
GeneratedHttpRequest<?> request = createMock(GeneratedHttpRequest.class);
|
||||
expect(request.getEndpoint()).andReturn(URI.create("http://localhost/key")).anyTimes();
|
||||
replay(request);
|
||||
parser.setContext(request);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -44,8 +44,8 @@ public class HttpRequest extends HttpMessage implements Request<URI> {
|
|||
|
||||
private List<HttpRequestFilter> requestFilters = Lists.newArrayList();
|
||||
|
||||
private final String method;
|
||||
private final URI endpoint;
|
||||
private String method;
|
||||
private URI endpoint;
|
||||
private Object entity;
|
||||
|
||||
/**
|
||||
|
@ -56,8 +56,8 @@ public class HttpRequest extends HttpMessage implements Request<URI> {
|
|||
* If the request is HEAD, this may change to GET due to redirects
|
||||
*/
|
||||
public HttpRequest(String method, URI endPoint) {
|
||||
this.method = checkNotNull(method, "method");
|
||||
this.endpoint = checkNotNull(endPoint, "endPoint");
|
||||
this.setMethod(checkNotNull(method, "method"));
|
||||
this.setEndpoint(checkNotNull(endPoint, "endPoint"));
|
||||
checkArgument(endPoint.getHost() != null, String.format("endPoint.getHost() is null for %s",
|
||||
endPoint));
|
||||
}
|
||||
|
@ -81,7 +81,7 @@ public class HttpRequest extends HttpMessage implements Request<URI> {
|
|||
* @param method
|
||||
* If the request is HEAD, this may change to GET due to redirects
|
||||
*/
|
||||
public HttpRequest(String method, URI endPoint, Multimap<String, String> headers,
|
||||
protected HttpRequest(String method, URI endPoint, Multimap<String, String> headers,
|
||||
@Nullable Object entity) {
|
||||
this(method, endPoint);
|
||||
setHeaders(checkNotNull(headers, "headers"));
|
||||
|
@ -89,7 +89,7 @@ public class HttpRequest extends HttpMessage implements Request<URI> {
|
|||
}
|
||||
|
||||
public String getRequestLine() {
|
||||
return String.format("%s %s HTTP/1.1", getMethod(), endpoint.toASCIIString());
|
||||
return String.format("%s %s HTTP/1.1", getMethod(), getEndpoint().toASCIIString());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -122,4 +122,12 @@ public class HttpRequest extends HttpMessage implements Request<URI> {
|
|||
return requestFilters;
|
||||
}
|
||||
|
||||
public void setMethod(String method) {
|
||||
this.method = method;
|
||||
}
|
||||
|
||||
public void setEndpoint(URI endpoint) {
|
||||
this.endpoint = endpoint;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -29,5 +29,5 @@ package org.jclouds.http;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
public interface HttpRequestFilter {
|
||||
HttpRequest filter(HttpRequest request) throws HttpException;
|
||||
void filter(HttpRequest request) throws HttpException;
|
||||
}
|
||||
|
|
|
@ -25,7 +25,6 @@ package org.jclouds.http;
|
|||
|
||||
import java.io.InputStream;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
|
@ -107,15 +106,11 @@ public class TransformingHttpCommandImpl<T> implements TransformingHttpCommand<T
|
|||
* <p />
|
||||
* This also removes the Host header in order to avoid ssl problems.
|
||||
*/
|
||||
public HttpRequest setHostAndPort(String host, int port) { // TODO must unit test to ensure
|
||||
// request is copied 100%
|
||||
public HttpRequest setHostAndPort(String host, int port) {
|
||||
UriBuilder builder = UriBuilder.fromUri(request.getEndpoint());
|
||||
builder.host(host);
|
||||
builder.port(port);
|
||||
List<HttpRequestFilter> oldFilters = request.getFilters();
|
||||
request = new HttpRequest(request.getMethod(), builder.build(), request.getHeaders(), request
|
||||
.getEntity());
|
||||
request.getFilters().addAll(oldFilters);
|
||||
request.setEndpoint(builder.build());
|
||||
request.getHeaders().replaceValues(HttpHeaders.HOST, Collections.singletonList(host));
|
||||
return request;
|
||||
}
|
||||
|
@ -126,7 +121,7 @@ public class TransformingHttpCommandImpl<T> implements TransformingHttpCommand<T
|
|||
* @param method
|
||||
*/
|
||||
public HttpRequest setMethod(String method) {
|
||||
request = new HttpRequest(method, request.getEndpoint(), request.getHeaders());
|
||||
request.setMethod(method);
|
||||
return request;
|
||||
}
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@ import java.io.UnsupportedEncodingException;
|
|||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import javax.inject.Singleton;
|
||||
import javax.ws.rs.core.HttpHeaders;
|
||||
|
||||
import org.jclouds.http.HttpException;
|
||||
|
@ -36,8 +37,6 @@ import org.jclouds.http.HttpRequest;
|
|||
import org.jclouds.http.HttpRequestFilter;
|
||||
import org.jclouds.http.HttpUtils;
|
||||
|
||||
import javax.inject.Singleton;
|
||||
|
||||
/**
|
||||
* Uses Basic Authentication to sign the request.
|
||||
*
|
||||
|
@ -56,8 +55,7 @@ public class BasicAuthentication implements HttpRequestFilter {
|
|||
checkNotNull(password, "password")).getBytes("UTF-8")));
|
||||
}
|
||||
|
||||
public HttpRequest filter(HttpRequest request) throws HttpException {
|
||||
public void filter(HttpRequest request) throws HttpException {
|
||||
request.getHeaders().replaceValues(HttpHeaders.AUTHORIZATION, credentialList);
|
||||
return request;
|
||||
}
|
||||
}
|
|
@ -26,11 +26,11 @@ package org.jclouds.http.functions;
|
|||
import javax.annotation.Resource;
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.http.HttpUtils;
|
||||
import org.jclouds.logging.Logger;
|
||||
import org.jclouds.rest.InvocationContext;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
||||
|
@ -42,16 +42,16 @@ public class ParseContentMD5FromHeaders implements Function<HttpResponse, byte[]
|
|||
public static class NoContentMD5Exception extends RuntimeException {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private final HttpRequest request;
|
||||
private final GeneratedHttpRequest<?> request;
|
||||
private final HttpResponse response;
|
||||
|
||||
public NoContentMD5Exception(HttpRequest request, HttpResponse response) {
|
||||
public NoContentMD5Exception(GeneratedHttpRequest<?> request, HttpResponse response) {
|
||||
super(String.format("no MD5 returned from request: %s; response %s", request, response));
|
||||
this.request = request;
|
||||
this.response = response;
|
||||
}
|
||||
|
||||
public HttpRequest getRequest() {
|
||||
public GeneratedHttpRequest<?> getRequest() {
|
||||
return request;
|
||||
}
|
||||
|
||||
|
@ -63,8 +63,7 @@ public class ParseContentMD5FromHeaders implements Function<HttpResponse, byte[]
|
|||
|
||||
@Resource
|
||||
protected Logger logger = Logger.NULL;
|
||||
private Object[] args;
|
||||
private HttpRequest request;
|
||||
private GeneratedHttpRequest<?> request;
|
||||
|
||||
public byte[] apply(HttpResponse from) {
|
||||
IOUtils.closeQuietly(from.getContent());
|
||||
|
@ -75,17 +74,8 @@ public class ParseContentMD5FromHeaders implements Function<HttpResponse, byte[]
|
|||
throw new NoContentMD5Exception(request, from);
|
||||
}
|
||||
|
||||
public Object[] getArgs() {
|
||||
return args;
|
||||
}
|
||||
|
||||
public HttpRequest getRequest() {
|
||||
return request;
|
||||
}
|
||||
|
||||
public void setContext(HttpRequest request, Object[] args) {
|
||||
public void setContext(GeneratedHttpRequest<?> request) {
|
||||
this.request = request;
|
||||
this.args = args;
|
||||
}
|
||||
|
||||
}
|
|
@ -83,7 +83,7 @@ public abstract class BaseHttpCommandExecutorService<Q> implements HttpCommandEx
|
|||
Q nativeRequest = null;
|
||||
try {
|
||||
for (HttpRequestFilter filter : request.getFilters()) {
|
||||
request = filter.filter(request);
|
||||
filter.filter(request);
|
||||
}
|
||||
logger.debug("Sending request: %s", request.getRequestLine());
|
||||
if (request.getEntity() != null && wire.enabled())
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.rest.decorators;
|
||||
package org.jclouds.rest;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
|
||||
|
@ -30,6 +30,6 @@ import org.jclouds.http.HttpRequest;
|
|||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public interface RequestDecorator {
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object input);
|
||||
public interface Binder {
|
||||
public void bindToRequest(HttpRequest request, Object input);
|
||||
}
|
|
@ -25,19 +25,14 @@ package org.jclouds.rest;
|
|||
|
||||
import javax.ws.rs.PathParam;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
|
||||
/**
|
||||
* Passes parsed Http request and Object [] from the method args used to derive the request into
|
||||
* this object;
|
||||
* Passes generated Http request into this object;
|
||||
*
|
||||
* @see PathParam
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public interface InvocationContext {
|
||||
void setContext(HttpRequest request, Object[] args);
|
||||
|
||||
Object[] getArgs();
|
||||
|
||||
HttpRequest getRequest();
|
||||
void setContext(GeneratedHttpRequest<?> request);
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.rest.decorators;
|
||||
package org.jclouds.rest;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
|
@ -33,13 +33,13 @@ import org.jclouds.http.HttpRequest;
|
|||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
public interface MapRequestDecorator extends RequestDecorator {
|
||||
public interface MapBinder extends Binder {
|
||||
|
||||
/**
|
||||
* creates and binds the POST entity to the request using parameters specified.
|
||||
*
|
||||
* @see MapEntityParam
|
||||
*/
|
||||
public HttpRequest decorateRequest(HttpRequest request, Map<String, String> postParams);
|
||||
public void bindToRequest(HttpRequest request, Map<String, String> postParams);
|
||||
|
||||
}
|
|
@ -29,7 +29,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
|||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
import org.jclouds.rest.decorators.RequestDecorator;
|
||||
import org.jclouds.rest.Binder;
|
||||
|
||||
/**
|
||||
* Designates that this parameter will modify the request, possibly including adding an entity to
|
||||
|
@ -39,10 +39,10 @@ import org.jclouds.rest.decorators.RequestDecorator;
|
|||
*/
|
||||
@Target(PARAMETER)
|
||||
@Retention(RUNTIME)
|
||||
public @interface DecoratorParam {
|
||||
public @interface BinderParam {
|
||||
|
||||
/**
|
||||
* how to persist this entity.
|
||||
*/
|
||||
Class<? extends RequestDecorator> value();
|
||||
Class<? extends Binder> value();
|
||||
}
|
|
@ -29,8 +29,6 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
|||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
import org.jclouds.rest.decorators.MapRequestDecorator;
|
||||
|
||||
/**
|
||||
* Designates that this parameter will hold the entity for a PUT or POST command.
|
||||
*
|
||||
|
@ -41,8 +39,8 @@ import org.jclouds.rest.decorators.MapRequestDecorator;
|
|||
public @interface MapBinder {
|
||||
|
||||
/**
|
||||
* How to bind {@link MapEntityParam} values, if there is no {@link MapRequestDecorator} in the method
|
||||
* How to bind {@link MapEntityParam} values, if there is no {@link MapBinder} in the method
|
||||
* definition
|
||||
*/
|
||||
Class<? extends MapRequestDecorator> value();
|
||||
Class<? extends org.jclouds.rest.MapBinder> value();
|
||||
}
|
||||
|
|
|
@ -39,7 +39,7 @@ import java.lang.annotation.Target;
|
|||
public @interface MapEntityParam {
|
||||
|
||||
/**
|
||||
* The key used in a map passed to the {@link MapRequestDecorator} associated with the request.
|
||||
* The key used in a map passed to the {@link MapBinder} associated with the request.
|
||||
*/
|
||||
String value();
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.rest.decorators;
|
||||
package org.jclouds.rest.binders;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkState;
|
||||
|
||||
|
@ -33,6 +33,7 @@ import javax.ws.rs.core.HttpHeaders;
|
|||
import javax.ws.rs.core.MediaType;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rest.MapBinder;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
|
||||
|
@ -42,16 +43,16 @@ import com.google.gson.Gson;
|
|||
* @author Adrian Cole
|
||||
* @since 4.0
|
||||
*/
|
||||
public class AddAsJsonEntity implements MapRequestDecorator {
|
||||
public class BindToJsonEntity implements MapBinder {
|
||||
|
||||
@Inject
|
||||
protected Gson gson;
|
||||
|
||||
public HttpRequest decorateRequest(HttpRequest request, Map<String, String> postParams) {
|
||||
return decorateRequest(request, (Object) postParams);
|
||||
public void bindToRequest(HttpRequest request, Map<String, String> postParams) {
|
||||
bindToRequest(request, (Object) postParams);
|
||||
}
|
||||
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object toBind) {
|
||||
public void bindToRequest(HttpRequest request, Object toBind) {
|
||||
checkState(gson != null, "Program error: gson should have been injected at this point");
|
||||
String json = gson.toJson(toBind);
|
||||
request.setEntity(json);
|
||||
|
@ -59,7 +60,6 @@ public class AddAsJsonEntity implements MapRequestDecorator {
|
|||
Collections.singletonList(json.getBytes().length + ""));
|
||||
request.getHeaders().replaceValues(HttpHeaders.CONTENT_TYPE,
|
||||
Collections.singletonList(MediaType.APPLICATION_JSON));
|
||||
return request;
|
||||
}
|
||||
|
||||
}
|
|
@ -21,12 +21,13 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.rest.decorators;
|
||||
package org.jclouds.rest.binders;
|
||||
|
||||
import javax.inject.Singleton;
|
||||
import javax.ws.rs.core.HttpHeaders;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rest.Binder;
|
||||
|
||||
/**
|
||||
* Adds an entity to a request.
|
||||
|
@ -34,13 +35,12 @@ import org.jclouds.http.HttpRequest;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class AddAsStringEntity implements RequestDecorator {
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object entity) {
|
||||
public class BindToStringEntity implements Binder {
|
||||
public void bindToRequest(HttpRequest request, Object entity) {
|
||||
String stringEntity = entity.toString();
|
||||
if (request.getFirstHeaderOrNull(HttpHeaders.CONTENT_TYPE) == null)
|
||||
request.getHeaders().put(HttpHeaders.CONTENT_TYPE, "application/unknown");
|
||||
request.getHeaders().put(HttpHeaders.CONTENT_LENGTH, stringEntity.getBytes().length + "");
|
||||
request.setEntity(stringEntity);
|
||||
return request;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,52 @@
|
|||
package org.jclouds.rest.internal;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.net.URI;
|
||||
|
||||
import javax.ws.rs.core.UriBuilder;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
|
||||
/**
|
||||
* Represents a request generated from annotations
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class GeneratedHttpRequest<T> extends HttpRequest {
|
||||
private final Class<T> declaring;
|
||||
private final Method javaMethod;
|
||||
private final Object[] args;
|
||||
private final RestAnnotationProcessor<T> processor;
|
||||
|
||||
GeneratedHttpRequest(String method, URI endPoint, RestAnnotationProcessor<T> processor,
|
||||
Class<T> declaring, Method javaMethod, Object... args) {
|
||||
super(method, endPoint);
|
||||
this.processor = processor;
|
||||
this.declaring = declaring;
|
||||
this.javaMethod = javaMethod;
|
||||
this.args = args;
|
||||
}
|
||||
|
||||
public Class<T> getDeclaring() {
|
||||
return declaring;
|
||||
}
|
||||
|
||||
public Method getJavaMethod() {
|
||||
return javaMethod;
|
||||
}
|
||||
|
||||
public Object[] getArgs() {
|
||||
return args;
|
||||
}
|
||||
|
||||
public RestAnnotationProcessor<T> getProcessor() {
|
||||
return processor;
|
||||
}
|
||||
|
||||
public void replaceQueryParam(String name, Object... values) {
|
||||
UriBuilder builder = UriBuilder.fromUri(getEndpoint());
|
||||
builder.replaceQueryParam(name, values);
|
||||
URI newEndpoint = processor.replaceQuery(getEndpoint(), builder.build().getQuery());
|
||||
setEndpoint(newEndpoint);
|
||||
}
|
||||
}
|
|
@ -70,8 +70,9 @@ import org.jclouds.http.functions.ReturnVoidIf2xx;
|
|||
import org.jclouds.http.functions.ParseSax.HandlerWithResult;
|
||||
import org.jclouds.http.options.HttpRequestOptions;
|
||||
import org.jclouds.logging.Logger;
|
||||
import org.jclouds.rest.Binder;
|
||||
import org.jclouds.rest.InvocationContext;
|
||||
import org.jclouds.rest.annotations.DecoratorParam;
|
||||
import org.jclouds.rest.annotations.BinderParam;
|
||||
import org.jclouds.rest.annotations.Endpoint;
|
||||
import org.jclouds.rest.annotations.ExceptionParser;
|
||||
import org.jclouds.rest.annotations.Headers;
|
||||
|
@ -86,8 +87,6 @@ import org.jclouds.rest.annotations.ResponseParser;
|
|||
import org.jclouds.rest.annotations.SkipEncoding;
|
||||
import org.jclouds.rest.annotations.VirtualHost;
|
||||
import org.jclouds.rest.annotations.XMLResponseParser;
|
||||
import org.jclouds.rest.decorators.MapRequestDecorator;
|
||||
import org.jclouds.rest.decorators.RequestDecorator;
|
||||
|
||||
import com.google.common.annotations.VisibleForTesting;
|
||||
import com.google.common.base.Function;
|
||||
|
@ -116,7 +115,7 @@ public class RestAnnotationProcessor<T> {
|
|||
|
||||
private final Class<T> declaring;
|
||||
|
||||
private final Map<Method, Map<Integer, Set<Annotation>>> methodToIndexOfParamToDecoratorParamAnnotation = createMethodToIndexOfParamToAnnotation(DecoratorParam.class);
|
||||
private final Map<Method, Map<Integer, Set<Annotation>>> methodToIndexOfParamToDecoratorParamAnnotation = createMethodToIndexOfParamToAnnotation(BinderParam.class);
|
||||
private final Map<Method, Map<Integer, Set<Annotation>>> methodToIndexOfParamToHeaderParamAnnotations = createMethodToIndexOfParamToAnnotation(HeaderParam.class);
|
||||
private final Map<Method, Map<Integer, Set<Annotation>>> methodToIndexOfParamToHostPrefixParamAnnotations = createMethodToIndexOfParamToAnnotation(HostPrefixParam.class);
|
||||
private final Map<Method, Map<Integer, Set<Annotation>>> methodToindexOfParamToEndpointAnnotations = createMethodToIndexOfParamToAnnotation(Endpoint.class);
|
||||
|
@ -184,8 +183,8 @@ public class RestAnnotationProcessor<T> {
|
|||
private final ParseSax.Factory parserFactory;
|
||||
|
||||
@VisibleForTesting
|
||||
public Function<HttpResponse, ?> createResponseParser(Method method, HttpRequest request,
|
||||
Object[] args) {
|
||||
public Function<HttpResponse, ?> createResponseParser(Method method,
|
||||
GeneratedHttpRequest<T> request, Object... args) {
|
||||
Function<HttpResponse, ?> transformer;
|
||||
Class<? extends HandlerWithResult<?>> handler = getXMLTransformerOrNull(method);
|
||||
if (handler != null) {
|
||||
|
@ -194,7 +193,7 @@ public class RestAnnotationProcessor<T> {
|
|||
transformer = injector.getInstance(getParserOrThrowException(method));
|
||||
}
|
||||
if (transformer instanceof InvocationContext) {
|
||||
((InvocationContext) transformer).setContext(request, args);
|
||||
((InvocationContext) transformer).setContext(request);
|
||||
}
|
||||
return transformer;
|
||||
}
|
||||
|
@ -216,6 +215,11 @@ public class RestAnnotationProcessor<T> {
|
|||
this.injector = injector;
|
||||
this.parserFactory = parserFactory;
|
||||
seedCache(declaring);
|
||||
if (declaring.isAnnotationPresent(SkipEncoding.class)) {
|
||||
skipEncode = declaring.getAnnotation(SkipEncoding.class).value();
|
||||
} else {
|
||||
skipEncode = new char[] {};
|
||||
}
|
||||
}
|
||||
|
||||
public Method getDelegateOrNull(Method in) {
|
||||
|
@ -292,8 +296,9 @@ public class RestAnnotationProcessor<T> {
|
|||
}
|
||||
|
||||
final Injector injector;
|
||||
final char[] skipEncode;
|
||||
|
||||
public HttpRequest createRequest(Method method, Object[] args) {
|
||||
public GeneratedHttpRequest<T> createRequest(Method method, Object... args) {
|
||||
URI endpoint = getEndpointFor(method, args);
|
||||
|
||||
String httpMethod = getHttpMethodOrConstantOrThrowException(method);
|
||||
|
@ -302,18 +307,13 @@ public class RestAnnotationProcessor<T> {
|
|||
builder.path(declaring);
|
||||
builder.path(method);
|
||||
|
||||
Multimap<String, String> tokenValues;
|
||||
if (declaring.isAnnotationPresent(SkipEncoding.class)) {
|
||||
tokenValues = encodeValues(getPathParamKeyValues(method, args), declaring.getAnnotation(
|
||||
SkipEncoding.class).value());
|
||||
} else {
|
||||
tokenValues = encodeValues(getPathParamKeyValues(method, args));
|
||||
}
|
||||
Multimap<String, String> tokenValues = encodeValues(getPathParamKeyValues(method, args),
|
||||
skipEncode);
|
||||
|
||||
addQueryParams(method, args, builder, tokenValues.entries());
|
||||
addMatrixParams(method, args, builder, tokenValues.entries());
|
||||
addQueryParams(builder, tokenValues.entries(), method, args);
|
||||
addMatrixParams(builder, tokenValues.entries(), method, args);
|
||||
|
||||
Multimap<String, String> headers = buildHeaders(method, args, tokenValues.entries());
|
||||
Multimap<String, String> headers = buildHeaders(tokenValues.entries(), method, args);
|
||||
|
||||
String stringEntity = null;
|
||||
HttpRequestOptions options = findOptionsIn(method, args);
|
||||
|
@ -349,7 +349,11 @@ public class RestAnnotationProcessor<T> {
|
|||
throw new IllegalStateException(e);
|
||||
}
|
||||
|
||||
HttpRequest request = new HttpRequest(httpMethod, endPoint, headers);
|
||||
endPoint = replaceQuery(endPoint, endPoint.getQuery());
|
||||
|
||||
GeneratedHttpRequest<T> request = new GeneratedHttpRequest<T>(httpMethod, endPoint, this,
|
||||
declaring, method, args);
|
||||
request.setHeaders(headers);
|
||||
addHostHeaderIfAnnotatedWithVirtualHost(headers, request.getEndpoint().getHost(), method);
|
||||
addFiltersIfAnnotated(method, request);
|
||||
if (stringEntity != null) {
|
||||
|
@ -357,11 +361,26 @@ public class RestAnnotationProcessor<T> {
|
|||
if (headers.get(HttpHeaders.CONTENT_TYPE) != null)
|
||||
headers.put(HttpHeaders.CONTENT_TYPE, "application/unknown");
|
||||
}
|
||||
return decorateRequest(method, args, request);
|
||||
decorateRequest(request);
|
||||
return request;
|
||||
}
|
||||
|
||||
private void addMatrixParams(Method method, Object[] args, UriBuilder builder,
|
||||
Collection<Entry<String, String>> tokenValues) {
|
||||
@VisibleForTesting
|
||||
URI replaceQuery(URI endPoint, String query) {
|
||||
return replaceQuery(endPoint, query, skipEncode);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
static URI replaceQuery(URI endPoint, String query, char... skipEncode) {
|
||||
UriBuilder qbuilder = UriBuilder.fromUri(endPoint);
|
||||
String unencodedQuery = query == null ? null : unEncode(query, skipEncode);
|
||||
qbuilder.replaceQuery(unencodedQuery);
|
||||
endPoint = qbuilder.build();
|
||||
return endPoint;
|
||||
}
|
||||
|
||||
private void addMatrixParams(UriBuilder builder, Collection<Entry<String, String>> tokenValues,
|
||||
Method method, Object... args) {
|
||||
if (declaring.isAnnotationPresent(MatrixParams.class)) {
|
||||
MatrixParams query = declaring.getAnnotation(MatrixParams.class);
|
||||
addMatrix(builder, query, tokenValues);
|
||||
|
@ -377,8 +396,8 @@ public class RestAnnotationProcessor<T> {
|
|||
}
|
||||
}
|
||||
|
||||
private void addQueryParams(Method method, Object[] args, UriBuilder builder,
|
||||
Collection<Entry<String, String>> tokenValues) {
|
||||
private void addQueryParams(UriBuilder builder, Collection<Entry<String, String>> tokenValues,
|
||||
Method method, Object... args) {
|
||||
if (declaring.isAnnotationPresent(QueryParams.class)) {
|
||||
QueryParams query = declaring.getAnnotation(QueryParams.class);
|
||||
addQuery(builder, query, tokenValues);
|
||||
|
@ -438,10 +457,10 @@ public class RestAnnotationProcessor<T> {
|
|||
}
|
||||
|
||||
@VisibleForTesting
|
||||
URI getEndpointInParametersOrNull(Method method, Object[] args) {
|
||||
URI getEndpointInParametersOrNull(Method method, Object... args) {
|
||||
Map<Integer, Set<Annotation>> map = indexWithOnlyOneAnnotation(method, "@Endpoint",
|
||||
methodToindexOfParamToEndpointAnnotations);
|
||||
if (map.size() == 1) {
|
||||
if (map.size() == 1 && args.length > 0) {
|
||||
Endpoint annotation = (Endpoint) map.values().iterator().next().iterator().next();
|
||||
int index = map.keySet().iterator().next();
|
||||
checkState(
|
||||
|
@ -459,7 +478,7 @@ public class RestAnnotationProcessor<T> {
|
|||
return null;
|
||||
}
|
||||
|
||||
private UriBuilder addHostPrefixIfPresent(URI endpoint, Method method, Object[] args) {
|
||||
private UriBuilder addHostPrefixIfPresent(URI endpoint, Method method, Object... args) {
|
||||
Map<Integer, Set<Annotation>> map = indexWithOnlyOneAnnotation(method, "@HostPrefixParam",
|
||||
methodToIndexOfParamToHostPrefixParamAnnotations);
|
||||
UriBuilder builder = UriBuilder.fromUri(endpoint);
|
||||
|
@ -528,27 +547,27 @@ public class RestAnnotationProcessor<T> {
|
|||
return null;
|
||||
}
|
||||
|
||||
public MapRequestDecorator getMapEntityBinderOrNull(Method method, Object[] args) {
|
||||
public org.jclouds.rest.MapBinder getMapEntityBinderOrNull(Method method, Object... args) {
|
||||
if (args != null) {
|
||||
for (Object arg : args) {
|
||||
if (arg instanceof Object[]) {
|
||||
Object[] postBinders = (Object[]) arg;
|
||||
if (postBinders.length == 0) {
|
||||
} else if (postBinders.length == 1) {
|
||||
if (postBinders[0] instanceof MapRequestDecorator) {
|
||||
MapRequestDecorator binder = (MapRequestDecorator) postBinders[0];
|
||||
if (postBinders[0] instanceof org.jclouds.rest.MapBinder) {
|
||||
org.jclouds.rest.MapBinder binder = (org.jclouds.rest.MapBinder) postBinders[0];
|
||||
injector.injectMembers(binder);
|
||||
return binder;
|
||||
}
|
||||
} else {
|
||||
if (postBinders[0] instanceof MapRequestDecorator) {
|
||||
if (postBinders[0] instanceof org.jclouds.rest.MapBinder) {
|
||||
throw new IllegalArgumentException(
|
||||
"we currently do not support multiple varargs postBinders in: "
|
||||
+ method.getName());
|
||||
}
|
||||
}
|
||||
} else if (arg instanceof MapRequestDecorator) {
|
||||
MapRequestDecorator binder = (MapRequestDecorator) arg;
|
||||
} else if (arg instanceof org.jclouds.rest.MapBinder) {
|
||||
org.jclouds.rest.MapBinder binder = (org.jclouds.rest.MapBinder) arg;
|
||||
injector.injectMembers(binder);
|
||||
return binder;
|
||||
}
|
||||
|
@ -595,33 +614,34 @@ public class RestAnnotationProcessor<T> {
|
|||
}
|
||||
}
|
||||
|
||||
public HttpRequest decorateRequest(Method method, Object[] args, HttpRequest request) {
|
||||
MapRequestDecorator mapBinder = getMapEntityBinderOrNull(method, args);
|
||||
Map<String, String> mapParams = buildPostParams(method, args);
|
||||
public void decorateRequest(GeneratedHttpRequest<T> request) {
|
||||
org.jclouds.rest.MapBinder mapBinder = getMapEntityBinderOrNull(request.getJavaMethod(),
|
||||
request.getArgs());
|
||||
Map<String, String> mapParams = buildPostParams(request.getJavaMethod(), request.getArgs());
|
||||
// MapEntityBinder is only useful if there are parameters. We guard here in case the
|
||||
// MapEntityBinder is also an EntityBinder. If so, it can be used with or without
|
||||
// parameters.
|
||||
if (mapBinder != null) {
|
||||
mapBinder.decorateRequest(request, mapParams);
|
||||
return request;
|
||||
mapBinder.bindToRequest(request, mapParams);
|
||||
return;
|
||||
}
|
||||
|
||||
for (Entry<Integer, Set<Annotation>> entry : Maps.filterValues(
|
||||
methodToIndexOfParamToDecoratorParamAnnotation.get(method),
|
||||
methodToIndexOfParamToDecoratorParamAnnotation.get(request.getJavaMethod()),
|
||||
new Predicate<Set<Annotation>>() {
|
||||
public boolean apply(Set<Annotation> input) {
|
||||
return input.size() >= 1;
|
||||
}
|
||||
}).entrySet()) {
|
||||
DecoratorParam entityAnnotation = (DecoratorParam) entry.getValue().iterator().next();
|
||||
RequestDecorator binder = injector.getInstance(entityAnnotation.value());
|
||||
Object input = args[entry.getKey()];
|
||||
BinderParam entityAnnotation = (BinderParam) entry.getValue().iterator().next();
|
||||
Binder binder = injector.getInstance(entityAnnotation.value());
|
||||
Object input = request.getArgs()[entry.getKey()];
|
||||
if (input.getClass().isArray()) {
|
||||
Object[] entityArray = (Object[]) input;
|
||||
input = entityArray.length > 0 ? entityArray[0] : null;
|
||||
}
|
||||
Object oldEntity = request.getEntity();
|
||||
request = binder.decorateRequest(request, input);
|
||||
binder.bindToRequest(request, input);
|
||||
if (oldEntity != null && !oldEntity.equals(request.getEntity())) {
|
||||
throw new IllegalStateException(String.format(
|
||||
"binder %s replaced the previous entity on request: %s", binder, request));
|
||||
|
@ -631,7 +651,6 @@ public class RestAnnotationProcessor<T> {
|
|||
request.getHeaders().replaceValues(HttpHeaders.CONTENT_LENGTH,
|
||||
Collections.singletonList(0 + ""));
|
||||
}
|
||||
return request;
|
||||
}
|
||||
|
||||
protected Map<Integer, Set<Annotation>> indexWithOnlyOneAnnotation(Method method,
|
||||
|
@ -651,7 +670,7 @@ public class RestAnnotationProcessor<T> {
|
|||
return indexToEntityAnnotation;
|
||||
}
|
||||
|
||||
private HttpRequestOptions findOptionsIn(Method method, Object[] args) {
|
||||
private HttpRequestOptions findOptionsIn(Method method, Object... args) {
|
||||
for (int index : methodToIndexesOfOptions.get(method)) {
|
||||
if (args.length >= index + 1) {// accomodate varargs
|
||||
if (args[index] instanceof Object[]) {
|
||||
|
@ -678,8 +697,8 @@ public class RestAnnotationProcessor<T> {
|
|||
return null;
|
||||
}
|
||||
|
||||
public Multimap<String, String> buildHeaders(Method method, final Object[] args,
|
||||
Collection<Entry<String, String>> tokenValues) {
|
||||
public Multimap<String, String> buildHeaders(Collection<Entry<String, String>> tokenValues,
|
||||
Method method, final Object... args) {
|
||||
Multimap<String, String> headers = HashMultimap.create();
|
||||
addHeaderIfAnnotationPresentOnMethod(headers, method, tokenValues);
|
||||
Map<Integer, Set<Annotation>> indexToHeaderParam = methodToIndexOfParamToHeaderParamAnnotations
|
||||
|
@ -755,7 +774,7 @@ public class RestAnnotationProcessor<T> {
|
|||
return out;
|
||||
}
|
||||
|
||||
private Multimap<String, String> getPathParamKeyValues(Method method, Object[] args) {
|
||||
private Multimap<String, String> getPathParamKeyValues(Method method, Object... args) {
|
||||
Multimap<String, String> pathParamValues = HashMultimap.create();
|
||||
pathParamValues.putAll(constants);
|
||||
Map<Integer, Set<Annotation>> indexToPathParam = methodToindexOfParamToPathParamAnnotations
|
||||
|
@ -798,10 +817,8 @@ public class RestAnnotationProcessor<T> {
|
|||
// Web browsers do not always handle '+' characters well, use the well-supported
|
||||
// '%20' instead.
|
||||
value = value.replaceAll("\\+", "%20");
|
||||
for (char c : skipEncode) {
|
||||
String toSkip = Character.toString(c);
|
||||
String encodedValueToSkip = URLEncoder.encode(toSkip, "UTF-8");
|
||||
value = value.replaceAll(encodedValueToSkip, toSkip);
|
||||
if (skipEncode.length > 0) {
|
||||
value = unEncode(value, skipEncode);
|
||||
}
|
||||
encoded.put(entry.getKey(), value);
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
|
@ -811,7 +828,21 @@ public class RestAnnotationProcessor<T> {
|
|||
return encoded;
|
||||
}
|
||||
|
||||
private Multimap<String, String> getMatrixParamKeyValues(Method method, Object[] args) {
|
||||
@VisibleForTesting
|
||||
static String unEncode(String value, final char... skipEncode) {
|
||||
for (char c : skipEncode) {
|
||||
String toSkip = Character.toString(c);
|
||||
try {
|
||||
String encodedValueToSkip = URLEncoder.encode(toSkip, "UTF-8");
|
||||
value = value.replaceAll(encodedValueToSkip, toSkip);
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new RuntimeException("jclouds only supports UTF-8", e);
|
||||
}
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
private Multimap<String, String> getMatrixParamKeyValues(Method method, Object... args) {
|
||||
Multimap<String, String> queryParamValues = HashMultimap.create();
|
||||
queryParamValues.putAll(constants);
|
||||
Map<Integer, Set<Annotation>> indexToMatrixParam = methodToindexOfParamToMatrixParamAnnotations
|
||||
|
@ -826,7 +857,7 @@ public class RestAnnotationProcessor<T> {
|
|||
return queryParamValues;
|
||||
}
|
||||
|
||||
private Multimap<String, String> getQueryParamKeyValues(Method method, Object[] args) {
|
||||
private Multimap<String, String> getQueryParamKeyValues(Method method, Object... args) {
|
||||
Multimap<String, String> queryParamValues = HashMultimap.create();
|
||||
queryParamValues.putAll(constants);
|
||||
Map<Integer, Set<Annotation>> indexToQueryParam = methodToindexOfParamToQueryParamAnnotations
|
||||
|
@ -841,7 +872,7 @@ public class RestAnnotationProcessor<T> {
|
|||
return queryParamValues;
|
||||
}
|
||||
|
||||
private Map<String, String> buildPostParams(Method method, Object[] args) {
|
||||
private Map<String, String> buildPostParams(Method method, Object... args) {
|
||||
Map<String, String> postParams = Maps.newHashMap();
|
||||
Map<Integer, Set<Annotation>> indexToPathParam = methodToindexOfParamToPostParamAnnotations
|
||||
.get(method);
|
||||
|
@ -865,7 +896,7 @@ public class RestAnnotationProcessor<T> {
|
|||
return postParams;
|
||||
}
|
||||
|
||||
public URI getEndpointFor(Method method, Object[] args) {
|
||||
public URI getEndpointFor(Method method, Object... args) {
|
||||
URI endpoint = getEndpointInParametersOrNull(method, args);
|
||||
if (endpoint == null) {
|
||||
Endpoint annotation;
|
||||
|
|
|
@ -42,7 +42,6 @@ import javax.inject.Singleton;
|
|||
|
||||
import org.jclouds.concurrent.FutureExceptionParser;
|
||||
import org.jclouds.http.HttpConstants;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.http.TransformingHttpCommand;
|
||||
import org.jclouds.logging.Logger;
|
||||
|
@ -89,13 +88,13 @@ public class RestClientProxy<T> implements InvocationHandler {
|
|||
.createExceptionParserOrNullIfNotFound(method);
|
||||
// in case there is an exception creating the request, we should at least pass in args
|
||||
if (exceptionParser instanceof InvocationContext) {
|
||||
((InvocationContext) exceptionParser).setContext(null, args);
|
||||
((InvocationContext) exceptionParser).setContext(null);
|
||||
}
|
||||
HttpRequest request;
|
||||
GeneratedHttpRequest<T> request;
|
||||
try {
|
||||
request = util.createRequest(method, args);
|
||||
if (exceptionParser instanceof InvocationContext) {
|
||||
((InvocationContext) exceptionParser).setContext(request, args);
|
||||
((InvocationContext) exceptionParser).setContext(request);
|
||||
}
|
||||
} catch (RuntimeException e) {
|
||||
if (exceptionParser != null) {
|
||||
|
|
|
@ -41,7 +41,7 @@ import org.jclouds.cloud.ConfiguresCloudConnection;
|
|||
import org.jclouds.cloud.internal.CloudContextImpl;
|
||||
import org.jclouds.lifecycle.Closer;
|
||||
import org.jclouds.rest.RestClientFactory;
|
||||
import org.jclouds.rest.RestAnnotationProcessorTest.Localhost;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessorTest.Localhost;
|
||||
import org.jclouds.util.Jsr330;
|
||||
import org.jclouds.util.Utils;
|
||||
import org.mortbay.jetty.Handler;
|
||||
|
|
|
@ -35,16 +35,16 @@ import javax.ws.rs.PathParam;
|
|||
|
||||
import org.jclouds.http.functions.ParseSax;
|
||||
import org.jclouds.http.options.HttpRequestOptions;
|
||||
import org.jclouds.rest.RestAnnotationProcessorTest.Localhost;
|
||||
import org.jclouds.rest.annotations.DecoratorParam;
|
||||
import org.jclouds.rest.annotations.BinderParam;
|
||||
import org.jclouds.rest.annotations.Endpoint;
|
||||
import org.jclouds.rest.annotations.ExceptionParser;
|
||||
import org.jclouds.rest.annotations.MapBinder;
|
||||
import org.jclouds.rest.annotations.MapEntityParam;
|
||||
import org.jclouds.rest.annotations.RequestFilters;
|
||||
import org.jclouds.rest.annotations.XMLResponseParser;
|
||||
import org.jclouds.rest.decorators.AddAsJsonEntity;
|
||||
import org.jclouds.rest.decorators.AddAsStringEntity;
|
||||
import org.jclouds.rest.binders.BindToJsonEntity;
|
||||
import org.jclouds.rest.binders.BindToStringEntity;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessorTest.Localhost;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
||||
|
@ -88,15 +88,17 @@ public interface IntegrationTestClient {
|
|||
|
||||
@PUT
|
||||
@Path("objects/{id}")
|
||||
Future<String> upload(@PathParam("id") String id, @DecoratorParam(AddAsStringEntity.class) String toPut);
|
||||
Future<String> upload(@PathParam("id") String id,
|
||||
@BinderParam(BindToStringEntity.class) String toPut);
|
||||
|
||||
@POST
|
||||
@Path("objects/{id}")
|
||||
Future<String> post(@PathParam("id") String id, @DecoratorParam(AddAsStringEntity.class) String toPut);
|
||||
Future<String> post(@PathParam("id") String id,
|
||||
@BinderParam(BindToStringEntity.class) String toPut);
|
||||
|
||||
@POST
|
||||
@Path("objects/{id}")
|
||||
@MapBinder(AddAsJsonEntity.class)
|
||||
@MapBinder(BindToJsonEntity.class)
|
||||
Future<String> postJson(@PathParam("id") String id, @MapEntityParam("key") String toPut);
|
||||
|
||||
@GET
|
||||
|
@ -105,11 +107,10 @@ public interface IntegrationTestClient {
|
|||
Future<String> downloadFilter(@PathParam("id") String id, @HeaderParam("filterme") String header);
|
||||
|
||||
static class Filter implements HttpRequestFilter {
|
||||
public HttpRequest filter(HttpRequest request) throws HttpException {
|
||||
public void filter(HttpRequest request) throws HttpException {
|
||||
if (request.getHeaders().containsKey("filterme")) {
|
||||
request.getHeaders().put("test", "test");
|
||||
}
|
||||
return request;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -49,7 +49,6 @@ import com.google.common.base.Function;
|
|||
|
||||
@Test(groups = "unit", testName = "core.BackoffLimitedRetryHandler")
|
||||
public class BackoffLimitedRetryHandlerTest {
|
||||
private static final URI END_POINT = URI.create("http://localhost:8080");
|
||||
|
||||
BackoffLimitedRetryHandler handler = new BackoffLimitedRetryHandler();
|
||||
|
||||
|
@ -146,7 +145,7 @@ public class BackoffLimitedRetryHandlerTest {
|
|||
assertEquals(response.getContent().read(), -1);
|
||||
}
|
||||
|
||||
private final HttpRequest request = new HttpRequest("HEAD", END_POINT);
|
||||
private final HttpRequest request = new HttpRequest("GET", URI.create("http://localhost"));
|
||||
|
||||
private HttpCommand createCommand() {
|
||||
HttpCommand command = new TransformingHttpCommandImpl<String>(executorService, request,
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.rest;
|
||||
package org.jclouds.rest.internal;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
@ -72,7 +72,8 @@ import org.jclouds.http.options.GetOptions;
|
|||
import org.jclouds.http.options.HttpRequestOptions;
|
||||
import org.jclouds.logging.Logger;
|
||||
import org.jclouds.logging.Logger.LoggerFactory;
|
||||
import org.jclouds.rest.annotations.DecoratorParam;
|
||||
import org.jclouds.rest.InvocationContext;
|
||||
import org.jclouds.rest.annotations.BinderParam;
|
||||
import org.jclouds.rest.annotations.Endpoint;
|
||||
import org.jclouds.rest.annotations.Headers;
|
||||
import org.jclouds.rest.annotations.HostPrefixParam;
|
||||
|
@ -85,11 +86,9 @@ import org.jclouds.rest.annotations.RequestFilters;
|
|||
import org.jclouds.rest.annotations.ResponseParser;
|
||||
import org.jclouds.rest.annotations.SkipEncoding;
|
||||
import org.jclouds.rest.annotations.VirtualHost;
|
||||
import org.jclouds.rest.binders.BindToJsonEntity;
|
||||
import org.jclouds.rest.binders.BindToStringEntity;
|
||||
import org.jclouds.rest.config.RestModule;
|
||||
import org.jclouds.rest.decorators.AddAsJsonEntity;
|
||||
import org.jclouds.rest.decorators.AddAsStringEntity;
|
||||
import org.jclouds.rest.decorators.MapRequestDecorator;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||
import org.jclouds.util.DateService;
|
||||
import org.jclouds.util.Jsr330;
|
||||
import org.joda.time.DateTime;
|
||||
|
@ -153,6 +152,16 @@ public class RestAnnotationProcessorTest {
|
|||
}
|
||||
}
|
||||
|
||||
public void testUnEncodeQuery() {
|
||||
URI expects = URI
|
||||
.create("http://services.nirvanix.com/ws/Metadata/SetMetadata.ashx?output=json&path=adriancole-blobstore.testObjectOperations&metadata=chef:sushi&metadata=foo:bar&sessionToken=775ef26e-0740-4707-ad92-afe9814bc436");
|
||||
|
||||
URI start = URI
|
||||
.create("http://services.nirvanix.com/ws/Metadata/SetMetadata.ashx?output=json&path=adriancole-blobstore.testObjectOperations&metadata=chef%3Asushi&metadata=foo%3Abar&sessionToken=775ef26e-0740-4707-ad92-afe9814bc436");
|
||||
URI value = RestAnnotationProcessor.replaceQuery(start, start.getQuery(), '/', ':');
|
||||
assertEquals(value, expects);
|
||||
}
|
||||
|
||||
public void testQuery() throws SecurityException, NoSuchMethodException {
|
||||
Method method = TestQuery.class.getMethod("foo");
|
||||
HttpRequest httpMethod = factory(TestQuery.class).createRequest(method, new Object[] {});
|
||||
|
@ -312,22 +321,22 @@ public class RestAnnotationProcessorTest {
|
|||
@Endpoint(Localhost.class)
|
||||
public class TestPost {
|
||||
@POST
|
||||
public void post(@DecoratorParam(AddAsStringEntity.class) String content) {
|
||||
public void post(@BinderParam(BindToStringEntity.class) String content) {
|
||||
}
|
||||
|
||||
@POST
|
||||
public void postAsJson(@DecoratorParam(AddAsJsonEntity.class) String content) {
|
||||
public void postAsJson(@BinderParam(BindToJsonEntity.class) String content) {
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("{foo}")
|
||||
public void postWithPath(@PathParam("foo") @MapEntityParam("fooble") String path,
|
||||
MapRequestDecorator content) {
|
||||
MapBinder content) {
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("{foo}")
|
||||
@MapBinder(AddAsJsonEntity.class)
|
||||
@MapBinder(BindToJsonEntity.class)
|
||||
public void postWithMethodBinder(@PathParam("foo") @MapEntityParam("fooble") String path) {
|
||||
}
|
||||
}
|
||||
|
@ -363,17 +372,14 @@ public class RestAnnotationProcessorTest {
|
|||
}
|
||||
|
||||
public void testCreatePostWithPathRequest() throws SecurityException, NoSuchMethodException {
|
||||
Method method = TestPost.class.getMethod("postWithPath", String.class,
|
||||
MapRequestDecorator.class);
|
||||
Method method = TestPost.class.getMethod("postWithPath", String.class, MapBinder.class);
|
||||
HttpRequest httpMethod = factory(TestPost.class).createRequest(method,
|
||||
new Object[] { "data", new MapRequestDecorator() {
|
||||
public HttpRequest decorateRequest(HttpRequest request,
|
||||
Map<String, String> postParams) {
|
||||
new Object[] { "data", new org.jclouds.rest.MapBinder() {
|
||||
public void bindToRequest(HttpRequest request, Map<String, String> postParams) {
|
||||
request.setEntity(postParams.get("fooble"));
|
||||
return request;
|
||||
}
|
||||
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object toBind) {
|
||||
public void bindToRequest(HttpRequest request, Object toBind) {
|
||||
throw new RuntimeException("this shouldn't be used in POST");
|
||||
}
|
||||
} });
|
||||
|
@ -404,7 +410,7 @@ public class RestAnnotationProcessorTest {
|
|||
public class TestPut {
|
||||
@PUT
|
||||
@Path("{foo}")
|
||||
@MapBinder(AddAsJsonEntity.class)
|
||||
@MapBinder(BindToJsonEntity.class)
|
||||
public void putWithMethodBinder(@PathParam("foo") @MapEntityParam("fooble") String path) {
|
||||
}
|
||||
|
||||
|
@ -412,12 +418,12 @@ public class RestAnnotationProcessorTest {
|
|||
@Path("{foo}")
|
||||
@Produces(MediaType.TEXT_PLAIN)
|
||||
public void putWithMethodBinderProduces(
|
||||
@PathParam("foo") @DecoratorParam(AddAsStringEntity.class) String path) {
|
||||
@PathParam("foo") @BinderParam(BindToStringEntity.class) String path) {
|
||||
}
|
||||
|
||||
@PUT
|
||||
@Path("{foo}")
|
||||
@MapBinder(AddAsJsonEntity.class)
|
||||
@MapBinder(BindToJsonEntity.class)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public void putWithMethodBinderConsumes(
|
||||
@PathParam("foo") @MapEntityParam("fooble") String path) {
|
||||
|
@ -474,14 +480,12 @@ public class RestAnnotationProcessorTest {
|
|||
}
|
||||
|
||||
static class TestRequestFilter1 implements HttpRequestFilter {
|
||||
public HttpRequest filter(HttpRequest request) throws HttpException {
|
||||
return null;
|
||||
public void filter(HttpRequest request) throws HttpException {
|
||||
}
|
||||
}
|
||||
|
||||
static class TestRequestFilter2 implements HttpRequestFilter {
|
||||
public HttpRequest filter(HttpRequest request) throws HttpException {
|
||||
return null;
|
||||
public void filter(HttpRequest request) throws HttpException {
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -965,20 +969,10 @@ public class RestAnnotationProcessorTest {
|
|||
|
||||
public static class ReturnStringIf200Context extends ReturnStringIf200 implements
|
||||
InvocationContext {
|
||||
private Object[] args;
|
||||
private HttpRequest request;
|
||||
public HttpRequest request;
|
||||
|
||||
public Object[] getArgs() {
|
||||
return args;
|
||||
}
|
||||
|
||||
public HttpRequest getRequest() {
|
||||
return request;
|
||||
}
|
||||
|
||||
public void setContext(HttpRequest request, Object[] args) {
|
||||
public void setContext(GeneratedHttpRequest<?> request) {
|
||||
this.request = request;
|
||||
this.args = args;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -991,14 +985,13 @@ public class RestAnnotationProcessorTest {
|
|||
}
|
||||
|
||||
public void oneTransformerWithContext() throws SecurityException, NoSuchMethodException {
|
||||
RestAnnotationProcessor<TestTransformers> processor = factory(TestTransformers.class);
|
||||
Method method = TestTransformers.class.getMethod("oneTransformerWithContext");
|
||||
HttpRequest request = new HttpRequest("GET", URI.create("http://localhost"));
|
||||
Object[] args = new Object[] {};
|
||||
Function<HttpResponse, ?> transformer = factory(TestTransformers.class).createResponseParser(
|
||||
method, request, args);
|
||||
GeneratedHttpRequest<TestTransformers> request = new GeneratedHttpRequest<TestTransformers>(
|
||||
"GET", URI.create("http://localhost"), processor, TestTransformers.class, method);
|
||||
Function<HttpResponse, ?> transformer = processor.createResponseParser(method, request);
|
||||
assertEquals(transformer.getClass(), ReturnStringIf200Context.class);
|
||||
assertEquals(((ReturnStringIf200Context) transformer).getArgs(), args);
|
||||
assertEquals(((ReturnStringIf200Context) transformer).getRequest(), request);
|
||||
assertEquals(((ReturnStringIf200Context) transformer).request, request);
|
||||
}
|
||||
|
||||
@SuppressWarnings("static-access")
|
||||
|
@ -1050,7 +1043,7 @@ public class RestAnnotationProcessorTest {
|
|||
@PUT
|
||||
@Path("/{id}")
|
||||
public Future<String> put(@PathParam("id") @ParamParser(FirstCharacter.class) String id,
|
||||
@DecoratorParam(AddAsStringEntity.class) String payload) {
|
||||
@BinderParam(BindToStringEntity.class) String payload) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -1066,7 +1059,7 @@ public class RestAnnotationProcessorTest {
|
|||
@Headers(keys = "foo", values = "--{id}--")
|
||||
@ResponseParser(ReturnTrueIf2xx.class)
|
||||
public Future<String> putHeader(@PathParam("id") String id,
|
||||
@DecoratorParam(AddAsStringEntity.class) String payload) {
|
||||
@BinderParam(BindToStringEntity.class) String payload) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -1347,8 +1340,8 @@ public class RestAnnotationProcessorTest {
|
|||
@Test
|
||||
public void testOneHeader() throws SecurityException, NoSuchMethodException {
|
||||
Method method = TestHeaders.class.getMethod("oneHeader", String.class);
|
||||
Multimap<String, String> headers = factory(TestHeaders.class).buildHeaders(method,
|
||||
new Object[] { "robot" }, ImmutableMultimap.<String, String> of().entries());
|
||||
Multimap<String, String> headers = factory(TestHeaders.class).buildHeaders(
|
||||
ImmutableMultimap.<String, String> of().entries(), method, "robot");
|
||||
assertEquals(headers.size(), 1);
|
||||
assertEquals(headers.get("header"), Collections.singletonList("robot"));
|
||||
}
|
||||
|
@ -1356,8 +1349,8 @@ public class RestAnnotationProcessorTest {
|
|||
@Test
|
||||
public void testOneIntHeader() throws SecurityException, NoSuchMethodException {
|
||||
Method method = TestHeaders.class.getMethod("oneIntHeader", int.class);
|
||||
Multimap<String, String> headers = factory(TestHeaders.class).buildHeaders(method,
|
||||
new Object[] { 1 }, ImmutableMultimap.<String, String> of().entries());
|
||||
Multimap<String, String> headers = factory(TestHeaders.class).buildHeaders(
|
||||
ImmutableMultimap.<String, String> of().entries(), method, 1);
|
||||
assertEquals(headers.size(), 1);
|
||||
assertEquals(headers.get("header"), Collections.singletonList("1"));
|
||||
}
|
||||
|
@ -1366,8 +1359,8 @@ public class RestAnnotationProcessorTest {
|
|||
public void testTwoDifferentHeaders() throws SecurityException, NoSuchMethodException {
|
||||
Method method = TestHeaders.class
|
||||
.getMethod("twoDifferentHeaders", String.class, String.class);
|
||||
Multimap<String, String> headers = factory(TestHeaders.class).buildHeaders(method,
|
||||
new Object[] { "robot", "egg" }, ImmutableMultimap.<String, String> of().entries());
|
||||
Multimap<String, String> headers = factory(TestHeaders.class).buildHeaders(
|
||||
ImmutableMultimap.<String, String> of().entries(), method, "robot", "egg");
|
||||
assertEquals(headers.size(), 2);
|
||||
assertEquals(headers.get("header1"), Collections.singletonList("robot"));
|
||||
assertEquals(headers.get("header2"), Collections.singletonList("egg"));
|
||||
|
@ -1376,8 +1369,8 @@ public class RestAnnotationProcessorTest {
|
|||
@Test
|
||||
public void testTwoSameHeaders() throws SecurityException, NoSuchMethodException {
|
||||
Method method = TestHeaders.class.getMethod("twoSameHeaders", String.class, String.class);
|
||||
Multimap<String, String> headers = factory(TestHeaders.class).buildHeaders(method,
|
||||
new Object[] { "robot", "egg" }, ImmutableMultimap.<String, String> of().entries());
|
||||
Multimap<String, String> headers = factory(TestHeaders.class).buildHeaders(
|
||||
ImmutableMultimap.<String, String> of().entries(), method, "robot", "egg");
|
||||
assertEquals(headers.size(), 2);
|
||||
Collection<String> values = headers.get("header");
|
||||
assert values.contains("robot");
|
||||
|
@ -1387,38 +1380,42 @@ public class RestAnnotationProcessorTest {
|
|||
@Endpoint(Localhost.class)
|
||||
public interface TestEntity {
|
||||
@PUT
|
||||
public void put(@DecoratorParam(AddAsStringEntity.class) String content);
|
||||
public void put(@BinderParam(BindToStringEntity.class) String content);
|
||||
|
||||
@PUT
|
||||
@Path("{foo}")
|
||||
public Future<Void> putWithPath(@PathParam("foo") String path,
|
||||
@DecoratorParam(AddAsStringEntity.class) String content);
|
||||
@BinderParam(BindToStringEntity.class) String content);
|
||||
|
||||
@PUT
|
||||
public void twoEntities(@DecoratorParam(AddAsStringEntity.class) String entity1,
|
||||
@DecoratorParam(AddAsStringEntity.class) String entity2);
|
||||
public void twoEntities(@BinderParam(BindToStringEntity.class) String entity1,
|
||||
@BinderParam(BindToStringEntity.class) String entity2);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPut() throws SecurityException, NoSuchMethodException {
|
||||
RestAnnotationProcessor<TestEntity> processor = factory(TestEntity.class);
|
||||
Method method = TestEntity.class.getMethod("put", String.class);
|
||||
HttpRequest request = new HttpRequest(HttpMethod.PUT, URI.create("http://localhost:8080"));
|
||||
factory(TestEntity.class).decorateRequest(method, new Object[] { "test" }, request);
|
||||
GeneratedHttpRequest<TestEntity> request = new GeneratedHttpRequest<TestEntity>("GET", URI
|
||||
.create("http://localhost"), processor, TestEntity.class, method, "test");
|
||||
processor.decorateRequest(request);
|
||||
assertEquals(request.getEntity(), "test");
|
||||
assertEquals(request.getHeaders().get(HttpHeaders.CONTENT_TYPE), Collections
|
||||
.singletonList("application/unknown"));
|
||||
assertEquals(request.getHeaders().get(HttpHeaders.CONTENT_LENGTH), Collections
|
||||
.singletonList("test".getBytes().length + ""));
|
||||
assertEquals(
|
||||
factory(TestEntity.class).createResponseParser(method, request, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, request).getClass(),
|
||||
ReturnVoidIf2xx.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void putWithPath() throws SecurityException, NoSuchMethodException {
|
||||
|
||||
RestAnnotationProcessor<TestEntity> processor = factory(TestEntity.class);
|
||||
Method method = TestEntity.class.getMethod("putWithPath", String.class, String.class);
|
||||
HttpRequest request = new HttpRequest(HttpMethod.PUT, URI.create("http://localhost:8080"));
|
||||
factory(TestEntity.class).decorateRequest(method, new Object[] { "rabble", "test" }, request);
|
||||
GeneratedHttpRequest<TestEntity> request = new GeneratedHttpRequest<TestEntity>("GET", URI
|
||||
.create("http://localhost"), processor, TestEntity.class, method, "rabble", "test");
|
||||
processor.decorateRequest(request);
|
||||
assertEquals(request.getEntity(), "test");
|
||||
assertEquals(request.getHeaders().get(HttpHeaders.CONTENT_TYPE), Collections
|
||||
.singletonList("application/unknown"));
|
||||
|
@ -1428,10 +1425,11 @@ public class RestAnnotationProcessorTest {
|
|||
|
||||
@Test(expectedExceptions = IllegalStateException.class)
|
||||
public void testPutTwoEntities() throws SecurityException, NoSuchMethodException {
|
||||
RestAnnotationProcessor<TestEntity> processor = factory(TestEntity.class);
|
||||
Method method = TestEntity.class.getMethod("twoEntities", String.class, String.class);
|
||||
HttpRequest request = new HttpRequest(HttpMethod.PUT, URI.create("http://localhost:8080"));
|
||||
factory(TestEntity.class)
|
||||
.decorateRequest(method, new Object[] { "test", "ralphie" }, request);
|
||||
GeneratedHttpRequest<TestEntity> request = new GeneratedHttpRequest<TestEntity>("GET", URI
|
||||
.create("http://localhost"), processor, TestEntity.class, method, "test", "ralphie");
|
||||
processor.decorateRequest(request);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
|
@ -168,16 +168,15 @@ public class GaeHttpCommandExecutorServiceTest {
|
|||
HttpRequest request = new HttpRequest(HttpMethod.GET, endPoint);
|
||||
request.setEntity(new Date());
|
||||
client.convert(request);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
@Parameters("basedir")
|
||||
void testConvertRequestFileContent(String basedir) throws IOException {
|
||||
HttpRequest request = new HttpRequest(HttpMethod.GET, endPoint);
|
||||
File file = new File(basedir, "target/testfiles/hoot");
|
||||
file.getParentFile().mkdirs();
|
||||
IOUtils.write("hoot!", new FileOutputStream(file));
|
||||
HttpRequest request = new HttpRequest(HttpMethod.GET, endPoint);
|
||||
request.setEntity(file);
|
||||
testHoot(request);
|
||||
}
|
||||
|
|
|
@ -94,7 +94,7 @@ public class NioHttpCommandExecutionHandler implements NHttpRequestExecutionHand
|
|||
if (rendezvous != null) {
|
||||
HttpRequest request = rendezvous.getCommand().getRequest();
|
||||
for (HttpRequestFilter filter : request.getFilters()) {
|
||||
request = filter.filter(request);
|
||||
filter.filter(request);
|
||||
}
|
||||
logger.debug("Sending request: %s", request.getRequestLine());
|
||||
if (request.getEntity() != null && wire.enabled())
|
||||
|
|
|
@ -38,8 +38,8 @@ import org.jclouds.blobstore.functions.ReturnVoidOnNotFoundOr404;
|
|||
import org.jclouds.blobstore.functions.ThrowKeyNotFoundOn404;
|
||||
import org.jclouds.http.filters.BasicAuthentication;
|
||||
import org.jclouds.http.options.GetOptions;
|
||||
import org.jclouds.mezeo.pcs2.decorators.AddDataAndLength;
|
||||
import org.jclouds.mezeo.pcs2.decorators.AddContainerNameAsXmlEntity;
|
||||
import org.jclouds.mezeo.pcs2.binders.BindContainerNameToXmlEntity;
|
||||
import org.jclouds.mezeo.pcs2.binders.BindDataToEntity;
|
||||
import org.jclouds.mezeo.pcs2.domain.ContainerMetadata;
|
||||
import org.jclouds.mezeo.pcs2.domain.FileMetadata;
|
||||
import org.jclouds.mezeo.pcs2.domain.PCSFile;
|
||||
|
@ -57,7 +57,7 @@ import org.jclouds.mezeo.pcs2.functions.ReturnTrueIfContainerAlreadyExists;
|
|||
import org.jclouds.mezeo.pcs2.xml.CachingFileListToContainerMetadataListHandler;
|
||||
import org.jclouds.mezeo.pcs2.xml.FileListToFileMetadataListHandler;
|
||||
import org.jclouds.mezeo.pcs2.xml.FileMetadataHandler;
|
||||
import org.jclouds.rest.annotations.DecoratorParam;
|
||||
import org.jclouds.rest.annotations.BinderParam;
|
||||
import org.jclouds.rest.annotations.Endpoint;
|
||||
import org.jclouds.rest.annotations.ExceptionParser;
|
||||
import org.jclouds.rest.annotations.Headers;
|
||||
|
@ -98,7 +98,7 @@ public interface PCSBlobStore extends BlobStore<ContainerMetadata, FileMetadata,
|
|||
@Path("/contents")
|
||||
@Endpoint(RootContainer.class)
|
||||
@ExceptionParser(ReturnTrueIfContainerAlreadyExists.class)
|
||||
Future<Boolean> createContainer(@DecoratorParam(AddContainerNameAsXmlEntity.class) String container);
|
||||
Future<Boolean> createContainer(@BinderParam(BindContainerNameToXmlEntity.class) String container);
|
||||
|
||||
@DELETE
|
||||
@ExceptionParser(ReturnVoidOnNotFoundOr404.class)
|
||||
|
@ -124,7 +124,7 @@ public interface PCSBlobStore extends BlobStore<ContainerMetadata, FileMetadata,
|
|||
@PathParam("fileResourceId")
|
||||
@ParamParser(CreateSubFolderIfNotExistsAndNewFileResource.class)
|
||||
Future<byte[]> putBlob(String containerName,
|
||||
@DecoratorParam(AddDataAndLength.class) PCSFile object);
|
||||
@BinderParam(BindDataToEntity.class) PCSFile object);
|
||||
|
||||
// @POST
|
||||
// @Path("/containers/{containerResourceId}/contents")
|
||||
|
|
|
@ -34,13 +34,13 @@ import javax.ws.rs.POST;
|
|||
import javax.ws.rs.PUT;
|
||||
import javax.ws.rs.Path;
|
||||
|
||||
import org.jclouds.blobstore.decorators.AddBlobEntityAsMultipartForm;
|
||||
import org.jclouds.blobstore.binders.BindBlobToMultipartForm;
|
||||
import org.jclouds.blobstore.functions.ReturnVoidOnNotFoundOr404;
|
||||
import org.jclouds.blobstore.functions.ThrowKeyNotFoundOn404;
|
||||
import org.jclouds.http.filters.BasicAuthentication;
|
||||
import org.jclouds.mezeo.pcs2.decorators.AddDataAndLength;
|
||||
import org.jclouds.mezeo.pcs2.decorators.AddContainerNameAsXmlEntity;
|
||||
import org.jclouds.mezeo.pcs2.decorators.AddFileInfoAsXmlEntity;
|
||||
import org.jclouds.mezeo.pcs2.binders.BindContainerNameToXmlEntity;
|
||||
import org.jclouds.mezeo.pcs2.binders.BindDataToEntity;
|
||||
import org.jclouds.mezeo.pcs2.binders.BindFileInfoToXmlEntity;
|
||||
import org.jclouds.mezeo.pcs2.domain.ContainerMetadata;
|
||||
import org.jclouds.mezeo.pcs2.domain.FileMetadata;
|
||||
import org.jclouds.mezeo.pcs2.domain.PCSFile;
|
||||
|
@ -48,7 +48,7 @@ import org.jclouds.mezeo.pcs2.endpoints.RootContainer;
|
|||
import org.jclouds.mezeo.pcs2.options.PutBlockOptions;
|
||||
import org.jclouds.mezeo.pcs2.xml.FileListToContainerMetadataListHandler;
|
||||
import org.jclouds.mezeo.pcs2.xml.FileListToFileMetadataListHandler;
|
||||
import org.jclouds.rest.annotations.DecoratorParam;
|
||||
import org.jclouds.rest.annotations.BinderParam;
|
||||
import org.jclouds.rest.annotations.Endpoint;
|
||||
import org.jclouds.rest.annotations.ExceptionParser;
|
||||
import org.jclouds.rest.annotations.Headers;
|
||||
|
@ -79,12 +79,12 @@ public interface PCSConnection {
|
|||
@POST
|
||||
@Path("/contents")
|
||||
@Endpoint(RootContainer.class)
|
||||
Future<URI> createContainer(@DecoratorParam(AddContainerNameAsXmlEntity.class) String container);
|
||||
Future<URI> createContainer(@BinderParam(BindContainerNameToXmlEntity.class) String container);
|
||||
|
||||
@POST
|
||||
@Path("/contents")
|
||||
Future<URI> createContainer(@Endpoint URI parent,
|
||||
@DecoratorParam(AddContainerNameAsXmlEntity.class) String container);
|
||||
@BinderParam(BindContainerNameToXmlEntity.class) String container);
|
||||
|
||||
@DELETE
|
||||
@ExceptionParser(ReturnVoidOnNotFoundOr404.class)
|
||||
|
@ -105,17 +105,17 @@ public interface PCSConnection {
|
|||
@POST
|
||||
@Path("/contents")
|
||||
Future<URI> uploadFile(@Endpoint URI container,
|
||||
@DecoratorParam(AddBlobEntityAsMultipartForm.class) PCSFile object);
|
||||
@BinderParam(BindBlobToMultipartForm.class) PCSFile object);
|
||||
|
||||
@POST
|
||||
@Path("/contents")
|
||||
Future<URI> createFile(@Endpoint URI container,
|
||||
@DecoratorParam(AddFileInfoAsXmlEntity.class) PCSFile object);
|
||||
@BinderParam(BindFileInfoToXmlEntity.class) PCSFile object);
|
||||
|
||||
@PUT
|
||||
@Path("/content")
|
||||
Future<Void> uploadBlock(@Endpoint URI file,
|
||||
@DecoratorParam(AddDataAndLength.class) PCSFile object, PutBlockOptions ... options);
|
||||
@BinderParam(BindDataToEntity.class) PCSFile object, PutBlockOptions... options);
|
||||
|
||||
@DELETE
|
||||
@ExceptionParser(ReturnVoidOnNotFoundOr404.class)
|
||||
|
|
|
@ -33,12 +33,12 @@ import javax.ws.rs.PathParam;
|
|||
|
||||
import org.jclouds.http.filters.BasicAuthentication;
|
||||
import org.jclouds.mezeo.pcs2.functions.AddEntryIntoMultiMap;
|
||||
import org.jclouds.rest.annotations.DecoratorParam;
|
||||
import org.jclouds.rest.annotations.BinderParam;
|
||||
import org.jclouds.rest.annotations.Endpoint;
|
||||
import org.jclouds.rest.annotations.RequestFilters;
|
||||
import org.jclouds.rest.annotations.ResponseParser;
|
||||
import org.jclouds.rest.annotations.SkipEncoding;
|
||||
import org.jclouds.rest.decorators.AddAsStringEntity;
|
||||
import org.jclouds.rest.binders.BindToStringEntity;
|
||||
|
||||
import com.google.common.collect.Multimap;
|
||||
|
||||
|
@ -59,7 +59,7 @@ public interface PCSUtil {
|
|||
@Endpoint(PCS.class)
|
||||
@Path("/files/{fileResourceId}/metadata/{key}")
|
||||
Future<Void> putMetadata(@PathParam("fileResourceId") String resourceId,
|
||||
@PathParam("key") String key, @DecoratorParam(AddAsStringEntity.class) String value);
|
||||
@PathParam("key") String key, @BinderParam(BindToStringEntity.class) String value);
|
||||
|
||||
@GET
|
||||
@ResponseParser(AddEntryIntoMultiMap.class)
|
||||
|
|
|
@ -21,29 +21,28 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs2.decorators;
|
||||
package org.jclouds.mezeo.pcs2.binders;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
import javax.ws.rs.core.HttpHeaders;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rest.decorators.RequestDecorator;
|
||||
import org.jclouds.rest.Binder;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
public class AddContainerNameAsXmlEntity implements RequestDecorator {
|
||||
public class BindContainerNameToXmlEntity implements Binder {
|
||||
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object toBind) {
|
||||
public void bindToRequest(HttpRequest request, Object toBind) {
|
||||
String container = String.format("<container><name>%s</name></container>", toBind);
|
||||
request.setEntity(container);
|
||||
request.getHeaders().replaceValues(HttpHeaders.CONTENT_LENGTH,
|
||||
Collections.singletonList(container.getBytes().length + ""));
|
||||
request.getHeaders().replaceValues(HttpHeaders.CONTENT_TYPE,
|
||||
Collections.singletonList("application/vnd.csp.container-info+xml"));
|
||||
return request;
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package org.jclouds.mezeo.pcs2.decorators;
|
||||
package org.jclouds.mezeo.pcs2.binders;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
|
@ -6,14 +6,13 @@ import javax.ws.rs.core.HttpHeaders;
|
|||
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rest.decorators.RequestDecorator;
|
||||
import org.jclouds.rest.Binder;
|
||||
|
||||
public class AddDataAndLength implements RequestDecorator {
|
||||
public class BindDataToEntity implements Binder {
|
||||
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object entity) {
|
||||
public void bindToRequest(HttpRequest request, Object entity) {
|
||||
Blob<?> object = (Blob<?>) entity;
|
||||
request.setEntity(checkNotNull(object.getData(), "object.getContent()"));
|
||||
request.getHeaders().put(HttpHeaders.CONTENT_LENGTH, object.getMetadata().getSize() + "");
|
||||
return request;
|
||||
}
|
||||
}
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs2.decorators;
|
||||
package org.jclouds.mezeo.pcs2.binders;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
|
@ -31,16 +31,16 @@ import org.jclouds.blobstore.domain.Blob;
|
|||
import org.jclouds.blobstore.domain.Key;
|
||||
import org.jclouds.blobstore.util.BlobStoreUtils;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rest.decorators.RequestDecorator;
|
||||
import org.jclouds.rest.Binder;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
public class AddFileInfoAsXmlEntity implements RequestDecorator {
|
||||
public class BindFileInfoToXmlEntity implements Binder {
|
||||
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object toBind) {
|
||||
public void bindToRequest(HttpRequest request, Object toBind) {
|
||||
Blob<?> blob = (Blob<?>) toBind;
|
||||
String bareKey = BlobStoreUtils.parseKey(new Key("trash", blob.getKey())).getKey();
|
||||
String file = String.format(
|
||||
|
@ -51,6 +51,5 @@ public class AddFileInfoAsXmlEntity implements RequestDecorator {
|
|||
Collections.singletonList(file.getBytes().length + ""));
|
||||
request.getHeaders().replaceValues(HttpHeaders.CONTENT_TYPE,
|
||||
Collections.singletonList("application/vnd.csp.file-info+xml"));
|
||||
return request;
|
||||
}
|
||||
}
|
|
@ -6,10 +6,10 @@ import java.lang.reflect.Constructor;
|
|||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.http.functions.ReturnStringIf200;
|
||||
import org.jclouds.rest.InvocationContext;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.collect.Multimap;
|
||||
|
@ -20,15 +20,13 @@ import com.google.common.collect.Multimap;
|
|||
*/
|
||||
public class AddEntryIntoMultiMap implements Function<HttpResponse, Void>, InvocationContext {
|
||||
ReturnStringIf200 returnIf200;
|
||||
private GeneratedHttpRequest<?> request;
|
||||
|
||||
@Inject
|
||||
private AddEntryIntoMultiMap(ReturnStringIf200 returnIf200) {
|
||||
this.returnIf200 = returnIf200;
|
||||
}
|
||||
|
||||
private Object[] args;
|
||||
private HttpRequest request;
|
||||
|
||||
static final Void v;
|
||||
static {
|
||||
Constructor<Void> cv;
|
||||
|
@ -45,10 +43,10 @@ public class AddEntryIntoMultiMap implements Function<HttpResponse, Void>, Invoc
|
|||
public Void apply(HttpResponse from)
|
||||
|
||||
{
|
||||
checkState(args != null, "args should be initialized at this point");
|
||||
checkState(request.getArgs() != null, "args should be initialized at this point");
|
||||
Multimap<String, String> map = null;
|
||||
String key = null;
|
||||
for (Object arg : args) {
|
||||
for (Object arg : request.getArgs()) {
|
||||
if (arg instanceof Multimap)
|
||||
map = (Multimap<String, String>) arg;
|
||||
else if (arg instanceof String)
|
||||
|
@ -61,17 +59,8 @@ public class AddEntryIntoMultiMap implements Function<HttpResponse, Void>, Invoc
|
|||
return v;
|
||||
}
|
||||
|
||||
public Object[] getArgs() {
|
||||
return args;
|
||||
}
|
||||
|
||||
public HttpRequest getRequest() {
|
||||
return request;
|
||||
}
|
||||
|
||||
public void setContext(HttpRequest request, Object[] args) {
|
||||
public void setContext(GeneratedHttpRequest<?> request) {
|
||||
this.request = request;
|
||||
this.args = args;
|
||||
}
|
||||
|
||||
}
|
|
@ -41,13 +41,13 @@ import org.apache.commons.io.IOUtils;
|
|||
import org.jclouds.blobstore.domain.Key;
|
||||
import org.jclouds.blobstore.internal.BlobRuntimeException;
|
||||
import org.jclouds.blobstore.reference.BlobStoreConstants;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.logging.Logger;
|
||||
import org.jclouds.mezeo.pcs2.PCSUtil;
|
||||
import org.jclouds.mezeo.pcs2.domain.PCSFile;
|
||||
import org.jclouds.mezeo.pcs2.util.PCSUtils;
|
||||
import org.jclouds.rest.InvocationContext;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
import org.jclouds.util.Utils;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
@ -65,8 +65,6 @@ public class AddMetadataAndParseResourceIdIntoBytes implements Function<HttpResp
|
|||
|
||||
@Resource
|
||||
protected Logger logger = Logger.NULL;
|
||||
private Object[] args;
|
||||
private HttpRequest request;
|
||||
|
||||
/**
|
||||
* maximum duration of an blob Request
|
||||
|
@ -74,6 +72,7 @@ public class AddMetadataAndParseResourceIdIntoBytes implements Function<HttpResp
|
|||
@Inject(optional = true)
|
||||
@Named(BlobStoreConstants.PROPERTY_BLOBSTORE_TIMEOUT)
|
||||
protected long requestTimeoutMilliseconds = 30000;
|
||||
private GeneratedHttpRequest<?> request;
|
||||
|
||||
@Inject
|
||||
public AddMetadataAndParseResourceIdIntoBytes(ConcurrentMap<Key, String> fileCache, PCSUtil util) {
|
||||
|
@ -85,11 +84,11 @@ public class AddMetadataAndParseResourceIdIntoBytes implements Function<HttpResp
|
|||
if (from.getStatusCode() > 204)
|
||||
throw new BlobRuntimeException("Incorrect code for: " + from);
|
||||
checkState(request != null, "request should be initialized at this point");
|
||||
checkState(args != null, "args should be initialized at this point");
|
||||
checkArgument(args[0] instanceof String, "arg[0] must be a container name");
|
||||
checkArgument(args[1] instanceof PCSFile, "arg[1] must be a pcsfile");
|
||||
String container = args[0].toString();
|
||||
PCSFile file = (PCSFile) args[1];
|
||||
checkState(request.getArgs() != null, "request.getArgs() should be initialized at this point");
|
||||
checkArgument(request.getArgs()[0] instanceof String, "arg[0] must be a container name");
|
||||
checkArgument(request.getArgs()[1] instanceof PCSFile, "arg[1] must be a pcsfile");
|
||||
String container = request.getArgs()[0].toString();
|
||||
PCSFile file = (PCSFile) request.getArgs()[1];
|
||||
|
||||
Key key = new Key(container, file.getKey());
|
||||
String id = checkNotNull(fileCache.get(key), String.format(
|
||||
|
@ -113,17 +112,8 @@ public class AddMetadataAndParseResourceIdIntoBytes implements Function<HttpResp
|
|||
return PCSUtils.getETag(id);
|
||||
}
|
||||
|
||||
public Object[] getArgs() {
|
||||
return args;
|
||||
}
|
||||
|
||||
public HttpRequest getRequest() {
|
||||
return request;
|
||||
}
|
||||
|
||||
public void setContext(HttpRequest request, Object[] args) {
|
||||
public void setContext(GeneratedHttpRequest<?> request) {
|
||||
this.request = request;
|
||||
this.args = args;
|
||||
}
|
||||
|
||||
}
|
|
@ -29,11 +29,11 @@ import javax.inject.Inject;
|
|||
|
||||
import org.jclouds.blobstore.domain.Key;
|
||||
import org.jclouds.blobstore.functions.ParseContentTypeFromHeaders;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.mezeo.pcs2.domain.FileMetadata;
|
||||
import org.jclouds.mezeo.pcs2.domain.PCSFile;
|
||||
import org.jclouds.rest.InvocationContext;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
||||
|
@ -47,8 +47,7 @@ public class AssembleBlobFromContentAndMetadataCache implements Function<HttpRes
|
|||
InvocationContext {
|
||||
|
||||
private final ConcurrentMap<Key, FileMetadata> cache;
|
||||
private HttpRequest request;
|
||||
private Object[] args;
|
||||
private GeneratedHttpRequest<?> request;
|
||||
|
||||
@Inject
|
||||
public AssembleBlobFromContentAndMetadataCache(ConcurrentMap<Key, FileMetadata> cache) {
|
||||
|
@ -56,23 +55,15 @@ public class AssembleBlobFromContentAndMetadataCache implements Function<HttpRes
|
|||
}
|
||||
|
||||
public PCSFile apply(HttpResponse from) {
|
||||
FileMetadata metadata = cache.get(new Key(getArgs()[0].toString(), this.getArgs()[1].toString()));
|
||||
FileMetadata metadata = cache.get(new Key(request.getArgs()[0].toString(),
|
||||
request.getArgs()[1].toString()));
|
||||
PCSFile blob = new PCSFile(metadata);
|
||||
blob.setData(from.getContent());
|
||||
blob.setContentLength(metadata.getSize());
|
||||
return blob;
|
||||
}
|
||||
|
||||
public Object[] getArgs() {
|
||||
return args;
|
||||
}
|
||||
|
||||
public HttpRequest getRequest() {
|
||||
return request;
|
||||
}
|
||||
|
||||
public void setContext(HttpRequest request, Object[] args) {
|
||||
this.args = args;
|
||||
public void setContext(GeneratedHttpRequest<?> request) {
|
||||
this.request = request;
|
||||
}
|
||||
|
||||
|
|
|
@ -28,9 +28,9 @@ import java.util.concurrent.ConcurrentMap;
|
|||
import javax.inject.Inject;
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.rest.InvocationContext;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
||||
|
@ -39,11 +39,10 @@ import com.google.common.base.Function;
|
|||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class InvalidateContainerNameCacheAndReturnTrueIf2xx implements Function<HttpResponse, Boolean>,
|
||||
InvocationContext {
|
||||
public class InvalidateContainerNameCacheAndReturnTrueIf2xx implements
|
||||
Function<HttpResponse, Boolean>, InvocationContext {
|
||||
private final ConcurrentMap<String, String> cache;
|
||||
private HttpRequest request;
|
||||
private Object[] args;
|
||||
private GeneratedHttpRequest<?> request;
|
||||
|
||||
@Inject
|
||||
public InvalidateContainerNameCacheAndReturnTrueIf2xx(ConcurrentMap<String, String> cache) {
|
||||
|
@ -56,20 +55,11 @@ public class InvalidateContainerNameCacheAndReturnTrueIf2xx implements Function<
|
|||
if (code >= 300 || code < 200) {
|
||||
throw new IllegalStateException("incorrect code for this operation: " + from);
|
||||
}
|
||||
cache.remove(getArgs()[0]);
|
||||
cache.remove(request.getArgs()[0]);
|
||||
return true;
|
||||
}
|
||||
|
||||
public Object[] getArgs() {
|
||||
return args;
|
||||
}
|
||||
|
||||
public HttpRequest getRequest() {
|
||||
return request;
|
||||
}
|
||||
|
||||
public void setContext(HttpRequest request, Object[] args) {
|
||||
this.args = args;
|
||||
public void setContext(GeneratedHttpRequest<?> request) {
|
||||
this.request = request;
|
||||
}
|
||||
|
||||
|
|
|
@ -29,10 +29,10 @@ import javax.inject.Inject;
|
|||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.jclouds.blobstore.domain.Key;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.mezeo.pcs2.domain.FileMetadata;
|
||||
import org.jclouds.rest.InvocationContext;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
||||
|
@ -45,8 +45,7 @@ public class InvalidatePCSKeyCacheAndReturnVoidIf2xx implements Function<HttpRes
|
|||
InvocationContext {
|
||||
private final ConcurrentMap<Key, String> cache;
|
||||
private final ConcurrentMap<Key, FileMetadata> mdCache;
|
||||
private HttpRequest request;
|
||||
private Object[] args;
|
||||
private GeneratedHttpRequest<?> request;
|
||||
|
||||
@Inject
|
||||
public InvalidatePCSKeyCacheAndReturnVoidIf2xx(ConcurrentMap<Key, String> cache,
|
||||
|
@ -61,22 +60,13 @@ public class InvalidatePCSKeyCacheAndReturnVoidIf2xx implements Function<HttpRes
|
|||
if (code >= 300 || code < 200) {
|
||||
throw new IllegalStateException("incorrect code for this operation: " + from);
|
||||
}
|
||||
Key key = new Key(getArgs()[0].toString(), getArgs()[1].toString());
|
||||
Key key = new Key(request.getArgs()[0].toString(), request.getArgs()[1].toString());
|
||||
cache.remove(key);
|
||||
mdCache.remove(key);
|
||||
return null;
|
||||
}
|
||||
|
||||
public Object[] getArgs() {
|
||||
return args;
|
||||
}
|
||||
|
||||
public HttpRequest getRequest() {
|
||||
return request;
|
||||
}
|
||||
|
||||
public void setContext(HttpRequest request, Object[] args) {
|
||||
this.args = args;
|
||||
public void setContext(GeneratedHttpRequest<?> request) {
|
||||
this.request = request;
|
||||
}
|
||||
|
||||
|
|
|
@ -47,7 +47,6 @@ import org.jclouds.blobstore.functions.ThrowKeyNotFoundOn404;
|
|||
import org.jclouds.blobstore.integration.internal.StubBlobStore;
|
||||
import org.jclouds.concurrent.WithinThreadExecutorService;
|
||||
import org.jclouds.concurrent.config.ExecutorServiceModule;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
|
||||
import org.jclouds.http.filters.BasicAuthentication;
|
||||
import org.jclouds.http.functions.ParseSax;
|
||||
|
@ -69,6 +68,7 @@ import org.jclouds.mezeo.pcs2.functions.InvalidatePCSKeyCacheAndReturnVoidIf2xx;
|
|||
import org.jclouds.mezeo.pcs2.functions.ReturnFalseIfContainerNotFound;
|
||||
import org.jclouds.mezeo.pcs2.options.PutBlockOptions;
|
||||
import org.jclouds.rest.config.RestModule;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||
import org.jclouds.util.DateService;
|
||||
import org.testng.annotations.BeforeClass;
|
||||
|
@ -216,15 +216,15 @@ public class PCSBlobStoreTest {
|
|||
public void testListContainers() throws SecurityException, NoSuchMethodException {
|
||||
Method method = PCSBlobStore.class.getMethod("listContainers");
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] {});
|
||||
GeneratedHttpRequest<PCSBlobStore> httpMethod = processor.createRequest(method,
|
||||
new Object[] {});
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/root/contents");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), null);
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 1);
|
||||
assertEquals(httpMethod.getHeaders().get("X-Cloud-Depth"), Collections.singletonList("2"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
ParseSax.class);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(), ParseSax.class);
|
||||
// TODO check generic type of response parser
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
}
|
||||
|
@ -232,7 +232,8 @@ public class PCSBlobStoreTest {
|
|||
public void testCreateContainer() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = PCSBlobStore.class.getMethod("createContainer", String.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "container" });
|
||||
GeneratedHttpRequest<PCSBlobStore> httpMethod = processor.createRequest(method,
|
||||
new Object[] { "container" });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/root/contents");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), null);
|
||||
|
@ -243,7 +244,7 @@ public class PCSBlobStoreTest {
|
|||
assertEquals(httpMethod.getHeaders().get(HttpHeaders.CONTENT_TYPE), Collections
|
||||
.singletonList("application/vnd.csp.container-info+xml"));
|
||||
assertEquals(httpMethod.getEntity(), "<container><name>container</name></container>");
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
// TODO check generic type of response parser
|
||||
}
|
||||
|
@ -251,14 +252,15 @@ public class PCSBlobStoreTest {
|
|||
public void testDeleteContainer() throws SecurityException, NoSuchMethodException {
|
||||
Method method = PCSBlobStore.class.getMethod("deleteContainer", String.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "mycontainer" });
|
||||
GeneratedHttpRequest<PCSBlobStore> httpMethod = processor.createRequest(method,
|
||||
new Object[] { "mycontainer" });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(),
|
||||
"/containers/7F143552-AAF5-11DE-BBB0-0BC388ED913B");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), null);
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.DELETE);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
InvalidateContainerNameCacheAndReturnTrueIf2xx.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ReturnVoidOnNotFoundOr404.class);
|
||||
|
@ -267,14 +269,15 @@ public class PCSBlobStoreTest {
|
|||
public void testContainerExists() throws SecurityException, NoSuchMethodException {
|
||||
Method method = PCSBlobStore.class.getMethod("containerExists", String.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "mycontainer" });
|
||||
GeneratedHttpRequest<PCSBlobStore> httpMethod = processor.createRequest(method,
|
||||
new Object[] { "mycontainer" });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(),
|
||||
"/containers/7F143552-AAF5-11DE-BBB0-0BC388ED913B");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), null);
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ReturnFalseIfContainerNotFound.class);
|
||||
|
@ -283,7 +286,8 @@ public class PCSBlobStoreTest {
|
|||
public void testListBlobs() throws SecurityException, NoSuchMethodException {
|
||||
Method method = PCSBlobStore.class.getMethod("listBlobs", String.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "mycontainer" });
|
||||
GeneratedHttpRequest<PCSBlobStore> httpMethod = processor.createRequest(method,
|
||||
new Object[] { "mycontainer" });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(),
|
||||
"/containers/7F143552-AAF5-11DE-BBB0-0BC388ED913B/contents");
|
||||
|
@ -291,8 +295,7 @@ public class PCSBlobStoreTest {
|
|||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 1);
|
||||
assertEquals(httpMethod.getHeaders().get("X-Cloud-Depth"), Collections.singletonList("2"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
ParseSax.class);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(), ParseSax.class);
|
||||
// TODO check generic type of response parser
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
}
|
||||
|
@ -301,8 +304,8 @@ public class PCSBlobStoreTest {
|
|||
Method method = PCSBlobStore.class.getMethod("putBlob", String.class, PCSFile.class);
|
||||
PCSFile file = new PCSFile("hello");
|
||||
file.setData("wonkers");
|
||||
HttpRequest httpMethod = processor
|
||||
.createRequest(method, new Object[] { "mycontainer", file });
|
||||
GeneratedHttpRequest<PCSBlobStore> httpMethod = processor.createRequest(method, new Object[] {
|
||||
"mycontainer", file });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/files/o/content");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), null);
|
||||
|
@ -311,22 +314,22 @@ public class PCSBlobStoreTest {
|
|||
assertEquals(httpMethod.getHeaders().get(HttpHeaders.CONTENT_LENGTH), Collections
|
||||
.singletonList(file.getData().toString().getBytes().length + ""));
|
||||
assertEquals(httpMethod.getEntity(), file.getData());
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
AddMetadataAndParseResourceIdIntoBytes.class);
|
||||
}
|
||||
|
||||
public void testRemoveBlob() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = PCSBlobStore.class.getMethod("removeBlob", String.class, String.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "mycontainer",
|
||||
"testfile.txt" });
|
||||
GeneratedHttpRequest<PCSBlobStore> httpMethod = processor.createRequest(method, new Object[] {
|
||||
"mycontainer", "testfile.txt" });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(),
|
||||
"/files/9E4C5AFA-A98B-11DE-8B4C-C3884B4A2DA3");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), null);
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.DELETE);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
InvalidatePCSKeyCacheAndReturnVoidIf2xx.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ReturnVoidOnNotFoundOr404.class);
|
||||
|
@ -335,14 +338,14 @@ public class PCSBlobStoreTest {
|
|||
public void testGetBlob() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = PCSBlobStore.class.getMethod("getBlob", String.class, String.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "mycontainer",
|
||||
"testfile.txt" });
|
||||
GeneratedHttpRequest<PCSBlobStore> httpMethod = processor.createRequest(method, new Object[] {
|
||||
"mycontainer", "testfile.txt" });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/webdav/mycontainer/testfile.txt");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), null);
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
AssembleBlobFromContentAndMetadataCache.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ThrowKeyNotFoundOn404.class);
|
||||
|
@ -352,14 +355,14 @@ public class PCSBlobStoreTest {
|
|||
Method method = PCSBlobStore.class.getMethod("getBlob", String.class, String.class,
|
||||
GetOptions.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "mycontainer",
|
||||
"testfile.txt", new GetOptions() });
|
||||
GeneratedHttpRequest<PCSBlobStore> httpMethod = processor.createRequest(method, new Object[] {
|
||||
"mycontainer", "testfile.txt", new GetOptions() });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/webdav/mycontainer/testfile.txt");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), null);
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
AssembleBlobFromContentAndMetadataCache.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ThrowKeyNotFoundOn404.class);
|
||||
|
@ -368,15 +371,14 @@ public class PCSBlobStoreTest {
|
|||
public void testGetBlobMetadata() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = PCSBlobStore.class.getMethod("blobMetadata", String.class, String.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "mycontainer",
|
||||
"testfile.txt" });
|
||||
GeneratedHttpRequest<PCSBlobStore> httpMethod = processor.createRequest(method, new Object[] {
|
||||
"mycontainer", "testfile.txt" });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(),
|
||||
"/files/9E4C5AFA-A98B-11DE-8B4C-C3884B4A2DA3");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), null);
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
ParseSax.class);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(), ParseSax.class);
|
||||
assertEquals(httpMethod.getHeaders().size(), 1);
|
||||
assertEquals(httpMethod.getHeaders().get("X-Cloud-Depth"), Collections.singletonList("2"));
|
||||
// TODO check generic type of response parser
|
||||
|
@ -387,8 +389,8 @@ public class PCSBlobStoreTest {
|
|||
public void testPutMetadata() throws SecurityException, NoSuchMethodException {
|
||||
Method method = PCSUtil.class.getMethod("putMetadata", String.class, String.class,
|
||||
String.class);
|
||||
HttpRequest httpMethod = utilProcessor.createRequest(method, new Object[] { "id", "pow",
|
||||
"bar" });
|
||||
GeneratedHttpRequest<PCSUtil> httpMethod = utilProcessor.createRequest(method, new Object[] {
|
||||
"id", "pow", "bar" });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/files/id/metadata/pow");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.PUT);
|
||||
|
@ -398,8 +400,8 @@ public class PCSBlobStoreTest {
|
|||
assertEquals(httpMethod.getHeaders().get(HttpHeaders.CONTENT_TYPE), Collections
|
||||
.singletonList("application/unknown"));
|
||||
assertEquals("bar", httpMethod.getEntity());
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(utilProcessor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
assertEquals(utilProcessor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnVoidIf2xx.class);
|
||||
}
|
||||
|
||||
|
@ -407,15 +409,15 @@ public class PCSBlobStoreTest {
|
|||
Method method = PCSUtil.class.getMethod("addEntryToMultiMap", Multimap.class, String.class,
|
||||
URI.class);
|
||||
|
||||
HttpRequest httpMethod = utilProcessor
|
||||
GeneratedHttpRequest<PCSUtil> httpMethod = utilProcessor
|
||||
.createRequest(method, new Object[] { ImmutableMultimap.of("key", "value"),
|
||||
"newkey", URI.create("http://localhost/pow") });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/pow");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(utilProcessor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
assertEquals(utilProcessor.createResponseParser(method, httpMethod).getClass(),
|
||||
AddEntryIntoMultiMap.class);
|
||||
}
|
||||
|
||||
|
|
|
@ -39,11 +39,10 @@ import javax.inject.Singleton;
|
|||
import javax.ws.rs.HttpMethod;
|
||||
import javax.ws.rs.core.HttpHeaders;
|
||||
|
||||
import org.jclouds.blobstore.decorators.AddBlobEntityAsMultipartFormTest;
|
||||
import org.jclouds.blobstore.binders.BindBlobToMultipartFormTest;
|
||||
import org.jclouds.blobstore.functions.ReturnVoidOnNotFoundOr404;
|
||||
import org.jclouds.concurrent.WithinThreadExecutorService;
|
||||
import org.jclouds.concurrent.config.ExecutorServiceModule;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
|
||||
import org.jclouds.http.filters.BasicAuthentication;
|
||||
import org.jclouds.http.functions.ParseSax;
|
||||
|
@ -56,6 +55,7 @@ import org.jclouds.mezeo.pcs2.domain.FileMetadata;
|
|||
import org.jclouds.mezeo.pcs2.domain.PCSFile;
|
||||
import org.jclouds.mezeo.pcs2.endpoints.RootContainer;
|
||||
import org.jclouds.rest.config.RestModule;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||
import org.jclouds.util.Utils;
|
||||
import org.testng.annotations.BeforeClass;
|
||||
|
@ -80,14 +80,14 @@ public class PCSConnectionTest {
|
|||
public void testListContainers() throws SecurityException, NoSuchMethodException {
|
||||
Method method = PCSConnection.class.getMethod("listContainers");
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] {});
|
||||
GeneratedHttpRequest<PCSConnection> httpMethod = processor.createRequest(method, new Object[] {});
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/root/contents");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), null);
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 1);
|
||||
assertEquals(httpMethod.getHeaders().get("X-Cloud-Depth"), Collections.singletonList("2"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseSax.class);
|
||||
// TODO check generic type of response parser
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
|
@ -96,7 +96,7 @@ public class PCSConnectionTest {
|
|||
public void testCreateContainer() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = PCSConnection.class.getMethod("createContainer", String.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "container" });
|
||||
GeneratedHttpRequest<PCSConnection> httpMethod = processor.createRequest(method, new Object[] { "container" });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/root/contents");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), null);
|
||||
|
@ -107,7 +107,7 @@ public class PCSConnectionTest {
|
|||
assertEquals(httpMethod.getHeaders().get(HttpHeaders.CONTENT_TYPE), Collections
|
||||
.singletonList("application/vnd.csp.container-info+xml"));
|
||||
assertEquals(httpMethod.getEntity(), "<container><name>container</name></container>");
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseURIList.class);
|
||||
// TODO check generic type of response parser
|
||||
}
|
||||
|
@ -115,14 +115,14 @@ public class PCSConnectionTest {
|
|||
public void testDeleteContainer() throws SecurityException, NoSuchMethodException {
|
||||
Method method = PCSConnection.class.getMethod("deleteContainer", URI.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { URI
|
||||
GeneratedHttpRequest<PCSConnection> httpMethod = processor.createRequest(method, new Object[] { URI
|
||||
.create("http://localhost/container/1234") });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/container/1234");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), null);
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.DELETE);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnVoidIf2xx.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ReturnVoidOnNotFoundOr404.class);
|
||||
|
@ -131,7 +131,7 @@ public class PCSConnectionTest {
|
|||
public void testListFiles() throws SecurityException, NoSuchMethodException {
|
||||
Method method = PCSConnection.class.getMethod("listFiles", URI.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { URI
|
||||
GeneratedHttpRequest<PCSConnection> httpMethod = processor.createRequest(method, new Object[] { URI
|
||||
.create("http://localhost/mycontainer") });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/mycontainer/contents");
|
||||
|
@ -139,7 +139,7 @@ public class PCSConnectionTest {
|
|||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 1);
|
||||
assertEquals(httpMethod.getHeaders().get("X-Cloud-Depth"), Collections.singletonList("2"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseSax.class);
|
||||
// TODO check generic type of response parser
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
|
@ -148,7 +148,7 @@ public class PCSConnectionTest {
|
|||
public void testListContainersURI() throws SecurityException, NoSuchMethodException {
|
||||
Method method = PCSConnection.class.getMethod("listContainers", URI.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { URI
|
||||
GeneratedHttpRequest<PCSConnection> httpMethod = processor.createRequest(method, new Object[] { URI
|
||||
.create("http://localhost/mycontainer") });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/mycontainer/contents");
|
||||
|
@ -156,7 +156,7 @@ public class PCSConnectionTest {
|
|||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 1);
|
||||
assertEquals(httpMethod.getHeaders().get("X-Cloud-Depth"), Collections.singletonList("2"));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseSax.class);
|
||||
// TODO check generic type of response parser
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
|
@ -165,50 +165,50 @@ public class PCSConnectionTest {
|
|||
public void testUploadFile() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = PCSConnection.class.getMethod("uploadFile", URI.class, PCSFile.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] {
|
||||
GeneratedHttpRequest<PCSConnection> httpMethod = processor.createRequest(method, new Object[] {
|
||||
URI.create("http://localhost/mycontainer"),
|
||||
AddBlobEntityAsMultipartFormTest.TEST_BLOB });
|
||||
BindBlobToMultipartFormTest.TEST_BLOB });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/mycontainer/contents");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), null);
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.POST);
|
||||
assertEquals(httpMethod.getHeaders().size(), 2);
|
||||
assertEquals(httpMethod.getHeaders().get(HttpHeaders.CONTENT_LENGTH), Collections
|
||||
.singletonList(AddBlobEntityAsMultipartFormTest.EXPECTS.length() + ""));
|
||||
.singletonList(BindBlobToMultipartFormTest.EXPECTS.length() + ""));
|
||||
assertEquals(httpMethod.getHeaders().get(HttpHeaders.CONTENT_TYPE), Collections
|
||||
.singletonList("multipart/form-data; boundary="
|
||||
+ AddBlobEntityAsMultipartFormTest.BOUNDRY));
|
||||
+ BindBlobToMultipartFormTest.BOUNDRY));
|
||||
assertEquals(Utils.toStringAndClose((InputStream) httpMethod.getEntity()),
|
||||
AddBlobEntityAsMultipartFormTest.EXPECTS);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
BindBlobToMultipartFormTest.EXPECTS);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseURIList.class);
|
||||
}
|
||||
|
||||
public void testDownloadFile() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = PCSConnection.class.getMethod("downloadFile", URI.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { URI
|
||||
GeneratedHttpRequest<PCSConnection> httpMethod = processor.createRequest(method, new Object[] { URI
|
||||
.create("http://localhost/container") });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/container/content");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), null);
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnInputStream.class);
|
||||
}
|
||||
|
||||
public void testDeleteFile() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = PCSConnection.class.getMethod("deleteFile", URI.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { URI
|
||||
GeneratedHttpRequest<PCSConnection> httpMethod = processor.createRequest(method, new Object[] { URI
|
||||
.create("http://localhost/contents/file") });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/contents/file");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), null);
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.DELETE);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnVoidIf2xx.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ReturnVoidOnNotFoundOr404.class);
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs2.decorators;
|
||||
package org.jclouds.mezeo.pcs2.binders;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
|
@ -33,17 +33,17 @@ import org.jclouds.http.HttpRequest;
|
|||
import org.testng.annotations.Test;
|
||||
|
||||
/**
|
||||
* Tests behavior of {@code AddContainerNameAsXmlEntity}
|
||||
* Tests behavior of {@code BindContainerNameToXmlEntity}
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "unit", testName = "pcs2.AddContainerNameAsXmlEntityTest")
|
||||
public class AddContainerNameAsXmlEntityTest {
|
||||
@Test(groups = "unit", testName = "pcs2.BindContainerNameToXmlEntityTest")
|
||||
public class BindContainerNameToXmlEntityTest {
|
||||
|
||||
public void test() {
|
||||
AddContainerNameAsXmlEntity binder = new AddContainerNameAsXmlEntity();
|
||||
BindContainerNameToXmlEntity binder = new BindContainerNameToXmlEntity();
|
||||
HttpRequest request = new HttpRequest("GET", URI.create("http://localhost"));
|
||||
binder.decorateRequest(request, "foo");
|
||||
binder.bindToRequest(request, "foo");
|
||||
assertEquals(request.getEntity(), "<container><name>foo</name></container>");
|
||||
assertEquals(request.getFirstHeaderOrNull(HttpHeaders.CONTENT_LENGTH),
|
||||
"<container><name>foo</name></container>".getBytes().length + "");
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs2.decorators;
|
||||
package org.jclouds.mezeo.pcs2.binders;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
|
@ -34,18 +34,18 @@ import org.jclouds.mezeo.pcs2.domain.PCSFile;
|
|||
import org.testng.annotations.Test;
|
||||
|
||||
/**
|
||||
* Tests behavior of {@code AddFileInfoAsXmlEntity}
|
||||
* Tests behavior of {@code BindFileInfoToXmlEntity}
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "unit", testName = "pcs2.AddFileInfoAsXmlEntityTest")
|
||||
public class AddFileInfoAsXmlEntityTest {
|
||||
@Test(groups = "unit", testName = "pcs2.BindFileInfoToXmlEntityTest")
|
||||
public class BindFileInfoToXmlEntityTest {
|
||||
|
||||
public void test() {
|
||||
AddFileInfoAsXmlEntity binder = new AddFileInfoAsXmlEntity();
|
||||
BindFileInfoToXmlEntity binder = new BindFileInfoToXmlEntity();
|
||||
HttpRequest request = new HttpRequest("GET", URI.create("http://localhost"));
|
||||
PCSFile file = new PCSFile("foo");
|
||||
binder.decorateRequest(request, file);
|
||||
binder.bindToRequest(request, file);
|
||||
assertEquals(
|
||||
request.getEntity(),
|
||||
"<file><name>foo</name><mime_type>application/octet-stream</mime_type><public>false</public></file>");
|
||||
|
@ -60,10 +60,10 @@ public class AddFileInfoAsXmlEntityTest {
|
|||
}
|
||||
|
||||
public void testCompound() {
|
||||
AddFileInfoAsXmlEntity binder = new AddFileInfoAsXmlEntity();
|
||||
BindFileInfoToXmlEntity binder = new BindFileInfoToXmlEntity();
|
||||
HttpRequest request = new HttpRequest("GET", URI.create("http://localhost"));
|
||||
PCSFile file = new PCSFile("subdir/foo");
|
||||
binder.decorateRequest(request, file);
|
||||
binder.bindToRequest(request, file);
|
||||
assertEquals(
|
||||
request.getEntity(),
|
||||
"<file><name>foo</name><mime_type>application/octet-stream</mime_type><public>false</public></file>");
|
|
@ -30,24 +30,38 @@ import static org.easymock.classextension.EasyMock.replay;
|
|||
import static org.easymock.classextension.EasyMock.verify;
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.net.URI;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
import javax.ws.rs.POST;
|
||||
import javax.ws.rs.ext.RuntimeDelegate;
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.jclouds.blobstore.domain.Key;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.concurrent.WithinThreadExecutorService;
|
||||
import org.jclouds.concurrent.config.ExecutorServiceModule;
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.http.HttpUtils;
|
||||
import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
|
||||
import org.jclouds.logging.Logger;
|
||||
import org.jclouds.logging.Logger.LoggerFactory;
|
||||
import org.jclouds.mezeo.pcs2.PCSUtil;
|
||||
import org.jclouds.mezeo.pcs2.domain.PCSFile;
|
||||
import org.jclouds.rest.annotations.Endpoint;
|
||||
import org.jclouds.rest.config.RestModule;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||
import org.jclouds.rest.internal.RuntimeDelegateImpl;
|
||||
import org.testng.annotations.BeforeClass;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.inject.AbstractModule;
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.TypeLiteral;
|
||||
|
||||
/**
|
||||
* Tests behavior of {@code UseResourceIdAsETag}
|
||||
*
|
||||
|
@ -60,6 +74,13 @@ public class AddMetadataAndParseResourceIdIntoBytesTest {
|
|||
}
|
||||
HttpResponse response = new HttpResponse();
|
||||
ConcurrentMap<Key, String> fileCache;
|
||||
private RestAnnotationProcessor<org.jclouds.mezeo.pcs2.functions.AddMetadataAndParseResourceIdIntoBytesTest.TestService> factory;
|
||||
private Method method;
|
||||
|
||||
private static interface TestService {
|
||||
@POST
|
||||
public void foo(String container, PCSFile file, @Endpoint URI endpoint);
|
||||
}
|
||||
|
||||
@BeforeClass
|
||||
void setupMap() {
|
||||
|
@ -71,10 +92,12 @@ public class AddMetadataAndParseResourceIdIntoBytesTest {
|
|||
PCSUtil createPCSUtil() {
|
||||
PCSUtil connection = createMock(PCSUtil.class);
|
||||
final Future<Void> voidF = createMock(Future.class);
|
||||
expect(connection.putMetadata(eq("7F143552-AAF5-11DE-BBB0-0BC388ED913B"), eq("foo"), eq("bar")))
|
||||
.andReturn(voidF);
|
||||
expect(connection.putMetadata(eq("7F143552-AAF5-11DE-BBB0-0BC388ED913B"), eq("biz"), eq("baz")))
|
||||
.andReturn(voidF);
|
||||
expect(
|
||||
connection.putMetadata(eq("7F143552-AAF5-11DE-BBB0-0BC388ED913B"), eq("foo"),
|
||||
eq("bar"))).andReturn(voidF);
|
||||
expect(
|
||||
connection.putMetadata(eq("7F143552-AAF5-11DE-BBB0-0BC388ED913B"), eq("biz"),
|
||||
eq("baz"))).andReturn(voidF);
|
||||
replay(connection);
|
||||
return connection;
|
||||
}
|
||||
|
@ -91,7 +114,6 @@ public class AddMetadataAndParseResourceIdIntoBytesTest {
|
|||
public void testNoRequest() {
|
||||
AddMetadataAndParseResourceIdIntoBytes function = new AddMetadataAndParseResourceIdIntoBytes(
|
||||
fileCache, createPCSUtil());
|
||||
function.setContext(null, new Object[] {"container", new PCSFile("key") });
|
||||
function.apply(response);
|
||||
}
|
||||
|
||||
|
@ -99,8 +121,8 @@ public class AddMetadataAndParseResourceIdIntoBytesTest {
|
|||
PCSUtil connection = createPCSUtil();
|
||||
AddMetadataAndParseResourceIdIntoBytes function = new AddMetadataAndParseResourceIdIntoBytes(
|
||||
fileCache, connection);
|
||||
function.setContext(new HttpRequest("GET", URI.create("http://localhost:8080")),
|
||||
new Object[] { "container", new PCSFile("key") });
|
||||
function.setContext(factory.createRequest(method, "container", new PCSFile("key"), URI
|
||||
.create("http://localhost:8080")));
|
||||
response.setContent(IOUtils
|
||||
.toInputStream("http://localhost/contents/7F143552-AAF5-11DE-BBB0-0BC388ED913B"));
|
||||
byte[] eTag = function.apply(response);
|
||||
|
@ -117,8 +139,8 @@ public class AddMetadataAndParseResourceIdIntoBytesTest {
|
|||
pcsFile.getMetadata().getUserMetadata().put("foo", "bar");
|
||||
pcsFile.getMetadata().getUserMetadata().put("biz", "baz");
|
||||
|
||||
function.setContext(new HttpRequest("GET", URI.create("http://localhost:8080")),
|
||||
new Object[] { "container", pcsFile });
|
||||
function.setContext(factory.createRequest(method, "container", pcsFile, URI
|
||||
.create("http://localhost:8080")));
|
||||
response.setContent(IOUtils
|
||||
.toInputStream("http://localhost/contents/7F143552-AAF5-11DE-BBB0-0BC388ED913B"));
|
||||
byte[] eTag = function.apply(response);
|
||||
|
@ -128,4 +150,33 @@ public class AddMetadataAndParseResourceIdIntoBytesTest {
|
|||
verify(connection);
|
||||
}
|
||||
|
||||
/**
|
||||
* before class, as we need to ensure that the filter is threadsafe.
|
||||
*
|
||||
* @throws NoSuchMethodException
|
||||
* @throws SecurityException
|
||||
*
|
||||
*/
|
||||
@BeforeClass
|
||||
protected void createFilter() throws SecurityException, NoSuchMethodException {
|
||||
Injector injector = Guice.createInjector(new RestModule(), new ExecutorServiceModule(
|
||||
new WithinThreadExecutorService()), new JavaUrlHttpCommandExecutorServiceModule(),
|
||||
new AbstractModule() {
|
||||
|
||||
protected void configure() {
|
||||
RuntimeDelegate.setInstance(new RuntimeDelegateImpl());
|
||||
bind(Logger.LoggerFactory.class).toInstance(new LoggerFactory() {
|
||||
public Logger getLogger(String category) {
|
||||
return Logger.NULL;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
factory = injector.getInstance(com.google.inject.Key
|
||||
.get(new TypeLiteral<RestAnnotationProcessor<TestService>>() {
|
||||
}));
|
||||
|
||||
method = TestService.class.getMethod("foo", String.class, PCSFile.class, URI.class);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -33,15 +33,15 @@ import javax.ws.rs.Path;
|
|||
import javax.ws.rs.PathParam;
|
||||
import javax.ws.rs.QueryParam;
|
||||
|
||||
import org.jclouds.blobstore.decorators.AddBlobEntityAsMultipartForm;
|
||||
import org.jclouds.blobstore.binders.BindBlobToMultipartForm;
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||
import org.jclouds.nirvanix.sdn.decorators.AddMetadataAsQueryParams;
|
||||
import org.jclouds.nirvanix.sdn.binders.BindMetadataToQueryParams;
|
||||
import org.jclouds.nirvanix.sdn.domain.UploadInfo;
|
||||
import org.jclouds.nirvanix.sdn.filters.AddSessionTokenToRequest;
|
||||
import org.jclouds.nirvanix.sdn.functions.ParseUploadInfoFromJsonResponse;
|
||||
import org.jclouds.nirvanix.sdn.reference.SDNQueryParams;
|
||||
import org.jclouds.rest.annotations.DecoratorParam;
|
||||
import org.jclouds.rest.annotations.BinderParam;
|
||||
import org.jclouds.rest.annotations.Endpoint;
|
||||
import org.jclouds.rest.annotations.QueryParams;
|
||||
import org.jclouds.rest.annotations.RequestFilters;
|
||||
|
@ -78,12 +78,22 @@ public interface SDNConnection {
|
|||
Future<Void> upload(@Endpoint URI endpoint,
|
||||
@QueryParam(SDNQueryParams.UPLOADTOKEN) String uploadToken,
|
||||
@QueryParam(SDNQueryParams.DESTFOLDERPATH) String folderPath,
|
||||
@DecoratorParam(AddBlobEntityAsMultipartForm.class) Blob<BlobMetadata> blob);
|
||||
@BinderParam(BindBlobToMultipartForm.class) Blob<BlobMetadata> blob);
|
||||
|
||||
/**
|
||||
* The SetMetadata method is used to set specified metadata for a file or folder.
|
||||
*/
|
||||
@PUT
|
||||
@Path("/Metadata/SetMetadata.ashx")
|
||||
@QueryParams(keys = SDNQueryParams.PATH, values = "{container}/{key}")
|
||||
Future<Void> setMetadata(@PathParam("container") String container, @PathParam("key") String key,
|
||||
@DecoratorParam(AddMetadataAsQueryParams.class) Multimap<String, String> metadata);
|
||||
@QueryParams(keys = SDNQueryParams.PATH, values = "{path}")
|
||||
Future<Void> setMetadata(@PathParam("path") String path,
|
||||
@BinderParam(BindMetadataToQueryParams.class) Multimap<String, String> metadata);
|
||||
|
||||
/**
|
||||
* The GetMetadata method is used to retrieve all metadata from a file or folder.
|
||||
*/
|
||||
@GET
|
||||
@Path("/Metadata/GetMetadata.ashx")
|
||||
@QueryParams(keys = SDNQueryParams.PATH, values = "{path}")
|
||||
Future<String> getMetadata(@PathParam("path") String path);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
package org.jclouds.nirvanix.sdn.decorators;
|
||||
package org.jclouds.nirvanix.sdn.binders;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
@ -6,34 +6,27 @@ import static com.google.common.base.Preconditions.checkNotNull;
|
|||
import java.util.List;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import javax.ws.rs.core.UriBuilder;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpRequestFilter;
|
||||
import org.jclouds.rest.decorators.RequestDecorator;
|
||||
import org.jclouds.rest.Binder;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Multimap;
|
||||
|
||||
public class AddMetadataAsQueryParams implements RequestDecorator {
|
||||
public class BindMetadataToQueryParams implements Binder {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object input) {
|
||||
public void bindToRequest(HttpRequest request, Object input) {
|
||||
checkArgument(checkNotNull(request, "input") instanceof GeneratedHttpRequest,
|
||||
"this decorator is only valid for GeneratedHttpRequests!");
|
||||
checkArgument(checkNotNull(input, "input") instanceof Multimap,
|
||||
"this decorator is only valid for Multimaps!");
|
||||
|
||||
UriBuilder builder = UriBuilder.fromUri(request.getEndpoint());
|
||||
Multimap<String, String> userMetadata = (Multimap<String, String>) input;
|
||||
List<String> metadata = Lists.newArrayList();
|
||||
for (Entry<String, String> entry : userMetadata.entries()) {
|
||||
metadata.add(String.format("%s:%s", entry.getKey().toLowerCase(), entry.getValue()));
|
||||
}
|
||||
builder.replaceQueryParam("metadata", metadata.toArray());
|
||||
List<HttpRequestFilter> oldFilters = request.getFilters();
|
||||
request = new HttpRequest(request.getMethod(), builder.build(), request.getHeaders(), request
|
||||
.getEntity());
|
||||
request.getFilters().addAll(oldFilters);
|
||||
return request;
|
||||
((GeneratedHttpRequest)request).replaceQueryParam("metadata", metadata.toArray());
|
||||
}
|
||||
|
||||
}
|
|
@ -1,19 +1,21 @@
|
|||
package org.jclouds.nirvanix.sdn.filters;
|
||||
|
||||
import java.util.List;
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Provider;
|
||||
import javax.inject.Singleton;
|
||||
import javax.ws.rs.core.UriBuilder;
|
||||
|
||||
import org.jclouds.http.HttpException;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpRequestFilter;
|
||||
import org.jclouds.nirvanix.sdn.SessionToken;
|
||||
import org.jclouds.nirvanix.sdn.reference.SDNQueryParams;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
|
||||
/**
|
||||
* Adds the Session Token to the request. This will update the Session Token before 20 minutes is
|
||||
|
@ -65,14 +67,12 @@ public class AddSessionTokenToRequest implements HttpRequestFilter {
|
|||
authToken = new AtomicReference<String>();
|
||||
}
|
||||
|
||||
public HttpRequest filter(HttpRequest request) throws HttpException {
|
||||
UriBuilder builder = UriBuilder.fromUri(request.getEndpoint());
|
||||
builder.replaceQueryParam(SDNQueryParams.SESSIONTOKEN, getSessionToken());
|
||||
List<HttpRequestFilter> oldFilters = request.getFilters();
|
||||
request = new HttpRequest(request.getMethod(), builder.build(), request.getHeaders(), request
|
||||
.getEntity());
|
||||
request.getFilters().addAll(oldFilters);
|
||||
return request;
|
||||
public void filter(HttpRequest request) throws HttpException {
|
||||
checkArgument(checkNotNull(request, "input") instanceof GeneratedHttpRequest<?>,
|
||||
"this decorator is only valid for GeneratedHttpRequests!");
|
||||
((GeneratedHttpRequest<?>) request).replaceQueryParam(SDNQueryParams.SESSIONTOKEN,
|
||||
getSessionToken());
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -16,6 +16,9 @@ import org.jclouds.nirvanix.sdn.domain.UploadInfo;
|
|||
import org.testng.annotations.BeforeGroups;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.common.collect.ImmutableMultimap;
|
||||
import com.google.common.collect.Multimap;
|
||||
|
||||
/**
|
||||
* Tests behavior of {@code SDNConnection}
|
||||
*
|
||||
|
@ -47,11 +50,17 @@ public class SDNConnectionLiveTest {
|
|||
assertNotNull(uploadInfo.getHost());
|
||||
assertNotNull(uploadInfo.getToken());
|
||||
|
||||
connection.upload(uploadInfo.getHost(), uploadInfo.getToken(), "container",
|
||||
connection.upload(uploadInfo.getHost(), uploadInfo.getToken(), containerName,
|
||||
new Blob<BlobMetadata>("key", "value")).get(30, TimeUnit.SECONDS);
|
||||
|
||||
// Multimap<String, String> metadata = ImmutableMultimap.of("chef", "sushi");
|
||||
// who knows... 403 error; connection.setMetadata("container", "key", metadata).get(30,
|
||||
// TimeUnit.SECONDS);
|
||||
|
||||
String metadataS = connection.getMetadata(containerName).get(30, TimeUnit.SECONDS);
|
||||
System.err.println(metadataS);
|
||||
|
||||
Multimap<String, String> metadata = ImmutableMultimap.of("chef", "sushi", "foo", "bar");
|
||||
connection.setMetadata(containerName, metadata).get(30, TimeUnit.SECONDS);
|
||||
metadataS = connection.getMetadata(containerName).get(30, TimeUnit.SECONDS);
|
||||
System.err.println(metadataS);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,18 +34,19 @@ import java.util.Collections;
|
|||
import javax.ws.rs.HttpMethod;
|
||||
import javax.ws.rs.core.HttpHeaders;
|
||||
|
||||
import org.jclouds.blobstore.decorators.AddBlobEntityAsMultipartFormTest;
|
||||
import org.jclouds.blobstore.binders.BindBlobToMultipartFormTest;
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||
import org.jclouds.concurrent.WithinThreadExecutorService;
|
||||
import org.jclouds.concurrent.config.ExecutorServiceModule;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
|
||||
import org.jclouds.http.functions.ReturnStringIf200;
|
||||
import org.jclouds.http.functions.ReturnVoidIf2xx;
|
||||
import org.jclouds.logging.Logger;
|
||||
import org.jclouds.logging.Logger.LoggerFactory;
|
||||
import org.jclouds.nirvanix.sdn.functions.ParseUploadInfoFromJsonResponse;
|
||||
import org.jclouds.rest.config.RestModule;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||
import org.jclouds.util.Utils;
|
||||
import org.testng.annotations.BeforeClass;
|
||||
|
@ -72,8 +73,8 @@ public class SDNConnectionTest {
|
|||
|
||||
public void testGetStorageNode() throws SecurityException, NoSuchMethodException {
|
||||
Method method = SDNConnection.class.getMethod("getStorageNode", String.class, long.class);
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "adriansmovies",
|
||||
734859264 });
|
||||
GeneratedHttpRequest<?> httpMethod = processor.createRequest(method, new Object[] {
|
||||
"adriansmovies", 734859264 });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/IMFS/GetStorageNode.ashx");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(),
|
||||
|
@ -87,9 +88,9 @@ public class SDNConnectionTest {
|
|||
public void testUpload() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = SDNConnection.class.getMethod("upload", URI.class, String.class,
|
||||
String.class, Blob.class);
|
||||
Blob<BlobMetadata> blob = AddBlobEntityAsMultipartFormTest.TEST_BLOB;
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] {
|
||||
URI.create("http://uploader"), "token", "adriansmovies", blob });
|
||||
Blob<BlobMetadata> blob = BindBlobToMultipartFormTest.TEST_BLOB;
|
||||
GeneratedHttpRequest<SDNConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { URI.create("http://uploader"), "token", "adriansmovies", blob });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "uploader");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/Upload.ashx");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(),
|
||||
|
@ -97,21 +98,21 @@ public class SDNConnectionTest {
|
|||
assertEquals(httpMethod.getMethod(), HttpMethod.POST);
|
||||
assertEquals(httpMethod.getHeaders().size(), 2);
|
||||
assertEquals(httpMethod.getHeaders().get(HttpHeaders.CONTENT_LENGTH), Collections
|
||||
.singletonList(AddBlobEntityAsMultipartFormTest.EXPECTS.length() + ""));
|
||||
.singletonList(BindBlobToMultipartFormTest.EXPECTS.length() + ""));
|
||||
assertEquals(httpMethod.getHeaders().get(HttpHeaders.CONTENT_TYPE), Collections
|
||||
.singletonList("multipart/form-data; boundary="
|
||||
+ AddBlobEntityAsMultipartFormTest.BOUNDRY));
|
||||
+ BindBlobToMultipartFormTest.BOUNDRY));
|
||||
assertEquals(Utils.toStringAndClose((InputStream) httpMethod.getEntity()),
|
||||
AddBlobEntityAsMultipartFormTest.EXPECTS);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
BindBlobToMultipartFormTest.EXPECTS);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnVoidIf2xx.class);
|
||||
}
|
||||
|
||||
public void testSetMetadata() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = SDNConnection.class.getMethod("setMetadata", String.class, String.class,
|
||||
Multimap.class);
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "adriansmovies",
|
||||
"sushi.avi", ImmutableMultimap.of("Chef", "Kawasaki") });
|
||||
Method method = SDNConnection.class.getMethod("setMetadata", String.class, Multimap.class);
|
||||
GeneratedHttpRequest<SDNConnection> httpMethod = processor
|
||||
.createRequest(method, new Object[] { "adriansmovies/sushi.avi",
|
||||
ImmutableMultimap.of("Chef", "Kawasaki") });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/Metadata/SetMetadata.ashx");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(),
|
||||
|
@ -121,10 +122,24 @@ public class SDNConnectionTest {
|
|||
assertEquals(httpMethod.getHeaders().get(HttpHeaders.CONTENT_LENGTH), Collections
|
||||
.singletonList(0 + ""));
|
||||
assertEquals(httpMethod.getEntity(), null);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnVoidIf2xx.class);
|
||||
}
|
||||
|
||||
public void testGetMetadata() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = SDNConnection.class.getMethod("getMetadata", String.class);
|
||||
GeneratedHttpRequest<SDNConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { "adriansmovies/sushi.avi" });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/Metadata/GetMetadata.ashx");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "output=json&path=adriansmovies/sushi.avi");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(httpMethod.getEntity(), null);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnStringIf200.class);
|
||||
}
|
||||
|
||||
@BeforeClass
|
||||
void setupFactory() {
|
||||
Injector injector = Guice.createInjector(new AbstractModule() {
|
||||
|
|
|
@ -0,0 +1,53 @@
|
|||
package org.jclouds.nirvanix.sdn.binders;
|
||||
|
||||
import static org.easymock.classextension.EasyMock.createMock;
|
||||
import static org.easymock.classextension.EasyMock.replay;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.URI;
|
||||
|
||||
import javax.ws.rs.HttpMethod;
|
||||
import javax.ws.rs.ext.RuntimeDelegate;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
import org.jclouds.rest.internal.RuntimeDelegateImpl;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.common.collect.ImmutableMultimap;
|
||||
|
||||
/**
|
||||
* Tests behavior of {@code BindMetadataToQueryParams}
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "unit", testName = "sdn.BindMetadataToQueryParamsTest")
|
||||
public class BindMetadataToQueryParamsTest {
|
||||
static {
|
||||
RuntimeDelegate.setInstance(new RuntimeDelegateImpl());
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = IllegalArgumentException.class)
|
||||
public void testMustBeMap() {
|
||||
BindMetadataToQueryParams binder = new BindMetadataToQueryParams();
|
||||
HttpRequest request = new HttpRequest(HttpMethod.POST, URI.create("http://localhost"));
|
||||
binder.bindToRequest(request, new File("foo"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCorrect() throws SecurityException, NoSuchMethodException {
|
||||
BindMetadataToQueryParams binder = new BindMetadataToQueryParams();
|
||||
|
||||
GeneratedHttpRequest<?> request = createMock(GeneratedHttpRequest.class);
|
||||
request.replaceQueryParam("metadata", "imagename:foo", "serverid:2");
|
||||
replay(request);
|
||||
binder.bindToRequest(request, ImmutableMultimap.of("imageName", "foo", "serverId", "2"));
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = { NullPointerException.class, IllegalStateException.class })
|
||||
public void testNullIsBad() {
|
||||
BindMetadataToQueryParams binder = new BindMetadataToQueryParams();
|
||||
GeneratedHttpRequest<?> request = createMock(GeneratedHttpRequest.class);
|
||||
binder.bindToRequest(request, null);
|
||||
}
|
||||
}
|
|
@ -1,49 +0,0 @@
|
|||
package org.jclouds.nirvanix.sdn.decorators;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.URI;
|
||||
|
||||
import javax.ws.rs.HttpMethod;
|
||||
import javax.ws.rs.ext.RuntimeDelegate;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rest.internal.RuntimeDelegateImpl;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.common.collect.ImmutableMultimap;
|
||||
|
||||
/**
|
||||
* Tests behavior of {@code AddMetadataAsQueryParams}
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "unit", testName = "sdn.AddMetadataAsQueryParamsTest")
|
||||
public class AddMetadataAsQueryParamsTest {
|
||||
static {
|
||||
RuntimeDelegate.setInstance(new RuntimeDelegateImpl());
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = IllegalArgumentException.class)
|
||||
public void testMustBeMap() {
|
||||
AddMetadataAsQueryParams binder = new AddMetadataAsQueryParams();
|
||||
HttpRequest request = new HttpRequest(HttpMethod.POST, URI.create("http://localhost"));
|
||||
request = binder.decorateRequest(request, new File("foo"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCorrect() {
|
||||
AddMetadataAsQueryParams binder = new AddMetadataAsQueryParams();
|
||||
HttpRequest request = new HttpRequest(HttpMethod.PUT, URI.create("http://localhost"));
|
||||
request = binder.decorateRequest(request, ImmutableMultimap.of("imageName", "foo", "serverId", "2") );
|
||||
assertEquals(request.getEndpoint().getQuery(), "metadata=imagename:foo&metadata=serverid:2");
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = { NullPointerException.class, IllegalStateException.class })
|
||||
public void testNullIsBad() {
|
||||
AddMetadataAsQueryParams binder = new AddMetadataAsQueryParams();
|
||||
HttpRequest request = new HttpRequest(HttpMethod.PUT, URI.create("http://localhost"));
|
||||
request = binder.decorateRequest(request,null );
|
||||
}
|
||||
}
|
|
@ -25,13 +25,22 @@ package org.jclouds.nirvanix.sdn.filters;
|
|||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.net.URI;
|
||||
|
||||
import javax.ws.rs.HttpMethod;
|
||||
import javax.ws.rs.POST;
|
||||
import javax.ws.rs.ext.RuntimeDelegate;
|
||||
|
||||
import org.jclouds.concurrent.WithinThreadExecutorService;
|
||||
import org.jclouds.concurrent.config.ExecutorServiceModule;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
|
||||
import org.jclouds.logging.Logger;
|
||||
import org.jclouds.logging.Logger.LoggerFactory;
|
||||
import org.jclouds.nirvanix.sdn.SessionToken;
|
||||
import org.jclouds.rest.annotations.Endpoint;
|
||||
import org.jclouds.rest.config.RestModule;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||
import org.jclouds.rest.internal.RuntimeDelegateImpl;
|
||||
import org.jclouds.util.DateService;
|
||||
import org.testng.annotations.BeforeClass;
|
||||
|
@ -41,7 +50,9 @@ import org.testng.annotations.Test;
|
|||
import com.google.inject.AbstractModule;
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.Key;
|
||||
import com.google.inject.Provides;
|
||||
import com.google.inject.TypeLiteral;
|
||||
|
||||
@Test(groups = "unit", testName = "sdn.AddSessionTokenToRequestTest")
|
||||
public class AddSessionTokenToRequestTest {
|
||||
|
@ -49,11 +60,23 @@ public class AddSessionTokenToRequestTest {
|
|||
private Injector injector;
|
||||
private AddSessionTokenToRequest filter;
|
||||
|
||||
private static interface TestService {
|
||||
@POST
|
||||
public void foo(@Endpoint URI endpoint);
|
||||
}
|
||||
|
||||
@DataProvider
|
||||
public Object[][] dataProvider() {
|
||||
return new Object[][] { { new HttpRequest(HttpMethod.GET, URI.create("https://host:443")) },
|
||||
{ new HttpRequest(HttpMethod.GET, URI.create("https://host/path")) },
|
||||
{ new HttpRequest(HttpMethod.GET, URI.create("https://host/?query"))
|
||||
public Object[][] dataProvider() throws SecurityException, NoSuchMethodException {
|
||||
|
||||
RestAnnotationProcessor<TestService> factory = injector.getInstance(Key
|
||||
.get(new TypeLiteral<RestAnnotationProcessor<TestService>>() {
|
||||
}));
|
||||
|
||||
Method method = TestService.class.getMethod("foo", URI.class);
|
||||
return new Object[][] {
|
||||
{ factory.createRequest(method, new Object[] { URI.create("https://host:443") }) },
|
||||
{ factory.createRequest(method, new Object[] { URI.create("https://host/path") }) },
|
||||
{ factory.createRequest(method, new Object[] { URI.create("https://host/?query") })
|
||||
|
||||
} };
|
||||
}
|
||||
|
@ -63,7 +86,7 @@ public class AddSessionTokenToRequestTest {
|
|||
String token = filter.getSessionToken();
|
||||
|
||||
String query = request.getEndpoint().getQuery();
|
||||
request = filter.filter(request);
|
||||
filter.filter(request);
|
||||
assertEquals(request.getEndpoint().getQuery(), query == null ? "sessionToken=" + token
|
||||
: query + "&sessionToken=" + token);
|
||||
}
|
||||
|
@ -82,11 +105,18 @@ public class AddSessionTokenToRequestTest {
|
|||
*/
|
||||
@BeforeClass
|
||||
protected void createFilter() {
|
||||
injector = Guice.createInjector(new AbstractModule() {
|
||||
injector = Guice.createInjector(new RestModule(), new ExecutorServiceModule(
|
||||
new WithinThreadExecutorService()), new JavaUrlHttpCommandExecutorServiceModule(),
|
||||
new AbstractModule() {
|
||||
|
||||
protected void configure() {
|
||||
RuntimeDelegate.setInstance(new RuntimeDelegateImpl());
|
||||
bind(DateService.class);
|
||||
bind(Logger.LoggerFactory.class).toInstance(new LoggerFactory() {
|
||||
public Logger getLogger(String category) {
|
||||
return Logger.NULL;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
|
|
|
@ -35,7 +35,7 @@ import javax.ws.rs.Path;
|
|||
import javax.ws.rs.PathParam;
|
||||
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.blobstore.decorators.AddBlobEntity;
|
||||
import org.jclouds.blobstore.binders.BindBlobToEntity;
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||
import org.jclouds.blobstore.functions.BlobKey;
|
||||
|
@ -53,7 +53,7 @@ import org.jclouds.rackspace.cloudfiles.functions.ParseObjectFromHeadersAndHttpC
|
|||
import org.jclouds.rackspace.cloudfiles.functions.ParseObjectMetadataFromHeaders;
|
||||
import org.jclouds.rackspace.cloudfiles.options.ListContainerOptions;
|
||||
import org.jclouds.rackspace.filters.AuthenticateRequest;
|
||||
import org.jclouds.rest.annotations.DecoratorParam;
|
||||
import org.jclouds.rest.annotations.BinderParam;
|
||||
import org.jclouds.rest.annotations.Endpoint;
|
||||
import org.jclouds.rest.annotations.ExceptionParser;
|
||||
import org.jclouds.rest.annotations.ParamParser;
|
||||
|
@ -113,7 +113,7 @@ public interface CloudFilesBlobStore extends
|
|||
@ResponseParser(ParseETagHeader.class)
|
||||
Future<byte[]> putBlob(
|
||||
@PathParam("container") String container,
|
||||
@PathParam("key") @ParamParser(BlobKey.class) @DecoratorParam(AddBlobEntity.class) Blob<BlobMetadata> object);
|
||||
@PathParam("key") @ParamParser(BlobKey.class) @BinderParam(BindBlobToEntity.class) Blob<BlobMetadata> object);
|
||||
|
||||
@GET
|
||||
@ResponseParser(ParseObjectFromHeadersAndHttpContent.class)
|
||||
|
|
|
@ -36,8 +36,8 @@ import javax.ws.rs.PUT;
|
|||
import javax.ws.rs.Path;
|
||||
import javax.ws.rs.PathParam;
|
||||
|
||||
import org.jclouds.blobstore.decorators.AddBlobEntity;
|
||||
import org.jclouds.blobstore.decorators.AddHeadersWithPrefix;
|
||||
import org.jclouds.blobstore.binders.BindBlobToEntity;
|
||||
import org.jclouds.blobstore.binders.BindMultimapToHeadersWithPrefix;
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||
import org.jclouds.blobstore.functions.BlobKey;
|
||||
|
@ -64,7 +64,7 @@ import org.jclouds.rackspace.cloudfiles.options.ListCdnContainerOptions;
|
|||
import org.jclouds.rackspace.cloudfiles.options.ListContainerOptions;
|
||||
import org.jclouds.rackspace.cloudfiles.reference.CloudFilesHeaders;
|
||||
import org.jclouds.rackspace.filters.AuthenticateRequest;
|
||||
import org.jclouds.rest.annotations.DecoratorParam;
|
||||
import org.jclouds.rest.annotations.BinderParam;
|
||||
import org.jclouds.rest.annotations.Endpoint;
|
||||
import org.jclouds.rest.annotations.ExceptionParser;
|
||||
import org.jclouds.rest.annotations.Headers;
|
||||
|
@ -141,7 +141,7 @@ public interface CloudFilesConnection {
|
|||
@Path("{container}/{key}")
|
||||
boolean setObjectMetadata(@PathParam("container") String container,
|
||||
@PathParam("key") String key,
|
||||
@DecoratorParam(AddHeadersWithPrefix.class) Multimap<String, String> userMetadata);
|
||||
@BinderParam(BindMultimapToHeadersWithPrefix.class) Multimap<String, String> userMetadata);
|
||||
|
||||
@GET
|
||||
@ResponseParser(ParseContainerCDNMetadataListFromGsonResponse.class)
|
||||
|
@ -205,7 +205,7 @@ public interface CloudFilesConnection {
|
|||
@ResponseParser(ParseETagHeader.class)
|
||||
Future<byte[]> putObject(
|
||||
@PathParam("container") String container,
|
||||
@PathParam("key") @ParamParser(BlobKey.class) @DecoratorParam(AddBlobEntity.class) Blob<BlobMetadata> object);
|
||||
@PathParam("key") @ParamParser(BlobKey.class) @BinderParam(BindBlobToEntity.class) Blob<BlobMetadata> object);
|
||||
|
||||
@GET
|
||||
@ResponseParser(ParseObjectFromHeadersAndHttpContent.class)
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.rackspace.cloudfiles.decorators;
|
||||
package org.jclouds.rackspace.cloudfiles.binders;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
import static org.jclouds.blobstore.reference.BlobStoreConstants.PROPERTY_USER_METADATA_PREFIX;
|
||||
|
@ -30,18 +30,18 @@ import javax.inject.Inject;
|
|||
import javax.inject.Named;
|
||||
import javax.ws.rs.core.HttpHeaders;
|
||||
|
||||
import org.jclouds.blobstore.decorators.AddBlobEntity;
|
||||
import org.jclouds.blobstore.binders.BindBlobToEntity;
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpUtils;
|
||||
|
||||
public class AddCFObjectEntity extends AddBlobEntity {
|
||||
public class BindCFObjectAsEntity extends BindBlobToEntity {
|
||||
@Inject
|
||||
public AddCFObjectEntity(@Named(PROPERTY_USER_METADATA_PREFIX) String metadataPrefix) {
|
||||
public BindCFObjectAsEntity(@Named(PROPERTY_USER_METADATA_PREFIX) String metadataPrefix) {
|
||||
super(metadataPrefix);
|
||||
}
|
||||
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object entity) {
|
||||
public void bindToRequest(HttpRequest request, Object entity) {
|
||||
Blob<?> object = (Blob<?>) entity;
|
||||
if (object.getMetadata().getSize() >= 0) {
|
||||
checkArgument(object.getContentLength() <= 5 * 1024 * 1024 * 1024,
|
||||
|
@ -58,6 +58,6 @@ public class AddCFObjectEntity extends AddBlobEntity {
|
|||
request.getHeaders().put(HttpHeaders.ETAG,
|
||||
HttpUtils.toBase64String(object.getMetadata().getContentMD5()));
|
||||
}
|
||||
return super.decorateRequest(request, entity);
|
||||
super.bindToRequest(request, entity);
|
||||
}
|
||||
}
|
|
@ -37,15 +37,15 @@ import javax.ws.rs.PathParam;
|
|||
|
||||
import org.jclouds.http.functions.ReturnFalseOn404;
|
||||
import org.jclouds.rackspace.CloudServers;
|
||||
import org.jclouds.rackspace.cloudservers.decorators.AddBackupScheduleAsJsonEntity;
|
||||
import org.jclouds.rackspace.cloudservers.decorators.AddAdminPassAsJsonEntity;
|
||||
import org.jclouds.rackspace.cloudservers.decorators.AddServerNameAsJsonEntity;
|
||||
import org.jclouds.rackspace.cloudservers.decorators.AddConfirmResizeAsJsonEntity;
|
||||
import org.jclouds.rackspace.cloudservers.decorators.AddCreateImageAsJsonEntity;
|
||||
import org.jclouds.rackspace.cloudservers.decorators.AddRebootTypeAsJsonEntity;
|
||||
import org.jclouds.rackspace.cloudservers.decorators.AddResizeFlavorAsJsonEntity;
|
||||
import org.jclouds.rackspace.cloudservers.decorators.AddRevertResizeAsJsonEntity;
|
||||
import org.jclouds.rackspace.cloudservers.decorators.AddSharedIpGroupAsJsonEntity;
|
||||
import org.jclouds.rackspace.cloudservers.binders.BindAdminPassToJsonEntity;
|
||||
import org.jclouds.rackspace.cloudservers.binders.BindBackupScheduleToJsonEntity;
|
||||
import org.jclouds.rackspace.cloudservers.binders.BindConfirmResizeToJsonEntity;
|
||||
import org.jclouds.rackspace.cloudservers.binders.BindCreateImageToJsonEntity;
|
||||
import org.jclouds.rackspace.cloudservers.binders.BindRebootTypeToJsonEntity;
|
||||
import org.jclouds.rackspace.cloudservers.binders.BindResizeFlavorToJsonEntity;
|
||||
import org.jclouds.rackspace.cloudservers.binders.BindRevertResizeToJsonEntity;
|
||||
import org.jclouds.rackspace.cloudservers.binders.BindServerNameToJsonEntity;
|
||||
import org.jclouds.rackspace.cloudservers.binders.BindSharedIpGroupToJsonEntity;
|
||||
import org.jclouds.rackspace.cloudservers.domain.Addresses;
|
||||
import org.jclouds.rackspace.cloudservers.domain.BackupSchedule;
|
||||
import org.jclouds.rackspace.cloudservers.domain.Flavor;
|
||||
|
@ -74,7 +74,7 @@ import org.jclouds.rackspace.cloudservers.options.CreateSharedIpGroupOptions;
|
|||
import org.jclouds.rackspace.cloudservers.options.ListOptions;
|
||||
import org.jclouds.rackspace.cloudservers.options.RebuildServerOptions;
|
||||
import org.jclouds.rackspace.filters.AuthenticateRequest;
|
||||
import org.jclouds.rest.annotations.DecoratorParam;
|
||||
import org.jclouds.rest.annotations.BinderParam;
|
||||
import org.jclouds.rest.annotations.Endpoint;
|
||||
import org.jclouds.rest.annotations.ExceptionParser;
|
||||
import org.jclouds.rest.annotations.MapBinder;
|
||||
|
@ -170,7 +170,7 @@ public interface CloudServersConnection {
|
|||
// TODO:cloudServersFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest
|
||||
// (400), badMediaType(415),buildInProgress (409), overLimit (403)
|
||||
boolean rebootServer(@PathParam("id") int id,
|
||||
@DecoratorParam(AddRebootTypeAsJsonEntity.class) RebootType rebootType);
|
||||
@BinderParam(BindRebootTypeToJsonEntity.class) RebootType rebootType);
|
||||
|
||||
/**
|
||||
* The resize function converts an existing server to a different flavor, in essence, scaling the
|
||||
|
@ -192,7 +192,8 @@ public interface CloudServersConnection {
|
|||
// TODO:cloudServersFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest
|
||||
// (400), badMediaType(415), itemNotFound (404), buildInProgress (409), serverCapacityUnavailable
|
||||
// (503), overLimit (413), resizeNotAllowed (403)
|
||||
boolean resizeServer(@PathParam("id") int id, @DecoratorParam(AddResizeFlavorAsJsonEntity.class) int flavorId);
|
||||
boolean resizeServer(@PathParam("id") int id,
|
||||
@BinderParam(BindResizeFlavorToJsonEntity.class) int flavorId);
|
||||
|
||||
/**
|
||||
* The resize function converts an existing server to a different flavor, in essence, scaling the
|
||||
|
@ -212,7 +213,8 @@ public interface CloudServersConnection {
|
|||
// TODO:cloudServersFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest
|
||||
// (400), badMediaType(415), itemNotFound (404), buildInProgress (409), serverCapacityUnavailable
|
||||
// (503), overLimit (413), resizeNotAllowed (403)
|
||||
boolean confirmResizeServer(@PathParam("id") @DecoratorParam(AddConfirmResizeAsJsonEntity.class) int id);
|
||||
boolean confirmResizeServer(
|
||||
@PathParam("id") @BinderParam(BindConfirmResizeToJsonEntity.class) int id);
|
||||
|
||||
/**
|
||||
* The resize function converts an existing server to a different flavor, in essence, scaling the
|
||||
|
@ -232,7 +234,8 @@ public interface CloudServersConnection {
|
|||
// TODO:cloudServersFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest
|
||||
// (400), badMediaType(415), itemNotFound (404), buildInProgress (409), serverCapacityUnavailable
|
||||
// (503), overLimit (413), resizeNotAllowed (403)
|
||||
boolean revertResizeServer(@PathParam("id") @DecoratorParam(AddRevertResizeAsJsonEntity.class) int id);
|
||||
boolean revertResizeServer(
|
||||
@PathParam("id") @BinderParam(BindRevertResizeToJsonEntity.class) int id);
|
||||
|
||||
/**
|
||||
* This operation asynchronously provisions a new server. The progress of this operation depends
|
||||
|
@ -304,11 +307,11 @@ public interface CloudServersConnection {
|
|||
@PUT
|
||||
@ExceptionParser(ReturnFalseOn404.class)
|
||||
@Path("/servers/{id}/ips/public/{address}")
|
||||
@MapBinder(AddSharedIpGroupAsJsonEntity.class)
|
||||
@MapBinder(BindSharedIpGroupToJsonEntity.class)
|
||||
// TODO: cloudServersFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest
|
||||
// (400), badMediaType(415), buildInProgress (409), overLimit (413)
|
||||
boolean shareIp(@PathParam("address") @ParamParser(IpAddress.class) InetAddress addressToShare,
|
||||
@PathParam("id") int serverToAssignAddressTo,
|
||||
@PathParam("id") int serverToTosignBindressTo,
|
||||
@MapEntityParam("sharedIpGroupId") int sharedIpGroup,
|
||||
@MapEntityParam("configureServer") boolean configureServer);
|
||||
|
||||
|
@ -318,7 +321,7 @@ public interface CloudServersConnection {
|
|||
* Status Transition: ACTIVE - DELETE_IP - ACTIVE
|
||||
*
|
||||
* @param addressToShare
|
||||
* @param serverToAssignAddressTo
|
||||
* @param serverToTosignBindressTo
|
||||
* @return
|
||||
*/
|
||||
@DELETE
|
||||
|
@ -329,7 +332,7 @@ public interface CloudServersConnection {
|
|||
// badMediaType(415), overLimit (413)
|
||||
boolean unshareIp(
|
||||
@PathParam("address") @ParamParser(IpAddress.class) InetAddress addressToShare,
|
||||
@PathParam("id") int serverToAssignAddressTo);
|
||||
@PathParam("id") int serverToTosignBindressTo);
|
||||
|
||||
/**
|
||||
* This operation allows you to change the administrative password.
|
||||
|
@ -344,7 +347,7 @@ public interface CloudServersConnection {
|
|||
// TODO: cloudServersFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest
|
||||
// (400), badMediaType(415), buildInProgress (409), overLimit (413)
|
||||
boolean changeAdminPass(@PathParam("id") int id,
|
||||
@DecoratorParam(AddAdminPassAsJsonEntity.class) String adminPass);
|
||||
@BinderParam(BindAdminPassToJsonEntity.class) String adminPass);
|
||||
|
||||
/**
|
||||
* This operation allows you to update the name of the server. This operation changes the name of
|
||||
|
@ -360,7 +363,7 @@ public interface CloudServersConnection {
|
|||
// TODO: cloudServersFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest
|
||||
// (400), badMediaType(415), buildInProgress (409), overLimit (413)
|
||||
boolean renameServer(@PathParam("id") int id,
|
||||
@DecoratorParam(AddServerNameAsJsonEntity.class) String newName);
|
||||
@BinderParam(BindServerNameToJsonEntity.class) String newName);
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -447,7 +450,7 @@ public interface CloudServersConnection {
|
|||
@ResponseParser(ParseImageFromJsonResponse.class)
|
||||
@QueryParams(keys = "format", values = "json")
|
||||
@ExceptionParser(ReturnImageNotFoundOn404.class)
|
||||
@MapBinder(AddCreateImageAsJsonEntity.class)
|
||||
@MapBinder(BindCreateImageToJsonEntity.class)
|
||||
@Path("/images")
|
||||
// TODO: cloudServersFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest
|
||||
// (400), badMediaType(415), buildInProgress (409), serverCapacityUnavailable (503), overLimit
|
||||
|
@ -554,7 +557,7 @@ public interface CloudServersConnection {
|
|||
// (400), badMediaType(415), buildInProgress (409), serverCapacityUnavailable (503),
|
||||
// backupOrResizeInProgress(409), resizeNotAllowed (403). overLimit (413)
|
||||
boolean replaceBackupSchedule(@PathParam("id") int id,
|
||||
@DecoratorParam(AddBackupScheduleAsJsonEntity.class) BackupSchedule backupSchedule);
|
||||
@BinderParam(BindBackupScheduleToJsonEntity.class) BackupSchedule backupSchedule);
|
||||
|
||||
/**
|
||||
* List all server addresses
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.rackspace.cloudservers.decorators;
|
||||
package org.jclouds.rackspace.cloudservers.binders;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
@ -29,7 +29,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
|
|||
import java.util.Map;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rest.decorators.AddAsJsonEntity;
|
||||
import org.jclouds.rest.binders.BindToJsonEntity;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
|
||||
|
@ -38,17 +38,17 @@ import com.google.common.collect.ImmutableMap;
|
|||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
public class AddAdminPassAsJsonEntity extends AddAsJsonEntity {
|
||||
public class BindAdminPassToJsonEntity extends BindToJsonEntity {
|
||||
|
||||
@Override
|
||||
public HttpRequest decorateRequest(HttpRequest request, Map<String, String> postParams) {
|
||||
public void bindToRequest(HttpRequest request, Map<String, String> postParams) {
|
||||
throw new IllegalStateException("Change Admin Pass is a PUT operation");
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object toBind) {
|
||||
public void bindToRequest(HttpRequest request, Object toBind) {
|
||||
checkArgument(toBind instanceof String, "this binder is only valid for Strings!");
|
||||
return super.decorateRequest(request, ImmutableMap.of("server", ImmutableMap.of("adminPass",
|
||||
super.bindToRequest(request, ImmutableMap.of("server", ImmutableMap.of("adminPass",
|
||||
checkNotNull(toBind, "adminPass"))));
|
||||
}
|
||||
}
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.rackspace.cloudservers.decorators;
|
||||
package org.jclouds.rackspace.cloudservers.binders;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
|
||||
|
@ -29,7 +29,7 @@ import java.util.Map;
|
|||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rackspace.cloudservers.domain.BackupSchedule;
|
||||
import org.jclouds.rest.decorators.AddAsJsonEntity;
|
||||
import org.jclouds.rest.binders.BindToJsonEntity;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
|
||||
|
@ -38,18 +38,18 @@ import com.google.common.collect.ImmutableMap;
|
|||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
public class AddBackupScheduleAsJsonEntity extends AddAsJsonEntity {
|
||||
public class BindBackupScheduleToJsonEntity extends BindToJsonEntity {
|
||||
|
||||
@Override
|
||||
public HttpRequest decorateRequest(HttpRequest request, Map<String, String> postParams) {
|
||||
public void bindToRequest(HttpRequest request, Map<String, String> postParams) {
|
||||
throw new IllegalStateException(
|
||||
"Replace Backup Schedule needs an BackupSchedule object, not a Map");
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object toBind) {
|
||||
public void bindToRequest(HttpRequest request, Object toBind) {
|
||||
checkArgument(toBind instanceof BackupSchedule,
|
||||
"this binder is only valid for BackupSchedules!");
|
||||
return super.decorateRequest(request, ImmutableMap.of("backupSchedule", toBind));
|
||||
super.bindToRequest(request, ImmutableMap.of("backupSchedule", toBind));
|
||||
}
|
||||
}
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.rackspace.cloudservers.decorators;
|
||||
package org.jclouds.rackspace.cloudservers.binders;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
|
@ -29,21 +29,20 @@ import javax.ws.rs.core.HttpHeaders;
|
|||
import javax.ws.rs.core.MediaType;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rest.decorators.RequestDecorator;
|
||||
import org.jclouds.rest.Binder;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
public class AddConfirmResizeAsJsonEntity implements RequestDecorator {
|
||||
public class BindConfirmResizeToJsonEntity implements Binder {
|
||||
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object toBind) {
|
||||
public void bindToRequest(HttpRequest request, Object toBind) {
|
||||
request.setEntity("{\"confirmResize\":null}");
|
||||
request.getHeaders().replaceValues(HttpHeaders.CONTENT_LENGTH,
|
||||
Collections.singletonList("{\"confirmResize\":null}".getBytes().length + ""));
|
||||
request.getHeaders().replaceValues(HttpHeaders.CONTENT_TYPE,
|
||||
Collections.singletonList(MediaType.APPLICATION_JSON));
|
||||
return request;
|
||||
}
|
||||
}
|
|
@ -21,14 +21,14 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.rackspace.cloudservers.decorators;
|
||||
package org.jclouds.rackspace.cloudservers.binders;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rest.decorators.AddAsJsonEntity;
|
||||
import org.jclouds.rest.binders.BindToJsonEntity;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
|
||||
|
@ -37,7 +37,7 @@ import com.google.common.collect.ImmutableMap;
|
|||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
public class AddCreateImageAsJsonEntity extends AddAsJsonEntity {
|
||||
public class BindCreateImageToJsonEntity extends BindToJsonEntity {
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private class CreateImageRequest {
|
||||
|
@ -52,15 +52,15 @@ public class AddCreateImageAsJsonEntity extends AddAsJsonEntity {
|
|||
}
|
||||
|
||||
@Override
|
||||
public HttpRequest decorateRequest(HttpRequest request, Map<String, String> postParams) {
|
||||
public void bindToRequest(HttpRequest request, Map<String, String> postParams) {
|
||||
CreateImageRequest createRequest = new CreateImageRequest(Integer
|
||||
.parseInt(checkNotNull(postParams.get("serverId"))), checkNotNull(postParams
|
||||
.get("imageName")));
|
||||
return super.decorateRequest(request, ImmutableMap.of("image", createRequest));
|
||||
super.bindToRequest(request, ImmutableMap.of("image", createRequest));
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object toBind) {
|
||||
public void bindToRequest(HttpRequest request, Object toBind) {
|
||||
throw new IllegalArgumentException("image is needs parameters");
|
||||
}
|
||||
}
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.rackspace.cloudservers.decorators;
|
||||
package org.jclouds.rackspace.cloudservers.binders;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
@ -30,7 +30,7 @@ import java.util.Map;
|
|||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rackspace.cloudservers.domain.RebootType;
|
||||
import org.jclouds.rest.decorators.AddAsJsonEntity;
|
||||
import org.jclouds.rest.binders.BindToJsonEntity;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
|
||||
|
@ -39,17 +39,17 @@ import com.google.common.collect.ImmutableMap;
|
|||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
public class AddRebootTypeAsJsonEntity extends AddAsJsonEntity {
|
||||
public class BindRebootTypeToJsonEntity extends BindToJsonEntity {
|
||||
|
||||
@Override
|
||||
public HttpRequest decorateRequest(HttpRequest request, Map<String, String> postParams) {
|
||||
public void bindToRequest(HttpRequest request, Map<String, String> postParams) {
|
||||
throw new IllegalStateException("Reboot doesn't take map parameters");
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object toBind) {
|
||||
public void bindToRequest(HttpRequest request, Object toBind) {
|
||||
checkArgument(toBind instanceof RebootType, "this binder is only valid for RebootTypes!");
|
||||
return super.decorateRequest(request, ImmutableMap.of("reboot", ImmutableMap.of("type",
|
||||
super.bindToRequest(request, ImmutableMap.of("reboot", ImmutableMap.of("type",
|
||||
checkNotNull(toBind, "type"))));
|
||||
}
|
||||
}
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.rackspace.cloudservers.decorators;
|
||||
package org.jclouds.rackspace.cloudservers.binders;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
@ -29,7 +29,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
|
|||
import java.util.Map;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rest.decorators.AddAsJsonEntity;
|
||||
import org.jclouds.rest.binders.BindToJsonEntity;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
|
||||
|
@ -38,17 +38,17 @@ import com.google.common.collect.ImmutableMap;
|
|||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
public class AddResizeFlavorAsJsonEntity extends AddAsJsonEntity {
|
||||
public class BindResizeFlavorToJsonEntity extends BindToJsonEntity {
|
||||
|
||||
@Override
|
||||
public HttpRequest decorateRequest(HttpRequest request, Map<String, String> postParams) {
|
||||
public void bindToRequest(HttpRequest request, Map<String, String> postParams) {
|
||||
throw new IllegalStateException("Resize doesn't take map parameters");
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object toBind) {
|
||||
public void bindToRequest(HttpRequest request, Object toBind) {
|
||||
checkArgument(toBind instanceof Integer, "this binder is only valid for integers!");
|
||||
return super.decorateRequest(request, ImmutableMap.of("resize", ImmutableMap.of("flavorId",
|
||||
super.bindToRequest(request, ImmutableMap.of("resize", ImmutableMap.of("flavorId",
|
||||
(Integer) checkNotNull(toBind, "flavorId"))));
|
||||
}
|
||||
}
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.rackspace.cloudservers.decorators;
|
||||
package org.jclouds.rackspace.cloudservers.binders;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
|
@ -29,21 +29,20 @@ import javax.ws.rs.core.HttpHeaders;
|
|||
import javax.ws.rs.core.MediaType;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rest.decorators.RequestDecorator;
|
||||
import org.jclouds.rest.Binder;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
public class AddRevertResizeAsJsonEntity implements RequestDecorator {
|
||||
public class BindRevertResizeToJsonEntity implements Binder {
|
||||
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object toBind) {
|
||||
public void bindToRequest(HttpRequest request, Object toBind) {
|
||||
request.setEntity("{\"revertResize\":null}");
|
||||
request.getHeaders().replaceValues(HttpHeaders.CONTENT_LENGTH,
|
||||
Collections.singletonList("{\"revertResize\":null}".getBytes().length + ""));
|
||||
request.getHeaders().replaceValues(HttpHeaders.CONTENT_TYPE,
|
||||
Collections.singletonList(MediaType.APPLICATION_JSON));
|
||||
return request;
|
||||
}
|
||||
}
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.rackspace.cloudservers.decorators;
|
||||
package org.jclouds.rackspace.cloudservers.binders;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
@ -29,7 +29,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
|
|||
import java.util.Map;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rest.decorators.AddAsJsonEntity;
|
||||
import org.jclouds.rest.binders.BindToJsonEntity;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
|
||||
|
@ -38,17 +38,17 @@ import com.google.common.collect.ImmutableMap;
|
|||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
public class AddServerNameAsJsonEntity extends AddAsJsonEntity {
|
||||
public class BindServerNameToJsonEntity extends BindToJsonEntity {
|
||||
|
||||
@Override
|
||||
public HttpRequest decorateRequest(HttpRequest request, Map<String, String> postParams) {
|
||||
public void bindToRequest(HttpRequest request, Map<String, String> postParams) {
|
||||
throw new IllegalStateException("Change Server Name is a PUT operation");
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object toBind) {
|
||||
public void bindToRequest(HttpRequest request, Object toBind) {
|
||||
checkArgument(toBind instanceof String, "this binder is only valid for Strings!");
|
||||
return super.decorateRequest(request, ImmutableMap.of("server", ImmutableMap.of("name",
|
||||
super.bindToRequest(request, ImmutableMap.of("server", ImmutableMap.of("name",
|
||||
checkNotNull(toBind, "name"))));
|
||||
}
|
||||
}
|
|
@ -21,14 +21,14 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.rackspace.cloudservers.decorators;
|
||||
package org.jclouds.rackspace.cloudservers.binders;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rest.decorators.AddAsJsonEntity;
|
||||
import org.jclouds.rest.binders.BindToJsonEntity;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
|
||||
|
@ -37,7 +37,7 @@ import com.google.common.collect.ImmutableMap;
|
|||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
public class AddSharedIpGroupAsJsonEntity extends AddAsJsonEntity {
|
||||
public class BindSharedIpGroupToJsonEntity extends BindToJsonEntity {
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private class ShareIpRequest {
|
||||
|
@ -51,17 +51,17 @@ public class AddSharedIpGroupAsJsonEntity extends AddAsJsonEntity {
|
|||
}
|
||||
|
||||
@Override
|
||||
public HttpRequest decorateRequest(HttpRequest request, Map<String, String> postParams) {
|
||||
public void bindToRequest(HttpRequest request, Map<String, String> postParams) {
|
||||
ShareIpRequest createRequest = new ShareIpRequest(Integer.parseInt(checkNotNull(postParams
|
||||
.get("sharedIpGroupId"))));
|
||||
if (Boolean.parseBoolean(checkNotNull(postParams.get("configureServer")))) {
|
||||
createRequest.configureServer = new Boolean(true);
|
||||
}
|
||||
return super.decorateRequest(request, ImmutableMap.of("shareIp", createRequest));
|
||||
super.bindToRequest(request, ImmutableMap.of("shareIp", createRequest));
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object toBind) {
|
||||
public void bindToRequest(HttpRequest request, Object toBind) {
|
||||
throw new IllegalStateException("shareIp is needs parameters");
|
||||
}
|
||||
}
|
|
@ -36,7 +36,7 @@ import java.util.Map.Entry;
|
|||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpUtils;
|
||||
import org.jclouds.rackspace.cloudservers.domain.Addresses;
|
||||
import org.jclouds.rest.decorators.AddAsJsonEntity;
|
||||
import org.jclouds.rest.binders.BindToJsonEntity;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.inject.internal.Lists;
|
||||
|
@ -47,7 +47,7 @@ import com.google.inject.internal.Maps;
|
|||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
public class CreateServerOptions extends AddAsJsonEntity {
|
||||
public class CreateServerOptions extends BindToJsonEntity {
|
||||
|
||||
static class File {
|
||||
private final String path;
|
||||
|
@ -98,8 +98,7 @@ public class CreateServerOptions extends AddAsJsonEntity {
|
|||
private InetAddress publicIp;
|
||||
|
||||
@Override
|
||||
public HttpRequest decorateRequest(HttpRequest request, Map<String, String> postParams) {
|
||||
|
||||
public void bindToRequest(HttpRequest request, Map<String, String> postParams) {
|
||||
ServerRequest server = new ServerRequest(checkNotNull(postParams.get("name"),
|
||||
"name parameter not present"), Integer.parseInt(checkNotNull(postParams
|
||||
.get("imageId"), "imageId parameter not present")), Integer.parseInt(checkNotNull(
|
||||
|
@ -115,7 +114,7 @@ public class CreateServerOptions extends AddAsJsonEntity {
|
|||
server.addresses.setPublicAddresses(Collections.singletonList(publicIp));
|
||||
server.addresses.setPrivateAddresses(null);
|
||||
}
|
||||
return decorateRequest(request, ImmutableMap.of("server", server));
|
||||
bindToRequest(request, ImmutableMap.of("server", server));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -29,7 +29,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
|
|||
import java.util.Map;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rest.decorators.AddAsJsonEntity;
|
||||
import org.jclouds.rest.binders.BindToJsonEntity;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.inject.internal.Nullable;
|
||||
|
@ -40,7 +40,7 @@ import com.google.inject.internal.Nullable;
|
|||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
public class CreateSharedIpGroupOptions extends AddAsJsonEntity {
|
||||
public class CreateSharedIpGroupOptions extends BindToJsonEntity {
|
||||
Integer serverId;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
|
@ -56,14 +56,14 @@ public class CreateSharedIpGroupOptions extends AddAsJsonEntity {
|
|||
}
|
||||
|
||||
@Override
|
||||
public HttpRequest decorateRequest(HttpRequest request, Map<String, String> postParams) {
|
||||
public void bindToRequest(HttpRequest request, Map<String, String> postParams) {
|
||||
SharedIpGroupRequest createRequest = new SharedIpGroupRequest(checkNotNull(postParams
|
||||
.get("name")), serverId);
|
||||
return super.decorateRequest(request, ImmutableMap.of("sharedIpGroup", createRequest));
|
||||
super.bindToRequest(request, ImmutableMap.of("sharedIpGroup", createRequest));
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object toBind) {
|
||||
public void bindToRequest(HttpRequest request, Object toBind) {
|
||||
throw new IllegalStateException("CreateSharedIpGroup is a POST operation");
|
||||
}
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@ import static com.google.common.base.Preconditions.checkArgument;
|
|||
import java.util.Map;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rest.decorators.AddAsJsonEntity;
|
||||
import org.jclouds.rest.binders.BindToJsonEntity;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.inject.internal.Maps;
|
||||
|
@ -39,19 +39,19 @@ import com.google.inject.internal.Maps;
|
|||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
public class RebuildServerOptions extends AddAsJsonEntity {
|
||||
public class RebuildServerOptions extends BindToJsonEntity {
|
||||
Integer imageId;
|
||||
|
||||
@Override
|
||||
public HttpRequest decorateRequest(HttpRequest request, Map<String, String> postParams) {
|
||||
public void bindToRequest(HttpRequest request, Map<String, String> postParams) {
|
||||
Map<String, Integer> image = Maps.newHashMap();
|
||||
if (imageId != null)
|
||||
image.put("imageId", imageId);
|
||||
return super.decorateRequest(request, ImmutableMap.of("rebuild", image));
|
||||
super.bindToRequest(request, ImmutableMap.of("rebuild", image));
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpRequest decorateRequest(HttpRequest request, Object toBind) {
|
||||
public void bindToRequest(HttpRequest request, Object toBind) {
|
||||
throw new IllegalStateException("RebuildServer is a POST operation");
|
||||
}
|
||||
|
||||
|
|
|
@ -45,7 +45,6 @@ import javax.ws.rs.core.MediaType;
|
|||
|
||||
import org.jclouds.concurrent.WithinThreadExecutorService;
|
||||
import org.jclouds.concurrent.config.ExecutorServiceModule;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
|
||||
import org.jclouds.http.functions.ReturnFalseOn404;
|
||||
import org.jclouds.http.functions.ReturnTrueIf2xx;
|
||||
|
@ -77,6 +76,7 @@ import org.jclouds.rackspace.cloudservers.options.CreateSharedIpGroupOptions;
|
|||
import org.jclouds.rackspace.cloudservers.options.ListOptions;
|
||||
import org.jclouds.rackspace.cloudservers.options.RebuildServerOptions;
|
||||
import org.jclouds.rest.config.RestModule;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||
import org.joda.time.DateTime;
|
||||
import org.testng.annotations.BeforeClass;
|
||||
|
@ -106,7 +106,8 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class.getMethod("createServer", String.class,
|
||||
int.class, int.class, createServerOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "ralphie", 2, 1 });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { "ralphie", 2, 1 });
|
||||
assertEquals("{\"server\":{\"name\":\"ralphie\",\"imageId\":2,\"flavorId\":1}}", httpMethod
|
||||
.getEntity());
|
||||
validateCreateServer(method, httpMethod, null);
|
||||
|
@ -116,8 +117,8 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class.getMethod("createServer", String.class,
|
||||
int.class, int.class, createServerOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "ralphie", 2, 1,
|
||||
withSharedIpGroup(2) });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { "ralphie", 2, 1, withSharedIpGroup(2) });
|
||||
assertEquals(
|
||||
"{\"server\":{\"name\":\"ralphie\",\"imageId\":2,\"flavorId\":1,\"sharedIpGroupId\":2}}",
|
||||
httpMethod.getEntity());
|
||||
|
@ -128,7 +129,8 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class.getMethod("createServer", String.class,
|
||||
int.class, int.class, createServerOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "ralphie", 2, 1,
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { "ralphie", 2, 1,
|
||||
new CreateServerOptions[] { withFile("/etc/jclouds", "foo".getBytes()) } });
|
||||
assertEquals(
|
||||
"{\"server\":{\"name\":\"ralphie\",\"imageId\":2,\"flavorId\":1,\"personality\":[{\"path\":\"/etc/jclouds\",\"contents\":\"Zm9v\"}]}}",
|
||||
|
@ -140,8 +142,8 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class.getMethod("createServer", String.class,
|
||||
int.class, int.class, createServerOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "ralphie", 2, 1,
|
||||
withMetadata(ImmutableMap.of("foo", "bar")) });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { "ralphie", 2, 1, withMetadata(ImmutableMap.of("foo", "bar")) });
|
||||
assertEquals(
|
||||
"{\"server\":{\"name\":\"ralphie\",\"imageId\":2,\"flavorId\":1,\"metadata\":{\"foo\":\"bar\"}}}",
|
||||
httpMethod.getEntity());
|
||||
|
@ -153,7 +155,8 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class.getMethod("createServer", String.class,
|
||||
int.class, int.class, createServerOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] {
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] {
|
||||
"ralphie",
|
||||
2,
|
||||
1,
|
||||
|
@ -165,7 +168,8 @@ public class CloudServersConnectionTest {
|
|||
validateCreateServer(method, httpMethod, null);
|
||||
}
|
||||
|
||||
private void validateCreateServer(Method method, HttpRequest httpMethod, Object[] args) {
|
||||
private void validateCreateServer(Method method,
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod, Object[] args) {
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/servers");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json");
|
||||
|
@ -186,13 +190,14 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class
|
||||
.getMethod("listServers", listOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] {});
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] {});
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/servers");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseServerListFromJsonResponse.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
}
|
||||
|
@ -203,15 +208,15 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class
|
||||
.getMethod("listServers", listOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { changesSince(now)
|
||||
.maxResults(1).startAt(2) });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { changesSince(now).maxResults(1).startAt(2) });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/servers");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json" + "&limit=1&changes-since="
|
||||
+ now.getMillis() / 1000 + "&offset=2");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseServerListFromJsonResponse.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
}
|
||||
|
@ -220,13 +225,14 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class
|
||||
.getMethod("listServers", listOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { withDetails() });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { withDetails() });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/servers/detail");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseServerListFromJsonResponse.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
}
|
||||
|
@ -234,13 +240,14 @@ public class CloudServersConnectionTest {
|
|||
public void testGetServer() throws SecurityException, NoSuchMethodException {
|
||||
Method method = CloudServersConnection.class.getMethod("getServer", int.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { 2 });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { 2 });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/servers/2");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseServerFromJsonResponse.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ReturnServerNotFoundOn404.class);
|
||||
|
@ -250,13 +257,14 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class
|
||||
.getMethod("listFlavors", listOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] {});
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] {});
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/flavors");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseFlavorListFromJsonResponse.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
}
|
||||
|
@ -265,15 +273,15 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class
|
||||
.getMethod("listFlavors", listOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { changesSince(now)
|
||||
.maxResults(1).startAt(2) });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { changesSince(now).maxResults(1).startAt(2) });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/flavors");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json" + "&limit=1&changes-since="
|
||||
+ now.getMillis() / 1000 + "&offset=2");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseFlavorListFromJsonResponse.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
}
|
||||
|
@ -282,13 +290,14 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class
|
||||
.getMethod("listFlavors", listOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { withDetails() });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { withDetails() });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/flavors/detail");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseFlavorListFromJsonResponse.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
}
|
||||
|
@ -297,15 +306,15 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class
|
||||
.getMethod("listFlavors", listOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { withDetails()
|
||||
.changesSince(now).maxResults(1).startAt(2) });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { withDetails().changesSince(now).maxResults(1).startAt(2) });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/flavors/detail");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json" + "&limit=1&changes-since="
|
||||
+ now.getMillis() / 1000 + "&offset=2");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseFlavorListFromJsonResponse.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
}
|
||||
|
@ -313,13 +322,14 @@ public class CloudServersConnectionTest {
|
|||
public void testGetFlavor() throws SecurityException, NoSuchMethodException {
|
||||
Method method = CloudServersConnection.class.getMethod("getFlavor", int.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { 2 });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { 2 });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/flavors/2");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseFlavorFromJsonResponse.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ReturnFlavorNotFoundOn404.class);
|
||||
|
@ -328,13 +338,14 @@ public class CloudServersConnectionTest {
|
|||
public void testListImages() throws SecurityException, NoSuchMethodException {
|
||||
Method method = CloudServersConnection.class.getMethod("listImages", listOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] {});
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] {});
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/images");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseImageListFromJsonResponse.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
}
|
||||
|
@ -342,13 +353,14 @@ public class CloudServersConnectionTest {
|
|||
public void testListImagesDetail() throws SecurityException, NoSuchMethodException {
|
||||
Method method = CloudServersConnection.class.getMethod("listImages", listOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { withDetails() });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { withDetails() });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/images/detail");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseImageListFromJsonResponse.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
}
|
||||
|
@ -356,15 +368,15 @@ public class CloudServersConnectionTest {
|
|||
public void testListImagesOptions() throws SecurityException, NoSuchMethodException {
|
||||
Method method = CloudServersConnection.class.getMethod("listImages", listOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { changesSince(now)
|
||||
.maxResults(1).startAt(2) });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { changesSince(now).maxResults(1).startAt(2) });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/images");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json" + "&limit=1&changes-since="
|
||||
+ now.getMillis() / 1000 + "&offset=2");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseImageListFromJsonResponse.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
}
|
||||
|
@ -372,15 +384,15 @@ public class CloudServersConnectionTest {
|
|||
public void testListImagesDetailOptions() throws SecurityException, NoSuchMethodException {
|
||||
Method method = CloudServersConnection.class.getMethod("listImages", listOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { withDetails()
|
||||
.changesSince(now).maxResults(1).startAt(2) });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { withDetails().changesSince(now).maxResults(1).startAt(2) });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/images/detail");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json" + "&limit=1&changes-since="
|
||||
+ now.getMillis() / 1000 + "&offset=2");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseImageListFromJsonResponse.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
}
|
||||
|
@ -388,13 +400,14 @@ public class CloudServersConnectionTest {
|
|||
public void testGetImage() throws SecurityException, NoSuchMethodException {
|
||||
Method method = CloudServersConnection.class.getMethod("getImage", int.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { 2 });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { 2 });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/images/2");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseImageFromJsonResponse.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ReturnImageNotFoundOn404.class);
|
||||
|
@ -403,14 +416,15 @@ public class CloudServersConnectionTest {
|
|||
public void testDeleteServer() throws SecurityException, NoSuchMethodException {
|
||||
Method method = CloudServersConnection.class.getMethod("deleteServer", int.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { 2 });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { 2 });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/servers/2");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.DELETE);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ReturnFalseOn404.class);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
}
|
||||
|
||||
|
@ -419,8 +433,8 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class.getMethod("shareIp", InetAddress.class,
|
||||
int.class, int.class, boolean.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] {
|
||||
InetAddress.getByAddress(new byte[] { 127, 0, 0, 1 }), 2, 3, false });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { InetAddress.getByAddress(new byte[] { 127, 0, 0, 1 }), 2, 3, false });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/servers/2/ips/public/127.0.0.1");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.PUT);
|
||||
|
@ -432,7 +446,7 @@ public class CloudServersConnectionTest {
|
|||
assertEquals("{\"shareIp\":{\"sharedIpGroupId\":3}}", httpMethod.getEntity());
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ReturnFalseOn404.class);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
}
|
||||
|
||||
|
@ -441,8 +455,8 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class.getMethod("shareIp", InetAddress.class,
|
||||
int.class, int.class, boolean.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] {
|
||||
InetAddress.getByAddress(new byte[] { 127, 0, 0, 1 }), 2, 3, true });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { InetAddress.getByAddress(new byte[] { 127, 0, 0, 1 }), 2, 3, true });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/servers/2/ips/public/127.0.0.1");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.PUT);
|
||||
|
@ -455,7 +469,7 @@ public class CloudServersConnectionTest {
|
|||
.getEntity());
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ReturnFalseOn404.class);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
}
|
||||
|
||||
|
@ -464,15 +478,15 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class.getMethod("unshareIp", InetAddress.class,
|
||||
int.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] {
|
||||
InetAddress.getByAddress(new byte[] { 127, 0, 0, 1 }), 2, 3, false });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { InetAddress.getByAddress(new byte[] { 127, 0, 0, 1 }), 2, 3, false });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/servers/2/ips/public/127.0.0.1");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.DELETE);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ReturnFalseOn404.class);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
}
|
||||
|
||||
|
@ -480,7 +494,8 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class.getMethod("replaceBackupSchedule", int.class,
|
||||
BackupSchedule.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { 2,
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { 2,
|
||||
new BackupSchedule(WeeklyBackup.MONDAY, DailyBackup.H_0800_1000, true) });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/servers/2/backup_schedule");
|
||||
|
@ -490,26 +505,26 @@ public class CloudServersConnectionTest {
|
|||
.singletonList(httpMethod.getEntity().toString().getBytes().length + ""));
|
||||
assertEquals(httpMethod.getHeaders().get(HttpHeaders.CONTENT_TYPE), Collections
|
||||
.singletonList(MediaType.APPLICATION_JSON));
|
||||
assertEquals(
|
||||
httpMethod.getEntity(),
|
||||
assertEquals(httpMethod.getEntity(),
|
||||
"{\"backupSchedule\":{\"daily\":\"H_0800_1000\",\"enabled\":true,\"weekly\":\"MONDAY\"}}");
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ReturnFalseOn404.class);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
}
|
||||
|
||||
public void testDeleteBackupSchedule() throws SecurityException, NoSuchMethodException {
|
||||
Method method = CloudServersConnection.class.getMethod("deleteBackupSchedule", int.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { 2 });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { 2 });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/servers/2/backup_schedule");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.DELETE);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ReturnFalseOn404.class);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
}
|
||||
|
||||
|
@ -517,7 +532,8 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class.getMethod("changeAdminPass", int.class,
|
||||
String.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { 2, "foo" });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { 2, "foo" });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/servers/2");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.PUT);
|
||||
|
@ -529,7 +545,7 @@ public class CloudServersConnectionTest {
|
|||
assertEquals("{\"server\":{\"adminPass\":\"foo\"}}", httpMethod.getEntity());
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ReturnFalseOn404.class);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
}
|
||||
|
||||
|
@ -537,7 +553,8 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class.getMethod("renameServer", int.class,
|
||||
String.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { 2, "foo" });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { 2, "foo" });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/servers/2");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.PUT);
|
||||
|
@ -549,7 +566,7 @@ public class CloudServersConnectionTest {
|
|||
assertEquals("{\"server\":{\"name\":\"foo\"}}", httpMethod.getEntity());
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ReturnFalseOn404.class);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
}
|
||||
|
||||
|
@ -557,13 +574,14 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class.getMethod("listSharedIpGroups",
|
||||
listOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] {});
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] {});
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/shared_ip_groups");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseSharedIpGroupListFromJsonResponse.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
}
|
||||
|
@ -572,15 +590,15 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class.getMethod("listSharedIpGroups",
|
||||
listOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { changesSince(now)
|
||||
.maxResults(1).startAt(2) });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { changesSince(now).maxResults(1).startAt(2) });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/shared_ip_groups");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json" + "&limit=1&changes-since="
|
||||
+ now.getMillis() / 1000 + "&offset=2");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseSharedIpGroupListFromJsonResponse.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
}
|
||||
|
@ -589,13 +607,14 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class.getMethod("listSharedIpGroups",
|
||||
listOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { withDetails() });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { withDetails() });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/shared_ip_groups/detail");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseSharedIpGroupListFromJsonResponse.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
}
|
||||
|
@ -605,15 +624,15 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class.getMethod("listSharedIpGroups",
|
||||
listOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { withDetails()
|
||||
.changesSince(now).maxResults(1).startAt(2) });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { withDetails().changesSince(now).maxResults(1).startAt(2) });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/shared_ip_groups/detail");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json" + "&limit=1&changes-since="
|
||||
+ now.getMillis() / 1000 + "&offset=2");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseSharedIpGroupListFromJsonResponse.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
}
|
||||
|
@ -621,13 +640,14 @@ public class CloudServersConnectionTest {
|
|||
public void testGetSharedIpGroup() throws SecurityException, NoSuchMethodException {
|
||||
Method method = CloudServersConnection.class.getMethod("getSharedIpGroup", int.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { 2 });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { 2 });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/shared_ip_groups/2");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseSharedIpGroupFromJsonResponse.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ReturnSharedIpGroupNotFoundOn404.class);
|
||||
|
@ -640,7 +660,8 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class.getMethod("createSharedIpGroup", String.class,
|
||||
createSharedIpGroupOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "ralphie" });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { "ralphie" });
|
||||
assertEquals("{\"sharedIpGroup\":{\"name\":\"ralphie\"}}", httpMethod.getEntity());
|
||||
validateCreateSharedIpGroup(method, httpMethod);
|
||||
}
|
||||
|
@ -649,14 +670,15 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class.getMethod("createSharedIpGroup", String.class,
|
||||
createSharedIpGroupOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "ralphie",
|
||||
withServer(2) });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { "ralphie", withServer(2) });
|
||||
assertEquals("{\"sharedIpGroup\":{\"name\":\"ralphie\",\"server\":2}}", httpMethod
|
||||
.getEntity());
|
||||
validateCreateSharedIpGroup(method, httpMethod);
|
||||
}
|
||||
|
||||
private void validateCreateSharedIpGroup(Method method, HttpRequest httpMethod) {
|
||||
private void validateCreateSharedIpGroup(Method method,
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod) {
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/shared_ip_groups");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json");
|
||||
|
@ -666,7 +688,7 @@ public class CloudServersConnectionTest {
|
|||
.singletonList(httpMethod.getEntity().toString().getBytes().length + ""));
|
||||
assertEquals(httpMethod.getHeaders().get(HttpHeaders.CONTENT_TYPE), Collections
|
||||
.singletonList(MediaType.APPLICATION_JSON));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseSharedIpGroupFromJsonResponse.class);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method), null);
|
||||
assertNotNull(processor.getMapEntityBinderOrNull(method, new Object[] { "",
|
||||
|
@ -676,66 +698,71 @@ public class CloudServersConnectionTest {
|
|||
public void testDeleteSharedIpGroup() throws SecurityException, NoSuchMethodException {
|
||||
Method method = CloudServersConnection.class.getMethod("deleteSharedIpGroup", int.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { 2 });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { 2 });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/shared_ip_groups/2");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.DELETE);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ReturnFalseOn404.class);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
}
|
||||
|
||||
public void testListAddresses() throws SecurityException, NoSuchMethodException {
|
||||
Method method = CloudServersConnection.class.getMethod("listAddresses", int.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { 2 });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { 2 });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/servers/2/ips");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseAddressesFromJsonResponse.class);
|
||||
}
|
||||
|
||||
public void testListPublicAddresses() throws SecurityException, NoSuchMethodException {
|
||||
Method method = CloudServersConnection.class.getMethod("listPublicAddresses", int.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { 2 });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { 2 });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/servers/2/ips/public");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseInetAddressListFromJsonResponse.class);
|
||||
}
|
||||
|
||||
public void testListPrivateAddresses() throws SecurityException, NoSuchMethodException {
|
||||
Method method = CloudServersConnection.class.getMethod("listPrivateAddresses", int.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { 2 });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { 2 });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/servers/2/ips/private");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseInetAddressListFromJsonResponse.class);
|
||||
}
|
||||
|
||||
public void testListBackupSchedule() throws SecurityException, NoSuchMethodException {
|
||||
Method method = CloudServersConnection.class.getMethod("listBackupSchedule", int.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { 2 });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { 2 });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/servers/2/backup_schedule");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseBackupScheduleFromJsonResponse.class);
|
||||
}
|
||||
|
||||
|
@ -743,7 +770,8 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class.getMethod("createImageFromServer", String.class,
|
||||
int.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { "ralphie", 2 });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { "ralphie", 2 });
|
||||
assertEquals("{\"image\":{\"serverId\":2,\"name\":\"ralphie\"}}", httpMethod.getEntity());
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/images");
|
||||
|
@ -754,7 +782,7 @@ public class CloudServersConnectionTest {
|
|||
.singletonList(httpMethod.getEntity().toString().getBytes().length + ""));
|
||||
assertEquals(httpMethod.getHeaders().get(HttpHeaders.CONTENT_TYPE), Collections
|
||||
.singletonList(MediaType.APPLICATION_JSON));
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ParseImageFromJsonResponse.class);
|
||||
assertNotNull(processor.createExceptionParserOrNullIfNotFound(method));
|
||||
assertNotNull(processor.getMapEntityBinderOrNull(method, new Object[] { "", 2 }));
|
||||
|
@ -767,7 +795,8 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class.getMethod("rebuildServer", int.class,
|
||||
rebuildServerOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { 3 });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { 3 });
|
||||
assertEquals("{\"rebuild\":{}}", httpMethod.getEntity());
|
||||
validateRebuildServer(method, httpMethod);
|
||||
}
|
||||
|
@ -776,12 +805,14 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class.getMethod("rebuildServer", int.class,
|
||||
rebuildServerOptionsVarargsClass);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { 3, withImage(2) });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { 3, withImage(2) });
|
||||
assertEquals("{\"rebuild\":{\"imageId\":2}}", httpMethod.getEntity());
|
||||
validateRebuildServer(method, httpMethod);
|
||||
}
|
||||
|
||||
private void validateRebuildServer(Method method, HttpRequest httpMethod) {
|
||||
private void validateRebuildServer(Method method,
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod) {
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/servers/3/action");
|
||||
assertEquals(httpMethod.getEndpoint().getQuery(), "format=json");
|
||||
|
@ -793,7 +824,7 @@ public class CloudServersConnectionTest {
|
|||
.singletonList(MediaType.APPLICATION_JSON));
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ReturnFalseOn404.class);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
assertNotNull(processor.getMapEntityBinderOrNull(method, new Object[] { "",
|
||||
new RebuildServerOptions[] { withImage(2) } }));
|
||||
|
@ -803,7 +834,8 @@ public class CloudServersConnectionTest {
|
|||
Method method = CloudServersConnection.class.getMethod("rebootServer", int.class,
|
||||
RebootType.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { 2, RebootType.HARD });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { 2, RebootType.HARD });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/servers/2/action");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.POST);
|
||||
|
@ -815,14 +847,15 @@ public class CloudServersConnectionTest {
|
|||
assertEquals("{\"reboot\":{\"type\":\"HARD\"}}", httpMethod.getEntity());
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ReturnFalseOn404.class);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
}
|
||||
|
||||
public void testResize() throws SecurityException, NoSuchMethodException {
|
||||
Method method = CloudServersConnection.class.getMethod("resizeServer", int.class, int.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { 2, 3 });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { 2, 3 });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/servers/2/action");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.POST);
|
||||
|
@ -834,14 +867,15 @@ public class CloudServersConnectionTest {
|
|||
assertEquals("{\"resize\":{\"flavorId\":3}}", httpMethod.getEntity());
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ReturnFalseOn404.class);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
}
|
||||
|
||||
public void testConfirmResize() throws SecurityException, NoSuchMethodException {
|
||||
Method method = CloudServersConnection.class.getMethod("confirmResizeServer", int.class);
|
||||
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { 2 });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { 2 });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/servers/2/action");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.POST);
|
||||
|
@ -853,13 +887,14 @@ public class CloudServersConnectionTest {
|
|||
assertEquals("{\"confirmResize\":null}", httpMethod.getEntity());
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ReturnFalseOn404.class);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
}
|
||||
|
||||
public void testRevertResize() throws SecurityException, NoSuchMethodException {
|
||||
Method method = CloudServersConnection.class.getMethod("revertResizeServer", int.class);
|
||||
HttpRequest httpMethod = processor.createRequest(method, new Object[] { 2 });
|
||||
GeneratedHttpRequest<CloudServersConnection> httpMethod = processor.createRequest(method,
|
||||
new Object[] { 2 });
|
||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||
assertEquals(httpMethod.getEndpoint().getPath(), "/servers/2/action");
|
||||
assertEquals(httpMethod.getMethod(), HttpMethod.POST);
|
||||
|
@ -871,7 +906,7 @@ public class CloudServersConnectionTest {
|
|||
assertEquals("{\"revertResize\":null}", httpMethod.getEntity());
|
||||
assertEquals(processor.createExceptionParserOrNullIfNotFound(method).getClass(),
|
||||
ReturnFalseOn404.class);
|
||||
assertEquals(processor.createResponseParser(method, httpMethod, null).getClass(),
|
||||
assertEquals(processor.createResponseParser(method, httpMethod).getClass(),
|
||||
ReturnTrueIf2xx.class);
|
||||
}
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.rackspace.cloudservers.decorators;
|
||||
package org.jclouds.rackspace.cloudservers.binders;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
|
@ -39,45 +39,45 @@ import com.google.inject.Guice;
|
|||
import com.google.inject.Injector;
|
||||
|
||||
/**
|
||||
* Tests behavior of {@code AddAdminPassAsJsonEntity}
|
||||
* Tests behavior of {@code BindAdminPassToJsonEntity}
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "unit", testName = "cloudservers.AddAdminPassAsJsonEntityTest")
|
||||
public class AddAdminPassAsJsonEntityTest {
|
||||
@Test(groups = "unit", testName = "cloudservers.BindAdminPassToJsonEntityTest")
|
||||
public class BindAdminPassToJsonEntityTest {
|
||||
|
||||
Injector injector = Guice.createInjector(new ParserModule());
|
||||
|
||||
@Test(expectedExceptions = IllegalStateException.class)
|
||||
public void testPostIsIncorrect() {
|
||||
AddAdminPassAsJsonEntity binder = new AddAdminPassAsJsonEntity();
|
||||
BindAdminPassToJsonEntity binder = new BindAdminPassToJsonEntity();
|
||||
injector.injectMembers(binder);
|
||||
HttpRequest request = new HttpRequest(HttpMethod.POST, URI.create("http://localhost"));
|
||||
binder.decorateRequest(request, ImmutableMap.of("adminPass", "foo"));
|
||||
binder.bindToRequest(request, ImmutableMap.of("adminPass", "foo"));
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = IllegalArgumentException.class)
|
||||
public void testMustBeString() {
|
||||
AddAdminPassAsJsonEntity binder = new AddAdminPassAsJsonEntity();
|
||||
BindAdminPassToJsonEntity binder = new BindAdminPassToJsonEntity();
|
||||
injector.injectMembers(binder);
|
||||
HttpRequest request = new HttpRequest(HttpMethod.POST, URI.create("http://localhost"));
|
||||
binder.decorateRequest(request, new File("foo"));
|
||||
binder.bindToRequest(request, new File("foo"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCorrect() {
|
||||
AddAdminPassAsJsonEntity binder = new AddAdminPassAsJsonEntity();
|
||||
BindAdminPassToJsonEntity binder = new BindAdminPassToJsonEntity();
|
||||
injector.injectMembers(binder);
|
||||
HttpRequest request = new HttpRequest(HttpMethod.PUT, URI.create("http://localhost"));
|
||||
binder.decorateRequest(request, "foo");
|
||||
binder.bindToRequest(request, "foo");
|
||||
assertEquals("{\"server\":{\"adminPass\":\"foo\"}}", request.getEntity());
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = { NullPointerException.class, IllegalStateException.class })
|
||||
public void testNullIsBad() {
|
||||
AddAdminPassAsJsonEntity binder = new AddAdminPassAsJsonEntity();
|
||||
BindAdminPassToJsonEntity binder = new BindAdminPassToJsonEntity();
|
||||
injector.injectMembers(binder);
|
||||
HttpRequest request = new HttpRequest(HttpMethod.PUT, URI.create("http://localhost"));
|
||||
binder.decorateRequest(request, null);
|
||||
binder.bindToRequest(request, null);
|
||||
}
|
||||
}
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.rackspace.cloudservers.decorators;
|
||||
package org.jclouds.rackspace.cloudservers.binders;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
|
@ -39,37 +39,37 @@ import com.google.inject.Guice;
|
|||
import com.google.inject.Injector;
|
||||
|
||||
/**
|
||||
* Tests behavior of {@code AddCreateImageAsJsonEntity}
|
||||
* Tests behavior of {@code BindCreateImageToJsonEntity}
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "unit", testName = "cloudservers.AddCreateImageAsJsonEntityTest")
|
||||
public class AddCreateImageAsJsonEntityTest {
|
||||
@Test(groups = "unit", testName = "cloudservers.BindCreateImageToJsonEntityTest")
|
||||
public class BindCreateImageToJsonEntityTest {
|
||||
|
||||
Injector injector = Guice.createInjector(new ParserModule());
|
||||
|
||||
@Test(expectedExceptions = IllegalArgumentException.class)
|
||||
public void testMustBeMap() {
|
||||
AddCreateImageAsJsonEntity binder = new AddCreateImageAsJsonEntity();
|
||||
BindCreateImageToJsonEntity binder = new BindCreateImageToJsonEntity();
|
||||
injector.injectMembers(binder);
|
||||
HttpRequest request = new HttpRequest(HttpMethod.POST, URI.create("http://localhost"));
|
||||
binder.decorateRequest(request, new File("foo"));
|
||||
binder.bindToRequest(request, new File("foo"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCorrect() {
|
||||
AddCreateImageAsJsonEntity binder = new AddCreateImageAsJsonEntity();
|
||||
BindCreateImageToJsonEntity binder = new BindCreateImageToJsonEntity();
|
||||
injector.injectMembers(binder);
|
||||
HttpRequest request = new HttpRequest(HttpMethod.PUT, URI.create("http://localhost"));
|
||||
binder.decorateRequest(request, ImmutableMap.of("imageName", "foo", "serverId", "2"));
|
||||
binder.bindToRequest(request, ImmutableMap.of("imageName", "foo", "serverId", "2"));
|
||||
assertEquals("{\"image\":{\"serverId\":2,\"name\":\"foo\"}}", request.getEntity());
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = { NullPointerException.class, IllegalStateException.class })
|
||||
public void testNullIsBad() {
|
||||
AddCreateImageAsJsonEntity binder = new AddCreateImageAsJsonEntity();
|
||||
BindCreateImageToJsonEntity binder = new BindCreateImageToJsonEntity();
|
||||
injector.injectMembers(binder);
|
||||
HttpRequest request = new HttpRequest(HttpMethod.PUT, URI.create("http://localhost"));
|
||||
binder.decorateRequest(request, null);
|
||||
binder.bindToRequest(request, null);
|
||||
}
|
||||
}
|
|
@ -21,7 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.rackspace.cloudservers.decorators;
|
||||
package org.jclouds.rackspace.cloudservers.binders;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
|
@ -40,54 +40,54 @@ import com.google.inject.Guice;
|
|||
import com.google.inject.Injector;
|
||||
|
||||
/**
|
||||
* Tests behavior of {@code AddRebootTypeAsJsonEntity}
|
||||
* Tests behavior of {@code BindRebootTypeToJsonEntity}
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "unit", testName = "cloudservers.AddRebootTypeAsJsonEntityTest")
|
||||
public class AddRebootTypeAsJsonEntityTest {
|
||||
@Test(groups = "unit", testName = "cloudservers.BindRebootTypeToJsonEntityTest")
|
||||
public class BindRebootTypeToJsonEntityTest {
|
||||
|
||||
Injector injector = Guice.createInjector(new ParserModule());
|
||||
|
||||
@Test(expectedExceptions = IllegalStateException.class)
|
||||
public void testPostIsIncorrect() {
|
||||
AddRebootTypeAsJsonEntity binder = new AddRebootTypeAsJsonEntity();
|
||||
BindRebootTypeToJsonEntity binder = new BindRebootTypeToJsonEntity();
|
||||
injector.injectMembers(binder);
|
||||
HttpRequest request = new HttpRequest(HttpMethod.POST, URI.create("http://localhost"));
|
||||
binder.decorateRequest(request, ImmutableMap.of("adminPass", "foo"));
|
||||
binder.bindToRequest(request, ImmutableMap.of("adminPass", "foo"));
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = IllegalArgumentException.class)
|
||||
public void testMustBeRebootType() {
|
||||
AddRebootTypeAsJsonEntity binder = new AddRebootTypeAsJsonEntity();
|
||||
BindRebootTypeToJsonEntity binder = new BindRebootTypeToJsonEntity();
|
||||
injector.injectMembers(binder);
|
||||
HttpRequest request = new HttpRequest(HttpMethod.POST, URI.create("http://localhost"));
|
||||
binder.decorateRequest(request, new File("foo"));
|
||||
binder.bindToRequest(request, new File("foo"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHard() {
|
||||
AddRebootTypeAsJsonEntity binder = new AddRebootTypeAsJsonEntity();
|
||||
BindRebootTypeToJsonEntity binder = new BindRebootTypeToJsonEntity();
|
||||
injector.injectMembers(binder);
|
||||
HttpRequest request = new HttpRequest(HttpMethod.POST, URI.create("http://localhost"));
|
||||
binder.decorateRequest(request, RebootType.HARD);
|
||||
binder.bindToRequest(request, RebootType.HARD);
|
||||
assertEquals("{\"reboot\":{\"type\":\"HARD\"}}", request.getEntity());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSoft() {
|
||||
AddRebootTypeAsJsonEntity binder = new AddRebootTypeAsJsonEntity();
|
||||
BindRebootTypeToJsonEntity binder = new BindRebootTypeToJsonEntity();
|
||||
injector.injectMembers(binder);
|
||||
HttpRequest request = new HttpRequest(HttpMethod.POST, URI.create("http://localhost"));
|
||||
binder.decorateRequest(request, RebootType.SOFT);
|
||||
binder.bindToRequest(request, RebootType.SOFT);
|
||||
assertEquals("{\"reboot\":{\"type\":\"SOFT\"}}", request.getEntity());
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = { NullPointerException.class, IllegalStateException.class })
|
||||
public void testNullIsBad() {
|
||||
AddRebootTypeAsJsonEntity binder = new AddRebootTypeAsJsonEntity();
|
||||
BindRebootTypeToJsonEntity binder = new BindRebootTypeToJsonEntity();
|
||||
injector.injectMembers(binder);
|
||||
HttpRequest request = new HttpRequest(HttpMethod.POST, URI.create("http://localhost"));
|
||||
binder.decorateRequest(request, null);
|
||||
binder.bindToRequest(request, null);
|
||||
}
|
||||
}
|
|
@ -21,8 +21,7 @@
|
|||
* under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.jclouds.rackspace.cloudservers.decorators;
|
||||
|
||||
package org.jclouds.rackspace.cloudservers.binders;
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.io.File;
|
||||
|
@ -38,46 +37,47 @@ import com.google.common.collect.ImmutableMap;
|
|||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
|
||||
|
||||
/**
|
||||
* Tests behavior of {@code AddServerNameAsJsonEntity}
|
||||
* Tests behavior of {@code BindServerNameToJsonEntity}
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "unit", testName = "cloudservers.AddServerNameAsJsonEntityTest")
|
||||
public class AddServerNameAsJsonEntityTest {
|
||||
@Test(groups = "unit", testName = "cloudservers.BindServerNameToJsonEntityTest")
|
||||
public class BindServerNameToJsonEntityTest {
|
||||
|
||||
Injector injector = Guice.createInjector(new ParserModule());
|
||||
|
||||
@Test(expectedExceptions = IllegalStateException.class)
|
||||
public void testPostIsIncorrect() {
|
||||
AddServerNameAsJsonEntity binder = new AddServerNameAsJsonEntity();
|
||||
BindServerNameToJsonEntity binder = new BindServerNameToJsonEntity();
|
||||
injector.injectMembers(binder);
|
||||
HttpRequest request = new HttpRequest(HttpMethod.POST, URI.create("http://localhost"));
|
||||
binder.decorateRequest(request, ImmutableMap.of("name", "foo"));
|
||||
binder.bindToRequest(request, ImmutableMap.of("name", "foo"));
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = IllegalArgumentException.class)
|
||||
public void testMustBeString() {
|
||||
AddServerNameAsJsonEntity binder = new AddServerNameAsJsonEntity();
|
||||
BindServerNameToJsonEntity binder = new BindServerNameToJsonEntity();
|
||||
injector.injectMembers(binder);
|
||||
HttpRequest request = new HttpRequest(HttpMethod.POST, URI.create("http://localhost"));
|
||||
binder.decorateRequest(request, new File("foo"));
|
||||
binder.bindToRequest(request, new File("foo"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCorrect() {
|
||||
AddServerNameAsJsonEntity binder = new AddServerNameAsJsonEntity();
|
||||
BindServerNameToJsonEntity binder = new BindServerNameToJsonEntity();
|
||||
injector.injectMembers(binder);
|
||||
HttpRequest request = new HttpRequest(HttpMethod.PUT, URI.create("http://localhost"));
|
||||
binder.decorateRequest(request, "foo");
|
||||
binder.bindToRequest(request, "foo");
|
||||
assertEquals("{\"server\":{\"name\":\"foo\"}}", request.getEntity());
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = { NullPointerException.class, IllegalStateException.class })
|
||||
public void testNullIsBad() {
|
||||
AddServerNameAsJsonEntity binder = new AddServerNameAsJsonEntity();
|
||||
BindServerNameToJsonEntity binder = new BindServerNameToJsonEntity();
|
||||
injector.injectMembers(binder);
|
||||
HttpRequest request = new HttpRequest(HttpMethod.PUT, URI.create("http://localhost"));
|
||||
binder.decorateRequest(request, null);
|
||||
binder.bindToRequest(request, null);
|
||||
}
|
||||
}
|
|
@ -63,7 +63,7 @@ public class CreateServerOptionsTest {
|
|||
private HttpRequest buildRequest(CreateServerOptions options) {
|
||||
injector.injectMembers(options);
|
||||
HttpRequest request = new HttpRequest(HttpMethod.POST, URI.create("http://localhost"));
|
||||
options.decorateRequest(request, ImmutableMap.of("name", "foo", "imageId", "1", "flavorId",
|
||||
options.bindToRequest(request, ImmutableMap.of("name", "foo", "imageId", "1", "flavorId",
|
||||
"2"));
|
||||
return request;
|
||||
}
|
||||
|
|
|
@ -58,7 +58,7 @@ public class CreateSharedIpGroupOptionsTest {
|
|||
private HttpRequest buildRequest(CreateSharedIpGroupOptions options) {
|
||||
injector.injectMembers(options);
|
||||
HttpRequest request = new HttpRequest(HttpMethod.POST, URI.create("http://localhost"));
|
||||
options.decorateRequest(request, ImmutableMap.of("name", "foo"));
|
||||
options.bindToRequest(request, ImmutableMap.of("name", "foo"));
|
||||
return request;
|
||||
}
|
||||
|
||||
|
|
|
@ -58,7 +58,7 @@ public class RebuildServerOptionsTest {
|
|||
private HttpRequest buildRequest(RebuildServerOptions options) {
|
||||
injector.injectMembers(options);
|
||||
HttpRequest request = new HttpRequest(HttpMethod.POST, URI.create("http://localhost"));
|
||||
options.decorateRequest(request, new HashMap<String, String>());
|
||||
options.bindToRequest(request, new HashMap<String, String>());
|
||||
return request;
|
||||
}
|
||||
|
||||
|
|
|
@ -27,16 +27,16 @@ import java.util.Collections;
|
|||
import java.util.concurrent.atomic.AtomicLong;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Provider;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.http.HttpException;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpRequestFilter;
|
||||
import org.jclouds.rackspace.Authentication;
|
||||
import org.jclouds.rackspace.reference.RackspaceHeaders;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Provider;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
/**
|
||||
* Signs the Rackspace request. This will update the Authentication Token before 24 hours is up.
|
||||
*
|
||||
|
@ -88,10 +88,9 @@ public class AuthenticateRequest implements HttpRequestFilter {
|
|||
authToken = new AtomicReference<String>();
|
||||
}
|
||||
|
||||
public HttpRequest filter(HttpRequest request) throws HttpException {
|
||||
public void filter(HttpRequest request) throws HttpException {
|
||||
request.getHeaders().replaceValues(RackspaceHeaders.AUTH_TOKEN,
|
||||
Collections.singletonList(getAuthToken()));
|
||||
return request;
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue