mirror of https://github.com/apache/jclouds.git
cleaning up Handler binding
git-svn-id: http://jclouds.googlecode.com/svn/trunk@1462 3d8758e0-26b5-11de-8745-db77d3ebf521
This commit is contained in:
parent
502b9e1bac
commit
383b9bf2c6
|
@ -240,14 +240,15 @@ public class S3ContextFactory {
|
||||||
|
|
||||||
addHttpModuleIfNeededAndNotPresent(modules);
|
addHttpModuleIfNeededAndNotPresent(modules);
|
||||||
|
|
||||||
return Guice.createInjector(new AbstractModule() {
|
modules.add(new AbstractModule() {
|
||||||
@Override
|
@Override
|
||||||
protected void configure() {
|
protected void configure() {
|
||||||
Names.bindProperties(binder(), checkNotNull(properties, "properties"));
|
Names.bindProperties(binder(), checkNotNull(properties, "properties"));
|
||||||
for (Module module : modules)
|
|
||||||
install(module);
|
|
||||||
}
|
}
|
||||||
}, new S3ContextModule());
|
});
|
||||||
|
modules.add(new S3ContextModule());
|
||||||
|
|
||||||
|
return Guice.createInjector(modules);
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
|
@ -285,7 +286,7 @@ public class S3ContextFactory {
|
||||||
}
|
}
|
||||||
|
|
||||||
})) {
|
})) {
|
||||||
modules.add(new LiveS3ConnectionModule());
|
modules.add(0, new LiveS3ConnectionModule());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,11 +30,11 @@ import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.TimeoutException;
|
import java.util.concurrent.TimeoutException;
|
||||||
|
|
||||||
import org.jclouds.aws.AWSResponseException;
|
|
||||||
import org.jclouds.aws.s3.commands.callables.ParseObjectFromHeadersAndHttpContent;
|
import org.jclouds.aws.s3.commands.callables.ParseObjectFromHeadersAndHttpContent;
|
||||||
import org.jclouds.aws.s3.commands.options.GetObjectOptions;
|
import org.jclouds.aws.s3.commands.options.GetObjectOptions;
|
||||||
import org.jclouds.aws.s3.domain.S3Object;
|
import org.jclouds.aws.s3.domain.S3Object;
|
||||||
import org.jclouds.http.HttpMethod;
|
import org.jclouds.http.HttpMethod;
|
||||||
|
import org.jclouds.http.HttpResponseException;
|
||||||
|
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
|
@ -85,9 +85,9 @@ public class GetObject extends S3FutureCommand<S3Object> {
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
S3Object attemptNotFound(ExecutionException e) throws ExecutionException {
|
S3Object attemptNotFound(ExecutionException e) throws ExecutionException {
|
||||||
if (e.getCause() != null && e.getCause() instanceof AWSResponseException) {
|
if (e.getCause() != null && e.getCause() instanceof HttpResponseException) {
|
||||||
AWSResponseException responseException = (AWSResponseException) e.getCause();
|
HttpResponseException responseException = (HttpResponseException) e.getCause();
|
||||||
if ("NoSuchKey".equals(responseException.getError().getCode())) {
|
if (responseException.getResponse().getStatusCode() == 404) {
|
||||||
return S3Object.NOT_FOUND;
|
return S3Object.NOT_FOUND;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,11 +28,11 @@ import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.TimeoutException;
|
import java.util.concurrent.TimeoutException;
|
||||||
|
|
||||||
import org.jclouds.aws.AWSResponseException;
|
|
||||||
import org.jclouds.aws.s3.commands.options.ListBucketOptions;
|
import org.jclouds.aws.s3.commands.options.ListBucketOptions;
|
||||||
import org.jclouds.aws.s3.domain.S3Bucket;
|
import org.jclouds.aws.s3.domain.S3Bucket;
|
||||||
import org.jclouds.aws.s3.xml.ListBucketHandler;
|
import org.jclouds.aws.s3.xml.ListBucketHandler;
|
||||||
import org.jclouds.http.HttpMethod;
|
import org.jclouds.http.HttpMethod;
|
||||||
|
import org.jclouds.http.HttpResponseException;
|
||||||
import org.jclouds.http.commands.callables.xml.ParseSax;
|
import org.jclouds.http.commands.callables.xml.ParseSax;
|
||||||
|
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
|
@ -80,9 +80,9 @@ public class ListBucket extends S3FutureCommand<S3Bucket> {
|
||||||
*/
|
*/
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
S3Bucket attemptNotFound(ExecutionException e) throws ExecutionException {
|
S3Bucket attemptNotFound(ExecutionException e) throws ExecutionException {
|
||||||
if (e.getCause() != null && e.getCause() instanceof AWSResponseException) {
|
if (e.getCause() != null && e.getCause() instanceof HttpResponseException) {
|
||||||
AWSResponseException responseException = (AWSResponseException) e.getCause();
|
HttpResponseException responseException = (HttpResponseException) e.getCause();
|
||||||
if ("NoSuchBucket".equals(responseException.getError().getCode())) {
|
if (responseException.getResponse().getStatusCode() == 404) {
|
||||||
return S3Bucket.NOT_FOUND;
|
return S3Bucket.NOT_FOUND;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,10 +37,8 @@ import org.jclouds.aws.s3.internal.LiveS3Connection;
|
||||||
import org.jclouds.http.HttpConstants;
|
import org.jclouds.http.HttpConstants;
|
||||||
import org.jclouds.http.HttpErrorHandler;
|
import org.jclouds.http.HttpErrorHandler;
|
||||||
import org.jclouds.http.HttpRequestFilter;
|
import org.jclouds.http.HttpRequestFilter;
|
||||||
import org.jclouds.http.HttpRetryHandler;
|
|
||||||
import org.jclouds.http.annotation.ClientError;
|
import org.jclouds.http.annotation.ClientError;
|
||||||
import org.jclouds.http.annotation.ServerError;
|
import org.jclouds.http.annotation.ServerError;
|
||||||
import org.jclouds.http.handlers.BackoffLimitedRetryHandler;
|
|
||||||
import org.jclouds.logging.Logger;
|
import org.jclouds.logging.Logger;
|
||||||
|
|
||||||
import com.google.inject.AbstractModule;
|
import com.google.inject.AbstractModule;
|
||||||
|
@ -74,13 +72,12 @@ public class LiveS3ConnectionModule extends AbstractModule {
|
||||||
protected void configure() {
|
protected void configure() {
|
||||||
|
|
||||||
bind(S3Connection.class).to(LiveS3Connection.class).in(Scopes.SINGLETON);
|
bind(S3Connection.class).to(LiveS3Connection.class).in(Scopes.SINGLETON);
|
||||||
bind(HttpRetryHandler.class).to(BackoffLimitedRetryHandler.class).in(Scopes.SINGLETON);
|
bindErrorHandlers();
|
||||||
bindErrorHandler();
|
|
||||||
requestInjection(this);
|
requestInjection(this);
|
||||||
logger.info("S3 Context = %1$s://%2$s:%3$s", (isSecure ? "https" : "http"), address, port);
|
logger.info("S3 Context = %1$s://%2$s:%3$s", (isSecure ? "https" : "http"), address, port);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void bindErrorHandler() {
|
protected void bindErrorHandlers() {
|
||||||
bind(HttpErrorHandler.class).annotatedWith(ServerError.class).to(
|
bind(HttpErrorHandler.class).annotatedWith(ServerError.class).to(
|
||||||
ParseAWSErrorFromXmlContent.class).in(Scopes.SINGLETON);
|
ParseAWSErrorFromXmlContent.class).in(Scopes.SINGLETON);
|
||||||
bind(HttpErrorHandler.class).annotatedWith(ClientError.class).to(
|
bind(HttpErrorHandler.class).annotatedWith(ClientError.class).to(
|
||||||
|
|
|
@ -28,14 +28,11 @@ import static org.testng.Assert.assertEquals;
|
||||||
import org.jclouds.aws.s3.handlers.ParseAWSErrorFromXmlContent;
|
import org.jclouds.aws.s3.handlers.ParseAWSErrorFromXmlContent;
|
||||||
import org.jclouds.aws.s3.reference.S3Constants;
|
import org.jclouds.aws.s3.reference.S3Constants;
|
||||||
import org.jclouds.aws.s3.xml.config.S3ParserModule;
|
import org.jclouds.aws.s3.xml.config.S3ParserModule;
|
||||||
import org.jclouds.http.HttpErrorHandler;
|
|
||||||
import org.jclouds.http.annotation.ClientError;
|
|
||||||
import org.jclouds.http.annotation.ServerError;
|
|
||||||
import org.jclouds.http.config.JavaUrlHttpFutureCommandClientModule;
|
import org.jclouds.http.config.JavaUrlHttpFutureCommandClientModule;
|
||||||
|
import org.jclouds.http.handlers.DelegatingErrorHandler;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
import com.google.inject.Guice;
|
import com.google.inject.Guice;
|
||||||
import com.google.inject.Inject;
|
|
||||||
import com.google.inject.Injector;
|
import com.google.inject.Injector;
|
||||||
import com.google.inject.name.Names;
|
import com.google.inject.name.Names;
|
||||||
|
|
||||||
|
@ -69,28 +66,16 @@ public class S3ContextModuleTest {
|
||||||
}, new JavaUrlHttpFutureCommandClientModule());
|
}, new JavaUrlHttpFutureCommandClientModule());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class ServerErrorHandlerTest {
|
|
||||||
@Inject
|
|
||||||
@ServerError
|
|
||||||
HttpErrorHandler errorHandler;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testServerErrorHandler() {
|
void testServerErrorHandler() {
|
||||||
ServerErrorHandlerTest error = createInjector().getInstance(ServerErrorHandlerTest.class);
|
DelegatingErrorHandler handler = createInjector().getInstance(DelegatingErrorHandler.class);
|
||||||
assertEquals(error.errorHandler.getClass(), ParseAWSErrorFromXmlContent.class);
|
assertEquals(handler.getServerErrorHandler().getClass(), ParseAWSErrorFromXmlContent.class);
|
||||||
}
|
|
||||||
|
|
||||||
private static class ClientErrorHandlerTest {
|
|
||||||
@Inject
|
|
||||||
@ClientError
|
|
||||||
HttpErrorHandler errorHandler;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testClientErrorHandler() {
|
void testClientErrorHandler() {
|
||||||
ClientErrorHandlerTest handler = createInjector().getInstance(ClientErrorHandlerTest.class);
|
DelegatingErrorHandler handler = createInjector().getInstance(DelegatingErrorHandler.class);
|
||||||
assertEquals(handler.errorHandler.getClass(), ParseAWSErrorFromXmlContent.class);
|
assertEquals(handler.getClientErrorHandler().getClass(), ParseAWSErrorFromXmlContent.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -27,6 +27,8 @@ import org.jclouds.aws.s3.config.LiveS3ConnectionModule;
|
||||||
import org.jclouds.aws.s3.config.S3ConnectionModule;
|
import org.jclouds.aws.s3.config.S3ConnectionModule;
|
||||||
import org.jclouds.aws.s3.suncloud.handlers.ParseSunCloudS3ErrorFromXmlContent;
|
import org.jclouds.aws.s3.suncloud.handlers.ParseSunCloudS3ErrorFromXmlContent;
|
||||||
import org.jclouds.http.HttpErrorHandler;
|
import org.jclouds.http.HttpErrorHandler;
|
||||||
|
import org.jclouds.http.annotation.ClientError;
|
||||||
|
import org.jclouds.http.annotation.ServerError;
|
||||||
|
|
||||||
import com.google.inject.Scopes;
|
import com.google.inject.Scopes;
|
||||||
|
|
||||||
|
@ -38,9 +40,11 @@ import com.google.inject.Scopes;
|
||||||
@S3ConnectionModule
|
@S3ConnectionModule
|
||||||
public class SunCloudS3ConnectionModule extends LiveS3ConnectionModule {
|
public class SunCloudS3ConnectionModule extends LiveS3ConnectionModule {
|
||||||
|
|
||||||
protected void bindErrorHandler() {
|
protected void bindErrorHandlers() {
|
||||||
bind(HttpErrorHandler.class).to(ParseSunCloudS3ErrorFromXmlContent.class)
|
bind(HttpErrorHandler.class).annotatedWith(ServerError.class).to(
|
||||||
.in(Scopes.SINGLETON);
|
ParseSunCloudS3ErrorFromXmlContent.class).in(Scopes.SINGLETON);
|
||||||
|
bind(HttpErrorHandler.class).annotatedWith(ClientError.class).to(
|
||||||
|
ParseSunCloudS3ErrorFromXmlContent.class).in(Scopes.SINGLETON);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -29,6 +29,7 @@ import org.jclouds.http.annotation.ClientError;
|
||||||
import org.jclouds.http.annotation.Redirection;
|
import org.jclouds.http.annotation.Redirection;
|
||||||
import org.jclouds.http.annotation.ServerError;
|
import org.jclouds.http.annotation.ServerError;
|
||||||
|
|
||||||
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -41,24 +42,39 @@ public class DelegatingErrorHandler implements HttpErrorHandler {
|
||||||
|
|
||||||
@Redirection
|
@Redirection
|
||||||
@Inject(optional = true)
|
@Inject(optional = true)
|
||||||
private HttpErrorHandler redirectionHandler = new CloseContentAndSetExceptionErrorHandler();
|
@VisibleForTesting
|
||||||
|
HttpErrorHandler redirectionHandler = new CloseContentAndSetExceptionErrorHandler();
|
||||||
|
|
||||||
@ClientError
|
@ClientError
|
||||||
@Inject(optional = true)
|
@Inject(optional = true)
|
||||||
private HttpErrorHandler clientErrorHandler = new CloseContentAndSetExceptionErrorHandler();
|
@VisibleForTesting
|
||||||
|
HttpErrorHandler clientErrorHandler = new CloseContentAndSetExceptionErrorHandler();
|
||||||
|
|
||||||
@ServerError
|
@ServerError
|
||||||
@Inject(optional = true)
|
@Inject(optional = true)
|
||||||
private HttpErrorHandler serverErrorHandler = new CloseContentAndSetExceptionErrorHandler();
|
@VisibleForTesting
|
||||||
|
HttpErrorHandler serverErrorHandler = new CloseContentAndSetExceptionErrorHandler();
|
||||||
|
|
||||||
public void handleError(HttpFutureCommand<?> command, org.jclouds.http.HttpResponse response) {
|
public void handleError(HttpFutureCommand<?> command, org.jclouds.http.HttpResponse response) {
|
||||||
int statusCode = response.getStatusCode();
|
int statusCode = response.getStatusCode();
|
||||||
if (statusCode >= 300 && statusCode < 400) {
|
if (statusCode >= 300 && statusCode < 400) {
|
||||||
redirectionHandler.handleError(command, response);
|
getRedirectionHandler().handleError(command, response);
|
||||||
} else if (statusCode >= 400 && statusCode < 500) {
|
} else if (statusCode >= 400 && statusCode < 500) {
|
||||||
clientErrorHandler.handleError(command, response);
|
getClientErrorHandler().handleError(command, response);
|
||||||
} else if (statusCode >= 500) {
|
} else if (statusCode >= 500) {
|
||||||
serverErrorHandler.handleError(command, response);
|
getServerErrorHandler().handleError(command, response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public HttpErrorHandler getRedirectionHandler() {
|
||||||
|
return redirectionHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HttpErrorHandler getClientErrorHandler() {
|
||||||
|
return clientErrorHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HttpErrorHandler getServerErrorHandler() {
|
||||||
|
return serverErrorHandler;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,70 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Global Cloud Specialists, Inc. <info@globalcloudspecialists.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
package org.jclouds.http.handlers;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
import org.jclouds.http.HttpErrorHandler;
|
||||||
|
import org.jclouds.http.annotation.ClientError;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.inject.AbstractModule;
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit", testName = "core.DelegatingErrorHandlerTest")
|
||||||
|
public class DelegatingErrorHandlerTest {
|
||||||
|
|
||||||
|
public void testDefaultInjection() {
|
||||||
|
DelegatingErrorHandler handler = Guice.createInjector().getInstance(
|
||||||
|
DelegatingErrorHandler.class);
|
||||||
|
assertEquals(handler.getClientErrorHandler().getClass(),
|
||||||
|
CloseContentAndSetExceptionErrorHandler.class);
|
||||||
|
assertEquals(handler.getServerErrorHandler().getClass(),
|
||||||
|
CloseContentAndSetExceptionErrorHandler.class);
|
||||||
|
assertEquals(handler.getRedirectionHandler().getClass(),
|
||||||
|
CloseContentAndSetExceptionErrorHandler.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testClientHandlerInjection() {
|
||||||
|
DelegatingErrorHandler handler = Guice.createInjector(new AbstractModule() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void configure() {
|
||||||
|
bind(HttpErrorHandler.class).annotatedWith(ClientError.class).to(
|
||||||
|
DelegatingErrorHandler.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
}).getInstance(DelegatingErrorHandler.class);
|
||||||
|
assertEquals(handler.getClientErrorHandler().getClass(), DelegatingErrorHandler.class);
|
||||||
|
assertEquals(handler.getServerErrorHandler().getClass(),
|
||||||
|
CloseContentAndSetExceptionErrorHandler.class);
|
||||||
|
assertEquals(handler.getRedirectionHandler().getClass(),
|
||||||
|
CloseContentAndSetExceptionErrorHandler.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue