package org.kairosdb.client.testUtils; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; import com.google.gson.*; import org.kairosdb.client.builder.Grouper; import org.kairosdb.client.builder.QueryBuilder; import org.kairosdb.client.builder.grouper.TagGrouper; import org.kairosdb.client.builder.grouper.TimeGrouper; import org.kairosdb.client.builder.grouper.ValueGrouper; import java.lang.reflect.Type; import java.util.Map; import java.util.TimeZone; public class QueryParser { private final Gson gson; public QueryParser() { GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(ListMultimap.class, new ListMuliMapDeserializer()); gsonBuilder.registerTypeAdapter(TimeZone.class, new TimeZoneDeserializer()); gsonBuilder.registerTypeAdapter(Grouper.class, new GrouperDeserializer()); gson = gsonBuilder.create(); } public QueryBuilder parse(String json) { return gson.fromJson(json, QueryBuilder.class); } private class ListMuliMapDeserializer implements JsonDeserializer<ListMultimap<String, String>> { @Override public ListMultimap<String, String> deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { ListMultimap<String, String> map = ArrayListMultimap.create(); JsonObject asJsonObject = jsonElement.getAsJsonObject(); for (Map.Entry<String, JsonElement> entry : asJsonObject.entrySet()) { map.put(entry.getKey(), entry.getValue().getAsString()); } return map; } } private class TimeZoneDeserializer implements JsonDeserializer<TimeZone> { @Override public TimeZone deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { return TimeZone.getTimeZone(jsonElement.getAsString()); } } private class GrouperDeserializer implements JsonDeserializer<Grouper> { @Override public Grouper deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { JsonObject jsGroupBy = jsonElement.getAsJsonObject(); JsonElement nameElement = jsGroupBy.get("name"); if (nameElement == null || nameElement.getAsString().isEmpty()) { throw new JsonParseException("name cannot be null"); } String name = nameElement.getAsString(); if (name.equals("tag")) { return jsonDeserializationContext.deserialize(jsonElement, TagGrouper.class); } else if (name.equals("time")) { return jsonDeserializationContext.deserialize(jsonElement, TimeGrouper.class); } else if (name.equals("value")) { return jsonDeserializationContext.deserialize(jsonElement, ValueGrouper.class); } else { throw new JsonParseException("Invalid group_by: " + name); } } } }