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.model.control.core.server.transfer;
018
019import com.echothree.model.control.core.common.CoreOptions;
020import com.echothree.model.control.core.common.CoreProperties;
021import com.echothree.model.control.core.common.transfer.EntityInstanceTransfer;
022import com.echothree.model.control.core.server.control.AppearanceControl;
023import com.echothree.model.control.core.server.control.EntityTypeControl;
024import com.echothree.model.control.core.server.control.EventControl;
025import com.echothree.model.data.core.server.entity.EntityInstance;
026import com.echothree.model.data.user.server.entity.UserVisit;
027import com.echothree.util.common.form.TransferProperties;
028import com.echothree.util.common.transfer.BaseOptions;
029import com.echothree.util.server.persistence.EntityDescriptionUtils;
030import com.echothree.util.server.persistence.EntityNamesUtils;
031import javax.enterprise.context.RequestScoped;
032import javax.inject.Inject;
033
034@RequestScoped
035public class EntityInstanceTransferCache
036        extends BaseCoreTransferCache<EntityInstance, EntityInstanceTransfer> {
037
038    @Inject
039    AppearanceControl appearanceControl;
040
041    @Inject
042    EntityTypeControl entityTypeControl;
043
044    @Inject
045    EventControl eventControl;
046
047    boolean includeComments;
048    boolean includeRatings;
049    boolean includeEntityAppearance;
050    boolean includeEntityVisit;
051    boolean includeNames;
052    boolean includeUuidIfAvailable;
053
054    TransferProperties transferProperties;
055    boolean filterEntityType;
056    boolean filterEntityUniqueId;
057    boolean filterEntityRef;
058    boolean filterEntityTime;
059    boolean filterDescription;
060    
061    /** Creates a new instance of EntityInstanceTransferCache */
062    protected EntityInstanceTransferCache() {
063        super();
064        
065        var options = session.getOptions();
066        if(options != null) {
067            includeComments = options.contains(CoreOptions.EntityInstanceIncludeComments);
068            includeRatings = options.contains(CoreOptions.EntityInstanceIncludeRatings);
069            includeEntityAppearance = options.contains(CoreOptions.EntityInstanceIncludeEntityAppearance);
070            includeEntityVisit = options.contains(CoreOptions.EntityInstanceIncludeEntityVisit);
071            includeNames = options.contains(CoreOptions.EntityInstanceIncludeNames);
072            includeUuidIfAvailable = options.contains(CoreOptions.EntityInstanceIncludeUuidIfAvailable);
073            setIncludeEntityAliases(options.contains(CoreOptions.EntityInstanceIncludeEntityAliases));
074            setIncludeEntityAttributeGroups(options.contains(CoreOptions.EntityInstanceIncludeEntityAttributeGroups));
075            setIncludeTagScopes(options.contains(CoreOptions.EntityInstanceIncludeTagScopes));
076            setIncludeSourceLinkTypes(options.contains(CoreOptions.EntityInstanceIncludeSourceLinkTypes)
077                    || options.contains(BaseOptions.BaseIncludeSourceLinkTypes));
078            setIncludeTargetLinkTypes(options.contains(CoreOptions.EntityInstanceIncludeTargetLinkTypes)
079                    || options.contains(BaseOptions.BaseIncludeTargetLinkTypes));
080        }
081
082        transferProperties = session.getTransferProperties();
083        if(transferProperties != null) {
084            var properties = transferProperties.getProperties(EntityInstanceTransfer.class);
085            
086            if(properties != null) {
087                filterEntityType = !properties.contains(CoreProperties.ENTITY_TYPE);
088                filterEntityUniqueId = !properties.contains(CoreProperties.ENTITY_UNIQUE_ID);
089                filterEntityRef = !properties.contains(CoreProperties.ENTITY_REF);
090                filterEntityTime = !properties.contains(CoreProperties.ENTITY_TIME);
091                filterDescription = !properties.contains(CoreProperties.DESCRIPTION);
092            }
093        }
094
095        setIncludeEntityInstance(true);
096    }
097
098    public EntityInstanceTransfer getEntityInstanceTransfer(final UserVisit userVisit, EntityInstance entityInstance, final boolean includeEntityAppearance,
099            final boolean includeEntityVisit, final boolean includeNames, final boolean includeUuid) {
100        var entityInstanceTransfer = get(entityInstance);
101        
102        if(entityInstanceTransfer == null) {
103            var entityTypeTransfer = filterEntityType ? null : entityTypeControl.getEntityTypeTransfer(userVisit, entityInstance.getEntityType());
104            var entityUniqueId = filterEntityUniqueId ? null : entityInstance.getEntityUniqueId();
105            String uuid = null;
106            var componentVendorTransfer = entityTypeTransfer == null ? null : entityTypeTransfer.getComponentVendor();
107            var componentVendorName = componentVendorTransfer == null ? null : componentVendorTransfer.getComponentVendorName();
108            var entityTypeName = entityTypeTransfer == null ? null : entityTypeTransfer.getEntityTypeName();
109            var entityRef = filterEntityRef || componentVendorName == null || entityTypeName == null || entityUniqueId == null ? null : componentVendorName + '.' + entityTypeName + '.' + entityUniqueId;
110            var entityTime = filterEntityTime ? null : eventControl.getEntityTime(entityInstance);
111            var entityTimeTransfer = entityTime == null ? null : eventControl.getEntityTimeTransfer(userVisit, entityTime);
112            String description = null;
113            
114            if(includeUuid || includeUuidIfAvailable) {
115                uuid = entityInstance.getUuid();
116                
117                if(includeUuid && uuid == null) {
118                    entityInstance = entityInstanceControl.ensureUuidForEntityInstance(entityInstance, false);
119                    uuid = entityInstance.getUuid();
120                }
121            }
122            
123            if(!filterDescription) {
124                description = EntityDescriptionUtils.getInstance().getDescription(userVisit, entityInstance);
125            }
126            
127            entityInstanceTransfer = new EntityInstanceTransfer(entityTypeTransfer, entityUniqueId, uuid, entityRef,
128                    entityTimeTransfer, description);
129            put(userVisit, entityInstance, entityInstanceTransfer, entityInstance);
130
131            if(includeComments) {
132                setupAllCommentTypes(userVisit, null, entityInstance, entityInstanceTransfer);
133            }
134
135            if(includeRatings) {
136                setupAllRatingTypes(userVisit, null, entityInstance, entityInstanceTransfer);
137            }
138
139            if(includeEntityAppearance || this.includeEntityAppearance) {
140
141                var entityAppearance = appearanceControl.getEntityAppearance(entityInstance);
142
143                entityInstanceTransfer.setEntityAppearance(entityAppearance == null ? null : appearanceControl.getEntityAppearanceTransfer(userVisit, entityAppearance));
144            }
145
146            if(includeEntityVisit || this.includeEntityVisit) {
147                // visitingParty could be null
148                var visitingParty = userControl.getPartyFromUserVisit(userVisit);
149                var visitingEntityInstance = visitingParty == null ? null : entityInstanceControl.getEntityInstanceByBasePK(visitingParty.getPrimaryKey());
150
151                // visitingEntityInstance = the entityInstance parameter
152                // entityInstance = the visitedEntityInstance parameter
153                var entityVisit = visitingEntityInstance == null ? null : eventControl.getEntityVisit(visitingEntityInstance, entityInstance);
154
155                entityInstanceTransfer.setEntityVisit(entityVisit == null ? null : eventControl.getEntityVisitTransfer(userVisit, entityVisit));
156            }
157
158            if(includeNames || this.includeNames) {
159                var entityNamesMapping = EntityNamesUtils.getInstance().getEntityNames(entityInstance);
160                
161                entityInstanceTransfer.setEntityNames(entityNamesMapping == null ? null : entityNamesMapping.getEntityNames());
162            }
163        }
164        
165        return entityInstanceTransfer;
166    }
167
168}