package net.thucydides.core.reports.json.jackson;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.datatype.guava.GuavaModule;
import com.fasterxml.jackson.datatype.joda.JodaModule;
import com.google.inject.Inject;
import net.thucydides.core.ThucydidesSystemProperty;
import net.thucydides.core.model.TestOutcome;
import net.thucydides.core.reports.json.JSONConverter;
import net.thucydides.core.util.EnvironmentVariables;
import javax.validation.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Set;
public class JacksonJSONConverter implements JSONConverter {
private final ObjectMapper mapper;
private final ObjectReader reader;
private final ObjectWriter writer;
private final EnvironmentVariables environmentVariables;
private final Validator validator;
@Inject
public JacksonJSONConverter(EnvironmentVariables environmentVariables) {
this.environmentVariables = environmentVariables;
mapper = new ObjectMapper();
mapper.registerModule(new JodaModule());
mapper.registerModule(new GuavaModule());
mapper.registerModule(new TestOutcomeModule());
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
reader = mapper.reader(TestOutcome.class);
writer = mapper.writerWithType(TestOutcome.class);
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();
}
/**
* For testing purposes.
*/
protected ObjectMapper getMapper() {
return mapper;
}
@Override
public TestOutcome fromJson(InputStream inputStream) throws IOException {
TestOutcome outcome = reader.readValue(inputStream);
checkConstraints(outcome);
return outcome;
}
private void checkConstraints(TestOutcome outcome) {
Set<ConstraintViolation<TestOutcome>> violations = validator.validate(outcome);
if (!violations.isEmpty()) {
throw new ValidationException(Arrays.toString(violations.toArray()));
}
}
@Override
public void toJson(TestOutcome testOutcome, OutputStream outputStream) throws IOException {
if (usePrettyPrinting()) {
writer.withDefaultPrettyPrinter().writeValue(outputStream, testOutcome);
} else {
writer.writeValue(outputStream, testOutcome);
}
}
private boolean usePrettyPrinting() {
return environmentVariables.getPropertyAsBoolean(ThucydidesSystemProperty.JSON_PRETTY_PRINTING, false);
}
}