package org.embulk.config; import java.io.IOException; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.node.ObjectNode; public class DataSourceSerDe { public static class SerDeModule extends SimpleModule { @SuppressWarnings("deprecation") public SerDeModule(final ModelManager model) { // DataSourceImpl addSerializer(DataSourceImpl.class, new DataSourceSerializer<DataSourceImpl>()); addDeserializer(DataSourceImpl.class, new DataSourceDeserializer<DataSourceImpl>(model)); // ConfigSource addSerializer(ConfigSource.class, new DataSourceSerializer<ConfigSource>()); addDeserializer(ConfigSource.class, new DataSourceDeserializer<ConfigSource>(model)); // TaskSource addSerializer(TaskSource.class, new DataSourceSerializer<TaskSource>()); addDeserializer(TaskSource.class, new DataSourceDeserializer<TaskSource>(model)); // TaskReport addSerializer(TaskReport.class, new DataSourceSerializer<TaskReport>()); addDeserializer(TaskReport.class, new DataSourceDeserializer<TaskReport>(model)); // CommitReport (Deprecated) addSerializer(CommitReport.class, new DataSourceSerializer<CommitReport>()); addDeserializer(CommitReport.class, new DataSourceDeserializer<CommitReport>(model)); // ConfigDiff addSerializer(ConfigDiff.class, new DataSourceSerializer<ConfigDiff>()); addDeserializer(ConfigDiff.class, new DataSourceDeserializer<ConfigDiff>(model)); } } private static class DataSourceDeserializer <T extends DataSource> // TODO T extends DataSource super DataSourceImpl extends JsonDeserializer<T> { private final ModelManager model; private final ObjectMapper treeObjectMapper; DataSourceDeserializer(ModelManager model) { this.model = model; this.treeObjectMapper = new ObjectMapper(); } @Override @SuppressWarnings("unchecked") public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { JsonNode json = treeObjectMapper.readTree(jp); if (!json.isObject()) { throw new JsonMappingException("Expected object to deserialize DataSource", jp.getCurrentLocation()); } return (T) new DataSourceImpl(model, (ObjectNode) json); } } private static class DataSourceSerializer <T extends DataSource> extends JsonSerializer<T> { @Override public void serialize(T value, JsonGenerator jgen, SerializerProvider provider) throws IOException { value.getObjectNode().serialize(jgen, provider); } } }