package cloudone.client.internal; import java.util.concurrent.TimeUnit; import javax.ws.rs.HttpMethod; import javax.ws.rs.client.Entity; import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.UriBuilder; import cloudone.ServiceFullName; import cloudone.client.LaterAllInvoker; import cloudone.client.LaterInvoker; import cloudone.internal.nimbostratus.CumulonimbusClient; import org.glassfish.jersey.client.JerseyClient; import org.glassfish.jersey.client.JerseyWebTarget; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author Martin Mares (martin.mares at oracle.com) */ public class LaterAllInvokerImpl implements LaterAllInvoker { private static final Logger LOGGER = LoggerFactory.getLogger(LaterAllInvokerImpl.class); private final JerseyClient client; private final UriBuilder targetUri; private final ServiceFullName[] serviceFullNames; private final String responsePath; private final ServiceFullName responseService; private final int retentionCount; private final long retetionPeriod; private final TimeUnit retentionTimeUnit; public LaterAllInvokerImpl(JerseyClient client, UriBuilder targetUri, ServiceFullName[] serviceFullNames, String responsePath, ServiceFullName responseService, int retentionCount, long retentionPeriod, TimeUnit retentionTimeUnit) { this.client = client; this.targetUri = targetUri; this.serviceFullNames = serviceFullNames; this.responsePath = responsePath; this.responseService = responseService; this.retentionCount = retentionCount; this.retetionPeriod = retentionPeriod; if (retentionPeriod >= 0 && retentionTimeUnit == null) { retentionTimeUnit = TimeUnit.MILLISECONDS; } this.retentionTimeUnit = retentionTimeUnit; } LaterAllInvokerImpl(JerseyClient client, UriBuilder targetUri, ServiceFullName[] serviceFullNames) { this(client, targetUri, serviceFullNames,null, null, -1, -1, null); } @Override public LaterInvoker responseTo(String path) { return new LaterAllInvokerImpl(client, targetUri, serviceFullNames, path, //responsePath responseService, retentionCount, retetionPeriod, retentionTimeUnit); } @Override public LaterInvoker responseTo(ServiceFullName service, String path) { return new LaterAllInvokerImpl(client, targetUri, serviceFullNames, path, //responsePath service, //responseService, retentionCount, retetionPeriod, retentionTimeUnit); } @Override public LaterInvoker retentionCount(int count) { return new LaterAllInvokerImpl(client, targetUri, serviceFullNames, responsePath, responseService, count, //retentionCount, retetionPeriod, retentionTimeUnit); } @Override public LaterInvoker retentionTime(long period, TimeUnit timeUnit) { return new LaterAllInvokerImpl(client, targetUri, serviceFullNames, responsePath, responseService, retentionCount, period, //retetionPeriod, timeUnit); //retentionTimeUnit); } @Override public String method(String name, Entity<?> entity) { JerseyWebTarget target = client.target(CumulonimbusClient.getInstance().getTargetUrl()) .path("/later/all"); return doMethod(target, name, entity); } @Override public String method(String name) { return method(name, null); } @Override public String get() { return method(HttpMethod.GET); } @Override public String put(Entity<?> entity) { return method(HttpMethod.PUT, entity); } @Override public String post(Entity<?> entity) { return method(HttpMethod.POST, entity); } @Override public String delete() { return method(HttpMethod.DELETE); } @Override public String head() { return method(HttpMethod.HEAD); } @Override public String options() { return method(HttpMethod.OPTIONS); } private String targetServices2String() { StringBuilder result = new StringBuilder(); if (serviceFullNames != null) { for (ServiceFullName serviceFullName : serviceFullNames) { if (result.length() > 0) { result.append(";"); } result.append(serviceFullName.toString()); } } return result.toString(); } private String doMethod(WebTarget t, String name, Entity<?> entity) { Invocation.Builder request = t.queryParam("method", name) .queryParam("uri", targetUri.build().toString()) .queryParam("services", targetServices2String()) .queryParam("retention-count", retentionCount) .request(); if (entity == null) { return request.build(name).invoke(String.class); } else { return request.build(name, entity).invoke(String.class); } } }