package org.embulk.config; import javax.validation.Validation; import org.apache.bval.jsr303.ApacheValidationProvider; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.common.base.Throwables; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; public class ModelManager { private final Injector injector; private final ObjectMapper objectMapper; private final ObjectMapper configObjectMapper; // configObjectMapper uses different TaskDeserializer private final TaskValidator taskValidator; @Inject public ModelManager(Injector injector, ObjectMapper objectMapper) { this.injector = injector; this.objectMapper = objectMapper; this.configObjectMapper = objectMapper.copy(); this.taskValidator = new TaskValidator( Validation.byProvider(ApacheValidationProvider.class).configure().buildValidatorFactory().getValidator()); objectMapper.registerModule(new TaskSerDe.TaskSerializerModule(objectMapper)); objectMapper.registerModule(new TaskSerDe.TaskDeserializerModule(objectMapper, this)); objectMapper.registerModule(new DataSourceSerDe.SerDeModule(this)); configObjectMapper.registerModule(new TaskSerDe.TaskSerializerModule(configObjectMapper)); configObjectMapper.registerModule(new TaskSerDe.ConfigTaskDeserializerModule(configObjectMapper, this)); configObjectMapper.registerModule(new DataSourceSerDe.SerDeModule(this)); } public <T> T readObject(Class<T> valueType, String json) { try { return objectMapper.readValue(json, valueType); } catch (Exception ex) { throw Throwables.propagate(ex); } } public <T> T readObject(Class<T> valueType, JsonParser parser) { try { return objectMapper.readValue(parser, valueType); } catch (Exception ex) { throw Throwables.propagate(ex); } } public <T> T readObjectWithConfigSerDe(Class<T> valueType, String json) { T t; try { t = configObjectMapper.readValue(json, valueType); } catch (Exception ex) { Throwables.propagateIfInstanceOf(ex, ConfigException.class); throw new ConfigException(ex); } validate(t); return t; } public <T> T readObjectWithConfigSerDe(Class<T> valueType, JsonParser parser) { T t; try { t = configObjectMapper.readValue(parser, valueType); } catch (Exception ex) { Throwables.propagateIfInstanceOf(ex, ConfigException.class); throw new ConfigException(ex); } validate(t); return t; } public String writeObject(Object object) { try { return objectMapper.writeValueAsString(object); } catch (Exception ex) { throw Throwables.propagate(ex); } } public void validate(Object object) { taskValidator.validateModel(object); } // visible for DataSource.set JsonNode writeObjectAsJsonNode(Object v) { String json = writeObject(v); try { return objectMapper.readValue(json, JsonNode.class); } catch (Exception ex) { throw Throwables.propagate(ex); } } // visible for TaskInvocationHandler.invokeDump ObjectNode writeObjectAsObjectNode(Object v) { String json = writeObject(v); try { return objectMapper.readValue(json, ObjectNode.class); } catch (Exception ex) { throw Throwables.propagate(ex); } } // visible for TaskSerDe.set // TODO create annotation calss and get its instance at the 2nd argument <T> T getInjectedInstance(Class<T> type) { return injector.getInstance(type); } }