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