package cloudone.client.internal; import cloudone.ServiceFullName; import cloudone.client.AnyInvoker; import cloudone.client.C1WebTarget; import cloudone.client.LaterAnyInvoker; import cloudone.internal.ApplicationFullName; import org.glassfish.jersey.client.JerseyClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sun.reflect.generics.reflectiveObjects.NotImplementedException; import javax.ws.rs.HttpMethod; import javax.ws.rs.client.Entity; import javax.ws.rs.core.GenericType; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriBuilder; import java.util.List; /** * @author Martin Mares (martin.mares at oracle.com) */ public class AnyInvokerImpl extends InvokerBase implements AnyInvoker { private static final Logger LOGGER = LoggerFactory.getLogger(AnyInvokerImpl.class); private final C1WebTarget.CodeInterval[] accepts; public AnyInvokerImpl(JerseyClient client, UriBuilder targetUri, ServiceFullName[] serviceFullNames, C1WebTarget.CodeInterval... accepts) { super(client, targetUri, serviceFullNames); this.accepts = accepts; } @Override public LaterAnyInvoker later() { throw new NotImplementedException(); } @Override public Response get() { return method(HttpMethod.GET); } @Override public <T> T get(Class<T> responseType) { return method(HttpMethod.GET, responseType); } @Override public <T> T get(GenericType<T> responseType) { return method(HttpMethod.GET, responseType); } @Override public Response put(Entity<?> entity) { return method(HttpMethod.PUT, entity); } @Override public <T> T put(Entity<?> entity, Class<T> responseType) { return method(HttpMethod.PUT, responseType); } @Override public <T> T put(Entity<?> entity, GenericType<T> responseType) { return method(HttpMethod.PUT, responseType); } @Override public Response post(Entity<?> entity) { return method(HttpMethod.POST, entity); } @Override public <T> T post(Entity<?> entity, Class<T> responseType) { return method(HttpMethod.POST, responseType); } @Override public <T> T post(Entity<?> entity, GenericType<T> responseType) { return method(HttpMethod.POST, responseType); } @Override public Response delete() { return method(HttpMethod.DELETE); } @Override public <T> T delete(Class<T> responseType) { return method(HttpMethod.DELETE, responseType); } @Override public <T> T delete(GenericType<T> responseType) { return method(HttpMethod.DELETE, responseType); } @Override public Response head() { return method(HttpMethod.HEAD); } @Override public Response options() { return method(HttpMethod.OPTIONS); } @Override public <T> T options(Class<T> responseType) { return method(HttpMethod.OPTIONS, responseType); } @Override public <T> T options(GenericType<T> responseType) { return method(HttpMethod.OPTIONS, responseType); } @Override public Response trace() { throw new NotImplementedException(); } @Override public <T> T trace(Class<T> responseType) { throw new NotImplementedException(); } @Override public <T> T trace(GenericType<T> responseType) { throw new NotImplementedException(); } @Override public Response method(String name) { return method(name, (Entity) null); } @Override public <T> T method(String name, Class<T> responseType) { return method(name, null, responseType); } @Override public <T> T method(String name, GenericType<T> responseType) { return method(name, null, responseType); } protected boolean isResponseCodeAcceptable(int code) { if (accepts != null) { for (C1WebTarget.CodeInterval accept : accepts) { if (accept.isInInterval(code)) { return true; } } return false; } else { return true; } } @Override public Response method(String name, Entity<?> entity) { if (LOGGER.isDebugEnabled()) { LOGGER.debug("method(" + name + ")"); } List<ApplicationFullName> targetApplications = super.findTargetApplications(name); for (ApplicationFullName targetApplication : targetApplications) { Response result = method(targetApplication, name, entity); if (result != null) { return result; } } return null; } @Override public <T> T method(String name, Entity<?> entity, Class<T> responseType) { Response response = method(name, entity); return response.readEntity(responseType); } @Override public <T> T method(String name, Entity<?> entity, GenericType<T> responseType) { Response response = method(name, entity); return response.readEntity(responseType); } @Override public AnyInvokerImpl accept(String... responseMediaTypes) { super.accept(responseMediaTypes); return this; } @Override public AnyInvokerImpl accept(MediaType... mediaTypes) { super.accept(mediaTypes); return this; } }