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}