001// --------------------------------------------------------------------------------
002// Copyright 2002-2024 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.common.transfer.EntityAttributeTypeTransfer;
024import com.echothree.model.control.core.common.transfer.EntityTypeTransfer;
025import com.echothree.model.control.core.server.control.CoreControl;
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.EntityAttributeBlob;
030import com.echothree.model.data.core.server.entity.EntityAttributeDetail;
031import com.echothree.model.data.core.server.entity.EntityAttributeListItem;
032import com.echothree.model.data.core.server.entity.EntityAttributeNumeric;
033import com.echothree.model.data.core.server.entity.EntityAttributeString;
034import com.echothree.model.data.core.server.entity.EntityAttributeType;
035import com.echothree.model.data.core.server.entity.EntityBlobAttribute;
036import com.echothree.model.data.core.server.entity.EntityBooleanAttribute;
037import com.echothree.model.data.core.server.entity.EntityClobAttribute;
038import com.echothree.model.data.core.server.entity.EntityDateAttribute;
039import com.echothree.model.data.core.server.entity.EntityEntityAttribute;
040import com.echothree.model.data.core.server.entity.EntityGeoPointAttribute;
041import com.echothree.model.data.core.server.entity.EntityInstance;
042import com.echothree.model.data.core.server.entity.EntityIntegerAttribute;
043import com.echothree.model.data.core.server.entity.EntityListItemAttribute;
044import com.echothree.model.data.core.server.entity.EntityLongAttribute;
045import com.echothree.model.data.core.server.entity.EntityNameAttribute;
046import com.echothree.model.data.core.server.entity.EntityStringAttribute;
047import com.echothree.model.data.core.server.entity.EntityTimeAttribute;
048import com.echothree.model.data.sequence.server.entity.Sequence;
049import com.echothree.model.data.uom.server.entity.UnitOfMeasureType;
050import com.echothree.model.data.user.server.entity.UserVisit;
051import com.echothree.util.common.form.TransferProperties;
052import com.echothree.util.common.transfer.ListWrapper;
053import com.echothree.util.server.persistence.Session;
054import java.util.Set;
055
056public class EntityAttributeTransferCache
057        extends BaseCoreTransferCache<EntityAttribute, EntityAttributeTransfer> {
058
059    CoreControl coreControl = Session.getModelController(CoreControl.class);
060    SequenceControl sequenceControl = Session.getModelController(SequenceControl.class);
061    UomControl uomControl = Session.getModelController(UomControl.class);
062    
063    boolean includeValue;
064    boolean includeEntityListItems;
065    boolean includeEntityListItemsCount;
066    boolean includeEntityAttributeEntityTypes;
067    boolean includeEntityAttributeEntityTypesCount;
068
069    TransferProperties transferProperties;
070    boolean filterEntityType;
071    boolean filterEntityAttributeName;
072    boolean filterEntityAttributeType;
073    boolean filterTrackRevisions;
074    boolean filterCheckContentWebAddress;
075    boolean filterValidationPattern;
076    boolean filterEntityListItemSequence;
077    boolean filterUnitOfMeasureType;
078    boolean filterSortOrder;
079    boolean filterDescription;
080    boolean filterEntityInstance;
081
082    /** Creates a new instance of EntityAttributeTransferCache */
083    public EntityAttributeTransferCache(UserVisit userVisit) {
084        super(userVisit);
085        
086        var options = session.getOptions();
087        if(options != null) {
088            includeValue = options.contains(CoreOptions.EntityAttributeIncludeValue);
089            includeEntityListItems = options.contains(CoreOptions.EntityAttributeIncludeEntityListItems);
090            includeEntityListItemsCount = options.contains(CoreOptions.EntityAttributeIncludeEntityListItemsCount);
091            includeEntityAttributeEntityTypes = options.contains(CoreOptions.EntityAttributeIncludeEntityAttributeEntityTypes);
092            includeEntityAttributeEntityTypesCount = options.contains(CoreOptions.EntityAttributeIncludeEntityAttributeEntityTypesCount);
093        }
094        
095        transferProperties = session.getTransferProperties();
096        if(transferProperties != null) {
097            var properties = transferProperties.getProperties(EntityAttributeTransfer.class);
098            
099            if(properties != null) {
100                filterEntityType = !properties.contains(CoreProperties.ENTITY_TYPE);
101                filterEntityAttributeName = !properties.contains(CoreProperties.ENTITY_ATTRIBUTE_NAME);
102                filterEntityAttributeType = !properties.contains(CoreProperties.ENTITY_ATTRIBUTE_TYPE);
103                filterTrackRevisions = !properties.contains(CoreProperties.TRACK_REVISIONS);
104                filterCheckContentWebAddress = !properties.contains(CoreProperties.CHECK_CONTENT_WEB_ADDRESS);
105                filterValidationPattern = !properties.contains(CoreProperties.VALIDATION_PATTERN);
106                filterEntityListItemSequence = !properties.contains(CoreProperties.ENTITY_LIST_ITEM_SEQUENCE);
107                filterUnitOfMeasureType = !properties.contains(CoreProperties.UNIT_OF_MEASURE_TYPE);
108                filterSortOrder = !properties.contains(CoreProperties.SORT_ORDER);
109                filterDescription = !properties.contains(CoreProperties.DESCRIPTION);
110                filterEntityInstance = !properties.contains(CoreProperties.ENTITY_INSTANCE);
111            }
112        }
113        
114        setIncludeEntityInstance(!filterEntityInstance);
115    }
116    
117    public EntityAttributeTransfer getEntityAttributeTransfer(EntityAttribute entityAttribute, EntityInstance entityInstance) {
118        EntityAttributeTransfer entityAttributeTransfer = get(entityAttribute);
119        
120        if(entityAttributeTransfer == null) {
121            EntityAttributeDetail entityAttributeDetail = entityAttribute.getLastDetail();
122            EntityTypeTransfer entityTypeTransfer = filterEntityType ? null : coreControl.getEntityTypeTransfer(userVisit, entityAttributeDetail.getEntityType());
123            String entityAttributeName = filterEntityAttributeName ? null : entityAttributeDetail.getEntityAttributeName();
124            EntityAttributeType entityAttributeType = entityAttributeDetail.getEntityAttributeType();
125            EntityAttributeTypeTransfer entityAttributeTypeTransfer = filterEntityAttributeType ? null : coreControl.getEntityAttributeTypeTransfer(userVisit, entityAttributeType);
126            Boolean trackRevisions = filterTrackRevisions ? null : entityAttributeDetail.getTrackRevisions();
127            Integer sortOrder = filterSortOrder ? null : entityAttributeDetail.getSortOrder();
128            String description = filterDescription ? null : coreControl.getBestEntityAttributeDescription(entityAttribute, getLanguage());
129            
130            entityAttributeTransfer = new EntityAttributeTransfer(entityTypeTransfer, entityAttributeTypeTransfer, entityAttributeName,
131                    trackRevisions, sortOrder, description);
132            
133            String entityAttributeTypeName = entityAttributeType.getEntityAttributeTypeName();
134            switch(EntityAttributeTypes.valueOf(entityAttributeTypeName)) {
135                case BLOB:
136                    if(!filterCheckContentWebAddress) {
137                        EntityAttributeBlob entityAttributeBlob = coreControl.getEntityAttributeBlob(entityAttribute);
138                        
139                        entityAttributeTransfer.setCheckContentWebAddress(entityAttributeBlob.getCheckContentWebAddress());
140                    }
141                    break;
142                case STRING:
143                    if(!filterValidationPattern) {
144                        EntityAttributeString entityAttributeString = coreControl.getEntityAttributeString(entityAttribute);
145                        
146                        if(entityAttributeString != null) {
147                            entityAttributeTransfer.setValidationPattern(filterValidationPattern ? null : entityAttributeString.getValidationPattern());
148                        }
149                    }
150                    break;
151                case INTEGER: {
152                    // TODO
153                    
154                    if(!filterUnitOfMeasureType) {
155                        EntityAttributeNumeric entityAttributeNumeric = coreControl.getEntityAttributeNumeric(entityAttribute);
156                        
157                        if(entityAttributeNumeric != null) {
158                            if(!filterUnitOfMeasureType) {
159                                UnitOfMeasureType unitOfMeasureType = entityAttributeNumeric.getUnitOfMeasureType();
160                                
161                                entityAttributeTransfer.setUnitOfMeasureType(unitOfMeasureType == null ? null : uomControl.getUnitOfMeasureTypeTransfer(userVisit, unitOfMeasureType));
162                            }
163                        }
164                    }
165                }
166                break;
167                case LONG: {
168                    // TODO
169                    
170                    if(!filterUnitOfMeasureType) {
171                        EntityAttributeNumeric entityAttributeNumeric = coreControl.getEntityAttributeNumeric(entityAttribute);
172                        
173                        if(entityAttributeNumeric != null) {
174                            if(!filterUnitOfMeasureType) {
175                                UnitOfMeasureType unitOfMeasureType = entityAttributeNumeric.getUnitOfMeasureType();
176                                
177                                entityAttributeTransfer.setUnitOfMeasureType(unitOfMeasureType == null ? null : uomControl.getUnitOfMeasureTypeTransfer(userVisit, unitOfMeasureType));
178                            }
179                        }
180                    }
181                }
182                break;
183                case LISTITEM:
184                case MULTIPLELISTITEM:
185                    if(!filterEntityListItemSequence) {
186                        EntityAttributeListItem entityAttributeListItem = coreControl.getEntityAttributeListItem(entityAttribute);
187                        
188                        if(entityAttributeListItem != null) {
189                            if(!filterEntityListItemSequence) {
190                                Sequence entityListItemSequence = entityAttributeListItem.getEntityListItemSequence();
191                                
192                                entityAttributeTransfer.setEntityListItemSequence(entityListItemSequence == null ? null : sequenceControl.getSequenceTransfer(userVisit, entityListItemSequence));
193                            }
194                        }
195                    }
196                    break;
197                default:
198                    break;
199            }
200            
201            if(entityInstance == null) {
202                put(entityAttribute, entityAttributeTransfer);
203            } else {
204                setupEntityInstance(entityAttribute, null, entityAttributeTransfer);
205            }
206            
207            if(includeValue) {
208                if(entityInstance != null) {
209                    if(entityAttributeTypeName.equals(EntityAttributeTypes.BOOLEAN.name())) {
210                        EntityBooleanAttribute entityBooleanAttribute = coreControl.getEntityBooleanAttribute(entityAttribute, entityInstance);
211                        
212                        entityAttributeTransfer.setEntityBooleanAttribute(entityBooleanAttribute == null ? null : coreControl.getEntityBooleanAttributeTransfer(userVisit, entityBooleanAttribute, entityInstance));
213                    } else if(entityAttributeTypeName.equals(EntityAttributeTypes.NAME.name())) {
214                        EntityNameAttribute entityNameAttribute = coreControl.getEntityNameAttribute(entityAttribute, entityInstance);
215                        
216                        entityAttributeTransfer.setEntityNameAttribute(entityNameAttribute == null ? null : coreControl.getEntityNameAttributeTransfer(userVisit, entityNameAttribute, entityInstance));
217                    } else if(entityAttributeTypeName.equals(EntityAttributeTypes.INTEGER.name())) {
218                        EntityIntegerAttribute entityIntegerAttribute = coreControl.getEntityIntegerAttribute(entityAttribute, entityInstance);
219                        
220                        entityAttributeTransfer.setEntityIntegerAttribute(entityIntegerAttribute == null ? null : coreControl.getEntityIntegerAttributeTransfer(userVisit, entityIntegerAttribute, entityInstance));
221                    } else if(entityAttributeTypeName.equals(EntityAttributeTypes.LONG.name())) {
222                        EntityLongAttribute entityLongAttribute = coreControl.getEntityLongAttribute(entityAttribute, entityInstance);
223                        
224                        entityAttributeTransfer.setEntityLongAttribute(entityLongAttribute == null ? null : coreControl.getEntityLongAttributeTransfer(userVisit, entityLongAttribute, entityInstance));
225                    } else if(entityAttributeTypeName.equals(EntityAttributeTypes.STRING.name())) {
226                        EntityStringAttribute entityStringAttribute = coreControl.getBestEntityStringAttribute(entityAttribute, entityInstance, getLanguage());
227                        
228                        entityAttributeTransfer.setEntityStringAttribute(entityStringAttribute == null ? null : coreControl.getEntityStringAttributeTransfer(userVisit, entityStringAttribute, entityInstance));
229                    } else if(entityAttributeTypeName.equals(EntityAttributeTypes.GEOPOINT.name())) {
230                        EntityGeoPointAttribute entityGeoPointAttribute = coreControl.getEntityGeoPointAttribute(entityAttribute, entityInstance);
231                        
232                        entityAttributeTransfer.setEntityGeoPointAttribute(entityGeoPointAttribute == null ? null : coreControl.getEntityGeoPointAttributeTransfer(userVisit, entityGeoPointAttribute, entityInstance));
233                    } else if(entityAttributeTypeName.equals(EntityAttributeTypes.BLOB.name())) {
234                        EntityBlobAttribute entityBlobAttribute = coreControl.getBestEntityBlobAttribute(entityAttribute, entityInstance, getLanguage());
235                        
236                        entityAttributeTransfer.setEntityBlobAttribute(entityBlobAttribute == null ? null : coreControl.getEntityBlobAttributeTransfer(userVisit, entityBlobAttribute, entityInstance));
237                    } else if(entityAttributeTypeName.equals(EntityAttributeTypes.CLOB.name())) {
238                        EntityClobAttribute entityClobAttribute = coreControl.getBestEntityClobAttribute(entityAttribute, entityInstance, getLanguage());
239                        
240                        entityAttributeTransfer.setEntityClobAttribute(entityClobAttribute == null ? null : coreControl.getEntityClobAttributeTransfer(userVisit, entityClobAttribute, entityInstance));
241                    } else if(entityAttributeTypeName.equals(EntityAttributeTypes.ENTITY.name())) {
242                        EntityEntityAttribute entityEntityAttribute = coreControl.getEntityEntityAttribute(entityAttribute, entityInstance);
243                        
244                        entityAttributeTransfer.setEntityEntityAttribute(entityEntityAttribute == null ? null : coreControl.getEntityEntityAttributeTransfer(userVisit, entityEntityAttribute, entityInstance));
245                    } else if(entityAttributeTypeName.equals(EntityAttributeTypes.COLLECTION.name())) {
246                        entityAttributeTransfer.setEntityCollectionAttributes(new ListWrapper<>(coreControl.getEntityCollectionAttributeTransfers(userVisit, entityAttribute, entityInstance)));
247                    } else if(entityAttributeTypeName.equals(EntityAttributeTypes.DATE.name())) {
248                        EntityDateAttribute entityDateAttribute = coreControl.getEntityDateAttribute(entityAttribute, entityInstance);
249                        
250                        entityAttributeTransfer.setEntityDateAttribute(entityDateAttribute == null ? null : coreControl.getEntityDateAttributeTransfer(userVisit, entityDateAttribute, entityInstance));
251                    } else if(entityAttributeTypeName.equals(EntityAttributeTypes.TIME.name())) {
252                        EntityTimeAttribute entityTimeAttribute = coreControl.getEntityTimeAttribute(entityAttribute, entityInstance);
253                        
254                        entityAttributeTransfer.setEntityTimeAttribute(entityTimeAttribute == null ? null : coreControl.getEntityTimeAttributeTransfer(userVisit, entityTimeAttribute, entityInstance));
255                    } else if(entityAttributeTypeName.equals(EntityAttributeTypes.LISTITEM.name())) {
256                        EntityListItemAttribute entityListItemAttribute = coreControl.getEntityListItemAttribute(entityAttribute, entityInstance);
257                        
258                        entityAttributeTransfer.setEntityListItemAttribute(entityListItemAttribute == null ? null : coreControl.getEntityListItemAttributeTransfer(userVisit, entityListItemAttribute, entityInstance));
259                    } else if(entityAttributeTypeName.equals(EntityAttributeTypes.MULTIPLELISTITEM.name())) {
260                        entityAttributeTransfer.setEntityMultipleListItemAttributes(new ListWrapper<>(coreControl.getEntityMultipleListItemAttributeTransfers(userVisit, entityAttribute, entityInstance)));
261                    }
262                } else {
263                    getLog().error("entityInstance is null");
264                }
265            }
266
267            if(includeEntityListItemsCount) {
268                entityAttributeTransfer.setEntityListItemsCount(coreControl.countEntityListItems(entityAttribute));
269            }
270
271            if(includeEntityListItems) {
272                entityAttributeTransfer.setEntityListItems(new ListWrapper<>(coreControl.getEntityListItemTransfersByEntityAttribute(userVisit, entityAttribute, entityInstance)));
273            }
274
275            if(includeEntityAttributeEntityTypesCount) {
276                entityAttributeTransfer.setEntityAttributeEntityTypesCount(coreControl.countEntityAttributeEntityTypesByEntityAttribute(entityAttribute));
277            }
278
279            if(includeEntityAttributeEntityTypes) {
280                entityAttributeTransfer.setEntityAttributeEntityTypes(new ListWrapper<>(coreControl.getEntityAttributeEntityTypeTransfersByEntityAttribute(userVisit, entityAttribute, entityInstance)));
281            }
282        }
283        return entityAttributeTransfer;
284    }
285    
286}