001// -------------------------------------------------------------------------------- 002// Copyright 2002-2025 Echo Three, LLC 003// 004// Licensed under the Apache License, Version 2.0 (the "License"); 005// you may not use this file except in compliance with the License. 006// You may obtain a copy of the License at 007// 008// http://www.apache.org/licenses/LICENSE-2.0 009// 010// Unless required by applicable law or agreed to in writing, software 011// distributed under the License is distributed on an "AS IS" BASIS, 012// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013// See the License for the specific language governing permissions and 014// limitations under the License. 015// -------------------------------------------------------------------------------- 016 017package com.echothree.model.control.content.server.eventbus; 018 019import com.echothree.model.control.content.server.control.ContentControl; 020import com.echothree.model.control.core.common.EventTypes; 021import com.echothree.model.control.core.server.control.EventControl; 022import com.echothree.model.control.core.server.eventbus.BaseEventSubscriber; 023import com.echothree.model.control.core.server.eventbus.Function5Arity; 024import com.echothree.model.control.core.server.eventbus.SentEvent; 025import com.echothree.model.control.core.server.eventbus.SentEventSubscriber; 026import com.echothree.model.control.inventory.server.control.InventoryControl; 027import com.echothree.model.control.item.server.control.ItemControl; 028import com.echothree.model.control.uom.server.control.UomControl; 029import com.echothree.model.data.content.common.ContentCatalogConstants; 030import com.echothree.model.data.content.common.ContentCategoryConstants; 031import com.echothree.model.data.core.server.entity.EntityInstance; 032import com.echothree.model.data.core.server.entity.Event; 033import com.echothree.model.data.inventory.common.InventoryConditionConstants; 034import com.echothree.model.data.item.common.ItemConstants; 035import com.echothree.model.data.uom.common.UnitOfMeasureTypeConstants; 036import com.echothree.util.server.persistence.PersistenceUtils; 037import com.echothree.util.server.persistence.Session; 038import com.google.common.eventbus.Subscribe; 039 040@SentEventSubscriber 041public class ContentCatalogItemModificationSubscriber 042 extends BaseEventSubscriber { 043 044 @Subscribe 045 public void receiveSentEventForContentCategories(SentEvent se) { 046 decodeEventAndApply(se, touchContentCatalogItemsIfContentCategory); 047 } 048 049 private static final Function5Arity<Event, EntityInstance, EventTypes, String, String> 050 touchContentCatalogItemsIfContentCategory = (event, entityInstance, eventType, componentVendorName, entityTypeName) -> { 051 if(ContentCategoryConstants.COMPONENT_VENDOR_NAME.equals(componentVendorName) 052 && ContentCategoryConstants.ENTITY_TYPE_NAME.equals(entityTypeName) 053 && (eventType == EventTypes.MODIFY || eventType == EventTypes.TOUCH)) { 054 var eventControl = Session.getModelController(EventControl.class); 055 var contentControl = Session.getModelController(ContentControl.class); 056 var contentCategory = contentControl.getContentCategoryByEntityInstance(entityInstance); 057 var contentCategoryItems = contentControl.getContentCategoryItemsByContentCategory(contentCategory); 058 059 for(var contentCategoryItem : contentCategoryItems) { 060 var contentCatalogItem = contentCategoryItem.getContentCatalogItem(); 061 062 eventControl.sendEvent(contentCatalogItem.getPrimaryKey(), EventTypes.TOUCH, 063 contentCategory.getPrimaryKey(), eventType, 064 PersistenceUtils.getInstance().getBasePKFromEntityInstance(event.getCreatedBy())); 065 } 066 } 067 }; 068 069 @Subscribe 070 public void receiveSentEventForContentCatalogs(SentEvent se) { 071 decodeEventAndApply(se, touchContentCatalogItemsIfContentCatalog); 072 } 073 074 private static final Function5Arity<Event, EntityInstance, EventTypes, String, String> 075 touchContentCatalogItemsIfContentCatalog = (event, entityInstance, eventType, componentVendorName, entityTypeName) -> { 076 if(ContentCatalogConstants.COMPONENT_VENDOR_NAME.equals(componentVendorName) 077 && ContentCatalogConstants.ENTITY_TYPE_NAME.equals(entityTypeName) 078 && (eventType == EventTypes.MODIFY || eventType == EventTypes.TOUCH)) { 079 var eventControl = Session.getModelController(EventControl.class); 080 var contentControl = Session.getModelController(ContentControl.class); 081 var contentCatalog = contentControl.getContentCatalogByEntityInstance(entityInstance); 082 var contentCatalogItems = contentControl.getContentCatalogItemsByContentCatalog(contentCatalog); 083 084 for(var contentCatalogItem : contentCatalogItems) { 085 eventControl.sendEvent(contentCatalogItem.getPrimaryKey(), EventTypes.TOUCH, 086 contentCatalog.getPrimaryKey(), eventType, 087 PersistenceUtils.getInstance().getBasePKFromEntityInstance(event.getCreatedBy())); 088 } 089 } 090 }; 091 092 @Subscribe 093 public void receiveSentEventForItems(SentEvent se) { 094 decodeEventAndApply(se, touchContentCatalogItemsIfItem); 095 } 096 097 private static final Function5Arity<Event, EntityInstance, EventTypes, String, String> 098 touchContentCatalogItemsIfItem = (event, entityInstance, eventType, componentVendorName, entityTypeName) -> { 099 if(ItemConstants.COMPONENT_VENDOR_NAME.equals(componentVendorName) 100 && ItemConstants.ENTITY_TYPE_NAME.equals(entityTypeName) 101 && (eventType == EventTypes.MODIFY || eventType == EventTypes.TOUCH)) { 102 var eventControl = Session.getModelController(EventControl.class); 103 var itemControl = Session.getModelController(ItemControl.class); 104 var contentControl = Session.getModelController(ContentControl.class); 105 var item = itemControl.getItemByEntityInstance(entityInstance); 106 var contentCatalogItems = contentControl.getContentCatalogItemsByItem(item); 107 108 for(var contentCatalogItem : contentCatalogItems) { 109 eventControl.sendEvent(contentCatalogItem.getPrimaryKey(), EventTypes.TOUCH, 110 item.getPrimaryKey(), eventType, 111 PersistenceUtils.getInstance().getBasePKFromEntityInstance(event.getCreatedBy())); 112 } 113 } 114 }; 115 116 @Subscribe 117 public void receiveSentEventForInventoryConditions(SentEvent se) { 118 decodeEventAndApply(se, touchContentCatalogInventoryConditionsIfInventoryCondition); 119 } 120 121 private static final Function5Arity<Event, EntityInstance, EventTypes, String, String> 122 touchContentCatalogInventoryConditionsIfInventoryCondition = (event, entityInstance, eventType, componentVendorName, entityTypeName) -> { 123 if(InventoryConditionConstants.COMPONENT_VENDOR_NAME.equals(componentVendorName) 124 && InventoryConditionConstants.ENTITY_TYPE_NAME.equals(entityTypeName) 125 && (eventType == EventTypes.MODIFY || eventType == EventTypes.TOUCH)) { 126 var eventControl = Session.getModelController(EventControl.class); 127 var inventoryControl = Session.getModelController(InventoryControl.class); 128 var contentControl = Session.getModelController(ContentControl.class); 129 var inventoryCondition = inventoryControl.getInventoryConditionByEntityInstance(entityInstance); 130 var contentCatalogItems = contentControl.getContentCatalogItemsByInventoryCondition(inventoryCondition); 131 132 for(var contentCatalogItem : contentCatalogItems) { 133 eventControl.sendEvent(contentCatalogItem.getPrimaryKey(), EventTypes.TOUCH, 134 inventoryCondition.getPrimaryKey(), eventType, 135 PersistenceUtils.getInstance().getBasePKFromEntityInstance(event.getCreatedBy())); 136 } 137 } 138 }; 139 140 @Subscribe 141 public void receiveSentEventForUnitOfMeasureTypes(SentEvent se) { 142 decodeEventAndApply(se, touchContentCatalogUnitOfMeasureTypesIfUnitOfMeasureType); 143 } 144 145 private static final Function5Arity<Event, EntityInstance, EventTypes, String, String> 146 touchContentCatalogUnitOfMeasureTypesIfUnitOfMeasureType = (event, entityInstance, eventType, componentVendorName, entityTypeName) -> { 147 if(UnitOfMeasureTypeConstants.COMPONENT_VENDOR_NAME.equals(componentVendorName) 148 && UnitOfMeasureTypeConstants.ENTITY_TYPE_NAME.equals(entityTypeName) 149 && (eventType == EventTypes.MODIFY || eventType == EventTypes.TOUCH)) { 150 var eventControl = Session.getModelController(EventControl.class); 151 var uomControl = Session.getModelController(UomControl.class); 152 var contentControl = Session.getModelController(ContentControl.class); 153 var unitOfMeasureType = uomControl.getUnitOfMeasureTypeByEntityInstance(entityInstance); 154 var contentCatalogItems = contentControl.getContentCatalogItemsByUnitOfMeasureType(unitOfMeasureType); 155 156 for(var contentCatalogItem : contentCatalogItems) { 157 eventControl.sendEvent(contentCatalogItem.getPrimaryKey(), EventTypes.TOUCH, 158 unitOfMeasureType.getPrimaryKey(), eventType, 159 PersistenceUtils.getInstance().getBasePKFromEntityInstance(event.getCreatedBy())); 160 } 161 } 162 }; 163 164}