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}