package restx.i18n;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.type.MapType;
import com.fasterxml.jackson.databind.type.SimpleType;
import com.google.common.collect.ImmutableMap;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Date: 25/1/14
* Time: 14:37
*/
@JsonSerialize(using = MessageParams.MessageParamsSerializer.class)
@JsonDeserialize(using = MessageParams.MessageParamsDeserializer.class)
public class MessageParams {
private static final MessageParams EMPTY = new MessageParams(ImmutableMap.<String, Object>of());
public static MessageParams empty() {
return EMPTY;
}
public static MessageParams of(String k1, Object v1) {
return new MessageParams(ImmutableMap.of(k1, value(v1)));
}
public static MessageParams of(String k1, Object v1, String k2, Object v2) {
return new MessageParams(ImmutableMap.of(k1, value(v1), k2, value(v2)));
}
public static MessageParams of(String k1, Object v1, String k2, Object v2, String k3, Object v3) {
return new MessageParams(ImmutableMap.of(k1, value(v1), k2, value(v2), k3, value(v3)));
}
public static MessageParams of(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4) {
return new MessageParams(ImmutableMap.of(k1, value(v1), k2, value(v2), k3, value(v3), k4, value(v4)));
}
private static Object value(Object v) {
return v == null ? "" : v;
}
public MessageParams(ImmutableMap<String, ?> map) {
this.map = map;
}
private final ImmutableMap<String, ?> map;
public MessageParams concat(String key, Object value) {
return new MessageParams(ImmutableMap.<String, Object>builder().putAll(map).put(key, value(value)).build());
}
public Map<String, ?> toMap() {
return map;
}
@Override
public String toString() {
return "MessageParams{" +
"map=" + map +
'}';
}
public static class MessageParamsSerializer extends JsonSerializer<MessageParams> {
@Override
public void serialize(MessageParams value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
provider.defaultSerializeValue(value.toMap(), jgen);
}
}
public static class MessageParamsDeserializer extends JsonDeserializer<MessageParams> {
@Override
@SuppressWarnings("unchecked")
public MessageParams deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
JsonDeserializer<Object> mapDeser = ctxt.findRootValueDeserializer(MapType.construct(
LinkedHashMap.class,
SimpleType.construct(String.class),
SimpleType.construct(Object.class)));
Map<String, Object> m = (Map<String, Object>) mapDeser.deserialize(jp, ctxt);
return new MessageParams(ImmutableMap.copyOf(m));
}
}
}