Class TenantPersistenceHandler

java.lang.Object
com.broadleafcommerce.data.tracking.core.tenant.service.TenantPersistenceHandler
All Implemented Interfaces:
com.broadleafcommerce.common.messaging.PersistenceHandler

public class TenantPersistenceHandler extends Object implements com.broadleafcommerce.common.messaging.PersistenceHandler

Specialized PersistenceHandler that listens specifically for repository changes to tenant domain. This allows other microservices to synchronize changes to tenant hierarchies and assignments within their local persistent stores. Once the local tenant persistent store is updated, an ApplicationEvent is published representing what changed.

As a result of updating this tenant domain, there might also be tenant-discriminated entities (entities that have TrackableBehavior.CATALOG or TrackableBehavior.APPLICATION modifiers on them) that care about this hierarchy. If this is the case, you can listen to the ApplicationEvents that this class publishes:

An example is to synchronize repository domain when a catalog hierarchy is updated:

 public class ItemCatalogChangeListener {

     private final CatalogChangeHelper catalogChangeHelper;
     private final ItemRepository<Trackable> itemRepository;

     public TestTenantPersistenceHandler(
             ItemRepository<Trackable> itemRepository,
             CatalogChangeHelper catalogChangeHelper) {
         this.catalogChangeHelper = catalogChangeHelper;
         this.itemRepository = itemRepository;
     }

     @EventListener
     protected void updateItems(CatalogChangedEvent changed) {
         catalogChangeHelper.sync(changed.getCatalog(), itemRepository.getEntityInformation().getJavaType(),
                 changed.getOperationType());
     }
 }
 
The CatalogChangeHelper.sync(Trackable, Class, boolean) synchronizes the entity-specific store for any TrackableBehavior.CATALOG enabled entities.
Author:
Jeff Fischer, Phillip Verheyden (phillipuniverse)
See Also:
  • Field Details

  • Constructor Details

  • Method Details

    • init

      @PostConstruct public void init()
    • hook

      @StreamListener("persistenceInputTenantSyncDataTracking") public void hook(String entityJson)
      Specified by:
      hook in interface com.broadleafcommerce.common.messaging.PersistenceHandler
    • setCacheManager

      @Autowired public void setCacheManager(@Nullable org.springframework.cache.CacheManager cacheManager)
    • processStateChange

      public void processStateChange(com.fasterxml.jackson.databind.JsonNode entityJson)
      Specified by:
      processStateChange in interface com.broadleafcommerce.common.messaging.PersistenceHandler
    • isApplicationProcessingValid

      protected boolean isApplicationProcessingValid()
    • isCatalogProcessingValid

      protected boolean isCatalogProcessingValid()
    • ignoreRoutes

      protected List<String> ignoreRoutes()
    • isValidType

      public boolean isValidType(String reportedType, @Nullable String projectionType)
      Specified by:
      isValidType in interface com.broadleafcommerce.common.messaging.PersistenceHandler
    • getObjectMapper

      public com.fasterxml.jackson.databind.ObjectMapper getObjectMapper()
      Specified by:
      getObjectMapper in interface com.broadleafcommerce.common.messaging.PersistenceHandler
    • getSupportedSimpleTypeNames

      public String[] getSupportedSimpleTypeNames()
      Specified by:
      getSupportedSimpleTypeNames in interface com.broadleafcommerce.common.messaging.PersistenceHandler
    • getSupportedTenantApplicationTypes

      public String[] getSupportedTenantApplicationTypes()
      The fully qualified class names of application domain type from the tenant service that this tenant listener should look for. By default, this will be JPA_TENANT_APPLICATION_TYPE If an extension of the application domain has been created for the tenant service, then that fully qualified classname should be set on a bean override or this handler.
      Returns:
      The one or more application domain types from the tenant service for which sync is supported. Normally, end implementations need only declare the single type they've overridden.
    • setSupportedTenantApplicationTypes

      public void setSupportedTenantApplicationTypes(String[] supportedTenantApplicationTypes)
      The fully qualified class names of application domain type from the tenant service that this tenant listener should look for. By default, this will be JPA_TENANT_APPLICATION_TYPE. If an extension of the application domain has been created for the tenant service, then that fully qualified classname should be set on a bean override or this handler.
      Parameters:
      supportedTenantApplicationTypes - The one or more application domain types from the tenant service for which sync is supported. Normally, end implementations need only declare the single type they've overridden.
    • getSupportedTenantApplicationCatalogTypes

      public String[] getSupportedTenantApplicationCatalogTypes()
      The fully qualified class names of application catalog domain type from the tenant service that this tenant listener should look for. By default, this will be JPA_TENANT_MARKETPLACE_APPLICATION_CATALOG_TYPE. If an extension of the application domain has been created for the tenant service, then that fully qualified classname should be set on a bean override or this handler.
      Returns:
      The one or more application catalog domain types from the tenant service for which sync is supported. Normally, end implementations need only declare the single type they've overridden.
    • setSupportedTenantApplicationCatalogTypes

      public void setSupportedTenantApplicationCatalogTypes(String[] supportedTenantApplicationCatalogTypes)
      The fully qualified class names of application catalog domain type from the tenant service that this tenant listener should look for. By default, this will be JPA_TENANT_MARKETPLACE_APPLICATION_CATALOG_TYPE. If an extension of the application domain has been created for the tenant service, then that fully qualified classname should be set on a bean override or this handler.
      Parameters:
      supportedTenantApplicationCatalogTypes - The one or more application catalog domain types from the tenant service for which sync is supported. Normally, end implementations need only declare the single type they've overridden.
    • getSupportedTenantCatalogTypes

      public String[] getSupportedTenantCatalogTypes()
      The fully qualified class names of catalog domain type from the tenant service that this tenant listener should look for. By default, this will be JPA_TENANT_CATALOG_TYPE. If an extension of the catalog domain has been created for the tenant service, then that fully qualified classname should be set on a bean override or this handler.
      Returns:
      The one or more catalog domain types from the tenant service for which sync is supported. Normally, end implementations need only declare the single type they've overridden.
    • setSupportedTenantCatalogTypes

      public void setSupportedTenantCatalogTypes(String[] supportedTenantCatalogTypes)
      The fully qualified class names of catalog domain type from the tenant service that this tenant listener should look for. By default, this will be JPA_TENANT_CATALOG_TYPE. If an extension of the catalog domain has been created for the tenant service, then that fully qualified classname should be set on a bean override or this handler.
      Parameters:
      supportedTenantCatalogTypes - The one or more catalog domain types from the tenant service for which sync is supported. Normally, end implementations need only declare the single type they've overridden.
    • updateCache

      protected void updateCache(Trackable existingInstance)
      Update Spring CacheManager to groom caches related to this entity persistence
      Parameters:
      existingInstance - The tenant related entity being persisted
    • hydrateFromJson

      protected Trackable hydrateFromJson(com.fasterxml.jackson.databind.JsonNode entityJson, Class<?> domainType, com.fasterxml.jackson.databind.ObjectMapper mapper)
      Create a repository-specific entity instance given a JSON representation.
      Parameters:
      entityJson - The JSON representation of the entity
      domainType - The repository specific domain class type
      mapper - The Jackson mapper instance that can facilitate conversion
      Returns:
      The instantiated and fully-populated entity instance
    • setApplicationCatalogRepository

      @Autowired public void setApplicationCatalogRepository(@Nullable CommonMarketplaceApplicationCatalogRepository<Trackable> applicationCatalogRepository)