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.item.server.transfer;
018
019import javax.inject.Inject;
020import com.echothree.model.control.core.server.control.EventControl;
021import com.echothree.model.control.core.server.control.MimeTypeControl;
022import com.echothree.model.control.item.common.ItemOptions;
023import com.echothree.model.control.item.common.ItemProperties;
024import com.echothree.model.control.item.common.transfer.ItemDescriptionTransfer;
025import com.echothree.model.control.item.common.transfer.ItemImageTypeTransfer;
026import com.echothree.model.control.item.server.control.ItemControl;
027import com.echothree.model.control.party.server.control.PartyControl;
028import com.echothree.model.data.item.server.entity.ItemDescription;
029import com.echothree.model.data.user.server.entity.UserVisit;
030import com.echothree.util.common.form.TransferProperties;
031import com.echothree.util.common.persistence.type.ByteArray;
032import javax.enterprise.context.RequestScoped;
033
034@RequestScoped
035public class ItemDescriptionTransferCache
036        extends BaseItemTransferCache<ItemDescription, ItemDescriptionTransfer> {
037
038    @Inject
039    EventControl eventControl;
040
041    @Inject
042    ItemControl itemControl;
043
044    @Inject
045    MimeTypeControl mimeTypeControl;
046
047    @Inject
048    PartyControl partyControl;
049    
050    boolean includeBlob;
051    boolean includeClob;
052    boolean includeString;
053    boolean includeImageDescription;
054    boolean includeETag;
055    
056    TransferProperties transferProperties;
057    boolean filterItemDescriptionType;
058    boolean filterItem;
059    boolean filterLanguage;
060    boolean filterMimeType;
061    boolean filterItemImageType;
062    boolean filterHeight;
063    boolean filterWidth;
064    boolean filterScaledFromParent;
065    boolean filterEntityInstance;
066
067    /** Creates a new instance of ItemDescriptionTransferCache */
068    protected ItemDescriptionTransferCache() {
069        super();
070
071        var options = session.getOptions();
072        if(options != null) {
073            includeBlob = options.contains(ItemOptions.ItemDescriptionIncludeBlob);
074            includeClob = options.contains(ItemOptions.ItemDescriptionIncludeClob);
075            includeString = options.contains(ItemOptions.ItemDescriptionIncludeString);
076            includeImageDescription = options.contains(ItemOptions.ItemDescriptionIncludeImageDescription);
077            includeETag = options.contains(ItemOptions.ItemDescriptionIncludeETag);
078            setIncludeEntityAttributeGroups(options.contains(ItemOptions.ItemDescriptionIncludeEntityAttributeGroups));
079            setIncludeTagScopes(options.contains(ItemOptions.ItemDescriptionIncludeTagScopes));
080        }
081        
082        transferProperties = session.getTransferProperties();
083        if(transferProperties != null) {
084            var properties = transferProperties.getProperties(ItemDescriptionTransfer.class);
085            
086            if(properties != null) {
087                filterItemDescriptionType = !properties.contains(ItemProperties.ITEM_DESCRIPTION_TYPE);
088                filterItem = !properties.contains(ItemProperties.ITEM);
089                filterLanguage = !properties.contains(ItemProperties.LANGUAGE);
090                filterMimeType = !properties.contains(ItemProperties.MIME_TYPE);
091                filterItemImageType = !properties.contains(ItemProperties.ITEM_IMAGE_TYPE);
092                filterHeight = !properties.contains(ItemProperties.HEIGHT);
093                filterWidth = !properties.contains(ItemProperties.WIDTH);
094                filterScaledFromParent = !properties.contains(ItemProperties.SCALED_FROM_PARENT);
095                filterEntityInstance = !properties.contains(ItemProperties.ENTITY_INSTANCE);
096            }
097        }
098        
099        setIncludeEntityInstance(!filterEntityInstance);
100    }
101    
102    @Override
103    public ItemDescriptionTransfer getTransfer(UserVisit userVisit, ItemDescription itemDescription) {
104        var itemDescriptionTransfer = get(itemDescription);
105        
106        if(itemDescriptionTransfer == null) {
107            var itemDescriptionDetail = itemDescription.getLastDetail();
108            var itemDescriptionTypeTransfer = filterItemDescriptionType ? null : itemControl.getItemDescriptionTypeTransfer(userVisit, itemDescriptionDetail.getItemDescriptionType());
109            var item = itemDescriptionDetail.getItem();
110            var itemTransfer = filterItem ? null : itemControl.getItemTransfer(userVisit, item);
111            var languageTransfer = filterLanguage ? null : partyControl.getLanguageTransfer(userVisit, itemDescriptionDetail.getLanguage());
112            var mimeType = filterMimeType ? null : itemDescriptionDetail.getMimeType();
113            var mimeTypeTransfer = mimeType == null? null: mimeTypeControl.getMimeTypeTransfer(userVisit, mimeType);
114            ByteArray blobDescription = null;
115            String clobDescription = null;
116            String stringDescription = null;
117            ItemImageTypeTransfer itemImageTypeTransfer = null;
118            Integer height = null;
119            Integer width = null;
120            Boolean scaledFromParent = null;
121            String eTag = null;
122            long eTagEntityId = 0;
123            var eTagSize = 0;
124
125            if(includeBlob || includeETag) {
126                var itemBlobDescription = itemControl.getItemBlobDescription(itemDescription);
127
128                if(itemBlobDescription != null) {
129                    if(includeBlob) {
130                        blobDescription = itemBlobDescription.getBlobDescription();
131                    }
132
133                    eTagEntityId = itemBlobDescription.getPrimaryKey().getEntityId();
134                    eTagSize = itemBlobDescription.getBlobDescription().byteArrayValue().length;
135                }
136            }
137
138            if(includeClob || includeETag) {
139                var itemClobDescription = itemControl.getItemClobDescription(itemDescription);
140
141                if(itemClobDescription != null) {
142                    if(includeClob) {
143                        clobDescription = itemClobDescription.getClobDescription();
144                    }
145
146                    eTagEntityId = itemClobDescription.getPrimaryKey().getEntityId();
147                    eTagSize = itemClobDescription.getClobDescription().length();
148                }
149            }
150
151            if(includeString || includeETag) {
152                var itemStringDescription = itemControl.getItemStringDescription(itemDescription);
153
154                if(itemStringDescription != null) {
155                    if(includeString) {
156                        stringDescription = itemStringDescription.getStringDescription();
157                    }
158
159                    eTagEntityId = itemStringDescription.getPrimaryKey().getEntityId();
160                    eTagSize = itemStringDescription.getStringDescription().length();
161                }
162            }
163
164            if(includeImageDescription) {
165                var itemImageDescription = itemControl.getItemImageDescription(itemDescription);
166
167                if(itemImageDescription != null) {
168                    itemImageTypeTransfer = filterItemImageType ? null : itemControl.getItemImageTypeTransfer(userVisit, itemImageDescription.getItemImageType());
169                    height = filterHeight ? null : itemImageDescription.getHeight();
170                    width = filterWidth ? null : itemImageDescription.getWidth();
171                    scaledFromParent = filterScaledFromParent ? null : itemImageDescription.getScaledFromParent();
172                }
173            }
174
175            if(includeETag && eTagEntityId != 0) {
176                // Item Descriptions do not have their own EntityTime, fall back on the Item's EntityTime.
177                var entityTimeTransfer = item == null ? null : itemTransfer.getEntityInstance().getEntityTime();
178                Long maxTime;
179
180                if(entityTimeTransfer == null) {
181                    var entityInstance = entityInstanceControl.getEntityInstanceByBasePK(item.getPrimaryKey());
182                    var entityTime = eventControl.getEntityTime(entityInstance);
183                    var modifiedTime = entityTime.getModifiedTime();
184                    
185                    maxTime = modifiedTime == null ? entityTime.getCreatedTime() : modifiedTime;
186                } else {
187                    var modifiedTime = entityTimeTransfer.getUnformattedModifiedTime();
188                    
189                    maxTime = modifiedTime == null ? entityTimeTransfer.getUnformattedCreatedTime() : modifiedTime;
190                }
191                
192                // EntityId-Size-ModifiedTime
193                eTag = Long.toHexString(eTagEntityId) + '-' + Integer.toHexString(eTagSize) + '-' + Long.toHexString(maxTime);
194            }
195            
196            itemDescriptionTransfer = new ItemDescriptionTransfer(itemDescriptionTypeTransfer, itemTransfer, languageTransfer, mimeTypeTransfer,
197                    blobDescription, clobDescription, stringDescription, itemImageTypeTransfer, height, width, scaledFromParent, eTag);
198            put(userVisit, itemDescription, itemDescriptionTransfer);
199        }
200        
201        return itemDescriptionTransfer;
202    }
203    
204}