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