if (error.getReason().equals("noAdSenseAccount")) { System.out.println("Error handled! No AdSense account for this user."); } else if (error.getReason().equals("disapprovedAccount")) { System.out.println("Error handled! This account is disapproved."); } else if (error.getReason().equals("accountPendingReview")) { System.out.println("Error handled! This account is pending review."); } else { System.out.println(error.getMessage());
@Test public void testGetChangeRequestNotFound() { EasyMock.reset(batchMock); Capture<RpcBatch.Callback<Change>> callback = Capture.newInstance(); Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance(); batchMock.addGetChangeRequest( EasyMock.eq(ZONE_NAME), EasyMock.eq(CHANGE_REQUEST_COMPLETE.getGeneratedId()), EasyMock.capture(callback), EasyMock.capture(capturedOptions)); EasyMock.replay(batchMock); DnsBatchResult<ChangeRequest> batchResult = dnsBatch.getChangeRequest(ZONE_NAME, CHANGE_REQUEST_COMPLETE.getGeneratedId()); assertEquals(0, capturedOptions.getValue().size()); RpcBatch.Callback<Change> capturedCallback = callback.getValue(); GoogleJsonError error = new GoogleJsonError(); GoogleJsonError.ErrorInfo errorInfo = new GoogleJsonError.ErrorInfo(); errorInfo.setReason("reason"); errorInfo.setLocation("entity.parameters.changeId"); error.setCode(404); error.setErrors(ImmutableList.of(errorInfo)); capturedCallback.onFailure(error); assertNull(batchResult.get()); }
if (reason != null) { GoogleJsonError.ErrorInfo errorInfo = jsonError.getErrors().get(0); location = errorInfo.getLocation(); debugInfo = (String) errorInfo.get("debugInfo");
String reason = e.getDetails().getErrors().get(0).getReason(); if (INSTANCE_NOT_AUTHORIZED_REASON.equals(reason)) { String who = "you have";
String reason = e.getDetails().getErrors().get(0).getReason(); if (ADMIN_API_NOT_ENABLED_REASON.equals(reason)) { String apiLink =
String reason = e.getDetails().getErrors().get(0).getReason(); if (INSTANCE_NOT_AUTHORIZED_REASON.equals(reason)) { String who = "you have";
String reason = e.getDetails().getErrors().get(0).getReason(); if (ADMIN_API_NOT_ENABLED_REASON.equals(reason)) { String apiLink =
if (reason != null) { GoogleJsonError.ErrorInfo errorInfo = jsonError.getErrors().get(0); location = errorInfo.getLocation(); debugInfo = (String) errorInfo.get("debugInfo");
return; if (!e1.getDetails().getErrors().get(0).getReason().equals("resourceNotReady")) { throw e1;
public BaseServiceException(IOException exception, boolean idempotent) { super(message(exception), exception); int code = UNKNOWN_CODE; String reason = null; String location = null; String debugInfo = null; Boolean retryable = null; if (exception instanceof GoogleJsonResponseException) { GoogleJsonError jsonError = ((GoogleJsonResponseException) exception).getDetails(); if (jsonError != null) { Error error = new Error(jsonError.getCode(), reason(jsonError)); code = error.code; reason = error.reason; retryable = isRetryable(idempotent, error); if (reason != null) { GoogleJsonError.ErrorInfo errorInfo = jsonError.getErrors().get(0); location = errorInfo.getLocation(); debugInfo = (String) errorInfo.get("debugInfo"); } } else { code = ((GoogleJsonResponseException) exception).getStatusCode(); } } this.retryable = MoreObjects.firstNonNull(retryable, isRetryable(idempotent, exception)); this.code = code; this.reason = reason; this.idempotent = idempotent; this.location = location; this.debugInfo = debugInfo; }
@Override public BackgroundException map(final IOException failure) { final StringBuilder buffer = new StringBuilder(); if(failure instanceof GoogleJsonResponseException) { final GoogleJsonResponseException error = (GoogleJsonResponseException) failure; this.append(buffer, error.getDetails().getMessage()); switch(error.getDetails().getCode()) { case HttpStatus.SC_FORBIDDEN: final List<GoogleJsonError.ErrorInfo> errors = error.getDetails().getErrors(); for(GoogleJsonError.ErrorInfo info : errors) { if("usageLimits".equals(info.getDomain())) { return new RetriableAccessDeniedException(buffer.toString(), Duration.ofSeconds(5), failure); } } break; } } if(failure instanceof HttpResponseException) { final HttpResponseException response = (HttpResponseException) failure; this.append(buffer, response.getStatusMessage()); return new HttpResponseExceptionMappingService().map(new org.apache.http.client .HttpResponseException(response.getStatusCode(), buffer.toString())); } return super.map(failure); } }
private static ExceptionData makeExceptionData( GoogleJsonError googleJsonError, boolean idempotent, Set<BaseServiceException.Error> retryableErrors) { int code = googleJsonError.getCode(); String reason = reason(googleJsonError); ExceptionData.Builder exceptionData = ExceptionData.newBuilder(); exceptionData .setMessage(googleJsonError.getMessage()) .setCause(null) .setRetryable(BaseServiceException.isRetryable(code, reason, idempotent, retryableErrors)) .setCode(code) .setReason(reason); if (reason != null) { GoogleJsonError.ErrorInfo errorInfo = googleJsonError.getErrors().get(0); exceptionData.setLocation(errorInfo.getLocation()); exceptionData.setDebugInfo((String) errorInfo.get("debugInfo")); } else { exceptionData.setLocation(null); exceptionData.setDebugInfo(null); } return exceptionData.build(); }
@Before public void setUp() throws Exception { accessDenied = googleJsonResponseException( HttpStatusCodes.STATUS_CODE_FORBIDDEN, "Forbidden", "Forbidden"); statusOk = googleJsonResponseException( HttpStatusCodes.STATUS_CODE_OK, "A reason", "ok"); notFound = googleJsonResponseException( HttpStatusCodes.STATUS_CODE_NOT_FOUND, "Not found", "Not found"); badRange = googleJsonResponseException( ApiErrorExtractor.STATUS_CODE_RANGE_NOT_SATISFIABLE, "Bad range", "Bad range"); alreadyExists = googleJsonResponseException( 409, "409", "409"); resourceNotReady = googleJsonResponseException( 400, ApiErrorExtractor.RESOURCE_NOT_READY_REASON_CODE, "Resource not ready"); // This works because googleJsonResponseException takes final ErrorInfo ErrorInfo errorInfo = new ErrorInfo(); errorInfo.setReason(ApiErrorExtractor.RATE_LIMITED_REASON_CODE); notRateLimited = googleJsonResponseException(POSSIBLE_RATE_LIMIT, errorInfo, ""); errorInfo.setDomain(ApiErrorExtractor.USAGE_LIMITS_DOMAIN); rateLimited = googleJsonResponseException(POSSIBLE_RATE_LIMIT, errorInfo, ""); errorInfo.setDomain(ApiErrorExtractor.GLOBAL_DOMAIN); bigqueryRateLimited = googleJsonResponseException(POSSIBLE_RATE_LIMIT, errorInfo, ""); }
@Override public LowLevelHttpRequest buildRequest(String method, String url) throws IOException { ErrorInfo errorInfo = new ErrorInfo(); errorInfo.setReason(reason); errorInfo.setMessage(message); errorInfo.setFactory(jsonFactory); GenericJson error = new GenericJson(); error.set("code", status); error.set("errors", Arrays.asList(errorInfo)); error.setFactory(jsonFactory); GenericJson errorResponse = new GenericJson(); errorResponse.set("error", error); errorResponse.setFactory(jsonFactory); return new MockLowLevelHttpRequest() .setResponse( new MockLowLevelHttpResponse() .setContent(errorResponse.toPrettyString()) .setContentType(Json.MEDIA_TYPE) .setStatusCode(status)); } };
@Override public LowLevelHttpRequest buildRequest(String method, String url) throws IOException { ErrorInfo errorInfo = new ErrorInfo(); errorInfo.setReason(reason); errorInfo.setMessage(message); errorInfo.setFactory(jsonFactory); GenericJson error = new GenericJson(); error.set("code", status); error.set("errors", Arrays.asList(errorInfo)); error.setFactory(jsonFactory); GenericJson errorResponse = new GenericJson(); errorResponse.set("error", error); errorResponse.setFactory(jsonFactory); return new MockLowLevelHttpRequest() .setResponse( new MockLowLevelHttpResponse() .setContent(errorResponse.toPrettyString()) .setContentType(Json.MEDIA_TYPE) .setStatusCode(status)); } };
@Override public LowLevelHttpRequest buildRequest(String method, String url) throws IOException { errorInfo.setFactory(jsonFactory); GoogleJsonError jsonError = new GoogleJsonError(); jsonError.setCode(status); jsonError.setErrors(Collections.singletonList(errorInfo)); jsonError.setMessage(httpStatusString); jsonError.setFactory(jsonFactory); GenericJson errorResponse = new GenericJson(); errorResponse.set("error", jsonError); errorResponse.setFactory(jsonFactory); return new MockLowLevelHttpRequest() .setResponse( new MockLowLevelHttpResponse() .setContent(errorResponse.toPrettyString()) .setContentType(Json.MEDIA_TYPE) .setStatusCode(status)); } };
/** * Determine if a given GoogleJsonError is caused by, and only by, * a rate limit being applied. * @param e The GoogleJsonError returned by the request * @return True if the error is caused by a rate limit being applied. */ public boolean rateLimited(GoogleJsonError e) { ErrorInfo errorInfo = getErrorInfo(e); if (errorInfo != null) { String domain = errorInfo.getDomain(); String reason = errorInfo.getReason(); boolean isRateLimitedOrGlobalDomain = USAGE_LIMITS_DOMAIN.equals(domain) || GLOBAL_DOMAIN.equals(domain); boolean isRateLimitedReason = RATE_LIMITED_REASON_CODE.equals(reason) || USER_RATE_LIMITED_REASON_CODE.equals(reason); return isRateLimitedOrGlobalDomain && isRateLimitedReason; } return false; }
/** * Determine if a given GoogleJsonError is caused by, and only by, * a rate limit being applied. * @param e The GoogleJsonError returned by the request * @return True if the error is caused by a rate limit being applied. */ public boolean rateLimited(GoogleJsonError e) { ErrorInfo errorInfo = getErrorInfo(e); if (errorInfo != null) { String domain = errorInfo.getDomain(); String reason = errorInfo.getReason(); boolean isRateLimitedOrGlobalDomain = USAGE_LIMITS_DOMAIN.equals(domain) || GLOBAL_DOMAIN.equals(domain); boolean isRateLimitedReason = RATE_LIMITED_REASON_CODE.equals(reason) || USER_RATE_LIMITED_REASON_CODE.equals(reason); return isRateLimitedOrGlobalDomain && isRateLimitedReason; } return false; }
public BaseServiceException(GoogleJsonError googleJsonError, boolean idempotent) { super(googleJsonError.getMessage()); Error error = new Error(googleJsonError.getCode(), reason(googleJsonError)); this.code = error.code; this.reason = error.reason; this.retryable = isRetryable(idempotent, error); if (this.reason != null) { GoogleJsonError.ErrorInfo errorInfo = googleJsonError.getErrors().get(0); this.location = errorInfo.getLocation(); this.debugInfo = (String) errorInfo.get("debugInfo"); } else { this.location = null; this.debugInfo = null; } this.idempotent = idempotent; }
/** A helper that generates the error JSON payload that Google APIs produce. */ private static GoogleJsonErrorContainer errorWithReasonAndStatus(String reason, int status) { ErrorInfo info = new ErrorInfo(); info.setReason(reason); info.setDomain("global"); // GoogleJsonError contains one or more ErrorInfo objects; our utiities read the first one. GoogleJsonError error = new GoogleJsonError(); error.setErrors(ImmutableList.of(info)); error.setCode(status); error.setMessage(reason); // The actual JSON response is an error container. GoogleJsonErrorContainer container = new GoogleJsonErrorContainer(); container.setError(error); return container; }