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