package com.intrbiz.bergamot.model.adapter;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.intrbiz.bergamot.model.util.Parameter;
import com.intrbiz.data.DataException;
import com.intrbiz.data.db.util.DBTypeAdapter;
public class ParametersAdapter implements DBTypeAdapter<String, LinkedHashMap<String, Parameter>>
{
private final ObjectMapper factory = new ObjectMapper();
public ParametersAdapter()
{
this.factory.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
this.factory.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
this.factory.configure(SerializationFeature.INDENT_OUTPUT, true);
this.factory.registerSubtypes(Parameter.class);
}
@Override
public String toDB(LinkedHashMap<String, Parameter> value)
{
// default to an empty list
if (value == null) return "[]";
// encode
StringWriter sw = new StringWriter();
try (JsonGenerator g = this.factory.getFactory().createGenerator(sw))
{
g.writeStartArray();
for (Entry<String, Parameter> p : value.entrySet())
{
this.factory.writeValue(g, p.getValue());
}
g.writeEndArray();
}
catch (IOException e)
{
throw new DataException("Failed to encode parameter", e);
}
return sw.toString();
}
@Override
public LinkedHashMap<String, Parameter> fromDB(String value)
{
// default to an empty list
LinkedHashMap<String, Parameter> ret = new LinkedHashMap<String, Parameter>();
if (value != null)
{
try (JsonParser p = this.factory.getFactory().createParser(new StringReader(value)))
{
Parameter parameter;
if (p.nextToken() == JsonToken.START_ARRAY)
{
while (p.nextToken() == JsonToken.START_OBJECT)
{
parameter = this.factory.readValue(p, Parameter.class);
ret.put(parameter.getName(), parameter);
}
}
}
catch (IOException e)
{
throw new DataException("Failed to decode parameter", e);
}
}
return ret;
}
}