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