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.util.server.persistence; 018 019import com.echothree.model.control.communication.server.control.CommunicationControl; 020import com.echothree.model.control.core.common.ComponentVendors; 021import com.echothree.model.control.core.common.EntityTypes; 022import com.echothree.model.control.core.server.control.ComponentControl; 023import com.echothree.model.control.core.server.control.EntityTypeControl; 024import com.echothree.model.control.core.server.control.MimeTypeControl; 025import com.echothree.model.control.forum.common.ForumConstants; 026import com.echothree.model.control.forum.server.control.ForumControl; 027import com.echothree.model.control.item.common.ItemDescriptionTypes; 028import com.echothree.model.control.item.server.control.ItemControl; 029import com.echothree.model.control.party.server.control.PartyControl; 030import com.echothree.model.control.training.server.control.TrainingControl; 031import com.echothree.model.control.user.server.control.UserControl; 032import com.echothree.model.control.vendor.server.control.VendorControl; 033import com.echothree.model.control.warehouse.server.control.WarehouseControl; 034import com.echothree.model.data.core.server.entity.EntityInstance; 035import com.echothree.model.data.forum.server.entity.ForumMessage; 036import com.echothree.model.data.item.server.entity.ItemDescriptionType; 037import com.echothree.model.data.party.server.entity.Language; 038import com.echothree.model.data.user.server.entity.UserVisit; 039 040public class EntityDescriptionUtils { 041 042 private EntityDescriptionUtils() { 043 super(); 044 } 045 046 private static class EntityDescriptionUtilsHolder { 047 static EntityDescriptionUtils instance = new EntityDescriptionUtils(); 048 } 049 050 public static EntityDescriptionUtils getInstance() { 051 return EntityDescriptionUtilsHolder.instance; 052 } 053 054 private ItemDescriptionType getItemDefaultDescriptionType() { 055 var itemControl = Session.getModelController(ItemControl.class); 056 057 // TODO: Context Cache 058 return itemControl.getItemDescriptionTypeByName(ItemDescriptionTypes.DEFAULT_DESCRIPTION.name()); 059 } 060 061 private ItemDescriptionType getItemPurchaseOrderDescriptionType() { 062 var itemControl = Session.getModelController(ItemControl.class); 063 064 // TODO: Context Cache 065 return itemControl.getItemDescriptionTypeByName(ItemDescriptionTypes.PURCHASE_ORDER_DESCRIPTION.name()); 066 } 067 068 private String getDescriptionForForumMessage(UserVisit userVisit, ForumMessage forumMessage) { 069 var forumControl = Session.getModelController(ForumControl.class); 070 String description = null; 071 072 var forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_TITLE); 073 var forumMessagePart = forumControl.getBestForumMessagePart(forumMessage, forumMessagePartType, getLanguage(userVisit)); 074 075 if(forumMessagePart != null) { 076 var forumStringMessagePart = forumControl.getForumStringMessagePart(forumMessagePart); 077 078 description = forumStringMessagePart.getString(); 079 } 080 081 return description; 082 } 083 084 private Language getLanguage(UserVisit userVisit) { 085 var userControl = Session.getModelController(UserControl.class); 086 087 // TODO: Context Cache 088 return userControl.getPreferredLanguageFromUserVisit(userVisit); 089 } 090 091 public String getDescription(UserVisit userVisit, EntityInstance entityInstance) { 092 String description = null; 093 094 if(entityInstance != null) { 095 var entityTypeDetail = entityInstance.getEntityType().getLastDetail(); 096 var componentVendorName = entityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(); 097 098 if(componentVendorName.equals(ComponentVendors.ECHO_THREE.name())) { 099 var entityTypeName = entityTypeDetail.getEntityTypeName(); 100 101 if(entityTypeName.equals(EntityTypes.Party.name())) { 102 var partyControl = Session.getModelController(PartyControl.class); 103 var party = partyControl.getPartyByEntityInstance(entityInstance); 104 105 description = party == null ? null : partyControl.getBestPartyDescription(party, getLanguage(userVisit)); 106 } else if(entityTypeName.equals(EntityTypes.CommunicationEvent.name())) { 107 var communicationControl = Session.getModelController(CommunicationControl.class); 108 var communicationEvent = communicationControl.getCommunicationEventByEntityInstance(entityInstance); 109 110 description = communicationEvent == null ? null : communicationEvent.getLastDetail().getCommunicationEventName(); 111 } else if(entityTypeName.equals(EntityTypes.TrainingClass.name())) { 112 var trainingControl = Session.getModelController(TrainingControl.class); 113 var trainingClass = trainingControl.getTrainingClassByEntityInstance(entityInstance); 114 115 if(trainingClass != null) { 116 var trainingClassTranslation = trainingControl.getBestTrainingClassTranslation(trainingClass, getLanguage(userVisit)); 117 118 description = trainingClassTranslation == null ? null : trainingClassTranslation.getDescription(); 119 } 120 } else if(entityTypeName.equals(EntityTypes.PartyTrainingClass.name())) { 121 var trainingControl = Session.getModelController(TrainingControl.class); 122 var partyTrainingClass = trainingControl.getPartyTrainingClassByEntityInstance(entityInstance); 123 124 description = partyTrainingClass == null ? null : partyTrainingClass.getLastDetail().getPartyTrainingClassName(); 125 } else if(entityTypeName.equals(EntityTypes.Item.name())) { 126 var itemControl = Session.getModelController(ItemControl.class); 127 var item = itemControl.getItemByEntityInstance(entityInstance); 128 129 description = item == null ? null : itemControl.getBestItemStringDescription(getItemDefaultDescriptionType(), item, getLanguage(userVisit)); 130 } else if(entityTypeName.equals(EntityTypes.ItemDescription.name())) { 131 var itemControl = Session.getModelController(ItemControl.class); 132 var itemDescription = itemControl.getItemDescriptionByEntityInstance(entityInstance); 133 134 if(itemDescription != null) { 135 var partyControl = Session.getModelController(PartyControl.class); 136 var itemDescriptionDetail = itemDescription.getLastDetail(); 137 var language = getLanguage(userVisit); 138 139 description = itemControl.getBestItemDescriptionTypeDescription(itemDescriptionDetail.getItemDescriptionType(), language) + ", " + itemControl.getBestItemStringDescription(getItemDefaultDescriptionType(), itemDescriptionDetail.getItem(), language) + ", " + partyControl.getBestLanguageDescription(itemDescriptionDetail.getLanguage(), language); 140 } 141 } else if(entityTypeName.equals(EntityTypes.VendorItem.name())) { 142 var vendorControl = Session.getModelController(VendorControl.class); 143 var vendorItem = vendorControl.getVendorItemByEntityInstance(entityInstance); 144 145 if(vendorItem != null) { 146 var vendorItemDetail = vendorItem.getLastDetail(); 147 148 description = vendorItemDetail.getDescription(); 149 150 if(description == null) { 151 var itemControl = Session.getModelController(ItemControl.class); 152 description = itemControl.getBestItemStringDescription(getItemPurchaseOrderDescriptionType(), vendorItemDetail.getItem(), getLanguage(userVisit)); 153 } 154 } 155 } else if(entityTypeName.equals(EntityTypes.ForumGroup.name())) { 156 var forumControl = Session.getModelController(ForumControl.class); 157 var forumGroup = forumControl.getForumGroupByEntityInstance(entityInstance); 158 159 description = forumGroup == null ? null : forumControl.getBestForumGroupDescription(forumGroup, getLanguage(userVisit)); 160 } else if(entityTypeName.equals(EntityTypes.Forum.name())) { 161 var forumControl = Session.getModelController(ForumControl.class); 162 var forum = forumControl.getForumByEntityInstance(entityInstance); 163 164 description = forum == null ? null : forumControl.getBestForumDescription(forum, getLanguage(userVisit)); 165 } else if(entityTypeName.equals(EntityTypes.ForumThread.name())) { 166 // TODO: A method is needed to push the current limit on ForumMessages, and then pop it. A quick implementation of that 167 // proved difficult due to the limitCache in the Session. Its key is the Class for the BaseFactory vs. a String used by 168 // the limits Map. 169 var forumControl = Session.getModelController(ForumControl.class); 170 var forumThread = forumControl.getForumThreadByEntityInstance(entityInstance); 171 172 if(forumThread != null) { 173 var forumMessages = forumControl.getForumMessagesByForumThread(forumThread); 174 175 if(!forumMessages.isEmpty()) { 176 description = getDescriptionForForumMessage(userVisit, forumMessages.getFirst()); 177 } 178 } 179 } else if(entityTypeName.equals(EntityTypes.ForumMessage.name())) { 180 var forumControl = Session.getModelController(ForumControl.class); 181 var forumMessage = forumControl.getForumMessageByEntityInstance(entityInstance); 182 183 description = forumMessage == null ? null : getDescriptionForForumMessage(userVisit, forumMessage); 184 } else if(entityTypeName.equals(EntityTypes.MimeType.name())) { 185 var mimeTypeControl = Session.getModelController(MimeTypeControl.class); 186 var mimeType = mimeTypeControl.getMimeTypeByEntityInstance(entityInstance); 187 188 description = mimeType == null ? null : mimeTypeControl.getBestMimeTypeDescription(mimeType, getLanguage(userVisit)); 189 } else if(entityTypeName.equals(EntityTypes.Location.name())) { 190 var warehouseControl = Session.getModelController(WarehouseControl.class); 191 var location = warehouseControl.getLocationByEntityInstance(entityInstance); 192 193 description = location == null ? null : warehouseControl.getBestLocationDescription(location, getLanguage(userVisit)); 194 } else if(entityTypeName.equals(EntityTypes.ComponentVendor.name())) { 195 var componentControl = Session.getModelController(ComponentControl.class); 196 var componentVendor = componentControl.getComponentVendorByEntityInstance(entityInstance); 197 198 description = componentVendor == null ? null : componentVendor.getLastDetail().getDescription(); 199 } else if(entityTypeName.equals(EntityTypes.EntityType.name())) { 200 var entityTypeControl = Session.getModelController(EntityTypeControl.class); 201 var entityType = entityTypeControl.getEntityTypeByEntityInstance(entityInstance); 202 203 description = entityType == null ? null : entityTypeControl.getBestEntityTypeDescription(entityType, getLanguage(userVisit)); 204 } 205 } 206 } 207 208 return description; 209 } 210 211}