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}