Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import static org.assertj.core.api.Assertions.assertThat;
- import java.io.IOException;
- import java.time.LocalDate;
- import java.util.Objects;
- import org.junit.Test;
- import com.fasterxml.jackson.annotation.JsonCreator;
- import com.fasterxml.jackson.annotation.JsonProperty;
- import com.fasterxml.jackson.core.JsonParser;
- import com.fasterxml.jackson.core.JsonProcessingException;
- import com.fasterxml.jackson.core.TreeNode;
- import com.fasterxml.jackson.core.Version;
- import com.fasterxml.jackson.databind.BeanDescription;
- import com.fasterxml.jackson.databind.DeserializationConfig;
- import com.fasterxml.jackson.databind.DeserializationContext;
- import com.fasterxml.jackson.databind.DeserializationFeature;
- import com.fasterxml.jackson.databind.JsonDeserializer;
- import com.fasterxml.jackson.databind.Module;
- import com.fasterxml.jackson.databind.ObjectMapper;
- import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier;
- import com.fasterxml.jackson.databind.module.SimpleDeserializers;
- import com.fasterxml.jackson.databind.node.ObjectNode;
- import com.fasterxml.jackson.databind.node.TreeTraversingParser;
- import com.fasterxml.jackson.databind.node.ValueNode;
- import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
- public class ServiceIdMigrationTest {
- @Test
- public void unmarshalsServiceId() throws JsonProcessingException, IOException {
- final ObjectMapper objectMapper = new ObjectMapper();
- objectMapper.registerModule(new JavaTimeModule());
- objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
- objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
- final String test = "{\"reference\" : {\"number\" : \"one\", \"startDate\" : [2016, 11, 16]}, \"serviceId\" : \"0815\"}";
- final Container container = objectMapper.readerFor(Container.class).readValue(test);
- assertThat(container.serviceId).isEqualTo("0815");
- }
- @Test
- public void migratesViaDeserializerAndUnmarshalsServiceId() throws JsonProcessingException, IOException {
- final ObjectMapper objectMapper = new ObjectMapper();
- objectMapper.registerModule(new JavaTimeModule());
- objectMapper.registerModule(new ServiceIdMigratingContainerDeserializerModule());
- objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
- objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
- final String test = "{\"reference\" : {\"number\" : \"one\", \"startDate\" : [2016, 11, 16], \"serviceId\" : \"0815\"}}";
- final Container container = objectMapper.readerFor(Container.class).readValue(test);
- assertThat(container.serviceId).isEqualTo("0815");
- }
- @Test
- public void migratesViaDeserializerModifierAndUnmarshalsServiceId() throws JsonProcessingException, IOException {
- final ObjectMapper objectMapper = new ObjectMapper();
- objectMapper.registerModule(new JavaTimeModule());
- objectMapper.registerModule(new ServiceIdMigrationBeanDeserializerModifierModule());
- objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
- objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
- final String test = "{\"reference\" : {\"number\" : \"one\", \"startDate\" : [2016, 11, 16], \"serviceId\" : \"0815\"}}";
- final Container container = objectMapper.readerFor(Container.class).readValue(test);
- assertThat(container.serviceId).isEqualTo("0815");
- }
- public final static class Container {
- public final Reference reference;
- public final String serviceId;
- @JsonCreator
- public Container(@JsonProperty("reference") Reference reference, @JsonProperty("serviceId") String serviceId) {
- this.reference = reference;
- this.serviceId = serviceId;
- }
- @Override
- public int hashCode() {
- return Objects.hash(this.reference, this.serviceId);
- }
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
- return false;
- }
- if (getClass() != obj.getClass()) {
- return false;
- }
- final Container that = (Container) obj;
- return Objects.equals(this.reference, that.reference) && Objects.equals(this.serviceId, that.serviceId);
- }
- }
- public final static class Reference {
- public final String number;
- public final LocalDate startDate;
- @JsonCreator
- public Reference(@JsonProperty("number") String number, @JsonProperty("startDate") LocalDate startDate) {
- this.number = number;
- this.startDate = startDate;
- }
- @Override
- public int hashCode() {
- return Objects.hash(this.number, this.startDate);
- }
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
- return false;
- }
- if (getClass() != obj.getClass()) {
- return false;
- }
- final Reference that = (Reference) obj;
- return Objects.equals(this.number, that.number) && Objects.equals(this.startDate, that.startDate);
- }
- }
- public static class ServiceIdMigratingContainerDeserializerModule extends Module {
- @Override
- public String getModuleName() {
- return "serviceid_migration";
- }
- @Override
- public Version version() {
- return new Version(0, 0, 1, "NONE", null, null);
- }
- @Override
- public void setupModule(SetupContext context) {
- context.addDeserializers(new SimpleDeserializers() {
- {
- addDeserializer(Container.class, new ServiceIdMigratingContainerDeserializer());
- }
- });
- }
- }
- public static class ServiceIdMigratingContainerDeserializer extends JsonDeserializer<Container> {
- private final ObjectMapper objectMapper;
- {
- objectMapper = new ObjectMapper();
- objectMapper.registerModule(new JavaTimeModule());
- objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
- objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
- }
- @Override
- public Container deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
- ObjectNode node = p.readValueAsTree();
- migrate(node);
- return objectMapper.treeToValue(node, Container.class);
- }
- private void migrate(ObjectNode containerNode) {
- TreeNode referenceNode = containerNode.get("reference");
- if (referenceNode != null && referenceNode.isObject()) {
- TreeNode serviceIdNode = containerNode.get("serviceId");
- if (serviceIdNode == null) {
- TreeNode referenceServiceIdNode = referenceNode.get("serviceId");
- if (referenceServiceIdNode != null && referenceServiceIdNode.isValueNode()) {
- containerNode.set("serviceId", (ValueNode) referenceServiceIdNode);
- }
- }
- }
- }
- }
- public static class ServiceIdMigrationBeanDeserializerModifierModule extends Module {
- @Override
- public String getModuleName() {
- return "serviceid_migration";
- }
- @Override
- public Version version() {
- return new Version(0, 0, 1, "NONE", null, null);
- }
- @Override
- public void setupModule(SetupContext context) {
- context.addBeanDeserializerModifier(new ServiceIdMigrationBeanDeserializerModifier());
- }
- }
- public static class ServiceIdMigrationBeanDeserializerModifier extends BeanDeserializerModifier {
- @Override
- public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc,
- JsonDeserializer<?> defaultDeserializer) {
- if (beanDesc.getBeanClass() == Container.class) {
- return new ModifiedServiceIdMigratingContainerDeserializer((JsonDeserializer<Container>) defaultDeserializer);
- } else {
- return defaultDeserializer;
- }
- }
- }
- public static class ModifiedServiceIdMigratingContainerDeserializer extends JsonDeserializer<Container> {
- private final JsonDeserializer<Container> defaultDeserializer;
- public ModifiedServiceIdMigratingContainerDeserializer(JsonDeserializer<Container> defaultDeserializer) {
- this.defaultDeserializer = defaultDeserializer;
- }
- @Override
- public Container deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
- ObjectNode node = p.readValueAsTree();
- migrate(node);
- return defaultDeserializer.deserialize(new TreeTraversingParser(node, p.getCodec()), ctxt);
- }
- private void migrate(ObjectNode containerNode) {
- TreeNode referenceNode = containerNode.get("reference");
- if (referenceNode != null && referenceNode.isObject()) {
- TreeNode serviceIdNode = containerNode.get("serviceId");
- if (serviceIdNode == null) {
- TreeNode referenceServiceIdNode = referenceNode.get("serviceId");
- if (referenceServiceIdNode != null && referenceServiceIdNode.isValueNode()) {
- containerNode.set("serviceId", (ValueNode) referenceServiceIdNode);
- }
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement