/*
* COMSAT
* Copyright (c) 2013-2014, Parallel Universe Software Co. All rights reserved.
*
* This program and the accompanying materials are dual-licensed under
* either the terms of the Eclipse Public License v1.0 as published by
* the Eclipse Foundation
*
* or (per the licensee's choosing)
*
* under the terms of the GNU Lesser General Public License version 3.0
* as published by the Free Software Foundation.
*/
package co.paralleluniverse.fibers.ws.rs.client;
import co.paralleluniverse.fibers.SuspendExecution;
import co.paralleluniverse.fibers.Suspendable;
import java.util.Locale;
import javax.ws.rs.client.AsyncInvoker;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.Invocation.Builder;
import javax.ws.rs.core.CacheControl;
import javax.ws.rs.core.Cookie;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
class FiberBuilder implements Invocation.Builder {
private static final String GET = "GET";
private static final String PUT = "PUT";
private static final String POST = "POST";
private static final String DELETE = "DELETE";
private static final String HEAD = "HEAD";
private static final String OPTIONS = "OPTIONS";
private static final String TRACE = "TRACE";
final javax.ws.rs.client.Invocation.Builder builder;
public FiberBuilder(Builder builder) {
this.builder = builder;
}
// Wrap FiberInvocation
@Override
public Invocation build(String method) {
return new FiberInvocation(builder.build(method));
}
@Override
public Invocation build(String method, Entity<?> entity) {
return new FiberInvocation(builder.build(method, entity));
}
@Override
public Invocation buildGet() {
return new FiberInvocation(builder.buildGet());
}
@Override
public Invocation buildDelete() {
return new FiberInvocation(builder.buildDelete());
}
@Override
public Invocation buildPost(Entity<?> entity) {
return new FiberInvocation(builder.buildPost(entity));
}
@Override
public Invocation buildPut(Entity<?> entity) {
return new FiberInvocation(builder.buildPut(entity));
}
// Return this instead of builder
@Override
public Builder accept(String... mediaTypes) {
builder.accept(mediaTypes);
return this;
}
@Override
public Builder accept(MediaType... mediaTypes) {
builder.accept(mediaTypes);
return this;
}
@Override
public Builder acceptLanguage(Locale... locales) {
builder.acceptLanguage(locales);
return this;
}
@Override
public Builder acceptLanguage(String... locales) {
builder.acceptLanguage(locales);
return this;
}
@Override
public Builder acceptEncoding(String... encodings) {
builder.acceptEncoding(encodings);
return this;
}
@Override
public Builder cookie(Cookie cookie) {
builder.cookie(cookie);
return this;
}
@Override
public Builder cookie(String name, String value) {
builder.cookie(name, value);
return this;
}
@Override
public Builder cacheControl(CacheControl cacheControl) {
builder.cacheControl(cacheControl);
return this;
}
@Override
public Builder header(String name, Object value) {
builder.header(name, value);
return this;
}
@Override
public Builder headers(MultivaluedMap<String, Object> headers) {
builder.headers(headers);
return this;
}
@Override
public Builder property(String name, Object value) {
builder.property(name, value);
return this;
}
// Suspendable Functions
@Override
@Suspendable
public Response get() {
return method(GET);
}
@Override
@Suspendable
public <T> T get(Class<T> responseType) {
return method(GET,responseType);
}
@Override
@Suspendable
public <T> T get(GenericType<T> responseType) {
return method(GET,responseType);
}
@Override
@Suspendable
public Response put(final Entity<?> entity) {
return method(PUT,entity);
}
@Override
@Suspendable
public <T> T put(final Entity<?> entity, Class<T> responseType) {
return method(PUT,entity,responseType);
}
@Override
@Suspendable
public <T> T put(final Entity<?> entity, GenericType<T> responseType) {
return method(PUT,entity,responseType);
}
@Override
@Suspendable
public Response post(final Entity<?> entity) {
return method(POST,entity);
}
@Override
@Suspendable
public <T> T post(final Entity<?> entity, Class<T> responseType) {
return method(POST,entity,responseType);
}
@Override
@Suspendable
public <T> T post(final Entity<?> entity, GenericType<T> responseType) {
return method(POST,entity,responseType);
}
@Override
@Suspendable
public Response delete() {
return method(DELETE);
}
@Override
@Suspendable
public <T> T delete(Class<T> responseType) {
return method(DELETE,responseType);
}
@Override
@Suspendable
public <T> T delete(GenericType<T> responseType) {
return method(DELETE,responseType);
}
@Override
@Suspendable
public Response head() {
return method(HEAD);
}
@Override
@Suspendable
public Response options() {
return method(OPTIONS);
}
@Override
@Suspendable
public <T> T options(Class<T> responseType) {
return method(OPTIONS,responseType);
}
@Override
@Suspendable
public <T> T options(GenericType<T> responseType) {
return method(OPTIONS,responseType);
}
@Override
@Suspendable
public Response trace() {
return method(TRACE);
}
@Override
@Suspendable
public <T> T trace(Class<T> responseType) {
return method(TRACE,responseType);
}
@Override
@Suspendable
public <T> T trace(GenericType<T> responseType) {
return method(TRACE,responseType);
}
@Override
@Suspendable
public Response method(final String name) {
try {
return new AsyncRs<Response>() {
@Override
protected void requestAsync() {
builder.async().method(name, this);
}
}.run();
} catch (SuspendExecution ex) {
throw new AssertionError(ex);
}
}
@Override
@Suspendable
public <T> T method(final String name, Class<T> responseType) {
try {
return new AsyncRs<Response>() {
@Override
protected void requestAsync() {
builder.async().method(name, this);
}
}.run().readEntity(responseType);
} catch (SuspendExecution ex) {
throw new AssertionError(ex);
}
}
@Override
@Suspendable
public <T> T method(String name, GenericType<T> responseType) {
return this.method(name, (Class<T>)responseType.getRawType());
}
@Override
@Suspendable
public Response method(final String name, final Entity<?> entity) {
try {
return new AsyncRs<Response>() {
@Override
protected void requestAsync() {
builder.async().method(name, entity, this);
}
}.run();
} catch (SuspendExecution ex) {
throw new AssertionError(ex);
}
}
@Override
@Suspendable
public <T> T method(final String name, final Entity<?> entity, Class<T> responseType) {
try {
return new AsyncRs<T>() {
@Override
protected void requestAsync() {
builder.async().method(name, entity, this);
}
}.run();
} catch (SuspendExecution ex) {
throw new AssertionError(ex);
}
}
@Override
@Suspendable
public <T> T method(final String name, final Entity<?> entity, GenericType<T> responseType) {
try {
return new AsyncRs<T>() {
@Override
protected void requestAsync() {
builder.async().method(name, entity, this);
}
}.run();
} catch (SuspendExecution ex) {
throw new AssertionError(ex);
}
}
// Delegations
@Override
public AsyncInvoker async() {
return builder.async();
}
@Override
public int hashCode() {
return builder.hashCode();
}
@Override
public boolean equals(Object obj) {
return builder.equals(obj);
}
@Override
public String toString() {
return builder.toString();
}
}