package com.sf.monitor.utils; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.google.common.base.Function; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import java.io.IOException; import java.util.List; import java.util.Map; @JsonSerialize(using = JsonValues.ValuesJsonSerializer.class) public class JsonValues { public Map<String, Object> values; public JsonValues(Map<String, Object> values) { this.values = values; } public static <T> JsonValues of(Map<String, T> rawValues) { return new JsonValues( Maps.transformValues( rawValues, new Function<T, Object>() { @Override public Object apply(T input) { return (Object) input; } } ) ); } public static <T> JsonValues of(Map<String, T> parseVals, String... keys) { return of(parseVals, Lists.newArrayList(keys)); } public static <T> JsonValues of(Map<String, T> parseVals, List<String> keys) { JsonValues values = new JsonValues(Maps.<String, Object>newLinkedHashMap()); for (String key : keys) { T val = parseVals.get(key); if (val == null) { values.values.put(key, "unknown"); } else { values.values.put(key, val); } } return values; } public static Iterable<Map<String, Object>> toMaps(Iterable<JsonValues> values) { return Iterables.transform( values, new Function<JsonValues, Map<String, Object>>() { @Override public Map<String, Object> apply(JsonValues input) { return input.values; } } ); } public static class ValuesJsonSerializer extends JsonSerializer<JsonValues> { @Override public void serialize( JsonValues value, JsonGenerator jgen, SerializerProvider provider ) throws IOException, JsonProcessingException { JsonSerializer<Object> serializer = provider.findValueSerializer(value.values.getClass(), null); serializer.serialize(value.values, jgen, provider); } } }