Class 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:
    ConditionalOnTenantSynchronization, CatalogChangeHelper
    • Method Detail

      • 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