Class DefaultCartItemConfigurationService<P extends Product>

java.lang.Object
com.broadleafcommerce.cartoperation.service.configuration.DefaultCartItemConfigurationService<P>
All Implemented Interfaces:
CartItemConfigurationService<P>

public class DefaultCartItemConfigurationService<P extends Product> extends Object implements CartItemConfigurationService<P>
Author:
Chad Harchar (charchar)
  • Constructor Details

  • Method Details

    • getCatalogProvider

      @Deprecated protected CatalogProvider<? extends CatalogItem> getCatalogProvider()
      Deprecated.
      This implementation does not use catalogProvider
      Access or catalogProvider.
      Returns:
      The configured catalogProvider
    • cartItemHasQuantityThresholds

      public boolean cartItemHasQuantityThresholds(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem, @NonNull @NonNull CatalogItemList<? extends CatalogItem> catalogItemList)
      Description copied from interface: CartItemConfigurationService
      Determines if the provided CartItem's related CatalogItem has quantity threshold restrictions.
      Specified by:
      cartItemHasQuantityThresholds in interface CartItemConfigurationService<P extends Product>
      Parameters:
      cartItem - The CartItem that we need to check for quantity thresholds.
      catalogItemList - The CatalogItemList that should contain the CartItem's related CatalogItem.
      Returns:
      If the provided CartItem's related CatalogItem has quantity threshold restrictions.
    • cartItemHasQuantityThresholds

      public boolean cartItemHasQuantityThresholds(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem, @NonNull @NonNull CatalogItemList<? extends CatalogItem> catalogItemList, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      Description copied from interface: CartItemConfigurationService
      Determines if the provided CartItem's related CatalogItem has quantity threshold restrictions.
      Specified by:
      cartItemHasQuantityThresholds in interface CartItemConfigurationService<P extends Product>
      Parameters:
      cartItem - The CartItem that we need to check for quantity thresholds.
      catalogItemList - The CatalogItemList that should contain the CartItem's related CatalogItem.
      contextInfo - Context information around sandbox and multitenant state.
      Returns:
      If the provided CartItem's related CatalogItem has quantity threshold restrictions.
    • validateCartItem

      public void validateCartItem(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.Cart cart, @NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem, @NonNull @NonNull CatalogItemList<? extends CatalogItem> catalogItemList, @NonNull @NonNull String validationFlow, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      Description copied from interface: CartItemConfigurationService
      Process cart item configuration by validating catalog information. Errors for the item will be recorded into CartItem.getGlobalConfigErrors(), while errors for specific attributes will be recorded into CartItem.getAttributeConfigErrors(). For hierarchical cart items (items with CartItem.getDependentCartItems()) it is intended that this method be called from the bottom up, i.e., the lowest level dependent item gets called first. That way, errors on items will be properly cascaded up the hierarchy as CartItemConfigurationErrorEnum.MISCONFIGURED_DEPENDENT_ITEMS on CartItem.getGlobalConfigErrors().
      Specified by:
      validateCartItem in interface CartItemConfigurationService<P extends Product>
      Parameters:
      cart - The cart with the cart item
      cartItem - The cart item with which to process configuration.
      catalogItemList - The CatalogItemList that should contain the CartItem's related CatalogItem.
      validationFlow - The context used to identify validation requirements of the CartItem at that point in its lifecycle. If this is set to ValidationStrategy.ADD_ITEM, then the configuration service will try to
      contextInfo - Context information around sandbox and multitenant state.
    • validateCartItem

      public void validateCartItem(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.Cart cart, @NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem, @NonNull @NonNull CatalogItem product, String validationFlow)
      Description copied from interface: CartItemConfigurationService
      Process cart item configuration by validating catalog information. Errors for the item will be recorded into CartItem.getGlobalConfigErrors(), while errors for specific attributes will be recorded into CartItem.getAttributeConfigErrors(). For hierarchical cart items (items with CartItem.getDependentCartItems()) it is intended that this method be called from the bottom up, i.e., the lowest level dependent item gets called first. That way, errors on items will be properly cascaded up the hierarchy as CartItemConfigurationErrorEnum.MISCONFIGURED_DEPENDENT_ITEMS on CartItem.getGlobalConfigErrors().
      Specified by:
      validateCartItem in interface CartItemConfigurationService<P extends Product>
      Parameters:
      cart - The cart with the cart item
      cartItem - The cart item with which to process configuration.
      product - The CatalogItem with configuration to be used for validation.
      validationFlow - The context used to identify validation requirements of the CartItem at that point in its lifecycle. If this is set to ValidationStrategy.ADD_ITEM, then the configuration service will try to
    • validateCartItem

      public void validateCartItem(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.Cart cart, @NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem, @NonNull @NonNull CatalogItem product, String validationFlow, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      Description copied from interface: CartItemConfigurationService
      Process cart item configuration by validating catalog information. Errors for the item will be recorded into CartItem.getGlobalConfigErrors(), while errors for specific attributes will be recorded into CartItem.getAttributeConfigErrors(). For hierarchical cart items (items with CartItem.getDependentCartItems()) it is intended that this method be called from the bottom up, i.e., the lowest level dependent item gets called first. That way, errors on items will be properly cascaded up the hierarchy as CartItemConfigurationErrorEnum.MISCONFIGURED_DEPENDENT_ITEMS on CartItem.getGlobalConfigErrors().
      Specified by:
      validateCartItem in interface CartItemConfigurationService<P extends Product>
      Parameters:
      cart - The cart with the cart item
      cartItem - The cart item with which to process configuration.
      product - The CatalogItem with configuration to be used for validation.
      validationFlow - The context used to identify validation requirements of the CartItem at that point in its lifecycle. If this is set to ValidationStrategy.ADD_ITEM, then the configuration service will try to
      contextInfo - Context information around sandbox and multitenant state.
    • validateCustomQuoteItem

      public void validateCustomQuoteItem(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.Cart cart, @NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem)
      Description copied from interface: CartItemConfigurationService
      Processes item configuration validation for custom quote items.

      Any customization should be added here.

      Specified by:
      validateCustomQuoteItem in interface CartItemConfigurationService<P extends Product>
      Parameters:
      cart - The cart with the cart item
      cartItem - The cart item with which to process configuration
      See Also:
      • DefaultCartItemTypes.CUSTOM_QUOTE_ITEM
    • validateCustomQuoteItem

      public void validateCustomQuoteItem(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.Cart cart, @NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      Description copied from interface: CartItemConfigurationService
      Processes item configuration validation for custom quote items.

      Any customization should be added here.

      Specified by:
      validateCustomQuoteItem in interface CartItemConfigurationService<P extends Product>
      Parameters:
      cart - The cart with the cart item
      cartItem - The cart item with which to process configuration
      contextInfo - Context information around sandbox and multitenant state.
      See Also:
      • DefaultCartItemTypes.CUSTOM_QUOTE_ITEM
    • validateNonCatalogItem

      public void validateNonCatalogItem(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.Cart cart, @NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      Description copied from interface: CartItemConfigurationService
      Processes item configuration validation for non-catalog items.

      Any customization should be added here.

      Specified by:
      validateNonCatalogItem in interface CartItemConfigurationService<P extends Product>
      Parameters:
      cart - The cart with the cart item
      cartItem - The cart item with which to process configuration
      contextInfo - Context information around sandbox and multitenant state.
      See Also:
      • DefaultCartItemTypes.NON_CATALOG_ITEM
    • variantCartItemMissingFromCatalogItem

      public boolean variantCartItemMissingFromCatalogItem(@NonNull @NonNull CatalogItemList<? extends CatalogItem> catalogItemList, @NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      Description copied from interface: CartItemConfigurationService
      Determines if the provided CartItem does not have a backing Variant from the list of CatalogItem This specifically targets Variants by checking the variant ID of a cart item.

      Specified by:
      variantCartItemMissingFromCatalogItem in interface CartItemConfigurationService<P extends Product>
      Parameters:
      catalogItemList - the list of CatalogItems
      cartItem - the cart item to check
      contextInfo - context information surrounding sandboxing and multitenant state
      Returns:
      true if the cartItem does not have a backing Variant for a variant
    • hasVariantDistinguishingOptions

      protected boolean hasVariantDistinguishingOptions(@NonNull P product)
    • validateItemAndDependentsHavePositiveQuantities

      protected void validateItemAndDependentsHavePositiveQuantities(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem item)
      A basic requirement is that all items added to a cart have a positive quantity. This method validates the given item and all of its nested dependents to ensure they have a positive quantity. Config errors will be registered on the item if the validation does not pass.
      Parameters:
      item - the item which should be validated to have a positive quantity for itself and dependents
    • hasPositiveQuantity

      protected boolean hasPositiveQuantity(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem)
    • flattenWithDependents

      protected Stream<com.broadleafcommerce.cart.client.domain.CartItem> flattenWithDependents(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem item)
      Returns a flattened stream consisting of the given item with all of its nested dependents.
      Parameters:
      item - the item to flatten
      Returns:
      a flattened stream consisting of the given item with all of its nested dependents
    • validateQuantityWithinThreshold

      protected void validateQuantityWithinThreshold(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.Cart cart, @NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem, @NonNull P product)
      Checks if the quantity of the item fits within the threshold.
      Parameters:
      cart - The cart for this cart item
      cartItem - The cart item whose quantity is being validated
      product - The product that this CartItem is intended to represent
    • calculateItemsQuantityWithSameSku

      protected int calculateItemsQuantityWithSameSku(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem, @NonNull @NonNull com.broadleafcommerce.cart.client.domain.Cart cart, int parentItemQuantity)
      Calculates the total quantity of a particular item in the cart. Checks against the sku of the cartItem being added to the cart.
      Parameters:
      cartItem - the CartItem being added to the cart
      cart - the current Cart being modified
      parentItemQuantity - the quantity of the parent CartItem
      Returns:
      the quantity of items in the cart with the same sku
    • calculateItemAndDependentItemsQuantityWithSameSku

      protected int calculateItemAndDependentItemsQuantityWithSameSku(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem dependentCartItem, @NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem, int parentQuantity)
      Calculates the total quantity of a particular dependent cart item in the cart. Checks against the sku of the cartItem being added to the cart.
      Parameters:
      dependentCartItem - the item dependent on the main CartItem being added
      cartItem - the CartItem being added to the cart
      parentQuantity - the quantity of the parent CartItem for the dependent cart items
      Returns:
      the quantity of dependent items in the cart with the same sku
    • calculateItemsQuantityWithSameProductId

      protected int calculateItemsQuantityWithSameProductId(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem, @NonNull @NonNull com.broadleafcommerce.cart.client.domain.Cart cart, int parentItemQuantity)
      Calculates the total quantity of a particular item in the cart. Checks against the productId of the cartItem being added to the cart. This method is useful in cases where a CartItem may not have a sku such as with a BUNDLE type.
      Parameters:
      cartItem - the CartItem being added to the cart
      cart - the current Cart being modified
      parentItemQuantity - the quantity of the parent CartItem for the dependent cart items
      Returns:
      the quantity of items in the cart with the same productId
    • calculateItemAndDependentItemsQuantityWithSameProductId

      protected int calculateItemAndDependentItemsQuantityWithSameProductId(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem dependentCartItem, @NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem, int parentQuantity)
      Calculates the total quantity of a particular dependent cart item in the cart. Checks against the productId of the cartItem being added to the cart. This method is useful in cases where a CartItem may not have a sku such as with a BUNDLE type.
      Parameters:
      dependentCartItem - the current dependent cart item
      cartItem - the CartItem being added to the cart
      parentQuantity - the quantity of the parent CartItem for the dependent cart items
      Returns:
      the quantity of dependent items in the cart with the same productId
    • calculateItemsQuantity

      protected int calculateItemsQuantity(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem, @NonNull @NonNull com.broadleafcommerce.cart.client.domain.Cart cart, int parentItemQuantity, int itemsInCartQuantity)
      Calculates the total quantity of a particular item in the cart.
      Parameters:
      cartItem - the CartItem being added to check against
      cart - the current Cart being modified
      parentItemQuantity - the quantity of the parent CartItem for the dependent cart items
      itemsInCartQuantity - the quantity of similar items already found in the cart
      Returns:
      the quantity of items in the cart
    • calculateDependentItemsQuantity

      protected int calculateDependentItemsQuantity(com.broadleafcommerce.cart.client.domain.CartItem parentDependentCartItem, com.broadleafcommerce.cart.client.domain.CartItem cartItem, int parentQuantity)
      Recursively calculates the quantities of the items dependent on the parent CartItem.
      Parameters:
      parentDependentCartItem - the CartItem to check for dependentCartItems
      cartItem - the original parent CartItem being added to the cart
      parentQuantity - the total quantity of the current parent dependentCartItem
      Returns:
      the quantity of currently calculated dependent cart items
    • validateTerms

      protected void validateTerms(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem, @NonNull P product)
      Determines if the cartItem is valid based on the product's info.
      Parameters:
      cartItem - The CartItem to validate.
      product - The Product added to the cart with source information used for validating the terms.
      Since:
      Cart Operation Service 2.2.0, Release Train 2.2.0
    • requiredAttributesMissing

      protected boolean requiredAttributesMissing(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem)
    • addItemConfigError

      protected void addItemConfigError(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem, @NonNull @NonNull String errorCode, @NonNull @NonNull String errorMessage)
    • getMessage

      protected String getMessage(@NonNull @NonNull String errorMessage, @Nullable Object... args)
    • identifyProductForCartItem

      protected Optional<P> identifyProductForCartItem(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem, @NonNull @NonNull CatalogItemList<? extends CatalogItem> catalogItemList)
    • isNonSkuTypeOrNullSku

      protected boolean isNonSkuTypeOrNullSku(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem)
      Determines if a provided CartItem is a Product Type that does not normally have a sku or has a null sku.
      Parameters:
      cartItem - the CartItem to check for type and sku
      Returns:
      True if a CartItem is a non sku type or does not have a sku on it, otherwise false.
    • getIncludedProductService

      protected IncludedProductConfigurationService getIncludedProductService()
    • getItemChoiceService

      protected ItemChoiceConfigurationService getItemChoiceService()
    • getAttributeChoiceService

      protected AttributeChoiceConfigurationService getAttributeChoiceService()
    • getMessageSource

      protected org.springframework.context.MessageSource getMessageSource()
    • getTypeFactory

      protected com.broadleafcommerce.common.extension.TypeFactory getTypeFactory()
    • getOfferUtils

      protected CartOperationServiceOfferUtils getOfferUtils()
    • setOfferUtils

      @Autowired public void setOfferUtils(CartOperationServiceOfferUtils offerUtils)
    • getBroadleafProductService

      protected BroadleafProductService<Product> getBroadleafProductService()
    • setBroadleafProductService

      @Autowired public void setBroadleafProductService(BroadleafProductService<Product> broadleafProductService)