Skip to content

Commit

Permalink
Fix for enhancement #37 Create a way to get response JSON from a query.
Browse files Browse the repository at this point in the history
  • Loading branch information
Jeff Sabin committed Jun 19, 2015
1 parent b56f311 commit 2427cde
Show file tree
Hide file tree
Showing 5 changed files with 181 additions and 58 deletions.
56 changes: 7 additions & 49 deletions src/main/java/org/kairosdb/client/AbstractClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,9 @@
*/
package org.kairosdb.client;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.stream.JsonReader;
import org.kairosdb.client.builder.MetricBuilder;
import org.kairosdb.client.builder.QueryBuilder;
import org.kairosdb.client.deserializer.GroupByDeserializer;
import org.kairosdb.client.deserializer.ResultsDeserializer;
import org.kairosdb.client.response.*;

import java.io.IOException;
Expand All @@ -31,11 +27,8 @@
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.kairosdb.client.util.Preconditions.checkNotNullOrEmpty;

Expand All @@ -45,8 +38,8 @@
public abstract class AbstractClient implements Client
{
private String url;
private Gson mapper;
private Map<String, Class> customGroupTypes = new HashMap<String, Class>();
private JsonMapper mapper;
private DataPointTypeRegistry typeRegistry;

/**
* Creates a client
Expand All @@ -58,13 +51,8 @@ protected AbstractClient(String url) throws MalformedURLException
this.url = checkNotNullOrEmpty(url);
new URL(url); // validate url

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(GroupResult.class, new GroupByDeserializer());
builder.registerTypeAdapter(Results.class, new ResultsDeserializer(this));
mapper = builder.create();

customGroupTypes.put("number", Number.class);
customGroupTypes.put("text", String.class);
typeRegistry = new DataPointTypeRegistry();
mapper = new JsonMapper(typeRegistry);
}

@Override
Expand Down Expand Up @@ -92,35 +80,7 @@ public QueryResponse query(QueryBuilder builder) throws URISyntaxException, IOEx
int responseCode = clientResponse.getStatusCode();

InputStream stream = clientResponse.getContentStream();
if (stream != null)
{
InputStreamReader reader = new InputStreamReader(stream);
try
{
if (responseCode >= 400)
{
QueryResponse response = new QueryResponse();
response.setStatusCode(responseCode);
ErrorResponse errorResponse = mapper.fromJson(reader, ErrorResponse.class);
response.addErrors(errorResponse.getErrors());
return response;
}
else
{
QueryResponse response = mapper.fromJson(reader, QueryResponse.class);
response.setStatusCode(responseCode);
return response;
}
}
finally
{
reader.close();
}
}

QueryResponse response = new QueryResponse();
response.setStatusCode(responseCode);
return response;
return new QueryResponse(mapper, responseCode, stream);
}

@Override
Expand Down Expand Up @@ -153,15 +113,13 @@ public Response delete(QueryBuilder builder) throws URISyntaxException, IOExcept
@Override
public void registerCustomDataType(String groupType, Class dataPointClass)
{
checkArgument(!customGroupTypes.containsKey(groupType), "Type has already been registered");

customGroupTypes.put(groupType, dataPointClass);
typeRegistry.registerCustomDataType(groupType, dataPointClass);
}

@Override
public Class getDataPointValueClass(String groupType)
{
return customGroupTypes.get(groupType);
return typeRegistry.getDataPointValueClass(groupType);
}

private Response getResponse(ClientResponse clientResponse) throws IOException
Expand Down
32 changes: 32 additions & 0 deletions src/main/java/org/kairosdb/client/DataPointTypeRegistry.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.kairosdb.client;

import java.util.HashMap;
import java.util.Map;

import static com.google.common.base.Preconditions.checkArgument;

public class DataPointTypeRegistry
{
private Map<String, Class> customGroupTypes = new HashMap<String, Class>();

public DataPointTypeRegistry()
{
customGroupTypes.put("number", Number.class);
customGroupTypes.put("text", String.class);
}

public void registerCustomDataType(String groupType, Class dataPointClass)
{
checkArgument(!customGroupTypes.containsKey(groupType), "Type has already been registered");

customGroupTypes.put(groupType, dataPointClass);
}

public Class getDataPointValueClass(String groupType)
{
Class valueClass = customGroupTypes.get(groupType);
return valueClass == null? Number.class : valueClass;
}


}
32 changes: 32 additions & 0 deletions src/main/java/org/kairosdb/client/JsonMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.kairosdb.client;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.kairosdb.client.deserializer.GroupByDeserializer;
import org.kairosdb.client.deserializer.ResultsDeserializer;
import org.kairosdb.client.response.GroupResult;
import org.kairosdb.client.response.Results;

import java.io.Reader;
import java.lang.reflect.Type;

public class JsonMapper
{
private Gson mapper;

public JsonMapper(DataPointTypeRegistry typeRegistry)
{
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(GroupResult.class, new GroupByDeserializer());
builder.registerTypeAdapter(Results.class, new ResultsDeserializer(typeRegistry));
mapper = builder.create();


}

public <T> T fromJson(Reader json, Type typeOfT)
{
return mapper.fromJson(json, typeOfT);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.google.gson.*;
import com.google.gson.reflect.TypeToken;
import org.kairosdb.client.Client;
import org.kairosdb.client.DataPointTypeRegistry;
import org.kairosdb.client.builder.DataPoint;
import org.kairosdb.client.response.GroupResult;
import org.kairosdb.client.response.Results;
Expand All @@ -18,11 +18,11 @@

public class ResultsDeserializer implements JsonDeserializer<Results>
{
private Client client;
private DataPointTypeRegistry typeRegistry;

public ResultsDeserializer(Client client)
public ResultsDeserializer(DataPointTypeRegistry typeRegistry)
{
this.client = checkNotNull(client);
this.typeRegistry = checkNotNull(typeRegistry);
}

@Override
Expand Down Expand Up @@ -58,7 +58,7 @@ public Results deserialize(JsonElement json, Type typeOfT, JsonDeserializationCo
checkState(type != null, "Missing type");

// Data points
final Class dataPointValueClass = client.getDataPointValueClass(type);
final Class dataPointValueClass = typeRegistry.getDataPointValueClass(type);
checkState(dataPointValueClass != null, "type: " + type + " is not registered to a custom data type.");

JsonArray array = (JsonArray) json.getAsJsonObject().get("values");
Expand Down
109 changes: 105 additions & 4 deletions src/main/java/org/kairosdb/client/response/QueryResponse.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,123 @@
*/
package org.kairosdb.client.response;

import com.google.gson.reflect.TypeToken;
import org.kairosdb.client.JsonMapper;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import static com.google.gson.internal.$Gson$Preconditions.checkNotNull;

/**
* Response returned by KairosDB.
* <p/>
* You can call getQueries() or getJson() but not both because the input stream
* from the server is read. Once read, it cannot be read again.
*/
public class QueryResponse extends Response
{
private List<Queries> queries = new ArrayList<Queries>();
private final int responseCode;
private final JsonMapper mapper;

private InputStream stream;
private KairosQueryResponse response;
private String json;

public QueryResponse(JsonMapper mapper, int responseCode, InputStream stream)
{
super(responseCode);
this.mapper = checkNotNull(mapper);
this.responseCode = responseCode;
this.stream = stream;
}

public QueryResponse()
/**
* Returns a list of query results returned by KairosDB. If status code is not
* successful, call getErrors to get errors returned.
*
* @return list of query results or empty list of no data or if an error is returned.
* @throws IOException if could not map response to Queries object
*/
public List<Queries> getQueries() throws IOException
{
if (response != null)
return response.getQueries();

if (stream != null)
{
InputStreamReader reader = new InputStreamReader(stream);
try
{
if (responseCode >= 400)
{
ErrorResponse errorResponse = mapper.fromJson(reader, ErrorResponse.class);
addErrors(errorResponse.getErrors());
return Collections.emptyList();
}
else
{
response = mapper.fromJson(reader, KairosQueryResponse.class);
return response.getQueries();
}
}
finally
{
reader.close();
stream = null;
}
}

return Collections.emptyList();
}

public List<Queries> getQueries()
/**
* Returns the json response as a string.
*
* @return json as a string or empty string.
* @throws IOException
*/
public String getJson() throws IOException
{
return queries;
if (json != null)
return json;

if (stream == null)
return "";

StringBuilder builder = new StringBuilder();
BufferedReader reader = null;
try
{
reader = new BufferedReader(new InputStreamReader(stream));
String line;
while ((line = reader.readLine()) != null)
{
builder.append(line);
}
}
finally
{
if (reader != null)
reader.close();
}

stream = null;
return builder.toString();
}

private class KairosQueryResponse
{
private List<Queries> queries = new ArrayList<Queries>();

public List<Queries> getQueries()
{
return queries;
}
}
}

0 comments on commit 2427cde

Please sign in to comment.