Skip to content

Commit 2e7a653

Browse files
committed
add example for split package usage
1 parent b83e931 commit 2e7a653

File tree

12 files changed

+270
-57
lines changed

12 files changed

+270
-57
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ jobs:
113113
- name: Run integration tests for PR
114114
# ignore renovate branches as they are retriggered with every new commit to main branch
115115
if: (github.event_name == 'pull_request' && !startsWith(github.head_ref, 'renovate/')) || github.event_name == 'merge_group'
116-
run: ./gradlew clean build publishMavenPublicationToMavenLocal runMainMethodThreadLeakTest runMainMethodMemoryLeakTest writeVersionToExamples
116+
run: ./gradlew clean build publishToMavenLocal runMainMethodThreadLeakTest runMainMethodMemoryLeakTest writeVersionToExamples
117117
env:
118118
CTP_CLIENT_ID: ${{ secrets.CTP_CLIENT_ID_PR }}
119119
CTP_CLIENT_SECRET: ${{ secrets.CTP_CLIENT_SECRET_PR }}

build.gradle

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ tasks.register('alljavadoc', Javadoc) {
250250
splitIndex = true
251251
noTree = true
252252
title = "commercetools Java SDK"
253-
links 'https://docs.oracle.com/javase/11/docs/api/', "https://fasterxml.github.io/jackson-databind/javadoc/2.14/", 'https://commercetools.github.io/commercetools-jvm-sdk/apidocs/', 'https://newrelic.github.io/java-agent-api/javadoc/'
253+
links 'https://docs.oracle.com/en/java/javase/11/docs/api/', "https://fasterxml.github.io/jackson-databind/javadoc/2.14/", 'https://commercetools.github.io/commercetools-jvm-sdk/apidocs/', 'https://newrelic.github.io/java-agent-api/javadoc/'
254254
overview = "src/main/javadoc/overview.html"
255255
bottom = """
256256
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.8.0/styles/default.min.css">
@@ -310,7 +310,7 @@ tasks.register('internaldocs', Javadoc) {
310310
splitIndex = true
311311
noTree = true
312312
title = "commercetools Java SDK"
313-
links 'https://docs.oracle.com/javase/11/docs/api/', "https://fasterxml.github.io/jackson-databind/javadoc/2.14/", 'https://commercetools.github.io/commercetools-jvm-sdk/apidocs/', 'https://newrelic.github.io/java-agent-api/javadoc/'
313+
links 'https://docs.oracle.com/en/java/javase/11/docs/api/', "https://fasterxml.github.io/jackson-databind/javadoc/2.14/", 'https://commercetools.github.io/commercetools-jvm-sdk/apidocs/', 'https://newrelic.github.io/java-agent-api/javadoc/'
314314
overview = "src/main/javadoc/overview.html"
315315
bottom = """
316316
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.8.0/styles/default.min.css">
@@ -378,6 +378,7 @@ tasks.register("writeVersionToExamples") {
378378
fileset(dir: projectDir) {
379379
include(name: 'examples/maven-okhttp3/pom.xml')
380380
include(name: 'examples/maven-okhttp4/pom.xml')
381+
include(name: 'examples/split-packages/pom.xml')
381382
}
382383
}
383384
}

commercetools/commercetools-sdk-java-api/build.gradle

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ projectDir.toPath().resolve("src/main/java-generated/com/commercetools/api/model
3434
archiveClassifier = 'sources'
3535
from sourceSets.main.allJava
3636
include "**/models/$dirname/**"
37+
exclude "com/**/models/message/MessagesConfiguration*"
3738
archiveBaseName = project.name + "-models-$dirname"
3839
}
3940
def javadocsTask = tasks.register("javadoc_${dirname}Jar", Jar) {
@@ -90,6 +91,20 @@ projectDir.toPath().resolve("src/main/java-generated/com/commercetools/api/model
9091
modelsBase.appendNode('artifactId', 'commercetools-sdk-java-api-models-base')
9192
modelsBase.appendNode('version', version)
9293
modelsBase.appendNode('scope', 'compile')
94+
if (dirname != "common") {
95+
def common = dependenciesNode.appendNode('dependency')
96+
common.appendNode('groupId', group)
97+
common.appendNode('artifactId', 'commercetools-sdk-java-api-models_common')
98+
common.appendNode('version', version)
99+
common.appendNode('scope', 'compile')
100+
}
101+
if (dirname != "type") {
102+
def type = dependenciesNode.appendNode('dependency')
103+
type.appendNode('groupId', group)
104+
type.appendNode('artifactId', 'commercetools-sdk-java-api-models_type')
105+
type.appendNode('version', version)
106+
type.appendNode('scope', 'compile')
107+
}
93108
}
94109
})
95110
}
@@ -144,21 +159,21 @@ tasks.register("sourcesBaseJar", Jar) {
144159
tasks.register("modelsBaseJar", Jar) {
145160
from sourceSets.main.output
146161

147-
include "**/models/*"
162+
include "**/models/*", "com/**/models/message/MessagesConfiguration*",
148163
archiveBaseName = project.name + "-models-base"
149164
}
150165
assemble.dependsOn("modelsBaseJar")
151166
tasks.register("javadocModelsBaseJar", Jar) {
152167
dependsOn "javadoc"
153168
archiveClassifier = 'javadoc'
154169
from javadoc.destinationDir
155-
include "com/**/models/*", "index-files/**", "legal/**", "resources/**", "script-dir/**", "*"
170+
include "com/**/models/*", "com/**/models/message/MessagesConfiguration*", "index-files/**", "legal/**", "resources/**", "script-dir/**", "*"
156171
archiveBaseName = project.name + "-models-base"
157172
}
158173
tasks.register("sourcesModelsBaseJar", Jar) {
159174
archiveClassifier = 'sources'
160175
from sourceSets.main.allJava
161-
include "**/models/*"
176+
include "**/models/*", "com/**/models/message/MessagesConfiguration*",
162177
archiveBaseName = project.name + "-models-base"
163178
}
164179

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2+
package com.commercetools.api;
3+
4+
import java.lang.annotation.ElementType;
5+
import java.lang.annotation.Target;
6+
7+
@Target(ElementType.TYPE)
8+
public @interface RegisterSimpleModuleMixin {
9+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
package com.commercetools.api;
3+
4+
import com.fasterxml.jackson.databind.module.SimpleModule;
5+
6+
import io.vrap.rmf.base.client.utils.json.modules.ModuleOptions;
7+
8+
public interface SimpleModuleMixin {
9+
public void mixin(SimpleModule module, ModuleOptions options);
10+
}
Lines changed: 20 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,39 @@
11

22
package com.commercetools.api.json;
33

4-
import java.util.Map;
5-
import java.util.Optional;
4+
import java.lang.reflect.InvocationTargetException;
5+
import java.util.Set;
66

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;
139
import com.fasterxml.jackson.databind.module.SimpleModule;
1410

1511
import io.vrap.rmf.base.client.utils.json.modules.ModuleOptions;
1612

13+
import org.reflections.Reflections;
14+
1715
/**
1816
* Module to configure the default jackson {@link com.fasterxml.jackson.databind.ObjectMapper} e.g. to deserialize attributes and custom fields
1917
*/
2018
public class ApiModule extends SimpleModule {
2119
private static final long serialVersionUID = 0L;
2220

2321
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);
4224

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+
}
6737
}
68-
setMixInAnnotation(DeliveryPayload.class, DeliveryPayloadMixin.class);
6938
}
7039
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
2+
package com.commercetools.api.models.product;
3+
4+
import java.util.Map;
5+
import java.util.Optional;
6+
7+
import com.commercetools.api.RegisterSimpleModuleMixin;
8+
import com.commercetools.api.SimpleModuleMixin;
9+
import com.commercetools.api.json.*;
10+
import com.fasterxml.jackson.core.type.TypeReference;
11+
import com.fasterxml.jackson.databind.module.SimpleModule;
12+
13+
import io.vrap.rmf.base.client.utils.json.modules.ModuleOptions;
14+
15+
@RegisterSimpleModuleMixin
16+
public class ProductModuleMixin implements SimpleModuleMixin {
17+
public void mixin(SimpleModule module, ModuleOptions options) {
18+
boolean attributeAsDateString = Boolean.parseBoolean(
19+
Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_DATE_ATTRIBUTE_AS_STRING))
20+
.orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_DATE_ATTRIBUTE_AS_STRING)));
21+
boolean attributeAsJsonNode = Boolean.parseBoolean(
22+
Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_ATTRIBUTE_AS_JSON_NODE))
23+
.orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_ATTRIBUTE_AS_JSON_NODE)));
24+
boolean attributeNumberAsDouble = Boolean.parseBoolean(
25+
Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_ATTRIBUTE_NUMBER_AS_DOUBLE))
26+
.orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_ATTRIBUTE_NUMBER_AS_DOUBLE)));
27+
28+
final Map<String, TypeReference<?>> attributeTypes;
29+
if (options instanceof ApiModuleOptions) {
30+
attributeTypes = ((ApiModuleOptions) options).getAttributeTypes();
31+
}
32+
else {
33+
attributeTypes = null;
34+
}
35+
if (attributeAsJsonNode) {
36+
module.setMixInAnnotation(AttributeImpl.class, AttributeJsonNodeMixin.class);
37+
}
38+
else {
39+
module.addDeserializer(AttributeImpl.class,
40+
new AttributeDeserializer(attributeAsDateString, attributeNumberAsDouble, attributeTypes));
41+
}
42+
}
43+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
2+
package com.commercetools.api.models.product_search;
3+
4+
import com.commercetools.api.RegisterSimpleModuleMixin;
5+
import com.commercetools.api.SimpleModuleMixin;
6+
import com.commercetools.api.json.ProductSearchFacetResultMixin;
7+
import com.fasterxml.jackson.databind.module.SimpleModule;
8+
9+
import io.vrap.rmf.base.client.utils.json.modules.ModuleOptions;
10+
11+
@RegisterSimpleModuleMixin
12+
public class ProductSearchModuleMixin implements SimpleModuleMixin {
13+
public void mixin(SimpleModule module, ModuleOptions options) {
14+
module.setMixInAnnotation(ProductSearchFacetResult.class, ProductSearchFacetResultMixin.class);
15+
}
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
2+
package com.commercetools.api.models.subscription;
3+
4+
import com.commercetools.api.RegisterSimpleModuleMixin;
5+
import com.commercetools.api.SimpleModuleMixin;
6+
import com.fasterxml.jackson.databind.module.SimpleModule;
7+
8+
import io.vrap.rmf.base.client.utils.json.modules.ModuleOptions;
9+
10+
@RegisterSimpleModuleMixin
11+
public class SubscriptionModuleMixin implements SimpleModuleMixin {
12+
public void mixin(SimpleModule module, ModuleOptions options) {
13+
module.setMixInAnnotation(DeliveryPayload.class, DeliveryPayloadMixin.class);
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
2+
package com.commercetools.api.models.type;
3+
4+
import java.util.Map;
5+
import java.util.Optional;
6+
7+
import com.commercetools.api.RegisterSimpleModuleMixin;
8+
import com.commercetools.api.SimpleModuleMixin;
9+
import com.commercetools.api.json.ApiModuleOptions;
10+
import com.commercetools.api.json.CustomFieldDeserializer;
11+
import com.commercetools.api.json.CustomFieldJsonNodeDeserializer;
12+
import com.fasterxml.jackson.core.type.TypeReference;
13+
import com.fasterxml.jackson.databind.module.SimpleModule;
14+
15+
import io.vrap.rmf.base.client.utils.json.modules.ModuleOptions;
16+
17+
@RegisterSimpleModuleMixin
18+
public class TypeModuleMixin implements SimpleModuleMixin {
19+
public void mixin(SimpleModule module, ModuleOptions options) {
20+
boolean customFieldNumberAsDouble = Boolean.parseBoolean(
21+
Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_CUSTOM_FIELD_NUMBER_AS_DOUBLE))
22+
.orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_CUSTOM_FIELD_NUMBER_AS_DOUBLE)));
23+
boolean customFieldAsJsonNode = Boolean.parseBoolean(
24+
Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_CUSTOM_FIELD_AS_JSON_NODE))
25+
.orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_CUSTOM_FIELD_AS_JSON_NODE)));
26+
boolean customFieldAsDateString = Boolean
27+
.parseBoolean(Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_DATE_FIELD_AS_STRING))
28+
.orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_DATE_FIELD_AS_STRING)));
29+
final Map<String, TypeReference<?>> customFieldTypes;
30+
if (options instanceof ApiModuleOptions) {
31+
customFieldTypes = ((ApiModuleOptions) options).getCustomFieldTypes();
32+
}
33+
else {
34+
customFieldTypes = null;
35+
}
36+
37+
if (customFieldAsJsonNode) {
38+
module.addDeserializer(FieldContainerImpl.class, new CustomFieldJsonNodeDeserializer());
39+
}
40+
else {
41+
module.addDeserializer(FieldContainerImpl.class,
42+
new CustomFieldDeserializer(customFieldAsDateString, customFieldNumberAsDouble, customFieldTypes));
43+
}
44+
}
45+
}

0 commit comments

Comments
 (0)