removed unnecessary generic types and made RestAnnotationProcessor immutable

This commit is contained in:
Adrian Cole 2012-12-30 22:26:03 -08:00
parent e4a8b84da6
commit cddd35bc51
154 changed files with 422 additions and 2167 deletions

View File

@ -43,7 +43,7 @@ import org.jclouds.rest.internal.RestAnnotationProcessor;
*/
@Singleton
public class AtmosBlobRequestSigner implements BlobRequestSigner {
private final RestAnnotationProcessor<AtmosAsyncClient> processor;
private final RestAnnotationProcessor processor;
private final BlobToObject blobToObject;
private final BlobToHttpGetOptions blob2ObjectGetOptions;
@ -52,9 +52,9 @@ public class AtmosBlobRequestSigner implements BlobRequestSigner {
private final Method createMethod;
@Inject
public AtmosBlobRequestSigner(RestAnnotationProcessor<AtmosAsyncClient> processor, BlobToObject blobToObject,
public AtmosBlobRequestSigner(RestAnnotationProcessor.Factory processor, BlobToObject blobToObject,
BlobToHttpGetOptions blob2ObjectGetOptions) throws SecurityException, NoSuchMethodException {
this.processor = checkNotNull(processor, "processor");
this.processor = checkNotNull(processor, "processor").declaring(AtmosAsyncClient.class);
this.blobToObject = checkNotNull(blobToObject, "blobToObject");
this.blob2ObjectGetOptions = checkNotNull(blob2ObjectGetOptions, "blob2ObjectGetOptions");
this.getMethod = AtmosAsyncClient.class.getMethod("readFile", String.class, GetOptions[].class);

View File

@ -50,13 +50,11 @@ import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.http.options.GetOptions;
import org.jclouds.rest.ConfiguresRestClient;
import org.jclouds.rest.internal.BaseAsyncClientTest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.google.common.base.Supplier;
import com.google.inject.Module;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code AtmosAsyncClient}
@ -301,12 +299,6 @@ public class AtmosAsyncClientTest extends BaseAsyncClientTest<AtmosAsyncClient>
assertEquals(request.getFilters().get(0).getClass(), SignRequest.class);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<AtmosAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<AtmosAsyncClient>>() {
};
}
@BeforeClass
@Override
protected void setupFactory() throws IOException {

View File

@ -35,13 +35,11 @@ import org.jclouds.date.TimeStamp;
import org.jclouds.http.HttpRequest;
import org.jclouds.rest.ConfiguresRestClient;
import org.jclouds.rest.internal.BaseAsyncClientTest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.google.common.base.Supplier;
import com.google.inject.Module;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code AtmosBlobRequestSigner}
@ -123,12 +121,6 @@ public class AtmosBlobRequestSignerTest extends BaseAsyncClientTest<AtmosAsyncCl
assertEquals(request.getFilters().get(0).getClass(), SignRequest.class);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<AtmosAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<AtmosAsyncClient>>() {
};
}
@Override
protected Module createModule() {
return new TestAtmosRestClientModule();

View File

@ -65,13 +65,11 @@ import org.jclouds.openstack.keystone.v1_1.domain.Auth;
import org.jclouds.openstack.keystone.v1_1.parse.ParseAuthTest;
import org.jclouds.rest.ConfiguresRestClient;
import org.jclouds.rest.internal.BaseAsyncClientTest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
import com.google.inject.Module;
import com.google.inject.Provides;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code CloudServersAsyncClient}
@ -868,12 +866,6 @@ public class CloudServersAsyncClientTest extends BaseAsyncClientTest<CloudServer
checkFilters(request);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<CloudServersAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<CloudServersAsyncClient>>() {
};
}
@Override
protected void checkFilters(HttpRequest request) {
assertEquals(request.getFilters().size(), 2);

View File

@ -48,12 +48,10 @@ import org.jclouds.http.HttpRequest;
import org.jclouds.http.filters.BasicAuthentication;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.rest.internal.BaseAsyncClientTest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code CloudSigmaAsyncClient}
@ -641,12 +639,6 @@ public class CloudSigmaAsyncClientTest extends BaseAsyncClientTest<CloudSigmaAsy
assertEquals(request.getFilters().get(0).getClass(), BasicAuthentication.class);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<CloudSigmaAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<CloudSigmaAsyncClient>>() {
};
}
@Override
protected ApiMetadata createApiMetadata() {
return new CloudSigmaApiMetadata();

View File

@ -23,12 +23,9 @@ import java.util.concurrent.ExecutionException;
import org.jclouds.cloudstack.internal.BaseCloudStackAsyncClientTest;
import org.jclouds.http.HttpRequest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code CloudStackAsyncClient}
*
@ -106,12 +103,6 @@ public class CloudStackAsyncClientTest extends BaseCloudStackAsyncClientTest<Clo
assert globalAsyncClient.getAccountClient() != null;
}
@Override
protected TypeLiteral<RestAnnotationProcessor<CloudStackAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<CloudStackAsyncClient>>() {
};
}
@BeforeClass
@Override
protected void setupFactory() throws IOException {

View File

@ -28,11 +28,9 @@ import org.jclouds.cloudstack.options.ListAccountsOptions;
import org.jclouds.functions.IdentityFunction;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.common.base.Functions;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code AccountAsyncClient}
@ -97,9 +95,4 @@ public class AccountAsyncClientTest extends BaseCloudStackAsyncClientTest<Accoun
}
@Override
protected TypeLiteral<RestAnnotationProcessor<AccountAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<AccountAsyncClient>>() {
};
}
}

View File

@ -33,11 +33,9 @@ import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.http.functions.UnwrapOnlyJsonValue;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.common.base.Functions;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code AddressAsyncClient}
@ -136,10 +134,4 @@ public class AddressAsyncClientTest extends BaseCloudStackAsyncClientTest<Addres
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<AddressAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<AddressAsyncClient>>() {
};
}
}

View File

@ -28,11 +28,8 @@ import org.jclouds.cloudstack.functions.ParseAsyncJobsFromHttpResponse;
import org.jclouds.cloudstack.internal.BaseCloudStackAsyncClientTest;
import org.jclouds.cloudstack.options.ListAsyncJobsOptions;
import org.jclouds.http.HttpRequest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code AsyncJobAsyncClient}
*
@ -94,10 +91,4 @@ public class AsyncJobAsyncClientTest extends BaseCloudStackAsyncClientTest<Async
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<AsyncJobAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<AsyncJobAsyncClient>>() {
};
}
}

View File

@ -25,11 +25,8 @@ import org.jclouds.cloudstack.internal.BaseCloudStackAsyncClientTest;
import org.jclouds.fallbacks.MapHttp4xxCodesToExceptions;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code ConfigurationAsyncClient}
*
@ -56,10 +53,4 @@ public class ConfigurationAsyncClientTest extends BaseCloudStackAsyncClientTest<
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<ConfigurationAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<ConfigurationAsyncClient>>() {
};
}
}

View File

@ -25,11 +25,8 @@ import org.jclouds.cloudstack.internal.BaseCloudStackAsyncClientTest;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.http.functions.UnwrapOnlyJsonValue;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code DomainAccountAsyncClient}
*
@ -69,10 +66,4 @@ public class DomainAccountAsyncClientTest extends BaseCloudStackAsyncClientTest<
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<DomainAccountAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<DomainAccountAsyncClient>>() {
};
}
}

View File

@ -27,11 +27,8 @@ import org.jclouds.cloudstack.internal.BaseCloudStackAsyncClientTest;
import org.jclouds.fallbacks.MapHttp4xxCodesToExceptions;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code DomainLimitAsyncClient}
*
@ -58,10 +55,4 @@ public class DomainLimitAsyncClientTest extends BaseCloudStackAsyncClientTest<Do
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<DomainLimitAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<DomainLimitAsyncClient>>() {
};
}
}

View File

@ -27,11 +27,8 @@ import org.jclouds.cloudstack.internal.BaseCloudStackAsyncClientTest;
import org.jclouds.cloudstack.options.ListEventsOptions;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code EventAsyncClient}
*
@ -91,11 +88,4 @@ public class EventAsyncClientTest extends BaseCloudStackAsyncClientTest<EventAsy
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<EventAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<EventAsyncClient>>() {
};
}
}

View File

@ -31,11 +31,8 @@ import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.http.functions.UnwrapOnlyJsonValue;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code FirewallAsyncClient}
*
@ -117,10 +114,4 @@ public class FirewallAsyncClientTest extends BaseCloudStackAsyncClientTest<Firew
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<FirewallAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<FirewallAsyncClient>>() {
};
}
}

View File

@ -28,11 +28,8 @@ import org.jclouds.cloudstack.options.UpdateAccountOptions;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code GlobalAccountAsyncClient}
*
@ -93,10 +90,4 @@ public class GlobalAccountAsyncClientTest extends BaseCloudStackAsyncClientTest<
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<GlobalAccountAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<GlobalAccountAsyncClient>>() {
};
}
}

View File

@ -26,11 +26,8 @@ import org.jclouds.cloudstack.internal.BaseCloudStackAsyncClientTest;
import org.jclouds.cloudstack.options.ListAlertsOptions;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code GlobalAlertsAsyncClient}
*
@ -74,11 +71,4 @@ public class GlobalAlertAsyncClientTest extends BaseCloudStackAsyncClientTest<Gl
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<GlobalAlertAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<GlobalAlertAsyncClient>>() {
};
}
}

View File

@ -27,11 +27,8 @@ import org.jclouds.cloudstack.internal.BaseCloudStackAsyncClientTest;
import org.jclouds.cloudstack.options.ListCapacityOptions;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code GlobalCapacityAsyncClient}
*
@ -73,11 +70,4 @@ public class GlobalCapacityAsyncClientTest extends BaseCloudStackAsyncClientTest
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<GlobalCapacityAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<GlobalCapacityAsyncClient>>() {
};
}
}

View File

@ -25,11 +25,8 @@ import org.jclouds.cloudstack.internal.BaseCloudStackAsyncClientTest;
import org.jclouds.cloudstack.options.ListHostsOptions;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code GlobalHostAsyncClient}
*
@ -53,10 +50,4 @@ public class GlobalHostAsyncClientTest extends BaseCloudStackAsyncClientTest<Glo
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<GlobalHostAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<GlobalHostAsyncClient>>() {
};
}
}

View File

@ -30,11 +30,8 @@ import org.jclouds.cloudstack.options.UpdateServiceOfferingOptions;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code GlobalOfferingAsyncClient}
*
@ -159,10 +156,4 @@ public class GlobalOfferingAsyncClientTest extends BaseCloudStackAsyncClientTest
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<GlobalOfferingAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<GlobalOfferingAsyncClient>>() {
};
}
}

View File

@ -34,7 +34,6 @@ import org.jclouds.cloudstack.internal.BaseCloudStackClientLiveTest;
import org.jclouds.cloudstack.options.CreatePodOptions;
import org.jclouds.cloudstack.options.ListPodsOptions;
import org.jclouds.cloudstack.options.UpdatePodOptions;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterGroups;
import org.testng.annotations.Test;

View File

@ -25,11 +25,8 @@ import org.jclouds.cloudstack.options.ListStoragePoolsOptions;
import org.jclouds.fallbacks.MapHttp4xxCodesToExceptions;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code GlobalStoragePoolAsyncClient}
*
@ -69,10 +66,4 @@ public class GlobalStoragePoolAsyncClientTest extends BaseCloudStackAsyncClientT
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<GlobalStoragePoolAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<GlobalStoragePoolAsyncClient>>() {
};
}
}

View File

@ -28,11 +28,8 @@ import org.jclouds.cloudstack.options.ListUsageRecordsOptions;
import org.jclouds.fallbacks.MapHttp4xxCodesToExceptions;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code GlobalUsageAsyncClient}
*
@ -140,10 +137,4 @@ public class GlobalUsageAsyncClientTest extends BaseCloudStackAsyncClientTest<Gl
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<GlobalUsageAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<GlobalUsageAsyncClient>>() {
};
}
}

View File

@ -27,11 +27,8 @@ import org.jclouds.cloudstack.options.UpdateUserOptions;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code GlobalUserAsyncClient}
*/
@ -88,10 +85,4 @@ public class GlobalUserAsyncClientTest extends BaseCloudStackAsyncClientTest<Glo
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<GlobalUserAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<GlobalUserAsyncClient>>() {
};
}
}

View File

@ -30,11 +30,9 @@ import org.jclouds.cloudstack.options.ListOSTypesOptions;
import org.jclouds.functions.IdentityFunction;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.common.base.Functions;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code GuestOSAsyncClient}
@ -131,10 +129,4 @@ public class GuestOSAsyncClientTest extends BaseCloudStackAsyncClientTest<GuestO
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<GuestOSAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<GuestOSAsyncClient>>() {
};
}
}

View File

@ -25,11 +25,8 @@ import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
import org.jclouds.cloudstack.functions.ParseNamesFromHttpResponse;
import org.jclouds.cloudstack.internal.BaseCloudStackAsyncClientTest;
import org.jclouds.http.HttpRequest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code HypervisorAsyncClient}
*
@ -73,10 +70,4 @@ public class HypervisorAsyncClientTest extends BaseCloudStackAsyncClientTest<Hyp
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<HypervisorAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<HypervisorAsyncClient>>() {
};
}
}

View File

@ -33,11 +33,9 @@ import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.http.functions.UnwrapOnlyJsonValue;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableSet;
import com.google.inject.TypeLiteral;
/**
* Tests the behaviour of ISOAsyncClient.
*
@ -255,11 +253,4 @@ public class ISOAsyncClientTest extends BaseCloudStackAsyncClientTest<ISOAsyncCl
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<ISOAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<ISOAsyncClient>>() {
};
}
}

View File

@ -26,11 +26,8 @@ import org.jclouds.cloudstack.internal.BaseCloudStackAsyncClientTest;
import org.jclouds.cloudstack.options.ListResourceLimitsOptions;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code LimitAsyncClient}
*
@ -72,10 +69,4 @@ public class LimitAsyncClientTest extends BaseCloudStackAsyncClientTest<LimitAsy
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<LimitAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<LimitAsyncClient>>() {
};
}
}

View File

@ -31,11 +31,8 @@ import org.jclouds.cloudstack.options.UpdateLoadBalancerRuleOptions;
import org.jclouds.fallbacks.MapHttp4xxCodesToExceptions;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code LoadBalancerAsyncClient}
*
@ -151,10 +148,4 @@ public class LoadBalancerAsyncClientTest extends BaseCloudStackAsyncClientTest<L
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<LoadBalancerAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<LoadBalancerAsyncClient>>() {
};
}
}

View File

@ -31,11 +31,8 @@ import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.http.functions.UnwrapOnlyJsonValue;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code NATAsyncClient}
*
@ -187,10 +184,4 @@ public class NATAsyncClientTest extends BaseCloudStackAsyncClientTest<NATAsyncCl
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<NATAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<NATAsyncClient>>() {
};
}
}

View File

@ -31,11 +31,9 @@ import org.jclouds.fallbacks.MapHttp4xxCodesToExceptions;
import org.jclouds.functions.IdentityFunction;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.common.base.Functions;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code NetworkAsyncClient}
@ -155,10 +153,4 @@ public class NetworkAsyncClientTest extends BaseCloudStackAsyncClientTest<Networ
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<NetworkAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<NetworkAsyncClient>>() {
};
}
}

View File

@ -32,11 +32,9 @@ import org.jclouds.cloudstack.options.ListServiceOfferingsOptions;
import org.jclouds.functions.IdentityFunction;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.common.base.Functions;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code OfferingAsyncClient}
@ -206,10 +204,4 @@ public class OfferingAsyncClientTest extends BaseCloudStackAsyncClientTest<Offer
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<OfferingAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<OfferingAsyncClient>>() {
};
}
}

View File

@ -36,11 +36,9 @@ import org.jclouds.functions.IdentityFunction;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.common.base.Functions;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code SSHKeyPairAsyncClient}
@ -137,11 +135,4 @@ public class SSHKeyPairAsyncClientTest extends BaseCloudStackAsyncClientTest<SSH
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<SSHKeyPairAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<SSHKeyPairAsyncClient>>() {
};
}
}

View File

@ -32,14 +32,12 @@ import org.jclouds.functions.IdentityFunction;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.common.base.Functions;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Multimap;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code SecurityGroupAsyncClient}
@ -237,10 +235,4 @@ public class SecurityGroupAsyncClientTest extends BaseCloudStackAsyncClientTest<
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<SecurityGroupAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<SecurityGroupAsyncClient>>() {
};
}
}

View File

@ -36,12 +36,10 @@ import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.http.functions.UnwrapOnlyJsonValue;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.common.base.Functions;
import com.google.common.collect.ImmutableSet;
import com.google.inject.TypeLiteral;
/**
* Tests the behaviour of SnapshotAsyncClient.
@ -231,10 +229,4 @@ public class SnapshotAsyncClientTest extends BaseCloudStackAsyncClientTest<Snaps
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<SnapshotAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<SnapshotAsyncClient>>() {
};
}
}

View File

@ -42,12 +42,10 @@ import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.http.functions.UnwrapOnlyJsonValue;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.common.base.Functions;
import com.google.common.collect.ImmutableSet;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code TemplateAsyncClient}
@ -342,10 +340,4 @@ public class TemplateAsyncClientTest extends BaseCloudStackAsyncClientTest<Templ
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<TemplateAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<TemplateAsyncClient>>() {
};
}
}

View File

@ -33,11 +33,9 @@ import org.jclouds.functions.IdentityFunction;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.common.base.Functions;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code VMGroupAsyncClient}
@ -170,10 +168,4 @@ public class VMGroupAsyncClientTest extends BaseCloudStackAsyncClientTest<VMGrou
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<VMGroupAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<VMGroupAsyncClient>>() {
};
}
}

View File

@ -32,11 +32,9 @@ import org.jclouds.functions.IdentityFunction;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.http.functions.UnwrapOnlyJsonValue;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.common.base.Functions;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code VirtualMachineAsyncClient}
@ -260,10 +258,4 @@ public class VirtualMachineAsyncClientTest extends BaseCloudStackAsyncClientTest
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<VirtualMachineAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<VirtualMachineAsyncClient>>() {
};
}
}

View File

@ -27,11 +27,8 @@ import org.jclouds.Fallbacks.VoidOnNotFoundOr404;
import org.jclouds.cloudstack.internal.BaseCloudStackAsyncClientTest;
import org.jclouds.cloudstack.options.ListVolumesOptions;
import org.jclouds.http.HttpRequest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code EventAsyncClient}
*
@ -149,10 +146,4 @@ public class VolumeAsyncClientTest extends BaseCloudStackAsyncClientTest<VolumeA
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<VolumeAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<VolumeAsyncClient>>() {
};
}
}

View File

@ -28,12 +28,10 @@ import org.jclouds.cloudstack.options.ListZonesOptions;
import org.jclouds.functions.IdentityFunction;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.common.base.Functions;
import com.google.common.collect.Iterables;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code ZoneAsyncClient}
@ -106,10 +104,4 @@ public class ZoneAsyncClientTest extends BaseCloudStackAsyncClientTest<ZoneAsync
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<ZoneAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<ZoneAsyncClient>>() {
};
}
}

View File

@ -41,14 +41,12 @@ import org.jclouds.location.config.LocationModule;
import org.jclouds.location.suppliers.RegionIdToURISupplier;
import org.jclouds.rest.ConfiguresRestClient;
import org.jclouds.rest.internal.BaseAsyncApiTest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.jclouds.util.Suppliers2;
import org.testng.annotations.Test;
import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableMap;
import com.google.inject.Module;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code CloudWatchAsyncApi}
@ -82,11 +80,6 @@ public class CloudWatchAsyncApiTest extends BaseAsyncApiTest<CloudWatchAsyncApi>
checkFilters(request);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<CloudWatchAsyncApi>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<CloudWatchAsyncApi>>() {
};
}
@ConfiguresRestClient
private static final class TestMonitoringRestClientModule extends CloudWatchRestClientModule {
@ -129,4 +122,5 @@ public class CloudWatchAsyncApiTest extends BaseAsyncApiTest<CloudWatchAsyncApi>
assertEquals(request.getFilters().get(0).getClass(), FormSigner.class);
}
}

View File

@ -23,12 +23,9 @@ import java.util.concurrent.ExecutionException;
import org.jclouds.ec2.services.BaseEC2AsyncClientTest;
import org.jclouds.http.HttpRequest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code EC2AsyncClient}
*
@ -64,12 +61,6 @@ public class EC2AsyncClientTest extends BaseEC2AsyncClientTest<EC2AsyncClient> {
assert asyncClient.getWindowsServices() != null;
}
@Override
protected TypeLiteral<RestAnnotationProcessor<EC2AsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<EC2AsyncClient>>() {
};
}
@BeforeClass
@Override
protected void setupFactory() throws IOException {

View File

@ -25,12 +25,9 @@ import java.io.IOException;
import org.jclouds.ec2.services.BaseEC2AsyncClientTest;
import org.jclouds.ec2.services.InstanceAsyncClient;
import org.jclouds.http.HttpRequest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code BindS3UploadPolicyAndSignature}
*
@ -63,10 +60,4 @@ public class BindS3UploadPolicyAndSignatureTest extends BaseEC2AsyncClientTest<I
HttpRequest request = HttpRequest.builder().method("GET").endpoint("http://momma").build();
binder.bindToRequest(request, null);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<InstanceAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<InstanceAsyncClient>>() {
};
}
}

View File

@ -36,11 +36,9 @@ import org.jclouds.ec2.xml.PermissionHandler;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseSax;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code AMIAsyncClient}
@ -315,11 +313,4 @@ public class AMIAsyncClientTest extends BaseEC2AsyncClientTest<AMIAsyncClient> {
checkFilters(request);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<AMIAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<AMIAsyncClient>>() {
};
}
}

View File

@ -33,11 +33,8 @@ import org.jclouds.ec2.xml.DescribeAvailabilityZonesResponseHandler;
import org.jclouds.ec2.xml.DescribeRegionsResponseHandler;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseSax;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code AvailabilityZoneAndRegionAsyncClient}
*
@ -117,11 +114,4 @@ public class AvailabilityZoneAndRegionAsyncClientTest extends
checkFilters(request);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<AvailabilityZoneAndRegionAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<AvailabilityZoneAndRegionAsyncClient>>() {
};
}
}

View File

@ -38,11 +38,9 @@ import org.jclouds.ec2.xml.SnapshotHandler;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseSax;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code ElasticBlockStoreAsyncClient}
@ -307,11 +305,4 @@ public class ElasticBlockStoreAsyncClientTest extends BaseEC2AsyncClientTest<Ela
checkFilters(request);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<ElasticBlockStoreAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<ElasticBlockStoreAsyncClient>>() {
};
}
}

View File

@ -28,11 +28,8 @@ import org.jclouds.ec2.xml.DescribeAddressesResponseHandler;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseSax;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code ElasticIPAddressAsyncClient}
*
@ -124,11 +121,4 @@ public class ElasticIPAddressAsyncClientTest extends BaseEC2AsyncClientTest<Elas
checkFilters(request);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<ElasticIPAddressAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<ElasticIPAddressAsyncClient>>() {
};
}
}

View File

@ -41,11 +41,9 @@ import org.jclouds.ec2.xml.UnencodeStringValueHandler;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseSax;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.common.collect.Maps;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code InstanceAsyncClient}
@ -505,11 +503,4 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest<InstanceAsyn
checkFilters(request);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<InstanceAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<InstanceAsyncClient>>() {
};
}
}

View File

@ -27,11 +27,8 @@ import org.jclouds.ec2.xml.DescribeKeyPairsResponseHandler;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseSax;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code KeyPairAsyncClient}
*
@ -90,11 +87,4 @@ public class KeyPairAsyncClientTest extends BaseEC2AsyncClientTest<KeyPairAsyncC
checkFilters(request);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<KeyPairAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<KeyPairAsyncClient>>() {
};
}
}

View File

@ -30,11 +30,8 @@ import org.jclouds.ec2.xml.DescribeSecurityGroupsResponseHandler;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseSax;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code SecurityGroupAsyncClient}
*
@ -204,11 +201,4 @@ public class SecurityGroupAsyncClientTest extends BaseEC2AsyncClientTest<Securit
checkFilters(request);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<SecurityGroupAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<SecurityGroupAsyncClient>>() {
};
}
}

View File

@ -27,11 +27,8 @@ import org.jclouds.ec2.xml.BundleTaskHandler;
import org.jclouds.ec2.xml.DescribeBundleTasksResponseHandler;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseSax;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code WindowsAsyncClient}
*
@ -119,11 +116,4 @@ public class WindowsAsyncClientTest extends BaseEC2AsyncClientTest<WindowsAsyncC
checkFilters(request);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<WindowsAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<WindowsAsyncClient>>() {
};
}
}

View File

@ -47,12 +47,10 @@ import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.io.Payload;
import org.jclouds.io.Payloads;
import org.jclouds.rest.internal.BaseAsyncClientTest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code ElasticStackAsyncClient}
@ -446,12 +444,6 @@ public class ElasticStackAsyncClientTest extends BaseAsyncClientTest<ElasticStac
assertEquals(request.getFilters().get(0).getClass(), BasicAuthentication.class);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<ElasticStackAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<ElasticStackAsyncClient>>() {
};
}
@Override
protected ApiMetadata createApiMetadata() {
return new ElasticStackApiMetadata();

View File

@ -221,56 +221,7 @@ public class NovaErrorHandlerTest {
new OverLimitParser(new GsonWrapper(new Gson())));
private HttpCommand command() {
return new HttpCommand() {
private Exception exception;
@Override
public int getRedirectCount() {
return 0;
}
@Override
public int incrementRedirectCount() {
return 0;
}
@Override
public boolean isReplayable() {
return false;
}
@Override
public Exception getException() {
return exception;
}
@Override
public int getFailureCount() {
return 0;
}
@Override
public int incrementFailureCount() {
return 0;
}
@Override
public void setException(Exception exception) {
this.exception = exception;
}
@Override
public HttpRequest getCurrentRequest() {
return HttpRequest.builder().method("POST").endpoint("https://nova/v1.1/servers").build();
}
@Override
public void setCurrentRequest(HttpRequest request) {
}
};
return new HttpCommand(HttpRequest.builder().method("POST").endpoint("https://nova/v1.1/servers").build());
}
}

View File

@ -43,7 +43,7 @@ import org.jclouds.s3.options.PutObjectOptions;
*/
@Singleton
public class S3BlobRequestSigner implements BlobRequestSigner {
private final RestAnnotationProcessor<S3AsyncClient> processor;
private final RestAnnotationProcessor processor;
private final BlobToObject blobToObject;
private final BlobToHttpGetOptions blob2HttpGetOptions;
@ -52,9 +52,9 @@ public class S3BlobRequestSigner implements BlobRequestSigner {
private final Method createMethod;
@Inject
public S3BlobRequestSigner(RestAnnotationProcessor<S3AsyncClient> processor, BlobToObject blobToObject,
public S3BlobRequestSigner(RestAnnotationProcessor.Factory processor, BlobToObject blobToObject,
BlobToHttpGetOptions blob2HttpGetOptions) throws SecurityException, NoSuchMethodException {
this.processor = checkNotNull(processor, "processor");
this.processor = checkNotNull(processor, "processor").declaring(S3AsyncClient.class);
this.blobToObject = checkNotNull(blobToObject, "blobToObject");
this.blob2HttpGetOptions = checkNotNull(blob2HttpGetOptions, "blob2HttpGetOptions");
this.getMethod = S3AsyncClient.class.getMethod("getObject", String.class, String.class, GetOptions[].class);

View File

@ -25,13 +25,10 @@ import java.lang.reflect.Method;
import java.util.Properties;
import org.jclouds.rest.internal.GeneratedHttpRequest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.jclouds.s3.S3AsyncClient;
import org.jclouds.s3.internal.BaseS3AsyncClientTest;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code BindAsHostPrefixIfConfigured}
*
@ -41,12 +38,6 @@ import com.google.inject.TypeLiteral;
@Test(groups = "unit", testName = "BindAsHostPrefixIfConfiguredNoPathTest")
public class BindAsHostPrefixIfConfiguredNoPathTest extends BaseS3AsyncClientTest<S3AsyncClient> {
@Override
protected TypeLiteral<RestAnnotationProcessor<S3AsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<S3AsyncClient>>() {
};
}
public void testBucketWithHostnameStyle() throws IOException, SecurityException, NoSuchMethodException {
Method method = S3AsyncClient.class.getMethod("deleteObject", String.class, String.class);

View File

@ -27,14 +27,11 @@ import java.lang.reflect.Method;
import java.util.Properties;
import org.jclouds.http.HttpRequest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.jclouds.s3.S3AsyncClient;
import org.jclouds.s3.internal.BaseS3AsyncClientTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code BindAsHostPrefixIfConfigured}
*
@ -44,12 +41,6 @@ import com.google.inject.TypeLiteral;
@Test(groups = "unit", testName = "BindAsHostPrefixIfConfiguredTest")
public class BindAsHostPrefixIfConfiguredTest extends BaseS3AsyncClientTest<S3AsyncClient> {
@Override
protected TypeLiteral<RestAnnotationProcessor<S3AsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<S3AsyncClient>>() {
};
}
public void testBucket() throws IOException {
HttpRequest request = HttpRequest.builder().method("GET").endpoint("http://euc/services/Walrus").build();

View File

@ -23,13 +23,10 @@ import static org.testng.Assert.assertEquals;
import java.io.IOException;
import org.jclouds.http.HttpRequest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.jclouds.s3.S3AsyncClient;
import org.jclouds.s3.internal.BaseS3AsyncClientTest;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code BindNoBucketLoggingToXmlPayload}
*
@ -39,12 +36,6 @@ import com.google.inject.TypeLiteral;
@Test(groups = "unit", testName = "BindNoBucketLoggingToXmlPayloadTest")
public class BindNoBucketLoggingToXmlPayloadTest extends BaseS3AsyncClientTest<S3AsyncClient> {
@Override
protected TypeLiteral<RestAnnotationProcessor<S3AsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<S3AsyncClient>>() {
};
}
public void testApplyInputStream() throws IOException {
HttpRequest request = HttpRequest.builder().method("GET").endpoint("http://test").build();

View File

@ -27,7 +27,6 @@ import org.jclouds.blobstore.binders.BindMapToHeadersWithPrefix;
import org.jclouds.http.HttpRequest;
import org.jclouds.io.Payload;
import org.jclouds.io.Payloads;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.jclouds.s3.S3AsyncClient;
import org.jclouds.s3.domain.S3Object;
import org.jclouds.s3.internal.BaseS3AsyncClientTest;
@ -35,7 +34,6 @@ import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMultimap;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code BindS3ObjectMetadataToRequest}
@ -46,12 +44,6 @@ import com.google.inject.TypeLiteral;
@Test(groups = "unit", testName = "BindS3ObjectMetadataToRequestTest")
public class BindS3ObjectMetadataToRequestTest extends BaseS3AsyncClientTest<S3AsyncClient> {
@Override
protected TypeLiteral<RestAnnotationProcessor<S3AsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<S3AsyncClient>>() {
};
}
@Test
public void testPassWithMinimumDetailsAndPayload5GB() {
S3Object object = injector.getInstance(S3Object.Factory.class).create(null);

View File

@ -28,7 +28,6 @@ import javax.ws.rs.core.HttpHeaders;
import org.jclouds.blobstore.binders.BindBlobToMultipartFormTest;
import org.jclouds.http.HttpRequest;
import org.jclouds.rest.internal.GeneratedHttpRequest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.jclouds.s3.S3AsyncClient;
import org.jclouds.s3.domain.AccessControlList;
import org.jclouds.s3.domain.CannedAccessPolicy;
@ -41,7 +40,6 @@ import org.testng.annotations.Test;
import com.google.common.collect.SortedSetMultimap;
import com.google.common.collect.TreeMultimap;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code RequestAuthorizeSignature}
@ -52,12 +50,6 @@ import com.google.inject.TypeLiteral;
@Test(groups = "unit", testName = "RequestAuthorizeSignatureTest")
public class RequestAuthorizeSignatureTest extends BaseS3AsyncClientTest<S3AsyncClient> {
@Override
protected TypeLiteral<RestAnnotationProcessor<S3AsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<S3AsyncClient>>() {
};
}
@DataProvider(parallel = true)
public Object[][] dataProvider() throws NoSuchMethodException {
return new Object[][] { { listOwnedBuckets() }, { putObject() }, { putBucketAcl() }

View File

@ -83,56 +83,10 @@ public class SQSErrorRetryHandlerTest {
assertTrue(watch.stop().elapsedTime(TimeUnit.MILLISECONDS) < 100);
}
//TODO: make a builder for this
HttpCommand createHttpCommandForFailureCount(final int failureCount) {
return new HttpCommand() {
int fCount = failureCount;
@Override
public int incrementRedirectCount() {
return 0;
}
@Override
public int getRedirectCount() {
return 0;
}
@Override
public boolean isReplayable() {
return false;
}
@Override
public int incrementFailureCount() {
return ++fCount;
}
@Override
public int getFailureCount() {
return fCount;
}
@Override
public HttpRequest getCurrentRequest() {
return null;
}
@Override
public void setCurrentRequest(HttpRequest request) {
}
@Override
public void setException(Exception exception) {
}
@Override
public Exception getException() {
return null;
}
};
HttpCommand command = new HttpCommand(HttpRequest.builder().method("GET").endpoint("http://localhost").build());
while (command.getFailureCount() != failureCount)
command.incrementFailureCount();
return command;
}
}

View File

@ -54,7 +54,7 @@ import com.google.inject.Provider;
@Singleton
public class SwiftBlobSigner<T extends CommonSwiftAsyncClient> implements BlobRequestSigner {
private final RestAnnotationProcessor<T> processor;
private final RestAnnotationProcessor processor;
private final Crypto crypto;
private final Provider<Long> unixEpochTimestampProvider;
@ -77,9 +77,9 @@ public class SwiftBlobSigner<T extends CommonSwiftAsyncClient> implements BlobRe
protected SwiftBlobSigner(BlobToObject blobToObject, BlobToHttpGetOptions blob2HttpGetOptions, Crypto crypto,
@TimeStamp Provider<Long> unixEpochTimestampProvider,
@TemporaryUrlKey Supplier<String> temporaryUrlKeySupplier,
RestAnnotationProcessor<T> processor)
RestAnnotationProcessor.Factory processor, Class<T> clazz)
throws SecurityException, NoSuchMethodException {
this.processor = checkNotNull(processor, "processor");
this.processor = checkNotNull(processor, "processor").declaring(clazz);
this.crypto = checkNotNull(crypto, "crypto");
this.unixEpochTimestampProvider = checkNotNull(unixEpochTimestampProvider, "unixEpochTimestampProvider");
@ -88,9 +88,9 @@ public class SwiftBlobSigner<T extends CommonSwiftAsyncClient> implements BlobRe
this.blobToObject = checkNotNull(blobToObject, "blobToObject");
this.blob2HttpGetOptions = checkNotNull(blob2HttpGetOptions, "blob2HttpGetOptions");
this.getMethod = processor.getDeclaring().getMethod("getObject", String.class, String.class, GetOptions[].class);
this.deleteMethod = processor.getDeclaring().getMethod("removeObject", String.class, String.class);
this.createMethod = processor.getDeclaring().getMethod("putObject", String.class, SwiftObject.class);
this.getMethod = clazz.getMethod("getObject", String.class, String.class, GetOptions[].class);
this.deleteMethod = clazz.getMethod("removeObject", String.class, String.class);
this.createMethod = clazz.getMethod("putObject", String.class, SwiftObject.class);
}
@Override

View File

@ -38,7 +38,6 @@ import org.jclouds.openstack.swift.blobstore.config.SwiftBlobStoreContextModule;
import org.jclouds.openstack.swift.blobstore.config.TemporaryUrlExtensionModule;
import org.jclouds.openstack.swift.config.SwiftRestClientModule;
import org.jclouds.rest.internal.BaseAsyncClientTest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.common.base.Supplier;
@ -58,15 +57,8 @@ import com.google.inject.TypeLiteral;
public abstract class CommonSwiftClientTest extends BaseAsyncClientTest<SwiftAsyncClient> {
public static final long UNIX_EPOCH_TIMESTAMP = 123456789L;
public static final String TEMPORARY_URL_KEY = "get-or-set-X-Account-Meta-Temp-Url-Key";
@Override
protected TypeLiteral<RestAnnotationProcessor<SwiftAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<SwiftAsyncClient>>() {
};
}
@Override
protected void checkFilters(HttpRequest request) {
}

View File

@ -21,15 +21,12 @@ package org.jclouds.vcloud;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.jclouds.vcloud.internal.BaseVCloudAsyncClientTest;
import org.jclouds.vcloud.utils.TestUtils;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code VCloudAsyncClient}
*
@ -40,12 +37,6 @@ import com.google.inject.TypeLiteral;
@Test(groups = "unit", testName = "VCloudAsyncClientTest")
public class VCloudAsyncClientTest extends BaseVCloudAsyncClientTest<VCloudAsyncClient> {
@Override
protected TypeLiteral<RestAnnotationProcessor<VCloudAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<VCloudAsyncClient>>() {
};
}
private VCloudAsyncClient asyncClient;
private VCloudClient syncClient;

View File

@ -28,12 +28,9 @@ import org.jclouds.http.functions.ParseSax;
import org.jclouds.providers.AnonymousProviderMetadata;
import org.jclouds.providers.ProviderMetadata;
import org.jclouds.rest.internal.BaseAsyncClientTest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.jclouds.vcloud.xml.SupportedVersionsHandler;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code VCloudVersionsAsyncClient}
*
@ -63,12 +60,6 @@ public class VCloudVersionsAsyncClientTest extends BaseAsyncClientTest<VCloudVer
assertEquals(request.getFilters().size(), 0);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<VCloudVersionsAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<VCloudVersionsAsyncClient>>() {
};
}
@Override
protected ProviderMetadata createProviderMetadata() {
return AnonymousProviderMetadata.forClientMappedToAsyncClientOnEndpoint(VCloudVersionsClient.class,

View File

@ -25,15 +25,12 @@ import java.net.URI;
import org.jclouds.Fallbacks.NullOnNotFoundOr404;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseSax;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.jclouds.vcloud.internal.BaseVCloudAsyncClientTest;
import org.jclouds.vcloud.options.CatalogItemOptions;
import org.jclouds.vcloud.xml.CatalogHandler;
import org.jclouds.vcloud.xml.CatalogItemHandler;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code CatalogAsyncClient}
*
@ -44,12 +41,6 @@ import com.google.inject.TypeLiteral;
@Test(groups = "unit", testName = "CatalogAsyncClientTest")
public class CatalogAsyncClientTest extends BaseVCloudAsyncClientTest<CatalogAsyncClient> {
@Override
protected TypeLiteral<RestAnnotationProcessor<CatalogAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<CatalogAsyncClient>>() {
};
}
public void testCatalog() throws SecurityException, NoSuchMethodException, IOException {
Method method = CatalogAsyncClient.class.getMethod("getCatalog", URI.class);
HttpRequest request = processor.createRequest(method, URI

View File

@ -25,13 +25,10 @@ import java.net.URI;
import org.jclouds.Fallbacks.NullOnNotFoundOr404;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseSax;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.jclouds.vcloud.internal.BaseVCloudAsyncClientTest;
import org.jclouds.vcloud.xml.OrgNetworkHandler;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code NetworkAsyncClient}
*
@ -42,12 +39,6 @@ import com.google.inject.TypeLiteral;
@Test(groups = "unit", testName = "NetworkAsyncClientTest")
public class NetworkAsyncClientTest extends BaseVCloudAsyncClientTest<NetworkAsyncClient> {
@Override
protected TypeLiteral<RestAnnotationProcessor<NetworkAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<NetworkAsyncClient>>() {
};
}
public void testNetwork() throws SecurityException, NoSuchMethodException, IOException {
Method method = NetworkAsyncClient.class.getMethod("getNetwork", URI.class);
HttpRequest request = processor.createRequest(method, URI

View File

@ -26,14 +26,11 @@ import org.jclouds.Fallbacks.NullOnNotFoundOr404;
import org.jclouds.fallbacks.MapHttp4xxCodesToExceptions;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseSax;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.jclouds.vcloud.internal.BaseVCloudAsyncClientTest;
import org.jclouds.vcloud.xml.OrgHandler;
import org.jclouds.vcloud.xml.OrgListHandler;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code OrgAsyncClient}
*
@ -44,12 +41,6 @@ import com.google.inject.TypeLiteral;
@Test(groups = "unit", testName = "OrgAsyncClientTest")
public class OrgAsyncClientTest extends BaseVCloudAsyncClientTest<OrgAsyncClient> {
@Override
protected TypeLiteral<RestAnnotationProcessor<OrgAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<OrgAsyncClient>>() {
};
}
public void testlistOrgs() throws SecurityException, NoSuchMethodException, IOException {
Method method = OrgAsyncClient.class.getMethod("listOrgs");
HttpRequest request = processor.createRequest(method);

View File

@ -26,14 +26,11 @@ import org.jclouds.Fallbacks.NullOnNotFoundOr404;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseSax;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.jclouds.vcloud.internal.BaseVCloudAsyncClientTest;
import org.jclouds.vcloud.xml.TaskHandler;
import org.jclouds.vcloud.xml.TasksListHandler;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code TaskAsyncClient}
*
@ -44,12 +41,6 @@ import com.google.inject.TypeLiteral;
@Test(groups = "unit", testName = "TaskAsyncClientTest")
public class TaskAsyncClientTest extends BaseVCloudAsyncClientTest<TaskAsyncClient> {
@Override
protected TypeLiteral<RestAnnotationProcessor<TaskAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<TaskAsyncClient>>() {
};
}
public void testGetTasksList() throws SecurityException, NoSuchMethodException, IOException {
Method method = TaskAsyncClient.class.getMethod("getTasksList", URI.class);
HttpRequest request = processor.createRequest(method, URI

View File

@ -27,7 +27,6 @@ import org.jclouds.Fallbacks.VoidOnNotFoundOr404;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseSax;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.jclouds.util.Strings2;
import org.jclouds.vcloud.internal.BaseVCloudAsyncClientTest;
import org.jclouds.vcloud.options.CloneVAppOptions;
@ -35,8 +34,6 @@ import org.jclouds.vcloud.xml.TaskHandler;
import org.jclouds.vcloud.xml.VAppHandler;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code VAppAsyncClient}
*
@ -47,12 +44,6 @@ import com.google.inject.TypeLiteral;
@Test(groups = "unit", testName = "VAppAsyncClientTest")
public class VAppAsyncClientTest extends BaseVCloudAsyncClientTest<VAppAsyncClient> {
@Override
protected TypeLiteral<RestAnnotationProcessor<VAppAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<VAppAsyncClient>>() {
};
}
public void testopyVAppToVDCAndName() throws SecurityException, NoSuchMethodException, IOException {
Method method = VAppAsyncClient.class.getMethod("copyVAppToVDCAndName", URI.class, URI.class, String.class,
CloneVAppOptions[].class);

View File

@ -28,7 +28,6 @@ import org.jclouds.Fallbacks.NullOnNotFoundOr404;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseSax;
import org.jclouds.ovf.xml.EnvelopeHandler;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.jclouds.util.Strings2;
import org.jclouds.vcloud.domain.network.FenceMode;
import org.jclouds.vcloud.domain.network.NetworkConfig;
@ -41,8 +40,6 @@ import org.jclouds.vcloud.xml.VAppHandler;
import org.jclouds.vcloud.xml.VAppTemplateHandler;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code VAppTemplateAsyncClient}
*
@ -53,12 +50,6 @@ import com.google.inject.TypeLiteral;
@Test(groups = "unit", testName = "VAppTemplateAsyncClientTest")
public class VAppTemplateAsyncClientTest extends BaseVCloudAsyncClientTest<VAppTemplateAsyncClient> {
@Override
protected TypeLiteral<RestAnnotationProcessor<VAppTemplateAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<VAppTemplateAsyncClient>>() {
};
}
public void testCreateVAppInVDCByInstantiatingTemplate() throws SecurityException, NoSuchMethodException,
IOException {
Method method = VAppTemplateAsyncClient.class.getMethod("createVAppInVDCByInstantiatingTemplate", String.class,

View File

@ -26,13 +26,10 @@ import java.util.NoSuchElementException;
import org.jclouds.Fallbacks.NullOnNotFoundOr404;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseSax;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.jclouds.vcloud.internal.BaseVCloudAsyncClientTest;
import org.jclouds.vcloud.xml.VDCHandler;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code VDCAsyncClient}
*
@ -43,12 +40,6 @@ import com.google.inject.TypeLiteral;
@Test(groups = "unit", testName = "VDCAsyncClientTest")
public class VDCAsyncClientTest extends BaseVCloudAsyncClientTest<VDCAsyncClient> {
@Override
protected TypeLiteral<RestAnnotationProcessor<VDCAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<VDCAsyncClient>>() {
};
}
@Test(expectedExceptions = NoSuchElementException.class)
public void testFindVDCInOrgNamedBadVDC() throws SecurityException, NoSuchMethodException, IOException {
Method method = VDCAsyncClient.class.getMethod("findVDCInOrgNamed", String.class, String.class);

View File

@ -27,7 +27,6 @@ import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseSax;
import org.jclouds.http.functions.ReleasePayloadAndReturn;
import org.jclouds.http.functions.ReturnInputStream;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.jclouds.util.Strings2;
import org.jclouds.vcloud.domain.GuestCustomizationSection;
import org.jclouds.vcloud.internal.BaseVCloudAsyncClientTest;
@ -37,8 +36,6 @@ import org.jclouds.vcloud.xml.VmHandler;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code VmAsyncClient}
*
@ -49,12 +46,6 @@ import com.google.inject.TypeLiteral;
@Test(groups = "unit", testName = "VmAsyncClientTest")
public class VmAsyncClientTest extends BaseVCloudAsyncClientTest<VmAsyncClient> {
@Override
protected TypeLiteral<RestAnnotationProcessor<VmAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<VmAsyncClient>>() {
};
}
public void testGetThumbnailOfVm() throws SecurityException, NoSuchMethodException, IOException {
Method method = VmAsyncClient.class.getMethod("getScreenThumbnailForVm", URI.class);
HttpRequest request = processor

View File

@ -32,7 +32,6 @@ import org.jclouds.location.Provider;
import org.jclouds.providers.AnonymousProviderMetadata;
import org.jclouds.providers.ProviderMetadata;
import org.jclouds.rest.internal.BaseAsyncClientTest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.jclouds.vcloud.endpoints.VCloudLogin;
import org.jclouds.vcloud.functions.ParseLoginResponseFromHeaders;
import org.testng.annotations.Test;
@ -41,7 +40,6 @@ import com.google.common.base.Supplier;
import com.google.inject.Binder;
import com.google.inject.Module;
import com.google.inject.Provides;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code VCloudLoginAsyncClient}
@ -73,12 +71,6 @@ public class VCloudLoginAsyncClientTest extends BaseAsyncClientTest<VCloudLoginA
assertEquals(request.getFilters().get(0).getClass(), BasicAuthentication.class);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<VCloudLoginAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<VCloudLoginAsyncClient>>() {
};
}
@Override
protected Module createModule() {
return new Module() {

View File

@ -369,47 +369,8 @@ public class LocalAsyncBlobStore extends BaseAsyncBlobStore {
public static HttpResponseException returnResponseException(int code) {
HttpResponse response = HttpResponse.builder().statusCode(code).build();
return new HttpResponseException(new HttpCommand() {
public int getRedirectCount() {
return 0;
}
public int incrementRedirectCount() {
return 0;
}
public boolean isReplayable() {
return false;
}
public Exception getException() {
return null;
}
public int getFailureCount() {
return 0;
}
public int incrementFailureCount() {
return 0;
}
public void setException(Exception exception) {
}
@Override
public HttpRequest getCurrentRequest() {
return HttpRequest.builder().method("GET").endpoint("http://stub").build();
}
@Override
public void setCurrentRequest(HttpRequest request) {
}
}, response);
return new HttpResponseException(new HttpCommand(HttpRequest.builder().method("GET").endpoint("http://stub")
.build()), response);
}
/**

View File

@ -29,12 +29,9 @@ import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.domain.BlobBuilder;
import org.jclouds.http.HttpRequest;
import org.jclouds.rest.internal.BaseAsyncClientTest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code LocalBlobRequestSigner}
*
@ -120,12 +117,6 @@ public class TransientBlobRequestSignerTest extends BaseAsyncClientTest<LocalAsy
protected void checkFilters(HttpRequest request) {
}
@Override
protected TypeLiteral<RestAnnotationProcessor<LocalAsyncBlobStore>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<LocalAsyncBlobStore>>() {
};
}
@Override
public ApiMetadata createApiMetadata() {
return new TransientApiMetadata();

View File

@ -29,11 +29,8 @@ import org.jclouds.http.IntegrationTestClient;
import org.jclouds.openstack.functions.ParseAuthenticationResponseFromHeaders;
import org.jclouds.rest.AnonymousRestApiMetadata;
import org.jclouds.rest.internal.BaseAsyncClientTest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code OpenStackAuthAsyncClient}
*
@ -80,11 +77,4 @@ public class OpenStackAuthAsyncClientTest extends BaseAsyncClientTest<OpenStackA
@Override
protected void checkFilters(HttpRequest request) {
}
@Override
protected TypeLiteral<RestAnnotationProcessor<OpenStackAuthAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<OpenStackAuthAsyncClient>>() {
};
}
}

View File

@ -21,7 +21,6 @@ package org.jclouds.trmk.vcloud_0_8.binders;
import static org.jclouds.trmk.vcloud_0_8.reference.TerremarkConstants.PROPERTY_TERREMARK_EXTENSION_NS;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotEquals;
import static org.testng.Assert.assertTrue;
import java.io.IOException;
import java.io.InputStream;

View File

@ -32,7 +32,6 @@ import org.jclouds.location.Provider;
import org.jclouds.providers.AnonymousProviderMetadata;
import org.jclouds.providers.ProviderMetadata;
import org.jclouds.rest.internal.BaseAsyncClientTest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.jclouds.trmk.vcloud_0_8.endpoints.VCloudLogin;
import org.jclouds.trmk.vcloud_0_8.functions.ParseLoginResponseFromHeaders;
import org.testng.annotations.Test;
@ -41,7 +40,6 @@ import com.google.common.base.Supplier;
import com.google.inject.Binder;
import com.google.inject.Module;
import com.google.inject.Provides;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code VCloudLoginAsyncClient}
@ -74,12 +72,6 @@ public class TerremarkVCloudLoginAsyncClientTest extends BaseAsyncClientTest<Ter
assertEquals(request.getFilters().get(0).getClass(), BasicAuthentication.class);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<TerremarkVCloudLoginAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<TerremarkVCloudLoginAsyncClient>>() {
};
}
@Override
protected Module createModule() {
return new Module() {

View File

@ -28,12 +28,9 @@ import org.jclouds.http.functions.ParseSax;
import org.jclouds.providers.AnonymousProviderMetadata;
import org.jclouds.providers.ProviderMetadata;
import org.jclouds.rest.internal.BaseAsyncClientTest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.jclouds.trmk.vcloud_0_8.xml.SupportedVersionsHandler;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code VCloudVersionsAsyncClient}
*
@ -63,12 +60,6 @@ public class TerremarkVCloudVersionsAsyncClientTest extends BaseAsyncClientTest<
assertEquals(request.getFilters().size(), 0);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<TerremarkVCloudVersionsAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<TerremarkVCloudVersionsAsyncClient>>() {
};
}
@Override
protected ProviderMetadata createProviderMetadata() {
return AnonymousProviderMetadata.forClientMappedToAsyncClientOnEndpoint(TerremarkVCloudVersionsClient.class,

View File

@ -18,65 +18,125 @@
*/
package org.jclouds.http;
import static com.google.common.base.Preconditions.checkNotNull;
import org.jclouds.rest.internal.GeneratedHttpRequest;
import com.google.common.base.Objects;
/**
* Command whose endpoint is an http service.
*
* @author Adrian Cole
*/
public interface HttpCommand {
//TODO: get rid of all the mock tests so that this can be made final
public class HttpCommand {
/**
* increments the current number of redirect attempts for this command.
*
* @see #getRedirectCount
*/
int incrementRedirectCount();
private volatile HttpRequest request;
private volatile int failureCount;
private volatile int redirectCount;
private volatile Exception exception;
/**
* This displays the current number of redirect attempts for this command.
*
* @see org.jclouds.Constants.PROPERTY_MAX_REDIRECTS
*/
int getRedirectCount();
/**
* Commands need to be replayed, if redirected or on a retryable error. Typically, this implies
* the payload carried is not a streaming type.
*/
boolean isReplayable();
/**
* increment the current failure count.
*
* @see #getFailureCount
*/
int incrementFailureCount();
public HttpCommand(HttpRequest request) {
this.request = checkNotNull(request, "request");
this.failureCount = 0;
this.redirectCount = 0;
}
/**
* This displays the current number of error retries for this command.
*
* @see org.jclouds.Constants.PROPERTY_MAX_RETRIES
*/
int getFailureCount();
public int getFailureCount() {
return failureCount;
}
/**
* The request associated with this command.
* increment the current failure count.
*
* @see #getFailureCount
*/
HttpRequest getCurrentRequest();
/**
* The request associated with this command.
*/
void setCurrentRequest(HttpRequest request);
public int incrementFailureCount() {
return ++failureCount;
}
/**
* Used to prevent a command from being re-executed, or having its response parsed.
*/
void setException(Exception exception);
public void setException(Exception exception) {
this.exception = exception;
}
/**
* @see #setException
*/
Exception getException();
public Exception getException() {
return exception;
}
/**
* increments the current number of redirect attempts for this command.
*
* @see #getRedirectCount
*/
public int incrementRedirectCount() {
return ++redirectCount;
}
/**
* This displays the current number of redirect attempts for this command.
*
* @see org.jclouds.Constants.PROPERTY_MAX_REDIRECTS
*/
public int getRedirectCount() {
return redirectCount;
}
/**
* Commands need to be replayed, if redirected or on a retryable error. Typically, this implies
* the payload carried is not a streaming type.
*/
public boolean isReplayable() {
return (request.getPayload() == null) ? true : request.getPayload().isRepeatable();
}
/**
* The request associated with this command.
*/
public HttpRequest getCurrentRequest() {
return request;
}
/**
* The request associated with this command.
*/
public void setCurrentRequest(HttpRequest request) {
this.request = request;
}
@Override
public int hashCode() {
return Objects.hashCode(request);
}
@Override
public boolean equals(Object that) {
if (that == null)
return false;
if (!(that instanceof HttpCommand))
return false;
return Objects.equal(this.request, HttpCommand.class.cast(that).getCurrentRequest());
}
@Override
public String toString() {
if (request instanceof GeneratedHttpRequest)
return String.format("[method=%s.%s, request=%s]", GeneratedHttpRequest.class.cast(request).getDeclaring()
.getSimpleName(), GeneratedHttpRequest.class.cast(request).getJavaMethod().getName(), request
.getRequestLine());
else
return "[request=" + request.getRequestLine() + "]";
}
}

View File

@ -1,65 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jclouds.http;
import java.util.concurrent.Future;
import java.util.concurrent.SynchronousQueue;
/**
* Used for passing objects for response processing
*
* @author Adrian Cole
*/
public class HttpCommandRendezvous<T, R extends HttpRequest> {
private final HttpCommand command;
@SuppressWarnings("rawtypes")
private final SynchronousQueue rendezvous;
private final Future<T> future;
public HttpCommandRendezvous(HttpCommand command, @SuppressWarnings("rawtypes") SynchronousQueue rendezvous,
Future<T> future) {
this.command = command;
this.rendezvous = rendezvous;
this.future = future;
}
@SuppressWarnings("unchecked")
public void setResponse(HttpResponse response) throws InterruptedException {
this.rendezvous.put(response);
}
@SuppressWarnings("unchecked")
public void setException(Exception exception) throws InterruptedException {
this.rendezvous.put(exception);
}
public void cancel() {
getFuture().cancel(true);
}
public HttpCommand getCommand() {
return command;
}
public Future<T> getFuture() {
return future;
}
}

View File

@ -1,41 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jclouds.http;
import java.util.concurrent.ExecutionException;
import com.google.common.util.concurrent.ListenableFuture;
/**
* Command that utilizes RESTFul apis and extracts <code>T</code> from the HttpResponse.
*
* @author Adrian Cole
*/
public interface TransformingHttpCommand<T> extends HttpCommand {
/**
* invoke and transform the response {@code <R>} into value type {@code <T>}
*
* @return future containing the expected value
*
* @throws ExecutionException
* if there is a fatal error preventing the command from invoking
*/
ListenableFuture<T> execute() throws ExecutionException;
}

View File

@ -1,48 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jclouds.http;
import com.google.common.base.Function;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.inject.ImplementedBy;
/**
* Executor which will invoke and transform the response of an {@code EndpointCommand} into generic
* type <T>.
*
* @author Adrian Cole
*/
@ImplementedBy(TransformingHttpCommandExecutorServiceImpl.class)
public interface TransformingHttpCommandExecutorService {
/**
*
* Submits the command and transforms the result before requested via {@link Future#get()}.
*
* @param <T>
* type that is required from the value.
* @param command
* holds the state of the request, including metadata such as redirect counts
* @param responseTransformer
* how to transform the response from the above command
* @return value of the intended response.
*/
public <T, R extends HttpRequest> ListenableFuture<T> submit(HttpCommand command,
Function<HttpResponse, T> responseTransformer);
}

View File

@ -1,57 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jclouds.http;
import java.util.concurrent.ExecutorService;
import javax.inject.Inject;
import javax.inject.Named;
import org.jclouds.Constants;
import org.jclouds.concurrent.Futures;
import com.google.common.base.Function;
import com.google.common.util.concurrent.ListenableFuture;
/**
* Executor which will invoke and transform the response of an {@code EndpointCommand} into generic
* type <T>. TODO
*
* @author Adrian Cole
*/
public class TransformingHttpCommandExecutorServiceImpl implements TransformingHttpCommandExecutorService {
private final HttpCommandExecutorService client;
private final ExecutorService userThreads;
@Inject
public TransformingHttpCommandExecutorServiceImpl(HttpCommandExecutorService client,
@Named(Constants.PROPERTY_USER_THREADS) ExecutorService userThreads) {
this.client = client;
this.userThreads = userThreads;
}
/**
* {@inheritDoc}
*/
public <T, R extends HttpRequest> ListenableFuture<T> submit(HttpCommand command,
Function<HttpResponse, T> responseTransformer) {
return Futures.compose(client.submit(command), responseTransformer, userThreads);
}
}

View File

@ -1,172 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jclouds.http;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.concurrent.ExecutionException;
import javax.annotation.Resource;
import javax.inject.Inject;
import org.jclouds.logging.Logger;
import org.jclouds.rest.internal.GeneratedHttpRequest;
import com.google.common.base.Function;
import com.google.common.base.Objects;
import com.google.common.util.concurrent.ListenableFuture;
/**
* Executor which will invoke and transform the response of an {@code EndpointCommand} into generic
* type <T>.
*
* @see TransformingHttpCommand
*
* @author Adrian Cole
*/
public class TransformingHttpCommandImpl<T> implements TransformingHttpCommand<T> {
protected final TransformingHttpCommandExecutorService executorService;
protected final Function<HttpResponse, T> transformer;
protected volatile HttpRequest request;
protected volatile int failureCount;
protected volatile int redirectCount;
protected volatile Exception exception;
@Resource
protected Logger logger = Logger.NULL;
@Inject
public TransformingHttpCommandImpl(TransformingHttpCommandExecutorService executorService, HttpRequest request,
Function<HttpResponse, T> transformer) {
this.request = checkNotNull(request, "request");
this.executorService = checkNotNull(executorService, "executorService");
this.transformer = checkNotNull(transformer, "transformer");
this.failureCount = 0;
this.redirectCount = 0;
}
/**
* {@inheritDoc}
*/
@Override
public ListenableFuture<T> execute() throws ExecutionException {
if (exception != null)
throw new ExecutionException(exception);
return executorService.submit(this, transformer);
}
/**
* {@inheritDoc}
*/
@Override
public int getFailureCount() {
return failureCount;
}
/**
* {@inheritDoc}
*/
@Override
public int incrementFailureCount() {
return ++failureCount;
}
/**
* {@inheritDoc}
*/
@Override
public void setException(Exception exception) {
this.exception = exception;
}
/**
* {@inheritDoc}
*/
@Override
public Exception getException() {
return exception;
}
/**
* {@inheritDoc}
*/
@Override
public int incrementRedirectCount() {
return ++redirectCount;
}
/**
* {@inheritDoc}
*/
@Override
public int getRedirectCount() {
return redirectCount;
}
/**
* {@inheritDoc}
*/
@Override
public boolean isReplayable() {
return (request.getPayload() == null) ? true : request.getPayload().isRepeatable();
}
/**
* {@inheritDoc}
*/
@Override
public HttpRequest getCurrentRequest() {
return request;
}
/**
* {@inheritDoc}
*/
@Override
public void setCurrentRequest(HttpRequest request) {
this.request = request;
}
@Override
public int hashCode() {
return Objects.hashCode(request);
}
@Override
public boolean equals(Object that) {
if (that == null)
return false;
if (!(that instanceof HttpCommand))
return false;
return Objects.equal(this.request, HttpCommand.class.cast(that).getCurrentRequest());
}
@Override
public String toString() {
if (request instanceof GeneratedHttpRequest)
return String.format("[method=%s.%s, request=%s]", GeneratedHttpRequest.class.cast(request).getDeclaring()
.getSimpleName(), GeneratedHttpRequest.class.cast(request).getJavaMethod().getName(), request
.getRequestLine());
else
return "[request=" + request.getRequestLine() + "]";
}
}

View File

@ -19,8 +19,6 @@
package org.jclouds.http.config;
import org.jclouds.http.HttpCommandExecutorService;
import org.jclouds.http.TransformingHttpCommandExecutorService;
import org.jclouds.http.TransformingHttpCommandExecutorServiceImpl;
import org.jclouds.http.internal.JavaUrlHttpCommandExecutorService;
import com.google.inject.AbstractModule;
@ -40,8 +38,6 @@ public class JavaUrlHttpCommandExecutorServiceModule extends AbstractModule {
protected void configure() {
install(new SSLModule());
bind(HttpCommandExecutorService.class).to(JavaUrlHttpCommandExecutorService.class).in(Scopes.SINGLETON);
bind(TransformingHttpCommandExecutorService.class).to(TransformingHttpCommandExecutorServiceImpl.class).in(
Scopes.SINGLETON);
}
}

View File

@ -29,26 +29,26 @@ import com.google.common.base.Objects.ToStringHelper;
*
* @author Adrian Cole
*/
public class ClassMethodArgsAndReturnVal extends ClassMethodArgs {
public final class ClassMethodArgsAndReturnVal extends ClassMethodArgs {
public static Builder<?> builder() {
return new ConcreteBuilder();
public static Builder builder() {
return new Builder();
}
public Builder<?> toBuilder() {
public Builder toBuilder() {
return builder().fromClassMethodArgsAndReturnVal(this);
}
public static class Builder<B extends Builder<B>> extends ClassMethodArgs.Builder<B> {
public final static class Builder extends ClassMethodArgs.Builder<Builder> {
private Object returnVal;
/**
* @see ClassMethodArgsAndReturnVal#getReturnVal()
*/
public B returnVal(Object returnVal) {
public Builder returnVal(Object returnVal) {
this.returnVal = returnVal;
return self();
return this;
}
@Override
@ -56,22 +56,19 @@ public class ClassMethodArgsAndReturnVal extends ClassMethodArgs {
return new ClassMethodArgsAndReturnVal(this);
}
public B fromClassMethodArgsAndReturnVal(ClassMethodArgsAndReturnVal in) {
public Builder fromClassMethodArgsAndReturnVal(ClassMethodArgsAndReturnVal in) {
return fromClassMethodArgs(in).returnVal(in.getReturnVal());
}
}
private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
}
private final Object returnVal;
public ClassMethodArgsAndReturnVal(Class<?> clazz, Method method, Object[] args, Object returnVal) {
private ClassMethodArgsAndReturnVal(Class<?> clazz, Method method, Object[] args, Object returnVal) {
super(clazz, method, args);
this.returnVal = returnVal;
}
public ClassMethodArgsAndReturnVal(Builder<?> builder) {
private ClassMethodArgsAndReturnVal(Builder builder) {
super(builder);
this.returnVal = builder.returnVal;
}

View File

@ -1,53 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jclouds.rest;
import static com.google.common.reflect.Reflection.newProxy;
import static com.google.inject.util.Types.newParameterizedType;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.jclouds.rest.internal.AsyncRestClientProxy;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.TypeLiteral;
/**
*
* @author Adrian Cole
*/
@Singleton
public class AsyncClientFactory {
private final Injector injector;
@Inject
private AsyncClientFactory(Injector injector) {
this.injector = injector;
}
@SuppressWarnings("unchecked")
public <T> T create(Class<T> clazz) {
Key<AsyncRestClientProxy<T>> key = (Key<AsyncRestClientProxy<T>>) Key.get(TypeLiteral.get(newParameterizedType(
AsyncRestClientProxy.class, clazz)));
return newProxy(clazz, injector.getInstance(key));
}
}

View File

@ -18,12 +18,16 @@
*/
package org.jclouds.rest.config;
import static com.google.common.reflect.Reflection.newProxy;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.jclouds.rest.AsyncClientFactory;
import org.jclouds.rest.internal.AsyncRestClientProxy;
import org.jclouds.rest.internal.AsyncRestClientProxy.Factory;
import com.google.inject.Provider;
import com.google.inject.TypeLiteral;
/**
*
@ -31,19 +35,20 @@ import com.google.inject.Provider;
*/
@Singleton
public class AsyncClientProvider<A> implements Provider<A> {
private final Class<A> asyncClientType;
private final AsyncClientFactory factory;
private final Class<? super A> asyncClientType;
private final Factory factory;
@Inject
private AsyncClientProvider(AsyncClientFactory factory, Class<A> asyncClientType) {
private AsyncClientProvider(AsyncRestClientProxy.Factory factory, TypeLiteral<A> asyncClientType) {
this.factory = factory;
this.asyncClientType = asyncClientType;
this.asyncClientType = asyncClientType.getRawType();
}
@SuppressWarnings("unchecked")
@Override
@Singleton
public A get() {
return factory.create(asyncClientType);
return (A) newProxy(asyncClientType, factory.declaring(asyncClientType));
}
}

View File

@ -18,7 +18,6 @@
*/
package org.jclouds.rest.config;
import static com.google.common.reflect.Reflection.newProxy;
import static org.jclouds.Constants.PROPERTY_TIMEOUTS_PREFIX;
import static org.jclouds.rest.config.BinderUtils.bindClientAndAsyncClient;
@ -32,11 +31,6 @@ import javax.inject.Singleton;
import org.jclouds.concurrent.internal.SyncProxy;
import org.jclouds.functions.IdentityFunction;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.HttpResponse;
import org.jclouds.http.TransformingHttpCommand;
import org.jclouds.http.TransformingHttpCommandExecutorService;
import org.jclouds.http.TransformingHttpCommandImpl;
import org.jclouds.http.functions.config.SaxParserModule;
import org.jclouds.internal.ClassMethodArgs;
import org.jclouds.internal.FilterStringsBoundToInjectorByName;
@ -47,6 +41,8 @@ import org.jclouds.rest.HttpAsyncClient;
import org.jclouds.rest.HttpClient;
import org.jclouds.rest.binders.BindToJsonPayloadWrappedWith;
import org.jclouds.rest.internal.AsyncRestClientProxy;
import org.jclouds.rest.internal.CreateAsyncClientForCaller;
import org.jclouds.rest.internal.CreateClientForCaller;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.jclouds.rest.internal.RestAnnotationProcessor.MethodKey;
import org.jclouds.rest.internal.SeedAnnotationCache;
@ -58,21 +54,14 @@ import com.google.common.base.Predicate;
import com.google.common.base.Supplier;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import com.google.common.util.concurrent.Atomics;
import com.google.inject.AbstractModule;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.Provides;
import com.google.inject.Scopes;
import com.google.inject.TypeLiteral;
import com.google.inject.assistedinject.FactoryModuleBuilder;
import com.google.inject.name.Names;
import com.google.inject.util.Types;
public class RestModule extends AbstractModule {
@ -99,8 +88,9 @@ public class RestModule extends AbstractModule {
install(new SaxParserModule());
install(new GsonModule());
install(new FactoryModuleBuilder().build(BindToJsonPayloadWrappedWith.Factory.class));
install(new FactoryModuleBuilder().build(RestAnnotationProcessor.Factory.class));
install(new FactoryModuleBuilder().build(AsyncRestClientProxy.Factory.class));
bind(IdentityFunction.class).toInstance(IdentityFunction.INSTANCE);
bind(AsyncRestClientProxy.Factory.class).to(Factory.class).in(Scopes.SINGLETON);
install(new FactoryModuleBuilder().build(SyncProxy.Factory.class));
bindClientAndAsyncClient(binder(), HttpClient.class, HttpAsyncClient.class);
// this will help short circuit scenarios that can otherwise lock out users
@ -111,18 +101,6 @@ public class RestModule extends AbstractModule {
installLocations();
}
/**
* Shared for all types of rest clients. this is read-only in this class, and
* currently populated only by {@link SeedAnnotationCache}
*
* @see SeedAnnotationCache
*/
@Provides
@Singleton
protected Cache<MethodKey, Method> delegationMap(){
return CacheBuilder.newBuilder().build();
}
@Provides
@Singleton
@Named("TIMEOUTS")
@ -149,7 +127,7 @@ public class RestModule extends AbstractModule {
@Provides
@Singleton
protected LoadingCache<Class<?>, Boolean> seedAnnotationCache(SeedAnnotationCache seedAnnotationCache) {
private LoadingCache<Class<?>, Cache<MethodKey, Method>> seedAnnotationCache(SeedAnnotationCache seedAnnotationCache) {
return CacheBuilder.newBuilder().build(seedAnnotationCache);
}
@ -160,45 +138,6 @@ public class RestModule extends AbstractModule {
return CacheBuilder.newBuilder().build(createAsyncClientForCaller);
}
static class CreateAsyncClientForCaller extends CacheLoader<ClassMethodArgs, Object> {
private final Injector injector;
private final AsyncRestClientProxy.Factory factory;
@Inject
CreateAsyncClientForCaller(Injector injector, AsyncRestClientProxy.Factory factory) {
this.injector = injector;
this.factory = factory;
}
@SuppressWarnings( { "unchecked", "rawtypes" })
@Override
public Object load(final ClassMethodArgs from) {
Class clazz = from.getClazz();
TypeLiteral typeLiteral = TypeLiteral.get(clazz);
RestAnnotationProcessor util = (RestAnnotationProcessor) injector.getInstance(Key.get(TypeLiteral.get(Types
.newParameterizedType(RestAnnotationProcessor.class, clazz))));
// cannot use child injectors due to the super coarse guice lock on Singleton
util.setCaller(from);
LoadingCache<ClassMethodArgs, Object> delegateMap = injector.getInstance(Key.get(
new TypeLiteral<LoadingCache<ClassMethodArgs, Object>>() {
}, Names.named("async")));
AsyncRestClientProxy proxy = new AsyncRestClientProxy(injector, factory, util, typeLiteral, delegateMap);
injector.injectMembers(proxy);
return newProxy(clazz, proxy);
}
}
private static class Factory implements AsyncRestClientProxy.Factory {
@Inject
private TransformingHttpCommandExecutorService executorService;
@SuppressWarnings( { "unchecked", "rawtypes" })
@Override
public TransformingHttpCommand<?> create(HttpRequest request, Function<HttpResponse, ?> transformer) {
return new TransformingHttpCommandImpl(executorService, request, transformer);
}
}
@Provides
@Singleton
@Named("sync")

View File

@ -19,23 +19,28 @@
package org.jclouds.rest.internal;
import static com.google.common.util.concurrent.Futures.immediateFailedFuture;
import static com.google.common.util.concurrent.Futures.transform;
import static com.google.common.util.concurrent.Futures.withFallback;
import static org.jclouds.concurrent.Futures.makeListenable;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import javax.annotation.Resource;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Qualifier;
import javax.inject.Singleton;
import org.jclouds.Constants;
import org.jclouds.fallbacks.MapHttp4xxCodesToExceptions;
import org.jclouds.http.HttpCommand;
import org.jclouds.http.HttpCommandExecutorService;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.HttpResponse;
import org.jclouds.http.TransformingHttpCommand;
import org.jclouds.internal.ClassMethodArgs;
import org.jclouds.internal.ClassMethodArgsAndReturnVal;
import org.jclouds.logging.Logger;
@ -61,12 +66,11 @@ import com.google.common.util.concurrent.FutureFallback;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.inject.Binding;
import com.google.inject.ConfigurationException;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.Provides;
import com.google.inject.ProvisionException;
import com.google.inject.TypeLiteral;
import com.google.inject.assistedinject.Assisted;
import com.google.inject.util.Types;
/**
@ -94,40 +98,55 @@ import com.google.inject.util.Types;
* @author Adrian Cole
*/
@Singleton
public class AsyncRestClientProxy<T> extends AbstractInvocationHandler {
public Class<T> getDeclaring() {
return declaring;
public abstract class AsyncRestClientProxy extends AbstractInvocationHandler {
public static interface Factory {
Declaring declaring(Class<?> declaring);
Caller caller(ClassMethodArgs caller);
}
private final Injector injector;
private final RestAnnotationProcessor<T> annotationProcessor;
private final Class<T> declaring;
private final Factory commandFactory;
public final static class Declaring extends AsyncRestClientProxy {
@Inject
private Declaring(Injector injector, Function<ClassMethodArgsAndReturnVal, Optional<Object>> optionalConverter,
HttpCommandExecutorService http, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService userThreads,
@Named("async") LoadingCache<ClassMethodArgs, Object> delegateMap, RestAnnotationProcessor.Factory rap,
@Assisted Class<?> declaring) {
super(injector, optionalConverter, http, userThreads, delegateMap, rap.declaring(declaring), declaring);
}
}
/**
* maximum duration of an unbackend http Request
*/
@Inject(optional = true)
@Named(Constants.PROPERTY_REQUEST_TIMEOUT)
protected long requestTimeoutMilliseconds = 30000;
public final static class Caller extends AsyncRestClientProxy {
@Inject
private Caller(Injector injector, Function<ClassMethodArgsAndReturnVal, Optional<Object>> optionalConverter,
HttpCommandExecutorService http, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService userThreads,
@Named("async") LoadingCache<ClassMethodArgs, Object> delegateMap, RestAnnotationProcessor.Factory rap,
@Assisted ClassMethodArgs caller) {
super(injector, optionalConverter, http, userThreads, delegateMap, rap.caller(caller), caller.getClazz());
}
}
@Resource
protected Logger logger = Logger.NULL;
private Logger logger = Logger.NULL;
private final Injector injector;
private final HttpCommandExecutorService http;
private final ExecutorService userThreads;
private final Function<ClassMethodArgsAndReturnVal, Optional<Object>> optionalConverter;
private final LoadingCache<ClassMethodArgs, Object> delegateMap;
private final RestAnnotationProcessor annotationProcessor;
private final Class<?> declaring;
@SuppressWarnings("unchecked")
@Inject
public AsyncRestClientProxy(Injector injector, Factory factory, RestAnnotationProcessor<T> util,
TypeLiteral<T> typeLiteral, @Named("async") LoadingCache<ClassMethodArgs, Object> delegateMap) {
private AsyncRestClientProxy(Injector injector,
Function<ClassMethodArgsAndReturnVal, Optional<Object>> optionalConverter, HttpCommandExecutorService http,
ExecutorService userThreads, LoadingCache<ClassMethodArgs, Object> delegateMap,
RestAnnotationProcessor annotationProcessor, Class<?> declaring) {
this.injector = injector;
this.optionalConverter = injector.getInstance(Key
.get(new TypeLiteral<Function<ClassMethodArgsAndReturnVal, Optional<Object>>>() {
}));
this.annotationProcessor = util;
this.declaring = (Class<T>) typeLiteral.getRawType();
this.commandFactory = factory;
this.optionalConverter = optionalConverter;
this.http = http;
this.userThreads = userThreads;
this.delegateMap = delegateMap;
this.declaring = declaring;
this.annotationProcessor = annotationProcessor;
}
private static final Predicate<Annotation> isQualifierPresent = new Predicate<Annotation>() {
@ -249,7 +268,7 @@ public class AsyncRestClientProxy<T> extends AbstractInvocationHandler {
logger.trace("<< response from %s is parsed by %s", name, transformer.getClass().getSimpleName());
logger.debug(">> invoking %s", name);
result = commandFactory.create(request, transformer).execute();
result = transform(makeListenable(http.submit(new HttpCommand(request)), userThreads), transformer);
} catch (RuntimeException e) {
AuthorizationException aex = Throwables2.getFirstThrowableOfType(e, AuthorizationException.class);
if (aex != null)
@ -264,10 +283,6 @@ public class AsyncRestClientProxy<T> extends AbstractInvocationHandler {
return withFallback(result, fallback);
}
public static interface Factory {
public TransformingHttpCommand<?> create(HttpRequest request, Function<HttpResponse, ?> transformer);
}
public String toString() {
return "Client Proxy for :" + declaring.getName();
}

View File

@ -67,6 +67,7 @@ public class BaseRestApiMetadata extends BaseApiMetadata implements RestApiMetad
public static <S, A> TypeToken<RestContext<S, A>> contextToken(TypeToken<S> apiToken, TypeToken<A> asyncApiToken) {
return new TypeToken<RestContext<S, A>>() {
private static final long serialVersionUID = 1L;
}.where(new TypeParameter<S>() {
}, apiToken).where(new TypeParameter<A>() {
}, asyncApiToken);

View File

@ -16,25 +16,26 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.jclouds.cloudstack.features;
package org.jclouds.rest.internal;
import org.jclouds.cloudstack.internal.BaseCloudStackAsyncClientTest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import static com.google.common.reflect.Reflection.newProxy;
import com.google.inject.TypeLiteral;
import org.jclouds.internal.ClassMethodArgs;
import org.jclouds.rest.internal.AsyncRestClientProxy.Factory;
/**
* Tests behavior of {@code DomainUserAsyncClient}
*
* @author Andrei Savu
*/
@Test(groups = "unit", testName = "DomainUserAsyncClientTest")
public class DomainUserAsyncClientTest extends BaseCloudStackAsyncClientTest<DomainUserAsyncClient> {
import com.google.common.cache.CacheLoader;
import com.google.inject.Inject;
public final class CreateAsyncClientForCaller extends CacheLoader<ClassMethodArgs, Object> {
private final Factory factory;
@Inject
private CreateAsyncClientForCaller(AsyncRestClientProxy.Factory factory) {
this.factory = factory;
}
@Override
protected TypeLiteral<RestAnnotationProcessor<DomainUserAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<DomainUserAsyncClient>>() {
};
public Object load(ClassMethodArgs from) {
return newProxy(from.getClazz(), factory.caller(from));
}
}

View File

@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.jclouds.rest.config;
package org.jclouds.rest.internal;
import static com.google.common.base.Preconditions.checkState;
import static com.google.common.reflect.Reflection.newProxy;

View File

@ -17,12 +17,12 @@
* under the License.
*/
package org.jclouds.rest.internal;
import static com.google.common.base.Functions.compose;
import static com.google.common.base.Functions.toStringFunction;
import static com.google.common.base.Objects.equal;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static com.google.common.base.Predicates.and;
import static com.google.common.base.Predicates.in;
import static com.google.common.base.Predicates.not;
@ -42,6 +42,7 @@ import static com.google.common.collect.Sets.newTreeSet;
import static com.google.common.net.HttpHeaders.ACCEPT;
import static com.google.common.net.HttpHeaders.CONTENT_TYPE;
import static com.google.common.net.HttpHeaders.HOST;
import static java.lang.String.format;
import static java.util.Arrays.asList;
import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
import static javax.ws.rs.core.MediaType.APPLICATION_XML;
@ -161,6 +162,7 @@ import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.TypeLiteral;
import com.google.inject.assistedinject.Assisted;
import com.google.inject.util.Types;
/**
@ -168,13 +170,72 @@ import com.google.inject.util.Types;
*
* @author Adrian Cole
*/
public class RestAnnotationProcessor<T> {
public abstract class RestAnnotationProcessor {
public static interface Factory {
Declaring declaring(Class<?> declaring);
Caller caller(ClassMethodArgs caller);
}
public static final class Declaring extends RestAnnotationProcessor {
@Inject
private Declaring(Injector injector, LoadingCache<Class<?>, Cache<MethodKey, Method>> delegationMapCache,
@ApiVersion String apiVersion, @BuildVersion String buildVersion, ParseSax.Factory parserFactory,
HttpUtils utils, ContentMetadataCodec contentMetadataCodec, InputParamValidator inputParamValidator,
@Assisted Class<?> declaring) {
super(injector, delegationMapCache, apiVersion, buildVersion, parserFactory, utils, contentMetadataCodec,
inputParamValidator, declaring);
}
}
public static final class Caller extends RestAnnotationProcessor {
private final ClassMethodArgs caller;
@Inject
private Caller(Injector injector, LoadingCache<Class<?>, Cache<MethodKey, Method>> delegationMapCache,
@ApiVersion String apiVersion, @BuildVersion String buildVersion, ParseSax.Factory parserFactory,
HttpUtils utils, ContentMetadataCodec contentMetadataCodec, InputParamValidator inputParamValidator,
@Assisted ClassMethodArgs caller) {
super(injector, delegationMapCache, apiVersion, buildVersion, parserFactory, utils, contentMetadataCodec,
inputParamValidator, caller.getClazz());
// declaring class of method is the callee, this will lazily warm annotation cache
// until we have a better annotation cache warming approach
delegationMapCache.getUnchecked(caller.getMethod().getDeclaringClass());
this.caller = caller;
}
@Override
protected GeneratedHttpRequest.Builder requestBuilder() {
return super.requestBuilder().caller(caller);
}
@Override
protected Optional<URI> findEndpoint(Method method, Object... args) {
Optional<URI> endpoint = getEndpointFor(caller.getMethod(), caller.getArgs());
if (endpoint.isPresent())
logger.trace("using endpoint %s from caller %s for %s", endpoint, caller, cma(method, args));
else
endpoint = super.findEndpoint(method, args);
return endpoint;
}
@Override
protected Multimap<String, Object> addPathAndGetTokens(Class<?> clazz, Method method, Object[] args,
UriBuilder uriBuilder) {
Class<?> callerClass = caller.getMethod().getDeclaringClass();
return ImmutableMultimap.<String, Object> builder()
.putAll(super.addPathAndGetTokens(callerClass, caller.getMethod(), caller.getArgs(), uriBuilder))
.putAll(super.addPathAndGetTokens(clazz, method, args, uriBuilder)).build();
}
}
protected ClassMethodArgs cma(Method method, Object... args) {
return logger.isTraceEnabled() ? new ClassMethodArgs(method.getDeclaringClass(), method, args) : null;
}
@Resource
protected Logger logger = Logger.NULL;
private final Class<T> declaring;
// TODO replace with Table object
static final LoadingCache<Method, LoadingCache<Integer, Set<Annotation>>> methodToIndexOfParamToBinderParamAnnotation = createMethodToIndexOfParamToAnnotation(BinderParam.class);
static final LoadingCache<Method, LoadingCache<Integer, Set<Annotation>>> methodToIndexOfParamToWrapWithAnnotation = createMethodToIndexOfParamToAnnotation(WrapWith.class);
@ -187,8 +248,19 @@ public class RestAnnotationProcessor<T> {
static final LoadingCache<Method, LoadingCache<Integer, Set<Annotation>>> methodToIndexOfParamToPostParamAnnotations = createMethodToIndexOfParamToAnnotation(PayloadParam.class);
static final LoadingCache<Method, LoadingCache<Integer, Set<Annotation>>> methodToIndexOfParamToPartParamAnnotations = createMethodToIndexOfParamToAnnotation(PartParam.class);
static final LoadingCache<Method, LoadingCache<Integer, Set<Annotation>>> methodToIndexOfParamToParamParserAnnotations = createMethodToIndexOfParamToAnnotation(ParamParser.class);
final Cache<MethodKey, Method> delegationMap;
static final LoadingCache<Method, Set<Integer>> methodToIndexesOfOptions = CacheBuilder.newBuilder().build(
new CacheLoader<Method, Set<Integer>>() {
@Override
public Set<Integer> load(Method method) {
Builder<Integer> toReturn = ImmutableSet.builder();
for (int index = 0; index < method.getParameterTypes().length; index++) {
Class<?> type = method.getParameterTypes()[index];
if (HttpRequestOptions.class.isAssignableFrom(type) || HttpRequestOptions[].class.isAssignableFrom(type))
toReturn.add(index);
}
return toReturn.build();
}
});
static LoadingCache<Method, LoadingCache<Integer, Set<Annotation>>> createMethodToIndexOfParamToAnnotation(
final Class<? extends Annotation> annotation) {
@ -216,42 +288,15 @@ public class RestAnnotationProcessor<T> {
}
}));
}
}
private static final Function<? super Entry<String, Object>, ? extends Part> ENTRY_TO_PART = new Function<Entry<String, Object>, Part>() {
@Override
public Part apply(Entry<String, Object> from) {
return Part.create(from.getKey(), from.getValue().toString());
}
};
static final LoadingCache<Method, Set<Integer>> methodToIndexesOfOptions = CacheBuilder.newBuilder().build(
new CacheLoader<Method, Set<Integer>>() {
@Override
public Set<Integer> load(Method method) {
Builder<Integer> toReturn = ImmutableSet.builder();
for (int index = 0; index < method.getParameterTypes().length; index++) {
Class<?> type = method.getParameterTypes()[index];
if (HttpRequestOptions.class.isAssignableFrom(type) || HttpRequestOptions[].class.isAssignableFrom(type))
toReturn.add(index);
}
return toReturn.build();
}
});
private final ParseSax.Factory parserFactory;
private final HttpUtils utils;
private final ContentMetadataCodec contentMetadataCodec;
private final LoadingCache<Class<?>, Boolean> seedAnnotationCache;
private final String apiVersion;
private final String buildVersion;
@Inject
private InputParamValidator inputParamValidator;
@VisibleForTesting
Function<HttpResponse, ?> createResponseParser(Method method, HttpRequest request) {
return createResponseParser(parserFactory, injector, method, request);
@ -298,29 +343,48 @@ public class RestAnnotationProcessor<T> {
return transformer;
}
@SuppressWarnings("unchecked")
@Inject
public RestAnnotationProcessor(Injector injector, LoadingCache<Class<?>, Boolean> seedAnnotationCache, Cache<MethodKey, Method> delegationMap,
@ApiVersion String apiVersion, @BuildVersion String buildVersion, ParseSax.Factory parserFactory,
HttpUtils utils, ContentMetadataCodec contentMetadataCodec, TypeLiteral<T> typeLiteral) {
this.declaring = (Class<T>) typeLiteral.getRawType();
private final Class<?> declaring;
private final Injector injector;
private final ParseSax.Factory parserFactory;
private final HttpUtils utils;
private final ContentMetadataCodec contentMetadataCodec;
private final Cache<MethodKey, Method> delegationMap;
private final String apiVersion;
private final String buildVersion;
private final InputParamValidator inputParamValidator;
private RestAnnotationProcessor(Injector injector,
LoadingCache<Class<?>, Cache<MethodKey, Method>> delegationMapCache, String apiVersion, String buildVersion,
ParseSax.Factory parserFactory, HttpUtils utils, ContentMetadataCodec contentMetadataCodec,
InputParamValidator inputParamValidator, Class<?> declaring) {
this.injector = injector;
this.parserFactory = parserFactory;
this.utils = utils;
this.contentMetadataCodec = contentMetadataCodec;
this.seedAnnotationCache = seedAnnotationCache;
seedAnnotationCache.getUnchecked(declaring);
this.delegationMap = delegationMap;
this.delegationMap = delegationMapCache.getUnchecked(declaring);
this.apiVersion = apiVersion;
this.buildVersion = buildVersion;
this.inputParamValidator = inputParamValidator;
this.declaring = declaring;
}
public Method getDelegateOrNull(Method in) {
return delegationMap.getIfPresent(new MethodKey(in));
}
public static class MethodKey {
private final String name;
private final int parametersTypeHashCode;
private final Class<?> declaringClass;
public MethodKey(Method method) {
this.name = method.getName();
this.declaringClass = method.getDeclaringClass();
int parametersTypeHashCode = 0;
for (Class<?> param : method.getParameterTypes())
parametersTypeHashCode += param.hashCode();
this.parametersTypeHashCode = parametersTypeHashCode;
}
@Override
public int hashCode() {
@ -336,59 +400,34 @@ public class RestAnnotationProcessor<T> {
&& equal(this.name, that.name)
&& equal(this.parametersTypeHashCode, that.parametersTypeHashCode);
}
private final String name;
private final int parametersTypeHashCode;
private final Class<?> declaringClass;
public MethodKey(Method method) {
this.name = method.getName();
this.declaringClass = method.getDeclaringClass();
int parametersTypeHashCode = 0;
for (Class<?> param : method.getParameterTypes())
parametersTypeHashCode += param.hashCode();
this.parametersTypeHashCode = parametersTypeHashCode;
}
}
final Injector injector;
private ClassMethodArgs caller;
public void setCaller(ClassMethodArgs caller) {
seedAnnotationCache.getUnchecked(caller.getMethod().getDeclaringClass());
this.caller = caller;
}
public GeneratedHttpRequest createRequest(Method method, Object... args) {
inputParamValidator.validateMethodParametersOrThrow(method, args);
Optional<URI> endpoint = findEndpoint(method, args);
if (!endpoint.isPresent()) {
throw new NoSuchElementException(String.format("no endpoint found for %s",
new ClassMethodArgs(method.getDeclaringClass(), method, args)));
Optional<URI> endpoint = Optional.absent();
HttpRequest r = findHttpRequestInArgs(args);
if (r != null) {
endpoint = Optional.fromNullable(r.getEndpoint());
if (endpoint.isPresent())
logger.trace("using endpoint %s from args for %s", endpoint, cma(method, args));
} else {
endpoint = findEndpoint(method, args);
}
GeneratedHttpRequest.Builder requestBuilder = GeneratedHttpRequest.builder();
HttpRequest r = RestAnnotationProcessor.findHttpRequestInArgs(args);
if (!endpoint.isPresent())
throw new NoSuchElementException(format("no endpoint found for %s", cma(method, args)));
GeneratedHttpRequest.Builder requestBuilder = requestBuilder();
if (r != null) {
requestBuilder.fromHttpRequest(r);
} else {
requestBuilder.method(getHttpMethodOrConstantOrThrowException(method));
}
// URI template in rfc6570 form
UriBuilder uriBuilder = uriBuilder(endpoint.get().toString());
overridePathEncoding(uriBuilder, method);
requestBuilder.declaring(declaring)
.javaMethod(method)
.args(args)
.caller(caller)
.filters(getFiltersIfAnnotated(method));
Multimap<String, Object> tokenValues = LinkedHashMultimap.create();
@ -396,11 +435,9 @@ public class RestAnnotationProcessor<T> {
tokenValues.put(Constants.PROPERTY_API_VERSION, apiVersion);
tokenValues.put(Constants.PROPERTY_BUILD_VERSION, buildVersion);
// make sure any path from the caller is a prefix
if (caller != null) {
tokenValues.putAll(addPathAndGetTokens(caller.getMethod().getDeclaringClass(), caller.getMethod(),
caller.getArgs(), uriBuilder));
}
UriBuilder uriBuilder = uriBuilder(endpoint.get().toString()); // URI template in rfc6570 form
overridePathEncoding(uriBuilder, method);
tokenValues.putAll(addPathAndGetTokens(declaring, method, args, uriBuilder));
@ -491,6 +528,10 @@ public class RestAnnotationProcessor<T> {
return request;
}
protected org.jclouds.rest.internal.GeneratedHttpRequest.Builder requestBuilder() {
return GeneratedHttpRequest.builder();
}
// TODO cache
private void overridePathEncoding(UriBuilder uriBuilder, Method method) {
if (declaring.isAnnotationPresent(SkipEncoding.class)) {
@ -504,43 +545,19 @@ public class RestAnnotationProcessor<T> {
// different than guava as accepts null
private static enum NullableToStringFunction implements Function<Object, String> {
INSTANCE;
@Override
public String apply(Object o) {
if (o == null)
return null;
return o.toString();
}
@Override
public String toString() {
return "toString";
}
}
private Optional<URI> findEndpoint(Method method, Object... args) {
ClassMethodArgs cma = logger.isTraceEnabled() ? new ClassMethodArgs(method.getDeclaringClass(), method, args)
: null;
Optional<URI> endpoint = Optional.absent();
HttpRequest r = RestAnnotationProcessor.findHttpRequestInArgs(args);
if (r != null) {
endpoint = Optional.fromNullable(r.getEndpoint());
if (endpoint.isPresent())
logger.trace("using endpoint %s from args for %s", endpoint, cma);
}
if (!endpoint.isPresent() && caller != null) {
endpoint = getEndpointFor(caller.getMethod(), caller.getArgs());
if (endpoint.isPresent())
logger.trace("using endpoint %s from caller %s for %s", endpoint, caller, cma);
}
if (!endpoint.isPresent()) {
endpoint = getEndpointFor(method, args);
if (endpoint.isPresent())
logger.trace("using endpoint %s for %s", endpoint, cma);
}
protected Optional<URI> findEndpoint(Method method, Object... args) {
ClassMethodArgs cma = cma(method, args);
Optional<URI> endpoint = getEndpointFor(method, args);
if (endpoint.isPresent())
logger.trace("using endpoint %s for %s", endpoint, cma);
if (!endpoint.isPresent()) {
logger.trace("looking up default endpoint for %s", cma);
endpoint = Optional.fromNullable(injector.getInstance(
@ -558,7 +575,7 @@ public class RestAnnotationProcessor<T> {
public static final String BOUNDARY = "--JCLOUDS--";
private Multimap<String, Object> addPathAndGetTokens(Class<?> clazz, Method method, Object[] args, UriBuilder uriBuilder) {
protected Multimap<String, Object> addPathAndGetTokens(Class<?> clazz, Method method, Object[] args, UriBuilder uriBuilder) {
if (clazz.isAnnotationPresent(Path.class))
uriBuilder.appendPath(clazz.getAnnotation(Path.class).value());
if (method.isAnnotationPresent(Path.class))
@ -661,8 +678,7 @@ public class RestAnnotationProcessor<T> {
//TODO: change to LoadingCache<ClassMethodArgs, Optional<URI>> and move this logic to the CacheLoader.
@VisibleForTesting
public static URI getEndpointInParametersOrNull(Method method, final Object[] args, Injector injector)
{
public static URI getEndpointInParametersOrNull(Method method, final Object[] args, Injector injector) {
Map<Integer, Set<Annotation>> map = indexWithAtLeastOneAnnotation(method,
methodToIndexOfParamToEndpointParamAnnotations);
if (map.size() >= 1 && args.length > 0) {
@ -674,29 +690,27 @@ public class RestAnnotationProcessor<T> {
try {
URI returnVal = parser.apply(args[index]);
checkArgument(returnVal != null,
String.format("endpoint for [%s] not configured for %s", args[index], method));
format("endpoint for [%s] not configured for %s", args[index], method));
return returnVal;
} catch (NullPointerException e) {
throw new IllegalArgumentException(String.format("argument at index %d on method %s was null", index, method), e);
throw new IllegalArgumentException(format("argument at index %d on method %s was null", index, method),
e);
}
} else {
SortedSet<Integer> keys = newTreeSet(map.keySet());
Iterable<Object> argsToParse = transform(keys, new Function<Integer, Object>() {
@Override
public Object apply(Integer from) {
return args[from];
}
});
try {
URI returnVal = parser.apply(argsToParse);
checkArgument(returnVal != null,
String.format("endpoint for [%s] not configured for %s", argsToParse, method));
checkArgument(returnVal != null, format("endpoint for [%s] not configured for %s", argsToParse, method));
return returnVal;
} catch (NullPointerException e) {
throw new IllegalArgumentException(String.format("illegal argument in [%s] for method %s", argsToParse,
method), e);
throw new IllegalArgumentException(
format("illegal argument in [%s] for method %s", argsToParse, method), e);
}
}
}
@ -707,7 +721,7 @@ public class RestAnnotationProcessor<T> {
};
// TODO: change to LoadingCache<ClassMethodArgs, URI> and move this logic to the CacheLoader.
private Optional<URI> getEndpointFor(Method method, Object[] args) {
protected Optional<URI> getEndpointFor(Method method, Object[] args) {
URI endpoint = getEndpointInParametersOrNull(method, args, injector);
if (endpoint == null) {
Endpoint annotation;
@ -721,16 +735,14 @@ public class RestAnnotationProcessor<T> {
}
endpoint = injector.getInstance(Key.get(uriSupplierLiteral, annotation.value())).get();
}
URI providerEndpoint = injector.getInstance(Key.get(uriSupplierLiteral, org.jclouds.location.Provider.class))
.get();
return Optional.fromNullable(addHostIfMissing(endpoint, providerEndpoint));
URI provider = injector.getInstance(Key.get(uriSupplierLiteral, org.jclouds.location.Provider.class)).get();
return Optional.fromNullable(addHostIfMissing(endpoint, provider));
}
@VisibleForTesting
static URI addHostIfMissing(URI original, URI withHost) {
checkNotNull(withHost, "URI withHost cannot be null");
checkArgument(withHost.getHost() != null, "URI withHost must have host:" + withHost);
if (original == null)
return null;
if (original.getHost() != null)
@ -876,25 +888,18 @@ public class RestAnnotationProcessor<T> {
if (http != null)
methodsBuilder.add(http.value());
}
Set<String> methods = methodsBuilder.build();
return (methods.size() == 0) ? null : methods;
return methodsBuilder.build();
}
public String getHttpMethodOrConstantOrThrowException(Method method) {
Set<String> requests = getHttpMethods(method);
if (requests == null || requests.size() != 1) {
throw new IllegalStateException(
"You must use at least one, but no more than one http method or pathparam annotation on: "
+ method.toString());
}
return requests.iterator().next();
checkState(requests.size() == 1,
"You must use at least one, but no more than one http method or pathparam annotation on: %s", method);
return get(requests, 0);
}
public boolean shouldAddHostHeader(Method method) {
if (declaring.isAnnotationPresent(VirtualHost.class) || method.isAnnotationPresent(VirtualHost.class)) {
return true;
}
return false;
return (declaring.isAnnotationPresent(VirtualHost.class) || method.isAnnotationPresent(VirtualHost.class));
}
private static final Predicate<Set<?>> notEmpty = new Predicate<Set<?>>() {
@ -949,14 +954,13 @@ public class RestAnnotationProcessor<T> {
// (first, however, let's make sure we have enough args on the actual method)
if (entry.getKey() >= request.getJavaMethod().getParameterAnnotations().length) {
// not known whether this happens
throw new IllegalArgumentException("Argument index " + (entry.getKey() + 1)
+ " is out of bounds for method " + request.getJavaMethod());
throw new IllegalArgumentException(format("Argument index %s is out of bounds for method %s",
entry.getKey() + 1, request.getJavaMethod()));
}
if (request.getJavaMethod().isVarArgs()
&& entry.getKey() + 1 == request.getJavaMethod().getParameterTypes().length)
// allow null/missing for var args
continue OUTER;
continue OUTER; // allow null/missing for var args
Annotation[] annotations = request.getJavaMethod().getParameterAnnotations()[entry.getKey()];
for (Annotation a : annotations) {
@ -966,7 +970,6 @@ public class RestAnnotationProcessor<T> {
checkNotNull(null, request.getJavaMethod().getName() + " parameter " + (entry.getKey() + 1));
}
}
return request;
}
@ -974,7 +977,7 @@ public class RestAnnotationProcessor<T> {
LoadingCache<Method, LoadingCache<Integer, Set<Annotation>>> toRefine) {
Map<Integer, Set<Annotation>> indexToPayloadAnnotation = indexWithAtLeastOneAnnotation(method, toRefine);
if (indexToPayloadAnnotation.size() > 1) {
throw new IllegalStateException(String.format(
throw new IllegalStateException(format(
"You must not specify more than one %s annotation on: %s; found %s", description, method.toString(),
indexToPayloadAnnotation));
}
@ -1080,7 +1083,6 @@ public class RestAnnotationProcessor<T> {
value = replaceTokens(value, tokenValues);
headers.put(header.keys()[i], value);
}
}
private List<Part> getParts(Method method, Object[] args, Multimap<String, ?> tokenValues) {
@ -1143,7 +1145,6 @@ public class RestAnnotationProcessor<T> {
String paramKey = method.getAnnotation(PathParam.class).value();
String paramValue = injector.getInstance(method.getAnnotation(ParamParser.class).value()).apply(args);
pathParamValues.put(paramKey, paramValue);
}
return pathParamValues;
}
@ -1154,8 +1155,7 @@ public class RestAnnotationProcessor<T> {
Object arg = args[argIndex];
if (extractors != null && extractors.size() > 0 && checkPresentOrNullable(method, paramKey, argIndex, arg)) {
ParamParser extractor = (ParamParser) extractors.iterator().next();
// ParamParsers can deal with nullable parameters
arg = injector.getInstance(extractor.value()).apply(arg);
arg = injector.getInstance(extractor.value()).apply(arg); // ParamParsers can deal with nullable parameters
}
checkPresentOrNullable(method, paramKey, argIndex, arg);
return Optional.fromNullable(arg);
@ -1163,7 +1163,7 @@ public class RestAnnotationProcessor<T> {
private static boolean checkPresentOrNullable(Method method, String paramKey, Integer argIndex, Object arg) {
if (arg == null && !argNullable(method, argIndex))
throw new NullPointerException(String.format("param{%s} for method %s.%s", paramKey, method
throw new NullPointerException(format("param{%s} for method %s.%s", paramKey, method
.getDeclaringClass().getSimpleName(), method.getName()));
return true;
}
@ -1173,7 +1173,6 @@ public class RestAnnotationProcessor<T> {
}
private static final Predicate<Annotation> NULLABLE = new Predicate<Annotation>() {
@Override
public boolean apply(Annotation in) {
return Nullable.class.isAssignableFrom(in.annotationType());
@ -1184,7 +1183,6 @@ public class RestAnnotationProcessor<T> {
return any(ImmutableSet.copyOf(annotations), NULLABLE);
}
//TODO: change to LoadingCache<ClassMethodArgs, Multimap<String,String> and move this logic to the CacheLoader.
//take care to manage size of this cache
private Multimap<String, Object> getFormParamKeyValues(Method method, Object... args) {
@ -1208,7 +1206,6 @@ public class RestAnnotationProcessor<T> {
String paramKey = method.getAnnotation(FormParam.class).value();
String paramValue = injector.getInstance(method.getAnnotation(ParamParser.class).value()).apply(args);
formParamValues.put(paramKey, paramValue);
}
return formParamValues;
}
@ -1230,8 +1227,7 @@ public class RestAnnotationProcessor<T> {
if (paramValue.get() instanceof Iterable) {
Iterable<String> iterableStrings = transform(Iterable.class.cast(paramValue.get()), toStringFunction());
queryParamValues.putAll(paramKey, iterableStrings);
}
else {
} else {
queryParamValues.put(paramKey, paramValue.get().toString());
}
}
@ -1242,7 +1238,6 @@ public class RestAnnotationProcessor<T> {
String paramKey = method.getAnnotation(QueryParam.class).value();
String paramValue = injector.getInstance(method.getAnnotation(ParamParser.class).value()).apply(args);
queryParamValues.put(paramKey, paramValue);
}
return queryParamValues;
}
@ -1264,11 +1259,4 @@ public class RestAnnotationProcessor<T> {
}
return postParams;
}
/**
* the class that is being processed
*/
public Class<T> getDeclaring(){
return declaring;
}
}

View File

@ -42,14 +42,15 @@ import javax.ws.rs.Path;
import org.jclouds.http.HttpRequest;
import org.jclouds.logging.Logger;
import org.jclouds.rest.RestContext;
import org.jclouds.rest.annotations.Delegate;
import org.jclouds.rest.internal.RestAnnotationProcessor.MethodKey;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.collect.ImmutableSet;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.common.util.concurrent.Callables;
import com.google.inject.Provides;
/**
@ -61,21 +62,13 @@ import com.google.inject.Provides;
* @author Adrian Cole
*/
@Singleton
public class SeedAnnotationCache extends CacheLoader<Class<?>, Boolean> {
public final class SeedAnnotationCache extends CacheLoader<Class<?>, Cache<MethodKey, Method>> {
@Resource
protected Logger logger = Logger.NULL;
protected final Injector injector;
protected final Cache<MethodKey, Method> delegationMap;
@Inject
public SeedAnnotationCache(Injector injector, Cache<MethodKey, Method> delegationMap) {
this.injector = injector;
this.delegationMap = delegationMap;
}
private Logger logger = Logger.NULL;
@Override
public Boolean load(Class<?> declaring) throws ExecutionException {
public Cache<MethodKey, Method> load(Class<?> declaring) throws ExecutionException {
Cache<MethodKey, Method> delegationMap = CacheBuilder.newBuilder().<MethodKey, Method>build();
for (Method method : difference(ImmutableSet.copyOf(declaring.getMethods()), ImmutableSet.copyOf(Object.class
.getMethods()))) {
if (isHttpMethod(method) || method.isAnnotationPresent(Delegate.class)) {
@ -93,7 +86,7 @@ public class SeedAnnotationCache extends CacheLoader<Class<?>, Boolean> {
methodToIndexOfParamToPartParamAnnotations.get(method).get(index);
methodToIndexesOfOptions.get(method);
}
delegationMap.put(new MethodKey(method), method);
delegationMap.get(new MethodKey(method), Callables.returning(method));
} else if (!method.getDeclaringClass().equals(declaring)) {
logger.trace("skipping potentially overridden method %s", method);
} else if (method.isAnnotationPresent(Provides.class)) {
@ -102,11 +95,11 @@ public class SeedAnnotationCache extends CacheLoader<Class<?>, Boolean> {
logger.trace("Method is not annotated as either http or provider method: %s", method);
}
}
return true;
return delegationMap;
}
public static boolean isHttpMethod(Method method) {
return method.isAnnotationPresent(Path.class) || getHttpMethods(method) != null
return method.isAnnotationPresent(Path.class) || !getHttpMethods(method).isEmpty()
|| ImmutableSet.copyOf(method.getParameterTypes()).contains(HttpRequest.class);
}

View File

@ -65,54 +65,7 @@ public class HeaderToRetryAfterExceptionTest {
.addHeader(HttpHeaders.RETRY_AFTER, "Sun, 2 Jan 2000 00:00:00 GMT").build()));
}
public static HttpCommand command = new HttpCommand() {
@Override
public int getRedirectCount() {
return 0;
}
@Override
public int incrementRedirectCount() {
return 0;
}
@Override
public boolean isReplayable() {
return false;
}
@Override
public Exception getException() {
return null;
}
@Override
public int getFailureCount() {
return 0;
}
@Override
public int incrementFailureCount() {
return 0;
}
@Override
public void setException(Exception exception) {
}
@Override
public HttpRequest getCurrentRequest() {
return HttpRequest.builder().method("GET").endpoint("http://stub").build();
}
@Override
public void setCurrentRequest(HttpRequest request) {
}
};
public static HttpCommand command = new HttpCommand(HttpRequest.builder().method("GET").endpoint("http://stub").build());
static DateCodec rfc822 = new DateServiceRfc822Codec(new SimpleDateFormatDateService());

View File

@ -36,12 +36,10 @@ import org.jclouds.date.internal.DateServiceDateCodecFactory;
import org.jclouds.date.internal.SimpleDateFormatDateService;
import org.jclouds.http.BaseJettyTest;
import org.jclouds.http.HttpCommand;
import org.jclouds.http.HttpCommandExecutorService;
import org.jclouds.http.HttpResponse;
import org.jclouds.http.HttpUtils;
import org.jclouds.http.IntegrationTestAsyncClient;
import org.jclouds.http.TransformingHttpCommandExecutorServiceImpl;
import org.jclouds.http.TransformingHttpCommandImpl;
import org.jclouds.http.functions.ReturnStringIf2xx;
import org.jclouds.http.internal.HttpWire;
import org.jclouds.http.internal.JavaUrlHttpCommandExecutorService;
import org.jclouds.io.ContentMetadataCodec;
@ -52,8 +50,6 @@ import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import com.google.common.base.Supplier;
import com.google.inject.Key;
import com.google.inject.TypeLiteral;
@Test(groups = "unit", testName = "BackoffLimitedRetryHandlerTest")
public class BackoffLimitedRetryHandlerTest {
@ -97,7 +93,7 @@ public class BackoffLimitedRetryHandlerTest {
}
TransformingHttpCommandExecutorServiceImpl executorService;
HttpCommandExecutorService http;
@BeforeTest
void setupExecutorService() throws Exception {
@ -107,7 +103,7 @@ public class BackoffLimitedRetryHandlerTest {
ContentMetadataCodec contentMetadataCodec = new DefaultContentMetadataCodec(new DateServiceDateCodecFactory(
new SimpleDateFormatDateService()));
RedirectionRetryHandler retry = new RedirectionRetryHandler(backoff);
JavaUrlHttpCommandExecutorService httpService = new JavaUrlHttpCommandExecutorService(utils,
http = new JavaUrlHttpCommandExecutorService(utils,
contentMetadataCodec, execService,
new DelegatingRetryHandler(backoff, retry), new BackoffLimitedRetryHandler(),
new DelegatingErrorHandler(), new HttpWire(), new HostnameVerifier() {
@ -124,7 +120,6 @@ public class BackoffLimitedRetryHandlerTest {
}
});
executorService = new TransformingHttpCommandExecutorServiceImpl(httpService, execService);
}
@Test
@ -170,16 +165,13 @@ public class BackoffLimitedRetryHandlerTest {
assertEquals(response.getPayload().getInput().read(), -1);
}
private final RestAnnotationProcessor<IntegrationTestAsyncClient> processor = BaseJettyTest.newBuilder(8100,
new Properties()).buildInjector().getInstance(
Key.get(new TypeLiteral<RestAnnotationProcessor<IntegrationTestAsyncClient>>() {
}));
private final RestAnnotationProcessor processor = BaseJettyTest.newBuilder(8100, new Properties()).buildInjector()
.getInstance(RestAnnotationProcessor.Factory.class).declaring(IntegrationTestAsyncClient.class);
private HttpCommand createCommand() throws SecurityException, NoSuchMethodException {
Method method = IntegrationTestAsyncClient.class.getMethod("download", String.class);
return new TransformingHttpCommandImpl<String>(executorService, processor.createRequest(method, "1"),
new ReturnStringIf2xx());
return new HttpCommand(processor.createRequest(method, "1"));
}
@Test

View File

@ -35,9 +35,6 @@ import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.TypeLiteral;
import com.google.inject.util.Types;
@Test(groups = "unit")
public class InputParamValidatorTest {
@ -65,7 +62,7 @@ public class InputParamValidatorTest {
String.class);
Method oneParamValidatedMethod = InputParamValidatorForm.class.getMethod("oneParamValidated", String.class,
String.class);
RestAnnotationProcessor<InputParamValidatorForm> restAnnotationProcessor = factory(InputParamValidatorForm.class);
RestAnnotationProcessor restAnnotationProcessor = factory(InputParamValidatorForm.class);
restAnnotationProcessor.createRequest(allParamsValidatedMethod, "blah", "blah");
restAnnotationProcessor.createRequest(oneParamValidatedMethod, "blah", "blah");
@ -105,10 +102,8 @@ public class InputParamValidatorTest {
new InputParamValidator(injector).validateMethodParametersOrThrow(method, 55);
}
@SuppressWarnings("unchecked")
private <T> RestAnnotationProcessor<T> factory(Class<T> clazz) {
return ((RestAnnotationProcessor<T>) injector.getInstance(Key.get(TypeLiteral.get(Types.newParameterizedType(
RestAnnotationProcessor.class, clazz)))));
private RestAnnotationProcessor factory(Class<?> clazz) {
return injector.getInstance(RestAnnotationProcessor.Factory.class).declaring(clazz);
}
Injector injector;

View File

@ -33,11 +33,10 @@ import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableSet;
import com.google.common.reflect.TypeToken;
import com.google.inject.Binder;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.Module;
import com.google.inject.TypeLiteral;
/**
*
@ -46,9 +45,7 @@ import com.google.inject.TypeLiteral;
@Test(groups = "unit")
public abstract class BaseAsyncApiTest<T> extends BaseRestApiTest {
protected RestAnnotationProcessor<T> processor;
protected abstract TypeLiteral<RestAnnotationProcessor<T>> createTypeLiteral();
protected RestAnnotationProcessor processor;
protected abstract void checkFilters(HttpRequest request);
@ -67,7 +64,9 @@ public abstract class BaseAsyncApiTest<T> extends BaseRestApiTest {
protected void setupFactory() throws IOException {
injector = createInjector();
parserFactory = injector.getInstance(ParseSax.Factory.class);
processor = injector.getInstance(Key.get(createTypeLiteral()));
processor = injector.getInstance(RestAnnotationProcessor.Factory.class).declaring(new TypeToken<T>(getClass()) {
private static final long serialVersionUID = 1L;
}.getRawType());
}
protected String identity = "identity";

View File

@ -18,7 +18,6 @@
*/
package org.jclouds.rest.internal;
import static com.google.common.base.Throwables.propagate;
import static com.google.inject.util.Types.newParameterizedType;
import static org.easymock.EasyMock.createMock;
import static org.eclipse.jetty.http.HttpHeaders.TRANSFER_ENCODING;
import static org.jclouds.rest.internal.RestAnnotationProcessor.createResponseParser;
@ -53,7 +52,6 @@ import com.google.common.collect.SortedSetMultimap;
import com.google.common.collect.TreeMultimap;
import com.google.inject.AbstractModule;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.name.Names;
/**
@ -181,10 +179,8 @@ public abstract class BaseRestApiTest {
assertEquals(createResponseParser(parserFactory, injector, method, request).getClass(), parserClass);
}
@SuppressWarnings("unchecked")
protected <T> RestAnnotationProcessor<T> factory(Class<T> clazz) {
return ((RestAnnotationProcessor<T>) injector.getInstance(Key.get(newParameterizedType(
RestAnnotationProcessor.class, clazz))));
protected RestAnnotationProcessor factory(Class<?> clazz) {
return injector.getInstance(RestAnnotationProcessor.Factory.class).declaring(clazz);
}
}

Some files were not shown because too many files have changed in this diff Show More