/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.vipr.client.impl.jersey; import com.emc.storageos.model.errorhandling.ServiceErrorRestRep; import com.emc.vipr.client.exceptions.ServiceErrorException; import com.emc.vipr.client.exceptions.ViPRHttpException; import com.sun.jersey.api.client.ClientHandlerException; import com.sun.jersey.api.client.ClientRequest; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.filter.ClientFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.ws.rs.core.MediaType; /** * Jersey filter that throws an Exception if the status code is 4xx or 5xx. Without this, Jersey * will try to parse the response and you will get a parse exception. */ public class ExceptionOnErrorFilter extends ClientFilter { private Logger log = LoggerFactory.getLogger(getClass()); @Override public ClientResponse handle(ClientRequest request) throws ClientHandlerException { ClientResponse response = getNext().handle(request); int status = response.getStatus(); if (status >= 400 && status < 600) { if (isSupportedType(response.getType())) { ServiceErrorRestRep serviceError; try { serviceError = response.getEntity(ServiceErrorRestRep.class); } catch (Exception e) { // Cause to fall-through to default exception log.error("Error parsing error message", e); serviceError = null; } if (serviceError != null) { logAndThrow(new ServiceErrorException(status, serviceError)); } } // Fallback for unknown entity types String content = response.getEntity(String.class); logAndThrow(new ViPRHttpException(status, content)); } return response; } private void logAndThrow(RuntimeException e) { log.error(e.getMessage()); throw e; } private boolean isSupportedType(MediaType type) { return type.isCompatible(MediaType.APPLICATION_JSON_TYPE) || type.isCompatible(MediaType.APPLICATION_XML_TYPE) || type.isCompatible(MediaType.TEXT_XML_TYPE); } }