Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ jobs:
- name: Run integration tests for PR
# ignore renovate branches as they are retriggered with every new commit to main branch
if: (github.event_name == 'pull_request' && !startsWith(github.head_ref, 'renovate/')) || github.event_name == 'merge_group'
run: ./gradlew clean build publishMavenPublicationToMavenLocal runMainMethodThreadLeakTest runMainMethodMemoryLeakTest writeVersionToExamples
run: ./gradlew clean build publishToMavenLocal runMainMethodThreadLeakTest runMainMethodMemoryLeakTest writeVersionToExamples
env:
CTP_CLIENT_ID: ${{ secrets.CTP_CLIENT_ID_PR }}
CTP_CLIENT_SECRET: ${{ secrets.CTP_CLIENT_SECRET_PR }}
Expand All @@ -123,7 +123,7 @@ jobs:

- name: Run integration tests
if: github.event_name != 'pull_request' && github.event_name != 'merge_group'
run: ./gradlew clean build publishMavenPublicationToMavenLocal runMainMethodThreadLeakTest runMainMethodMemoryLeakTest writeVersionToExamples
run: ./gradlew clean build publishToMavenLocal runMainMethodThreadLeakTest runMainMethodMemoryLeakTest writeVersionToExamples
env:
CTP_CLIENT_ID: ${{ secrets.CTP_CLIENT_ID }}
CTP_CLIENT_SECRET: ${{ secrets.CTP_CLIENT_SECRET }}
Expand All @@ -135,6 +135,7 @@ jobs:
run: |
cd examples/maven-okhttp3 && mvn verify --no-transfer-progress
cd ../maven-okhttp4 && mvn verify --no-transfer-progress
cd ../split-packages && mvn verify --no-transfer-progress

- name: Collect code coverage
run: ./gradlew codeCoverageReport
Expand Down
5 changes: 3 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ tasks.register('alljavadoc', Javadoc) {
splitIndex = true
noTree = true
title = "commercetools Java SDK"
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/'
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/'
overview = "src/main/javadoc/overview.html"
bottom = """
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.8.0/styles/default.min.css">
Expand Down Expand Up @@ -310,7 +310,7 @@ tasks.register('internaldocs', Javadoc) {
splitIndex = true
noTree = true
title = "commercetools Java SDK"
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/'
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/'
overview = "src/main/javadoc/overview.html"
bottom = """
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.8.0/styles/default.min.css">
Expand Down Expand Up @@ -378,6 +378,7 @@ tasks.register("writeVersionToExamples") {
fileset(dir: projectDir) {
include(name: 'examples/maven-okhttp3/pom.xml')
include(name: 'examples/maven-okhttp4/pom.xml')
include(name: 'examples/split-packages/pom.xml')
}
}
}
Expand Down
21 changes: 18 additions & 3 deletions commercetools/commercetools-sdk-java-api/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ projectDir.toPath().resolve("src/main/java-generated/com/commercetools/api/model
archiveClassifier = 'sources'
from sourceSets.main.allJava
include "**/models/$dirname/**"
exclude "com/**/models/message/MessagesConfiguration*"
archiveBaseName = project.name + "-models-$dirname"
}
def javadocsTask = tasks.register("javadoc_${dirname}Jar", Jar) {
Expand Down Expand Up @@ -90,6 +91,20 @@ projectDir.toPath().resolve("src/main/java-generated/com/commercetools/api/model
modelsBase.appendNode('artifactId', 'commercetools-sdk-java-api-models-base')
modelsBase.appendNode('version', version)
modelsBase.appendNode('scope', 'compile')
if (dirname != "common") {
def common = dependenciesNode.appendNode('dependency')
common.appendNode('groupId', group)
common.appendNode('artifactId', 'commercetools-sdk-java-api-models_common')
common.appendNode('version', version)
common.appendNode('scope', 'compile')
}
if (dirname != "type") {
def type = dependenciesNode.appendNode('dependency')
type.appendNode('groupId', group)
type.appendNode('artifactId', 'commercetools-sdk-java-api-models_type')
type.appendNode('version', version)
type.appendNode('scope', 'compile')
}
}
})
}
Expand Down Expand Up @@ -144,21 +159,21 @@ tasks.register("sourcesBaseJar", Jar) {
tasks.register("modelsBaseJar", Jar) {
from sourceSets.main.output

include "**/models/*"
include "**/models/*", "com/**/models/message/MessagesConfiguration*",
archiveBaseName = project.name + "-models-base"
}
assemble.dependsOn("modelsBaseJar")
tasks.register("javadocModelsBaseJar", Jar) {
dependsOn "javadoc"
archiveClassifier = 'javadoc'
from javadoc.destinationDir
include "com/**/models/*", "index-files/**", "legal/**", "resources/**", "script-dir/**", "*"
include "com/**/models/*", "com/**/models/message/MessagesConfiguration*", "index-files/**", "legal/**", "resources/**", "script-dir/**", "*"
archiveBaseName = project.name + "-models-base"
}
tasks.register("sourcesModelsBaseJar", Jar) {
archiveClassifier = 'sources'
from sourceSets.main.allJava
include "**/models/*"
include "**/models/*", "com/**/models/message/MessagesConfiguration*",
archiveBaseName = project.name + "-models-base"
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@

package com.commercetools.api;

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
public @interface RegisterSimpleModuleMixin {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@

package com.commercetools.api;

import com.fasterxml.jackson.databind.module.SimpleModule;

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

public interface SimpleModuleMixin {
public void mixin(SimpleModule module, ModuleOptions options);
}
Original file line number Diff line number Diff line change
@@ -1,70 +1,39 @@

package com.commercetools.api.json;

import java.util.Map;
import java.util.Optional;
import java.lang.reflect.InvocationTargetException;
import java.util.Set;

import com.commercetools.api.models.product.AttributeImpl;
import com.commercetools.api.models.product_search.ProductSearchFacetResult;
import com.commercetools.api.models.subscription.DeliveryPayload;
import com.commercetools.api.models.subscription.DeliveryPayloadMixin;
import com.commercetools.api.models.type.FieldContainerImpl;
import com.fasterxml.jackson.core.type.TypeReference;
import com.commercetools.api.RegisterSimpleModuleMixin;
import com.commercetools.api.SimpleModuleMixin;
import com.fasterxml.jackson.databind.module.SimpleModule;

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

import org.reflections.Reflections;

/**
* Module to configure the default jackson {@link com.fasterxml.jackson.databind.ObjectMapper} e.g. to deserialize attributes and custom fields
*/
public class ApiModule extends SimpleModule {
private static final long serialVersionUID = 0L;

public ApiModule(ModuleOptions options) {
boolean attributeAsDateString = Boolean.parseBoolean(
Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_DATE_ATTRIBUTE_AS_STRING))
.orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_DATE_ATTRIBUTE_AS_STRING)));
boolean customFieldAsDateString = Boolean
.parseBoolean(Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_DATE_FIELD_AS_STRING))
.orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_DATE_FIELD_AS_STRING)));
boolean attributeAsJsonNode = Boolean.parseBoolean(
Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_ATTRIBUTE_AS_JSON_NODE))
.orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_ATTRIBUTE_AS_JSON_NODE)));
boolean customFieldAsJsonNode = Boolean.parseBoolean(
Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_CUSTOM_FIELD_AS_JSON_NODE))
.orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_CUSTOM_FIELD_AS_JSON_NODE)));
boolean attributeNumberAsDouble = Boolean.parseBoolean(
Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_ATTRIBUTE_NUMBER_AS_DOUBLE))
.orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_ATTRIBUTE_NUMBER_AS_DOUBLE)));
boolean customFieldNumberAsDouble = Boolean.parseBoolean(
Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_CUSTOM_FIELD_NUMBER_AS_DOUBLE))
.orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_CUSTOM_FIELD_NUMBER_AS_DOUBLE)));
Reflections reflections = new Reflections("com.commercetools");
Set<Class<?>> modules = reflections.getTypesAnnotatedWith(RegisterSimpleModuleMixin.class);

final Map<String, TypeReference<?>> attributeTypes;
final Map<String, TypeReference<?>> customFieldTypes;
if (options instanceof ApiModuleOptions) {
attributeTypes = ((ApiModuleOptions) options).getAttributeTypes();
customFieldTypes = ((ApiModuleOptions) options).getCustomFieldTypes();
}
else {
attributeTypes = null;
customFieldTypes = null;
}
setMixInAnnotation(ProductSearchFacetResult.class, ProductSearchFacetResultMixin.class);
if (attributeAsJsonNode) {
setMixInAnnotation(AttributeImpl.class, AttributeJsonNodeMixin.class);
}
else {
addDeserializer(AttributeImpl.class,
new AttributeDeserializer(attributeAsDateString, attributeNumberAsDouble, attributeTypes));
}
if (customFieldAsJsonNode) {
addDeserializer(FieldContainerImpl.class, new CustomFieldJsonNodeDeserializer());
}
else {
addDeserializer(FieldContainerImpl.class,
new CustomFieldDeserializer(customFieldAsDateString, customFieldNumberAsDouble, customFieldTypes));
for (Class<?> module : modules) {
if (SimpleModuleMixin.class.isAssignableFrom(module)) {
SimpleModuleMixin mixin;
try {
mixin = module.asSubclass(SimpleModuleMixin.class).getDeclaredConstructor().newInstance();
}
catch (InstantiationException | IllegalAccessException | InvocationTargetException

Check warning on line 31 in commercetools/commercetools-sdk-java-api/src/main/java/com/commercetools/api/json/ApiModule.java

View check run for this annotation

Codecov / codecov/patch

commercetools/commercetools-sdk-java-api/src/main/java/com/commercetools/api/json/ApiModule.java#L31

Added line #L31 was not covered by tests
| NoSuchMethodException e) {
throw new RuntimeException(e);

Check warning on line 33 in commercetools/commercetools-sdk-java-api/src/main/java/com/commercetools/api/json/ApiModule.java

View check run for this annotation

Codecov / codecov/patch

commercetools/commercetools-sdk-java-api/src/main/java/com/commercetools/api/json/ApiModule.java#L33

Added line #L33 was not covered by tests
}
mixin.mixin(this, options);
}
}
setMixInAnnotation(DeliveryPayload.class, DeliveryPayloadMixin.class);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@

package com.commercetools.api.models.product;

import java.util.Map;
import java.util.Optional;

import com.commercetools.api.RegisterSimpleModuleMixin;
import com.commercetools.api.SimpleModuleMixin;
import com.commercetools.api.json.*;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.module.SimpleModule;

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

@RegisterSimpleModuleMixin
public class ProductModuleMixin implements SimpleModuleMixin {
public void mixin(SimpleModule module, ModuleOptions options) {
boolean attributeAsDateString = Boolean.parseBoolean(
Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_DATE_ATTRIBUTE_AS_STRING))
.orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_DATE_ATTRIBUTE_AS_STRING)));
boolean attributeAsJsonNode = Boolean.parseBoolean(
Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_ATTRIBUTE_AS_JSON_NODE))
.orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_ATTRIBUTE_AS_JSON_NODE)));
boolean attributeNumberAsDouble = Boolean.parseBoolean(
Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_ATTRIBUTE_NUMBER_AS_DOUBLE))
.orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_ATTRIBUTE_NUMBER_AS_DOUBLE)));

final Map<String, TypeReference<?>> attributeTypes;
if (options instanceof ApiModuleOptions) {
attributeTypes = ((ApiModuleOptions) options).getAttributeTypes();
}
else {
attributeTypes = null;
}
if (attributeAsJsonNode) {
module.setMixInAnnotation(AttributeImpl.class, AttributeJsonNodeMixin.class);
}
else {
module.addDeserializer(AttributeImpl.class,
new AttributeDeserializer(attributeAsDateString, attributeNumberAsDouble, attributeTypes));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@

package com.commercetools.api.models.product_search;

import com.commercetools.api.RegisterSimpleModuleMixin;
import com.commercetools.api.SimpleModuleMixin;
import com.commercetools.api.json.ProductSearchFacetResultMixin;
import com.fasterxml.jackson.databind.module.SimpleModule;

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

@RegisterSimpleModuleMixin
public class ProductSearchModuleMixin implements SimpleModuleMixin {
public void mixin(SimpleModule module, ModuleOptions options) {
module.setMixInAnnotation(ProductSearchFacetResult.class, ProductSearchFacetResultMixin.class);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@

package com.commercetools.api.models.subscription;

import com.commercetools.api.RegisterSimpleModuleMixin;
import com.commercetools.api.SimpleModuleMixin;
import com.fasterxml.jackson.databind.module.SimpleModule;

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

@RegisterSimpleModuleMixin
public class SubscriptionModuleMixin implements SimpleModuleMixin {
public void mixin(SimpleModule module, ModuleOptions options) {
module.setMixInAnnotation(DeliveryPayload.class, DeliveryPayloadMixin.class);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@

package com.commercetools.api.models.type;

import java.util.Map;
import java.util.Optional;

import com.commercetools.api.RegisterSimpleModuleMixin;
import com.commercetools.api.SimpleModuleMixin;
import com.commercetools.api.json.ApiModuleOptions;
import com.commercetools.api.json.CustomFieldDeserializer;
import com.commercetools.api.json.CustomFieldJsonNodeDeserializer;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.module.SimpleModule;

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

@RegisterSimpleModuleMixin
public class TypeModuleMixin implements SimpleModuleMixin {
public void mixin(SimpleModule module, ModuleOptions options) {
boolean customFieldNumberAsDouble = Boolean.parseBoolean(
Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_CUSTOM_FIELD_NUMBER_AS_DOUBLE))
.orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_CUSTOM_FIELD_NUMBER_AS_DOUBLE)));
boolean customFieldAsJsonNode = Boolean.parseBoolean(
Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_CUSTOM_FIELD_AS_JSON_NODE))
.orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_CUSTOM_FIELD_AS_JSON_NODE)));
boolean customFieldAsDateString = Boolean
.parseBoolean(Optional.ofNullable(options.getOption(ApiModuleOptions.DESERIALIZE_DATE_FIELD_AS_STRING))
.orElse(System.getProperty(ApiModuleOptions.DESERIALIZE_DATE_FIELD_AS_STRING)));
final Map<String, TypeReference<?>> customFieldTypes;
if (options instanceof ApiModuleOptions) {
customFieldTypes = ((ApiModuleOptions) options).getCustomFieldTypes();
}
else {
customFieldTypes = null;
}

if (customFieldAsJsonNode) {
module.addDeserializer(FieldContainerImpl.class, new CustomFieldJsonNodeDeserializer());
}
else {
module.addDeserializer(FieldContainerImpl.class,
new CustomFieldDeserializer(customFieldAsDateString, customFieldNumberAsDouble, customFieldTypes));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@

package com.commercetools.docs.meta;

/**
* {@include.toc}
* <h2>Optimizing package size</h2>
*
* <p>Optimizing the size of applications in a size constrained environment like AWS Lambda can
* be challenging.</p>
*
* <h3>Using split packages</h3>
*
* <p>For an application which covers the whole business logic and may act as a backend
* for frontend it's advised to use the <code>commercetools-sdk-java-api</code> package.</p>
*
* <p>When developing small function applications which will be used in a size constrained environment
* the SDK offers packages split by their domain. Due to the connections between the different domains
* the split is realized after compilation and doesn't reflect the whole dependency graph of all packages.
* You will have to explicitly define the packages you intend to use.</p>
*
* <p>We provide an {@see <a href=https://github.com/commercetools/commercetools-sdk-java-v2/tree/main/examples/split-packages>example</a>} for using split packages</p>
*
* <p>Please see the list for the split packages and their artifact IDs</p>
*
* <p><dl>
* <dt>Base</dt>
* <dd>com.commercetools.sdk:commercetools-sdk-java-api-base</dd>
* <dt>Models Base</dt>
* <dd>com.commercetools.sdk:commercetools-sdk-java-api-models-base</dd>
* <dt>Models by domain</dt>
* <dd>com.commercetools.sdk:commercetools-sdk-java-api-models-{domain}</dd>
* <dt>Predicates</dt>
* <dd>com.commercetools.sdk:commercetools-sdk-java-api-predicates</dd>
* </dl></p>
*/
public class SizeOptimization {

Check warning on line 36 in commercetools/internal-docs/src/main/java/com/commercetools/docs/meta/SizeOptimization.java

View check run for this annotation

Codecov / codecov/patch

commercetools/internal-docs/src/main/java/com/commercetools/docs/meta/SizeOptimization.java#L36

Added line #L36 was not covered by tests
}
Loading