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