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.core.server.transfer; 018 019import javax.inject.Inject; 020import com.echothree.model.control.core.common.CoreOptions; 021import com.echothree.model.control.core.common.CoreProperties; 022import com.echothree.model.control.core.common.EntityAttributeTypes; 023import com.echothree.model.control.core.common.transfer.EntityAttributeTransfer; 024 025import com.echothree.model.control.core.server.control.EntityTypeControl; 026import com.echothree.model.control.sequence.server.control.SequenceControl; 027import com.echothree.model.control.uom.server.control.UomControl; 028import com.echothree.model.data.core.server.entity.EntityAttribute; 029import com.echothree.model.data.core.server.entity.EntityInstance; 030import com.echothree.model.data.user.server.entity.UserVisit; 031import com.echothree.util.common.form.TransferProperties; 032import com.echothree.util.common.transfer.ListWrapper; 033import javax.enterprise.context.RequestScoped; 034 035@RequestScoped 036public class EntityAttributeTransferCache 037 extends BaseCoreTransferCache<EntityAttribute, EntityAttributeTransfer> { 038 039 @Inject 040 EntityTypeControl entityTypeControl; 041 042 @Inject 043 SequenceControl sequenceControl; 044 045 @Inject 046 UomControl uomControl; 047 048 boolean includeDefault; 049 boolean includeValue; 050 boolean includeEntityListItems; 051 boolean includeEntityListItemsCount; 052 boolean includeEntityAttributeEntityTypes; 053 boolean includeEntityAttributeEntityTypesCount; 054 055 TransferProperties transferProperties; 056 boolean filterEntityType; 057 boolean filterEntityAttributeName; 058 boolean filterEntityAttributeType; 059 boolean filterTrackRevisions; 060 boolean filterCheckContentWebAddress; 061 boolean filterValidationPattern; 062 boolean filterEntityListItemSequence; 063 boolean filterUnitOfMeasureType; 064 boolean filterSortOrder; 065 boolean filterDescription; 066 boolean filterEntityInstance; 067 068 /** Creates a new instance of EntityAttributeTransferCache */ 069 protected EntityAttributeTransferCache() { 070 super(); 071 072 var options = session.getOptions(); 073 if(options != null) { 074 includeDefault = options.contains(CoreOptions.EntityAttributeIncludeDefault); 075 includeValue = options.contains(CoreOptions.EntityAttributeIncludeValue); 076 includeEntityListItems = options.contains(CoreOptions.EntityAttributeIncludeEntityListItems); 077 includeEntityListItemsCount = options.contains(CoreOptions.EntityAttributeIncludeEntityListItemsCount); 078 includeEntityAttributeEntityTypes = options.contains(CoreOptions.EntityAttributeIncludeEntityAttributeEntityTypes); 079 includeEntityAttributeEntityTypesCount = options.contains(CoreOptions.EntityAttributeIncludeEntityAttributeEntityTypesCount); 080 } 081 082 transferProperties = session.getTransferProperties(); 083 if(transferProperties != null) { 084 var properties = transferProperties.getProperties(EntityAttributeTransfer.class); 085 086 if(properties != null) { 087 filterEntityType = !properties.contains(CoreProperties.ENTITY_TYPE); 088 filterEntityAttributeName = !properties.contains(CoreProperties.ENTITY_ATTRIBUTE_NAME); 089 filterEntityAttributeType = !properties.contains(CoreProperties.ENTITY_ATTRIBUTE_TYPE); 090 filterTrackRevisions = !properties.contains(CoreProperties.TRACK_REVISIONS); 091 filterCheckContentWebAddress = !properties.contains(CoreProperties.CHECK_CONTENT_WEB_ADDRESS); 092 filterValidationPattern = !properties.contains(CoreProperties.VALIDATION_PATTERN); 093 filterEntityListItemSequence = !properties.contains(CoreProperties.ENTITY_LIST_ITEM_SEQUENCE); 094 filterUnitOfMeasureType = !properties.contains(CoreProperties.UNIT_OF_MEASURE_TYPE); 095 filterSortOrder = !properties.contains(CoreProperties.SORT_ORDER); 096 filterDescription = !properties.contains(CoreProperties.DESCRIPTION); 097 filterEntityInstance = !properties.contains(CoreProperties.ENTITY_INSTANCE); 098 } 099 } 100 101 setIncludeEntityInstance(!filterEntityInstance); 102 } 103 104 public EntityAttributeTransfer getEntityAttributeTransfer(final UserVisit userVisit, final EntityAttribute entityAttribute, final EntityInstance entityInstance) { 105 var entityAttributeTransfer = get(entityAttribute); 106 107 if(entityAttributeTransfer == null) { 108 var entityAttributeDetail = entityAttribute.getLastDetail(); 109 var entityTypeTransfer = filterEntityType ? null : entityTypeControl.getEntityTypeTransfer(userVisit, entityAttributeDetail.getEntityType()); 110 var entityAttributeName = filterEntityAttributeName ? null : entityAttributeDetail.getEntityAttributeName(); 111 var entityAttributeType = entityAttributeDetail.getEntityAttributeType(); 112 var entityAttributeTypeTransfer = filterEntityAttributeType ? null : coreControl.getEntityAttributeTypeTransfer(userVisit, entityAttributeType); 113 var trackRevisions = filterTrackRevisions ? null : entityAttributeDetail.getTrackRevisions(); 114 var sortOrder = filterSortOrder ? null : entityAttributeDetail.getSortOrder(); 115 var description = filterDescription ? null : coreControl.getBestEntityAttributeDescription(entityAttribute, getLanguage(userVisit)); 116 117 entityAttributeTransfer = new EntityAttributeTransfer(entityTypeTransfer, entityAttributeTypeTransfer, entityAttributeName, 118 trackRevisions, sortOrder, description); 119 120 var entityAttributeTypeName = entityAttributeType.getEntityAttributeTypeName(); 121 switch(EntityAttributeTypes.valueOf(entityAttributeTypeName)) { 122 case BLOB -> { 123 if(!filterCheckContentWebAddress) { 124 var entityAttributeBlob = coreControl.getEntityAttributeBlob(entityAttribute); 125 126 entityAttributeTransfer.setCheckContentWebAddress(entityAttributeBlob.getCheckContentWebAddress()); 127 } 128 } 129 case STRING -> { 130 if(!filterValidationPattern) { 131 var entityAttributeString = coreControl.getEntityAttributeString(entityAttribute); 132 133 if(entityAttributeString != null) { 134 entityAttributeTransfer.setValidationPattern(filterValidationPattern ? null : entityAttributeString.getValidationPattern()); 135 } 136 } 137 } 138 case INTEGER -> { 139 // TODO 140 141 if(!filterUnitOfMeasureType) { 142 var entityAttributeNumeric = coreControl.getEntityAttributeNumeric(entityAttribute); 143 144 if(entityAttributeNumeric != null) { 145 if(!filterUnitOfMeasureType) { 146 var unitOfMeasureType = entityAttributeNumeric.getUnitOfMeasureType(); 147 148 entityAttributeTransfer.setUnitOfMeasureType(unitOfMeasureType == null ? null : uomControl.getUnitOfMeasureTypeTransfer(userVisit, unitOfMeasureType)); 149 } 150 } 151 } 152 } 153 case LONG -> { 154 // TODO 155 if(!filterUnitOfMeasureType) { 156 var entityAttributeNumeric = coreControl.getEntityAttributeNumeric(entityAttribute); 157 158 if(entityAttributeNumeric != null) { 159 if(!filterUnitOfMeasureType) { 160 var unitOfMeasureType = entityAttributeNumeric.getUnitOfMeasureType(); 161 162 entityAttributeTransfer.setUnitOfMeasureType(unitOfMeasureType == null ? null : uomControl.getUnitOfMeasureTypeTransfer(userVisit, unitOfMeasureType)); 163 } 164 } 165 } 166 } 167 case LISTITEM, MULTIPLELISTITEM -> { 168 if(!filterEntityListItemSequence) { 169 var entityAttributeListItem = coreControl.getEntityAttributeListItem(entityAttribute); 170 171 if(entityAttributeListItem != null) { 172 if(!filterEntityListItemSequence) { 173 var entityListItemSequence = entityAttributeListItem.getEntityListItemSequence(); 174 175 entityAttributeTransfer.setEntityListItemSequence(entityListItemSequence == null ? null : sequenceControl.getSequenceTransfer(userVisit, entityListItemSequence)); 176 } 177 } 178 } 179 } 180 default -> {} 181 } 182 183 if(entityInstance == null) { 184 put(userVisit, entityAttribute, entityAttributeTransfer); 185 } else { 186 setupEntityInstance(userVisit, entityAttribute, null, entityAttributeTransfer); 187 } 188 189 if(includeDefault || (includeValue && entityInstance != null)) { 190 var entityAttributeTypeEnum = EntityAttributeTypes.valueOf(entityAttributeTypeName); 191 192 switch(entityAttributeTypeEnum) { 193 case BOOLEAN -> { 194 if(includeDefault) { 195 var entityBooleanDefault = coreControl.getEntityBooleanDefault(entityAttribute); 196 197 entityAttributeTransfer.setEntityBooleanDefault(entityBooleanDefault == null ? null : coreControl.getEntityBooleanDefaultTransfer(userVisit, entityBooleanDefault)); 198 } 199 200 if(includeValue && entityInstance != null) { 201 var entityBooleanAttribute = coreControl.getEntityBooleanAttribute(entityAttribute, entityInstance); 202 203 entityAttributeTransfer.setEntityBooleanAttribute(entityBooleanAttribute == null ? null : coreControl.getEntityBooleanAttributeTransfer(userVisit, entityBooleanAttribute, entityInstance)); 204 } 205 } 206 case NAME -> { 207 if(includeValue && entityInstance != null) { 208 var entityNameAttribute = coreControl.getEntityNameAttribute(entityAttribute, entityInstance); 209 210 entityAttributeTransfer.setEntityNameAttribute(entityNameAttribute == null ? null : coreControl.getEntityNameAttributeTransfer(userVisit, entityNameAttribute, entityInstance)); 211 } 212 } 213 case INTEGER -> { 214 if(includeDefault) { 215 var entityIntegerDefault = coreControl.getEntityIntegerDefault(entityAttribute); 216 217 entityAttributeTransfer.setEntityIntegerDefault(entityIntegerDefault == null ? null : coreControl.getEntityIntegerDefaultTransfer(userVisit, entityIntegerDefault)); 218 } 219 220 if(includeValue && entityInstance != null) { 221 var entityIntegerAttribute = coreControl.getEntityIntegerAttribute(entityAttribute, entityInstance); 222 223 entityAttributeTransfer.setEntityIntegerAttribute(entityIntegerAttribute == null ? null : coreControl.getEntityIntegerAttributeTransfer(userVisit, entityIntegerAttribute, entityInstance)); 224 } 225 } 226 case LONG -> { 227 if(includeDefault) { 228 var entityLongDefault = coreControl.getEntityLongDefault(entityAttribute); 229 230 entityAttributeTransfer.setEntityLongDefault(entityLongDefault == null ? null : coreControl.getEntityLongDefaultTransfer(userVisit, entityLongDefault)); 231 } 232 233 if(includeValue && entityInstance != null) { 234 var entityLongAttribute = coreControl.getEntityLongAttribute(entityAttribute, entityInstance); 235 236 entityAttributeTransfer.setEntityLongAttribute(entityLongAttribute == null ? null : coreControl.getEntityLongAttributeTransfer(userVisit, entityLongAttribute, entityInstance)); 237 } 238 } 239 case STRING -> { 240 if(includeDefault) { 241 var entityStringDefault = coreControl.getEntityStringDefault(entityAttribute, getLanguage(userVisit)); 242 243 entityAttributeTransfer.setEntityStringDefault(entityStringDefault == null ? null : coreControl.getEntityStringDefaultTransfer(userVisit, entityStringDefault)); 244 } 245 246 if(includeValue && entityInstance != null) { 247 var entityStringAttribute = coreControl.getBestEntityStringAttribute(entityAttribute, entityInstance, getLanguage(userVisit)); 248 249 entityAttributeTransfer.setEntityStringAttribute(entityStringAttribute == null ? null : coreControl.getEntityStringAttributeTransfer(userVisit, entityStringAttribute, entityInstance)); 250 } 251 } 252 case GEOPOINT -> { 253 if(includeValue && entityInstance != null) { 254 var entityGeoPointAttribute = coreControl.getEntityGeoPointAttribute(entityAttribute, entityInstance); 255 256 entityAttributeTransfer.setEntityGeoPointAttribute(entityGeoPointAttribute == null ? null : coreControl.getEntityGeoPointAttributeTransfer(userVisit, entityGeoPointAttribute, entityInstance)); 257 } 258 } 259 case BLOB -> { 260 if(includeValue && entityInstance != null) { 261 var entityBlobAttribute = coreControl.getBestEntityBlobAttribute(entityAttribute, entityInstance, getLanguage(userVisit)); 262 263 entityAttributeTransfer.setEntityBlobAttribute(entityBlobAttribute == null ? null : coreControl.getEntityBlobAttributeTransfer(userVisit, entityBlobAttribute, entityInstance)); 264 } 265 } 266 case CLOB -> { 267 if(includeValue && entityInstance != null) { 268 var entityClobAttribute = coreControl.getBestEntityClobAttribute(entityAttribute, entityInstance, getLanguage(userVisit)); 269 270 entityAttributeTransfer.setEntityClobAttribute(entityClobAttribute == null ? null : coreControl.getEntityClobAttributeTransfer(userVisit, entityClobAttribute, entityInstance)); 271 } 272 } 273 case ENTITY -> { 274 if(includeValue && entityInstance != null) { 275 var entityEntityAttribute = coreControl.getEntityEntityAttribute(entityAttribute, entityInstance); 276 277 entityAttributeTransfer.setEntityEntityAttribute(entityEntityAttribute == null ? null : coreControl.getEntityEntityAttributeTransfer(userVisit, entityEntityAttribute, entityInstance)); 278 } 279 } 280 case COLLECTION -> { 281 if(includeValue && entityInstance != null) { 282 entityAttributeTransfer.setEntityCollectionAttributes(new ListWrapper<>(coreControl.getEntityCollectionAttributeTransfers(userVisit, entityAttribute, entityInstance))); 283 } 284 } 285 case DATE -> { 286 if(includeDefault) { 287 var entityDateDefault = coreControl.getEntityDateDefault(entityAttribute); 288 289 entityAttributeTransfer.setEntityDateDefault(entityDateDefault == null ? null : coreControl.getEntityDateDefaultTransfer(userVisit, entityDateDefault)); 290 } 291 292 if(includeValue && entityInstance != null) { 293 var entityDateAttribute = coreControl.getEntityDateAttribute(entityAttribute, entityInstance); 294 295 entityAttributeTransfer.setEntityDateAttribute(entityDateAttribute == null ? null : coreControl.getEntityDateAttributeTransfer(userVisit, entityDateAttribute, entityInstance)); 296 } 297 } 298 case TIME -> { 299 if(includeValue && entityInstance != null) { 300 var entityTimeAttribute = coreControl.getEntityTimeAttribute(entityAttribute, entityInstance); 301 302 entityAttributeTransfer.setEntityTimeAttribute(entityTimeAttribute == null ? null : coreControl.getEntityTimeAttributeTransfer(userVisit, entityTimeAttribute, entityInstance)); 303 } 304 } 305 case LISTITEM -> { 306 if(includeDefault) { 307 var entityListItemDefault = coreControl.getEntityListItemDefault(entityAttribute); 308 309 entityAttributeTransfer.setEntityListItemDefault(entityListItemDefault == null ? null : coreControl.getEntityListItemDefaultTransfer(userVisit, entityListItemDefault)); 310 } 311 312 if(includeValue && entityInstance != null) { 313 var entityListItemAttribute = coreControl.getEntityListItemAttribute(entityAttribute, entityInstance); 314 315 entityAttributeTransfer.setEntityListItemAttribute(entityListItemAttribute == null ? null : coreControl.getEntityListItemAttributeTransfer(userVisit, entityListItemAttribute, entityInstance)); 316 } 317 } 318 case MULTIPLELISTITEM -> { 319 if(includeDefault) { 320 var entityMultipleListItemDefaults = coreControl.getEntityMultipleListItemDefaults(entityAttribute); 321 322 entityAttributeTransfer.setEntityMultipleListItemDefaults(new ListWrapper<>(coreControl.getEntityMultipleListItemDefaultTransfers(userVisit, entityMultipleListItemDefaults))); 323 } 324 325 if(includeValue && entityInstance != null) { 326 entityAttributeTransfer.setEntityMultipleListItemAttributes(new ListWrapper<>(coreControl.getEntityMultipleListItemAttributeTransfers(userVisit, entityAttribute, entityInstance))); 327 } 328 } 329 case WORKFLOW -> {} // Nothing 330 } 331 } 332 333 if(includeEntityListItemsCount) { 334 entityAttributeTransfer.setEntityListItemsCount(coreControl.countEntityListItems(entityAttribute)); 335 } 336 337 if(includeEntityListItems) { 338 entityAttributeTransfer.setEntityListItems(new ListWrapper<>(coreControl.getEntityListItemTransfersByEntityAttribute(userVisit, entityAttribute, entityInstance))); 339 } 340 341 if(includeEntityAttributeEntityTypesCount) { 342 entityAttributeTransfer.setEntityAttributeEntityTypesCount(coreControl.countEntityAttributeEntityTypesByEntityAttribute(entityAttribute)); 343 } 344 345 if(includeEntityAttributeEntityTypes) { 346 entityAttributeTransfer.setEntityAttributeEntityTypes(new ListWrapper<>(coreControl.getEntityAttributeEntityTypeTransfersByEntityAttribute(userVisit, entityAttribute, entityInstance))); 347 } 348 } 349 return entityAttributeTransfer; 350 } 351 352}