/**
*
*/
package org.jboss.resteasy.client.jaxrs.internal.proxy.extractors;
import org.jboss.resteasy.client.jaxrs.i18n.Messages;
import org.jboss.resteasy.client.jaxrs.internal.ClientInvocation;
import org.jboss.resteasy.client.jaxrs.internal.ClientResponse;
import javax.ws.rs.core.GenericType;
import java.io.InputStream;
import java.io.Reader;
import java.lang.reflect.Method;
import java.lang.reflect.TypeVariable;
/**
* BodyEntityExtractor extract body objects from responses. This ends up calling
* the appropriate MessageBodyReader through a series of calls
*
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @author <a href="mailto:sduskis@gmail.com">Solomon Duskis</a>
* @version $Revision: 1 $
* @see org.jboss.resteasy.client.core.extractors.EntityExtractorFactory
* @see javax.ws.rs.ext.MessageBodyReader
*/
@SuppressWarnings("unchecked")
public class BodyEntityExtractor implements EntityExtractor
{
private final Method method;
public BodyEntityExtractor(Method method)
{
this.method = method;
}
public Object extractEntity(ClientContext context, Object... args)
{
ClientResponse response = context.getClientResponse();
// only release connection if it is not an instance of an
// InputStream
boolean releaseConnectionAfter = response.getStatus() >=200 && response.getStatus() < 300;
try
{
// void methods should be handled before this method gets called, but it's worth being defensive
if (method.getReturnType() == null)
{
throw new RuntimeException(Messages.MESSAGES.noTypeInformation());
}
GenericType gt = null;
if (method.getGenericReturnType() != null && !(method.getGenericReturnType() instanceof TypeVariable))
{
gt = new GenericType(method.getGenericReturnType());
}
else
{
gt = new GenericType(method.getReturnType());
}
Object obj = ClientInvocation.extractResult(gt, response, method.getAnnotations());
if (obj instanceof InputStream || obj instanceof Reader)
releaseConnectionAfter = false;
return obj;
}
finally
{
if (releaseConnectionAfter)
response.close();
}
}
}