Skip to content

Commit fbfbab7

Browse files
authored
Fix NullPointerException for products having a category but no order hints (#1134)
1 parent d4ec809 commit fbfbab7

File tree

8 files changed

+94
-20
lines changed

8 files changed

+94
-20
lines changed

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# commercetools sync java
33
[![CI](https://github.com/commercetools/commercetools-sync-java/workflows/CI/badge.svg)](https://github.com/commercetools/commercetools-sync-java/actions?query=workflow%3ACI)
44
[![codecov](https://codecov.io/gh/commercetools/commercetools-sync-java/branch/master/graph/badge.svg)](https://codecov.io/gh/commercetools/commercetools-sync-java)
5-
[![Javadoc](https://javadoc.io/badge2/com.commercetools/commercetools-sync-java/javadoc.svg?label=Javadoc)](https://commercetools.github.io/commercetools-sync-java/v/10.0.2/)
5+
[![Javadoc](https://javadoc.io/badge2/com.commercetools/commercetools-sync-java/javadoc.svg?label=Javadoc)](https://commercetools.github.io/commercetools-sync-java/v/10.0.3/)
66
[![Known Vulnerabilities](https://snyk.io/test/github/commercetools/commercetools-sync-java/4b2e26113d591bda158217c5dc1cf80a88665646/badge.svg)](https://snyk.io/test/github/commercetools/commercetools-sync-java/4b2e26113d591bda158217c5dc1cf80a88665646)
77

88

@@ -60,26 +60,26 @@ Here are the most popular ones:
6060
<dependency>
6161
<groupId>com.commercetools</groupId>
6262
<artifactId>commercetools-sync-java</artifactId>
63-
<version>10.0.2</version>
63+
<version>10.0.3</version>
6464
</dependency>
6565
````
6666

6767
#### Gradle
6868

6969
````groovy
70-
implementation 'com.commercetools:commercetools-sync-java:10.0.2'
70+
implementation 'com.commercetools:commercetools-sync-java:10.0.3'
7171
````
7272

7373
#### SBT
7474

7575
````
76-
libraryDependencies += "com.commercetools" % "commercetools-sync-java" % "10.0.2"
76+
libraryDependencies += "com.commercetools" % "commercetools-sync-java" % "10.0.3"
7777
````
7878

7979
#### Ivy
8080

8181
````xml
82-
<dependency org="com.commercetools" name="commercetools-sync-java" rev="10.0.2"/>
82+
<dependency org="com.commercetools" name="commercetools-sync-java" rev="10.0.3"/>
8383
````
8484

8585
**Note**: To avoid `commercetools JVM SDK` libraries version mismatch between projects.

docs/README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
# commercetools sync
33
[![CI](https://github.com/commercetools/commercetools-sync-java/workflows/CI/badge.svg)](https://github.com/commercetools/commercetools-sync-java/actions?query=workflow%3ACI)
44
[![codecov](https://codecov.io/gh/commercetools/commercetools-sync-java/branch/master/graph/badge.svg)](https://codecov.io/gh/commercetools/commercetools-sync-java)
5-
[![Benchmarks 10.0.2](https://img.shields.io/badge/Benchmarks-10.0.2-orange.svg)](https://commercetools.github.io/commercetools-sync-java/benchmarks/)
6-
[![Download from Maven Central](https://img.shields.io/badge/Maven_Central-10.0.2-blue.svg)](https://search.maven.org/artifact/com.commercetools/commercetools-sync-java/10.0.2/jar)
7-
[![Javadoc](https://javadoc.io/badge2/com.commercetools/commercetools-sync-java/javadoc.svg?label=Javadoc)](https://commercetools.github.io/commercetools-sync-java/v/10.0.2/)
5+
[![Benchmarks 10.0.3](https://img.shields.io/badge/Benchmarks-10.0.3-orange.svg)](https://commercetools.github.io/commercetools-sync-java/benchmarks/)
6+
[![Download from Maven Central](https://img.shields.io/badge/Maven_Central-10.0.3-blue.svg)](https://search.maven.org/artifact/com.commercetools/commercetools-sync-java/10.0.3/jar)
7+
[![Javadoc](https://javadoc.io/badge2/com.commercetools/commercetools-sync-java/javadoc.svg?label=Javadoc)](https://commercetools.github.io/commercetools-sync-java/v/10.0.3/)
88
[![Known Vulnerabilities](https://snyk.io/test/github/commercetools/commercetools-sync-java/4b2e26113d591bda158217c5dc1cf80a88665646/badge.svg)](https://snyk.io/test/github/commercetools/commercetools-sync-java/4b2e26113d591bda158217c5dc1cf80a88665646)
99

1010

@@ -40,18 +40,18 @@ Here are the most popular ones:
4040
<dependency>
4141
<groupId>com.commercetools</groupId>
4242
<artifactId>commercetools-sync-java</artifactId>
43-
<version>10.0.2</version>
43+
<version>10.0.3</version>
4444
</dependency>
4545
````
4646
#### Gradle
4747
````groovy
48-
implementation 'com.commercetools:commercetools-sync-java:10.0.2'
48+
implementation 'com.commercetools:commercetools-sync-java:10.0.3'
4949
````
5050
#### SBT
5151
````
52-
libraryDependencies += "com.commercetools" % "commercetools-sync-java" % "10.0.2"
52+
libraryDependencies += "com.commercetools" % "commercetools-sync-java" % "10.0.3"
5353
````
5454
#### Ivy
5555
````xml
56-
<dependency org="com.commercetools" name="commercetools-sync-java" rev="10.0.2"/>
56+
<dependency org="com.commercetools" name="commercetools-sync-java" rev="10.0.3"/>
5757
````

docs/RELEASE_NOTES.md

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,19 @@
2727
7. Add Migration guide section which specifies explicitly if there are breaking changes and how to tackle them.
2828
-->
2929

30+
### 10.0.3 - Dec 21, 2023
31+
[Commits](https://github.com/commercetools/commercetools-sync-java/compare/10.0.2...10.0.3) |
32+
[Javadoc](https://commercetools.github.io/commercetools-sync-java/v/10.0.3/) |
33+
[Jar](https://search.maven.org/artifact/com.commercetools/commercetools-sync-java/10.0.3/jar)
34+
35+
- 🐞 **Bug Fixes** (1)
36+
- Fix NullPointerException for products having a category but no category order hints (https://github.com/commercetools/commercetools-sync-java/pull/1134)
37+
3038
### 10.0.2 - Dec 05, 2023
3139
[Commits](https://github.com/commercetools/commercetools-sync-java/compare/10.0.1...10.0.2) |
3240
[Javadoc](https://commercetools.github.io/commercetools-sync-java/v/10.0.2/) |
3341
[Jar](https://search.maven.org/artifact/com.commercetools/commercetools-sync-java/10.0.2/jar)
34-
-
42+
3543
- 🐞 **Bug Fixes** (4)
3644
- **Product Sync** - Sync now supports syncing of products with attributes referencing themselves. [#478](https://github.com/commercetools/commercetools-project-sync/issues/478)
3745
- **State Sync** - Fix NPE thrown by `StateDraftBuilder.build()` when required fields are missing. The `StateTransformUtils.toStateDrafts` utility returns an empty draft when key is null or empty.
@@ -42,15 +50,15 @@
4250
[Commits](https://github.com/commercetools/commercetools-sync-java/compare/10.0.0...10.0.1) |
4351
[Javadoc](https://commercetools.github.io/commercetools-sync-java/v/10.0.1/) |
4452
[Jar](https://search.maven.org/artifact/com.commercetools/commercetools-sync-java/10.0.1/jar)
45-
-
46-
- 🚧 **Bug fixes** (1)
53+
54+
- 🐞 **Bug fixes** (1)
4755
- Make commercetools-sdk-java-v2 available as a transitive dependency
4856

4957
### 10.0.0 - Nov 6, 2023
5058
[Commits](https://github.com/commercetools/commercetools-sync-java/compare/9.2.3...10.0.0) |
5159
[Javadoc](https://commercetools.github.io/commercetools-sync-java/v/10.0.0/) |
5260
[Jar](https://search.maven.org/artifact/com.commercetools/commercetools-sync-java/10.0.0/jar)
53-
-
61+
5462
- 🚧 **Breaking Changes** (1)
5563
- commercetools-sync-java is now fully migrated to `commercetools-sdk-java-v2`. See [Migration Guide](./MIGRATION_GUIDE.md) on how to use this library version.
5664

docs/usage/QUICK_START.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@
2020
<dependency>
2121
<groupId>com.commercetools</groupId>
2222
<artifactId>commercetools-sync-java</artifactId>
23-
<version>10.0.2</version>
23+
<version>10.0.3</version>
2424
</dependency>
2525
````
2626
- For Gradle users:
2727
````groovy
2828
// Add commercetools-sync-java dependency.
29-
implementation 'com.commercetools:commercetools-sync-java:10.0.2'
29+
implementation 'com.commercetools:commercetools-sync-java:10.0.3'
3030
````
3131

3232
### 2. Setup Syncing Options

src/integration-test/java/com/commercetools/sync/integration/ctpprojectsource/products/ProductReferenceResolverIT.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,45 @@ void sync_withNewProductWithExistingCategoryAndProductTypeReferences_ShouldCreat
188188
assertThat(warningCallBackMessages).isEmpty();
189189
}
190190

191+
@Test
192+
void sync_withNewProductWithNoCategoryOrderHints_ShouldCreateProduct() {
193+
// preparation
194+
final ProductDraft productDraft =
195+
createProductDraft(
196+
PRODUCT_KEY_1_RESOURCE_PATH,
197+
productTypeSource.toReference(),
198+
oldTaxCategory.toReference(),
199+
oldProductState.toReference(),
200+
categoryReferencesWithIds,
201+
null);
202+
TestClientUtils.CTP_SOURCE_CLIENT.products().create(productDraft).executeBlocking();
203+
204+
final List<ProductProjection> products =
205+
TestClientUtils.CTP_SOURCE_CLIENT
206+
.productProjections()
207+
.get()
208+
.withStaged(true)
209+
.execute()
210+
.thenApply(ApiHttpResponse::getBody)
211+
.thenApply(ProductProjectionPagedQueryResponse::getResults)
212+
.join();
213+
214+
final List<ProductDraft> productDrafts =
215+
ProductTransformUtils.toProductDrafts(
216+
TestClientUtils.CTP_SOURCE_CLIENT, referenceIdToKeyCache, products)
217+
.join();
218+
219+
// test
220+
final ProductSyncStatistics syncStatistics =
221+
productSync.sync(productDrafts).toCompletableFuture().join();
222+
223+
// assertion
224+
assertThat(syncStatistics).hasValues(1, 1, 0, 0);
225+
assertThat(errorCallBackMessages).isEmpty();
226+
assertThat(errorCallBackExceptions).isEmpty();
227+
assertThat(warningCallBackMessages).isEmpty();
228+
}
229+
191230
@Test
192231
void sync_withNewProductWithNoProductTypeKey_ShouldFailCreatingTheProduct() {
193232
// preparation

src/main/java/com/commercetools/sync/products/helpers/ProductReferenceResolver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ private CompletionStage<ProductDraftBuilder> fetchAndResolveCategoryReferences(
306306
.map(
307307
category -> {
308308
keyToCategory.put(category.getKey(), category);
309-
if (categoryOrderHints != null) {
309+
if (categoryOrderHints != null && categoryOrderHints.values() != null) {
310310
ofNullable(categoryOrderHints.values().get(category.getKey()))
311311
.ifPresent(
312312
orderHintValue ->

src/main/java/com/commercetools/sync/products/utils/ProductReferenceResolutionUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ static CategoryResourceIdentifierPair mapToCategoryReferencePair(
262262
if (referenceIdToKeyCache.containsKey(categoryId)) {
263263
final String categoryKey = referenceIdToKeyCache.get(categoryId);
264264

265-
if (categoryOrderHints != null) {
265+
if (categoryOrderHints != null && categoryOrderHints.values() != null) {
266266
final String categoryOrderHintValue = categoryOrderHints.values().get(categoryId);
267267
if (categoryOrderHintValue != null) {
268268
categoryOrderHintsMapWithKeys.put(categoryKey, categoryOrderHintValue);

src/test/java/com/commercetools/sync/products/utils/ProductReferenceResolutionUtilsTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,33 @@ void mapToCategoryReferencePair_WithNullReferences_ShouldNotReplaceIds() {
176176
assertThat(categoryOrderHintsWithKeys).isNull();
177177
}
178178

179+
@Test
180+
void mapToCategoryReferencePair_WithEmptyReferences_ShouldNotReplaceIds() {
181+
final String categoryId = UUID.randomUUID().toString();
182+
final String categoryKey = "categoryKey1";
183+
referenceIdToKeyCache.add(categoryId, categoryKey);
184+
185+
final CategoryOrderHints emptyCategoryOrderHints = CategoryOrderHints.of();
186+
187+
final List<CategoryReference> categoryReferences =
188+
singletonList(CategoryReferenceBuilder.of().id(categoryId).build());
189+
final ProductProjection product = getProductMock(categoryReferences, emptyCategoryOrderHints);
190+
191+
final CategoryResourceIdentifierPair categoryReferencePair =
192+
ProductReferenceResolutionUtils.mapToCategoryReferencePair(product, referenceIdToKeyCache);
193+
194+
assertThat(categoryReferencePair).isNotNull();
195+
196+
final List<CategoryResourceIdentifier> categoryReferencesWithKeys =
197+
categoryReferencePair.getCategoryResourceIdentifiers();
198+
final CategoryOrderHints categoryOrderHintsWithKeys =
199+
categoryReferencePair.getCategoryOrderHints();
200+
assertThat(categoryReferencesWithKeys)
201+
.extracting(ResourceIdentifier::getKey)
202+
.containsExactlyInAnyOrder(categoryKey);
203+
assertThat(categoryOrderHintsWithKeys).isEqualTo(emptyCategoryOrderHints);
204+
}
205+
179206
@Nonnull
180207
private static ProductProjection getProductMock(
181208
@Nonnull final List<CategoryReference> references,

0 commit comments

Comments
 (0)