package org.embulk.spi.unit; import java.io.File; import java.io.ByteArrayOutputStream; import java.io.IOException; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.databind.module.SimpleModule; 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.module.guice.ObjectMapperModule; public class LocalFileSerDe { public static void configure(ObjectMapperModule mapper) { SimpleModule module = new SimpleModule(); module.addSerializer(LocalFile.class, new LocalFileSerializer()); module.addDeserializer(LocalFile.class, new LocalFileDeserializer()); mapper.registerModule(module); } private static class LocalFileSerializer extends JsonSerializer<LocalFile> { @Override public void serialize(LocalFile value, JsonGenerator jgen, SerializerProvider provider) throws IOException { jgen.writeStartObject(); jgen.writeFieldName("base64"); jgen.writeBinary(value.getContent()); jgen.writeEndObject(); } } private static class LocalFileDeserializer extends JsonDeserializer<LocalFile> { private final File tempDir; public LocalFileDeserializer() { this(new File(System.getProperty("java.io.tmpdir"))); } public LocalFileDeserializer(File tempDir) { this.tempDir = tempDir; } @Override public LocalFile deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { JsonToken t = jp.getCurrentToken(); if (t == JsonToken.START_OBJECT) { t = jp.nextToken(); } switch(t) { case VALUE_NULL: return null; case FIELD_NAME: { LocalFile result; String keyName = jp.getCurrentName(); if ("content".equals(keyName)) { jp.nextToken(); result = LocalFile.ofContent(jp.getValueAsString()); } else if ("base64".equals(keyName)) { jp.nextToken(); ByteArrayOutputStream out = new ByteArrayOutputStream(); jp.readBinaryValue(ctxt.getBase64Variant(), out); result = LocalFile.ofContent(out.toByteArray()); } else { throw ctxt.mappingException("Unknown key '"+keyName+"' to deserialize LocalFile"); } t = jp.nextToken(); if (t != JsonToken.END_OBJECT) { throw ctxt.mappingException("Unexpected extra map keys to LocalFile"); } return result; } case END_OBJECT: case START_ARRAY: case END_ARRAY: throw ctxt.mappingException("Attempted unexpected map or array to LocalFile"); case VALUE_EMBEDDED_OBJECT: { Object obj = jp.getEmbeddedObject(); if (obj == null) { return null; } if (LocalFile.class.isAssignableFrom(obj.getClass())) { return (LocalFile) obj; } throw ctxt.mappingException("Don't know how to convert embedded Object of type "+obj.getClass().getName()+" into LocalFile"); } default: return LocalFile.of(jp.getValueAsString()); } } } }