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.logic;
018
019import com.echothree.control.user.core.common.edit.EntityListItemAttributeEdit;
020import com.echothree.control.user.core.common.spec.EntityAttributeSpec;
021import com.echothree.control.user.core.common.spec.EntityAttributeUlid;
022import com.echothree.control.user.core.common.spec.EntityAttributeUniversalSpec;
023import com.echothree.control.user.core.common.spec.EntityListItemUlid;
024import com.echothree.control.user.core.common.spec.EntityListItemUniversalSpec;
025import com.echothree.model.control.core.common.ComponentVendors;
026import com.echothree.model.control.core.common.EntityAttributeTypes;
027import com.echothree.model.control.core.common.EntityTypes;
028import com.echothree.model.control.core.common.exception.DuplicateEntityAttributeNameException;
029import com.echothree.model.control.core.common.exception.DuplicateEntityBooleanAttributeException;
030import com.echothree.model.control.core.common.exception.DuplicateEntityClobAttributeException;
031import com.echothree.model.control.core.common.exception.DuplicateEntityDateAttributeException;
032import com.echothree.model.control.core.common.exception.DuplicateEntityIntegerAttributeException;
033import com.echothree.model.control.core.common.exception.DuplicateEntityListItemAttributeException;
034import com.echothree.model.control.core.common.exception.DuplicateEntityListItemNameException;
035import com.echothree.model.control.core.common.exception.DuplicateEntityLongAttributeException;
036import com.echothree.model.control.core.common.exception.DuplicateEntityMultipleListItemAttributeException;
037import com.echothree.model.control.core.common.exception.DuplicateEntityNameAttributeException;
038import com.echothree.model.control.core.common.exception.DuplicateEntityStringAttributeException;
039import com.echothree.model.control.core.common.exception.DuplicateEntityTimeAttributeException;
040import com.echothree.model.control.core.common.exception.EntityTypeIsNotExtensibleException;
041import com.echothree.model.control.core.common.exception.InvalidEntityAttributeTypeException;
042import com.echothree.model.control.core.common.exception.InvalidParameterCountException;
043import com.echothree.model.control.core.common.exception.InvalidStringAttributeException;
044import com.echothree.model.control.core.common.exception.LowerRangeExceededException;
045import com.echothree.model.control.core.common.exception.MismatchedEntityAttributeTypeException;
046import com.echothree.model.control.core.common.exception.MismatchedEntityListItemException;
047import com.echothree.model.control.core.common.exception.MismatchedEntityTypeException;
048import com.echothree.model.control.core.common.exception.UnknownEntityAttributeGroupNameException;
049import com.echothree.model.control.core.common.exception.UnknownEntityAttributeNameException;
050import com.echothree.model.control.core.common.exception.UnknownEntityAttributeTypeNameException;
051import com.echothree.model.control.core.common.exception.UnknownEntityListItemNameException;
052import com.echothree.model.control.core.common.exception.UpperRangeExceededException;
053import com.echothree.model.control.core.server.control.CoreControl;
054import com.echothree.model.control.core.server.database.EntityInstanceResult;
055import com.echothree.model.control.core.server.database.EntityInstancesByBlobEntityAttributeQuery;
056import com.echothree.model.control.core.server.database.EntityInstancesByBooleanEntityAttributeQuery;
057import com.echothree.model.control.core.server.database.EntityInstancesByClobEntityAttributeQuery;
058import com.echothree.model.control.core.server.database.EntityInstancesByCollectionEntityAttributeQuery;
059import com.echothree.model.control.core.server.database.EntityInstancesByDateEntityAttributeQuery;
060import com.echothree.model.control.core.server.database.EntityInstancesByEntityEntityAttributeQuery;
061import com.echothree.model.control.core.server.database.EntityInstancesByGeoPointEntityAttributeQuery;
062import com.echothree.model.control.core.server.database.EntityInstancesByIntegerEntityAttributeQuery;
063import com.echothree.model.control.core.server.database.EntityInstancesByListItemEntityAttributeQuery;
064import com.echothree.model.control.core.server.database.EntityInstancesByLongEntityAttributeQuery;
065import com.echothree.model.control.core.server.database.EntityInstancesByMultipleListItemEntityAttributeQuery;
066import com.echothree.model.control.core.server.database.EntityInstancesByNameEntityAttributeQuery;
067import com.echothree.model.control.core.server.database.EntityInstancesByStringEntityAttributeQuery;
068import com.echothree.model.control.core.server.database.EntityInstancesByTimeEntityAttributeQuery;
069import com.echothree.model.control.index.server.control.IndexControl;
070import com.echothree.model.control.queue.common.QueueTypes;
071import com.echothree.model.control.queue.server.control.QueueControl;
072import com.echothree.model.control.queue.server.logic.QueueTypeLogic;
073import com.echothree.model.control.sequence.common.SequenceTypes;
074import com.echothree.model.control.sequence.common.exception.MissingDefaultSequenceException;
075import com.echothree.model.control.sequence.server.control.SequenceControl;
076import com.echothree.model.control.sequence.server.logic.SequenceGeneratorLogic;
077import com.echothree.model.data.core.server.entity.ComponentVendor;
078import com.echothree.model.data.core.server.entity.EntityAttribute;
079import com.echothree.model.data.core.server.entity.EntityAttributeDetail;
080import com.echothree.model.data.core.server.entity.EntityAttributeGroup;
081import com.echothree.model.data.core.server.entity.EntityAttributeInteger;
082import com.echothree.model.data.core.server.entity.EntityAttributeListItem;
083import com.echothree.model.data.core.server.entity.EntityAttributeLong;
084import com.echothree.model.data.core.server.entity.EntityAttributeString;
085import com.echothree.model.data.core.server.entity.EntityAttributeType;
086import com.echothree.model.data.core.server.entity.EntityBooleanAttribute;
087import com.echothree.model.data.core.server.entity.EntityClobAttribute;
088import com.echothree.model.data.core.server.entity.EntityDateAttribute;
089import com.echothree.model.data.core.server.entity.EntityInstance;
090import com.echothree.model.data.core.server.entity.EntityIntegerAttribute;
091import com.echothree.model.data.core.server.entity.EntityListItem;
092import com.echothree.model.data.core.server.entity.EntityListItemAttribute;
093import com.echothree.model.data.core.server.entity.EntityLongAttribute;
094import com.echothree.model.data.core.server.entity.EntityMultipleListItemAttribute;
095import com.echothree.model.data.core.server.entity.EntityNameAttribute;
096import com.echothree.model.data.core.server.entity.EntityStringAttribute;
097import com.echothree.model.data.core.server.entity.EntityTimeAttribute;
098import com.echothree.model.data.core.server.entity.EntityType;
099import com.echothree.model.data.core.server.entity.EntityTypeDetail;
100import com.echothree.model.data.core.server.entity.MimeType;
101import com.echothree.model.data.core.server.value.EntityAttributeDetailValue;
102import com.echothree.model.data.core.server.value.EntityListItemDetailValue;
103import com.echothree.model.data.party.common.pk.PartyPK;
104import com.echothree.model.data.party.server.entity.Language;
105import com.echothree.model.data.queue.common.pk.QueueTypePK;
106import com.echothree.model.data.queue.server.value.QueuedEntityValue;
107import com.echothree.model.data.sequence.server.entity.Sequence;
108import com.echothree.model.data.uom.server.entity.UnitOfMeasureType;
109import com.echothree.util.common.message.ExecutionErrors;
110import com.echothree.util.common.persistence.BasePK;
111import com.echothree.util.server.control.BaseLogic;
112import com.echothree.util.server.message.ExecutionErrorAccumulator;
113import com.echothree.util.server.persistence.EntityPermission;
114import com.echothree.util.server.persistence.Session;
115import java.util.ArrayList;
116import java.util.List;
117import java.util.regex.Matcher;
118import java.util.regex.Pattern;
119
120public class EntityAttributeLogic
121        extends BaseLogic {
122    
123    private EntityAttributeLogic() {
124        super();
125    }
126    
127    private static class EntityAttributeLogicHolder {
128        static EntityAttributeLogic instance = new EntityAttributeLogic();
129    }
130    
131    public static EntityAttributeLogic getInstance() {
132        return EntityAttributeLogicHolder.instance;
133    }
134    
135    public EntityAttributeType getEntityAttributeTypeByName(final ExecutionErrorAccumulator eea, final String entityAttributeTypeName) {
136        var coreControl = Session.getModelController(CoreControl.class);
137        EntityAttributeType entityAttributeType = coreControl.getEntityAttributeTypeByName(entityAttributeTypeName);
138
139        if(entityAttributeType == null) {
140            handleExecutionError(UnknownEntityAttributeTypeNameException.class, eea, ExecutionErrors.UnknownEntityAttributeTypeName.name(), entityAttributeTypeName);
141        }
142
143        return entityAttributeType;
144    }
145
146    public EntityAttributeType getEntityAttributeTypeByUlid(final ExecutionErrorAccumulator eea, final String ulid, final EntityPermission entityPermission) {
147        EntityAttributeType entityAttributeType = null;
148        
149        var entityInstance = EntityInstanceLogic.getInstance().getEntityInstance(eea, (String)null, null, null, ulid,
150                ComponentVendors.ECHO_THREE.name(), EntityTypes.EntityAttributeType.name());
151
152        if(eea == null || !eea.hasExecutionErrors()) {
153            var coreControl = Session.getModelController(CoreControl.class);
154            
155            entityAttributeType = coreControl.getEntityAttributeTypeByEntityInstance(entityInstance, entityPermission);
156        }
157
158        return entityAttributeType;
159    }
160    
161    public EntityAttributeType getEntityAttributeTypeByUlid(final ExecutionErrorAccumulator eea, final String ulid) {
162        return getEntityAttributeTypeByUlid(eea, ulid, EntityPermission.READ_ONLY);
163    }
164    
165    public EntityAttributeType getEntityAttributeTypeByUlidForUpdate(final ExecutionErrorAccumulator eea, final String ulid) {
166        return getEntityAttributeTypeByUlid(eea, ulid, EntityPermission.READ_WRITE);
167    }
168    
169    public EntityAttributeGroup getEntityAttributeGroupByName(final ExecutionErrorAccumulator eea, final String entityAttributeGroupName) {
170        var coreControl = Session.getModelController(CoreControl.class);
171        EntityAttributeGroup entityAttributeGroup = coreControl.getEntityAttributeGroupByName(entityAttributeGroupName);
172
173        if(entityAttributeGroup == null) {
174            handleExecutionError(UnknownEntityAttributeGroupNameException.class, eea, ExecutionErrors.UnknownEntityAttributeGroupName.name(),
175                    entityAttributeGroupName);
176        }
177
178        return entityAttributeGroup;
179    }
180
181    public EntityAttributeGroup getEntityAttributeGroupByUlid(final ExecutionErrorAccumulator eea, final String ulid, final EntityPermission entityPermission) {
182        EntityAttributeGroup entityAttributeGroup = null;
183        
184        var entityInstance = EntityInstanceLogic.getInstance().getEntityInstance(eea, (String)null, null, null, ulid,
185                ComponentVendors.ECHO_THREE.name(), EntityTypes.EntityAttributeGroup.name());
186
187        if(eea == null || !eea.hasExecutionErrors()) {
188            var coreControl = Session.getModelController(CoreControl.class);
189            
190            entityAttributeGroup = coreControl.getEntityAttributeGroupByEntityInstance(entityInstance, entityPermission);
191        }
192
193        return entityAttributeGroup;
194    }
195    
196    public EntityAttributeGroup getEntityAttributeGroupByUlid(final ExecutionErrorAccumulator eea, final String ulid) {
197        return getEntityAttributeGroupByUlid(eea, ulid, EntityPermission.READ_ONLY);
198    }
199    
200    public EntityAttributeGroup getEntityAttributeGroupByUlidForUpdate(final ExecutionErrorAccumulator eea, final String ulid) {
201        return getEntityAttributeGroupByUlid(eea, ulid, EntityPermission.READ_WRITE);
202    }
203    
204    public EntityAttribute createEntityAttribute(final ExecutionErrorAccumulator eea, final EntityType entityType,
205            String entityAttributeName, final EntityAttributeType entityAttributeType, final Boolean trackRevisions,
206            final Boolean checkContentWebAddress, final String validationPattern, final Integer upperRangeIntegerValue,
207            final Integer upperLimitIntegerValue, final Integer lowerLimitIntegerValue, final Integer lowerRangeIntegerValue,
208            final Long upperRangeLongValue, final Long upperLimitLongValue, final Long lowerLimitLongValue,
209            final Long lowerRangeLongValue, final Sequence entityListItemSequence, final UnitOfMeasureType unitOfMeasureType,
210            final Integer sortOrder, final BasePK createdBy, final Language language, final String description) {
211        EntityAttribute entityAttribute = null;
212        var entityTypeDetail = entityType.getLastDetail();
213
214        if(entityTypeDetail.getIsExtensible()) {
215            var coreControl = Session.getModelController(CoreControl.class);
216
217            if(entityAttributeName == null) {
218                var sequenceControl = Session.getModelController(SequenceControl.class);
219                var sequence = sequenceControl.getDefaultSequenceUsingNames(SequenceTypes.ENTITY_ATTRIBUTE.name());
220
221                entityAttributeName = SequenceGeneratorLogic.getInstance().getNextSequenceValue(sequence);
222            }
223
224            entityAttribute = coreControl.getEntityAttributeByName(entityType, entityAttributeName);
225
226            if(entityAttribute == null) {
227                entityAttribute = coreControl.createEntityAttribute(entityType, entityAttributeName, entityAttributeType,
228                        trackRevisions, sortOrder, createdBy);
229
230                if(description != null) {
231                    coreControl.createEntityAttributeDescription(entityAttribute, language, description, createdBy);
232                }
233
234                switch(EntityAttributeTypes.valueOf(entityAttributeType.getEntityAttributeTypeName())) {
235                    case BLOB ->
236                            coreControl.createEntityAttributeBlob(entityAttribute, checkContentWebAddress, createdBy);
237                    case STRING -> {
238                        if(validationPattern != null) {
239                            coreControl.createEntityAttributeString(entityAttribute, validationPattern, createdBy);
240                        }
241                    }
242                    case INTEGER -> {
243                        if(upperRangeIntegerValue != null || upperLimitIntegerValue != null || lowerLimitIntegerValue != null || lowerRangeIntegerValue != null) {
244                            coreControl.createEntityAttributeInteger(entityAttribute, upperRangeIntegerValue, upperLimitIntegerValue,
245                                    lowerLimitIntegerValue, lowerRangeIntegerValue, createdBy);
246                        }
247                        if(unitOfMeasureType != null) {
248                            coreControl.createEntityAttributeNumeric(entityAttribute, unitOfMeasureType, createdBy);
249                        }
250                    }
251                    case LONG -> {
252                        if(upperRangeLongValue != null || upperLimitLongValue != null || lowerLimitLongValue != null || lowerRangeLongValue != null) {
253                            coreControl.createEntityAttributeLong(entityAttribute, upperRangeLongValue, upperLimitLongValue,
254                                    lowerLimitLongValue, lowerRangeLongValue, createdBy);
255                        }
256                        if(unitOfMeasureType != null) {
257                            coreControl.createEntityAttributeNumeric(entityAttribute, unitOfMeasureType, createdBy);
258                        }
259                    }
260                    case LISTITEM, MULTIPLELISTITEM -> {
261                        if(entityListItemSequence != null) {
262                            coreControl.createEntityAttributeListItem(entityAttribute, entityListItemSequence, createdBy);
263                        }
264                    }
265                    default -> {
266                        // Nothing required for other EntityAttributeTypes
267                    }
268                }
269            } else {
270                handleExecutionError(DuplicateEntityAttributeNameException.class, eea, ExecutionErrors.DuplicateEntityAttributeName.name(),
271                        entityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(), entityTypeDetail.getEntityTypeName(), entityAttributeName);
272            }
273        } else {
274            handleExecutionError(EntityTypeIsNotExtensibleException.class, eea, ExecutionErrors.EntityTypeIsNotExtensible.name(),
275                    entityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(), entityTypeDetail.getEntityTypeName());
276        }
277        
278        return entityAttribute;
279    }
280    
281    public EntityAttribute getEntityAttributeByName(final ExecutionErrorAccumulator eea, final EntityType entityType,
282            final String entityAttributeName, EntityPermission entityPermission) {
283        var coreControl = Session.getModelController(CoreControl.class);
284        EntityAttribute entityAttribute = coreControl.getEntityAttributeByName(entityType, entityAttributeName, entityPermission);
285
286        if(entityAttribute == null) {
287            EntityTypeDetail entityTypeDetail = entityType.getLastDetail();
288            
289            handleExecutionError(UnknownEntityAttributeNameException.class, eea, ExecutionErrors.UnknownEntityAttributeName.name(),
290                    entityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(), entityTypeDetail.getEntityTypeName(), entityAttributeName);
291        }
292
293        return entityAttribute;
294    }
295
296    public EntityAttribute getEntityAttributeByName(final ExecutionErrorAccumulator eea, final EntityType entityType,
297            final String entityAttributeName) {
298        return getEntityAttributeByName(eea, entityType, entityAttributeName, EntityPermission.READ_ONLY);
299    }
300    
301    public EntityAttribute getEntityAttributeByNameForUpdate(final ExecutionErrorAccumulator eea, final EntityType entityType,
302            final String entityAttributeName) {
303        return getEntityAttributeByName(eea, entityType, entityAttributeName, EntityPermission.READ_WRITE);
304    }
305    
306    public EntityAttribute getEntityAttributeByName(final ExecutionErrorAccumulator eea, final ComponentVendor componentVendor,
307            final String entityTypeName, final String entityAttributeName, EntityPermission entityPermission) {
308        EntityType entityType = EntityTypeLogic.getInstance().getEntityTypeByName(eea, componentVendor, entityTypeName);
309        EntityAttribute entityAttribute = null;
310        
311        if(eea == null || !eea.hasExecutionErrors()) {
312            entityAttribute = getEntityAttributeByName(eea, entityType, entityAttributeName, entityPermission);
313        }
314
315        return entityAttribute;
316    }
317
318    public EntityAttribute getEntityAttributeByName(final ExecutionErrorAccumulator eea, final ComponentVendor componentVendor,
319            final String entityTypeName, final String entityAttributeName) {
320        return getEntityAttributeByName(eea, componentVendor, entityTypeName, entityAttributeName, EntityPermission.READ_ONLY);
321    }
322    
323    public EntityAttribute getEntityAttributeByNameForUpdate(final ExecutionErrorAccumulator eea, final ComponentVendor componentVendor,
324            final String entityTypeName, final String entityAttributeName) {
325        return getEntityAttributeByName(eea, componentVendor, entityTypeName, entityAttributeName, EntityPermission.READ_WRITE);
326    }
327    
328    public EntityAttribute getEntityAttributeByName(final ExecutionErrorAccumulator eea, final String componentVendorName,
329            final String entityTypeName, final String entityAttributeName, EntityPermission entityPermission) {
330        EntityType entityType = EntityTypeLogic.getInstance().getEntityTypeByName(eea, componentVendorName, entityTypeName);
331        EntityAttribute entityAttribute = null;
332        
333        if(eea == null || !eea.hasExecutionErrors()) {
334            entityAttribute = getEntityAttributeByName(eea, entityType, entityAttributeName, entityPermission);
335        }
336
337        return entityAttribute;
338    }
339    
340    public EntityAttribute getEntityAttributeByName(final ExecutionErrorAccumulator eea, final String componentVendorName,
341            final String entityTypeName, final String entityAttributeName) {
342        return getEntityAttributeByName(eea, componentVendorName, entityTypeName, entityAttributeName, EntityPermission.READ_ONLY);
343    }
344    
345    public EntityAttribute getEntityAttributeByNameForUpdate(final ExecutionErrorAccumulator eea, final String componentVendorName,
346            final String entityTypeName, final String entityAttributeName) {
347        return getEntityAttributeByName(eea, componentVendorName, entityTypeName, entityAttributeName, EntityPermission.READ_WRITE);
348    }
349    
350    public EntityAttribute getEntityAttributeByUlid(final ExecutionErrorAccumulator eea, final String ulid,
351            final EntityPermission entityPermission) {
352        EntityAttribute entityAttribute = null;
353        
354        var entityInstance = EntityInstanceLogic.getInstance().getEntityInstance(eea, (String)null, null, null, ulid,
355                ComponentVendors.ECHO_THREE.name(), EntityTypes.EntityAttribute.name());
356
357        if(eea == null || !eea.hasExecutionErrors()) {
358            var coreControl = Session.getModelController(CoreControl.class);
359            
360            entityAttribute = coreControl.getEntityAttributeByEntityInstance(entityInstance, entityPermission);
361        }
362
363        return entityAttribute;
364    }
365    
366    public EntityAttribute getEntityAttributeByUlid(final ExecutionErrorAccumulator eea, final String ulid) {
367        return getEntityAttributeByUlid(eea, ulid, EntityPermission.READ_ONLY);
368    }
369    
370    public EntityAttribute getEntityAttributeByUlidForUpdate(final ExecutionErrorAccumulator eea, final String ulid) {
371        return getEntityAttributeByUlid(eea, ulid, EntityPermission.READ_WRITE);
372    }
373
374    // For when we need to determine the EntityType from what the user passes in:
375    public EntityAttribute getEntityAttributeByUniversalSpec(final ExecutionErrorAccumulator eea, final EntityAttributeUniversalSpec universalSpec,
376            final EntityPermission entityPermission) {
377        EntityAttribute entityAttribute = null;
378        var componentVendorName = universalSpec.getComponentVendorName();
379        var entityTypeName = universalSpec.getEntityTypeName();
380        var entityAttributeName = universalSpec.getEntityAttributeName();
381        var universalSpecCount = EntityInstanceLogic.getInstance().countPossibleEntitySpecs(universalSpec);
382        var parameterCount = (componentVendorName == null && entityTypeName == null && entityAttributeName == null ? 0 : 1)
383                + universalSpecCount;
384
385        switch(parameterCount) {
386            case 1 -> {
387                if(universalSpecCount == 1) {
388                    var entityInstance = EntityInstanceLogic.getInstance().getEntityInstance(eea, universalSpec,
389                            ComponentVendors.ECHO_THREE.name(), EntityTypes.EntityAttribute.name());
390
391                    if(!eea.hasExecutionErrors()) {
392                        var coreControl = Session.getModelController(CoreControl.class);
393
394                        entityAttribute = coreControl.getEntityAttributeByEntityInstance(entityInstance, entityPermission);
395                    }
396                } else {
397                    entityAttribute = getEntityAttributeByName(eea, componentVendorName, entityTypeName, entityAttributeName, entityPermission);
398                }
399            }
400            default -> {
401                handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name());
402            }
403        }
404
405        return entityAttribute;
406    }
407
408    public EntityAttribute getEntityAttributeByUniversalSpec(final ExecutionErrorAccumulator eea, final EntityAttributeUniversalSpec universalSpec) {
409        return getEntityAttributeByUniversalSpec(eea, universalSpec, EntityPermission.READ_ONLY);
410    }
411
412    public EntityAttribute getEntityAttributeByUniversalSpecForUpdate(final ExecutionErrorAccumulator eea, final EntityAttributeUniversalSpec universalSpec) {
413        return getEntityAttributeByUniversalSpec(eea, universalSpec, EntityPermission.READ_WRITE);
414    }
415
416    // For when we can get the EntityType from the EntityInstance:
417    public EntityAttribute getEntityAttribute(final ExecutionErrorAccumulator eea, final EntityInstance entityInstance,
418            final EntityAttributeSpec spec, final EntityAttributeUlid ulid, final EntityPermission entityPermission,
419            final EntityAttributeTypes... entityAttributeTypes) {
420        EntityAttribute entityAttribute = null;
421        String entityAttributeName = spec.getEntityAttributeName();
422        String entityAttributeUlid = ulid.getEntityAttributeUlid();
423        var parameterCount = (entityAttributeName == null ? 0 : 1) + (entityAttributeUlid == null ? 0 : 1);
424
425        if (parameterCount == 1) {
426            entityAttribute = entityAttributeName == null
427                    ? getEntityAttributeByUlid(eea, entityAttributeUlid, entityPermission)
428                    : getEntityAttributeByName(eea, entityInstance.getEntityType(), entityAttributeName, entityPermission);
429        } else {
430            handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name());
431        }
432        
433        // If there are no other errors, and the EntityAttribute was specified by ULID, then verify the EntityType...
434        if((eea == null || !eea.hasExecutionErrors()) && entityAttributeUlid != null) {
435            if(!entityInstance.getEntityType().equals(entityAttribute.getLastDetail().getEntityType())) {
436                EntityTypeDetail expectedEntityTypeDetail = entityAttribute.getLastDetail().getEntityType().getLastDetail();
437                EntityTypeDetail suppliedEntityTypeDetail = entityInstance.getEntityType().getLastDetail();
438
439                handleExecutionError(MismatchedEntityTypeException.class, eea, ExecutionErrors.MismatchedEntityType.name(),
440                        expectedEntityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(),
441                        expectedEntityTypeDetail.getEntityTypeName(),
442                        suppliedEntityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(),
443                        suppliedEntityTypeDetail.getEntityTypeName());
444            }
445        }
446        
447        // If there are no other errors, and there are one of more entityAttributeTypes specified, then verify the EntityAttributeType...
448        if((eea == null || !eea.hasExecutionErrors()) && entityAttributeTypes.length > 0) {
449            String entityAttributeTypeName = entityAttribute.getLastDetail().getEntityAttributeType().getEntityAttributeTypeName();
450            boolean found = false;
451            
452            for(var entityAttributeType : entityAttributeTypes) {
453                if(entityAttributeTypeName.equals(entityAttributeType.name())) {
454                    found = true;
455                    break;
456                }
457            }
458            
459            if(!found) {
460                handleExecutionError(MismatchedEntityAttributeTypeException.class, eea, ExecutionErrors.MismatchedEntityAttributeType.name(),
461                        entityAttributeTypeName);
462                entityAttribute = null;
463            }
464        }
465        
466        return entityAttribute;
467    }
468    
469    public EntityAttribute getEntityAttribute(final ExecutionErrorAccumulator eea, final EntityInstance entityInstance,
470            final EntityAttributeSpec spec, final EntityAttributeUlid ulid, final EntityAttributeTypes... entityAttributeTypes) {
471        return getEntityAttribute(eea, entityInstance, spec, ulid, EntityPermission.READ_ONLY, entityAttributeTypes);
472    }
473    
474    public EntityAttribute getEntityAttributeForUpdate(final ExecutionErrorAccumulator eea, final EntityInstance entityInstance,
475            final EntityAttributeSpec spec, final EntityAttributeUlid ulid, final EntityAttributeTypes... entityAttributeTypes) {
476        return getEntityAttribute(eea, entityInstance, spec, ulid, EntityPermission.READ_WRITE, entityAttributeTypes);
477    }
478    
479    private List<EntityInstanceResult> getEntityInstanceResultsByEntityAttributeTypeName(EntityAttribute entityAttribute) {
480        List<EntityInstanceResult> entityInstanceResults = null;
481        String entityAttributeTypeName = entityAttribute.getLastDetail().getEntityAttributeType().getEntityAttributeTypeName();
482        
483        if(entityAttributeTypeName.equals(EntityAttributeTypes.BOOLEAN.name())) {
484            entityInstanceResults = new EntityInstancesByBooleanEntityAttributeQuery().execute(entityAttribute);
485        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.NAME.name())) {
486            entityInstanceResults = new EntityInstancesByNameEntityAttributeQuery().execute(entityAttribute);
487        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.INTEGER.name())) {
488            entityInstanceResults = new EntityInstancesByIntegerEntityAttributeQuery().execute(entityAttribute);
489        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.LONG.name())) {
490            entityInstanceResults = new EntityInstancesByLongEntityAttributeQuery().execute(entityAttribute);
491        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.STRING.name())) {
492            entityInstanceResults = new EntityInstancesByStringEntityAttributeQuery().execute(entityAttribute);
493        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.GEOPOINT.name())) {
494            entityInstanceResults = new EntityInstancesByGeoPointEntityAttributeQuery().execute(entityAttribute);
495        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.BLOB.name())) {
496            entityInstanceResults = new EntityInstancesByBlobEntityAttributeQuery().execute(entityAttribute);
497        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.CLOB.name())) {
498            entityInstanceResults = new EntityInstancesByClobEntityAttributeQuery().execute(entityAttribute);
499        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.DATE.name())) {
500            entityInstanceResults = new EntityInstancesByDateEntityAttributeQuery().execute(entityAttribute);
501        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.TIME.name())) {
502            entityInstanceResults = new EntityInstancesByTimeEntityAttributeQuery().execute(entityAttribute);
503        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.LISTITEM.name())) {
504            entityInstanceResults = new EntityInstancesByListItemEntityAttributeQuery().execute(entityAttribute);
505        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.MULTIPLELISTITEM.name())) {
506            entityInstanceResults = new EntityInstancesByMultipleListItemEntityAttributeQuery().execute(entityAttribute);
507        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.ENTITY.name())) {
508            entityInstanceResults = new EntityInstancesByEntityEntityAttributeQuery().execute(entityAttribute);
509        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.COLLECTION.name())) {
510            entityInstanceResults = new EntityInstancesByCollectionEntityAttributeQuery().execute(entityAttribute);
511        }
512
513        return entityInstanceResults;
514    }
515    
516    public void updateEntityAttributeFromValue(final Session session, final EntityAttributeDetailValue entityAttributeDetailValue,
517            final BasePK updatedBy) {
518        final var coreControl = Session.getModelController(CoreControl.class);
519
520        if(entityAttributeDetailValue.getEntityAttributeNameHasBeenModified()) {
521            final var indexControl = Session.getModelController(IndexControl.class);
522            final var entityAttribute = coreControl.getEntityAttributeByPK(entityAttributeDetailValue.getEntityAttributePK());
523            
524            if(indexControl.countIndexTypesByEntityType(entityAttribute.getLastDetail().getEntityType()) > 0) {
525                final var queueControl = Session.getModelController(QueueControl.class);
526                final var queueTypePK = QueueTypeLogic.getInstance().getQueueTypeByName(null, QueueTypes.INDEXING.name()).getPrimaryKey();
527                final var entityInstanceResults = getEntityInstanceResultsByEntityAttributeTypeName(entityAttribute);
528                final var queuedEntities = new ArrayList<QueuedEntityValue>(entityInstanceResults.size());
529
530                for(final var entityInstanceResult : entityInstanceResults) {
531                    queuedEntities.add(new QueuedEntityValue(queueTypePK, entityInstanceResult.getEntityInstancePK(), session.START_TIME_LONG));
532                }
533
534                queueControl.createQueuedEntities(queuedEntities);
535            }
536        }
537        
538        coreControl.updateEntityAttributeFromValue(entityAttributeDetailValue, updatedBy);
539    }
540    
541    public void deleteEntityAttribute(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
542            final PartyPK deletedByPK) {
543        var coreControl = Session.getModelController(CoreControl.class);
544
545        coreControl.deleteEntityAttribute(entityAttribute, deletedByPK);
546    }
547
548    public EntityListItem createEntityListItem(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
549            String entityListItemName, final Boolean isDefault, final Integer sortOrder, final BasePK createdBy,
550            final Language language, final String description) {
551        EntityListItem entityListItem = null;
552        String entityAttributeTypeName = entityAttribute.getLastDetail().getEntityAttributeType().getEntityAttributeTypeName();
553
554        if(entityAttributeTypeName.equals(EntityAttributeTypes.LISTITEM.name())
555                || entityAttributeTypeName.equals(EntityAttributeTypes.MULTIPLELISTITEM.name())) {
556            var coreControl = Session.getModelController(CoreControl.class);
557            
558            if(entityListItemName == null) {
559                EntityAttributeListItem entityAttributeListItem = coreControl.getEntityAttributeListItem(entityAttribute);
560                Sequence entityListItemSequence = entityAttributeListItem == null ? null : entityAttributeListItem.getEntityListItemSequence();
561
562                if(entityListItemSequence == null) {
563                    entityListItemSequence = SequenceGeneratorLogic.getInstance().getDefaultSequence(eea, SequenceTypes.ENTITY_LIST_ITEM.name());
564                }
565
566                if(eea != null && !hasExecutionErrors(eea)) {
567                    entityListItemName = SequenceGeneratorLogic.getInstance().getNextSequenceValue(eea, entityListItemSequence);
568                } else {
569                    handleExecutionError(MissingDefaultSequenceException.class, eea, ExecutionErrors.MissingDefaultSequence.name(),
570                            SequenceTypes.ENTITY_LIST_ITEM.name());
571                }
572            }
573            
574            if(eea != null && !hasExecutionErrors(eea)) {
575                entityListItem = entityListItemName == null ? null : coreControl.getEntityListItemByName(entityAttribute, entityListItemName);
576
577                if(entityListItem == null) {
578                    entityListItem = coreControl.createEntityListItem(entityAttribute, entityListItemName, isDefault, sortOrder,
579                            createdBy);
580
581                    if(description != null) {
582                        coreControl.createEntityListItemDescription(entityListItem, language, description, createdBy);
583                    }
584                } else {
585                    EntityAttributeDetail entityAttributeDetail = entityAttribute.getLastDetail();
586                    EntityTypeDetail entityTypeDetail = entityAttributeDetail.getEntityType().getLastDetail();
587                    
588                    handleExecutionError(DuplicateEntityListItemNameException.class, eea, ExecutionErrors.DuplicateEntityListItemName.name(),
589                            entityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(),
590                            entityTypeDetail.getEntityTypeName(), entityAttributeDetail.getEntityAttributeName(),
591                            entityListItemName);
592                }
593            }
594        } else {
595            EntityAttributeDetail entityAttributeDetail = entityAttribute.getLastDetail();
596            EntityTypeDetail entityTypeDetail = entityAttributeDetail.getEntityType().getLastDetail();
597                    
598            handleExecutionError(InvalidEntityAttributeTypeException.class, eea, ExecutionErrors.InvalidEntityAttributeType.name(), 
599                            entityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(),
600                            entityTypeDetail.getEntityTypeName(), entityAttributeDetail.getEntityAttributeName(),
601                            entityAttributeTypeName);
602        }
603        
604        return entityListItem;
605    }
606    
607    public EntityListItem getEntityListItemByName(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
608            final String entityListItemName, final EntityPermission entityPermission) {
609        var coreControl = Session.getModelController(CoreControl.class);
610        EntityListItem entityListItem = coreControl.getEntityListItemByName(entityAttribute, entityListItemName, entityPermission);
611
612        if(entityListItem == null) {
613            EntityAttributeDetail entityAttributeDetail = entityAttribute.getLastDetail();
614            EntityTypeDetail entityTypeDetail = entityAttributeDetail.getEntityType().getLastDetail();
615            
616            handleExecutionError(UnknownEntityListItemNameException.class, eea, ExecutionErrors.UnknownEntityListItemName.name(),
617                    entityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(),
618                    entityTypeDetail.getEntityTypeName(), entityListItemName);
619        }
620
621        return entityListItem;
622    }
623
624    public EntityListItem getEntityListItemByName(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
625            final String entityListItemName) {
626        return getEntityListItemByName(eea, entityAttribute, entityListItemName, EntityPermission.READ_ONLY);
627    }
628    
629    public EntityListItem getEntityListItemByNameForUpdate(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
630            final String entityListItemName) {
631        return getEntityListItemByName(eea, entityAttribute, entityListItemName, EntityPermission.READ_WRITE);
632    }
633        
634    public EntityListItem getEntityListItemByName(final ExecutionErrorAccumulator eea, final String componentVendorName,
635            final String entityTypeName, final String entityAttributeName, final String entityListItemName,
636            final EntityPermission entityPermission) {
637        EntityAttribute entityAttribute = EntityAttributeLogic.getInstance().getEntityAttributeByName(eea, componentVendorName,
638                entityTypeName, entityAttributeName);
639        EntityListItem entityListItem = null;
640        
641        if(eea == null || !eea.hasExecutionErrors()) {
642            entityListItem = getEntityListItemByName(eea, entityAttribute, entityListItemName, entityPermission);
643        }
644
645        return entityListItem;
646    }
647    
648    public EntityListItem getEntityListItemByName(final ExecutionErrorAccumulator eea, final String componentVendorName,
649            final String entityTypeName, final String entityAttributeName, final String entityListItemName) {
650        return getEntityListItemByName(eea, componentVendorName, entityTypeName, entityAttributeName, entityListItemName,
651                EntityPermission.READ_ONLY);
652    }
653    
654    public EntityListItem getEntityListItemByNameForUpdate(final ExecutionErrorAccumulator eea, final String componentVendorName,
655            final String entityTypeName, final String entityAttributeName, final String entityListItemName) {
656        return getEntityListItemByName(eea, componentVendorName, entityTypeName, entityAttributeName, entityListItemName,
657                EntityPermission.READ_WRITE);
658    }
659        
660    public EntityListItem getEntityListItemByUlid(final ExecutionErrorAccumulator eea, final String ulid, final EntityPermission entityPermission) {
661        EntityListItem entityListItem = null;
662        
663        var entityInstance = EntityInstanceLogic.getInstance().getEntityInstance(eea, (String)null, null, null, ulid,
664                ComponentVendors.ECHO_THREE.name(), EntityTypes.EntityListItem.name());
665
666        if(eea == null || !eea.hasExecutionErrors()) {
667            var coreControl = Session.getModelController(CoreControl.class);
668            
669            entityListItem = coreControl.getEntityListItemByEntityInstance(entityInstance, entityPermission);
670        }
671
672        return entityListItem;
673    }
674    
675    public EntityListItem getEntityListItemByUlid(final ExecutionErrorAccumulator eea, final String ulid) {
676        return getEntityListItemByUlid(eea, ulid, EntityPermission.READ_ONLY);
677    }
678    
679    public EntityListItem getEntityListItemByUlidForUpdate(final ExecutionErrorAccumulator eea, final String ulid) {
680        return getEntityListItemByUlid(eea, ulid, EntityPermission.READ_WRITE);
681    }
682
683    public EntityListItem getEntityListItemByUniversalSpec(final ExecutionErrorAccumulator eea, final EntityListItemUniversalSpec universalSpec,
684            final EntityPermission entityPermission) {
685        EntityListItem entityListItem = null;
686        var componentVendorName = universalSpec.getComponentVendorName();
687        var entityTypeName = universalSpec.getEntityTypeName();
688        var entityAttributeName = universalSpec.getEntityAttributeName();
689        var entityListItemName = universalSpec.getEntityListItemName();
690        var universalSpecCount = EntityInstanceLogic.getInstance().countPossibleEntitySpecs(universalSpec);
691        var parameterCount = (componentVendorName == null && entityTypeName == null && entityAttributeName == null && entityListItemName == null ? 0 : 1)
692                + universalSpecCount;
693
694        switch(parameterCount) {
695            case 1 -> {
696                if(universalSpecCount == 1) {
697                    var entityInstance = EntityInstanceLogic.getInstance().getEntityInstance(eea, universalSpec,
698                            ComponentVendors.ECHO_THREE.name(), EntityTypes.EntityListItem.name());
699
700                    if(!eea.hasExecutionErrors()) {
701                        var coreControl = Session.getModelController(CoreControl.class);
702
703                        entityListItem = coreControl.getEntityListItemByEntityInstance(entityInstance, entityPermission);
704                    }
705                } else {
706                    entityListItem = getEntityListItemByName(eea, componentVendorName, entityTypeName, entityAttributeName,
707                            entityListItemName, entityPermission);
708                }
709            }
710            default -> {
711                handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name());
712            }
713        }
714
715        return entityListItem;
716    }
717
718    public EntityListItem getEntityListItemByUniversalSpec(final ExecutionErrorAccumulator eea, final EntityListItemUniversalSpec universalSpec) {
719        return getEntityListItemByUniversalSpec(eea, universalSpec, EntityPermission.READ_ONLY);
720    }
721
722    public EntityListItem getEntityListItemByUniversalSpecForUpdate(final ExecutionErrorAccumulator eea, final EntityListItemUniversalSpec universalSpec) {
723        return getEntityListItemByUniversalSpec(eea, universalSpec, EntityPermission.READ_WRITE);
724    }
725
726    public EntityListItem getEntityListItem(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
727            final EntityListItemAttributeEdit edit, final EntityPermission entityPermission) {
728        EntityListItem entityListItem = null;
729        String entityListItemName = edit.getEntityListItemName();
730        String entityListItemUlid = edit.getEntityListItemUlid();
731        var parameterCount = (entityListItemName == null ? 0 : 1) + (entityListItemUlid == null ? 0 : 1);
732
733        if (parameterCount == 1) {
734            entityListItem = entityListItemName == null
735                    ? getEntityListItemByUlid(eea, entityListItemUlid, entityPermission)
736                    : getEntityListItemByName(eea, entityAttribute, entityListItemName, entityPermission);
737        } else {
738            handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name());
739        }
740        
741        if((eea == null || !eea.hasExecutionErrors()) && entityListItemUlid != null) {
742            EntityAttribute foundEntityAttribute = entityListItem.getLastDetail().getEntityAttribute();
743
744            if(!foundEntityAttribute.equals(entityAttribute)) {
745                handleExecutionError(MismatchedEntityListItemException.class, eea, ExecutionErrors.MismatchedEntityListItem.name(),
746                        entityAttribute.getLastDetail().getEntityType().getLastDetail().getComponentVendor().getLastDetail().getComponentVendorName(),
747                        entityAttribute.getLastDetail().getEntityType().getLastDetail().getEntityTypeName(),
748                        entityAttribute.getLastDetail().getEntityAttributeName(),
749                        foundEntityAttribute.getLastDetail().getEntityType().getLastDetail().getComponentVendor().getLastDetail().getComponentVendorName(),
750                        foundEntityAttribute.getLastDetail().getEntityType().getLastDetail().getEntityTypeName(),
751                        foundEntityAttribute.getLastDetail().getEntityAttributeName(),
752                        entityListItem.getLastDetail().getEntityListItem());
753            }
754        }
755        
756        return entityListItem;
757    }
758    
759    public EntityListItem getEntityListItem(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
760            final EntityListItemAttributeEdit edit) {
761        return getEntityListItem(eea, entityAttribute, edit, EntityPermission.READ_ONLY);
762    }
763    
764    public EntityListItem getEntityListItemForUpdate(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
765            final EntityListItemAttributeEdit edit, final EntityListItemUlid ulid) {
766        return getEntityListItem(eea, entityAttribute, edit, EntityPermission.READ_WRITE);
767    }
768    
769    public void updateEntityListItemFromValue(final Session session, EntityListItemDetailValue entityListItemDetailValue, BasePK updatedBy) {
770        var coreControl = Session.getModelController(CoreControl.class);
771        
772        if(entityListItemDetailValue.getEntityListItemNameHasBeenModified()) {
773            var indexControl = Session.getModelController(IndexControl.class);
774            EntityListItem entityListItem = coreControl.getEntityListItemByPK(entityListItemDetailValue.getEntityListItemPK());
775            EntityAttributeDetail entityAttributeDetail = entityListItem.getLastDetail().getEntityAttribute().getLastDetail();
776            
777            if(indexControl.countIndexTypesByEntityType(entityAttributeDetail.getEntityType()) > 0) {
778                var queueControl = Session.getModelController(QueueControl.class);
779                QueueTypePK queueTypePK = QueueTypeLogic.getInstance().getQueueTypeByName(null, QueueTypes.INDEXING.name()).getPrimaryKey();
780                String entityAttributeTypeName = entityAttributeDetail.getEntityAttributeType().getEntityAttributeTypeName();
781
782                if(entityAttributeTypeName.equals(EntityAttributeTypes.LISTITEM.name())) {
783                    List<EntityListItemAttribute> entityListItemAttributes = coreControl.getEntityListItemAttributesByEntityListItem(entityListItem);
784                    List<QueuedEntityValue> queuedEntities = new ArrayList<>(entityListItemAttributes.size());
785
786                    entityListItemAttributes.forEach((entityListItemAttribute) -> {
787                        queuedEntities.add(new QueuedEntityValue(queueTypePK, entityListItemAttribute.getEntityInstancePK(), session.START_TIME_LONG));
788                    });
789
790                    queueControl.createQueuedEntities(queuedEntities);
791                } else if(entityAttributeTypeName.equals(EntityAttributeTypes.MULTIPLELISTITEM.name())) {
792                    List<EntityMultipleListItemAttribute> entityMultipleListItemAttributes = coreControl.getEntityMultipleListItemAttributesByEntityListItem(entityListItem);
793                    List<QueuedEntityValue> queuedEntities = new ArrayList<>(entityMultipleListItemAttributes.size());
794
795                    entityMultipleListItemAttributes.forEach((entityMultipleListItemAttribute) -> {
796                        queuedEntities.add(new QueuedEntityValue(queueTypePK, entityMultipleListItemAttribute.getEntityInstancePK(), session.START_TIME_LONG));
797                    });
798
799                    queueControl.createQueuedEntities(queuedEntities);
800                }
801            }
802        }
803
804        coreControl.updateEntityListItemFromValue(entityListItemDetailValue, updatedBy);
805    }
806    
807    public void deleteEntityListItem(final ExecutionErrorAccumulator eea, EntityListItem entityListItem, BasePK deletedBy) {
808        var coreControl = Session.getModelController(CoreControl.class);
809
810        coreControl.deleteEntityListItem(entityListItem, deletedBy);
811    }
812
813    private void checkEntityType(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
814            final EntityInstance entityInstance) {
815        if(!entityInstance.getEntityType().equals(entityAttribute.getLastDetail().getEntityType())) {
816            EntityTypeDetail expectedEntityTypeDetail = entityAttribute.getLastDetail().getEntityType().getLastDetail();
817            EntityTypeDetail suppliedEntityTypeDetail = entityInstance.getEntityType().getLastDetail();
818
819            handleExecutionError(MismatchedEntityTypeException.class, eea, ExecutionErrors.MismatchedEntityType.name(),
820                    expectedEntityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(),
821                    expectedEntityTypeDetail.getEntityTypeName(),
822                    suppliedEntityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(),
823                    suppliedEntityTypeDetail.getEntityTypeName());
824        }
825    }
826    
827    public EntityBooleanAttribute createEntityBooleanAttribute(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
828            final EntityInstance entityInstance, final Boolean booleanAttribute, final BasePK createdBy) {
829        EntityBooleanAttribute entityBooleanAttribute = null;
830        
831        checkEntityType(eea, entityAttribute, entityInstance);
832        
833        if(eea == null || !eea.hasExecutionErrors()) {
834            var coreControl = Session.getModelController(CoreControl.class);
835            
836            entityBooleanAttribute = coreControl.getEntityBooleanAttribute(entityAttribute, entityInstance);
837
838            if(entityBooleanAttribute == null) {
839                coreControl.createEntityBooleanAttribute(entityAttribute, entityInstance, booleanAttribute, createdBy);
840            } else {
841                handleExecutionError(DuplicateEntityBooleanAttributeException.class, eea, ExecutionErrors.DuplicateEntityBooleanAttribute.name(),
842                        EntityInstanceLogic.getInstance().getEntityRefFromEntityInstance(entityInstance),
843                        entityAttribute.getLastDetail().getEntityAttributeName());
844            }
845        }
846
847        return entityBooleanAttribute;
848    }
849    
850    public EntityIntegerAttribute createEntityIntegerAttribute(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
851            final EntityInstance entityInstance, final Integer integerAttribute, final BasePK createdBy) {
852        EntityIntegerAttribute entityIntegerAttribute = null;
853        
854        checkEntityType(eea, entityAttribute, entityInstance);
855        
856        if(eea == null || !eea.hasExecutionErrors()) {
857            var coreControl = Session.getModelController(CoreControl.class);
858            EntityAttributeInteger entityAttributeInteger = coreControl.getEntityAttributeInteger(entityAttribute);
859            
860            if(entityAttributeInteger != null) {
861                Integer upperRangeIntegerValue = entityAttributeInteger.getUpperRangeIntegerValue();
862                Integer lowerRangeIntegerValue = entityAttributeInteger.getLowerRangeIntegerValue();
863                
864                if(upperRangeIntegerValue != null && integerAttribute > upperRangeIntegerValue){
865                    handleExecutionError(UpperRangeExceededException.class, eea, ExecutionErrors.UpperRangeExceeded.name(),
866                            upperRangeIntegerValue, integerAttribute);
867                }
868                
869                if(lowerRangeIntegerValue != null && integerAttribute < lowerRangeIntegerValue) {
870                    handleExecutionError(LowerRangeExceededException.class, eea, ExecutionErrors.LowerRangeExceeded.name(),
871                            lowerRangeIntegerValue, integerAttribute);
872                }
873            }
874            
875            if(eea == null || !eea.hasExecutionErrors()) {
876                entityIntegerAttribute = coreControl.getEntityIntegerAttribute(entityAttribute, entityInstance);
877
878                if(entityIntegerAttribute == null) {
879                    coreControl.createEntityIntegerAttribute(entityAttribute, entityInstance, integerAttribute, createdBy);
880                } else {
881                    handleExecutionError(DuplicateEntityIntegerAttributeException.class, eea, ExecutionErrors.DuplicateEntityIntegerAttribute.name(),
882                            EntityInstanceLogic.getInstance().getEntityRefFromEntityInstance(entityInstance),
883                            entityAttribute.getLastDetail().getEntityAttributeName());
884                }
885            }
886        }
887
888        return entityIntegerAttribute;
889    }
890    
891    public EntityLongAttribute createEntityLongAttribute(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
892            final EntityInstance entityInstance, final Long longAttribute, final BasePK createdBy) {
893        EntityLongAttribute entityLongAttribute = null;
894        
895        checkEntityType(eea, entityAttribute, entityInstance);
896        
897        if(eea == null || !eea.hasExecutionErrors()) {
898            var coreControl = Session.getModelController(CoreControl.class);
899            EntityAttributeLong entityAttributeLong = coreControl.getEntityAttributeLong(entityAttribute);
900            
901            if(entityAttributeLong != null) {
902                Long upperRangeLongValue = entityAttributeLong.getUpperRangeLongValue();
903                Long lowerRangeLongValue = entityAttributeLong.getLowerRangeLongValue();
904                
905                if(upperRangeLongValue != null && longAttribute > upperRangeLongValue){
906                    handleExecutionError(UpperRangeExceededException.class, eea, ExecutionErrors.UpperRangeExceeded.name(),
907                            upperRangeLongValue, longAttribute);
908                }
909                
910                if(lowerRangeLongValue != null && longAttribute < lowerRangeLongValue) {
911                    handleExecutionError(LowerRangeExceededException.class, eea, ExecutionErrors.LowerRangeExceeded.name(),
912                            lowerRangeLongValue, longAttribute);
913                }
914            }
915            
916            if(eea == null || !eea.hasExecutionErrors()) {
917                entityLongAttribute = coreControl.getEntityLongAttribute(entityAttribute, entityInstance);
918
919                if(entityLongAttribute == null) {
920                    coreControl.createEntityLongAttribute(entityAttribute, entityInstance, longAttribute, createdBy);
921                } else {
922                    handleExecutionError(DuplicateEntityLongAttributeException.class, eea, ExecutionErrors.DuplicateEntityLongAttribute.name(),
923                            EntityInstanceLogic.getInstance().getEntityRefFromEntityInstance(entityInstance),
924                            entityAttribute.getLastDetail().getEntityAttributeName());
925                }
926            }
927        }
928
929        return entityLongAttribute;
930    }
931
932    public EntityStringAttribute createEntityStringAttribute(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
933            final EntityInstance entityInstance, final Language language, final String stringAttribute, final BasePK createdBy) {
934        EntityStringAttribute entityStringAttribute = null;
935
936        checkEntityType(eea, entityAttribute, entityInstance);
937
938        if(eea == null || !eea.hasExecutionErrors()) {
939            var coreControl = Session.getModelController(CoreControl.class);
940            EntityAttributeString entityAttributeString = coreControl.getEntityAttributeString(entityAttribute);
941            String validationPattern = entityAttributeString == null ? null : entityAttributeString.getValidationPattern();
942
943            if(validationPattern != null) {
944                Pattern pattern = Pattern.compile(validationPattern);
945                Matcher m = pattern.matcher(stringAttribute);
946
947                if(!m.matches()) {
948                    handleExecutionError(InvalidStringAttributeException.class, eea, ExecutionErrors.InvalidStringAttribute.name(),
949                            stringAttribute);
950                }
951            }
952
953            if(eea == null || !eea.hasExecutionErrors()) {
954                entityStringAttribute = coreControl.getEntityStringAttribute(entityAttribute, entityInstance, language);
955
956                if(entityStringAttribute == null) {
957                    coreControl.createEntityStringAttribute(entityAttribute, entityInstance, language, stringAttribute, createdBy);
958                } else {
959                    handleExecutionError(DuplicateEntityStringAttributeException.class, eea, ExecutionErrors.DuplicateEntityStringAttribute.name(),
960                            EntityInstanceLogic.getInstance().getEntityRefFromEntityInstance(entityInstance),
961                            entityAttribute.getLastDetail().getEntityAttributeName(),
962                            language.getLanguageIsoName());
963                }
964            }
965        }
966
967        return entityStringAttribute;
968    }
969
970    public EntityClobAttribute createEntityClobAttribute(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
971            final EntityInstance entityInstance, final Language language, final String clobAttribute, final MimeType mimeType,
972            final BasePK createdBy) {
973        EntityClobAttribute entityClobAttribute = null;
974
975        checkEntityType(eea, entityAttribute, entityInstance);
976
977        if(eea == null || !eea.hasExecutionErrors()) {
978            var coreControl = Session.getModelController(CoreControl.class);
979
980            entityClobAttribute = coreControl.getEntityClobAttribute(entityAttribute, entityInstance, language);
981
982            if(entityClobAttribute == null) {
983                coreControl.createEntityClobAttribute(entityAttribute, entityInstance, language, clobAttribute, mimeType, createdBy);
984            } else {
985                handleExecutionError(DuplicateEntityClobAttributeException.class, eea, ExecutionErrors.DuplicateEntityClobAttribute.name(),
986                        EntityInstanceLogic.getInstance().getEntityRefFromEntityInstance(entityInstance),
987                        entityAttribute.getLastDetail().getEntityAttributeName(),
988                        language.getLanguageIsoName());
989            }
990        }
991
992        return entityClobAttribute;
993    }
994
995    public EntityNameAttribute createEntityNameAttribute(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
996            final String nameAttribute, final EntityInstance entityInstance, final BasePK createdBy) {
997        EntityNameAttribute entityNameAttribute = null;
998
999        checkEntityType(eea, entityAttribute, entityInstance);
1000
1001        if(eea == null || !eea.hasExecutionErrors()) {
1002            var coreControl = Session.getModelController(CoreControl.class);
1003
1004            entityNameAttribute = coreControl.getEntityNameAttribute(entityAttribute, entityInstance);
1005
1006            if(entityNameAttribute == null) {
1007                coreControl.createEntityNameAttribute(entityAttribute, nameAttribute, entityInstance, createdBy);
1008            } else {
1009                handleExecutionError(DuplicateEntityNameAttributeException.class, eea, ExecutionErrors.DuplicateEntityNameAttribute.name(),
1010                        EntityInstanceLogic.getInstance().getEntityRefFromEntityInstance(entityInstance),
1011                        entityAttribute.getLastDetail().getEntityAttributeName());
1012            }
1013        }
1014
1015        return entityNameAttribute;
1016    }
1017
1018    public EntityDateAttribute createEntityDateAttribute(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1019            final EntityInstance entityInstance, final Integer dateAttribute, final BasePK createdBy) {
1020        EntityDateAttribute entityDateAttribute = null;
1021
1022        checkEntityType(eea, entityAttribute, entityInstance);
1023
1024        if(eea == null || !eea.hasExecutionErrors()) {
1025            var coreControl = Session.getModelController(CoreControl.class);
1026
1027            entityDateAttribute = coreControl.getEntityDateAttribute(entityAttribute, entityInstance);
1028
1029            if(entityDateAttribute == null) {
1030                coreControl.createEntityDateAttribute(entityAttribute, entityInstance, dateAttribute, createdBy);
1031            } else {
1032                handleExecutionError(DuplicateEntityDateAttributeException.class, eea, ExecutionErrors.DuplicateEntityDateAttribute.name(),
1033                        EntityInstanceLogic.getInstance().getEntityRefFromEntityInstance(entityInstance),
1034                        entityAttribute.getLastDetail().getEntityAttributeName());
1035            }
1036        }
1037
1038        return entityDateAttribute;
1039    }
1040
1041    public EntityTimeAttribute createEntityTimeAttribute(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1042            final EntityInstance entityInstance, final Long timeAttribute, final BasePK createdBy) {
1043        EntityTimeAttribute entityTimeAttribute = null;
1044
1045        checkEntityType(eea, entityAttribute, entityInstance);
1046
1047        if(eea == null || !eea.hasExecutionErrors()) {
1048            var coreControl = Session.getModelController(CoreControl.class);
1049
1050            entityTimeAttribute = coreControl.getEntityTimeAttribute(entityAttribute, entityInstance);
1051
1052            if(entityTimeAttribute == null) {
1053                coreControl.createEntityTimeAttribute(entityAttribute, entityInstance, timeAttribute, createdBy);
1054            } else {
1055                handleExecutionError(DuplicateEntityTimeAttributeException.class, eea, ExecutionErrors.DuplicateEntityTimeAttribute.name(),
1056                        EntityInstanceLogic.getInstance().getEntityRefFromEntityInstance(entityInstance),
1057                        entityAttribute.getLastDetail().getEntityAttributeName());
1058            }
1059        }
1060
1061        return entityTimeAttribute;
1062    }
1063
1064    public EntityListItemAttribute createEntityListItemAttribute(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1065        final EntityInstance entityInstance, final EntityListItem entityListItem, final BasePK createdBy) {
1066        EntityListItemAttribute entityListItemAttribute = null;
1067        
1068        checkEntityType(eea, entityAttribute, entityInstance);
1069        
1070        if(eea == null || !eea.hasExecutionErrors()) {
1071            var coreControl = Session.getModelController(CoreControl.class);
1072            
1073            entityListItemAttribute = coreControl.getEntityListItemAttribute(entityAttribute, entityInstance);
1074
1075            if(entityListItemAttribute == null) {
1076                entityListItemAttribute = coreControl.createEntityListItemAttribute(entityAttribute, entityInstance, entityListItem, createdBy);
1077            } else {
1078                handleExecutionError(DuplicateEntityListItemAttributeException.class, eea, ExecutionErrors.DuplicateEntityListItemAttribute.name(),
1079                        EntityInstanceLogic.getInstance().getEntityRefFromEntityInstance(entityInstance),
1080                        entityAttribute.getLastDetail().getEntityAttributeName());
1081            }
1082        }
1083        
1084        return entityListItemAttribute;
1085    }
1086    
1087    public EntityMultipleListItemAttribute createEntityMultipleListItemAttribute(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1088        final EntityInstance entityInstance, final EntityListItem entityListItem, final BasePK createdBy) {
1089        EntityMultipleListItemAttribute entityMultipleListItemAttribute = null;
1090        
1091        checkEntityType(eea, entityAttribute, entityInstance);
1092        
1093        if(eea == null || !eea.hasExecutionErrors()) {
1094            var coreControl = Session.getModelController(CoreControl.class);
1095            
1096            entityMultipleListItemAttribute = coreControl.getEntityMultipleListItemAttribute(entityAttribute, entityInstance, entityListItem);
1097
1098            if(entityMultipleListItemAttribute == null) {
1099                entityMultipleListItemAttribute = coreControl.createEntityMultipleListItemAttribute(entityAttribute, entityInstance, entityListItem, createdBy);
1100            } else {
1101                handleExecutionError(DuplicateEntityMultipleListItemAttributeException.class, eea, ExecutionErrors.DuplicateEntityMultipleListItemAttribute.name(),
1102                    EntityInstanceLogic.getInstance().getEntityRefFromEntityInstance(entityInstance),
1103                    entityAttribute.getLastDetail().getEntityAttributeName(),
1104                    entityListItem.getLastDetail().getEntityListItemName());
1105            }
1106        }
1107
1108        return entityMultipleListItemAttribute;
1109    }
1110    
1111}