package com.urbanairship.api.reports; import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.urbanairship.api.client.Request; import com.urbanairship.api.client.RequestUtils; import com.urbanairship.api.client.ResponseParser; import com.urbanairship.api.common.parse.DateFormats; import com.urbanairship.api.reports.model.Precision; import com.urbanairship.api.reports.model.PushSeriesResponse; import com.urbanairship.api.reports.parse.ReportsObjectMapper; import org.apache.http.HttpHeaders; import org.apache.http.client.utils.URIBuilder; import org.apache.http.entity.ContentType; import org.joda.time.DateTime; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.HashMap; import java.util.Map; public class PushSeriesRequest implements Request<PushSeriesResponse> { private final static String API_PER_PUSH_SERIES = "/api/reports/perpush/series/"; private final String path; private Optional<DateTime> start; private Optional<DateTime> end; private Optional<Precision> precision; private PushSeriesRequest(String path) { this.path = path; this.start = Optional.absent(); this.end = Optional.absent(); this.precision = Optional.absent(); } public static PushSeriesRequest newRequest(String pushId) { return new PushSeriesRequest(API_PER_PUSH_SERIES + pushId); } /** * Set the request start date * * @return PushSeriesRequest */ public PushSeriesRequest setStart(DateTime start) { this.start = Optional.of(start); return this; } /** * Set the request end date * * @return PushSeriesRequest */ public PushSeriesRequest setEnd(DateTime end) { this.end = Optional.of(end); return this; } /** * Set the request precision * * @return PushSeriesRequest */ public PushSeriesRequest setPrecision(Precision precision) { this.precision = Optional.of(precision); return this; } @Override public ContentType getContentType() { return null; } @Override public Map<String, String> getRequestHeaders() { Map<String, String> headers = new HashMap<String, String>(); headers.put(HttpHeaders.ACCEPT, UA_VERSION_JSON); return headers; } @Override public Request.HttpMethod getHttpMethod() { return Request.HttpMethod.GET; } @Override public String getRequestBody() { return null; } @Override public URI getUri(URI baseUri) throws URISyntaxException { URIBuilder builder = new URIBuilder(RequestUtils.resolveURI(baseUri, path)); if (precision.isPresent()) { builder.addParameter("precision", this.precision.get().toString()); } if (start.isPresent()) { Preconditions.checkArgument(this.precision.isPresent(), "precision must be present if start is included"); builder.addParameter("start", this.start.get().toString(DateFormats.DATE_FORMATTER)); if (end.isPresent()) { Preconditions.checkArgument(this.end.get().isAfter(this.start.get()), "end date must occur after start date"); builder.addParameter("end", this.end.get().toString(DateFormats.DATE_FORMATTER)); } } return builder.build(); } @Override public ResponseParser<PushSeriesResponse> getResponseParser() { return new ResponseParser<PushSeriesResponse>() { @Override public PushSeriesResponse parse(String response) throws IOException { return ReportsObjectMapper.getInstance().readValue(response, PushSeriesResponse.class); } }; } }