diff --git a/commercetools/commercetools-sdk-java-api/src/main/java/com/commercetools/api/json/ApiModule.java b/commercetools/commercetools-sdk-java-api/src/main/java/com/commercetools/api/json/ApiModule.java index c50bbc5ca68..771b96451de 100644 --- a/commercetools/commercetools-sdk-java-api/src/main/java/com/commercetools/api/json/ApiModule.java +++ b/commercetools/commercetools-sdk-java-api/src/main/java/com/commercetools/api/json/ApiModule.java @@ -4,6 +4,7 @@ import java.util.Optional; import com.commercetools.api.models.product.AttributeImpl; +import com.commercetools.api.models.product_search.ProductSearchFacetResult; import com.commercetools.api.models.type.FieldContainerImpl; import com.fasterxml.jackson.databind.module.SimpleModule; @@ -35,6 +36,7 @@ public ApiModule(ModuleOptions options) { Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_CUSTOM_FIELD_NUMBER_AS_DOUBLE)) .orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_CUSTOM_FIELD_NUMBER_AS_DOUBLE))); + setMixInAnnotation(ProductSearchFacetResult.class, ProductSearchFacetResultMixin.class); if (attributeAsJsonNode) { setMixInAnnotation(AttributeImpl.class, AttributeJsonNodeMixin.class); } diff --git a/commercetools/commercetools-sdk-java-api/src/main/java/com/commercetools/api/json/ProductSearchFacetResultDeserializer.java b/commercetools/commercetools-sdk-java-api/src/main/java/com/commercetools/api/json/ProductSearchFacetResultDeserializer.java new file mode 100644 index 00000000000..933f5d51b3c --- /dev/null +++ b/commercetools/commercetools-sdk-java-api/src/main/java/com/commercetools/api/json/ProductSearchFacetResultDeserializer.java @@ -0,0 +1,55 @@ + +package com.commercetools.api.json; + +import java.io.IOException; +import java.util.List; + +import com.commercetools.api.models.product_search.*; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.JsonNodeType; + +public class ProductSearchFacetResultDeserializer extends JsonDeserializer { + + @Override + public ProductSearchFacetResult deserialize(JsonParser p, DeserializationContext ctx) throws IOException { + + JsonNode node = p.readValueAsTree(); + + if (node.has("buckets")) { + return ProductSearchFacetResultBucket.builder() + .name(node.get("name").asText()) + .buckets(p.getCodec() + .readValue(node.get("buckets").traverse(), + new TypeReference>() { + })) + .build(); + } + else if (node.has("value")) { + return ProductSearchFacetResultCount.builder() + .name(node.get("name").asText()) + .value(node.get("value").asLong()) + .build(); + } + return ProductSearchFacetResult.builder().name(node.get("name").asText()).build(); + } + + private TypeReference typeRef(JsonNode valueNode) { + JsonNodeType valueNodeType = valueNode.getNodeType(); + if (valueNodeType == JsonNodeType.OBJECT) { + if (valueNode.has("buckets")) { + return new TypeReference() { + }; + } + if (valueNode.has("value")) { + return new TypeReference() { + }; + } + } + return new TypeReference() { + }; + } +} diff --git a/commercetools/commercetools-sdk-java-api/src/main/java/com/commercetools/api/json/ProductSearchFacetResultMixin.java b/commercetools/commercetools-sdk-java-api/src/main/java/com/commercetools/api/json/ProductSearchFacetResultMixin.java new file mode 100644 index 00000000000..a3e700a969b --- /dev/null +++ b/commercetools/commercetools-sdk-java-api/src/main/java/com/commercetools/api/json/ProductSearchFacetResultMixin.java @@ -0,0 +1,8 @@ + +package com.commercetools.api.json; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + +@JsonDeserialize(using = ProductSearchFacetResultDeserializer.class) +public interface ProductSearchFacetResultMixin { +} diff --git a/commercetools/commercetools-sdk-java-api/src/test/java/com/commercetools/ProductTest.java b/commercetools/commercetools-sdk-java-api/src/test/java/com/commercetools/ProductTest.java index 963cc6c9fcc..308287448e7 100644 --- a/commercetools/commercetools-sdk-java-api/src/test/java/com/commercetools/ProductTest.java +++ b/commercetools/commercetools-sdk-java-api/src/test/java/com/commercetools/ProductTest.java @@ -9,6 +9,7 @@ import com.commercetools.api.models.common.LocalizedStringBuilder; import com.commercetools.api.models.product.*; +import com.commercetools.api.models.product_search.*; import com.commercetools.api.models.product_type.ProductTypeResourceIdentifierBuilder; import com.fasterxml.jackson.core.JsonProcessingException; @@ -53,6 +54,17 @@ public void serializeProduct() throws JsonProcessingException { .isEqualTo("{\"masterVariant\":{\"id\":1,\"sku\":\"foo\"},\"variants\":[{\"id\":2,\"sku\":\"bar\"}]}"); } + @Test + public void productSearchFacetDeserialize() { + ProductPagedSearchResponse result = JsonUtils.fromJsonString(stringFromResource("search-facet.json"), + ProductPagedSearchResponse.class); + + Assertions.assertThat(result).isNotNull(); + Assertions.assertThat(result.getFacets().get(0)).isExactlyInstanceOf(ProductSearchFacetResultImpl.class); + Assertions.assertThat(result.getFacets().get(1)).isExactlyInstanceOf(ProductSearchFacetResultBucketImpl.class); + Assertions.assertThat(result.getFacets().get(2)).isExactlyInstanceOf(ProductSearchFacetResultCountImpl.class); + } + @Test public void deepCopy() { Product product = JsonUtils.fromJsonString(stringFromResource("product.json"), Product.class); diff --git a/commercetools/commercetools-sdk-java-api/src/test/resources/search-facet.json b/commercetools/commercetools-sdk-java-api/src/test/resources/search-facet.json new file mode 100644 index 00000000000..3042118e208 --- /dev/null +++ b/commercetools/commercetools-sdk-java-api/src/test/resources/search-facet.json @@ -0,0 +1,28 @@ +{ + "facets": [ + { + "name": "variants.attributes.result" + }, + { + "name": "variants.attributes.bucket", + "buckets": [ + { + "key": "red", + "count": 33 + }, + { + "key": "blue", + "count": 165 + }, + { + "key": "green", + "count": 82 + } + ] + }, + { + "name": "variants.attributes.count", + "value": 123 + } + ] +}