Search in sources :

Example 1 with SyncFilter

use of com.commercetools.sync.products.SyncFilter in project commercetools-sync-java by commercetools.

the class ProductSyncIT method sync_withProductTypeReference_ShouldUpdateProducts.

@Test
void sync_withProductTypeReference_ShouldUpdateProducts() {
    // Preparation
    // Create custom options with whitelisting and action filter callback..
    final ProductSyncOptions customSyncOptions = ProductSyncOptionsBuilder.of(CTP_TARGET_CLIENT).errorCallback((exception, oldResource, newResource, updateActions) -> errorCallback(exception.getMessage(), exception.getCause())).warningCallback((exception, oldResource, newResources) -> warningCallBackMessages.add(exception.getMessage())).beforeUpdateCallback(this::beforeUpdateCallback).syncFilter(SyncFilter.ofWhiteList(ATTRIBUTES)).build();
    final ProductSync customSync = new ProductSync(customSyncOptions);
    // Create 3 existing products in target project with keys (productKey1, productKey2 and
    // productKey3)
    final ProductDraft existingProductDraft = createProductDraft(PRODUCT_KEY_1_RESOURCE_PATH, targetProductType.toReference(), targetTaxCategory.toReference(), targetProductState.toReference(), targetCategoryReferencesWithIds, createRandomCategoryOrderHints(targetCategoryReferencesWithIds));
    CTP_TARGET_CLIENT.execute(ProductCreateCommand.of(existingProductDraft)).toCompletableFuture().join();
    final ProductDraft existingProductDraft2 = createProductDraft(PRODUCT_KEY_2_RESOURCE_PATH, targetProductType.toReference(), targetTaxCategory.toReference(), targetProductState.toReference(), targetCategoryReferencesWithIds, createRandomCategoryOrderHints(targetCategoryReferencesWithIds));
    CTP_TARGET_CLIENT.execute(ProductCreateCommand.of(existingProductDraft2)).toCompletableFuture().join();
    final ProductDraft existingProductDraft3 = createProductDraftBuilder(PRODUCT_KEY_2_RESOURCE_PATH, targetProductType.toReference()).slug(ofEnglish("newSlug3")).key("productKey3").masterVariant(ProductVariantDraftBuilder.of().key("v3").sku("s3").build()).taxCategory(null).state(null).categories(Collections.emptySet()).categoryOrderHints(null).build();
    CTP_TARGET_CLIENT.execute(ProductCreateCommand.of(existingProductDraft3)).toCompletableFuture().join();
    // Create 2 existing products in source project with keys (productKey2 and productKey3)
    final ProductDraft newProductDraft2 = createProductDraft(PRODUCT_KEY_2_RESOURCE_PATH, sourceProductType.toReference(), sourceTaxCategory.toReference(), sourceProductState.toReference(), sourceCategoryReferencesWithIds, createRandomCategoryOrderHints(sourceCategoryReferencesWithIds));
    final Product product2 = CTP_SOURCE_CLIENT.execute(ProductCreateCommand.of(newProductDraft2)).toCompletableFuture().join();
    final ProductDraft newProductDraft3 = createProductDraftBuilder(PRODUCT_KEY_2_RESOURCE_PATH, sourceProductType.toReference()).slug(ofEnglish("newSlug3")).key("productKey3").masterVariant(ProductVariantDraftBuilder.of().key("v3").sku("s3").build()).taxCategory(null).state(null).categories(Collections.emptySet()).categoryOrderHints(null).build();
    final Product product3 = CTP_SOURCE_CLIENT.execute(ProductCreateCommand.of(newProductDraft3)).toCompletableFuture().join();
    // Create existing product with productKey1 in source project that has references to products
    // with keys
    // (productKey2 and productKey3).
    final ObjectNode productReferenceValue1 = getProductReferenceWithId(product2.getId());
    final ObjectNode productReferenceValue2 = getProductReferenceWithId(product3.getId());
    final AttributeDraft productRefAttr = AttributeDraft.of("product-reference", productReferenceValue1);
    final AttributeDraft productSetRefAttr = getReferenceSetAttributeDraft("product-reference-set", productReferenceValue1, productReferenceValue2);
    final List<AttributeDraft> attributeDrafts = existingProductDraft.getMasterVariant().getAttributes();
    attributeDrafts.addAll(Arrays.asList(productRefAttr, productSetRefAttr));
    final ProductVariantDraft masterVariant = ProductVariantDraftBuilder.of().key("v1").sku("s1").attributes(attributeDrafts).build();
    final ProductDraft newProductDraftWithProductReference = createProductDraftBuilder(PRODUCT_KEY_1_CHANGED_RESOURCE_PATH, sourceProductType.toReference()).masterVariant(masterVariant).taxCategory(sourceTaxCategory.toReference()).state(sourceProductState.toReference()).categories(Collections.emptySet()).categoryOrderHints(null).build();
    CTP_SOURCE_CLIENT.execute(ProductCreateCommand.of(newProductDraftWithProductReference)).toCompletableFuture().join();
    // Test
    final List<ProductProjection> products = CTP_SOURCE_CLIENT.execute(ProductProjectionQuery.ofStaged()).toCompletableFuture().join().getResults();
    final List<ProductDraft> productDrafts = ProductTransformUtils.toProductDrafts(CTP_SOURCE_CLIENT, referenceIdToKeyCache, products).join();
    final ProductSyncStatistics syncStatistics = customSync.sync(productDrafts).toCompletableFuture().join();
    // Assertion
    assertThat(syncStatistics).hasValues(3, 0, 1, 0);
    assertThat(errorCallBackMessages).isEmpty();
    assertThat(errorCallBackExceptions).isEmpty();
    assertThat(warningCallBackMessages).isEmpty();
    final Product targetProduct2 = CTP_TARGET_CLIENT.execute(ProductByKeyGet.of("productKey2")).toCompletableFuture().join();
    final Product targetProduct3 = CTP_TARGET_CLIENT.execute(ProductByKeyGet.of("productKey3")).toCompletableFuture().join();
    final ObjectNode targetProductReferenceValue2 = getProductReferenceWithId(targetProduct2.getId());
    final ObjectNode targetProductReferenceValue3 = getProductReferenceWithId(targetProduct3.getId());
    final AttributeDraft targetProductRefAttr = AttributeDraft.of("product-reference", targetProductReferenceValue2);
    final AttributeDraft targetProductSetRefAttr = getReferenceSetAttributeDraft("product-reference-set", targetProductReferenceValue2, targetProductReferenceValue3);
    assertThat(updateActions).containsExactlyInAnyOrder(SetAttributeInAllVariants.of(targetProductRefAttr.getName(), targetProductRefAttr.getValue(), true), SetAttributeInAllVariants.of(targetProductSetRefAttr.getName(), targetProductSetRefAttr.getValue(), true), Publish.of());
}
Also used : ProductProjectionQuery(io.sphere.sdk.products.queries.ProductProjectionQuery) BeforeEach(org.junit.jupiter.api.BeforeEach) Arrays(java.util.Arrays) SUPPLY_CHANNEL_KEY_1(com.commercetools.sync.integration.inventories.utils.InventoryITUtils.SUPPLY_CHANNEL_KEY_1) Reference(io.sphere.sdk.models.Reference) ProductVariantDraft(io.sphere.sdk.products.ProductVariantDraft) CTP_SOURCE_CLIENT(com.commercetools.sync.integration.commons.utils.SphereClientUtils.CTP_SOURCE_CLIENT) PRODUCT_KEY_2_RESOURCE_PATH(com.commercetools.sync.products.ProductSyncMockUtils.PRODUCT_KEY_2_RESOURCE_PATH) PRODUCT_TYPE_RESOURCE_PATH(com.commercetools.sync.products.ProductSyncMockUtils.PRODUCT_TYPE_RESOURCE_PATH) StateITUtils.createState(com.commercetools.sync.integration.commons.utils.StateITUtils.createState) ProductITUtils.createPricesCustomType(com.commercetools.sync.integration.commons.utils.ProductITUtils.createPricesCustomType) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) CategoryITUtils.getCategoryDrafts(com.commercetools.sync.integration.commons.utils.CategoryITUtils.getCategoryDrafts) PRODUCT_KEY_1_CHANGED_WITH_PRICES_RESOURCE_PATH(com.commercetools.sync.products.ProductSyncMockUtils.PRODUCT_KEY_1_CHANGED_WITH_PRICES_RESOURCE_PATH) TaxCategoryITUtils.createTaxCategory(com.commercetools.sync.integration.commons.utils.TaxCategoryITUtils.createTaxCategory) ProductSyncMockUtils.createProductDraftBuilder(com.commercetools.sync.products.ProductSyncMockUtils.createProductDraftBuilder) UpdateAction(io.sphere.sdk.commands.UpdateAction) Channel(io.sphere.sdk.channels.Channel) Collections.singletonList(java.util.Collections.singletonList) ProductITUtils.deleteProductSyncTestData(com.commercetools.sync.integration.commons.utils.ProductITUtils.deleteProductSyncTestData) AfterAll(org.junit.jupiter.api.AfterAll) ReferenceIdToKeyCache(com.commercetools.sync.commons.utils.ReferenceIdToKeyCache) BeforeAll(org.junit.jupiter.api.BeforeAll) Locale(java.util.Locale) OLD_CATEGORY_CUSTOM_TYPE_NAME(com.commercetools.sync.integration.commons.utils.CategoryITUtils.OLD_CATEGORY_CUSTOM_TYPE_NAME) StateType(io.sphere.sdk.states.StateType) ProductDraft(io.sphere.sdk.products.ProductDraft) ProductProjection(io.sphere.sdk.products.ProductProjection) ProductITUtils.getDraftWithPriceReferences(com.commercetools.sync.integration.commons.utils.ProductITUtils.getDraftWithPriceReferences) PRODUCT_KEY_1_RESOURCE_PATH(com.commercetools.sync.products.ProductSyncMockUtils.PRODUCT_KEY_1_RESOURCE_PATH) ENGLISH(java.util.Locale.ENGLISH) OLD_CATEGORY_CUSTOM_TYPE_KEY(com.commercetools.sync.integration.commons.utils.CategoryITUtils.OLD_CATEGORY_CUSTOM_TYPE_KEY) ProductTypeITUtils.createProductType(com.commercetools.sync.integration.commons.utils.ProductTypeITUtils.createProductType) Collections.emptyList(java.util.Collections.emptyList) Category(io.sphere.sdk.categories.Category) SetAttributeInAllVariants(io.sphere.sdk.products.commands.updateactions.SetAttributeInAllVariants) Product(io.sphere.sdk.products.Product) PRODUCT_KEY_1_CHANGED_ATTRIBUTES_RESOURCE_PATH(com.commercetools.sync.products.ProductSyncMockUtils.PRODUCT_KEY_1_CHANGED_ATTRIBUTES_RESOURCE_PATH) CategoryITUtils.getReferencesWithIds(com.commercetools.sync.integration.commons.utils.CategoryITUtils.getReferencesWithIds) State(io.sphere.sdk.states.State) Test(org.junit.jupiter.api.Test) ProductSyncMockUtils.getReferenceSetAttributeDraft(com.commercetools.sync.products.ProductSyncMockUtils.getReferenceSetAttributeDraft) List(java.util.List) LocalizedString.ofEnglish(io.sphere.sdk.models.LocalizedString.ofEnglish) ProductSyncStatistics(com.commercetools.sync.products.helpers.ProductSyncStatistics) ProductSyncOptionsBuilder(com.commercetools.sync.products.ProductSyncOptionsBuilder) JsonNodeFactory(com.fasterxml.jackson.databind.node.JsonNodeFactory) Publish(io.sphere.sdk.products.commands.updateactions.Publish) ProductSyncMockUtils.createProductDraft(com.commercetools.sync.products.ProductSyncMockUtils.createProductDraft) ChannelCreateCommand(io.sphere.sdk.channels.commands.ChannelCreateCommand) ProductCreateCommand(io.sphere.sdk.products.commands.ProductCreateCommand) ChannelDraft(io.sphere.sdk.channels.ChannelDraft) CTP_TARGET_CLIENT(com.commercetools.sync.integration.commons.utils.SphereClientUtils.CTP_TARGET_CLIENT) ProductSyncOptions(com.commercetools.sync.products.ProductSyncOptions) TaxCategory(io.sphere.sdk.taxcategories.TaxCategory) CategoryITUtils.createCategories(com.commercetools.sync.integration.commons.utils.CategoryITUtils.createCategories) ProductByKeyGet(io.sphere.sdk.products.queries.ProductByKeyGet) ProductType(io.sphere.sdk.producttypes.ProductType) AssertionsForStatistics.assertThat(com.commercetools.sync.commons.asserts.statistics.AssertionsForStatistics.assertThat) ProductITUtils.deleteAllProducts(com.commercetools.sync.integration.commons.utils.ProductITUtils.deleteAllProducts) ObjectNode(com.fasterxml.jackson.databind.node.ObjectNode) ArrayList(java.util.ArrayList) SyncFilter(com.commercetools.sync.products.SyncFilter) ProductTransformUtils(com.commercetools.sync.products.utils.ProductTransformUtils) Attribute(io.sphere.sdk.products.attributes.Attribute) ATTRIBUTES(com.commercetools.sync.products.ActionGroup.ATTRIBUTES) ProductSync(com.commercetools.sync.products.ProductSync) ProductDraftBuilder(io.sphere.sdk.products.ProductDraftBuilder) SetAttribute(io.sphere.sdk.products.commands.updateactions.SetAttribute) Nonnull(javax.annotation.Nonnull) Nullable(javax.annotation.Nullable) Collections.emptyMap(java.util.Collections.emptyMap) CaffeineReferenceIdToKeyCacheImpl(com.commercetools.sync.commons.utils.CaffeineReferenceIdToKeyCacheImpl) PRODUCT_KEY_1_WITH_PRICES_RESOURCE_PATH(com.commercetools.sync.products.ProductSyncMockUtils.PRODUCT_KEY_1_WITH_PRICES_RESOURCE_PATH) PRODUCT_KEY_1_CHANGED_RESOURCE_PATH(com.commercetools.sync.products.ProductSyncMockUtils.PRODUCT_KEY_1_CHANGED_RESOURCE_PATH) CategoryITUtils.createCategoriesCustomType(com.commercetools.sync.integration.commons.utils.CategoryITUtils.createCategoriesCustomType) CustomFieldsDraft(io.sphere.sdk.types.CustomFieldsDraft) AttributeDraft(io.sphere.sdk.products.attributes.AttributeDraft) ProductSyncMockUtils.getProductReferenceWithId(com.commercetools.sync.products.ProductSyncMockUtils.getProductReferenceWithId) ProductSyncMockUtils.createRandomCategoryOrderHints(com.commercetools.sync.products.ProductSyncMockUtils.createRandomCategoryOrderHints) Collections(java.util.Collections) ProductVariantDraftBuilder(io.sphere.sdk.products.ProductVariantDraftBuilder) Type(io.sphere.sdk.types.Type) ObjectNode(com.fasterxml.jackson.databind.node.ObjectNode) ProductSyncMockUtils.getReferenceSetAttributeDraft(com.commercetools.sync.products.ProductSyncMockUtils.getReferenceSetAttributeDraft) AttributeDraft(io.sphere.sdk.products.attributes.AttributeDraft) Product(io.sphere.sdk.products.Product) ProductVariantDraft(io.sphere.sdk.products.ProductVariantDraft) ProductSync(com.commercetools.sync.products.ProductSync) ProductSyncStatistics(com.commercetools.sync.products.helpers.ProductSyncStatistics) ProductProjection(io.sphere.sdk.products.ProductProjection) ProductDraft(io.sphere.sdk.products.ProductDraft) ProductSyncMockUtils.createProductDraft(com.commercetools.sync.products.ProductSyncMockUtils.createProductDraft) ProductSyncOptions(com.commercetools.sync.products.ProductSyncOptions) Test(org.junit.jupiter.api.Test)

Example 2 with SyncFilter

use of com.commercetools.sync.products.SyncFilter in project commercetools-sync-java by commercetools.

the class ProductUpdateActionUtilsTest method buildVariantsUpdateActions_doesNotRemoveMaster.

@Test
void buildVariantsUpdateActions_doesNotRemoveMaster() {
    final ProductProjection productOld = createProductFromJson(OLD_PROD_WITH_VARIANTS);
    final ProductDraft productDraftNew = createProductDraftFromJson(NEW_PROD_DRAFT_WITH_VARIANTS_MOVE_MASTER);
    final ProductSyncOptions productSyncOptions = ProductSyncOptionsBuilder.of(mock(SphereClient.class)).syncFilter(SyncFilter.of()).build();
    final Map<String, AttributeMetaData> attributesMetaData = new HashMap<>();
    final AttributeMetaData priceInfo = AttributeMetaData.of(AttributeDefinitionBuilder.of("priceInfo", null, null).build());
    attributesMetaData.put("priceInfo", priceInfo);
    final List<UpdateAction<Product>> updateActions = buildVariantsUpdateActions(productOld, productDraftNew, productSyncOptions, attributesMetaData);
    // check remove variants are the first in the list, but not the master variant
    assertThat(updateActions.subList(0, 3)).containsExactlyInAnyOrder(RemoveVariant.ofVariantId(2, true), RemoveVariant.ofVariantId(3, true), RemoveVariant.ofVariantId(4, true));
    // change master variant must be always after variants are added/updated,
    // because it is set by SKU and we should be sure the master variant is already added and SKUs
    // are actual.
    assertThat(updateActions).endsWith(ChangeMasterVariant.ofSku("var-7-sku", true));
    // Old master variant should NOT be removed because it exists in
    // NEW_PROD_DRAFT_WITH_VARIANTS_MOVE_MASTER
    final ProductVariant oldMasterVariant = productOld.getMasterVariant();
    assertThat(updateActions).filteredOn(action -> {
        // verify old master variant is not removed
        if (action instanceof RemoveVariant) {
            RemoveVariant removeVariantAction = (RemoveVariant) action;
            return Objects.equals(oldMasterVariant.getId(), removeVariantAction.getId()) || Objects.equals(oldMasterVariant.getSku(), removeVariantAction.getSku());
        }
        return false;
    }).isEmpty();
}
Also used : ProductVariant(io.sphere.sdk.products.ProductVariant) ProductVariantDraft(io.sphere.sdk.products.ProductVariantDraft) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) ProductUpdateActionUtils.getAllVariants(com.commercetools.sync.products.utils.ProductUpdateActionUtils.getAllVariants) UpdateAction(io.sphere.sdk.commands.UpdateAction) Collections.singletonList(java.util.Collections.singletonList) BLANK_NEW_MASTER_VARIANT_KEY(com.commercetools.sync.products.utils.ProductUpdateActionUtils.BLANK_NEW_MASTER_VARIANT_KEY) Arrays.asList(java.util.Arrays.asList) Map(java.util.Map) SphereClient(io.sphere.sdk.client.SphereClient) AddVariant(io.sphere.sdk.products.commands.updateactions.AddVariant) SetSku(io.sphere.sdk.products.commands.updateactions.SetSku) ProductDraft(io.sphere.sdk.products.ProductDraft) ProductProjection(io.sphere.sdk.products.ProductProjection) ChangeMasterVariant(io.sphere.sdk.products.commands.updateactions.ChangeMasterVariant) AssetDraft(io.sphere.sdk.models.AssetDraft) AssetDraftBuilder(io.sphere.sdk.models.AssetDraftBuilder) Collections.emptyList(java.util.Collections.emptyList) SetAttributeInAllVariants(io.sphere.sdk.products.commands.updateactions.SetAttributeInAllVariants) ProductSyncMockUtils.createProductDraftFromJson(com.commercetools.sync.products.ProductSyncMockUtils.createProductDraftFromJson) AttributeMetaData(com.commercetools.sync.products.AttributeMetaData) Product(io.sphere.sdk.products.Product) Objects(java.util.Objects) Test(org.junit.jupiter.api.Test) List(java.util.List) LocalizedString.ofEnglish(io.sphere.sdk.models.LocalizedString.ofEnglish) ProductSyncOptionsBuilder(com.commercetools.sync.products.ProductSyncOptionsBuilder) AttributeConstraint(io.sphere.sdk.products.attributes.AttributeConstraint) ProductSyncOptions(com.commercetools.sync.products.ProductSyncOptions) Mockito.mock(org.mockito.Mockito.mock) IntStream(java.util.stream.IntStream) AddExternalImage(io.sphere.sdk.products.commands.updateactions.AddExternalImage) ProductType(io.sphere.sdk.producttypes.ProductType) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) BLANK_NEW_MASTER_VARIANT_SKU(com.commercetools.sync.products.utils.ProductUpdateActionUtils.BLANK_NEW_MASTER_VARIANT_SKU) SyncFilter(com.commercetools.sync.products.SyncFilter) Image(io.sphere.sdk.products.Image) ProductUpdateActionUtils.buildChangeMasterVariantUpdateAction(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildChangeMasterVariantUpdateAction) ProductDraftBuilder(io.sphere.sdk.products.ProductDraftBuilder) SetAttribute(io.sphere.sdk.products.commands.updateactions.SetAttribute) ProductSyncMockUtils.createProductFromJson(com.commercetools.sync.products.ProductSyncMockUtils.createProductFromJson) AttributeDefinitionBuilder(io.sphere.sdk.products.attributes.AttributeDefinitionBuilder) Collections.emptyMap(java.util.Collections.emptyMap) RemoveImage(io.sphere.sdk.products.commands.updateactions.RemoveImage) AssetSourceBuilder(io.sphere.sdk.models.AssetSourceBuilder) BLANK_OLD_MASTER_VARIANT_KEY(com.commercetools.sync.products.utils.ProductUpdateActionUtils.BLANK_OLD_MASTER_VARIANT_KEY) RemoveVariant(io.sphere.sdk.products.commands.updateactions.RemoveVariant) PriceDraft(io.sphere.sdk.products.PriceDraft) Collectors.toList(java.util.stream.Collectors.toList) AttributeDraft(io.sphere.sdk.products.attributes.AttributeDraft) ProductUpdateActionUtils.buildAddVariantUpdateActionFromDraft(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildAddVariantUpdateActionFromDraft) ProductUpdateActionUtils.buildVariantsUpdateActions(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildVariantsUpdateActions) ProductVariantDraftBuilder(io.sphere.sdk.products.ProductVariantDraftBuilder) AttributeMetaData(com.commercetools.sync.products.AttributeMetaData) HashMap(java.util.HashMap) UpdateAction(io.sphere.sdk.commands.UpdateAction) ProductUpdateActionUtils.buildChangeMasterVariantUpdateAction(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildChangeMasterVariantUpdateAction) ProductProjection(io.sphere.sdk.products.ProductProjection) ProductDraft(io.sphere.sdk.products.ProductDraft) SphereClient(io.sphere.sdk.client.SphereClient) ProductSyncOptions(com.commercetools.sync.products.ProductSyncOptions) ProductVariant(io.sphere.sdk.products.ProductVariant) RemoveVariant(io.sphere.sdk.products.commands.updateactions.RemoveVariant) Test(org.junit.jupiter.api.Test)

Example 3 with SyncFilter

use of com.commercetools.sync.products.SyncFilter in project commercetools-sync-java by commercetools.

the class ProductUpdateActionUtils method collectAllVariantUpdateActions.

@Nonnull
private static List<UpdateAction<Product>> collectAllVariantUpdateActions(@Nonnull final List<UpdateAction<Product>> sameForAllUpdateActions, @Nonnull final ProductProjection oldProduct, @Nonnull final ProductDraft newProduct, @Nonnull final ProductVariant oldProductVariant, @Nonnull final ProductVariantDraft newProductVariant, @Nonnull final Map<String, AttributeMetaData> attributesMetaData, @Nonnull final ProductSyncOptions syncOptions) {
    final ArrayList<UpdateAction<Product>> updateActions = new ArrayList<>();
    final SyncFilter syncFilter = syncOptions.getSyncFilter();
    updateActions.addAll(buildActionsIfPassesFilter(syncFilter, ATTRIBUTES, () -> emptyIfNull(buildProductVariantAttributesUpdateActions(oldProduct, newProduct, oldProductVariant, newProductVariant, attributesMetaData, syncOptions)).stream().filter(collectedUpdateAction -> hasDuplicateSameForAllAction(sameForAllUpdateActions, collectedUpdateAction)).collect(Collectors.toList())));
    updateActions.addAll(buildActionsIfPassesFilter(syncFilter, IMAGES, () -> buildProductVariantImagesUpdateActions(oldProductVariant, newProductVariant)));
    updateActions.addAll(buildActionsIfPassesFilter(syncFilter, PRICES, () -> buildProductVariantPricesUpdateActions(oldProduct, newProduct, oldProductVariant, newProductVariant, syncOptions)));
    updateActions.addAll(buildActionsIfPassesFilter(syncFilter, ASSETS, () -> buildProductVariantAssetsUpdateActions(oldProduct, newProduct, oldProductVariant, newProductVariant, syncOptions)));
    buildActionIfPassesFilter(syncFilter, SKU, () -> buildProductVariantSkuUpdateAction(oldProductVariant, newProductVariant)).ifPresent(updateActions::add);
    return updateActions;
}
Also used : ProductVariant(io.sphere.sdk.products.ProductVariant) AddToCategory(io.sphere.sdk.products.commands.updateactions.AddToCategory) SKU(com.commercetools.sync.products.ActionGroup.SKU) Reference(io.sphere.sdk.models.Reference) ProductVariantDraft(io.sphere.sdk.products.ProductVariantDraft) SyncException(com.commercetools.sync.commons.exceptions.SyncException) CommonTypeUpdateActionUtils.buildUpdateActionForReferences(com.commercetools.sync.commons.utils.CommonTypeUpdateActionUtils.buildUpdateActionForReferences) SetCategoryOrderHint(io.sphere.sdk.products.commands.updateactions.SetCategoryOrderHint) UpdateAction(io.sphere.sdk.commands.UpdateAction) SearchKeywords(io.sphere.sdk.search.SearchKeywords) BaseSyncOptions(com.commercetools.sync.commons.BaseSyncOptions) ProductVariantUpdateActionUtils.buildProductVariantImagesUpdateActions(com.commercetools.sync.products.utils.ProductVariantUpdateActionUtils.buildProductVariantImagesUpdateActions) Collections.singletonList(java.util.Collections.singletonList) ChangeName(io.sphere.sdk.products.commands.updateactions.ChangeName) SetTaxCategory(io.sphere.sdk.products.commands.updateactions.SetTaxCategory) UnorderedCollectionSyncUtils.buildRemoveUpdateActions(com.commercetools.sync.internals.utils.UnorderedCollectionSyncUtils.buildRemoveUpdateActions) Map(java.util.Map) PRICES(com.commercetools.sync.products.ActionGroup.PRICES) AddVariant(io.sphere.sdk.products.commands.updateactions.AddVariant) ProductDraft(io.sphere.sdk.products.ProductDraft) ProductProjection(io.sphere.sdk.products.ProductProjection) ChangeMasterVariant(io.sphere.sdk.products.commands.updateactions.ChangeMasterVariant) Collectors.toSet(java.util.stream.Collectors.toSet) ProductVariantUpdateActionUtils.buildProductVariantAttributesUpdateActions(com.commercetools.sync.products.utils.ProductVariantUpdateActionUtils.buildProductVariantAttributesUpdateActions) Collections.emptyList(java.util.Collections.emptyList) Category(io.sphere.sdk.categories.Category) SetAttributeInAllVariants(io.sphere.sdk.products.commands.updateactions.SetAttributeInAllVariants) Set(java.util.Set) ActionGroup(com.commercetools.sync.products.ActionGroup) AttributeMetaData(com.commercetools.sync.products.AttributeMetaData) Product(io.sphere.sdk.products.Product) CommonTypeUpdateActionUtils.areResourceIdentifiersEqual(com.commercetools.sync.commons.utils.CommonTypeUpdateActionUtils.areResourceIdentifiersEqual) State(io.sphere.sdk.states.State) Collectors(java.util.stream.Collectors) String.format(java.lang.String.format) ChangeSlug(io.sphere.sdk.products.commands.updateactions.ChangeSlug) FilterUtils.executeSupplierIfPassesFilter(com.commercetools.sync.commons.utils.FilterUtils.executeSupplierIfPassesFilter) Objects(java.util.Objects) LocalizedString(io.sphere.sdk.models.LocalizedString) IMAGES(com.commercetools.sync.products.ActionGroup.IMAGES) List(java.util.List) Publish(io.sphere.sdk.products.commands.updateactions.Publish) Optional(java.util.Optional) Objects.nonNull(java.util.Objects.nonNull) ProductSyncOptions(com.commercetools.sync.products.ProductSyncOptions) ResourceIdentifier(io.sphere.sdk.models.ResourceIdentifier) CategoryOrderHints(io.sphere.sdk.products.CategoryOrderHints) SetMetaKeywords(io.sphere.sdk.products.commands.updateactions.SetMetaKeywords) SetSearchKeywords(io.sphere.sdk.products.commands.updateactions.SetSearchKeywords) CollectionUtils.collectionToMap(com.commercetools.sync.commons.utils.CollectionUtils.collectionToMap) SetMetaTitle(io.sphere.sdk.products.commands.updateactions.SetMetaTitle) HashMap(java.util.HashMap) Supplier(java.util.function.Supplier) ArrayList(java.util.ArrayList) SetDescription(io.sphere.sdk.products.commands.updateactions.SetDescription) TransitionState(io.sphere.sdk.products.commands.updateactions.TransitionState) SyncFilter(com.commercetools.sync.products.SyncFilter) CollectionUtils.emptyIfNull(com.commercetools.sync.commons.utils.CollectionUtils.emptyIfNull) ATTRIBUTES(com.commercetools.sync.products.ActionGroup.ATTRIBUTES) ProductVariantUpdateActionUtils.buildProductVariantSkuUpdateAction(com.commercetools.sync.products.utils.ProductVariantUpdateActionUtils.buildProductVariantSkuUpdateAction) CollectionUtils.filterCollection(com.commercetools.sync.commons.utils.CollectionUtils.filterCollection) SetMetaDescription(io.sphere.sdk.products.commands.updateactions.SetMetaDescription) Unpublish(io.sphere.sdk.products.commands.updateactions.Unpublish) Nonnull(javax.annotation.Nonnull) Collections.emptyMap(java.util.Collections.emptyMap) Optional.ofNullable(java.util.Optional.ofNullable) ProductVariantUpdateActionUtils.buildProductVariantPricesUpdateActions(com.commercetools.sync.products.utils.ProductVariantUpdateActionUtils.buildProductVariantPricesUpdateActions) ASSETS(com.commercetools.sync.products.ActionGroup.ASSETS) RemoveVariant(io.sphere.sdk.products.commands.updateactions.RemoveVariant) Collectors.toList(java.util.stream.Collectors.toList) StringUtils.isBlank(org.apache.commons.lang3.StringUtils.isBlank) CommonTypeUpdateActionUtils.buildUpdateActions(com.commercetools.sync.commons.utils.CommonTypeUpdateActionUtils.buildUpdateActions) BooleanUtils.toBoolean(org.apache.commons.lang3.BooleanUtils.toBoolean) CommonTypeUpdateActionUtils.buildUpdateAction(com.commercetools.sync.commons.utils.CommonTypeUpdateActionUtils.buildUpdateAction) ProductVariantUpdateActionUtils.buildProductVariantAssetsUpdateActions(com.commercetools.sync.products.utils.ProductVariantUpdateActionUtils.buildProductVariantAssetsUpdateActions) RemoveFromCategory(io.sphere.sdk.products.commands.updateactions.RemoveFromCategory) Collections(java.util.Collections) Referenceable(io.sphere.sdk.models.Referenceable) ResourceImpl(io.sphere.sdk.models.ResourceImpl) SyncFilter(com.commercetools.sync.products.SyncFilter) UpdateAction(io.sphere.sdk.commands.UpdateAction) ProductVariantUpdateActionUtils.buildProductVariantSkuUpdateAction(com.commercetools.sync.products.utils.ProductVariantUpdateActionUtils.buildProductVariantSkuUpdateAction) CommonTypeUpdateActionUtils.buildUpdateAction(com.commercetools.sync.commons.utils.CommonTypeUpdateActionUtils.buildUpdateAction) ArrayList(java.util.ArrayList) Nonnull(javax.annotation.Nonnull)

Example 4 with SyncFilter

use of com.commercetools.sync.products.SyncFilter in project commercetools-sync-java by commercetools.

the class ProductSyncUtils method buildActions.

/**
 * Compares all the fields (including the variants see {@link
 * ProductUpdateActionUtils#buildVariantsUpdateActions(ProductProjection, ProductDraft,
 * ProductSyncOptions, Map)}) of a {@link ProductProjection} and a {@link ProductDraft}, given
 * that each of these fields pass the specified {@link SyncFilter}. It returns a {@link List} of
 * {@link UpdateAction}&lt;{@link Product}&gt; as a result. If no update action is needed, for
 * example in case where both the {@link ProductProjection} and the {@link ProductDraft} have the
 * same names, an empty {@link List} is returned. Then it applies a specified filter function in
 * the {@link ProductSyncOptions} instance on the resultant list and returns this result.
 *
 * @param oldProduct the productprojection which should be updated.
 * @param newProduct the product draft where we get the new data.
 * @param syncOptions the sync options wrapper which contains options related to the sync process
 *     supplied by the user. For example, custom callbacks to call in case of warnings or errors
 *     occurring on the build update action process. And other options (See {@link
 *     ProductSyncOptions} for more info).
 * @param attributesMetaData a map of attribute name -&gt; {@link AttributeMetaData}; which
 *     defines each attribute's information: its name and whether it has the constraint
 *     "SameForAll" or not.
 * @return A list of product-specific update actions.
 */
@Nonnull
public static List<UpdateAction<Product>> buildActions(@Nonnull final ProductProjection oldProduct, @Nonnull final ProductDraft newProduct, @Nonnull final ProductSyncOptions syncOptions, @Nonnull final Map<String, AttributeMetaData> attributesMetaData) {
    final SyncFilter syncFilter = syncOptions.getSyncFilter();
    final List<UpdateAction<Product>> updateActions = new ArrayList<>(filterEmptyOptionals(buildActionIfPassesFilter(syncFilter, ActionGroup.NAME, () -> buildChangeNameUpdateAction(oldProduct, newProduct)), buildActionIfPassesFilter(syncFilter, ActionGroup.DESCRIPTION, () -> buildSetDescriptionUpdateAction(oldProduct, newProduct)), buildActionIfPassesFilter(syncFilter, ActionGroup.SLUG, () -> buildChangeSlugUpdateAction(oldProduct, newProduct)), buildActionIfPassesFilter(syncFilter, ActionGroup.SEARCHKEYWORDS, () -> buildSetSearchKeywordsUpdateAction(oldProduct, newProduct)), buildActionIfPassesFilter(syncFilter, ActionGroup.METATITLE, () -> buildSetMetaTitleUpdateAction(oldProduct, newProduct)), buildActionIfPassesFilter(syncFilter, ActionGroup.METADESCRIPTION, () -> buildSetMetaDescriptionUpdateAction(oldProduct, newProduct)), buildActionIfPassesFilter(syncFilter, ActionGroup.METAKEYWORDS, () -> buildSetMetaKeywordsUpdateAction(oldProduct, newProduct)), buildActionIfPassesFilter(syncFilter, ActionGroup.TAXCATEGORY, () -> buildSetTaxCategoryUpdateAction(oldProduct, newProduct).map(action -> (UpdateAction<Product>) action)), buildActionIfPassesFilter(syncFilter, ActionGroup.STATE, () -> buildTransitionStateUpdateAction(oldProduct, newProduct).map(action -> (UpdateAction<Product>) action))));
    final List<UpdateAction<Product>> productCategoryUpdateActions = buildActionsIfPassesFilter(syncFilter, ActionGroup.CATEGORIES, () -> buildCategoryActions(oldProduct, newProduct));
    updateActions.addAll(productCategoryUpdateActions);
    updateActions.addAll(buildVariantsUpdateActions(oldProduct, newProduct, syncOptions, attributesMetaData));
    // lastly publish/unpublish product
    final boolean hasNewUpdateActions = updateActions.size() > 0;
    buildPublishOrUnpublishUpdateAction(oldProduct, newProduct, hasNewUpdateActions).ifPresent(updateActions::add);
    return prioritizeUpdateActions(updateActions, oldProduct.getMasterVariant().getId());
}
Also used : ProductUpdateActionUtils.buildSetMetaDescriptionUpdateAction(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildSetMetaDescriptionUpdateAction) UpdateAction(io.sphere.sdk.commands.UpdateAction) ProductUpdateActionUtils.buildSetSearchKeywordsUpdateAction(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildSetSearchKeywordsUpdateAction) ProductUpdateActionUtils.buildActionIfPassesFilter(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildActionIfPassesFilter) ProductUpdateActionUtils.buildChangeSlugUpdateAction(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildChangeSlugUpdateAction) ProductUpdateActionUtils.buildSetCategoryOrderHintUpdateActions(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildSetCategoryOrderHintUpdateActions) ArrayList(java.util.ArrayList) SyncFilter(com.commercetools.sync.products.SyncFilter) ProductUpdateActionUtils.buildPublishOrUnpublishUpdateAction(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildPublishOrUnpublishUpdateAction) CollectionUtils.emptyIfNull(com.commercetools.sync.commons.utils.CollectionUtils.emptyIfNull) ProductUpdateActionUtils.buildAddToCategoryUpdateActions(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildAddToCategoryUpdateActions) Map(java.util.Map) ProductUpdateActionUtils.buildSetTaxCategoryUpdateAction(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildSetTaxCategoryUpdateAction) ProductDraft(io.sphere.sdk.products.ProductDraft) ProductProjection(io.sphere.sdk.products.ProductProjection) Nonnull(javax.annotation.Nonnull) ProductUpdateActionUtils.buildChangeNameUpdateAction(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildChangeNameUpdateAction) Predicate(java.util.function.Predicate) ProductUpdateActionUtils.buildSetMetaKeywordsUpdateAction(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildSetMetaKeywordsUpdateAction) ProductUpdateActionUtils.buildSetDescriptionUpdateAction(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildSetDescriptionUpdateAction) RemoveVariant(io.sphere.sdk.products.commands.updateactions.RemoveVariant) ActionGroup(com.commercetools.sync.products.ActionGroup) AttributeMetaData(com.commercetools.sync.products.AttributeMetaData) Product(io.sphere.sdk.products.Product) Collectors(java.util.stream.Collectors) ProductUpdateActionUtils.buildActionsIfPassesFilter(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildActionsIfPassesFilter) List(java.util.List) ProductUpdateActionUtils.buildRemoveFromCategoryUpdateActions(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildRemoveFromCategoryUpdateActions) OptionalUtils.filterEmptyOptionals(com.commercetools.sync.commons.utils.OptionalUtils.filterEmptyOptionals) ProductUpdateActionUtils.buildSetMetaTitleUpdateAction(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildSetMetaTitleUpdateAction) ProductUpdateActionUtils.buildVariantsUpdateActions(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildVariantsUpdateActions) ProductUpdateActionUtils.buildTransitionStateUpdateAction(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildTransitionStateUpdateAction) ProductSyncOptions(com.commercetools.sync.products.ProductSyncOptions) SyncFilter(com.commercetools.sync.products.SyncFilter) ProductUpdateActionUtils.buildSetMetaDescriptionUpdateAction(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildSetMetaDescriptionUpdateAction) UpdateAction(io.sphere.sdk.commands.UpdateAction) ProductUpdateActionUtils.buildSetSearchKeywordsUpdateAction(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildSetSearchKeywordsUpdateAction) ProductUpdateActionUtils.buildChangeSlugUpdateAction(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildChangeSlugUpdateAction) ProductUpdateActionUtils.buildPublishOrUnpublishUpdateAction(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildPublishOrUnpublishUpdateAction) ProductUpdateActionUtils.buildSetTaxCategoryUpdateAction(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildSetTaxCategoryUpdateAction) ProductUpdateActionUtils.buildChangeNameUpdateAction(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildChangeNameUpdateAction) ProductUpdateActionUtils.buildSetMetaKeywordsUpdateAction(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildSetMetaKeywordsUpdateAction) ProductUpdateActionUtils.buildSetDescriptionUpdateAction(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildSetDescriptionUpdateAction) ProductUpdateActionUtils.buildSetMetaTitleUpdateAction(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildSetMetaTitleUpdateAction) ProductUpdateActionUtils.buildTransitionStateUpdateAction(com.commercetools.sync.products.utils.ProductUpdateActionUtils.buildTransitionStateUpdateAction) ArrayList(java.util.ArrayList) Nonnull(javax.annotation.Nonnull)

Example 5 with SyncFilter

use of com.commercetools.sync.products.SyncFilter in project commercetools-sync-java by commercetools.

the class FilterUtilsTest method executeSupplierIfPassesFilter_WithGroupInWhiteList_ShouldFilterInOnlyThisGroup.

@Test
void executeSupplierIfPassesFilter_WithGroupInWhiteList_ShouldFilterInOnlyThisGroup() {
    final SyncFilter syncFilter = SyncFilter.ofWhiteList(PRICES);
    final List<UpdateAction<Product>> updateActionsAfterPricesFilter = executeSupplierIfPassesFilter(syncFilter, PRICES, () -> passingUpdateActions, () -> defaultActions);
    assertThat(updateActionsAfterPricesFilter).hasSize(2);
    assertThat(updateActionsAfterPricesFilter).isSameAs(passingUpdateActions);
    final List<UpdateAction<Product>> updateActionsAfterImagesFilter = executeSupplierIfPassesFilter(syncFilter, IMAGES, () -> passingUpdateActions, () -> defaultActions);
    assertThat(updateActionsAfterImagesFilter).hasSize(1);
    assertThat(updateActionsAfterImagesFilter).isSameAs(defaultActions);
    final List<UpdateAction<Product>> updateActionsAfterCategoriesFilter = executeSupplierIfPassesFilter(syncFilter, CATEGORIES, () -> passingUpdateActions, () -> defaultActions);
    assertThat(updateActionsAfterCategoriesFilter).hasSize(1);
    assertThat(updateActionsAfterCategoriesFilter).isSameAs(defaultActions);
}
Also used : SyncFilter(com.commercetools.sync.products.SyncFilter) UpdateAction(io.sphere.sdk.commands.UpdateAction) Test(org.junit.jupiter.api.Test)

Aggregations

SyncFilter (com.commercetools.sync.products.SyncFilter)9 UpdateAction (io.sphere.sdk.commands.UpdateAction)8 Test (org.junit.jupiter.api.Test)6 ProductSyncOptions (com.commercetools.sync.products.ProductSyncOptions)5 Product (io.sphere.sdk.products.Product)4 ProductDraft (io.sphere.sdk.products.ProductDraft)4 ProductProjection (io.sphere.sdk.products.ProductProjection)4 ArrayList (java.util.ArrayList)4 List (java.util.List)4 ATTRIBUTES (com.commercetools.sync.products.ActionGroup.ATTRIBUTES)3 AttributeMetaData (com.commercetools.sync.products.AttributeMetaData)3 ProductSyncOptionsBuilder (com.commercetools.sync.products.ProductSyncOptionsBuilder)3 ProductVariantDraft (io.sphere.sdk.products.ProductVariantDraft)3 RemoveVariant (io.sphere.sdk.products.commands.updateactions.RemoveVariant)3 SetAttributeInAllVariants (io.sphere.sdk.products.commands.updateactions.SetAttributeInAllVariants)3 Collections.emptyList (java.util.Collections.emptyList)3 Collections.emptyMap (java.util.Collections.emptyMap)3 Collections.singletonList (java.util.Collections.singletonList)3 Map (java.util.Map)3 Nonnull (javax.annotation.Nonnull)3