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+
}

examples/split-packages/pom.xml

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
<groupId>com.commercetools.sdk.examples</groupId>
7+
<artifactId>maven</artifactId>
8+
<version>1.0-SNAPSHOT</version>
9+
<build>
10+
<plugins>
11+
<plugin>
12+
<groupId>org.apache.maven.plugins</groupId>
13+
<artifactId>maven-compiler-plugin</artifactId>
14+
<configuration>
15+
<source>8</source>
16+
<target>8</target>
17+
</configuration>
18+
</plugin>
19+
<plugin>
20+
<artifactId>maven-surefire-plugin</artifactId>
21+
<version>2.22.2</version>
22+
</plugin>
23+
<plugin>
24+
<artifactId>maven-failsafe-plugin</artifactId>
25+
<version>2.22.2</version>
26+
</plugin>
27+
</plugins>
28+
</build>
29+
<properties>
30+
<commercetools.version>18.0.0</commercetools.version>
31+
</properties>
32+
<dependencies>
33+
<dependency>
34+
<groupId>com.commercetools.sdk</groupId>
35+
<artifactId>commercetools-sdk-java-api-models_project</artifactId>
36+
<version>18.1.0-SNAPSHOT</version>
37+
</dependency>
38+
<dependency>
39+
<groupId>com.commercetools.sdk</groupId>
40+
<artifactId>commercetools-sdk-java-api-models_customer</artifactId>
41+
<version>18.1.0-SNAPSHOT</version>
42+
</dependency>
43+
<dependency>
44+
<groupId>com.commercetools.sdk</groupId>
45+
<artifactId>commercetools-http-client</artifactId>
46+
<version>${commercetools.version}</version>
47+
</dependency>
48+
<dependency>
49+
<groupId>org.junit.jupiter</groupId>
50+
<artifactId>junit-jupiter-api</artifactId>
51+
<version>5.7.2</version>
52+
<scope>test</scope>
53+
</dependency>
54+
<dependency>
55+
<groupId>org.junit.jupiter</groupId>
56+
<artifactId>junit-jupiter-engine</artifactId>
57+
<version>5.7.2</version>
58+
<scope>test</scope>
59+
</dependency>
60+
</dependencies>
61+
</project>

0 commit comments

Comments
 (0)