/** * Copyright 2014 Opower, Inc. * Licensed 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 com.opower.rest.client.generator.extractors; import com.google.common.base.Optional; import com.opower.rest.client.generator.core.BaseClientResponse; import com.opower.rest.client.generator.core.ClientErrorInterceptor; import com.opower.rest.client.generator.core.ClientResponseFailure; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; /** * This class handles client errors (of course...). * * @author Solomon.Duskis */ // TODO: expand this class for more robust, complicated error handling public class DefaultClientErrorHandler implements ClientErrorHandler { private static final Logger LOG = LoggerFactory.getLogger(DefaultClientErrorHandler.class); private final List<ClientErrorInterceptor> interceptors; public DefaultClientErrorHandler(List<ClientErrorInterceptor> interceptors) { this.interceptors = Optional.fromNullable(interceptors).or(new ArrayList<ClientErrorInterceptor>()); } @Override @SuppressWarnings("unchecked") public void clientErrorHandling(Method method, BaseClientResponse clientResponse, RuntimeException e) { // Only ClientResponseFailures represent an error response from the server // so only such exceptions should be handled by the ClientErrorInterceptors if (e instanceof ClientResponseFailure) { for (ClientErrorInterceptor handler : interceptors) { try { // attempt to reset the stream in order to provide a fresh stream // to each ClientErrorInterceptor -- failing to reset the stream // could mean that an unusable stream will be passed to the // interceptor InputStream stream = clientResponse.getStreamFactory().getInputStream(); if (stream != null) { stream.reset(); } } catch (IOException e1) { LOG.warn("problem while handling errors", e1); } handler.handle(clientResponse); } } else { String status = clientResponse == null ? "null" : Integer.toString(clientResponse.getStatus()); LOG.warn("The HTTP request was successful and retuned a status of {}. However, there was a problem processing " + "the response on the client side. Usually this is a deserialization problem, check the configuration " + "of your MessageBodyReader.", status); } throw e; } }