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}