From b6211cf251fdf0d47257f8aad1bba0473dba2cea Mon Sep 17 00:00:00 2001 From: Narsi Nallamilli Date: Tue, 28 Nov 2023 15:08:09 +0530 Subject: [PATCH] fix #212 optimize objectmapper usage --- .../AttachableResponseDeserializer.java | 105 +- .../BatchItemRequestSerializer.java | 271 ++-- .../BatchItemResponseDeserializer.java | 338 ++--- .../CDCQueryResponseDeserializer.java | 198 ++- .../CustomFieldDefinitionDeserializer.java | 176 ++- .../IntuitResponseDeserializer.java | 197 ++- .../ipp/serialization/JSONSerializer.java | 1125 +++++++---------- .../QueryResponseDeserializer.java | 336 +++-- .../serialization/SyncErrorDeserializer.java | 203 ++- .../SyncErrorResponseDeserializer.java | 226 ++-- .../intuit/ipp/services/WebhooksService.java | 2 +- 11 files changed, 1435 insertions(+), 1742 deletions(-) diff --git a/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/AttachableResponseDeserializer.java b/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/AttachableResponseDeserializer.java index 40e1f216..53b8fc66 100755 --- a/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/AttachableResponseDeserializer.java +++ b/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/AttachableResponseDeserializer.java @@ -15,77 +15,74 @@ *******************************************************************************/ package com.intuit.ipp.serialization; -import java.io.IOException; -import java.util.Iterator; - -import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.AnnotationIntrospector; -import com.fasterxml.jackson.databind.DeserializationConfig; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair; import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; -//import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector; import com.fasterxml.jackson.module.jakarta.xmlbind.JakartaXmlBindAnnotationIntrospector; -import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair; -import com.fasterxml.jackson.databind.DeserializationFeature; - import com.intuit.ipp.data.Attachable; import com.intuit.ipp.data.AttachableResponse; import com.intuit.ipp.data.Fault; +import java.io.IOException; +import java.util.Iterator; /** * Custom deserializer class to handle AttachableResponse while unmarshall - * */ public class AttachableResponseDeserializer extends JsonDeserializer { - /** - * variable FAULT - */ - private static final String FAULT = "Fault"; - - /** - * variable ATTACHABLE - */ - private static final String ATTACHABLE = "Attachable"; - - /** - * {@inheritDoc}} - */ - @SuppressWarnings("deprecation") - @Override - public AttachableResponse deserialize(JsonParser jp, DeserializationContext desContext) throws IOException { - ObjectMapper mapper = new ObjectMapper(); + /** + * variable FAULT + */ + private static final String FAULT = "Fault"; - //Make the mapper JAXB annotations aware - AnnotationIntrospector primary = new JakartaXmlBindAnnotationIntrospector(); - AnnotationIntrospector secondary = new JacksonAnnotationIntrospector(); - AnnotationIntrospector pair = new AnnotationIntrospectorPair(primary, secondary); - mapper.setAnnotationIntrospector(pair); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + /** + * variable ATTACHABLE + */ + private static final String ATTACHABLE = "Attachable"; + private static final ObjectMapper deserializeMapper = getDeserializeMapper(); - //Read the QueryResponse as a tree - JsonNode jn = jp.readValueAsTree(); + /** + * {@inheritDoc}} + */ + @SuppressWarnings("deprecation") + @Override + public AttachableResponse deserialize(JsonParser jp, DeserializationContext desContext) throws IOException { + //Read the QueryResponse as a tree + JsonNode jn = jp.readValueAsTree(); - //Create the QueryResponse to be returned - AttachableResponse qr = new AttachableResponse(); + //Create the QueryResponse to be returned + AttachableResponse qr = new AttachableResponse(); - //Iterate over the field names - Iterator ite = jn.fieldNames(); + //Iterate over the field names + Iterator ite = jn.fieldNames(); - while (ite.hasNext()) { - String key = ite.next(); + while (ite.hasNext()) { + String key = ite.next(); - //Attributes - if (key.equalsIgnoreCase(FAULT)) { - qr.setFault(mapper.treeToValue(jn.get(FAULT), Fault.class)); - } else if (key.equalsIgnoreCase(ATTACHABLE)) { - qr.setAttachable(mapper.treeToValue(jn.get(ATTACHABLE), Attachable.class)); - } - } - return qr; - } + //Attributes + if (key.equalsIgnoreCase(FAULT)) { + qr.setFault(deserializeMapper.treeToValue(jn.get(FAULT), Fault.class)); + } else if (key.equalsIgnoreCase(ATTACHABLE)) { + qr.setAttachable(deserializeMapper.treeToValue(jn.get(ATTACHABLE), Attachable.class)); + } + } + return qr; + } + /** + * Deserialize mapper for {@link #deserialize(JsonParser, DeserializationContext)}} + * + * @return ObjectMapper + */ + private static ObjectMapper getDeserializeMapper() { + ObjectMapper mapper = new ObjectMapper(); + //Make the mapper JAXB annotations aware + AnnotationIntrospector primary = new JakartaXmlBindAnnotationIntrospector(); + AnnotationIntrospector secondary = new JacksonAnnotationIntrospector(); + AnnotationIntrospector pair = new AnnotationIntrospectorPair(primary, secondary); + mapper.setAnnotationIntrospector(pair); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + return mapper; + } } diff --git a/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/BatchItemRequestSerializer.java b/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/BatchItemRequestSerializer.java index 06f588b4..0e1d9d49 100755 --- a/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/BatchItemRequestSerializer.java +++ b/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/BatchItemRequestSerializer.java @@ -15,162 +15,153 @@ *******************************************************************************/ package com.intuit.ipp.serialization; -import java.io.IOException; - +import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.AnnotationIntrospector; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair; import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; -//import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector; import com.fasterxml.jackson.module.jakarta.xmlbind.JakartaXmlBindAnnotationIntrospector; -import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair; - import com.intuit.ipp.data.BatchItemRequest; import com.intuit.ipp.data.CDCQuery; import com.intuit.ipp.exception.SerializationException; import com.intuit.ipp.util.Logger; import com.intuit.ipp.util.StringUtils; +import java.io.IOException; /** * Custom Json serializer class to handle BatchItemRequest while marshalling - * */ public class BatchItemRequestSerializer extends JsonSerializer { - /** - * logger instance - */ - private static final org.slf4j.Logger LOG = Logger.getLogger(); - - /** - * variable BID - */ - private static final String BID = "bId"; - - /** - * variable QUERY - */ - private static final String QUERY = "Query"; - - /** - * variable REPORT_QUERY - */ - private static final String REPORT_QUERY = "ReportQuery"; - - /** - * variable CDCQuery - */ - private static final String CDC_QUERY = "CDCQuery"; - - /** - * variable OPERATION - */ - private static final String OPERATION = "operation"; - - /** - * variable OPTIONS_DATA - */ - private static final String OPTIONS_DATA = "optionsData"; - - @Override - public void serialize(BatchItemRequest batchItemRequest, JsonGenerator jgen, SerializerProvider provider) throws IOException { - - jgen.writeStartObject(); - - // for bId - if (StringUtils.hasText(batchItemRequest.getBId())) { - jgen.writeFieldName(BID); - jgen.writeString(batchItemRequest.getBId()); - } - - // for IntuitObject - if (batchItemRequest.getIntuitObject() != null) { - jgen.writeFieldName(batchItemRequest.getIntuitObject().getValue().getClass().getSimpleName()); - try { - jgen.writeNumber(new JSONSerializer().serialize(batchItemRequest.getIntuitObject())); - } catch (SerializationException e) { - LOG.error("SerializationException while generating Json for IntuitObject in BatchItemRequestSerializer.", e); - throw new IOException(e); - } - } - - // for CDCQuery - if (batchItemRequest.getCDCQuery() != null) { - jgen.writeFieldName(CDC_QUERY); - try { - jgen.writeNumber(getCDCQueryJson(batchItemRequest.getCDCQuery())); - } catch (Exception e) { - LOG.error("SerializationException while generating Json for CDCQuery in BatchItemRequestSerializer.", e); - throw new IOException(e); - } - } - - // for Query - if (StringUtils.hasText(batchItemRequest.getQuery())) { - jgen.writeFieldName(QUERY); - jgen.writeString(batchItemRequest.getQuery()); - } - - // for ReportQuery - if (StringUtils.hasText(batchItemRequest.getReportQuery())) { - jgen.writeFieldName(REPORT_QUERY); - jgen.writeString(batchItemRequest.getReportQuery()); - } - - // for operation - if (batchItemRequest.getOperation() != null) { - jgen.writeFieldName(OPERATION); - jgen.writeString(batchItemRequest.getOperation().value()); - } - - // for OptionsData - if (StringUtils.hasText(batchItemRequest.getOptionsData())) { - jgen.writeFieldName(OPTIONS_DATA); - jgen.writeString(batchItemRequest.getOptionsData()); - } - - jgen.writeEndObject(); - } - - /** - * Method to get the Json string for CDCQuery object - * - * @param cdcQuery - * the CDCQuery entity describing need for query - * @return the json string - * @throws SerializationException - * throws SerializationException - */ - private String getCDCQueryJson(CDCQuery cdcQuery) throws SerializationException { - ObjectMapper mapper = getObjectMapper(); - String json = null; - try { - json = mapper.writeValueAsString(cdcQuery); - } catch (Exception e) { - throw new SerializationException(e); - } - - return json; - } - - /** - * Method to get the Jackson object mapper - * - * @return ObjectMapper the object mapper - */ - private ObjectMapper getObjectMapper() { - ObjectMapper mapper = new ObjectMapper(); - AnnotationIntrospector primary = new JacksonAnnotationIntrospector(); - AnnotationIntrospector secondary = new JakartaXmlBindAnnotationIntrospector(mapper.getTypeFactory()); - AnnotationIntrospector pair = new AnnotationIntrospectorPair(primary, secondary); - - mapper.setAnnotationIntrospector(pair); - mapper.setSerializationInclusion(Include.NON_NULL); - - return mapper; - } - + /** + * logger instance + */ + private static final org.slf4j.Logger LOG = Logger.getLogger(); + + /** + * variable BID + */ + private static final String BID = "bId"; + + /** + * variable QUERY + */ + private static final String QUERY = "Query"; + + /** + * variable REPORT_QUERY + */ + private static final String REPORT_QUERY = "ReportQuery"; + + /** + * variable CDCQuery + */ + private static final String CDC_QUERY = "CDCQuery"; + + /** + * variable OPERATION + */ + private static final String OPERATION = "operation"; + + /** + * variable OPTIONS_DATA + */ + private static final String OPTIONS_DATA = "optionsData"; + private static final ObjectMapper cdcQueryMapper = getCDCQueryMapper(); + + @Override + public void serialize(BatchItemRequest batchItemRequest, JsonGenerator jgen, SerializerProvider provider) throws IOException { + + jgen.writeStartObject(); + + // for bId + if (StringUtils.hasText(batchItemRequest.getBId())) { + jgen.writeFieldName(BID); + jgen.writeString(batchItemRequest.getBId()); + } + + // for IntuitObject + if (batchItemRequest.getIntuitObject() != null) { + jgen.writeFieldName(batchItemRequest.getIntuitObject().getValue().getClass().getSimpleName()); + try { + jgen.writeNumber(new JSONSerializer().serialize(batchItemRequest.getIntuitObject())); + } catch (SerializationException e) { + LOG.error("SerializationException while generating Json for IntuitObject in BatchItemRequestSerializer.", e); + throw new IOException(e); + } + } + + // for CDCQuery + if (batchItemRequest.getCDCQuery() != null) { + jgen.writeFieldName(CDC_QUERY); + try { + jgen.writeNumber(getCDCQueryJson(batchItemRequest.getCDCQuery())); + } catch (Exception e) { + LOG.error("SerializationException while generating Json for CDCQuery in BatchItemRequestSerializer.", e); + throw new IOException(e); + } + } + + // for Query + if (StringUtils.hasText(batchItemRequest.getQuery())) { + jgen.writeFieldName(QUERY); + jgen.writeString(batchItemRequest.getQuery()); + } + + // for ReportQuery + if (StringUtils.hasText(batchItemRequest.getReportQuery())) { + jgen.writeFieldName(REPORT_QUERY); + jgen.writeString(batchItemRequest.getReportQuery()); + } + + // for operation + if (batchItemRequest.getOperation() != null) { + jgen.writeFieldName(OPERATION); + jgen.writeString(batchItemRequest.getOperation().value()); + } + + // for OptionsData + if (StringUtils.hasText(batchItemRequest.getOptionsData())) { + jgen.writeFieldName(OPTIONS_DATA); + jgen.writeString(batchItemRequest.getOptionsData()); + } + + jgen.writeEndObject(); + } + + /** + * Method to get the Json string for CDCQuery object + * + * @param cdcQuery the CDCQuery entity describing need for query + * @return the json string + * @throws SerializationException throws SerializationException + */ + private String getCDCQueryJson(CDCQuery cdcQuery) throws SerializationException { + String json = null; + try { + json = cdcQueryMapper.writeValueAsString(cdcQuery); + } catch (Exception e) { + throw new SerializationException(e); + } + + return json; + } + + /** + * CDCQuery mapper for {@link #serialize(BatchItemRequest, JsonGenerator, SerializerProvider)}} + * + * @return ObjectMapper + */ + private static ObjectMapper getCDCQueryMapper() { + ObjectMapper mapper = new ObjectMapper(); + AnnotationIntrospector primary = new JacksonAnnotationIntrospector(); + AnnotationIntrospector secondary = new JakartaXmlBindAnnotationIntrospector(mapper.getTypeFactory()); + AnnotationIntrospector pair = new AnnotationIntrospectorPair(primary, secondary); + mapper.setAnnotationIntrospector(pair); + mapper.setSerializationInclusion(Include.NON_NULL); + return mapper; + } } diff --git a/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/BatchItemResponseDeserializer.java b/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/BatchItemResponseDeserializer.java index cf6e289d..c0c4d0f2 100755 --- a/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/BatchItemResponseDeserializer.java +++ b/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/BatchItemResponseDeserializer.java @@ -15,39 +15,21 @@ *******************************************************************************/ package com.intuit.ipp.serialization; -import java.io.IOException; -import java.util.Iterator; - -import jakarta.xml.bind.JAXBElement; - -import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.Version; -import com.fasterxml.jackson.databind.AnnotationIntrospector; -import com.fasterxml.jackson.databind.DeserializationConfig; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair; import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; import com.fasterxml.jackson.databind.module.SimpleModule; -//import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector; import com.fasterxml.jackson.module.jakarta.xmlbind.JakartaXmlBindAnnotationIntrospector; -import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair; -import com.fasterxml.jackson.databind.DeserializationFeature; - -import com.intuit.ipp.data.BatchItemResponse; -import com.intuit.ipp.data.CDCResponse; -import com.intuit.ipp.data.CustomFieldDefinition; -import com.intuit.ipp.data.Fault; -import com.intuit.ipp.data.IntuitEntity; -import com.intuit.ipp.data.ObjectFactory; -import com.intuit.ipp.data.QueryResponse; -import com.intuit.ipp.data.Report; +import com.intuit.ipp.data.*; import com.intuit.ipp.util.Logger; +import jakarta.xml.bind.JAXBElement; +import java.io.IOException; +import java.util.Iterator; /** * Custom deserializer class to handle BatchItemResponse while unmarshall - * */ public class BatchItemResponseDeserializer extends JsonDeserializer { /** @@ -56,141 +38,179 @@ public class BatchItemResponseDeserializer extends JsonDeserializer ite = jn.fieldNames(); - - while (ite.hasNext()) { - String key = ite.next(); - - //Attributes - if (key.equalsIgnoreCase(FAULT)) { - qr.setFault(mapper.treeToValue(jn.get(FAULT), Fault.class)); - continue; - } else if (key.equalsIgnoreCase(REPORT)) { - qr.setReport(mapper.treeToValue(jn.get(REPORT), Report.class)); - } else if (key.equalsIgnoreCase(BID)) { - qr.setBId(jn.get(BID).textValue()); - } else if (key.equals(QUERYRESPONSE)) { - qr.setQueryResponse(getQueryResponse(jn.get(key))); - } else if (key.equals(CDC_QUERY_RESPONSE)) { - qr.setCDCResponse(getCDCQueryResponse(jn.get(key))); - } else { + * logger instance + */ + private static final org.slf4j.Logger LOG = Logger.getLogger(); + + /** + * variable FAULT + */ + private static final String FAULT = "Fault"; + + /** + * variable REPORT + */ + private static final String REPORT = "Report"; + + /** + * variable BID + */ + private static final String BID = "bId"; + + /** + * variable QUERYRESPONSE + */ + private static final String QUERYRESPONSE = "QueryResponse"; + + /** + * variable CDC_QUERY_RESPONSE + */ + private static final String CDC_QUERY_RESPONSE = "CDCResponse"; + + /** + * variable objFactory + */ + private ObjectFactory objFactory = new ObjectFactory(); + private static final ObjectMapper deserializeMapper = getDeserializeMapper(); + private static final ObjectMapper deserializeCustomMapper = getDeserializeCustomMapper(); + private static final ObjectMapper queryResponseMapper = getQueryResponseMapper(); + private static final ObjectMapper cdcQueryResponseMapper = getCDCQueryResponseMapper(); + + /** + * {@inheritDoc}} + */ + @SuppressWarnings("deprecation") + @Override + public BatchItemResponse deserialize(JsonParser jp, DeserializationContext desContext) throws IOException { + //Read the QueryResponse as a tree + JsonNode jn = jp.readValueAsTree(); + + //Create the QueryResponse to be returned + BatchItemResponse qr = new BatchItemResponse(); + + //Iterate over the field names + Iterator ite = jn.fieldNames(); + + while (ite.hasNext()) { + String key = ite.next(); + + //Attributes + if (key.equalsIgnoreCase(FAULT)) { + qr.setFault(deserializeMapper.treeToValue(jn.get(FAULT), Fault.class)); + continue; + } else if (key.equalsIgnoreCase(REPORT)) { + qr.setReport(deserializeMapper.treeToValue(jn.get(REPORT), Report.class)); + } else if (key.equalsIgnoreCase(BID)) { + qr.setBId(jn.get(BID).textValue()); + } else if (key.equals(QUERYRESPONSE)) { + qr.setQueryResponse(getQueryResponse(jn.get(key))); + } else if (key.equals(CDC_QUERY_RESPONSE)) { + qr.setCDCResponse(getCDCQueryResponse(jn.get(key))); + } else { // It has to be an IntuitEntity - String entity = key; - LOG.debug("entity key : " + key); - if (JsonResourceTypeLocator.lookupType(entity) != null) { - // set the CustomFieldDefinition deserializer - registerModulesForCustomFieldDef(mapper); - Object intuitType = mapper.treeToValue(jn.get(key), JsonResourceTypeLocator.lookupType(entity)); - if (intuitType instanceof IntuitEntity) { + String entity = key; + LOG.debug("entity key : " + key); + if (JsonResourceTypeLocator.lookupType(entity) != null) { + // set the CustomFieldDefinition deserializer + Object intuitType = deserializeCustomMapper.treeToValue(jn.get(key), JsonResourceTypeLocator.lookupType(entity)); + if (intuitType instanceof IntuitEntity) { intuitResponseDeserializerHelper.updateBigDecimalScale((IntuitEntity) intuitType); - JAXBElement intuitObject = objFactory - .createIntuitObject((IntuitEntity) intuitType); - qr.setIntuitObject(intuitObject); - } - } - } - } - return qr; - } - - /** - * Method to deserialize the QueryResponse object - * - * @param jsonNode - * @return QueryResponse - */ - private QueryResponse getQueryResponse(JsonNode jsonNode) throws IOException { - ObjectMapper mapper = new ObjectMapper(); - - SimpleModule simpleModule = new SimpleModule("QueryResponseDeserializer", new Version(1, 0, 0, null)); - simpleModule.addDeserializer(QueryResponse.class, new QueryResponseDeserializer()); - - mapper.registerModule(simpleModule); - - return mapper.treeToValue(jsonNode, QueryResponse.class); - } - - /** - * Method to deserialize the CDCQueryResponse object - * - * @param jsonNode - * @return CDCResponse - */ - private CDCResponse getCDCQueryResponse(JsonNode jsonNode) throws IOException { - ObjectMapper mapper = new ObjectMapper(); - - SimpleModule simpleModule = new SimpleModule("CDCQueryResponseDeserializer", new Version(1, 0, 0, null)); - simpleModule.addDeserializer(CDCResponse.class, new CDCQueryResponseDeserializer()); - - mapper.registerModule(simpleModule); - - return mapper.treeToValue(jsonNode, CDCResponse.class); - } - - /** - * Method to add custom deserializer for CustomFieldDefinition - * - * @param objectMapper the Jackson object mapper - */ - private void registerModulesForCustomFieldDef(ObjectMapper objectMapper) { - SimpleModule simpleModule = new SimpleModule("CustomFieldDefinition", new Version(1, 0, 0, null)); - simpleModule.addDeserializer(CustomFieldDefinition.class, new CustomFieldDefinitionDeserializer()); - objectMapper.registerModule(simpleModule); - } + JAXBElement intuitObject = objFactory + .createIntuitObject((IntuitEntity) intuitType); + qr.setIntuitObject(intuitObject); + } + } + } + } + return qr; + } + + /** + * Method to deserialize the QueryResponse object + * + * @param jsonNode + * @return QueryResponse + */ + private QueryResponse getQueryResponse(JsonNode jsonNode) throws IOException { + ObjectMapper mapper = new ObjectMapper(); + + SimpleModule simpleModule = new SimpleModule("QueryResponseDeserializer", new Version(1, 0, 0, null)); + simpleModule.addDeserializer(QueryResponse.class, new QueryResponseDeserializer()); + + mapper.registerModule(simpleModule); + + return mapper.treeToValue(jsonNode, QueryResponse.class); + } + + /** + * Method to deserialize the CDCQueryResponse object + * + * @param jsonNode + * @return CDCResponse + */ + private CDCResponse getCDCQueryResponse(JsonNode jsonNode) throws IOException { + ObjectMapper mapper = new ObjectMapper(); + + SimpleModule simpleModule = new SimpleModule("CDCQueryResponseDeserializer", new Version(1, 0, 0, null)); + simpleModule.addDeserializer(CDCResponse.class, new CDCQueryResponseDeserializer()); + + mapper.registerModule(simpleModule); + + return mapper.treeToValue(jsonNode, CDCResponse.class); + } + + /** + * QueryResponse mapper for {@link #deserialize(JsonParser, DeserializationContext)}} + * + * @return ObjectMapper + */ + private static ObjectMapper getQueryResponseMapper() { + ObjectMapper mapper = new ObjectMapper(); + SimpleModule simpleModule = new SimpleModule("QueryResponseDeserializer", new Version(1, 0, 0, null)); + simpleModule.addDeserializer(QueryResponse.class, new QueryResponseDeserializer()); + mapper.registerModule(simpleModule); + return mapper; + } + + /** + * CDCQueryResponse mapper for {@link #deserialize(JsonParser, DeserializationContext)}} + * + * @return ObjectMapper + */ + private static ObjectMapper getCDCQueryResponseMapper() { + ObjectMapper mapper = new ObjectMapper(); + SimpleModule simpleModule = new SimpleModule("CDCQueryResponseDeserializer", new Version(1, 0, 0, null)); + simpleModule.addDeserializer(CDCResponse.class, new CDCQueryResponseDeserializer()); + mapper.registerModule(simpleModule); + return mapper; + } + + /** + * Deserialize mapper for {@link #deserialize(JsonParser, DeserializationContext)}} + * + * @return ObjectMapper + */ + private static ObjectMapper getDeserializeMapper() { + ObjectMapper mapper = new ObjectMapper(); + //Make the mapper JAXB annotations aware + AnnotationIntrospector primary = new JakartaXmlBindAnnotationIntrospector(); + AnnotationIntrospector secondary = new JacksonAnnotationIntrospector(); + AnnotationIntrospector pair = new AnnotationIntrospectorPair(primary, secondary); + mapper.setAnnotationIntrospector(pair); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + return mapper; + } + + /** + * Create mapper for {@link #deserialize(JsonParser, DeserializationContext)}} + * + * @return ObjectMapper + */ + private static ObjectMapper getDeserializeCustomMapper() { + ObjectMapper mapper = getDeserializeMapper().copy(); + SimpleModule simpleModule = new SimpleModule("CustomFieldDefinition", new Version(1, 0, 0, null)); + simpleModule.addDeserializer(CustomFieldDefinition.class, new CustomFieldDefinitionDeserializer()); + mapper.registerModule(simpleModule); + return mapper; + } } diff --git a/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/CDCQueryResponseDeserializer.java b/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/CDCQueryResponseDeserializer.java index b9b248a4..0f9c306e 100755 --- a/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/CDCQueryResponseDeserializer.java +++ b/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/CDCQueryResponseDeserializer.java @@ -15,121 +15,117 @@ *******************************************************************************/ package com.intuit.ipp.serialization; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.Version; -import com.fasterxml.jackson.databind.AnnotationIntrospector; -import com.fasterxml.jackson.databind.DeserializationConfig; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair; import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.module.jakarta.xmlbind.JakartaXmlBindAnnotationIntrospector; -import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair; -import com.fasterxml.jackson.databind.DeserializationFeature; - import com.intuit.ipp.data.CDCResponse; import com.intuit.ipp.data.Fault; import com.intuit.ipp.data.QueryResponse; import com.intuit.ipp.util.Logger; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; /** * Custom deserializer class to handle CDCResponse while unmarshall - * */ public class CDCQueryResponseDeserializer extends JsonDeserializer { - /** - * logger instance - */ - private static final org.slf4j.Logger LOG = Logger.getLogger(); - - /** - * variable FAULT - */ - private static final String FAULT = "Fault"; - - /** - * variable SIZE - */ - private static final String SIZE = "size"; - - /** - * variable QUERY_RESPONSE - */ - private static final String QUERY_RESPONSE = "QueryResponse"; - - @SuppressWarnings("deprecation") - @Override - public CDCResponse deserialize(JsonParser jp, DeserializationContext desContext) throws IOException { - ObjectMapper mapper = new ObjectMapper(); - - //Make the mapper JAXB annotations aware - AnnotationIntrospector primary = new JakartaXmlBindAnnotationIntrospector(); - AnnotationIntrospector secondary = new JacksonAnnotationIntrospector(); - AnnotationIntrospector pair = new AnnotationIntrospectorPair(primary, secondary); - mapper.setAnnotationIntrospector(pair); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - - //Read the QueryResponse as a tree - JsonNode jn = jp.readValueAsTree(); - - //Create the QueryResponse to be returned - CDCResponse qr = new CDCResponse(); - - //Iterate over the field names - Iterator ite = jn.fieldNames(); - - while (ite.hasNext()) { - String key = ite.next(); - - //Attributes - if (key.equals(FAULT)) { - qr.setFault(mapper.treeToValue(jn.get(FAULT), Fault.class)); - continue; - } else if (key.equals(SIZE)) { - qr.setSize(jn.get(SIZE).intValue()); - } else if (key.equals(QUERY_RESPONSE)) { + /** + * logger instance + */ + private static final org.slf4j.Logger LOG = Logger.getLogger(); + + /** + * variable FAULT + */ + private static final String FAULT = "Fault"; + + /** + * variable SIZE + */ + private static final String SIZE = "size"; + + /** + * variable QUERY_RESPONSE + */ + private static final String QUERY_RESPONSE = "QueryResponse"; + private static final ObjectMapper deserializeMapper = getDeserializeMapper(); + private static final ObjectMapper queryResponseMapper = getQueryResponseMapper(); + + @SuppressWarnings("deprecation") + @Override + public CDCResponse deserialize(JsonParser jp, DeserializationContext desContext) throws IOException { + //Read the QueryResponse as a tree + JsonNode jn = jp.readValueAsTree(); + + //Create the QueryResponse to be returned + CDCResponse qr = new CDCResponse(); + + //Iterate over the field names + Iterator ite = jn.fieldNames(); + + while (ite.hasNext()) { + String key = ite.next(); + + //Attributes + if (key.equals(FAULT)) { + qr.setFault(deserializeMapper.treeToValue(jn.get(FAULT), Fault.class)); + continue; + } else if (key.equals(SIZE)) { + qr.setSize(jn.get(SIZE).intValue()); + } else if (key.equals(QUERY_RESPONSE)) { JsonNode jn1 = jn.get(key); - if (jn1.isArray()) { - List queryResponses = new ArrayList(); - Iterator iteJson = jn1.iterator(); - while (iteJson.hasNext()) { - JsonNode jn2 = iteJson.next(); - QueryResponse queryResponse = getQueryResponse(jn2); - queryResponses.add(queryResponse); - } - qr.setQueryResponse(queryResponses); - } - } else { - // Unknown key - LOG.warn("Unknown key for CDCResponse :" + key); - } - } - - return qr; - } - - /** - * Method to deserialize the QueryResponse object - * - * @param jsonNode - * @return QueryResponse - */ - private QueryResponse getQueryResponse(JsonNode jsonNode) throws IOException { - ObjectMapper mapper = new ObjectMapper(); - - SimpleModule simpleModule = new SimpleModule("QueryResponseDeserializer", new Version(1, 0, 0, null)); - simpleModule.addDeserializer(QueryResponse.class, new QueryResponseDeserializer()); - - mapper.registerModule(simpleModule); - - return mapper.treeToValue(jsonNode, QueryResponse.class); - } + if (jn1.isArray()) { + List queryResponses = new ArrayList(); + Iterator iteJson = jn1.iterator(); + while (iteJson.hasNext()) { + JsonNode jn2 = iteJson.next(); + QueryResponse queryResponse = queryResponseMapper.treeToValue(jn2, QueryResponse.class); + queryResponses.add(queryResponse); + } + qr.setQueryResponse(queryResponses); + } + } else { + // Unknown key + LOG.warn("Unknown key for CDCResponse :" + key); + } + } + + return qr; + } + + /** + * Deserialize mapper for {@link #deserialize(JsonParser, DeserializationContext)}} + * + * @return ObjectMapper + */ + private static ObjectMapper getDeserializeMapper() { + ObjectMapper mapper = new ObjectMapper(); + //Make the mapper JAXB annotations aware + AnnotationIntrospector primary = new JakartaXmlBindAnnotationIntrospector(mapper.getTypeFactory()); + AnnotationIntrospector secondary = new JacksonAnnotationIntrospector(); + AnnotationIntrospector pair = new AnnotationIntrospectorPair(primary, secondary); + mapper.setAnnotationIntrospector(pair); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + return mapper; + } + + /** + * QueryResponse mapper for {@link #deserialize(JsonParser, DeserializationContext)}} + * + * @return ObjectMapper + */ + private static ObjectMapper getQueryResponseMapper() { + ObjectMapper mapper = new ObjectMapper(); + SimpleModule simpleModule = new SimpleModule("QueryResponseDeserializer", new Version(1, 0, 0, null)); + simpleModule.addDeserializer(QueryResponse.class, new QueryResponseDeserializer()); + mapper.registerModule(simpleModule); + return mapper; + } } diff --git a/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/CustomFieldDefinitionDeserializer.java b/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/CustomFieldDefinitionDeserializer.java index abe7168c..705eb3e2 100755 --- a/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/CustomFieldDefinitionDeserializer.java +++ b/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/CustomFieldDefinitionDeserializer.java @@ -15,113 +15,111 @@ *******************************************************************************/ package com.intuit.ipp.serialization; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.AnnotationIntrospector; -import com.fasterxml.jackson.databind.DeserializationConfig; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair; import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; -//import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector; import com.fasterxml.jackson.module.jakarta.xmlbind.JakartaXmlBindAnnotationIntrospector; -import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair; -import com.fasterxml.jackson.databind.DeserializationFeature; - import com.intuit.ipp.data.CustomField; import com.intuit.ipp.data.CustomFieldDefinition; import com.intuit.ipp.util.Logger; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; /** * Custom deserializer class to handle CustomFieldDefinition while unmarshall - * */ public class CustomFieldDefinitionDeserializer extends JsonDeserializer { - /** - * logger instance - */ - private static final org.slf4j.Logger LOG = Logger.getLogger(); + /** + * logger instance + */ + private static final org.slf4j.Logger LOG = Logger.getLogger(); + + /** + * variable FAULT + */ + private static final String CUSTOM_FIELD = "CustomField"; + + /** + * variable FAULT + */ + private static final String TYPE = "Type"; + private static final ObjectMapper deserializeMapper = getDeserializeMapper(); + + @SuppressWarnings("deprecation") + @Override + public CustomFieldDefinition deserialize(JsonParser jp, DeserializationContext desContext) throws IOException { + //Read the CustomFieldDefinition as a tree + JsonNode jn = jp.readValueAsTree(); - /** - * variable FAULT - */ - private static final String CUSTOM_FIELD = "CustomField"; - - /** - * variable FAULT - */ - private static final String TYPE = "Type"; - - @SuppressWarnings("deprecation") - @Override - public CustomFieldDefinition deserialize(JsonParser jp, DeserializationContext desContext) throws IOException { - ObjectMapper mapper = new ObjectMapper(); + //Create the CustomFieldDefinition to be returned + CustomFieldDefinition qr = null; - //Make the mapper JAXB annotations aware - AnnotationIntrospector primary = new JakartaXmlBindAnnotationIntrospector(); - AnnotationIntrospector secondary = new JacksonAnnotationIntrospector(); - AnnotationIntrospector pair = new AnnotationIntrospectorPair(primary, secondary); - mapper.setAnnotationIntrospector(pair); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + //Iterate over the field names + Iterator ite = jn.fieldNames(); - //Read the CustomFieldDefinition as a tree - JsonNode jn = jp.readValueAsTree(); + while (ite.hasNext()) { + String key = ite.next(); + // look for CustomField element + if (key.equals(CUSTOM_FIELD)) { + JsonNode jn1 = jn.get(key); + // get the corresponding type + qr = getCustomFieldDefinitionType(jn1); + LOG.debug("The CustomFieldDefinition implementation type " + qr); + if (qr != null) { + List customFields = new ArrayList(); + Iterator iteJson = jn1.iterator(); + while (iteJson.hasNext()) { + JsonNode jn2 = iteJson.next(); + customFields.add(deserializeMapper.treeToValue(jn2, CustomField.class)); + } - //Create the CustomFieldDefinition to be returned - CustomFieldDefinition qr = null; + qr.setCustomField(customFields); + return qr; + } + } + } - //Iterate over the field names - Iterator ite = jn.fieldNames(); + return null; + } - while (ite.hasNext()) { - String key = ite.next(); - // look for CustomField element - if (key.equals(CUSTOM_FIELD)) { - JsonNode jn1 = jn.get(key); - // get the corresponding type - qr = getCustomFieldDefinitionType(jn1); - LOG.debug("The CustomFieldDefinition implementation type " + qr); - if (qr != null) { - List customFields = new ArrayList(); - Iterator iteJson = jn1.iterator(); - while (iteJson.hasNext()) { - JsonNode jn2 = iteJson.next(); - customFields.add(mapper.treeToValue(jn2, CustomField.class)); - } - - qr.setCustomField(customFields); - return qr; - } - } - } + /** + * Method to get the CustomFieldDefinition implementation type object + * + * @param jn the Json Node + * @return CustomFieldDefinition implementation reference + * @throws IOException + */ + private CustomFieldDefinition getCustomFieldDefinitionType(JsonNode jn) throws IOException { + if (jn.isArray()) { + JsonNode jn1 = jn.get(0); + String type = jn1.get(TYPE).textValue(); + try { + return (CustomFieldDefinition) Class.forName("com.intuit.ipp.data." + type + "CustomFieldDefinition").newInstance(); + } catch (Exception e) { + throw new IOException("Exception while deserializing CustomFieldDefinition", e); + } + } - return null; - } + return null; + } - /** - * Method to get the CustomFieldDefinition implementation type object - * - * @param jn the Json Node - * @return CustomFieldDefinition implementation reference - * @throws IOException - */ - private CustomFieldDefinition getCustomFieldDefinitionType(JsonNode jn) throws IOException { - if (jn.isArray()) { - JsonNode jn1 = jn.get(0); - String type = jn1.get(TYPE).textValue(); - try { - return (CustomFieldDefinition) Class.forName("com.intuit.ipp.data." + type + "CustomFieldDefinition").newInstance(); - } catch (Exception e) { - throw new IOException("Exception while deserializing CustomFieldDefinition", e); - } - } - - return null; - } + /** + * Deserialize mapper for {@link #deserialize(JsonParser, DeserializationContext)}} + * + * @return ObjectMapper + */ + private static ObjectMapper getDeserializeMapper() { + ObjectMapper mapper = new ObjectMapper(); + //Make the mapper JAXB annotations aware + AnnotationIntrospector primary = new JakartaXmlBindAnnotationIntrospector(mapper.getTypeFactory()); + AnnotationIntrospector secondary = new JacksonAnnotationIntrospector(); + AnnotationIntrospector pair = new AnnotationIntrospectorPair(primary, secondary); + mapper.setAnnotationIntrospector(pair); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + return mapper; + } } diff --git a/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/IntuitResponseDeserializer.java b/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/IntuitResponseDeserializer.java index 432170bb..3258f519 100755 --- a/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/IntuitResponseDeserializer.java +++ b/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/IntuitResponseDeserializer.java @@ -135,6 +135,13 @@ public class IntuitResponseDeserializer extends JsonDeserializer * variable objFactory */ private ObjectFactory objFactory = new ObjectFactory(); + private static final ObjectMapper deserializeMapper = getDeserializeMapper(); + private static final ObjectMapper customDeserializeMapper = getCustomDeserializeMapper(); + private static final ObjectMapper queryResponseMapper = getQueryResponseMapper(); + private static final ObjectMapper cdcQueryResponseMapper = getCDCQueryResponseMapper(); + private static final ObjectMapper attachableResponseMapper = getAttachableResponseMapper(); + private static final ObjectMapper batchItemResponseMapper = getBatchItemResponseMapper(); + private static final ObjectMapper syncErrorResponseMapper = getSyncErrorResponseMapper(); /** * {@inheritDoc}} @@ -143,18 +150,7 @@ public class IntuitResponseDeserializer extends JsonDeserializer @Override public IntuitResponse deserialize(JsonParser jp, DeserializationContext desContext) throws IOException { - ObjectMapper mapper = new ObjectMapper(); Report report = new Report(); - - //Make the mapper JAXB annotations aware - AnnotationIntrospector primary = new JakartaXmlBindAnnotationIntrospector(); - AnnotationIntrospector secondary = new JacksonAnnotationIntrospector(); - AnnotationIntrospector pair = new AnnotationIntrospectorPair(primary, secondary); - mapper.setAnnotationIntrospector(pair); - - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - - //Read the QueryResponse as a tree JsonNode jn = jp.readValueAsTree(); @@ -173,19 +169,19 @@ public IntuitResponse deserialize(JsonParser jp, DeserializationContext desConte //Attributes if (key.equalsIgnoreCase(FAULT)) { - mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); - qr.setFault(mapper.treeToValue(jn.get(key), Fault.class)); + deserializeMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); + qr.setFault(deserializeMapper.treeToValue(jn.get(key), Fault.class)); continue; } else if (key.equalsIgnoreCase(REPORT)) { - qr.setReport(mapper.treeToValue(jn.get(key), Report.class)); + qr.setReport(deserializeMapper.treeToValue(jn.get(key), Report.class)); } else if (key.equalsIgnoreCase(HEADER)) { - ReportHeader header = mapper.treeToValue(jn.get(HEADER), ReportHeader.class); + ReportHeader header = deserializeMapper.treeToValue(jn.get(HEADER), ReportHeader.class); report.setHeader(header); } else if (key.equalsIgnoreCase(ROWS)) { - Rows rows= mapper.treeToValue(jn.get(ROWS), Rows.class); + Rows rows= deserializeMapper.treeToValue(jn.get(ROWS), Rows.class); report.setRows(rows); } else if (key.equalsIgnoreCase(COLUMNS)) { - Columns columns= mapper.treeToValue(jn.get(COLUMNS), Columns.class); + Columns columns= deserializeMapper.treeToValue(jn.get(COLUMNS), Columns.class); report.setColumns(columns); } else if (key.equalsIgnoreCase(REQUESTID)) { qr.setRequestId(jn.get(REQUESTID).textValue()); @@ -199,9 +195,9 @@ public IntuitResponse deserialize(JsonParser jp, DeserializationContext desConte qr.setStatus(jn.get(STATUS).textValue()); } else if (key.equals(SYNC_ERROR_RESPONSE)) { //qr.setSyncErrorResponse(mapper.readValue(jn.get(SYNC_ERROR_RESPONSE), SyncErrorResponse.class)); - qr.setSyncErrorResponse(getSyncErrorResponse(jn.get(key))); + qr.setSyncErrorResponse(syncErrorResponseMapper.treeToValue(jn.get(key), SyncErrorResponse.class)); } else if (key.equals(QUERY_RESPONSE)) { - qr.setQueryResponse(getQueryResponse(jn.get(key))); + qr.setQueryResponse(queryResponseMapper.treeToValue(jn.get(key), QueryResponse.class)); } else if (key.equals(CDC_QUERY_RESPONSE)) { List cdcResponses = new ArrayList(); JsonNode jn1 = jn.get(key); @@ -209,7 +205,7 @@ public IntuitResponse deserialize(JsonParser jp, DeserializationContext desConte Iterator iteJson = jn1.iterator(); while (iteJson.hasNext()) { JsonNode jn2 = iteJson.next(); - cdcResponses.add(getCDCQueryResponse(jn2)); + cdcResponses.add(cdcQueryResponseMapper.treeToValue(jn2, CDCResponse.class)); } } qr.setCDCResponse(cdcResponses); @@ -222,7 +218,7 @@ public IntuitResponse deserialize(JsonParser jp, DeserializationContext desConte Iterator iteJson = jn1.iterator(); while (iteJson.hasNext()) { JsonNode jn2 = iteJson.next(); - batchItemResponses.add(getBatchItemResponse(jn2)); + batchItemResponses.add(batchItemResponseMapper.treeToValue(jn2, BatchItemResponse.class)); } } qr.setBatchItemResponse(batchItemResponses); @@ -237,7 +233,7 @@ public IntuitResponse deserialize(JsonParser jp, DeserializationContext desConte Iterator iteJson = jn1.iterator(); while (iteJson.hasNext()) { JsonNode jn2 = iteJson.next(); - attachableResponses.add(getAttachableResponse(jn2)); + attachableResponses.add(attachableResponseMapper.treeToValue(jn2, AttachableResponse.class)); } } qr.setAttachableResponse(attachableResponses); @@ -247,7 +243,7 @@ public IntuitResponse deserialize(JsonParser jp, DeserializationContext desConte LOG.debug("processing recurring transaction response"); JsonNode rtNode = jn.get(key); - Object recurringTxn = mapper.treeToValue(rtNode, JsonResourceTypeLocator.lookupType(key)); + Object recurringTxn = deserializeMapper.treeToValue(rtNode, JsonResourceTypeLocator.lookupType(key)); RecurringTransaction rt = new RecurringTransaction(); rt = (RecurringTransaction) recurringTxn; @@ -258,7 +254,7 @@ public IntuitResponse deserialize(JsonParser jp, DeserializationContext desConte JsonNode entityNode = rtNode.get(entityName); //Force the data to be casted to its type - Object entity = mapper.treeToValue(entityNode, JsonResourceTypeLocator.lookupType(entityName)); + Object entity = deserializeMapper.treeToValue(entityNode, JsonResourceTypeLocator.lookupType(entityName)); //Double check if (entity instanceof IntuitEntity) { @@ -267,9 +263,6 @@ public IntuitResponse deserialize(JsonParser jp, DeserializationContext desConte rt.setIntuitObject(intuitObject); } - // set the CustomFieldDefinition deserializer - registerModulesForCustomFieldDef(mapper); - Object obj = rt; if (obj instanceof IntuitEntity) { intuitResponseDeserializerHelper.updateBigDecimalScale((IntuitEntity) obj); @@ -282,9 +275,7 @@ public IntuitResponse deserialize(JsonParser jp, DeserializationContext desConte String entity = key; LOG.debug("entity key : " + key); if (JsonResourceTypeLocator.lookupType(entity) != null) { - // set the CustomFieldDefinition deserializer - registerModulesForCustomFieldDef(mapper); - Object intuitType = mapper.treeToValue(jn.get(key), JsonResourceTypeLocator.lookupType(entity)); + Object intuitType = customDeserializeMapper.treeToValue(jn.get(key), JsonResourceTypeLocator.lookupType(entity)); if (intuitType instanceof IntuitEntity) { intuitResponseDeserializerHelper.updateBigDecimalScale((IntuitEntity) intuitType); @@ -310,141 +301,97 @@ else if ((intuitType instanceof OLBTransaction)) return qr; } - /** - * Updates instances of BigDecimal with new scale in intuitEntity - * @param intuitType - - private void updateBigDecimalScale(IntuitEntity intuitType) { - IntuitResponseDeserializer.Feature feature = new IntuitResponseDeserializer.Feature() { - private IntuitEntity obj; - public void set(T object) { - obj = object; - } - public void execute() { - (new IntuitResponseDeserializer.BigDecimalScaleUpdater()).execute(obj); - } - }; - feature.set(intuitType); - - invokeFeature(Config.BIGDECIMAL_SCALE_SHIFT, feature); - }*/ - - - /** - * Method to deserialize the SyncErrorResponse object - * - * @param jsonNode - * @return QueryResponse + * QueryResponse mapper for {@link #deserialize(JsonParser, DeserializationContext)}} + * @return ObjectMapper */ - /* - private SyncErrorResponse getSyncErrorResponse(JsonNode jsonNode) throws IOException { + private static ObjectMapper getQueryResponseMapper() { ObjectMapper mapper = new ObjectMapper(); - - SimpleModule simpleModule = new SimpleModule("SyncErrorResponseDeserializer", new Version(1, 0, 0, null)); - simpleModule.addDeserializer(SyncErrorResponse.class, new SyncErrorResponseDeserializer()); - - mapper.registerModule(simpleModule); - mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); - - return mapper.readValue(jsonNode, SyncErrorResponse.class); - } - */ - /** - * Method to deserialize the QueryResponse object - * - * @param jsonNode - * @return QueryResponse - */ - private QueryResponse getQueryResponse(JsonNode jsonNode) throws IOException { - ObjectMapper mapper = new ObjectMapper(); - SimpleModule simpleModule = new SimpleModule("QueryResponseDeserializer", new Version(1, 0, 0, null)); simpleModule.addDeserializer(QueryResponse.class, new QueryResponseDeserializer()); - mapper.registerModule(simpleModule); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - - return mapper.treeToValue(jsonNode, QueryResponse.class); + return mapper; } - + /** - * Method to deserialize the CDCQueryResponse object - * - * @param jsonNode - * @return CDCResponse + * CDCQueryResponse mapper for {@link #deserialize(JsonParser, DeserializationContext)}} + * @return ObjectMapper */ - private CDCResponse getCDCQueryResponse(JsonNode jsonNode) throws IOException { + private static ObjectMapper getCDCQueryResponseMapper() { ObjectMapper mapper = new ObjectMapper(); - SimpleModule simpleModule = new SimpleModule("CDCQueryResponseDeserializer", new Version(1, 0, 0, null)); simpleModule.addDeserializer(CDCResponse.class, new CDCQueryResponseDeserializer()); - mapper.registerModule(simpleModule); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - - return mapper.treeToValue(jsonNode, CDCResponse.class); + return mapper; } - + /** - * Method to deserialize the BatchItemResponse object - * - * @param jsonNode the json node - * @return BatchItemResponse the batch item response + * BatchItemResponse mapper for {@link #deserialize(JsonParser, DeserializationContext)}} + * @return ObjectMapper */ - private BatchItemResponse getBatchItemResponse(JsonNode jsonNode) throws IOException { + private static ObjectMapper getBatchItemResponseMapper(){ ObjectMapper mapper = new ObjectMapper(); - SimpleModule simpleModule = new SimpleModule("BatchItemResponseDeserializer", new Version(1, 0, 0, null)); simpleModule.addDeserializer(BatchItemResponse.class, new BatchItemResponseDeserializer()); - mapper.registerModule(simpleModule); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - - return mapper.treeToValue(jsonNode, BatchItemResponse.class); + return mapper; } - + /** - * Method to deserialize the QueryResponse object - * - * @param jsonNode - * @return QueryResponse + * AttachableResponse mapper for {@link #deserialize(JsonParser, DeserializationContext)}} + * @return ObjectMapper */ - private AttachableResponse getAttachableResponse(JsonNode jsonNode) throws IOException { + private static ObjectMapper getAttachableResponseMapper() { ObjectMapper mapper = new ObjectMapper(); - SimpleModule simpleModule = new SimpleModule("AttachableResponseDeserializer", new Version(1, 0, 0, null)); simpleModule.addDeserializer(AttachableResponse.class, new AttachableResponseDeserializer()); + mapper.registerModule(simpleModule); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + return mapper; + } + /** + * SyncErrorResponse mapper for {@link #deserialize(JsonParser, DeserializationContext)}} + * @return ObjectMapper + */ + private static ObjectMapper getSyncErrorResponseMapper() { + ObjectMapper mapper = new ObjectMapper(); + SimpleModule simpleModule = new SimpleModule("SyncErrorResponseDeserializer", new Version(1, 0, 0, null)); + simpleModule.addDeserializer(SyncErrorResponse.class, new SyncErrorResponseDeserializer()); mapper.registerModule(simpleModule); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + return mapper; + } - return mapper.treeToValue(jsonNode, AttachableResponse.class); + /** + * Deserialize mapper for {@link #deserialize(JsonParser, DeserializationContext)}} + * @return ObjectMapper + */ + private static ObjectMapper getDeserializeMapper() { + ObjectMapper mapper = new ObjectMapper(); + //Make the mapper JAXB annotations aware + AnnotationIntrospector primary = new JakartaXmlBindAnnotationIntrospector(); + AnnotationIntrospector secondary = new JacksonAnnotationIntrospector(); + AnnotationIntrospector pair = new AnnotationIntrospectorPair(primary, secondary); + mapper.setAnnotationIntrospector(pair); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + return mapper; } - + /** - * Method to add custom deserializer for CustomFieldDefinition - * - * @param objectMapper the Jackson object mapper + * Custom mapper for {@link #deserialize(JsonParser, DeserializationContext)}} + * @return ObjectMapper */ - private void registerModulesForCustomFieldDef(ObjectMapper objectMapper) { + private static ObjectMapper getCustomDeserializeMapper() { + ObjectMapper objectMapper = deserializeMapper.copy(); SimpleModule simpleModule = new SimpleModule("CustomFieldDefinition", new Version(1, 0, 0, null)); simpleModule.addDeserializer(CustomFieldDefinition.class, new CustomFieldDefinitionDeserializer()); objectMapper.registerModule(simpleModule); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + return objectMapper; } - private SyncErrorResponse getSyncErrorResponse(JsonNode jsonNode) throws IOException { - ObjectMapper mapper = new ObjectMapper(); - - SimpleModule simpleModule = new SimpleModule("SyncErrorResponseDeserializer", new Version(1, 0, 0, null)); - simpleModule.addDeserializer(SyncErrorResponse.class, new SyncErrorResponseDeserializer()); - - mapper.registerModule(simpleModule); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - - return mapper.treeToValue(jsonNode, SyncErrorResponse.class); - } - - } diff --git a/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/JSONSerializer.java b/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/JSONSerializer.java index 6bf36e1f..6f57a237 100755 --- a/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/JSONSerializer.java +++ b/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/JSONSerializer.java @@ -15,8 +15,6 @@ *******************************************************************************/ package com.intuit.ipp.serialization; -import jakarta.xml.bind.JAXBElement; - import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.core.Version; import com.fasterxml.jackson.databind.AnnotationIntrospector; @@ -25,678 +23,485 @@ import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair; import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; import com.fasterxml.jackson.databind.module.SimpleModule; -//import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector; import com.fasterxml.jackson.module.jakarta.xmlbind.JakartaXmlBindAnnotationIntrospector; import com.intuit.ipp.core.Response; -import com.intuit.ipp.data.APCreditCardOperationEnum; -import com.intuit.ipp.data.AccountClassificationEnum; -import com.intuit.ipp.data.AccountSubTypeEnum; -import com.intuit.ipp.data.AccountTypeEnum; -import com.intuit.ipp.data.AcquiredAsEnum; -import com.intuit.ipp.data.AgencyPaymentMethodEnum; -import com.intuit.ipp.data.AttachableCategoryEnum; -import com.intuit.ipp.data.BatchItemRequest; -import com.intuit.ipp.data.BillPaymentTypeEnum; -import com.intuit.ipp.data.BillableStatusEnum; -import com.intuit.ipp.data.BudgetEntryTypeEnum; -import com.intuit.ipp.data.BudgetTypeEnum; -import com.intuit.ipp.data.CCAVSMatchEnum; -import com.intuit.ipp.data.CCPaymentStatusEnum; -import com.intuit.ipp.data.CCSecurityCodeMatchEnum; -import com.intuit.ipp.data.CCTxnModeEnum; -import com.intuit.ipp.data.CCTxnTypeEnum; -import com.intuit.ipp.data.CISRateEnum; -import com.intuit.ipp.data.ColumnTypeEnum; -import com.intuit.ipp.data.ContactTypeEnum; -import com.intuit.ipp.data.ConvenienceFeeTypeEnum; -import com.intuit.ipp.data.CreditCardTypeEnum; -import com.intuit.ipp.data.CustomFieldTypeEnum; -import com.intuit.ipp.data.CustomerTypeEnum; -import com.intuit.ipp.data.DayOfWeekEnum; -import com.intuit.ipp.data.DeliveryErrorTypeEnum; -import com.intuit.ipp.data.DeliveryTypeEnum; -import com.intuit.ipp.data.DesktopEntityTypeEnum; -import com.intuit.ipp.data.DiscountTypeEnum; -import com.intuit.ipp.data.ETransactionEnabledStatusEnum; -import com.intuit.ipp.data.ETransactionStatusEnum; -import com.intuit.ipp.data.EmailAddressTypeEnum; -import com.intuit.ipp.data.EmailStatusEnum; -import com.intuit.ipp.data.EmployeeTypeEnum; -import com.intuit.ipp.data.EntitlementsResponse; -import com.intuit.ipp.data.EntityStatusEnum; -import com.intuit.ipp.data.EntityTypeEnum; -import com.intuit.ipp.data.EstimateStatusEnum; -import com.intuit.ipp.data.FaultTypeEnum; -import com.intuit.ipp.data.Gender; -import com.intuit.ipp.data.GlobalTaxCalculationEnum; -import com.intuit.ipp.data.IdDomainEnum; -import com.intuit.ipp.data.IntuitResponse; -import com.intuit.ipp.data.ItemCategoryTypeEnum; -import com.intuit.ipp.data.ItemTypeEnum; -import com.intuit.ipp.data.JobStatusEnum; -import com.intuit.ipp.data.JournalCodeTypeEnum; -import com.intuit.ipp.data.LineDetailTypeEnum; -import com.intuit.ipp.data.MonthEnum; -import com.intuit.ipp.data.OLBTxnStatusEnum; -import com.intuit.ipp.data.ObjectNameEnumType; -import com.intuit.ipp.data.OperationEnum; -import com.intuit.ipp.data.PaySalesTaxEnum; -import com.intuit.ipp.data.PaymentMethodEnum; -import com.intuit.ipp.data.PaymentStatusEnum; -import com.intuit.ipp.data.PaymentTypeEnum; -import com.intuit.ipp.data.PerItemAdjustEnum; -import com.intuit.ipp.data.PhysicalAddressTypeEnum; -import com.intuit.ipp.data.PostingTypeEnum; -import com.intuit.ipp.data.PriceLevelTypeEnum; -import com.intuit.ipp.data.PrintStatusEnum; -import com.intuit.ipp.data.PurchaseOrderStatusEnum; -import com.intuit.ipp.data.QboEntityTypeEnum; -import com.intuit.ipp.data.QboEstimateStatusEnum; -import com.intuit.ipp.data.RecurringTransaction; -import com.intuit.ipp.data.ReimbursableTypeEnum; -import com.intuit.ipp.data.ReportBasisEnum; -//import com.intuit.ipp.data.ReportNameEnum; -import com.intuit.ipp.data.RoundingMethodEnum; -import com.intuit.ipp.data.RowTypeEnum; -import com.intuit.ipp.data.SalesRepTypeEnum; -import com.intuit.ipp.data.SalesTermTypeEnum; -import com.intuit.ipp.data.ServiceTypeEnum; -import com.intuit.ipp.data.SpecialItemTypeEnum; -import com.intuit.ipp.data.SpecialTaxTypeEnum; -import com.intuit.ipp.data.SubcontractorTypeEnum; -import com.intuit.ipp.data.SummarizeColumnsByEnum; -import com.intuit.ipp.data.SymbolPositionEnum; -import com.intuit.ipp.data.TaxApplicableOnEnum; -import com.intuit.ipp.data.TaxFormTypeEnum; -import com.intuit.ipp.data.TaxRateApplicableOnEnum; -import com.intuit.ipp.data.TaxRateDisplayTypeEnum; -import com.intuit.ipp.data.TaxReportBasisTypeEnum; -import com.intuit.ipp.data.TaxReturnStatusEnum; -import com.intuit.ipp.data.TaxReviewStatusEnum; -import com.intuit.ipp.data.TaxService; -import com.intuit.ipp.data.TaxTypeApplicablityEnum; -import com.intuit.ipp.data.TelephoneDeviceTypeEnum; -import com.intuit.ipp.data.TelephoneNumberTypeEnum; -import com.intuit.ipp.data.TemplateTypeEnum; -import com.intuit.ipp.data.TimeActivityTypeEnum; -import com.intuit.ipp.data.TimeEntryUsedForPaychecksEnum; -import com.intuit.ipp.data.TransactionLocationTypeEnum; -import com.intuit.ipp.data.TxnSourceEnum; -import com.intuit.ipp.data.TxnTypeEnum; -import com.intuit.ipp.data.UOMBaseTypeEnum; -import com.intuit.ipp.data.UOMFeatureTypeEnum; -import com.intuit.ipp.data.WeekEnum; +import com.intuit.ipp.data.*; import com.intuit.ipp.exception.SerializationException; -import com.intuit.ipp.serialization.custom.APCreditCardOperationEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.AccountClassificationEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.AccountSubTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.AccountTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.AcquiredAsEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.AgencyPaymentMethodEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.AttachableCategoryEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.BillPaymentTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.BillableStatusEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.BudgetEntryTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.BudgetTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.CCAVSMatchEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.CCPaymentStatusEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.CCSecurityCodeMatchEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.CCTxnModeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.CCTxnTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.CISRateEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.ColTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.ContactTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.ConvenienceFeeTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.CreditCardTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.CustomFieldTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.CustomerTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.DayOfWeekEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.DeliveryErrorTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.DeliveryTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.DesktopEntityTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.DiscountTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.ETransactionEnabledStatusEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.ETransactionStatusEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.EmailAddressTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.EmailStatusEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.EmployeeTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.EntityStatusEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.EntityTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.EstimateStatusEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.FaultTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.GenderEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.GlobalTaxCalculationEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.IdDomainEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.ItemCategoryTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.ItemTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.JobStatusEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.JournalCodeTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.LineDetailTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.MonthEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.OLBTxnStatusEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.ObjectNameEnumTypeJsonSerializer; -import com.intuit.ipp.serialization.custom.OperationEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.PaySalesTaxEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.PaymentMethodEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.PaymentStatusEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.PaymentTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.PerItemAdjustEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.PhysicalAddressTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.PostingTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.PriceLevelTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.PrintStatusEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.PurchaseOrderStatusEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.QboEntityTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.QboEstimateStatusEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.ReimbursableTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.ReportBasisEnumJsonSerializer; -//import com.intuit.ipp.serialization.custom.ReportNameEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.RoundingMethodEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.RowTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.SalesRepTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.SalesTermTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.ServiceTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.SpecialItemTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.SpecialTaxTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.SubcontractorTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.SummarizeColumnsByEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.SymbolPositionEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.TaxApplicableOnEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.TaxFormTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.TaxRateApplicableOnEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.TaxRateDisplayTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.TaxReportBasisTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.TaxReturnStatusEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.TaxReviewStatusEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.TaxTypeApplicablityEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.TelephoneDeviceTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.TelephoneNumberTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.TemplateTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.TimeActivityTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.TimeEntryUsedForPaychecksEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.TransactionLocationTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.TxnSourceEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.TxnTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.UOMBaseTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.UOMFeatureTypeEnumJsonSerializer; -import com.intuit.ipp.serialization.custom.WeekEnumJsonSerializer; +import com.intuit.ipp.serialization.custom.*; import com.intuit.ipp.util.Logger; +import jakarta.xml.bind.JAXBElement; +import java.lang.Class; /** * class to serialize/deserialize the given data using JSON serialization algorithm - * */ public class JSONSerializer implements IEntitySerializer { - /** - * the logger instance - */ - private static final org.slf4j.Logger LOG = Logger.getLogger(); - - /** - * {@inheritDoc} - */ - @SuppressWarnings("unchecked") - public String serialize(T object) throws SerializationException { - - if (object == null) { - return null; - } - - ObjectMapper mapper = new ObjectMapper(); - AnnotationIntrospector primary = new JacksonAnnotationIntrospector(); - AnnotationIntrospector secondary = new JakartaXmlBindAnnotationIntrospector(mapper.getTypeFactory()); - AnnotationIntrospector pair = new AnnotationIntrospectorPair(primary, secondary); - - mapper.setAnnotationIntrospector(pair); - mapper.setSerializationInclusion(Include.NON_NULL); - - registerModulesForEnum(mapper); - - SimpleModule testModule = new SimpleModule("BatchItemRequest", new Version(1, 0, 0, null)); - testModule.addSerializer(BatchItemRequest.class, new BatchItemRequestSerializer()); - mapper.registerModule(testModule); - - testModule = new SimpleModule("RecurringTransaction", new Version(1, 0, 0, null)); - testModule.addSerializer(RecurringTransaction.class, new RecurringTransactionSerializer()); - mapper.registerModule(testModule); - - String json = null; - try { - if(object instanceof TaxService) - { - json = mapper.writeValueAsString(((TaxService) object)); - } - else - { - json = mapper.writeValueAsString(((JAXBElement) object).getValue()); - } - } catch (Exception e) { - LOG.error("Exception while json serialize", e); - throw new SerializationException(e); - } - return json; - } - - /** - * {@inheritDoc} - */ - public Response deserialize(String json, Class cl) throws SerializationException { - - Response intuitResponse = null; - ObjectMapper mapper = new ObjectMapper(); - - SimpleModule simpleModule = new SimpleModule("IntuitResponseDeserializer", new Version(1, 0, 0, null)); - simpleModule.addDeserializer(IntuitResponse.class, new IntuitResponseDeserializer()); - mapper.registerModule(simpleModule); - - simpleModule = new SimpleModule("TaxServiceDeserializer", new Version(1, 0, 0, null)); - simpleModule.addDeserializer(TaxService.class, new TaxServiceDeserializer()); - mapper.registerModule(simpleModule); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - - - - try { - if(cl.getName().equalsIgnoreCase("com.intuit.ipp.data.TaxService")) - { - intuitResponse = (Response) mapper.readValue(json, TaxService.class); - } - else - { - intuitResponse = mapper.readValue(json, IntuitResponse.class); - } - } catch (Exception e) { - LOG.error("Exception while json deserialize", e); - throw new SerializationException(e); - } - return intuitResponse; - } - - /** - * Method to add custom Json serializers for all Enum classes - * - * @param objectMapper the Jackson object mapper - */ - private void registerModulesForEnum(ObjectMapper objectMapper) { - SimpleModule module = new SimpleModule("AccountClassificationEnum", new Version(1, 0, 0, null)); - module.addSerializer(AccountClassificationEnum.class, new AccountClassificationEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("AccountSubTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(AccountSubTypeEnum.class, new AccountSubTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("AccountTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(AccountTypeEnum.class, new AccountTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("AcquiredAsEnum", new Version(1, 0, 0, null)); - module.addSerializer(AcquiredAsEnum.class, new AcquiredAsEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("AgencyPaymentMethodEnum", new Version(1, 0, 0, null)); - module.addSerializer(AgencyPaymentMethodEnum.class, new AgencyPaymentMethodEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("APCreditCardOperationEnum", new Version(1, 0, 0, null)); - module.addSerializer(APCreditCardOperationEnum.class, new APCreditCardOperationEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("AttachableCategoryEnum", new Version(1, 0, 0, null)); - module.addSerializer(AttachableCategoryEnum.class, new AttachableCategoryEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("BillableStatusEnum", new Version(1, 0, 0, null)); - module.addSerializer(BillableStatusEnum.class, new BillableStatusEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("BillPaymentTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(BillPaymentTypeEnum.class, new BillPaymentTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("BudgetEntryTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(BudgetEntryTypeEnum.class, new BudgetEntryTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("BudgetTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(BudgetTypeEnum.class, new BudgetTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("CCAVSMatchEnum", new Version(1, 0, 0, null)); - module.addSerializer(CCAVSMatchEnum.class, new CCAVSMatchEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("CCPaymentStatusEnum", new Version(1, 0, 0, null)); - module.addSerializer(CCPaymentStatusEnum.class, new CCPaymentStatusEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("CCSecurityCodeMatchEnum", new Version(1, 0, 0, null)); - module.addSerializer(CCSecurityCodeMatchEnum.class, new CCSecurityCodeMatchEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("CCTxnModeEnum", new Version(1, 0, 0, null)); - module.addSerializer(CCTxnModeEnum.class, new CCTxnModeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("CCTxnTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(CCTxnTypeEnum.class, new CCTxnTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("CISRateEnum", new Version(1, 0, 0, null)); - module.addSerializer(CISRateEnum.class, new CISRateEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("ColumnTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(ColumnTypeEnum.class, new ColTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("ContactTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(ContactTypeEnum.class, new ContactTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("ConvenienceFeeTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(ConvenienceFeeTypeEnum.class, new ConvenienceFeeTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("CreditCardTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(CreditCardTypeEnum.class, new CreditCardTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("CustomerTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(CustomerTypeEnum.class, new CustomerTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("CustomFieldTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(CustomFieldTypeEnum.class, new CustomFieldTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("DayOfWeekEnum", new Version(1, 0, 0, null)); - module.addSerializer(DayOfWeekEnum.class, new DayOfWeekEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("DeliveryErrorTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(DeliveryErrorTypeEnum.class, new DeliveryErrorTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("DeliveryTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(DeliveryTypeEnum.class, new DeliveryTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("DesktopEntityTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(DesktopEntityTypeEnum.class, new DesktopEntityTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("DiscountTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(DiscountTypeEnum.class, new DiscountTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("EmailAddressTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(EmailAddressTypeEnum.class, new EmailAddressTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("EmailStatusEnum", new Version(1, 0, 0, null)); - module.addSerializer(EmailStatusEnum.class, new EmailStatusEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("EmployeeTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(EmployeeTypeEnum.class, new EmployeeTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("EntityStatusEnum", new Version(1, 0, 0, null)); - module.addSerializer(EntityStatusEnum.class, new EntityStatusEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("EntityTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(EntityTypeEnum.class, new EntityTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("EstimateStatusEnum", new Version(1, 0, 0, null)); - module.addSerializer(EstimateStatusEnum.class, new EstimateStatusEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("ETransactionEnabledStatusEnum", new Version(1, 0, 0, null)); - module.addSerializer(ETransactionEnabledStatusEnum.class, new ETransactionEnabledStatusEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("ETransactionStatusEnum", new Version(1, 0, 0, null)); - module.addSerializer(ETransactionStatusEnum.class, new ETransactionStatusEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("FaultTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(FaultTypeEnum.class, new FaultTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("GenderEnum", new Version(1, 0, 0, null)); - module.addSerializer(Gender.class, new GenderEnumJsonSerializer()); - objectMapper.registerModule(module); - module = new SimpleModule("GlobalTaxCalculationEnum", new Version(1, 0, 0, null)); - module.addSerializer(GlobalTaxCalculationEnum.class, new GlobalTaxCalculationEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("IdDomainEnum", new Version(1, 0, 0, null)); - module.addSerializer(IdDomainEnum.class, new IdDomainEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("ItemCategoryTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(ItemCategoryTypeEnum.class, new ItemCategoryTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("ItemTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(ItemTypeEnum.class, new ItemTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("JobStatusEnum", new Version(1, 0, 0, null)); - module.addSerializer(JobStatusEnum.class, new JobStatusEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("JournalCodeTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(JournalCodeTypeEnum.class, new JournalCodeTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("LineDetailTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(LineDetailTypeEnum.class, new LineDetailTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("MonthEnum", new Version(1, 0, 0, null)); - module.addSerializer(MonthEnum.class, new MonthEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("objectNameEnumType", new Version(1, 0, 0, null)); - module.addSerializer(ObjectNameEnumType.class, new ObjectNameEnumTypeJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("OLBTxnStatusEnum", new Version(1, 0, 0, null)); - module.addSerializer(OLBTxnStatusEnum.class, new OLBTxnStatusEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("OperationEnum", new Version(1, 0, 0, null)); - module.addSerializer(OperationEnum.class, new OperationEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("PaymentMethodEnum", new Version(1, 0, 0, null)); - module.addSerializer(PaymentMethodEnum.class, new PaymentMethodEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("PaymentStatusEnum", new Version(1, 0, 0, null)); - module.addSerializer(PaymentStatusEnum.class, new PaymentStatusEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("PaymentTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(PaymentTypeEnum.class, new PaymentTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("PaySalesTaxEnum", new Version(1, 0, 0, null)); - module.addSerializer(PaySalesTaxEnum.class, new PaySalesTaxEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("PerItemAdjustEnum", new Version(1, 0, 0, null)); - module.addSerializer(PerItemAdjustEnum.class, new PerItemAdjustEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("PhysicalAddressTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(PhysicalAddressTypeEnum.class, new PhysicalAddressTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("PostingTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(PostingTypeEnum.class, new PostingTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("PriceLevelTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(PriceLevelTypeEnum.class, new PriceLevelTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("PrintStatusEnum", new Version(1, 0, 0, null)); - module.addSerializer(PrintStatusEnum.class, new PrintStatusEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("PurchaseOrderStatusEnum", new Version(1, 0, 0, null)); - module.addSerializer(PurchaseOrderStatusEnum.class, new PurchaseOrderStatusEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("QboEntityTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(QboEntityTypeEnum.class, new QboEntityTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("QboEstimateStatusEnum", new Version(1, 0, 0, null)); - module.addSerializer(QboEstimateStatusEnum.class, new QboEstimateStatusEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("ReimbursableTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(ReimbursableTypeEnum.class, new ReimbursableTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("ReportBasisEnum", new Version(1, 0, 0, null)); - module.addSerializer(ReportBasisEnum.class, new ReportBasisEnumJsonSerializer()); - objectMapper.registerModule(module); + /** + * the logger instance + */ + private static final org.slf4j.Logger LOG = Logger.getLogger(); + private static final ObjectMapper serializeMapper = getSerializeMapper(); + private static final ObjectMapper deserializeMapper = getDeserializeMapper(); + + /** + * {@inheritDoc} + */ + @SuppressWarnings("unchecked") + public String serialize(T object) throws SerializationException { + + if (object == null) { + return null; + } + String json = null; + try { + if (object instanceof TaxService) { + json = serializeMapper.writeValueAsString(((TaxService) object)); + } else { + json = serializeMapper.writeValueAsString(((JAXBElement) object).getValue()); + } + } catch (Exception e) { + LOG.error("Exception while json serialize", e); + throw new SerializationException(e); + } + return json; + } + + /** + * {@inheritDoc} + */ + public Response deserialize(String json, Class cl) throws SerializationException { + Response intuitResponse = null; + try { + if (cl.getName().equalsIgnoreCase("com.intuit.ipp.data.TaxService")) { + intuitResponse = (Response) deserializeMapper.readValue(json, TaxService.class); + } else { + intuitResponse = deserializeMapper.readValue(json, IntuitResponse.class); + } + } catch (Exception e) { + LOG.error("Exception while json deserialize", e); + throw new SerializationException(e); + } + return intuitResponse; + } + + /** + * Deserialize mapper for {@link #deserialize(String, Class)}} + * + * @return ObjectMapper + */ + private static ObjectMapper getDeserializeMapper() { + ObjectMapper mapper = new ObjectMapper(); + SimpleModule simpleModule = new SimpleModule("IntuitResponseDeserializer", new Version(1, 0, 0, null)); + simpleModule.addDeserializer(IntuitResponse.class, new IntuitResponseDeserializer()); + mapper.registerModule(simpleModule); + simpleModule = new SimpleModule("TaxServiceDeserializer", new Version(1, 0, 0, null)); + simpleModule.addDeserializer(TaxService.class, new TaxServiceDeserializer()); + mapper.registerModule(simpleModule); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + return mapper; + } + + /** + * Serialize mapper for {@link #serialize(Object)}} + * + * @return ObjectMapper + */ + private static ObjectMapper getSerializeMapper() { + ObjectMapper objectMapper = new ObjectMapper(); + AnnotationIntrospector primary = new JacksonAnnotationIntrospector(); + AnnotationIntrospector secondary = new JakartaXmlBindAnnotationIntrospector(objectMapper.getTypeFactory()); + AnnotationIntrospector pair = new AnnotationIntrospectorPair(primary, secondary); + + objectMapper.setAnnotationIntrospector(pair); + objectMapper.setSerializationInclusion(Include.NON_NULL); + + SimpleModule module = new SimpleModule("AccountClassificationEnum", new Version(1, 0, 0, null)); + module.addSerializer(AccountClassificationEnum.class, new AccountClassificationEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("AccountSubTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(AccountSubTypeEnum.class, new AccountSubTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("AccountTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(AccountTypeEnum.class, new AccountTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("AcquiredAsEnum", new Version(1, 0, 0, null)); + module.addSerializer(AcquiredAsEnum.class, new AcquiredAsEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("AgencyPaymentMethodEnum", new Version(1, 0, 0, null)); + module.addSerializer(AgencyPaymentMethodEnum.class, new AgencyPaymentMethodEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("APCreditCardOperationEnum", new Version(1, 0, 0, null)); + module.addSerializer(APCreditCardOperationEnum.class, new APCreditCardOperationEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("AttachableCategoryEnum", new Version(1, 0, 0, null)); + module.addSerializer(AttachableCategoryEnum.class, new AttachableCategoryEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("BillableStatusEnum", new Version(1, 0, 0, null)); + module.addSerializer(BillableStatusEnum.class, new BillableStatusEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("BillPaymentTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(BillPaymentTypeEnum.class, new BillPaymentTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("BudgetEntryTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(BudgetEntryTypeEnum.class, new BudgetEntryTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("BudgetTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(BudgetTypeEnum.class, new BudgetTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("CCAVSMatchEnum", new Version(1, 0, 0, null)); + module.addSerializer(CCAVSMatchEnum.class, new CCAVSMatchEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("CCPaymentStatusEnum", new Version(1, 0, 0, null)); + module.addSerializer(CCPaymentStatusEnum.class, new CCPaymentStatusEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("CCSecurityCodeMatchEnum", new Version(1, 0, 0, null)); + module.addSerializer(CCSecurityCodeMatchEnum.class, new CCSecurityCodeMatchEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("CCTxnModeEnum", new Version(1, 0, 0, null)); + module.addSerializer(CCTxnModeEnum.class, new CCTxnModeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("CCTxnTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(CCTxnTypeEnum.class, new CCTxnTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("CISRateEnum", new Version(1, 0, 0, null)); + module.addSerializer(CISRateEnum.class, new CISRateEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("ColumnTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(ColumnTypeEnum.class, new ColTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("ContactTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(ContactTypeEnum.class, new ContactTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("ConvenienceFeeTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(ConvenienceFeeTypeEnum.class, new ConvenienceFeeTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("CreditCardTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(CreditCardTypeEnum.class, new CreditCardTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("CustomerTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(CustomerTypeEnum.class, new CustomerTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("CustomFieldTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(CustomFieldTypeEnum.class, new CustomFieldTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("DayOfWeekEnum", new Version(1, 0, 0, null)); + module.addSerializer(DayOfWeekEnum.class, new DayOfWeekEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("DeliveryErrorTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(DeliveryErrorTypeEnum.class, new DeliveryErrorTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("DeliveryTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(DeliveryTypeEnum.class, new DeliveryTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("DesktopEntityTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(DesktopEntityTypeEnum.class, new DesktopEntityTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("DiscountTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(DiscountTypeEnum.class, new DiscountTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("EmailAddressTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(EmailAddressTypeEnum.class, new EmailAddressTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("EmailStatusEnum", new Version(1, 0, 0, null)); + module.addSerializer(EmailStatusEnum.class, new EmailStatusEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("EmployeeTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(EmployeeTypeEnum.class, new EmployeeTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("EntityStatusEnum", new Version(1, 0, 0, null)); + module.addSerializer(EntityStatusEnum.class, new EntityStatusEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("EntityTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(EntityTypeEnum.class, new EntityTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("EstimateStatusEnum", new Version(1, 0, 0, null)); + module.addSerializer(EstimateStatusEnum.class, new EstimateStatusEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("ETransactionEnabledStatusEnum", new Version(1, 0, 0, null)); + module.addSerializer(ETransactionEnabledStatusEnum.class, new ETransactionEnabledStatusEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("ETransactionStatusEnum", new Version(1, 0, 0, null)); + module.addSerializer(ETransactionStatusEnum.class, new ETransactionStatusEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("FaultTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(FaultTypeEnum.class, new FaultTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("GenderEnum", new Version(1, 0, 0, null)); + module.addSerializer(Gender.class, new GenderEnumJsonSerializer()); + objectMapper.registerModule(module); + module = new SimpleModule("GlobalTaxCalculationEnum", new Version(1, 0, 0, null)); + module.addSerializer(GlobalTaxCalculationEnum.class, new GlobalTaxCalculationEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("IdDomainEnum", new Version(1, 0, 0, null)); + module.addSerializer(IdDomainEnum.class, new IdDomainEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("ItemCategoryTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(ItemCategoryTypeEnum.class, new ItemCategoryTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("ItemTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(ItemTypeEnum.class, new ItemTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("JobStatusEnum", new Version(1, 0, 0, null)); + module.addSerializer(JobStatusEnum.class, new JobStatusEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("JournalCodeTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(JournalCodeTypeEnum.class, new JournalCodeTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("LineDetailTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(LineDetailTypeEnum.class, new LineDetailTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("MonthEnum", new Version(1, 0, 0, null)); + module.addSerializer(MonthEnum.class, new MonthEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("objectNameEnumType", new Version(1, 0, 0, null)); + module.addSerializer(ObjectNameEnumType.class, new ObjectNameEnumTypeJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("OLBTxnStatusEnum", new Version(1, 0, 0, null)); + module.addSerializer(OLBTxnStatusEnum.class, new OLBTxnStatusEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("OperationEnum", new Version(1, 0, 0, null)); + module.addSerializer(OperationEnum.class, new OperationEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("PaymentMethodEnum", new Version(1, 0, 0, null)); + module.addSerializer(PaymentMethodEnum.class, new PaymentMethodEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("PaymentStatusEnum", new Version(1, 0, 0, null)); + module.addSerializer(PaymentStatusEnum.class, new PaymentStatusEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("PaymentTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(PaymentTypeEnum.class, new PaymentTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("PaySalesTaxEnum", new Version(1, 0, 0, null)); + module.addSerializer(PaySalesTaxEnum.class, new PaySalesTaxEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("PerItemAdjustEnum", new Version(1, 0, 0, null)); + module.addSerializer(PerItemAdjustEnum.class, new PerItemAdjustEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("PhysicalAddressTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(PhysicalAddressTypeEnum.class, new PhysicalAddressTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("PostingTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(PostingTypeEnum.class, new PostingTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("PriceLevelTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(PriceLevelTypeEnum.class, new PriceLevelTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("PrintStatusEnum", new Version(1, 0, 0, null)); + module.addSerializer(PrintStatusEnum.class, new PrintStatusEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("PurchaseOrderStatusEnum", new Version(1, 0, 0, null)); + module.addSerializer(PurchaseOrderStatusEnum.class, new PurchaseOrderStatusEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("QboEntityTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(QboEntityTypeEnum.class, new QboEntityTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("QboEstimateStatusEnum", new Version(1, 0, 0, null)); + module.addSerializer(QboEstimateStatusEnum.class, new QboEstimateStatusEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("ReimbursableTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(ReimbursableTypeEnum.class, new ReimbursableTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("ReportBasisEnum", new Version(1, 0, 0, null)); + module.addSerializer(ReportBasisEnum.class, new ReportBasisEnumJsonSerializer()); + objectMapper.registerModule(module); // module = new SimpleModule("ReportNameEnum", new Version(1, 0, 0, null)); // module.addSerializer(ReportNameEnum.class, new ReportNameEnumJsonSerializer()); // objectMapper.registerModule(module); - module = new SimpleModule("RoundingMethodEnum", new Version(1, 0, 0, null)); - module.addSerializer(RoundingMethodEnum.class, new RoundingMethodEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("RowTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(RowTypeEnum.class, new RowTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("SalesRepTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(SalesRepTypeEnum.class, new SalesRepTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("SalesTermTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(SalesTermTypeEnum.class, new SalesTermTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("ServiceTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(ServiceTypeEnum.class, new ServiceTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("SpecialItemTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(SpecialItemTypeEnum.class, new SpecialItemTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("SpecialTaxTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(SpecialTaxTypeEnum.class, new SpecialTaxTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("SubcontractorTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(SubcontractorTypeEnum.class, new SubcontractorTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("SummarizeColumnsByEnum", new Version(1, 0, 0, null)); - module.addSerializer(SummarizeColumnsByEnum.class, new SummarizeColumnsByEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("SymbolPositionEnum", new Version(1, 0, 0, null)); - module.addSerializer(SymbolPositionEnum.class, new SymbolPositionEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("TaxApplicableOnEnum", new Version(1, 0, 0, null)); - module.addSerializer(TaxApplicableOnEnum.class, new TaxApplicableOnEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("TaxFormTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(TaxFormTypeEnum.class, new TaxFormTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("TaxRateApplicableOnEnum", new Version(1, 0, 0, null)); - module.addSerializer(TaxRateApplicableOnEnum.class, new TaxRateApplicableOnEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("TaxRateDisplayTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(TaxRateDisplayTypeEnum.class, new TaxRateDisplayTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("TaxReportBasisTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(TaxReportBasisTypeEnum.class, new TaxReportBasisTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("TaxReturnStatusEnum", new Version(1, 0, 0, null)); - module.addSerializer(TaxReturnStatusEnum.class, new TaxReturnStatusEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("TaxReviewStatusEnum", new Version(1, 0, 0, null)); - module.addSerializer(TaxReviewStatusEnum.class, new TaxReviewStatusEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("TaxTypeApplicablityEnum", new Version(1, 0, 0, null)); - module.addSerializer(TaxTypeApplicablityEnum.class, new TaxTypeApplicablityEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("TelephoneDeviceTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(TelephoneDeviceTypeEnum.class, new TelephoneDeviceTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("TelephoneNumberTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(TelephoneNumberTypeEnum.class, new TelephoneNumberTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("TemplateTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(TemplateTypeEnum.class, new TemplateTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("TimeActivityTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(TimeActivityTypeEnum.class, new TimeActivityTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("TimeEntryUsedForPaychecksEnum", new Version(1, 0, 0, null)); - module.addSerializer(TimeEntryUsedForPaychecksEnum.class, new TimeEntryUsedForPaychecksEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("TransactionLocationTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(TransactionLocationTypeEnum.class, new TransactionLocationTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("TxnSourceEnum", new Version(1, 0, 0, null)); - module.addSerializer(TxnSourceEnum.class, new TxnSourceEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("TxnTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(TxnTypeEnum.class, new TxnTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("UOMBaseTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(UOMBaseTypeEnum.class, new UOMBaseTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("UOMFeatureTypeEnum", new Version(1, 0, 0, null)); - module.addSerializer(UOMFeatureTypeEnum.class, new UOMFeatureTypeEnumJsonSerializer()); - objectMapper.registerModule(module); - - module = new SimpleModule("WeekEnum", new Version(1, 0, 0, null)); - module.addSerializer(WeekEnum.class, new WeekEnumJsonSerializer()); - objectMapper.registerModule(module); - - } - - @Override - public Response deserializeEntitlements(String decompressedData, Class cl) - throws SerializationException { - // TODO Auto-generated method stub - return null; - } + module = new SimpleModule("RoundingMethodEnum", new Version(1, 0, 0, null)); + module.addSerializer(RoundingMethodEnum.class, new RoundingMethodEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("RowTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(RowTypeEnum.class, new RowTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("SalesRepTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(SalesRepTypeEnum.class, new SalesRepTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("SalesTermTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(SalesTermTypeEnum.class, new SalesTermTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("ServiceTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(ServiceTypeEnum.class, new ServiceTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("SpecialItemTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(SpecialItemTypeEnum.class, new SpecialItemTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("SpecialTaxTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(SpecialTaxTypeEnum.class, new SpecialTaxTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("SubcontractorTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(SubcontractorTypeEnum.class, new SubcontractorTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("SummarizeColumnsByEnum", new Version(1, 0, 0, null)); + module.addSerializer(SummarizeColumnsByEnum.class, new SummarizeColumnsByEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("SymbolPositionEnum", new Version(1, 0, 0, null)); + module.addSerializer(SymbolPositionEnum.class, new SymbolPositionEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("TaxApplicableOnEnum", new Version(1, 0, 0, null)); + module.addSerializer(TaxApplicableOnEnum.class, new TaxApplicableOnEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("TaxFormTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(TaxFormTypeEnum.class, new TaxFormTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("TaxRateApplicableOnEnum", new Version(1, 0, 0, null)); + module.addSerializer(TaxRateApplicableOnEnum.class, new TaxRateApplicableOnEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("TaxRateDisplayTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(TaxRateDisplayTypeEnum.class, new TaxRateDisplayTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("TaxReportBasisTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(TaxReportBasisTypeEnum.class, new TaxReportBasisTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("TaxReturnStatusEnum", new Version(1, 0, 0, null)); + module.addSerializer(TaxReturnStatusEnum.class, new TaxReturnStatusEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("TaxReviewStatusEnum", new Version(1, 0, 0, null)); + module.addSerializer(TaxReviewStatusEnum.class, new TaxReviewStatusEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("TaxTypeApplicablityEnum", new Version(1, 0, 0, null)); + module.addSerializer(TaxTypeApplicablityEnum.class, new TaxTypeApplicablityEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("TelephoneDeviceTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(TelephoneDeviceTypeEnum.class, new TelephoneDeviceTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("TelephoneNumberTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(TelephoneNumberTypeEnum.class, new TelephoneNumberTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("TemplateTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(TemplateTypeEnum.class, new TemplateTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("TimeActivityTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(TimeActivityTypeEnum.class, new TimeActivityTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("TimeEntryUsedForPaychecksEnum", new Version(1, 0, 0, null)); + module.addSerializer(TimeEntryUsedForPaychecksEnum.class, new TimeEntryUsedForPaychecksEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("TransactionLocationTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(TransactionLocationTypeEnum.class, new TransactionLocationTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("TxnSourceEnum", new Version(1, 0, 0, null)); + module.addSerializer(TxnSourceEnum.class, new TxnSourceEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("TxnTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(TxnTypeEnum.class, new TxnTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("UOMBaseTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(UOMBaseTypeEnum.class, new UOMBaseTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("UOMFeatureTypeEnum", new Version(1, 0, 0, null)); + module.addSerializer(UOMFeatureTypeEnum.class, new UOMFeatureTypeEnumJsonSerializer()); + objectMapper.registerModule(module); + + module = new SimpleModule("WeekEnum", new Version(1, 0, 0, null)); + module.addSerializer(WeekEnum.class, new WeekEnumJsonSerializer()); + objectMapper.registerModule(module); + + SimpleModule testModule = new SimpleModule("BatchItemRequest", new Version(1, 0, 0, null)); + testModule.addSerializer(BatchItemRequest.class, new BatchItemRequestSerializer()); + objectMapper.registerModule(testModule); + + testModule = new SimpleModule("RecurringTransaction", new Version(1, 0, 0, null)); + testModule.addSerializer(RecurringTransaction.class, new RecurringTransactionSerializer()); + objectMapper.registerModule(testModule); + return objectMapper; + } + + @Override + public Response deserializeEntitlements(String decompressedData, Class cl) + throws SerializationException { + // TODO Auto-generated method stub + return null; + } } \ No newline at end of file diff --git a/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/QueryResponseDeserializer.java b/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/QueryResponseDeserializer.java index e1345b58..6954c038 100755 --- a/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/QueryResponseDeserializer.java +++ b/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/QueryResponseDeserializer.java @@ -15,32 +15,21 @@ *******************************************************************************/ package com.intuit.ipp.serialization; -import java.io.IOException; -import java.util.Iterator; - -import jakarta.xml.bind.JAXBElement; - -import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.Version; -import com.fasterxml.jackson.databind.AnnotationIntrospector; -import com.fasterxml.jackson.databind.DeserializationConfig; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair; import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; import com.fasterxml.jackson.databind.module.SimpleModule; -//import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector; import com.fasterxml.jackson.module.jakarta.xmlbind.JakartaXmlBindAnnotationIntrospector; -import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair; -import com.fasterxml.jackson.databind.DeserializationFeature; - import com.intuit.ipp.data.*; import com.intuit.ipp.util.Logger; +import jakarta.xml.bind.JAXBElement; +import java.io.IOException; +import java.util.Iterator; /** * Custom deserializer class to handle QueryResponse while unmarshall - * */ public class QueryResponseDeserializer extends JsonDeserializer { @@ -50,162 +39,163 @@ public class QueryResponseDeserializer extends JsonDeserializer { private IntuitResponseDeserializerHelper intuitResponseDeserializerHelper = new IntuitResponseDeserializerHelper(); /** - * logger instance - */ - private static final org.slf4j.Logger LOG = Logger.getLogger(); - - /** - * variable FAULT - */ - private static final String FAULT = "Fault"; - - /** - * variable STARTPOSITION - */ - private static final String STARTPOSITION = "startPosition"; - - /** - * variable MAXRESULTS - */ - private static final String MAXRESULTS = "maxResults"; - - /** - * variable TOTALCOUNT - */ - private static final String TOTALCOUNT = "totalCount"; - - /** - * variable RECURRINGTXN - */ - private static final String RECURRINGTXN = "RecurringTransaction"; - - /** - * variable objFactory - */ - private ObjectFactory objFactory = new ObjectFactory(); - - @SuppressWarnings("deprecation") - @Override - public QueryResponse deserialize(JsonParser jp, DeserializationContext desContext) throws IOException { - ObjectMapper mapper = new ObjectMapper(); - - //Make the mapper JAXB annotations aware - AnnotationIntrospector primary = new JakartaXmlBindAnnotationIntrospector(); - AnnotationIntrospector secondary = new JacksonAnnotationIntrospector(); - AnnotationIntrospector pair = new AnnotationIntrospectorPair(primary, secondary); - mapper.setAnnotationIntrospector(pair); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - - //Read the QueryResponse as a tree - JsonNode jn = jp.readValueAsTree(); - - //Create the QueryResponse to be returned - QueryResponse qr = new QueryResponse(); - - //Iterate over the field names - Iterator ite = jn.fieldNames(); - - while (ite.hasNext()) { - String key = ite.next(); - - //Attributes - if (key.equals(FAULT)) { - qr.setFault(mapper.treeToValue(jn.get(FAULT), Fault.class)); - continue; - } else if (key.equals(STARTPOSITION)) { - qr.setStartPosition(jn.get(STARTPOSITION).intValue()); - } else if (key.equals(MAXRESULTS)) { - qr.setMaxResults(jn.get(MAXRESULTS).intValue()); - } else if (key.equals(TOTALCOUNT)) { - qr.setTotalCount(jn.get(TOTALCOUNT).intValue()); - } else if (key.equals(RECURRINGTXN)) { - if (JsonResourceTypeLocator.lookupType(key) != null) { - JsonNode jn1 = jn.get(key); - if (jn1.isArray()) { - Iterator iteJson = jn1.iterator(); - - // read the recurring transactions array - while (iteJson.hasNext()) { - - RecurringTransaction rt = new RecurringTransaction(); - JsonNode jn2 = iteJson.next(); - Iterator iteJson2 = jn2.iterator(); - - // read the underlying IntuitObject transaction - while (iteJson2.hasNext()) { - Iterator s = jn2.fieldNames(); - String rtKey = s.next(); - LOG.debug("RecurringTransaction : " + rtKey); - - JsonNode jn3 = iteJson2.next(); - - // set the CustomFieldDefinition deserializer - registerModulesForCustomFieldDef(mapper); - - //Force the data to be casted to its type - Object intuitType = mapper.treeToValue(jn3, JsonResourceTypeLocator.lookupType(rtKey)); - //Double check - if (intuitType instanceof IntuitEntity) { - intuitResponseDeserializerHelper.updateBigDecimalScale((IntuitEntity) intuitType); - JAXBElement intuitObject = objFactory.createIntuitObject((IntuitEntity) intuitType); - rt.setIntuitObject(intuitObject); - } - } - - // set the CustomFieldDefinition deserializer - registerModulesForCustomFieldDef(mapper); - - // set the query response object to be the recurring transaction - Object intuitType = rt; - //Double check - if (intuitType instanceof IntuitEntity) { - intuitResponseDeserializerHelper.updateBigDecimalScale((IntuitEntity) intuitType); - JAXBElement intuitObject = objFactory.createIntuitObject((IntuitEntity) intuitType); - qr.getIntuitObject().add(intuitObject); - } - } - } - } - } else { - // It has to be an IntuitEntity - //Check if the entity is in the resource locator - if (JsonResourceTypeLocator.lookupType(key) != null) { - - JsonNode jn1 = jn.get(key); - LOG.debug("Query response entity Key :" + key); - - if (jn1.isArray()) { - Iterator iteJson = jn1.iterator(); - while (iteJson.hasNext()) { - JsonNode jn2 = iteJson.next(); - // set the CustomFieldDefinition deserializer - registerModulesForCustomFieldDef(mapper); - //Force the data to be casted to its type - Object intuitType = mapper.treeToValue(jn2, JsonResourceTypeLocator.lookupType(key)); - //Double check - if (intuitType instanceof IntuitEntity) { + * logger instance + */ + private static final org.slf4j.Logger LOG = Logger.getLogger(); + + /** + * variable FAULT + */ + private static final String FAULT = "Fault"; + + /** + * variable STARTPOSITION + */ + private static final String STARTPOSITION = "startPosition"; + + /** + * variable MAXRESULTS + */ + private static final String MAXRESULTS = "maxResults"; + + /** + * variable TOTALCOUNT + */ + private static final String TOTALCOUNT = "totalCount"; + + /** + * variable RECURRINGTXN + */ + private static final String RECURRINGTXN = "RecurringTransaction"; + + /** + * variable objFactory + */ + private ObjectFactory objFactory = new ObjectFactory(); + private static final ObjectMapper deserializeMapper = getDeserializeMapper(); + private static final ObjectMapper customDeserializeMapper = getCustomDeserializeMapper(); + + @SuppressWarnings("deprecation") + @Override + public QueryResponse deserialize(JsonParser jp, DeserializationContext desContext) throws IOException { + //Read the QueryResponse as a tree + JsonNode jn = jp.readValueAsTree(); + + //Create the QueryResponse to be returned + QueryResponse qr = new QueryResponse(); + + //Iterate over the field names + Iterator ite = jn.fieldNames(); + + while (ite.hasNext()) { + String key = ite.next(); + + //Attributes + if (key.equals(FAULT)) { + qr.setFault(deserializeMapper.treeToValue(jn.get(FAULT), Fault.class)); + continue; + } else if (key.equals(STARTPOSITION)) { + qr.setStartPosition(jn.get(STARTPOSITION).intValue()); + } else if (key.equals(MAXRESULTS)) { + qr.setMaxResults(jn.get(MAXRESULTS).intValue()); + } else if (key.equals(TOTALCOUNT)) { + qr.setTotalCount(jn.get(TOTALCOUNT).intValue()); + } else if (key.equals(RECURRINGTXN)) { + if (JsonResourceTypeLocator.lookupType(key) != null) { + JsonNode jn1 = jn.get(key); + if (jn1.isArray()) { + Iterator iteJson = jn1.iterator(); + + // read the recurring transactions array + while (iteJson.hasNext()) { + + RecurringTransaction rt = new RecurringTransaction(); + JsonNode jn2 = iteJson.next(); + Iterator iteJson2 = jn2.iterator(); + + // read the underlying IntuitObject transaction + while (iteJson2.hasNext()) { + Iterator s = jn2.fieldNames(); + String rtKey = s.next(); + LOG.debug("RecurringTransaction : " + rtKey); + JsonNode jn3 = iteJson2.next(); + //Force the data to be casted to its type + Object intuitType = customDeserializeMapper.treeToValue(jn3, JsonResourceTypeLocator.lookupType(rtKey)); + //Double check + if (intuitType instanceof IntuitEntity) { + intuitResponseDeserializerHelper.updateBigDecimalScale((IntuitEntity) intuitType); + JAXBElement intuitObject = objFactory.createIntuitObject((IntuitEntity) intuitType); + rt.setIntuitObject(intuitObject); + } + } + + // set the query response object to be the recurring transaction + Object intuitType = rt; + //Double check + if (intuitType instanceof IntuitEntity) { + intuitResponseDeserializerHelper.updateBigDecimalScale((IntuitEntity) intuitType); + JAXBElement intuitObject = objFactory.createIntuitObject((IntuitEntity) intuitType); + qr.getIntuitObject().add(intuitObject); + } + } + } + } + } else { + // It has to be an IntuitEntity + //Check if the entity is in the resource locator + if (JsonResourceTypeLocator.lookupType(key) != null) { + + JsonNode jn1 = jn.get(key); + LOG.debug("Query response entity Key :" + key); + + if (jn1.isArray()) { + Iterator iteJson = jn1.iterator(); + while (iteJson.hasNext()) { + JsonNode jn2 = iteJson.next(); + //Force the data to be casted to its type + Object intuitType = customDeserializeMapper.treeToValue(jn2, JsonResourceTypeLocator.lookupType(key)); + //Double check + if (intuitType instanceof IntuitEntity) { intuitResponseDeserializerHelper.updateBigDecimalScale((IntuitEntity) intuitType); - JAXBElement intuitObject = objFactory - .createIntuitObject((IntuitEntity) intuitType); - qr.getIntuitObject().add(intuitObject); - } - } - } - } - } - } - - return qr; - } - - /** - * Method to add custom deserializer for CustomFieldDefinition - * - * @param objectMapper the Jackson object mapper - */ - private void registerModulesForCustomFieldDef(ObjectMapper objectMapper) { - SimpleModule simpleModule = new SimpleModule("CustomFieldDefinition", new Version(1, 0, 0, null)); - simpleModule.addDeserializer(CustomFieldDefinition.class, new CustomFieldDefinitionDeserializer()); - objectMapper.registerModule(simpleModule); - } + JAXBElement intuitObject = objFactory + .createIntuitObject((IntuitEntity) intuitType); + qr.getIntuitObject().add(intuitObject); + } + } + } + } + } + } + + return qr; + } + + /** + * Deserialize mapper for {@link #deserialize(JsonParser, DeserializationContext)}} + * + * @return ObjectMapper + */ + private static ObjectMapper getDeserializeMapper() { + ObjectMapper mapper = new ObjectMapper(); + //Make the mapper JAXB annotations aware + AnnotationIntrospector primary = new JakartaXmlBindAnnotationIntrospector(mapper.getTypeFactory()); + AnnotationIntrospector secondary = new JacksonAnnotationIntrospector(); + AnnotationIntrospector pair = new AnnotationIntrospectorPair(primary, secondary); + mapper.setAnnotationIntrospector(pair); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + return mapper; + } + + /** + * CustomDeserialize mapper for {@link #deserialize(JsonParser, DeserializationContext)}} + * + * @return ObjectMapper + */ + private static ObjectMapper getCustomDeserializeMapper() { + ObjectMapper mapper = deserializeMapper.copy(); + SimpleModule simpleModule = new SimpleModule("CustomFieldDefinition", new Version(1, 0, 0, null)); + simpleModule.addDeserializer(CustomFieldDefinition.class, new CustomFieldDefinitionDeserializer()); + mapper.registerModule(simpleModule); + return mapper; + } } diff --git a/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/SyncErrorDeserializer.java b/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/SyncErrorDeserializer.java index 31455670..74313b84 100755 --- a/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/SyncErrorDeserializer.java +++ b/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/SyncErrorDeserializer.java @@ -15,120 +15,84 @@ *******************************************************************************/ package com.intuit.ipp.serialization; -import java.io.IOException; -import java.util.Iterator; - -import jakarta.xml.bind.JAXBElement; - -import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.Version; -import com.fasterxml.jackson.databind.AnnotationIntrospector; -import com.fasterxml.jackson.databind.DeserializationConfig; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair; import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; -import com.fasterxml.jackson.databind.module.SimpleModule; -//import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector; import com.fasterxml.jackson.module.jakarta.xmlbind.JakartaXmlBindAnnotationIntrospector; -import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair; -import com.fasterxml.jackson.databind.DeserializationFeature; - import com.intuit.ipp.data.Error; -import com.intuit.ipp.data.IntuitEntity; -import com.intuit.ipp.data.ObjectFactory; -import com.intuit.ipp.data.SyncError; -import com.intuit.ipp.data.SyncObject; +import com.intuit.ipp.data.*; import com.intuit.ipp.util.Logger; +import jakarta.xml.bind.JAXBElement; +import java.io.IOException; +import java.util.Iterator; public class SyncErrorDeserializer extends JsonDeserializer { - - ObjectMapper mapper = new ObjectMapper(); - - /** - * logger instance - */ - private static final org.slf4j.Logger LOG = Logger.getLogger(); - - - /** - * variable CLOUDVERSION - */ - private static final String CLOUDVERSION = "CloudVersion"; - - /** - * variable QBVERSION - */ - private static final String QBVERSION = "QBVersion"; - - /** - * variable ERROR - */ - private static final String ERROR = "Error"; - - - /** - * variable objFactory - */ - private ObjectFactory objFactory = new ObjectFactory(); - - @SuppressWarnings("deprecation") - @Override - public SyncError deserialize(JsonParser jp, DeserializationContext desContext) throws IOException { - - - //Make the mapper JAXB annotations aware - AnnotationIntrospector primary = new JakartaXmlBindAnnotationIntrospector(); - AnnotationIntrospector secondary = new JacksonAnnotationIntrospector(); - AnnotationIntrospector pair = new AnnotationIntrospectorPair(primary, secondary); - mapper.setAnnotationIntrospector(pair); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - - //Read the QueryResponse as a tree - JsonNode jn = jp.readValueAsTree(); - - //Create the SyncError to be returned - SyncError se = new SyncError(); - - //Iterate over the field names - Iterator ite = jn.fieldNames(); - - - - while (ite.hasNext()) { - String key = ite.next(); - if (key.equals(CLOUDVERSION)) { - se.setCloudVersion(getSyncObject(jn.get(key))); - } else if (key.equals(QBVERSION)) { - se.setQBVersion(getSyncObject(jn.get(key))); - } else if(key.equals(ERROR)) { - se.setError(mapper.treeToValue(jn.get(key),Error.class)); - } - } - - return se; - } - - - /** - * Method to Object Intuitobject - * - * @param JsonNode - */ - private SyncObject getSyncObject(JsonNode jsonNode) { - - String name = null; - JsonNode jn1 =null; - SyncObject syncObject = new SyncObject(); - - - Iterator ite = jsonNode.fieldNames(); - - while (ite.hasNext()) { - String key = ite.next(); + /** + * logger instance + */ + private static final org.slf4j.Logger LOG = Logger.getLogger(); + + + /** + * variable CLOUDVERSION + */ + private static final String CLOUDVERSION = "CloudVersion"; + + /** + * variable QBVERSION + */ + private static final String QBVERSION = "QBVersion"; + + /** + * variable ERROR + */ + private static final String ERROR = "Error"; + + + /** + * variable objFactory + */ + private ObjectFactory objFactory = new ObjectFactory(); + private static final ObjectMapper deserializeMapper = getDeserializeMapper(); + + @SuppressWarnings("deprecation") + @Override + public SyncError deserialize(JsonParser jp, DeserializationContext desContext) throws IOException { + //Read the QueryResponse as a tree + JsonNode jn = jp.readValueAsTree(); + //Create the SyncError to be returned + SyncError se = new SyncError(); + //Iterate over the field names + Iterator ite = jn.fieldNames(); + while (ite.hasNext()) { + String key = ite.next(); + if (key.equals(CLOUDVERSION)) { + se.setCloudVersion(getSyncObject(jn.get(key))); + } else if (key.equals(QBVERSION)) { + se.setQBVersion(getSyncObject(jn.get(key))); + } else if (key.equals(ERROR)) { + se.setError(deserializeMapper.treeToValue(jn.get(key), Error.class)); + } + } + + return se; + } + + + /** + * Method to Object Intuitobject + * + * @param jsonNode + */ + private SyncObject getSyncObject(JsonNode jsonNode) { + String name = null; + JsonNode jn1 = null; + SyncObject syncObject = new SyncObject(); + Iterator ite = jsonNode.fieldNames(); + while (ite.hasNext()) { + String key = ite.next(); if (JsonResourceTypeLocator.lookupType(key) != null) { jn1 = jsonNode.get(key); @@ -136,14 +100,14 @@ private SyncObject getSyncObject(JsonNode jsonNode) { try { //Force the data to be casted to its type - Object intuitType = mapper.treeToValue(jn1, JsonResourceTypeLocator.lookupType(key)); + Object intuitType = deserializeMapper.treeToValue(jn1, JsonResourceTypeLocator.lookupType(key)); //Double check if (intuitType instanceof IntuitEntity) { JAXBElement intuitObject = objFactory .createIntuitObject((IntuitEntity) intuitType); syncObject.setIntuitObject(intuitObject); } - } catch (JsonParseException e) { + } catch (JsonParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JsonMappingException e) { @@ -154,9 +118,24 @@ private SyncObject getSyncObject(JsonNode jsonNode) { e.printStackTrace(); } } - } - return syncObject; - } - + } + return syncObject; + } + + /** + * Deserialize mapper for {@link #deserialize(JsonParser, DeserializationContext)}} + * + * @return ObjectMapper + */ + private static ObjectMapper getDeserializeMapper() { + ObjectMapper mapper = new ObjectMapper(); + //Make the mapper JAXB annotations aware + AnnotationIntrospector primary = new JakartaXmlBindAnnotationIntrospector(mapper.getTypeFactory()); + AnnotationIntrospector secondary = new JacksonAnnotationIntrospector(); + AnnotationIntrospector pair = new AnnotationIntrospectorPair(primary, secondary); + mapper.setAnnotationIntrospector(pair); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + return mapper; + } } diff --git a/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/SyncErrorResponseDeserializer.java b/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/SyncErrorResponseDeserializer.java index 35d33b6a..82c9607a 100755 --- a/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/SyncErrorResponseDeserializer.java +++ b/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/serialization/SyncErrorResponseDeserializer.java @@ -15,143 +15,113 @@ *******************************************************************************/ package com.intuit.ipp.serialization; -import java.io.IOException; -import java.sql.Date; -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import jakarta.xml.bind.JAXBElement; - -import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.Version; -import com.fasterxml.jackson.databind.AnnotationIntrospector; -import com.fasterxml.jackson.databind.DeserializationConfig; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; import com.fasterxml.jackson.databind.module.SimpleModule; -//import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector; -import com.fasterxml.jackson.module.jakarta.xmlbind.JakartaXmlBindAnnotationIntrospector; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair; - -import com.intuit.ipp.data.CustomFieldDefinition; -import com.intuit.ipp.data.Fault; -import com.intuit.ipp.data.IntuitEntity; -import com.intuit.ipp.data.QueryResponse; import com.intuit.ipp.data.SyncError; import com.intuit.ipp.data.SyncErrorResponse; +import java.io.IOException; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; public class SyncErrorResponseDeserializer extends JsonDeserializer { - - - /** - * variable STARTPOSITION - */ - private static final String STARTPOSITION = "startPosition"; - - /** - * variable MAXRESULTS - */ - private static final String MAXRESULTS = "maxResults"; - - /** - * variable TOTALCOUNT - */ - private static final String TOTALCOUNT = "totalCount"; - - /** - * variable latestUploadTime - */ - private static final String LATESTUPLOADTIME = "latestUploadTime"; - - @SuppressWarnings("deprecation") - @Override - public SyncErrorResponse deserialize(JsonParser jp, DeserializationContext desContext) throws IOException { - ObjectMapper mapper = new ObjectMapper(); - - DateFormat date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); - - - //Make the mapper JAXB annotations aware - AnnotationIntrospector primary = new JakartaXmlBindAnnotationIntrospector(); - AnnotationIntrospector secondary = new JacksonAnnotationIntrospector(); - AnnotationIntrospector pair = new AnnotationIntrospectorPair(primary, secondary); - mapper.setAnnotationIntrospector(pair); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - - //Read the QueryResponse as a tree - JsonNode jn = jp.readValueAsTree(); - - //Create the SyncErrorResponse to be returned - SyncErrorResponse sr = new SyncErrorResponse(); - - //Iterate over the field names - Iterator ite = jn.fieldNames(); - - while (ite.hasNext()) { - String key = ite.next(); - - //Attributes - if (key.equals(STARTPOSITION)) { - sr.setStartPosition(jn.get(STARTPOSITION).intValue()); - } else if (key.equals(MAXRESULTS)) { - sr.setMaxResults(jn.get(MAXRESULTS).intValue()); - } else if (key.equals(TOTALCOUNT)) { - sr.setTotalCount(jn.get(TOTALCOUNT).intValue()); - } else if (key.equals(LATESTUPLOADTIME)) { - try { - sr.setLatestUploadTime(date.parse(jn.get(LATESTUPLOADTIME).textValue())); - } catch (ParseException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } else { - - //Check if the SyncError is in the resource locator - if (JsonResourceTypeLocator.lookupType(key) != null) { - - JsonNode jn1 = jn.get(key); - List syncErrorlist = new ArrayList(); - - - if (jn1.isArray()) { - Iterator iteJson = jn1.iterator(); - while (iteJson.hasNext()) { - JsonNode jn2 = iteJson.next(); - SyncError serror = getSyncError(jn2); - syncErrorlist.add(serror); - } - } - sr.setSyncError(syncErrorlist); - } - } - } - return sr; - } - - - /** - * Method to deserialize the SyncError object - * - * @param jsonNode - * @return QueryResponse - */ - private SyncError getSyncError(JsonNode jsonNode) throws IOException { - ObjectMapper mapper = new ObjectMapper(); - - SimpleModule simpleModule = new SimpleModule("SyncErrorDeserializer", new Version(1, 0, 0, null)); - simpleModule.addDeserializer(SyncError.class, new SyncErrorDeserializer()); - - mapper.registerModule(simpleModule); - - return mapper.treeToValue(jsonNode, SyncError.class); - } + + + /** + * variable STARTPOSITION + */ + private static final String STARTPOSITION = "startPosition"; + + /** + * variable MAXRESULTS + */ + private static final String MAXRESULTS = "maxResults"; + + /** + * variable TOTALCOUNT + */ + private static final String TOTALCOUNT = "totalCount"; + + /** + * variable latestUploadTime + */ + private static final String LATESTUPLOADTIME = "latestUploadTime"; + private static final ObjectMapper syncErrorMapper = getSyncErrorMapper(); + + @SuppressWarnings("deprecation") + @Override + public SyncErrorResponse deserialize(JsonParser jp, DeserializationContext desContext) throws IOException { + DateFormat date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); + + //Read the QueryResponse as a tree + JsonNode jn = jp.readValueAsTree(); + + //Create the SyncErrorResponse to be returned + SyncErrorResponse sr = new SyncErrorResponse(); + + //Iterate over the field names + Iterator ite = jn.fieldNames(); + + while (ite.hasNext()) { + String key = ite.next(); + + //Attributes + if (key.equals(STARTPOSITION)) { + sr.setStartPosition(jn.get(STARTPOSITION).intValue()); + } else if (key.equals(MAXRESULTS)) { + sr.setMaxResults(jn.get(MAXRESULTS).intValue()); + } else if (key.equals(TOTALCOUNT)) { + sr.setTotalCount(jn.get(TOTALCOUNT).intValue()); + } else if (key.equals(LATESTUPLOADTIME)) { + try { + sr.setLatestUploadTime(date.parse(jn.get(LATESTUPLOADTIME).textValue())); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } else { + + //Check if the SyncError is in the resource locator + if (JsonResourceTypeLocator.lookupType(key) != null) { + + JsonNode jn1 = jn.get(key); + List syncErrorlist = new ArrayList(); + + + if (jn1.isArray()) { + Iterator iteJson = jn1.iterator(); + while (iteJson.hasNext()) { + JsonNode jn2 = iteJson.next(); + SyncError serror = syncErrorMapper.treeToValue(jn2, SyncError.class); + syncErrorlist.add(serror); + } + } + sr.setSyncError(syncErrorlist); + } + } + } + return sr; + } + + /** + * SyncError mapper for {@link #deserialize(JsonParser, DeserializationContext)}} + * + * @return ObjectMapper + */ + private static ObjectMapper getSyncErrorMapper() { + ObjectMapper mapper = new ObjectMapper(); + SimpleModule simpleModule = new SimpleModule("SyncErrorDeserializer", new Version(1, 0, 0, null)); + simpleModule.addDeserializer(SyncError.class, new SyncErrorDeserializer()); + mapper.registerModule(simpleModule); + return mapper; + } } diff --git a/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/services/WebhooksService.java b/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/services/WebhooksService.java index 9df51b3f..36543b34 100755 --- a/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/services/WebhooksService.java +++ b/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/services/WebhooksService.java @@ -48,6 +48,7 @@ public class WebhooksService { * define algorithm */ private static final String ALGORITHM = "HmacSHA256"; + private static ObjectMapper mapper = new ObjectMapper(); public boolean verifyPayload(String intuitSignature, String payload) { try { @@ -74,7 +75,6 @@ public WebhooksEvent getWebhooksEvent(String payload) { return null; } try { - ObjectMapper mapper = new ObjectMapper(); return mapper.readValue(payload, WebhooksEvent.class); } catch (JsonParseException e) { LOG.error("Error while parsing payload", e);