package org.jboss.resteasy.client.jaxrs.internal.proxy.extractors; import org.jboss.resteasy.annotations.ResponseObject; import org.jboss.resteasy.client.jaxrs.internal.ClientInvocation; import org.jboss.resteasy.client.jaxrs.internal.ClientResponse; import javax.ws.rs.core.Response; import java.lang.reflect.Method; /** * @author Solomon.Duskis */ @SuppressWarnings("unchecked") public class DefaultEntityExtractorFactory implements EntityExtractorFactory { public static final EntityExtractor clientResponseExtractor = new EntityExtractor<ClientResponse>() { public ClientResponse extractEntity(ClientContext context, Object... args) { return context.getClientResponse(); } }; public static EntityExtractor<Response.Status> createStatusExtractor(final boolean release) { return new EntityExtractor<Response.Status>() { public Response.Status extractEntity(ClientContext context, Object... args) { if (release) context.getClientResponse().close(); return Response.Status.fromStatusCode(context.getClientResponse().getStatus()); } }; } public static final EntityExtractor createVoidExtractor() { return new EntityExtractor() { public Object extractEntity(ClientContext context, Object... args) { ClientResponse response = context.getClientResponse(); int status = response.getStatus(); if (status >= 400) { response.bufferEntity(); response.close(); ClientInvocation.handleErrorStatus(response); } response.close(); return null; } }; } public EntityExtractor createExtractor(final Method method) { final Class returnType = method.getReturnType(); if (isVoidReturnType(returnType)) return createVoidExtractor(); if (returnType.equals(Response.Status.class)) return createStatusExtractor(true); if (Response.class.isAssignableFrom(returnType)) return clientResponseExtractor; if (returnType.isInterface() && returnType.isAnnotationPresent(ResponseObject.class)) return new ResponseObjectProxy(method, new ResponseObjectEntityExtractorFactory()); return new BodyEntityExtractor(method); } protected EntityExtractor createResponseTypeEntityExtractor(final Method method) { return new EntityExtractor<Response>() { @Override public Response extractEntity(ClientContext context, Object... args) { return context.getClientResponse(); } }; } public static final boolean isVoidReturnType(Class<?> returnType) { return returnType == null || void.class.equals(returnType) || Void.class.equals(returnType); } }