Advertisement
Guest User

ServiceIdMigrationTest

a guest
Nov 16th, 2016
305
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.01 KB | None | 0 0
  1.  
  2. import static org.assertj.core.api.Assertions.assertThat;
  3.  
  4. import java.io.IOException;
  5. import java.time.LocalDate;
  6. import java.util.Objects;
  7.  
  8. import org.junit.Test;
  9.  
  10. import com.fasterxml.jackson.annotation.JsonCreator;
  11. import com.fasterxml.jackson.annotation.JsonProperty;
  12. import com.fasterxml.jackson.core.JsonParser;
  13. import com.fasterxml.jackson.core.JsonProcessingException;
  14. import com.fasterxml.jackson.core.TreeNode;
  15. import com.fasterxml.jackson.core.Version;
  16. import com.fasterxml.jackson.databind.BeanDescription;
  17. import com.fasterxml.jackson.databind.DeserializationConfig;
  18. import com.fasterxml.jackson.databind.DeserializationContext;
  19. import com.fasterxml.jackson.databind.DeserializationFeature;
  20. import com.fasterxml.jackson.databind.JsonDeserializer;
  21. import com.fasterxml.jackson.databind.Module;
  22. import com.fasterxml.jackson.databind.ObjectMapper;
  23. import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier;
  24. import com.fasterxml.jackson.databind.module.SimpleDeserializers;
  25. import com.fasterxml.jackson.databind.node.ObjectNode;
  26. import com.fasterxml.jackson.databind.node.TreeTraversingParser;
  27. import com.fasterxml.jackson.databind.node.ValueNode;
  28. import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
  29. public class ServiceIdMigrationTest {
  30.  
  31.     @Test
  32.     public void unmarshalsServiceId() throws JsonProcessingException, IOException {
  33.         final ObjectMapper objectMapper = new ObjectMapper();
  34.         objectMapper.registerModule(new JavaTimeModule());
  35.         objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
  36.         objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  37.  
  38.         final String test = "{\"reference\" : {\"number\" : \"one\", \"startDate\" : [2016, 11, 16]}, \"serviceId\" : \"0815\"}";
  39.         final Container container = objectMapper.readerFor(Container.class).readValue(test);
  40.         assertThat(container.serviceId).isEqualTo("0815");
  41.     }
  42.  
  43.     @Test
  44.     public void migratesViaDeserializerAndUnmarshalsServiceId() throws JsonProcessingException, IOException {
  45.         final ObjectMapper objectMapper = new ObjectMapper();
  46.         objectMapper.registerModule(new JavaTimeModule());
  47.         objectMapper.registerModule(new ServiceIdMigratingContainerDeserializerModule());
  48.         objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
  49.         objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  50.  
  51.         final String test = "{\"reference\" : {\"number\" : \"one\", \"startDate\" : [2016, 11, 16], \"serviceId\" : \"0815\"}}";
  52.         final Container container = objectMapper.readerFor(Container.class).readValue(test);
  53.         assertThat(container.serviceId).isEqualTo("0815");
  54.     }
  55.  
  56.     @Test
  57.     public void migratesViaDeserializerModifierAndUnmarshalsServiceId() throws JsonProcessingException, IOException {
  58.         final ObjectMapper objectMapper = new ObjectMapper();
  59.         objectMapper.registerModule(new JavaTimeModule());
  60.         objectMapper.registerModule(new ServiceIdMigrationBeanDeserializerModifierModule());
  61.         objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
  62.         objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  63.  
  64.         final String test = "{\"reference\" : {\"number\" : \"one\", \"startDate\" : [2016, 11, 16], \"serviceId\" : \"0815\"}}";
  65.         final Container container = objectMapper.readerFor(Container.class).readValue(test);
  66.         assertThat(container.serviceId).isEqualTo("0815");
  67.     }
  68.  
  69.     public final static class Container {
  70.  
  71.         public final Reference reference;
  72.  
  73.         public final String serviceId;
  74.  
  75.         @JsonCreator
  76.         public Container(@JsonProperty("reference") Reference reference, @JsonProperty("serviceId") String serviceId) {
  77.             this.reference = reference;
  78.             this.serviceId = serviceId;
  79.         }
  80.  
  81.         @Override
  82.         public int hashCode() {
  83.             return Objects.hash(this.reference, this.serviceId);
  84.         }
  85.  
  86.         @Override
  87.         public boolean equals(Object obj) {
  88.             if (this == obj) {
  89.                 return true;
  90.             }
  91.             if (obj == null) {
  92.                 return false;
  93.             }
  94.             if (getClass() != obj.getClass()) {
  95.                 return false;
  96.             }
  97.             final Container that = (Container) obj;
  98.             return Objects.equals(this.reference, that.reference) && Objects.equals(this.serviceId, that.serviceId);
  99.         }
  100.     }
  101.  
  102.     public final static class Reference {
  103.  
  104.         public final String number;
  105.  
  106.         public final LocalDate startDate;
  107.  
  108.         @JsonCreator
  109.         public Reference(@JsonProperty("number") String number, @JsonProperty("startDate") LocalDate startDate) {
  110.             this.number = number;
  111.             this.startDate = startDate;
  112.         }
  113.  
  114.         @Override
  115.         public int hashCode() {
  116.             return Objects.hash(this.number, this.startDate);
  117.         }
  118.  
  119.         @Override
  120.         public boolean equals(Object obj) {
  121.             if (this == obj) {
  122.                 return true;
  123.             }
  124.             if (obj == null) {
  125.                 return false;
  126.             }
  127.             if (getClass() != obj.getClass()) {
  128.                 return false;
  129.             }
  130.             final Reference that = (Reference) obj;
  131.             return Objects.equals(this.number, that.number) && Objects.equals(this.startDate, that.startDate);
  132.         }
  133.  
  134.     }
  135.  
  136.     public static class ServiceIdMigratingContainerDeserializerModule extends Module {
  137.  
  138.         @Override
  139.         public String getModuleName() {
  140.             return "serviceid_migration";
  141.         }
  142.  
  143.         @Override
  144.         public Version version() {
  145.             return new Version(0, 0, 1, "NONE", null, null);
  146.         }
  147.  
  148.         @Override
  149.         public void setupModule(SetupContext context) {
  150.             context.addDeserializers(new SimpleDeserializers() {
  151.                 {
  152.                     addDeserializer(Container.class, new ServiceIdMigratingContainerDeserializer());
  153.                 }
  154.             });
  155.         }
  156.     }
  157.  
  158.     public static class ServiceIdMigratingContainerDeserializer extends JsonDeserializer<Container> {
  159.  
  160.         private final ObjectMapper objectMapper;
  161.  
  162.         {
  163.             objectMapper = new ObjectMapper();
  164.             objectMapper.registerModule(new JavaTimeModule());
  165.             objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
  166.             objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  167.         }
  168.  
  169.         @Override
  170.         public Container deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
  171.             ObjectNode node = p.readValueAsTree();
  172.             migrate(node);
  173.             return objectMapper.treeToValue(node, Container.class);
  174.         }
  175.  
  176.         private void migrate(ObjectNode containerNode) {
  177.             TreeNode referenceNode = containerNode.get("reference");
  178.             if (referenceNode != null && referenceNode.isObject()) {
  179.                 TreeNode serviceIdNode = containerNode.get("serviceId");
  180.                 if (serviceIdNode == null) {
  181.                     TreeNode referenceServiceIdNode = referenceNode.get("serviceId");
  182.                     if (referenceServiceIdNode != null && referenceServiceIdNode.isValueNode()) {
  183.                         containerNode.set("serviceId", (ValueNode) referenceServiceIdNode);
  184.                     }
  185.                 }
  186.             }
  187.         }
  188.     }
  189.  
  190.     public static class ServiceIdMigrationBeanDeserializerModifierModule extends Module {
  191.  
  192.         @Override
  193.         public String getModuleName() {
  194.             return "serviceid_migration";
  195.         }
  196.  
  197.         @Override
  198.         public Version version() {
  199.             return new Version(0, 0, 1, "NONE", null, null);
  200.         }
  201.  
  202.         @Override
  203.         public void setupModule(SetupContext context) {
  204.             context.addBeanDeserializerModifier(new ServiceIdMigrationBeanDeserializerModifier());
  205.         }
  206.     }
  207.  
  208.    
  209.     public static class ServiceIdMigrationBeanDeserializerModifier extends BeanDeserializerModifier {
  210.        
  211.         @Override
  212.         public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc,
  213.                 JsonDeserializer<?> defaultDeserializer) {
  214.             if (beanDesc.getBeanClass() == Container.class) {
  215.                 return new ModifiedServiceIdMigratingContainerDeserializer((JsonDeserializer<Container>) defaultDeserializer);
  216.             } else {
  217.                 return defaultDeserializer;
  218.             }
  219.         }
  220.     }
  221.  
  222.     public static class ModifiedServiceIdMigratingContainerDeserializer extends JsonDeserializer<Container> {
  223.  
  224.         private final JsonDeserializer<Container> defaultDeserializer;
  225.  
  226.         public ModifiedServiceIdMigratingContainerDeserializer(JsonDeserializer<Container> defaultDeserializer) {
  227.             this.defaultDeserializer = defaultDeserializer;
  228.         }
  229.  
  230.         @Override
  231.         public Container deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
  232.             ObjectNode node = p.readValueAsTree();
  233.             migrate(node);
  234.             return defaultDeserializer.deserialize(new TreeTraversingParser(node, p.getCodec()), ctxt);
  235.         }
  236.  
  237.         private void migrate(ObjectNode containerNode) {
  238.             TreeNode referenceNode = containerNode.get("reference");
  239.             if (referenceNode != null && referenceNode.isObject()) {
  240.                 TreeNode serviceIdNode = containerNode.get("serviceId");
  241.                 if (serviceIdNode == null) {
  242.                     TreeNode referenceServiceIdNode = referenceNode.get("serviceId");
  243.                     if (referenceServiceIdNode != null && referenceServiceIdNode.isValueNode()) {
  244.                         containerNode.set("serviceId", (ValueNode) referenceServiceIdNode);
  245.                     }
  246.                 }
  247.             }
  248.         }
  249.     }
  250. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement