package net.iponweb.disthene.reader.handler;
import com.google.gson.Gson;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.*;
import net.iponweb.disthene.reader.exceptions.MissingParameterException;
import net.iponweb.disthene.reader.exceptions.ParameterParsingException;
import net.iponweb.disthene.reader.exceptions.UnsupportedMethodException;
import net.iponweb.disthene.reader.service.metric.MetricService;
import org.apache.log4j.Logger;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
/**
* @author Andrei Ivanov
*/
public class MetricsHandler implements DistheneReaderHandler {
final static Logger logger = Logger.getLogger(MetricsHandler.class);
private MetricService metricService;
public MetricsHandler(MetricService metricService) {
this.metricService = metricService;
}
@Override
public FullHttpResponse handle(HttpRequest request) throws ParameterParsingException, ExecutionException, InterruptedException {
MetricsParameters parameters = parse(request);
logger.debug("Got request: " + parameters);
FullHttpResponse response = new DefaultFullHttpResponse(
HttpVersion.HTTP_1_1,
HttpResponseStatus.OK,
Unpooled.wrappedBuffer(metricService.getMetricsAsJson(parameters.getTenant(), parameters.getPath(), parameters.getFrom(), parameters.getTo()).getBytes()));
response.headers().set(HttpHeaders.Names.CONTENT_TYPE, "application/json");
response.headers().set(HttpHeaders.Names.CONTENT_LENGTH, response.content().readableBytes());
return response;
}
private MetricsParameters parse(HttpRequest request) throws ParameterParsingException, UnsupportedMethodException {
QueryStringDecoder queryStringDecoder = new QueryStringDecoder(request.getUri());
if (request.getMethod().equals(HttpMethod.GET)) {
MetricsParameters parameters = new MetricsParameters();
if (queryStringDecoder.parameters().get("tenant") != null) {
parameters.setTenant(queryStringDecoder.parameters().get("tenant").get(0));
} else {
// assume tenant "NONE"
parameters.setTenant("NONE");
logger.debug("No tenant in request. Assuming NONE");
}
if (queryStringDecoder.parameters().get("path") != null) {
for (String path : queryStringDecoder.parameters().get("path")) {
parameters.getPath().add(path);
}
} else {
throw new MissingParameterException("Path parameter is missing");
}
if (queryStringDecoder.parameters().get("from") != null) {
parameters.setFrom(Long.valueOf(queryStringDecoder.parameters().get("from").get(0)));
} else {
throw new MissingParameterException("From parameter is missing");
}
if (queryStringDecoder.parameters().get("to") != null) {
parameters.setTo(Long.valueOf(queryStringDecoder.parameters().get("to").get(0)));
} else {
throw new MissingParameterException("To parameter is missing");
}
return parameters;
} else if (request.getMethod().equals(HttpMethod.POST)) {
MetricsParameters parameters =
new Gson().fromJson(((HttpContent) request).content().toString(Charset.defaultCharset()), MetricsParameters.class);
if (parameters.getTenant() == null) {
// assume tenant "NONE"
parameters.setTenant("NONE");
logger.debug("No tenant in request. Assuming value of NONE");
}
if (parameters.getPath().size() == 0) {
throw new MissingParameterException("Path parameter is missing");
}
if (parameters.getFrom() == null) {
throw new MissingParameterException("From parameter is missing");
}
if (parameters.getTo() == null) {
throw new MissingParameterException("To parameter is missing");
}
return parameters;
} else {
throw new UnsupportedMethodException("Method is not supported: " + request.getMethod().name());
}
}
private class MetricsParameters {
private String tenant;
private List<String> path = new ArrayList<>();
private Long from;
private Long to;
public String getTenant() {
return tenant;
}
public void setTenant(String tenant) {
this.tenant = tenant;
}
public List<String> getPath() {
return path;
}
public void setPath(List<String> paths) {
this.path = paths;
}
public Long getFrom() {
return from;
}
public void setFrom(Long from) {
this.from = from;
}
public Long getTo() {
return to;
}
public void setTo(Long to) {
this.to = to;
}
@Override
public String toString() {
return "MetricsParameters{" +
"tenant='" + tenant + '\'' +
", path=" + path +
", from=" + from +
", to=" + to +
'}';
}
}
}