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}