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