Class DefaultTranslationEntityService<P extends Translation>

java.lang.Object
com.broadleafcommerce.data.tracking.core.service.BaseCrudEntityService<P>
com.broadleafcommerce.data.tracking.core.service.BaseRsqlCrudEntityService<P>
com.broadleafcommerce.translation.service.DefaultTranslationEntityService<P>
All Implemented Interfaces:
com.broadleafcommerce.data.tracking.core.service.CrudEntityService<P>, com.broadleafcommerce.data.tracking.core.service.RsqlCrudEntityService<P>, TranslationEntityService<P>

public class DefaultTranslationEntityService<P extends Translation> extends com.broadleafcommerce.data.tracking.core.service.BaseRsqlCrudEntityService<P> implements TranslationEntityService<P>
Author:
Nathan Moore (nathandmoore), Samarth Dhruva (samarthd)
  • Field Details

  • Constructor Details

    • DefaultTranslationEntityService

      public DefaultTranslationEntityService(TranslationRepository<com.broadleafcommerce.data.tracking.core.Trackable> repository, com.broadleafcommerce.data.tracking.core.service.RsqlCrudEntityHelper helper, com.broadleafcommerce.common.extension.TypeFactory typeFactory, @Nullable com.broadleafcommerce.common.extension.cache.CacheStateManager cacheStateManager)
  • Method Details

    • setFieldTransformerHandlers

      @Autowired(required=false) public void setFieldTransformerHandlers(@Nullable List<TranslationFieldTransformerHandler> fieldTransformerHandlers)
    • findPageByEntityAndLocale

      public org.springframework.data.domain.Page<P> findPageByEntityAndLocale(String entityType, String entityId, Locale locale, @Nullable org.springframework.data.domain.Pageable pageInfo, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo context)
      Description copied from interface: TranslationEntityService
      Finds the translations for the given entity info.
      Specified by:
      findPageByEntityAndLocale in interface TranslationEntityService<P extends Translation>
      Parameters:
      entityType - The type of the entity such as PRODUCT, CATEGORY, or OFFER.
      entityId - The context ID of the entity.
      locale - The translation's locale.
      pageInfo - Pagingation info regarding the current page of data to retrieve.
      context - context information related to multitenancy. Often used to validate visibility and mutability of persistence operations for a catalog.
      Returns:
      the translations for the given entity.
    • findAllByEntityAndLocale

      public List<P> findAllByEntityAndLocale(String entityType, String entityId, Locale locale, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo context)
      Description copied from interface: TranslationEntityService
      Finds the translations for the given entity info.
      Specified by:
      findAllByEntityAndLocale in interface TranslationEntityService<P extends Translation>
      Parameters:
      entityType - The type of the entity such as PRODUCT, CATEGORY, or OFFER.
      entityId - The context ID of the entity.
      locale - The translation's locale.
      context - context information related to multitenancy. Often used to validate visibility and mutability of persistence operations for a catalog.
      Returns:
      the translations for the given entity.
    • findAllByEntitiesAndLocales

      public List<P> findAllByEntitiesAndLocales(String entityType, List<String> entities, List<Locale> locales, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo context)
      Description copied from interface: TranslationEntityService
      Finds the translations for multiple entities.
      Specified by:
      findAllByEntitiesAndLocales in interface TranslationEntityService<P extends Translation>
      Parameters:
      entityType - The type of the entity such as PRODUCT, CATEGORY, or OFFER.
      entities - The context IDs of multiple entities to check.
      locales - The translation's locale(s).
      context - context information related to multitenancy. Often used to validate visibility and mutability of persistence operations for a catalog.
      Returns:
      the translations for the requested entities.
    • findAllByEntitiesAndLocalesAndFieldStartsWith

      public List<P> findAllByEntitiesAndLocalesAndFieldStartsWith(String entityType, List<String> entities, List<Locale> locales, String field, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo context)
      Description copied from interface: TranslationEntityService
      Finds the translations for multiple entities for a specific field.
      Specified by:
      findAllByEntitiesAndLocalesAndFieldStartsWith in interface TranslationEntityService<P extends Translation>
      Parameters:
      entityType - The type of the entity such as PRODUCT, CATEGORY, or OFFER.
      entities - The context IDs of multiple entities to check.
      locales - The translation's locale(s).
      field - entity field name prefix, so you can search as a startsWith
      context - context information related to multitenancy. Often used to validate visibility and mutability of persistence operations for a catalog.
      Returns:
      the translations for the requested entities.
    • findByFieldAndLocale

      public P findByFieldAndLocale(String entityType, String entityId, String entityField, Locale locale, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo context)
      Description copied from interface: TranslationEntityService
      Finds the translation for the given entity field.
      Specified by:
      findByFieldAndLocale in interface TranslationEntityService<P extends Translation>
      Parameters:
      entityType - The type of the entity such as PRODUCT, CATEGORY, or OFFER.
      entityId - The context ID of the entity.
      entityField - The name of the field on the entity to which the translation applies.
      locale - The translation's locale.
      context - context information related to multitenancy. Often used to validate visibility and mutability of persistence operations for a catalog.
      Returns:
      the translation for the given entity field.
    • findAllByEntity

      public List<P> findAllByEntity(String entityType, String entityId, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo context)
      Description copied from interface: TranslationEntityService
      Finds the translations for the given entity info.
      Specified by:
      findAllByEntity in interface TranslationEntityService<P extends Translation>
      Parameters:
      entityType - The type of the entity such as PRODUCT, CATEGORY, or OFFER.
      entityId - The context ID of the entity.
      context - context information related to multitenancy. Often used to validate visibility and mutability of persistence operations for a catalog.
      Returns:
      the translations for the given entity.
    • countNonProductionRecordsByEntityInTenant

      public long countNonProductionRecordsByEntityInTenant(String entityType, String entityId, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo context)
      Description copied from interface: TranslationEntityService
      Returns the count of non-production records that match the given entity info and the given tenant context.

      This is useful to determine if there are outstanding sandbox changes before an entity can be deleted. For example, this is used for checking if any outstanding sandbox changes exist for Product translations before the Product can be deleted.

      Specified by:
      countNonProductionRecordsByEntityInTenant in interface TranslationEntityService<P extends Translation>
      Parameters:
      entityType - The type of the entity such as PRODUCT, CATEGORY, or OFFER.
      entityId - The context ID of the entity.
      context - context information related to multitenancy.
      Returns:
      the count of non-production records that match the given entity info and the given tenant context.
    • findAllByEntities

      public List<P> findAllByEntities(String entityType, List<String> entityIds, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo context)
      Description copied from interface: TranslationEntityService
      Finds the translations for the given entity info.
      Specified by:
      findAllByEntities in interface TranslationEntityService<P extends Translation>
      Parameters:
      entityType - The type of the entity such as PRODUCT, CATEGORY, or OFFER.
      entityIds - The context IDs of the entities
      context - context information related to multitenancy. Often used to validate visibility and mutability of persistence operations for a catalog.
      Returns:
      the translations for the given entities
    • bulkReplaceTranslationsForEntityInLocale

      @Deprecated public List<P> bulkReplaceTranslationsForEntityInLocale(String entityType, String entityId, Locale locale, List<P> fieldTranslations, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      Deprecated.
      Use bulkReplaceTranslationsForEntityInLocale(String, Object, String, Locale, List, ContextInfo) instead to include better coverage for embedded collection translations.
      Description copied from interface: TranslationEntityService
      Creates/updates/deletes Translation records for the given entityType/entityId/locale combination using the given fieldTranslations list of translations.

      The result of this operation should be that the only Translation records for the given entityType/entityId/locale combination should be those supplied in the fieldTranslations list. There will be exactly one Translation record for each Translation in the fieldTranslations list.

      This means that:

      • If a field translation in the given fieldTranslations is not already present in the data store, a new Translation record will be created for it
      • If a field in the given fieldTranslations already has a translation in the data store, the existing Translation record is updated to have the new translation value
      • If there is a Translation record in the data store (for the entityType/entityId/locale combination) that is not found in the given fieldTranslations list, the record is deleted

      Note, if the entity whose fields and subordinate objects are being translated contains embedded collections that are translatable, then TranslationEntityService.bulkReplaceTranslationsForEntityInLocale(String, Object, String, Locale, List, ContextInfo) is more appropriate for that case.
      Specified by:
      bulkReplaceTranslationsForEntityInLocale in interface TranslationEntityService<P extends Translation>
      Parameters:
      entityType - the type of the entity such as PRODUCT, CATEGORY, or OFFER.
      entityId - the context ID of the entity.
      locale - the locale for which this operation should be performed
      fieldTranslations - a list of Translations, with only their Translation.entityField and Translation.value properties populated. Both of those properties must be supplied for each Translation in the list. All other properties of the translations are ignored, as they will be automatically overridden by the other arguments provided to this method.
      contextInfo - the context surrounding sandboxing and multitenant state
      Returns:
      the new list of all translations for the given entityType/entityId/locale combination after performing the necessary updates
    • bulkReplaceTranslationsForEntityInLocale

      public List<P> bulkReplaceTranslationsForEntityInLocale(String entityType, Object entity, String entityId, Locale locale, List<P> fieldTranslations, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      Description copied from interface: TranslationEntityService
      Creates/updates/deletes Translation records for the given entityType/entityId/locale combination using the given fieldTranslations list of translations.

      The result of this operation should be that the only Translation records for the given entityType/entityId/locale combination should be those supplied in the fieldTranslations list. There will be exactly one Translation record for each Translation in the fieldTranslations list.

      This means that:

      • If a field translation in the given fieldTranslations is not already present in the data store, a new Translation record will be created for it
      • If a field in the given fieldTranslations already has a translation in the data store, the existing Translation record is updated to have the new translation value
      • If there is a Translation record in the data store (for the entityType/entityId/locale combination) that is not found in the given fieldTranslations list, the record is deleted

      This version differs from TranslationEntityService.bulkReplaceTranslationsForEntityInLocale(String, String, Locale, List, ContextInfo) in that this version will inspect embedded collections (if applicable) whose members implement SubIdentifiable and are translatable. It will setup the persisted field path for the translation to include the identifier (rather than rely on position alone). This facilitates accurate translation matching for embedded collection members, regardless of collection member ordering mutation.
      Specified by:
      bulkReplaceTranslationsForEntityInLocale in interface TranslationEntityService<P extends Translation>
      Parameters:
      entityType - the type of the entity such as PRODUCT, CATEGORY, or OFFER.
      entity - the projection instance of the entity.
      entityId - the context ID of the entity.
      locale - the locale for which this operation should be performed
      fieldTranslations - a list of Translations, with only their Translation.entityField and Translation.value properties populated. Both of those properties must be supplied for each Translation in the list. All other properties of the translations are ignored, as they will be automatically overridden by the other arguments provided to this method.
      contextInfo - the context surrounding sandboxing and multitenant state
      Returns:
      the new list of all translations for the given entityType/entityId/locale combination after performing the necessary updates
    • updateTranslationEntityField

      protected void updateTranslationEntityField(String entityType, Object entity, List<P> fieldTranslations)
      Updates the translation entity fields for a given entity based on the provided field translations.
      Parameters:
      entityType - the type of the entity being updated
      entity - the entity instance whose translation fields will be updated
      fieldTranslations - the list of field translation objects containing path and transformation details
      Since:
      TranslationCommon 2.0.5
    • validateTranslations

      protected void validateTranslations(List<P> translations)
      Accepts a List of Translations, and ensures the list is not null and every Translation:
      1. is not null
      2. has an Translation.getEntityField() that is not blank
      3. has a Translation.getValue() that is not null
      Parameters:
      translations - the list of translations to validate
      Throws:
      InvalidTranslationRequestException - if the translations list was invalid
    • getTranslationsToCreate

      protected List<P> getTranslationsToCreate(String entityType, String entityId, Locale locale, List<P> fieldTranslationsRequest, List<P> existingTranslations)
      Accepts the request of field translations and the list of translations that already exist, and for each field in the request that doesn't already have an existing translation, creates a new Translation object with the appropriate values. A list of these new objects is returned (nothing is persisted to the data store).
      Parameters:
      entityType - the entity type that the new Translations should have
      entityId - the entity ID that the new Translations should have
      locale - the Locale that the new Translations should have
      fieldTranslationsRequest - the request list of translations
      existingTranslations - all translations currently present in the data store for the given entityType/entityId/locale combination
      Returns:
      a list of Translations that should be created in the data store
    • getTranslationsForUpdateAndUnchanged

      protected org.apache.commons.lang3.tuple.Pair<List<P>,List<P>> getTranslationsForUpdateAndUnchanged(List<P> existingTranslations, Map<String,Object> requestedTranslationsMap)
      Accepts a list of all existing field translations for a given entityType/entityId/locale combination, and a map of the requested field translations. The method examines the field translations that are present in both. If the requested value for a field is different from the existing value, it is added to the list of translations that should be updated. If the requested value is the same as the existing value, it is added to the list of translations that should not be updated. Both lists will have newly created instances for each Translation.

      The two lists are returned in a Pair where the left value is the list of translations which should be sent to the data store to persist their changes, and the right value is the list of translations which should not be sent to the data store as they are already current.

      Parameters:
      existingTranslations - all translations currently present in the data store for some entityType/entityId/locale combination
      requestedTranslationsMap - the requested map of field names to translation values
      Returns:
      a Pair of Translation lists, where the left value is the list of translations which should be sent to the data store for updates, and the right value is the list of translations which should not be sent to the data store as they are already current.
    • persistAllChangesAndReturnFinalResult

      protected List<P> persistAllChangesAndReturnFinalResult(List<P> translationsToCreate, List<P> translationsForUpdate, List<P> translationsToDelete, List<P> unchangedTranslations, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      For each of the given lists, performs the appropriate persistence operation and returns the final list of translations after all operations have been performed.
      Parameters:
      translationsToCreate - the translations which should be created in the data store
      translationsForUpdate - the translations which should be replaced in the data store
      translationsToDelete - the translations which should be deleted in the data store
      unchangedTranslations - the translations which are already valid and thus do not need to be sent to the data store
      contextInfo - the context surrounding sandboxing and multitenant state
      Returns:
      the final, combined list of all translations for a particular entityType/entityId/locale combination
    • getRepository

      @NonNull protected TranslationRepository<com.broadleafcommerce.data.tracking.core.Trackable> getRepository()
      Overrides:
      getRepository in class com.broadleafcommerce.data.tracking.core.service.BaseCrudEntityService<P extends Translation>
    • getTypeFactory

      @NonNull protected com.broadleafcommerce.common.extension.TypeFactory getTypeFactory()
    • setCacheByEntityLocaleKeyGen

      @Autowired @Qualifier("translationCacheByEntityLocale") public void setCacheByEntityLocaleKeyGen(@Nullable com.broadleafcommerce.common.extension.cache.key.ContextKeyGen cacheByEntityLocaleKeyGen)
      DefaultTranslationEntityService#CACHE_BY_ENTITY_LOCALE
    • getCacheByEntityLocaleKeyGen

      @Nullable protected com.broadleafcommerce.common.extension.cache.key.ContextKeyGen getCacheByEntityLocaleKeyGen()
      DefaultTranslationEntityService#CACHE_BY_ENTITY_LOCALE
    • getModelMapper

      protected org.modelmapper.ModelMapper getModelMapper()
      A ModelMapper used to clone instances of Translation.
    • getTranslationCommonProperties

      protected TranslationCommonProperties getTranslationCommonProperties()
    • setTranslationCommonProperties

      @Autowired public void setTranslationCommonProperties(TranslationCommonProperties translationCommonProperties)
    • getFieldTransformerHandlers

      protected List<TranslationFieldTransformerHandler> getFieldTransformerHandlers()