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}