/**
*
*/
package org.jboss.resteasy.client.core.extractors;
import org.jboss.resteasy.client.ClientResponseFailure;
import org.jboss.resteasy.client.core.BaseClientResponse;
import org.jboss.resteasy.resteasy_jaxrs.i18n.Messages;
import javax.ws.rs.ext.MessageBodyReader;
import java.io.InputStream;
import java.lang.reflect.Method;
/**
* BodyEntityExtractor extract body objects from responses. This ends up calling
* the appropriate MessageBodyReader through a series of calls
*
* @author <a href="mailto:sduskis@gmail.com">Solomon Duskis</a>
* @version $Revision: 1 $
* @see EntityExtractorFactory
* @see MessageBodyReader
*/
@SuppressWarnings("unchecked")
public class BodyEntityExtractor implements EntityExtractor
{
private final Method method;
public BodyEntityExtractor(Method method)
{
this.method = method;
}
public Object extractEntity(ClientRequestContext context, Object... args)
{
final BaseClientResponse response = context.getClientResponse();
try
{
response.checkFailureStatus();
}
catch (ClientResponseFailure ce)
{
// If ClientResponseFailure do a copy of the response and then release the connection,
// we need to use the copy here and not the original response
context.getErrorHandler().clientErrorHandling((BaseClientResponse) ce.getResponse(), ce);
}
catch (RuntimeException e)
{
context.getErrorHandler().clientErrorHandling(response, e);
}
// only release connection if it is not an instance of an
// InputStream
boolean releaseConnectionAfter = true;
try
{
// void methods should be handled before this method gets called, but it's worth being defensive
if (method.getReturnType() == null)
{
// throw new RuntimeException(
// "No type information to extract entity with. You use other getEntity() methods");
throw new RuntimeException(Messages.MESSAGES.noTypeInformationForEntity());
}
Object obj = response.getEntity(method.getReturnType(), method.getGenericReturnType());
if (obj instanceof InputStream)
{
releaseConnectionAfter = false;
// we make sure that on GC, the Response does not release the InputStream
response.setWasReleased(true);
}
return obj;
}
catch (RuntimeException e)
{
context.getErrorHandler().clientErrorHandling(response, e);
}
finally
{
if (releaseConnectionAfter)
response.releaseConnection();
}
throw new RuntimeException(Messages.MESSAGES.shouldBeUnreachable());
}
}