|
1 | 1 |
|
2 | 2 | package com.commercetools.api.json; |
3 | 3 |
|
4 | | -import java.util.Map; |
5 | | -import java.util.Optional; |
| 4 | +import java.lang.reflect.InvocationTargetException; |
| 5 | +import java.util.Set; |
6 | 6 |
|
7 | | -import com.commercetools.api.models.product.AttributeImpl; |
8 | | -import com.commercetools.api.models.product_search.ProductSearchFacetResult; |
9 | | -import com.commercetools.api.models.subscription.DeliveryPayload; |
10 | | -import com.commercetools.api.models.subscription.DeliveryPayloadMixin; |
11 | | -import com.commercetools.api.models.type.FieldContainerImpl; |
12 | | -import com.fasterxml.jackson.core.type.TypeReference; |
| 7 | +import com.commercetools.api.RegisterSimpleModuleMixin; |
| 8 | +import com.commercetools.api.SimpleModuleMixin; |
13 | 9 | import com.fasterxml.jackson.databind.module.SimpleModule; |
14 | 10 |
|
15 | 11 | import io.vrap.rmf.base.client.utils.json.modules.ModuleOptions; |
16 | 12 |
|
| 13 | +import org.reflections.Reflections; |
| 14 | + |
17 | 15 | /** |
18 | 16 | * Module to configure the default jackson {@link com.fasterxml.jackson.databind.ObjectMapper} e.g. to deserialize attributes and custom fields |
19 | 17 | */ |
20 | 18 | public class ApiModule extends SimpleModule { |
21 | 19 | private static final long serialVersionUID = 0L; |
22 | 20 |
|
23 | 21 | public ApiModule(ModuleOptions options) { |
24 | | - boolean attributeAsDateString = Boolean.parseBoolean( |
25 | | - Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_DATE_ATTRIBUTE_AS_STRING)) |
26 | | - .orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_DATE_ATTRIBUTE_AS_STRING))); |
27 | | - boolean customFieldAsDateString = Boolean |
28 | | - .parseBoolean(Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_DATE_FIELD_AS_STRING)) |
29 | | - .orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_DATE_FIELD_AS_STRING))); |
30 | | - boolean attributeAsJsonNode = Boolean.parseBoolean( |
31 | | - Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_ATTRIBUTE_AS_JSON_NODE)) |
32 | | - .orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_ATTRIBUTE_AS_JSON_NODE))); |
33 | | - boolean customFieldAsJsonNode = Boolean.parseBoolean( |
34 | | - Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_CUSTOM_FIELD_AS_JSON_NODE)) |
35 | | - .orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_CUSTOM_FIELD_AS_JSON_NODE))); |
36 | | - boolean attributeNumberAsDouble = Boolean.parseBoolean( |
37 | | - Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_ATTRIBUTE_NUMBER_AS_DOUBLE)) |
38 | | - .orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_ATTRIBUTE_NUMBER_AS_DOUBLE))); |
39 | | - boolean customFieldNumberAsDouble = Boolean.parseBoolean( |
40 | | - Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_CUSTOM_FIELD_NUMBER_AS_DOUBLE)) |
41 | | - .orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_CUSTOM_FIELD_NUMBER_AS_DOUBLE))); |
| 22 | + Reflections reflections = new Reflections("com.commercetools"); |
| 23 | + Set<Class<?>> modules = reflections.getTypesAnnotatedWith(RegisterSimpleModuleMixin.class); |
42 | 24 |
|
43 | | - final Map<String, TypeReference<?>> attributeTypes; |
44 | | - final Map<String, TypeReference<?>> customFieldTypes; |
45 | | - if (options instanceof ApiModuleOptions) { |
46 | | - attributeTypes = ((ApiModuleOptions) options).getAttributeTypes(); |
47 | | - customFieldTypes = ((ApiModuleOptions) options).getCustomFieldTypes(); |
48 | | - } |
49 | | - else { |
50 | | - attributeTypes = null; |
51 | | - customFieldTypes = null; |
52 | | - } |
53 | | - setMixInAnnotation(ProductSearchFacetResult.class, ProductSearchFacetResultMixin.class); |
54 | | - if (attributeAsJsonNode) { |
55 | | - setMixInAnnotation(AttributeImpl.class, AttributeJsonNodeMixin.class); |
56 | | - } |
57 | | - else { |
58 | | - addDeserializer(AttributeImpl.class, |
59 | | - new AttributeDeserializer(attributeAsDateString, attributeNumberAsDouble, attributeTypes)); |
60 | | - } |
61 | | - if (customFieldAsJsonNode) { |
62 | | - addDeserializer(FieldContainerImpl.class, new CustomFieldJsonNodeDeserializer()); |
63 | | - } |
64 | | - else { |
65 | | - addDeserializer(FieldContainerImpl.class, |
66 | | - new CustomFieldDeserializer(customFieldAsDateString, customFieldNumberAsDouble, customFieldTypes)); |
| 25 | + for (Class<?> module : modules) { |
| 26 | + if (SimpleModuleMixin.class.isAssignableFrom(module)) { |
| 27 | + SimpleModuleMixin mixin; |
| 28 | + try { |
| 29 | + mixin = module.asSubclass(SimpleModuleMixin.class).getDeclaredConstructor().newInstance(); |
| 30 | + } |
| 31 | + catch (InstantiationException | IllegalAccessException | InvocationTargetException |
| 32 | + | NoSuchMethodException e) { |
| 33 | + throw new RuntimeException(e); |
| 34 | + } |
| 35 | + mixin.mixin(this, options); |
| 36 | + } |
67 | 37 | } |
68 | | - setMixInAnnotation(DeliveryPayload.class, DeliveryPayloadMixin.class); |
69 | 38 | } |
70 | 39 | } |
0 commit comments