001// --------------------------------------------------------------------------------
002// Copyright 2002-2026 Echo Three, LLC
003//
004// Licensed under the Apache License, Version 2.0 (the "License");
005// you may not use this file except in compliance with the License.
006// You may obtain a copy of the License at
007//
008//     http://www.apache.org/licenses/LICENSE-2.0
009//
010// Unless required by applicable law or agreed to in writing, software
011// distributed under the License is distributed on an "AS IS" BASIS,
012// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013// See the License for the specific language governing permissions and
014// limitations under the License.
015// --------------------------------------------------------------------------------
016
017package com.echothree.model.control.core.server.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.EntityAttributeUniversalSpec;
022import com.echothree.control.user.core.common.spec.EntityAttributeUuid;
023import com.echothree.control.user.core.common.spec.EntityInstanceAttributeSpec;
024import com.echothree.control.user.core.common.spec.EntityListItemUniversalSpec;
025import com.echothree.control.user.core.common.spec.EntityListItemUuid;
026import com.echothree.model.control.core.common.ComponentVendors;
027import com.echothree.model.control.core.common.EntityAttributeTypes;
028import com.echothree.model.control.core.common.EntityTypes;
029import com.echothree.model.control.core.common.exception.DuplicateEntityAttributeNameException;
030import com.echothree.model.control.core.common.exception.DuplicateEntityBooleanAttributeException;
031import com.echothree.model.control.core.common.exception.DuplicateEntityBooleanDefaultException;
032import com.echothree.model.control.core.common.exception.DuplicateEntityClobAttributeException;
033import com.echothree.model.control.core.common.exception.DuplicateEntityDateAttributeException;
034import com.echothree.model.control.core.common.exception.DuplicateEntityDateDefaultException;
035import com.echothree.model.control.core.common.exception.DuplicateEntityGeoPointAttributeException;
036import com.echothree.model.control.core.common.exception.DuplicateEntityGeoPointDefaultException;
037import com.echothree.model.control.core.common.exception.DuplicateEntityIntegerAttributeException;
038import com.echothree.model.control.core.common.exception.DuplicateEntityIntegerDefaultException;
039import com.echothree.model.control.core.common.exception.DuplicateEntityListItemAttributeException;
040import com.echothree.model.control.core.common.exception.DuplicateEntityListItemDefaultException;
041import com.echothree.model.control.core.common.exception.DuplicateEntityListItemNameException;
042import com.echothree.model.control.core.common.exception.DuplicateEntityLongAttributeException;
043import com.echothree.model.control.core.common.exception.DuplicateEntityLongDefaultException;
044import com.echothree.model.control.core.common.exception.DuplicateEntityMultipleListItemAttributeException;
045import com.echothree.model.control.core.common.exception.DuplicateEntityMultipleListItemDefaultException;
046import com.echothree.model.control.core.common.exception.DuplicateEntityNameAttributeException;
047import com.echothree.model.control.core.common.exception.DuplicateEntityStringAttributeException;
048import com.echothree.model.control.core.common.exception.DuplicateEntityStringDefaultException;
049import com.echothree.model.control.core.common.exception.DuplicateEntityTimeAttributeException;
050import com.echothree.model.control.core.common.exception.DuplicateEntityTimeDefaultException;
051import com.echothree.model.control.core.common.exception.DuplicateWorkflowUsageInEntityAttributeException;
052import com.echothree.model.control.core.common.exception.EntityTypeIsNotExtensibleException;
053import com.echothree.model.control.core.common.exception.InvalidEntityAttributeTypeException;
054import com.echothree.model.control.core.common.exception.InvalidParameterCountException;
055import com.echothree.model.control.core.common.exception.InvalidStringAttributeException;
056import com.echothree.model.control.core.common.exception.LowerRangeExceededException;
057import com.echothree.model.control.core.common.exception.MismatchedEntityAttributeTypeException;
058import com.echothree.model.control.core.common.exception.MismatchedEntityListItemException;
059import com.echothree.model.control.core.common.exception.MismatchedEntityTypeException;
060import com.echothree.model.control.core.common.exception.UnknownEntityAttributeNameException;
061import com.echothree.model.control.core.common.exception.UnknownEntityAttributeTypeNameException;
062import com.echothree.model.control.core.common.exception.UnknownEntityBooleanDefaultException;
063import com.echothree.model.control.core.common.exception.UnknownEntityDateDefaultException;
064import com.echothree.model.control.core.common.exception.UnknownEntityGeoPointDefaultException;
065import com.echothree.model.control.core.common.exception.UnknownEntityIntegerDefaultException;
066import com.echothree.model.control.core.common.exception.UnknownEntityListItemDefaultException;
067import com.echothree.model.control.core.common.exception.UnknownEntityListItemNameException;
068import com.echothree.model.control.core.common.exception.UnknownEntityLongDefaultException;
069import com.echothree.model.control.core.common.exception.UnknownEntityMultipleListItemDefaultException;
070import com.echothree.model.control.core.common.exception.UnknownEntityStringDefaultException;
071import com.echothree.model.control.core.common.exception.UnknownEntityTimeDefaultException;
072import com.echothree.model.control.core.common.exception.UpperRangeExceededException;
073import com.echothree.model.control.core.server.control.EntityAttributeGroupControl;
074import com.echothree.model.control.core.server.database.EntityInstancePKResult;
075import com.echothree.model.control.core.server.database.EntityInstancePKsByBlobEntityAttributeQuery;
076import com.echothree.model.control.core.server.database.EntityInstancePKsByBooleanEntityAttributeQuery;
077import com.echothree.model.control.core.server.database.EntityInstancePKsByClobEntityAttributeQuery;
078import com.echothree.model.control.core.server.database.EntityInstancePKsByCollectionEntityAttributeQuery;
079import com.echothree.model.control.core.server.database.EntityInstancePKsByDateEntityAttributeQuery;
080import com.echothree.model.control.core.server.database.EntityInstancePKsByEntityEntityAttributeQuery;
081import com.echothree.model.control.core.server.database.EntityInstancePKsByGeoPointEntityAttributeQuery;
082import com.echothree.model.control.core.server.database.EntityInstancePKsByIntegerEntityAttributeQuery;
083import com.echothree.model.control.core.server.database.EntityInstancePKsByListItemEntityAttributeQuery;
084import com.echothree.model.control.core.server.database.EntityInstancePKsByLongEntityAttributeQuery;
085import com.echothree.model.control.core.server.database.EntityInstancePKsByMultipleListItemEntityAttributeQuery;
086import com.echothree.model.control.core.server.database.EntityInstancePKsByNameEntityAttributeQuery;
087import com.echothree.model.control.core.server.database.EntityInstancePKsByStringEntityAttributeQuery;
088import com.echothree.model.control.core.server.database.EntityInstancePKsByTimeEntityAttributeQuery;
089import com.echothree.model.control.core.server.database.EntityInstancesMissingBooleanEntityAttributeQuery;
090import com.echothree.model.control.core.server.database.EntityInstancesMissingDateEntityAttributeQuery;
091import com.echothree.model.control.core.server.database.EntityInstancesMissingGeoPointEntityAttributeQuery;
092import com.echothree.model.control.core.server.database.EntityInstancesMissingIntegerEntityAttributeQuery;
093import com.echothree.model.control.core.server.database.EntityInstancesMissingListItemEntityAttributeQuery;
094import com.echothree.model.control.core.server.database.EntityInstancesMissingLongEntityAttributeQuery;
095import com.echothree.model.control.core.server.database.EntityInstancesMissingMultipleListItemEntityAttributeQuery;
096import com.echothree.model.control.core.server.database.EntityInstancesMissingStringEntityAttributeQuery;
097import com.echothree.model.control.core.server.database.EntityInstancesMissingTimeEntityAttributeQuery;
098import com.echothree.model.control.index.server.control.IndexControl;
099import com.echothree.model.control.queue.common.QueueTypes;
100import com.echothree.model.control.queue.server.control.QueueControl;
101import com.echothree.model.control.queue.server.logic.QueueTypeLogic;
102import com.echothree.model.control.sequence.common.SequenceTypes;
103import com.echothree.model.control.sequence.common.exception.MissingDefaultSequenceException;
104import com.echothree.model.control.sequence.server.control.SequenceControl;
105import com.echothree.model.control.sequence.server.logic.SequenceGeneratorLogic;
106import com.echothree.model.control.workflow.common.exception.UnknownWorkflowEntityTypeException;
107import com.echothree.model.control.workflow.server.control.WorkflowControl;
108import com.echothree.model.data.core.server.entity.ComponentVendor;
109import com.echothree.model.data.core.server.entity.EntityAttribute;
110import com.echothree.model.data.core.server.entity.EntityAttributeGroup;
111import com.echothree.model.data.core.server.entity.EntityAttributeType;
112import com.echothree.model.data.core.server.entity.EntityBooleanAttribute;
113import com.echothree.model.data.core.server.entity.EntityBooleanDefault;
114import com.echothree.model.data.core.server.entity.EntityClobAttribute;
115import com.echothree.model.data.core.server.entity.EntityDateAttribute;
116import com.echothree.model.data.core.server.entity.EntityDateDefault;
117import com.echothree.model.data.core.server.entity.EntityGeoPointAttribute;
118import com.echothree.model.data.core.server.entity.EntityGeoPointDefault;
119import com.echothree.model.data.core.server.entity.EntityInstance;
120import com.echothree.model.data.core.server.entity.EntityIntegerAttribute;
121import com.echothree.model.data.core.server.entity.EntityIntegerDefault;
122import com.echothree.model.data.core.server.entity.EntityListItem;
123import com.echothree.model.data.core.server.entity.EntityListItemAttribute;
124import com.echothree.model.data.core.server.entity.EntityListItemDefault;
125import com.echothree.model.data.core.server.entity.EntityLongAttribute;
126import com.echothree.model.data.core.server.entity.EntityLongDefault;
127import com.echothree.model.data.core.server.entity.EntityMultipleListItemAttribute;
128import com.echothree.model.data.core.server.entity.EntityMultipleListItemDefault;
129import com.echothree.model.data.core.server.entity.EntityNameAttribute;
130import com.echothree.model.data.core.server.entity.EntityStringAttribute;
131import com.echothree.model.data.core.server.entity.EntityStringDefault;
132import com.echothree.model.data.core.server.entity.EntityTimeAttribute;
133import com.echothree.model.data.core.server.entity.EntityTimeDefault;
134import com.echothree.model.data.core.server.entity.EntityType;
135import com.echothree.model.data.core.server.entity.MimeType;
136import com.echothree.model.data.core.server.value.EntityAttributeDetailValue;
137import com.echothree.model.data.core.server.value.EntityListItemDetailValue;
138import com.echothree.model.data.party.common.pk.PartyPK;
139import com.echothree.model.data.party.server.entity.Language;
140import com.echothree.model.data.queue.server.value.QueuedEntityValue;
141import com.echothree.model.data.sequence.server.entity.Sequence;
142import com.echothree.model.data.uom.server.entity.UnitOfMeasureType;
143import com.echothree.model.data.workflow.server.entity.Workflow;
144import com.echothree.util.common.message.ExecutionErrors;
145import com.echothree.util.common.persistence.BasePK;
146import com.echothree.util.server.control.BaseLogic;
147import com.echothree.util.server.message.ExecutionErrorAccumulator;
148import com.echothree.util.server.persistence.EntityPermission;
149import com.echothree.util.server.persistence.Session;
150import java.util.ArrayList;
151import java.util.List;
152import java.util.regex.Pattern;
153import javax.enterprise.context.ApplicationScoped;
154import javax.inject.Inject;
155
156@ApplicationScoped
157public class EntityAttributeLogic
158        extends BaseLogic {
159
160    @Inject
161    protected EntityAttributeGroupControl entityAttributeGroupControl;
162
163    @Inject
164    IndexControl indexControl;
165
166    @Inject
167    QueueControl queueControl;
168
169    @Inject
170    SequenceControl sequenceControl;
171
172    @Inject
173    WorkflowControl workflowControl;
174
175    @Inject
176    protected EntityAttributeGroupLogic entityAttributeGroupLogic;
177
178    @Inject
179    EntityInstanceLogic entityInstanceLogic;
180
181    @Inject
182    EntityTypeLogic entityTypeLogic;
183
184    @Inject
185    QueueTypeLogic queueTypeLogic;
186
187    @Inject
188    SequenceGeneratorLogic sequenceGeneratorLogic;
189
190    protected EntityAttributeLogic() {
191        super();
192    }
193    
194    public EntityAttributeType getEntityAttributeTypeByName(final ExecutionErrorAccumulator eea, final String entityAttributeTypeName) {
195        var entityAttributeType = coreControl.getEntityAttributeTypeByName(entityAttributeTypeName);
196
197        if(entityAttributeType == null) {
198            handleExecutionError(UnknownEntityAttributeTypeNameException.class, eea, ExecutionErrors.UnknownEntityAttributeTypeName.name(), entityAttributeTypeName);
199        }
200
201        return entityAttributeType;
202    }
203
204    public EntityAttributeType getEntityAttributeTypeByUuid(final ExecutionErrorAccumulator eea, final String uuid, final EntityPermission entityPermission) {
205        EntityAttributeType entityAttributeType = null;
206        
207        var entityInstance = entityInstanceLogic.getEntityInstance(eea, (String)null, uuid,
208                ComponentVendors.ECHO_THREE.name(), EntityTypes.EntityAttributeType.name());
209
210        if(eea == null || !eea.hasExecutionErrors()) {
211            entityAttributeType = coreControl.getEntityAttributeTypeByEntityInstance(entityInstance, entityPermission);
212        }
213
214        return entityAttributeType;
215    }
216    
217    public EntityAttributeType getEntityAttributeTypeByUuid(final ExecutionErrorAccumulator eea, final String uuid) {
218        return getEntityAttributeTypeByUuid(eea, uuid, EntityPermission.READ_ONLY);
219    }
220    
221    public EntityAttributeType getEntityAttributeTypeByUuidForUpdate(final ExecutionErrorAccumulator eea, final String uuid) {
222        return getEntityAttributeTypeByUuid(eea, uuid, EntityPermission.READ_WRITE);
223    }
224    
225    public EntityAttributeGroup getEntityAttributeGroupByName(final ExecutionErrorAccumulator eea, final EntityType entityType, final String entityAttributeGroupName) {
226        return entityAttributeGroupLogic.getEntityAttributeGroupByName(eea, entityType, entityAttributeGroupName);
227    }
228
229    public EntityAttributeGroup getEntityAttributeGroupByUuid(final ExecutionErrorAccumulator eea, final String uuid, final EntityPermission entityPermission) {
230        EntityAttributeGroup entityAttributeGroup = null;
231        
232        var entityInstance = entityInstanceLogic.getEntityInstance(eea, (String)null, uuid,
233                ComponentVendors.ECHO_THREE.name(), EntityTypes.EntityAttributeGroup.name());
234
235        if(eea == null || !eea.hasExecutionErrors()) {
236            entityAttributeGroup = entityAttributeGroupControl.getEntityAttributeGroupByEntityInstance(entityInstance, entityPermission);
237        }
238
239        return entityAttributeGroup;
240    }
241    
242    public EntityAttributeGroup getEntityAttributeGroupByUuid(final ExecutionErrorAccumulator eea, final String uuid) {
243        return getEntityAttributeGroupByUuid(eea, uuid, EntityPermission.READ_ONLY);
244    }
245    
246    public EntityAttributeGroup getEntityAttributeGroupByUuidForUpdate(final ExecutionErrorAccumulator eea, final String uuid) {
247        return getEntityAttributeGroupByUuid(eea, uuid, EntityPermission.READ_WRITE);
248    }
249    
250    public EntityAttribute createEntityAttribute(final ExecutionErrorAccumulator eea, final EntityType entityType,
251            String entityAttributeName, final EntityAttributeType entityAttributeType, final Boolean trackRevisions,
252            final Boolean checkContentWebAddress, final String validationPattern, final Integer upperRangeIntegerValue,
253            final Integer upperLimitIntegerValue, final Integer lowerLimitIntegerValue, final Integer lowerRangeIntegerValue,
254            final Long upperRangeLongValue, final Long upperLimitLongValue, final Long lowerLimitLongValue,
255            final Long lowerRangeLongValue, final Sequence entityListItemSequence, final UnitOfMeasureType unitOfMeasureType,
256            final Workflow workflow, final Integer sortOrder, final BasePK createdBy, final Language language,
257            final String description) {
258        EntityAttribute entityAttribute = null;
259        var entityTypeDetail = entityType.getLastDetail();
260
261        if(entityTypeDetail.getIsExtensible()) {
262            if(entityAttributeName == null) {
263                var sequence = sequenceControl.getDefaultSequenceUsingNames(SequenceTypes.ENTITY_ATTRIBUTE.name());
264
265                entityAttributeName = sequenceGeneratorLogic.getNextSequenceValue(sequence);
266            }
267
268            entityAttribute = coreControl.getEntityAttributeByName(entityType, entityAttributeName);
269
270            if(entityAttribute == null) {
271                var entityAttributeTypeEnum = EntityAttributeTypes.valueOf(entityAttributeType.getEntityAttributeTypeName());
272
273                switch(entityAttributeTypeEnum) {
274                    case WORKFLOW -> {
275                        if(coreControl.countEntityAttributesByEntityTypeAndWorkflow(entityType, workflow) != 0) {
276                            handleExecutionError(DuplicateWorkflowUsageInEntityAttributeException.class, eea, ExecutionErrors.DuplicateWorkflowUsageInEntityAttribute.name(),
277                                    entityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(), entityTypeDetail.getEntityTypeName(),
278                                    workflow.getLastDetail().getWorkflowName());
279                        } else {
280                            if(!workflowControl.workflowEntityTypeExists(workflow, entityType)) {
281                                handleExecutionError(UnknownWorkflowEntityTypeException.class, eea, ExecutionErrors.UnknownWorkflowEntityType.name(),
282                                        workflow.getLastDetail().getWorkflowName(), entityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(),
283                                        entityTypeDetail.getEntityTypeName());
284                            }
285
286                        }
287                    }
288                    default -> {
289                        // Nothing required for other EntityAttributeTypes
290                    }
291                }
292
293                if(!hasExecutionErrors(eea)) {
294                    entityAttribute = coreControl.createEntityAttribute(entityType, entityAttributeName, entityAttributeType,
295                            trackRevisions, sortOrder, createdBy);
296
297                    if(description != null) {
298                        coreControl.createEntityAttributeDescription(entityAttribute, language, description, createdBy);
299                    }
300
301                    switch(entityAttributeTypeEnum) {
302                        case BLOB ->
303                                coreControl.createEntityAttributeBlob(entityAttribute, checkContentWebAddress, createdBy);
304                        case STRING -> {
305                            if(validationPattern != null) {
306                                coreControl.createEntityAttributeString(entityAttribute, validationPattern, createdBy);
307                            }
308                        }
309                        case INTEGER -> {
310                            if(upperRangeIntegerValue != null || upperLimitIntegerValue != null || lowerLimitIntegerValue != null || lowerRangeIntegerValue != null) {
311                                coreControl.createEntityAttributeInteger(entityAttribute, upperRangeIntegerValue, upperLimitIntegerValue,
312                                        lowerLimitIntegerValue, lowerRangeIntegerValue, createdBy);
313                            }
314                            if(unitOfMeasureType != null) {
315                                coreControl.createEntityAttributeNumeric(entityAttribute, unitOfMeasureType, createdBy);
316                            }
317                        }
318                        case LONG -> {
319                            if(upperRangeLongValue != null || upperLimitLongValue != null || lowerLimitLongValue != null || lowerRangeLongValue != null) {
320                                coreControl.createEntityAttributeLong(entityAttribute, upperRangeLongValue, upperLimitLongValue,
321                                        lowerLimitLongValue, lowerRangeLongValue, createdBy);
322                            }
323                            if(unitOfMeasureType != null) {
324                                coreControl.createEntityAttributeNumeric(entityAttribute, unitOfMeasureType, createdBy);
325                            }
326                        }
327                        case LISTITEM, MULTIPLELISTITEM -> {
328                            if(entityListItemSequence != null) {
329                                coreControl.createEntityAttributeListItem(entityAttribute, entityListItemSequence, createdBy);
330                            }
331                        }
332                        case WORKFLOW -> {
333                            if(workflow != null) {
334                                coreControl.createEntityAttributeWorkflow(entityAttribute, workflow, createdBy);
335                            }
336                        }
337                        default -> {
338                            // Nothing required for other EntityAttributeTypes
339                        }
340                    }
341                }
342            } else {
343                handleExecutionError(DuplicateEntityAttributeNameException.class, eea, ExecutionErrors.DuplicateEntityAttributeName.name(),
344                        entityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(), entityTypeDetail.getEntityTypeName(), entityAttributeName);
345            }
346        } else {
347            handleExecutionError(EntityTypeIsNotExtensibleException.class, eea, ExecutionErrors.EntityTypeIsNotExtensible.name(),
348                    entityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(), entityTypeDetail.getEntityTypeName());
349        }
350        
351        return entityAttribute;
352    }
353    
354    public EntityAttribute getEntityAttributeByName(final ExecutionErrorAccumulator eea, final EntityType entityType,
355            final String entityAttributeName, EntityPermission entityPermission) {
356        var entityAttribute = coreControl.getEntityAttributeByName(entityType, entityAttributeName, entityPermission);
357
358        if(entityAttribute == null) {
359            var entityTypeDetail = entityType.getLastDetail();
360            
361            handleExecutionError(UnknownEntityAttributeNameException.class, eea, ExecutionErrors.UnknownEntityAttributeName.name(),
362                    entityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(), entityTypeDetail.getEntityTypeName(), entityAttributeName);
363        }
364
365        return entityAttribute;
366    }
367
368    public EntityAttribute getEntityAttributeByName(final ExecutionErrorAccumulator eea, final EntityType entityType,
369            final String entityAttributeName) {
370        return getEntityAttributeByName(eea, entityType, entityAttributeName, EntityPermission.READ_ONLY);
371    }
372    
373    public EntityAttribute getEntityAttributeByNameForUpdate(final ExecutionErrorAccumulator eea, final EntityType entityType,
374            final String entityAttributeName) {
375        return getEntityAttributeByName(eea, entityType, entityAttributeName, EntityPermission.READ_WRITE);
376    }
377    
378    public EntityAttribute getEntityAttributeByName(final ExecutionErrorAccumulator eea, final ComponentVendor componentVendor,
379            final String entityTypeName, final String entityAttributeName, EntityPermission entityPermission) {
380        var entityType = entityTypeLogic.getEntityTypeByName(eea, componentVendor, entityTypeName);
381        EntityAttribute entityAttribute = null;
382        
383        if(eea == null || !eea.hasExecutionErrors()) {
384            entityAttribute = getEntityAttributeByName(eea, entityType, entityAttributeName, entityPermission);
385        }
386
387        return entityAttribute;
388    }
389
390    public EntityAttribute getEntityAttributeByName(final ExecutionErrorAccumulator eea, final ComponentVendor componentVendor,
391            final String entityTypeName, final String entityAttributeName) {
392        return getEntityAttributeByName(eea, componentVendor, entityTypeName, entityAttributeName, EntityPermission.READ_ONLY);
393    }
394    
395    public EntityAttribute getEntityAttributeByNameForUpdate(final ExecutionErrorAccumulator eea, final ComponentVendor componentVendor,
396            final String entityTypeName, final String entityAttributeName) {
397        return getEntityAttributeByName(eea, componentVendor, entityTypeName, entityAttributeName, EntityPermission.READ_WRITE);
398    }
399    
400    public EntityAttribute getEntityAttributeByName(final ExecutionErrorAccumulator eea, final String componentVendorName,
401            final String entityTypeName, final String entityAttributeName, EntityPermission entityPermission) {
402        var entityType = entityTypeLogic.getEntityTypeByName(eea, componentVendorName, entityTypeName);
403        EntityAttribute entityAttribute = null;
404        
405        if(eea == null || !eea.hasExecutionErrors()) {
406            entityAttribute = getEntityAttributeByName(eea, entityType, entityAttributeName, entityPermission);
407        }
408
409        return entityAttribute;
410    }
411    
412    public EntityAttribute getEntityAttributeByName(final ExecutionErrorAccumulator eea, final String componentVendorName,
413            final String entityTypeName, final String entityAttributeName) {
414        return getEntityAttributeByName(eea, componentVendorName, entityTypeName, entityAttributeName, EntityPermission.READ_ONLY);
415    }
416    
417    public EntityAttribute getEntityAttributeByNameForUpdate(final ExecutionErrorAccumulator eea, final String componentVendorName,
418            final String entityTypeName, final String entityAttributeName) {
419        return getEntityAttributeByName(eea, componentVendorName, entityTypeName, entityAttributeName, EntityPermission.READ_WRITE);
420    }
421    
422    public EntityAttribute getEntityAttributeByUuid(final ExecutionErrorAccumulator eea, final String uuid,
423            final EntityPermission entityPermission) {
424        EntityAttribute entityAttribute = null;
425        
426        var entityInstance = entityInstanceLogic.getEntityInstance(eea, (String)null, uuid,
427                ComponentVendors.ECHO_THREE.name(), EntityTypes.EntityAttribute.name());
428
429        if(eea == null || !eea.hasExecutionErrors()) {
430            entityAttribute = coreControl.getEntityAttributeByEntityInstance(entityInstance, entityPermission);
431        }
432
433        return entityAttribute;
434    }
435    
436    public EntityAttribute getEntityAttributeByUuid(final ExecutionErrorAccumulator eea, final String uuid) {
437        return getEntityAttributeByUuid(eea, uuid, EntityPermission.READ_ONLY);
438    }
439    
440    public EntityAttribute getEntityAttributeByUuidForUpdate(final ExecutionErrorAccumulator eea, final String uuid) {
441        return getEntityAttributeByUuid(eea, uuid, EntityPermission.READ_WRITE);
442    }
443
444    // For when we need to determine the EntityType from what the user passes in:
445    public EntityAttribute getEntityAttributeByUniversalSpec(final ExecutionErrorAccumulator eea, final EntityAttributeUniversalSpec universalSpec,
446            final EntityPermission entityPermission) {
447        EntityAttribute entityAttribute = null;
448        var componentVendorName = universalSpec.getComponentVendorName();
449        var entityTypeName = universalSpec.getEntityTypeName();
450        var entityAttributeName = universalSpec.getEntityAttributeName();
451        var universalSpecCount = entityInstanceLogic.countPossibleEntitySpecs(universalSpec);
452        var parameterCount = (componentVendorName == null && entityTypeName == null && entityAttributeName == null ? 0 : 1)
453                + universalSpecCount;
454
455        switch(parameterCount) {
456            case 1 -> {
457                if(universalSpecCount == 1) {
458                    var entityInstance = entityInstanceLogic.getEntityInstance(eea, universalSpec,
459                            ComponentVendors.ECHO_THREE.name(), EntityTypes.EntityAttribute.name());
460
461                    if(eea == null || !eea.hasExecutionErrors()) {
462                        entityAttribute = coreControl.getEntityAttributeByEntityInstance(entityInstance, entityPermission);
463                    }
464                } else {
465                    entityAttribute = getEntityAttributeByName(eea, componentVendorName, entityTypeName, entityAttributeName, entityPermission);
466                }
467            }
468            default -> {
469                handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name());
470            }
471        }
472
473        return entityAttribute;
474    }
475
476    public EntityAttribute getEntityAttributeByUniversalSpec(final ExecutionErrorAccumulator eea, final EntityAttributeUniversalSpec universalSpec) {
477        return getEntityAttributeByUniversalSpec(eea, universalSpec, EntityPermission.READ_ONLY);
478    }
479
480    public EntityAttribute getEntityAttributeByUniversalSpecForUpdate(final ExecutionErrorAccumulator eea, final EntityAttributeUniversalSpec universalSpec) {
481        return getEntityAttributeByUniversalSpec(eea, universalSpec, EntityPermission.READ_WRITE);
482    }
483
484    // For when we can get the EntityType from the EntityInstance:
485    public EntityAttribute getEntityAttribute(final ExecutionErrorAccumulator eea, final EntityInstance entityInstance,
486            final EntityAttributeSpec spec, final EntityAttributeUuid uuid, final EntityPermission entityPermission,
487            final EntityAttributeTypes... entityAttributeTypes) {
488        EntityAttribute entityAttribute = null;
489        var entityAttributeName = spec.getEntityAttributeName();
490        var entityAttributeUuid = uuid.getEntityAttributeUuid();
491        var parameterCount = (entityAttributeName == null ? 0 : 1) + (entityAttributeUuid == null ? 0 : 1);
492
493        if (parameterCount == 1) {
494            entityAttribute = entityAttributeName == null
495                    ? getEntityAttributeByUuid(eea, entityAttributeUuid, entityPermission)
496                    : getEntityAttributeByName(eea, entityInstance.getEntityType(), entityAttributeName, entityPermission);
497        } else {
498            handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name());
499        }
500
501        // If there are no other errors, and the EntityAttribute was specified by ULID, then verify the EntityType...
502        if((eea == null || !eea.hasExecutionErrors()) && entityAttributeUuid != null) {
503            if(!entityInstance.getEntityType().equals(entityAttribute.getLastDetail().getEntityType())) {
504                var expectedEntityTypeDetail = entityAttribute.getLastDetail().getEntityType().getLastDetail();
505                var suppliedEntityTypeDetail = entityInstance.getEntityType().getLastDetail();
506
507                handleExecutionError(MismatchedEntityTypeException.class, eea, ExecutionErrors.MismatchedEntityType.name(),
508                        expectedEntityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(),
509                        expectedEntityTypeDetail.getEntityTypeName(),
510                        suppliedEntityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(),
511                        suppliedEntityTypeDetail.getEntityTypeName());
512            }
513        }
514
515        // If there are no other errors, and there are one of more entityAttributeTypes specified, then verify the EntityAttributeType...
516        if((eea == null || !eea.hasExecutionErrors()) && entityAttributeTypes.length > 0) {
517            var entityAttributeTypeName = entityAttribute.getLastDetail().getEntityAttributeType().getEntityAttributeTypeName();
518            var found = false;
519
520            for(var entityAttributeType : entityAttributeTypes) {
521                if(entityAttributeTypeName.equals(entityAttributeType.name())) {
522                    found = true;
523                    break;
524                }
525            }
526
527            if(!found) {
528                handleExecutionError(MismatchedEntityAttributeTypeException.class, eea, ExecutionErrors.MismatchedEntityAttributeType.name(),
529                        entityAttributeTypeName);
530                entityAttribute = null;
531            }
532        }
533
534        return entityAttribute;
535    }
536
537    public EntityAttribute getEntityAttribute(final ExecutionErrorAccumulator eea, final EntityInstance entityInstance,
538            final EntityAttributeSpec spec, final EntityAttributeUuid uuid, final EntityAttributeTypes... entityAttributeTypes) {
539        return getEntityAttribute(eea, entityInstance, spec, uuid, EntityPermission.READ_ONLY, entityAttributeTypes);
540    }
541
542    public EntityAttribute getEntityAttributeForUpdate(final ExecutionErrorAccumulator eea, final EntityInstance entityInstance,
543            final EntityAttributeSpec spec, final EntityAttributeUuid uuid, final EntityAttributeTypes... entityAttributeTypes) {
544        return getEntityAttribute(eea, entityInstance, spec, uuid, EntityPermission.READ_WRITE, entityAttributeTypes);
545    }
546
547    public EntityInstance getEntityInstanceAttribute(final ExecutionErrorAccumulator eea,
548            final EntityInstanceAttributeSpec entityInstanceAttributeSpec) {
549        var entityRef = entityInstanceAttributeSpec.getEntityRefAttribute();
550        var uuid = entityInstanceAttributeSpec.getUuidAttribute();
551
552        return entityInstanceLogic.getEntityInstance(eea, entityRef, uuid, null);
553    }
554
555    private List<EntityInstancePKResult> getEntityInstanceResultsByEntityAttributeTypeName(EntityAttribute entityAttribute) {
556        List<EntityInstancePKResult> entityInstanceResults = null;
557        var entityAttributeTypeName = entityAttribute.getLastDetail().getEntityAttributeType().getEntityAttributeTypeName();
558        
559        if(entityAttributeTypeName.equals(EntityAttributeTypes.BOOLEAN.name())) {
560            entityInstanceResults = new EntityInstancePKsByBooleanEntityAttributeQuery().execute(entityAttribute);
561        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.NAME.name())) {
562            entityInstanceResults = new EntityInstancePKsByNameEntityAttributeQuery().execute(entityAttribute);
563        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.INTEGER.name())) {
564            entityInstanceResults = new EntityInstancePKsByIntegerEntityAttributeQuery().execute(entityAttribute);
565        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.LONG.name())) {
566            entityInstanceResults = new EntityInstancePKsByLongEntityAttributeQuery().execute(entityAttribute);
567        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.STRING.name())) {
568            entityInstanceResults = new EntityInstancePKsByStringEntityAttributeQuery().execute(entityAttribute);
569        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.GEOPOINT.name())) {
570            entityInstanceResults = new EntityInstancePKsByGeoPointEntityAttributeQuery().execute(entityAttribute);
571        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.BLOB.name())) {
572            entityInstanceResults = new EntityInstancePKsByBlobEntityAttributeQuery().execute(entityAttribute);
573        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.CLOB.name())) {
574            entityInstanceResults = new EntityInstancePKsByClobEntityAttributeQuery().execute(entityAttribute);
575        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.DATE.name())) {
576            entityInstanceResults = new EntityInstancePKsByDateEntityAttributeQuery().execute(entityAttribute);
577        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.TIME.name())) {
578            entityInstanceResults = new EntityInstancePKsByTimeEntityAttributeQuery().execute(entityAttribute);
579        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.LISTITEM.name())) {
580            entityInstanceResults = new EntityInstancePKsByListItemEntityAttributeQuery().execute(entityAttribute);
581        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.MULTIPLELISTITEM.name())) {
582            entityInstanceResults = new EntityInstancePKsByMultipleListItemEntityAttributeQuery().execute(entityAttribute);
583        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.ENTITY.name())) {
584            entityInstanceResults = new EntityInstancePKsByEntityEntityAttributeQuery().execute(entityAttribute);
585        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.COLLECTION.name())) {
586            entityInstanceResults = new EntityInstancePKsByCollectionEntityAttributeQuery().execute(entityAttribute);
587        }
588
589        return entityInstanceResults;
590    }
591    
592    public void updateEntityAttributeFromValue(final Session session, final EntityAttributeDetailValue entityAttributeDetailValue,
593            final BasePK updatedBy) {
594        if(entityAttributeDetailValue.getEntityAttributeNameHasBeenModified()) {
595            final var entityAttribute = coreControl.getEntityAttributeByPK(entityAttributeDetailValue.getEntityAttributePK());
596            
597            if(indexControl.countIndexTypesByEntityType(entityAttribute.getLastDetail().getEntityType()) > 0) {
598                final var queueTypePK = queueTypeLogic.getQueueTypeByName(null, QueueTypes.INDEXING.name()).getPrimaryKey();
599                final var entityInstanceResults = getEntityInstanceResultsByEntityAttributeTypeName(entityAttribute);
600                final var queuedEntities = new ArrayList<QueuedEntityValue>(entityInstanceResults.size());
601
602                for(final var entityInstanceResult : entityInstanceResults) {
603                    queuedEntities.add(new QueuedEntityValue(queueTypePK, entityInstanceResult.getEntityInstancePK(), session.getStartTime()));
604                }
605
606                queueControl.createQueuedEntities(queuedEntities);
607            }
608        }
609        
610        coreControl.updateEntityAttributeFromValue(entityAttributeDetailValue, updatedBy);
611    }
612    
613    public void deleteEntityAttribute(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
614            final PartyPK deletedByPK) {
615        coreControl.deleteEntityAttribute(entityAttribute, deletedByPK);
616    }
617
618    public EntityListItem createEntityListItem(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
619            String entityListItemName, final Boolean isDefault, final Integer sortOrder, final BasePK createdBy,
620            final Language language, final String description) {
621        EntityListItem entityListItem = null;
622        var entityAttributeTypeName = entityAttribute.getLastDetail().getEntityAttributeType().getEntityAttributeTypeName();
623
624        if(entityAttributeTypeName.equals(EntityAttributeTypes.LISTITEM.name())
625                || entityAttributeTypeName.equals(EntityAttributeTypes.MULTIPLELISTITEM.name())) {
626            if(entityListItemName == null) {
627                var entityAttributeListItem = coreControl.getEntityAttributeListItem(entityAttribute);
628                var entityListItemSequence = entityAttributeListItem == null ? null : entityAttributeListItem.getEntityListItemSequence();
629
630                if(entityListItemSequence == null) {
631                    entityListItemSequence = sequenceGeneratorLogic.getDefaultSequence(eea, SequenceTypes.ENTITY_LIST_ITEM.name());
632                }
633
634                if(eea != null && !hasExecutionErrors(eea)) {
635                    entityListItemName = sequenceGeneratorLogic.getNextSequenceValue(eea, entityListItemSequence);
636                } else {
637                    handleExecutionError(MissingDefaultSequenceException.class, eea, ExecutionErrors.MissingDefaultSequence.name(),
638                            SequenceTypes.ENTITY_LIST_ITEM.name());
639                }
640            }
641            
642            if(eea != null && !hasExecutionErrors(eea)) {
643                entityListItem = entityListItemName == null ? null : coreControl.getEntityListItemByName(entityAttribute, entityListItemName);
644
645                if(entityListItem == null) {
646                    entityListItem = coreControl.createEntityListItem(entityAttribute, entityListItemName, isDefault, sortOrder,
647                            createdBy);
648
649                    if(description != null) {
650                        coreControl.createEntityListItemDescription(entityListItem, language, description, createdBy);
651                    }
652                } else {
653                    var entityAttributeDetail = entityAttribute.getLastDetail();
654                    var entityTypeDetail = entityAttributeDetail.getEntityType().getLastDetail();
655                    
656                    handleExecutionError(DuplicateEntityListItemNameException.class, eea, ExecutionErrors.DuplicateEntityListItemName.name(),
657                            entityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(),
658                            entityTypeDetail.getEntityTypeName(), entityAttributeDetail.getEntityAttributeName(),
659                            entityListItemName);
660                }
661            }
662        } else {
663            var entityAttributeDetail = entityAttribute.getLastDetail();
664            var entityTypeDetail = entityAttributeDetail.getEntityType().getLastDetail();
665                    
666            handleExecutionError(InvalidEntityAttributeTypeException.class, eea, ExecutionErrors.InvalidEntityAttributeType.name(), 
667                            entityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(),
668                            entityTypeDetail.getEntityTypeName(), entityAttributeDetail.getEntityAttributeName(),
669                            entityAttributeTypeName);
670        }
671        
672        return entityListItem;
673    }
674    
675    public EntityListItem getEntityListItemByName(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
676            final String entityListItemName, final EntityPermission entityPermission) {
677        var entityListItem = coreControl.getEntityListItemByName(entityAttribute, entityListItemName, entityPermission);
678
679        if(entityListItem == null) {
680            var entityAttributeDetail = entityAttribute.getLastDetail();
681            var entityTypeDetail = entityAttributeDetail.getEntityType().getLastDetail();
682            
683            handleExecutionError(UnknownEntityListItemNameException.class, eea, ExecutionErrors.UnknownEntityListItemName.name(),
684                    entityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(),
685                    entityTypeDetail.getEntityTypeName(), entityListItemName);
686        }
687
688        return entityListItem;
689    }
690
691    public EntityListItem getEntityListItemByName(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
692            final String entityListItemName) {
693        return getEntityListItemByName(eea, entityAttribute, entityListItemName, EntityPermission.READ_ONLY);
694    }
695    
696    public EntityListItem getEntityListItemByNameForUpdate(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
697            final String entityListItemName) {
698        return getEntityListItemByName(eea, entityAttribute, entityListItemName, EntityPermission.READ_WRITE);
699    }
700        
701    public EntityListItem getEntityListItemByName(final ExecutionErrorAccumulator eea, final String componentVendorName,
702            final String entityTypeName, final String entityAttributeName, final String entityListItemName,
703            final EntityPermission entityPermission) {
704        var entityAttribute = this.getEntityAttributeByName(eea, componentVendorName,
705                entityTypeName, entityAttributeName);
706        EntityListItem entityListItem = null;
707        
708        if(eea == null || !eea.hasExecutionErrors()) {
709            entityListItem = getEntityListItemByName(eea, entityAttribute, entityListItemName, entityPermission);
710        }
711
712        return entityListItem;
713    }
714    
715    public EntityListItem getEntityListItemByName(final ExecutionErrorAccumulator eea, final String componentVendorName,
716            final String entityTypeName, final String entityAttributeName, final String entityListItemName) {
717        return getEntityListItemByName(eea, componentVendorName, entityTypeName, entityAttributeName, entityListItemName,
718                EntityPermission.READ_ONLY);
719    }
720    
721    public EntityListItem getEntityListItemByNameForUpdate(final ExecutionErrorAccumulator eea, final String componentVendorName,
722            final String entityTypeName, final String entityAttributeName, final String entityListItemName) {
723        return getEntityListItemByName(eea, componentVendorName, entityTypeName, entityAttributeName, entityListItemName,
724                EntityPermission.READ_WRITE);
725    }
726        
727    public EntityListItem getEntityListItemByUuid(final ExecutionErrorAccumulator eea, final String uuid, final EntityPermission entityPermission) {
728        EntityListItem entityListItem = null;
729        
730        var entityInstance = entityInstanceLogic.getEntityInstance(eea, (String)null, uuid,
731                ComponentVendors.ECHO_THREE.name(), EntityTypes.EntityListItem.name());
732
733        if(eea == null || !eea.hasExecutionErrors()) {
734            entityListItem = coreControl.getEntityListItemByEntityInstance(entityInstance, entityPermission);
735        }
736
737        return entityListItem;
738    }
739    
740    public EntityListItem getEntityListItemByUuid(final ExecutionErrorAccumulator eea, final String uuid) {
741        return getEntityListItemByUuid(eea, uuid, EntityPermission.READ_ONLY);
742    }
743    
744    public EntityListItem getEntityListItemByUuidForUpdate(final ExecutionErrorAccumulator eea, final String uuid) {
745        return getEntityListItemByUuid(eea, uuid, EntityPermission.READ_WRITE);
746    }
747
748    public EntityListItem getEntityListItemByUniversalSpec(final ExecutionErrorAccumulator eea, final EntityListItemUniversalSpec universalSpec,
749            final EntityPermission entityPermission) {
750        EntityListItem entityListItem = null;
751        var componentVendorName = universalSpec.getComponentVendorName();
752        var entityTypeName = universalSpec.getEntityTypeName();
753        var entityAttributeName = universalSpec.getEntityAttributeName();
754        var entityListItemName = universalSpec.getEntityListItemName();
755        var universalSpecCount = entityInstanceLogic.countPossibleEntitySpecs(universalSpec);
756        var parameterCount = (componentVendorName == null && entityTypeName == null && entityAttributeName == null && entityListItemName == null ? 0 : 1)
757                + universalSpecCount;
758
759        switch(parameterCount) {
760            case 1 -> {
761                if(universalSpecCount == 1) {
762                    var entityInstance = entityInstanceLogic.getEntityInstance(eea, universalSpec,
763                            ComponentVendors.ECHO_THREE.name(), EntityTypes.EntityListItem.name());
764
765                    if(eea == null || !eea.hasExecutionErrors()) {
766                        entityListItem = coreControl.getEntityListItemByEntityInstance(entityInstance, entityPermission);
767                    }
768                } else {
769                    entityListItem = getEntityListItemByName(eea, componentVendorName, entityTypeName, entityAttributeName,
770                            entityListItemName, entityPermission);
771                }
772            }
773            default -> {
774                handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name());
775            }
776        }
777
778        return entityListItem;
779    }
780
781    public EntityListItem getEntityListItemByUniversalSpec(final ExecutionErrorAccumulator eea, final EntityListItemUniversalSpec universalSpec) {
782        return getEntityListItemByUniversalSpec(eea, universalSpec, EntityPermission.READ_ONLY);
783    }
784
785    public EntityListItem getEntityListItemByUniversalSpecForUpdate(final ExecutionErrorAccumulator eea, final EntityListItemUniversalSpec universalSpec) {
786        return getEntityListItemByUniversalSpec(eea, universalSpec, EntityPermission.READ_WRITE);
787    }
788
789    public EntityListItem getEntityListItem(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
790            final EntityListItemAttributeEdit edit, final EntityPermission entityPermission) {
791        EntityListItem entityListItem = null;
792        var entityListItemName = edit.getEntityListItemName();
793        var entityListItemUuid = edit.getEntityListItemUuid();
794        var parameterCount = (entityListItemName == null ? 0 : 1) + (entityListItemUuid == null ? 0 : 1);
795
796        if (parameterCount == 1) {
797            entityListItem = entityListItemName == null
798                    ? getEntityListItemByUuid(eea, entityListItemUuid, entityPermission)
799                    : getEntityListItemByName(eea, entityAttribute, entityListItemName, entityPermission);
800        } else {
801            handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name());
802        }
803        
804        if((eea == null || !eea.hasExecutionErrors()) && entityListItemUuid != null) {
805            var foundEntityAttribute = entityListItem.getLastDetail().getEntityAttribute();
806
807            if(!foundEntityAttribute.equals(entityAttribute)) {
808                handleExecutionError(MismatchedEntityListItemException.class, eea, ExecutionErrors.MismatchedEntityListItem.name(),
809                        entityAttribute.getLastDetail().getEntityType().getLastDetail().getComponentVendor().getLastDetail().getComponentVendorName(),
810                        entityAttribute.getLastDetail().getEntityType().getLastDetail().getEntityTypeName(),
811                        entityAttribute.getLastDetail().getEntityAttributeName(),
812                        foundEntityAttribute.getLastDetail().getEntityType().getLastDetail().getComponentVendor().getLastDetail().getComponentVendorName(),
813                        foundEntityAttribute.getLastDetail().getEntityType().getLastDetail().getEntityTypeName(),
814                        foundEntityAttribute.getLastDetail().getEntityAttributeName(),
815                        entityListItem.getLastDetail().getEntityListItem());
816            }
817        }
818        
819        return entityListItem;
820    }
821    
822    public EntityListItem getEntityListItem(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
823            final EntityListItemAttributeEdit edit) {
824        return getEntityListItem(eea, entityAttribute, edit, EntityPermission.READ_ONLY);
825    }
826    
827    public EntityListItem getEntityListItemForUpdate(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
828            final EntityListItemAttributeEdit edit, final EntityListItemUuid uuid) {
829        return getEntityListItem(eea, entityAttribute, edit, EntityPermission.READ_WRITE);
830    }
831    
832    public void updateEntityListItemFromValue(final Session session, EntityListItemDetailValue entityListItemDetailValue, BasePK updatedBy) {
833        if(entityListItemDetailValue.getEntityListItemNameHasBeenModified()) {
834            var entityListItem = coreControl.getEntityListItemByPK(entityListItemDetailValue.getEntityListItemPK());
835            var entityAttributeDetail = entityListItem.getLastDetail().getEntityAttribute().getLastDetail();
836            
837            if(indexControl.countIndexTypesByEntityType(entityAttributeDetail.getEntityType()) > 0) {
838                var queueTypePK = queueTypeLogic.getQueueTypeByName(null, QueueTypes.INDEXING.name()).getPrimaryKey();
839                var entityAttributeTypeName = entityAttributeDetail.getEntityAttributeType().getEntityAttributeTypeName();
840
841                if(entityAttributeTypeName.equals(EntityAttributeTypes.LISTITEM.name())) {
842                    var entityListItemAttributes = coreControl.getEntityListItemAttributesByEntityListItem(entityListItem);
843                    List<QueuedEntityValue> queuedEntities = new ArrayList<>(entityListItemAttributes.size());
844
845                    entityListItemAttributes.forEach((entityListItemAttribute) -> {
846                        queuedEntities.add(new QueuedEntityValue(queueTypePK, entityListItemAttribute.getEntityInstancePK(), session.getStartTime()));
847                    });
848
849                    queueControl.createQueuedEntities(queuedEntities);
850                } else if(entityAttributeTypeName.equals(EntityAttributeTypes.MULTIPLELISTITEM.name())) {
851                    var entityMultipleListItemAttributes = coreControl.getEntityMultipleListItemAttributesByEntityListItem(entityListItem);
852                    List<QueuedEntityValue> queuedEntities = new ArrayList<>(entityMultipleListItemAttributes.size());
853
854                    entityMultipleListItemAttributes.forEach((entityMultipleListItemAttribute) -> {
855                        queuedEntities.add(new QueuedEntityValue(queueTypePK, entityMultipleListItemAttribute.getEntityInstancePK(), session.getStartTime()));
856                    });
857
858                    queueControl.createQueuedEntities(queuedEntities);
859                }
860            }
861        }
862
863        coreControl.updateEntityListItemFromValue(entityListItemDetailValue, updatedBy);
864    }
865    
866    public void deleteEntityListItem(final ExecutionErrorAccumulator eea, EntityListItem entityListItem, BasePK deletedBy) {
867        coreControl.deleteEntityListItem(entityListItem, deletedBy);
868    }
869
870    private void checkEntityType(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
871            final EntityInstance entityInstance) {
872        if(!entityInstance.getEntityType().equals(entityAttribute.getLastDetail().getEntityType())) {
873            var expectedEntityTypeDetail = entityAttribute.getLastDetail().getEntityType().getLastDetail();
874            var suppliedEntityTypeDetail = entityInstance.getEntityType().getLastDetail();
875
876            handleExecutionError(MismatchedEntityTypeException.class, eea, ExecutionErrors.MismatchedEntityType.name(),
877                    expectedEntityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(),
878                    expectedEntityTypeDetail.getEntityTypeName(),
879                    suppliedEntityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(),
880                    suppliedEntityTypeDetail.getEntityTypeName());
881        }
882    }
883
884    private void checkEntityType(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
885            final EntityAttributeTypes entityAttributeType) {
886        var entityAttributeTypeName = entityAttributeType.name();
887
888        if(!entityAttribute.getLastDetail().getEntityAttributeType().getEntityAttributeTypeName().equals(entityAttributeTypeName)) {
889            var expectedEntityTypeDetail = entityAttribute.getLastDetail().getEntityType().getLastDetail();
890
891            handleExecutionError(MismatchedEntityAttributeTypeException.class, eea, ExecutionErrors.MismatchedEntityAttributeType.name(),
892                    expectedEntityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(),
893                    expectedEntityTypeDetail.getEntityTypeName(),
894                    entityAttributeTypeName);
895        }
896    }
897
898    public EntityBooleanDefault createEntityBooleanDefault(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
899            final Boolean booleanAttribute, final boolean addMissingAttributes, final BasePK createdBy) {
900        EntityBooleanDefault entityBooleanDefault = null;
901
902        checkEntityType(eea, entityAttribute, EntityAttributeTypes.BOOLEAN);
903
904        if(eea == null || !eea.hasExecutionErrors()) {
905            entityBooleanDefault = coreControl.getEntityBooleanDefault(entityAttribute);
906
907            if(entityBooleanDefault == null) {
908                coreControl.createEntityBooleanDefault(entityAttribute, booleanAttribute, createdBy);
909
910                if(addMissingAttributes) {
911                    new EntityInstancesMissingBooleanEntityAttributeQuery().execute(entityAttribute).forEach(entityInstanceResult ->
912                            coreControl.createEntityBooleanAttribute(entityAttribute.getPrimaryKey(),
913                                    entityInstanceResult.getEntityInstance(), booleanAttribute, createdBy));
914                }
915            } else {
916                handleExecutionError(DuplicateEntityBooleanDefaultException.class, eea, ExecutionErrors.DuplicateEntityBooleanDefault.name(),
917                        entityAttribute.getLastDetail().getEntityAttributeName());
918            }
919        }
920
921        return entityBooleanDefault;
922    }
923
924    public void deleteEntityBooleanDefault(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
925            final BasePK deletedBy) {
926        checkEntityType(eea, entityAttribute, EntityAttributeTypes.BOOLEAN);
927
928        if(eea == null || !eea.hasExecutionErrors()) {
929            var entityBooleanDefault = coreControl.getEntityBooleanDefaultForUpdate(entityAttribute);
930
931            if(entityBooleanDefault == null) {
932                handleExecutionError(UnknownEntityBooleanDefaultException.class, eea, ExecutionErrors.UnknownEntityBooleanDefault.name(),
933                        entityAttribute.getLastDetail().getEntityAttributeName());
934            } else {
935                coreControl.deleteEntityBooleanDefault(entityBooleanDefault, deletedBy);
936            }
937        }
938    }
939
940    public EntityBooleanAttribute createEntityBooleanAttribute(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
941            final EntityInstance entityInstance, final Boolean booleanAttribute, final BasePK createdBy) {
942        EntityBooleanAttribute entityBooleanAttribute = null;
943
944        checkEntityType(eea, entityAttribute, entityInstance);
945
946        if(eea == null || !eea.hasExecutionErrors()) {
947            entityBooleanAttribute = coreControl.getEntityBooleanAttribute(entityAttribute, entityInstance);
948
949            if(entityBooleanAttribute == null) {
950                coreControl.createEntityBooleanAttribute(entityAttribute, entityInstance, booleanAttribute, createdBy);
951            } else {
952                handleExecutionError(DuplicateEntityBooleanAttributeException.class, eea, ExecutionErrors.DuplicateEntityBooleanAttribute.name(),
953                        entityInstanceLogic.getEntityRefFromEntityInstance(entityInstance),
954                        entityAttribute.getLastDetail().getEntityAttributeName());
955            }
956        }
957
958        return entityBooleanAttribute;
959    }
960
961    public EntityIntegerDefault createEntityIntegerDefault(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
962            final Integer integerAttribute, final boolean addMissingAttributes, final BasePK createdBy) {
963        EntityIntegerDefault entityIntegerDefault = null;
964
965        checkEntityType(eea, entityAttribute, EntityAttributeTypes.INTEGER);
966
967        if(eea == null || !eea.hasExecutionErrors()) {
968            var entityAttributeInteger = coreControl.getEntityAttributeInteger(entityAttribute);
969
970            if(entityAttributeInteger != null) {
971                var upperRangeIntegerValue = entityAttributeInteger.getUpperRangeIntegerValue();
972                var lowerRangeIntegerValue = entityAttributeInteger.getLowerRangeIntegerValue();
973
974                if(upperRangeIntegerValue != null && integerAttribute > upperRangeIntegerValue){
975                    handleExecutionError(UpperRangeExceededException.class, eea, ExecutionErrors.UpperRangeExceeded.name(),
976                            upperRangeIntegerValue, integerAttribute);
977                }
978
979                if(lowerRangeIntegerValue != null && integerAttribute < lowerRangeIntegerValue) {
980                    handleExecutionError(LowerRangeExceededException.class, eea, ExecutionErrors.LowerRangeExceeded.name(),
981                            lowerRangeIntegerValue, integerAttribute);
982                }
983            }
984
985            if(eea == null || !eea.hasExecutionErrors()) {
986                entityIntegerDefault = coreControl.getEntityIntegerDefault(entityAttribute);
987
988                if(entityIntegerDefault == null) {
989                    coreControl.createEntityIntegerDefault(entityAttribute, integerAttribute, createdBy);
990
991                    if(addMissingAttributes) {
992                        new EntityInstancesMissingIntegerEntityAttributeQuery().execute(entityAttribute).forEach(entityInstanceResult ->
993                                coreControl.createEntityIntegerAttribute(entityAttribute.getPrimaryKey(),
994                                        entityInstanceResult.getEntityInstance(), integerAttribute, createdBy));
995                    }
996                } else {
997                    handleExecutionError(DuplicateEntityIntegerDefaultException.class, eea, ExecutionErrors.DuplicateEntityIntegerDefault.name(),
998                            entityAttribute.getLastDetail().getEntityAttributeName());
999                }
1000            }
1001        }
1002
1003        return entityIntegerDefault;
1004    }
1005
1006    public void deleteEntityIntegerDefault(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1007            final BasePK deletedBy) {
1008        checkEntityType(eea, entityAttribute, EntityAttributeTypes.INTEGER);
1009
1010        if(eea == null || !eea.hasExecutionErrors()) {
1011            var entityIntegerDefault = coreControl.getEntityIntegerDefaultForUpdate(entityAttribute);
1012
1013            if(entityIntegerDefault == null) {
1014                handleExecutionError(UnknownEntityIntegerDefaultException.class, eea, ExecutionErrors.UnknownEntityIntegerDefault.name(),
1015                        entityAttribute.getLastDetail().getEntityAttributeName());
1016            } else {
1017                coreControl.deleteEntityIntegerDefault(entityIntegerDefault, deletedBy);
1018            }
1019        }
1020    }
1021
1022    public EntityIntegerAttribute createEntityIntegerAttribute(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1023            final EntityInstance entityInstance, final Integer integerAttribute, final BasePK createdBy) {
1024        EntityIntegerAttribute entityIntegerAttribute = null;
1025        
1026        checkEntityType(eea, entityAttribute, entityInstance);
1027        
1028        if(eea == null || !eea.hasExecutionErrors()) {
1029            var entityAttributeInteger = coreControl.getEntityAttributeInteger(entityAttribute);
1030            
1031            if(entityAttributeInteger != null) {
1032                var upperRangeIntegerValue = entityAttributeInteger.getUpperRangeIntegerValue();
1033                var lowerRangeIntegerValue = entityAttributeInteger.getLowerRangeIntegerValue();
1034                
1035                if(upperRangeIntegerValue != null && integerAttribute > upperRangeIntegerValue){
1036                    handleExecutionError(UpperRangeExceededException.class, eea, ExecutionErrors.UpperRangeExceeded.name(),
1037                            upperRangeIntegerValue, integerAttribute);
1038                }
1039                
1040                if(lowerRangeIntegerValue != null && integerAttribute < lowerRangeIntegerValue) {
1041                    handleExecutionError(LowerRangeExceededException.class, eea, ExecutionErrors.LowerRangeExceeded.name(),
1042                            lowerRangeIntegerValue, integerAttribute);
1043                }
1044            }
1045            
1046            if(eea == null || !eea.hasExecutionErrors()) {
1047                entityIntegerAttribute = coreControl.getEntityIntegerAttribute(entityAttribute, entityInstance);
1048
1049                if(entityIntegerAttribute == null) {
1050                    coreControl.createEntityIntegerAttribute(entityAttribute, entityInstance, integerAttribute, createdBy);
1051                } else {
1052                    handleExecutionError(DuplicateEntityIntegerAttributeException.class, eea, ExecutionErrors.DuplicateEntityIntegerAttribute.name(),
1053                            entityInstanceLogic.getEntityRefFromEntityInstance(entityInstance),
1054                            entityAttribute.getLastDetail().getEntityAttributeName());
1055                }
1056            }
1057        }
1058
1059        return entityIntegerAttribute;
1060    }
1061
1062    public EntityLongDefault createEntityLongDefault(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1063            final Long longAttribute, final boolean addMissingAttributes, BasePK createdBy) {
1064        EntityLongDefault entityLongDefault = null;
1065
1066        checkEntityType(eea, entityAttribute, EntityAttributeTypes.LONG);
1067
1068        if(eea == null || !eea.hasExecutionErrors()) {
1069            var entityAttributeLong = coreControl.getEntityAttributeLong(entityAttribute);
1070
1071            if(entityAttributeLong != null) {
1072                var upperRangeLongValue = entityAttributeLong.getUpperRangeLongValue();
1073                var lowerRangeLongValue = entityAttributeLong.getLowerRangeLongValue();
1074
1075                if(upperRangeLongValue != null && longAttribute > upperRangeLongValue){
1076                    handleExecutionError(UpperRangeExceededException.class, eea, ExecutionErrors.UpperRangeExceeded.name(),
1077                            upperRangeLongValue, longAttribute);
1078                }
1079
1080                if(lowerRangeLongValue != null && longAttribute < lowerRangeLongValue) {
1081                    handleExecutionError(LowerRangeExceededException.class, eea, ExecutionErrors.LowerRangeExceeded.name(),
1082                            lowerRangeLongValue, longAttribute);
1083                }
1084            }
1085
1086            if(eea == null || !eea.hasExecutionErrors()) {
1087                entityLongDefault = coreControl.getEntityLongDefault(entityAttribute);
1088
1089                if(entityLongDefault == null) {
1090                    coreControl.createEntityLongDefault(entityAttribute, longAttribute, createdBy);
1091
1092                    if(addMissingAttributes) {
1093                        new EntityInstancesMissingLongEntityAttributeQuery().execute(entityAttribute).forEach(entityInstanceResult ->
1094                                coreControl.createEntityLongAttribute(entityAttribute.getPrimaryKey(),
1095                                        entityInstanceResult.getEntityInstance(), longAttribute, createdBy));
1096                    }
1097                } else {
1098                    handleExecutionError(DuplicateEntityLongDefaultException.class, eea, ExecutionErrors.DuplicateEntityLongDefault.name(),
1099                            entityAttribute.getLastDetail().getEntityAttributeName());
1100                }
1101            }
1102        }
1103
1104        return entityLongDefault;
1105    }
1106
1107    public void deleteEntityLongDefault(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1108            final BasePK deletedBy) {
1109        checkEntityType(eea, entityAttribute, EntityAttributeTypes.LONG);
1110
1111        if(eea == null || !eea.hasExecutionErrors()) {
1112            var entityLongDefault = coreControl.getEntityLongDefaultForUpdate(entityAttribute);
1113
1114            if(entityLongDefault == null) {
1115                handleExecutionError(UnknownEntityLongDefaultException.class, eea, ExecutionErrors.UnknownEntityLongDefault.name(),
1116                        entityAttribute.getLastDetail().getEntityAttributeName());
1117            } else {
1118                coreControl.deleteEntityLongDefault(entityLongDefault, deletedBy);
1119            }
1120        }
1121    }
1122
1123    public EntityLongAttribute createEntityLongAttribute(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1124            final EntityInstance entityInstance, final Long longAttribute, final BasePK createdBy) {
1125        EntityLongAttribute entityLongAttribute = null;
1126        
1127        checkEntityType(eea, entityAttribute, entityInstance);
1128        
1129        if(eea == null || !eea.hasExecutionErrors()) {
1130            var entityAttributeLong = coreControl.getEntityAttributeLong(entityAttribute);
1131            
1132            if(entityAttributeLong != null) {
1133                var upperRangeLongValue = entityAttributeLong.getUpperRangeLongValue();
1134                var lowerRangeLongValue = entityAttributeLong.getLowerRangeLongValue();
1135                
1136                if(upperRangeLongValue != null && longAttribute > upperRangeLongValue){
1137                    handleExecutionError(UpperRangeExceededException.class, eea, ExecutionErrors.UpperRangeExceeded.name(),
1138                            upperRangeLongValue, longAttribute);
1139                }
1140                
1141                if(lowerRangeLongValue != null && longAttribute < lowerRangeLongValue) {
1142                    handleExecutionError(LowerRangeExceededException.class, eea, ExecutionErrors.LowerRangeExceeded.name(),
1143                            lowerRangeLongValue, longAttribute);
1144                }
1145            }
1146            
1147            if(eea == null || !eea.hasExecutionErrors()) {
1148                entityLongAttribute = coreControl.getEntityLongAttribute(entityAttribute, entityInstance);
1149
1150                if(entityLongAttribute == null) {
1151                    coreControl.createEntityLongAttribute(entityAttribute, entityInstance, longAttribute, createdBy);
1152                } else {
1153                    handleExecutionError(DuplicateEntityLongAttributeException.class, eea, ExecutionErrors.DuplicateEntityLongAttribute.name(),
1154                            entityInstanceLogic.getEntityRefFromEntityInstance(entityInstance),
1155                            entityAttribute.getLastDetail().getEntityAttributeName());
1156                }
1157            }
1158        }
1159
1160        return entityLongAttribute;
1161    }
1162
1163    public EntityStringDefault createEntityStringDefault(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1164            final Language language, final String stringAttribute, final boolean addMissingAttributes, final BasePK createdBy) {
1165        EntityStringDefault entityStringDefault = null;
1166
1167        checkEntityType(eea, entityAttribute, EntityAttributeTypes.STRING);
1168
1169        if(eea == null || !eea.hasExecutionErrors()) {
1170            entityStringDefault = coreControl.getEntityStringDefault(entityAttribute, language);
1171
1172            if(entityStringDefault == null) {
1173                coreControl.createEntityStringDefault(entityAttribute, language, stringAttribute, createdBy);
1174
1175                if(addMissingAttributes) {
1176                    new EntityInstancesMissingStringEntityAttributeQuery().execute(entityAttribute, language).forEach(entityInstanceResult ->
1177                            coreControl.createEntityStringAttribute(entityAttribute.getPrimaryKey(),
1178                                    entityInstanceResult.getEntityInstance(), language, stringAttribute, createdBy));
1179                }
1180            } else {
1181                handleExecutionError(DuplicateEntityStringDefaultException.class, eea, ExecutionErrors.DuplicateEntityStringDefault.name(),
1182                        entityAttribute.getLastDetail().getEntityAttributeName());
1183            }
1184        }
1185
1186        return entityStringDefault;
1187    }
1188
1189    public void deleteEntityStringDefault(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1190            final Language language, final BasePK deletedBy) {
1191        checkEntityType(eea, entityAttribute, EntityAttributeTypes.STRING);
1192
1193        if(eea == null || !eea.hasExecutionErrors()) {
1194            var entityStringDefault = coreControl.getEntityStringDefaultForUpdate(entityAttribute, language);
1195
1196            if(entityStringDefault == null) {
1197                handleExecutionError(UnknownEntityStringDefaultException.class, eea, ExecutionErrors.UnknownEntityStringDefault.name(),
1198                        entityAttribute.getLastDetail().getEntityAttributeName(),
1199                        language.getLanguageIsoName());
1200            } else {
1201                coreControl.deleteEntityStringDefault(entityStringDefault, deletedBy);
1202            }
1203        }
1204    }
1205
1206    public EntityStringAttribute createEntityStringAttribute(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1207            final EntityInstance entityInstance, final Language language, final String stringAttribute, final BasePK createdBy) {
1208        EntityStringAttribute entityStringAttribute = null;
1209
1210        checkEntityType(eea, entityAttribute, entityInstance);
1211
1212        if(eea == null || !eea.hasExecutionErrors()) {
1213            var entityAttributeString = coreControl.getEntityAttributeString(entityAttribute);
1214            var validationPattern = entityAttributeString == null ? null : entityAttributeString.getValidationPattern();
1215
1216            if(validationPattern != null) {
1217                var pattern = Pattern.compile(validationPattern);
1218                var m = pattern.matcher(stringAttribute);
1219
1220                if(!m.matches()) {
1221                    handleExecutionError(InvalidStringAttributeException.class, eea, ExecutionErrors.InvalidStringAttribute.name(),
1222                            stringAttribute);
1223                }
1224            }
1225
1226            if(eea == null || !eea.hasExecutionErrors()) {
1227                entityStringAttribute = coreControl.getEntityStringAttribute(entityAttribute, entityInstance, language);
1228
1229                if(entityStringAttribute == null) {
1230                    coreControl.createEntityStringAttribute(entityAttribute, entityInstance, language, stringAttribute, createdBy);
1231                } else {
1232                    handleExecutionError(DuplicateEntityStringAttributeException.class, eea, ExecutionErrors.DuplicateEntityStringAttribute.name(),
1233                            entityInstanceLogic.getEntityRefFromEntityInstance(entityInstance),
1234                            entityAttribute.getLastDetail().getEntityAttributeName(),
1235                            language.getLanguageIsoName());
1236                }
1237            }
1238        }
1239
1240        return entityStringAttribute;
1241    }
1242
1243    public EntityClobAttribute createEntityClobAttribute(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1244            final EntityInstance entityInstance, final Language language, final String clobAttribute, final MimeType mimeType,
1245            final BasePK createdBy) {
1246        EntityClobAttribute entityClobAttribute = null;
1247
1248        checkEntityType(eea, entityAttribute, entityInstance);
1249
1250        if(eea == null || !eea.hasExecutionErrors()) {
1251            entityClobAttribute = coreControl.getEntityClobAttribute(entityAttribute, entityInstance, language);
1252
1253            if(entityClobAttribute == null) {
1254                coreControl.createEntityClobAttribute(entityAttribute, entityInstance, language, clobAttribute, mimeType, createdBy);
1255            } else {
1256                handleExecutionError(DuplicateEntityClobAttributeException.class, eea, ExecutionErrors.DuplicateEntityClobAttribute.name(),
1257                        entityInstanceLogic.getEntityRefFromEntityInstance(entityInstance),
1258                        entityAttribute.getLastDetail().getEntityAttributeName(),
1259                        language.getLanguageIsoName());
1260            }
1261        }
1262
1263        return entityClobAttribute;
1264    }
1265
1266    public EntityNameAttribute createEntityNameAttribute(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1267            final String nameAttribute, final EntityInstance entityInstance, final BasePK createdBy) {
1268        EntityNameAttribute entityNameAttribute = null;
1269
1270        checkEntityType(eea, entityAttribute, entityInstance);
1271
1272        if(eea == null || !eea.hasExecutionErrors()) {
1273            entityNameAttribute = coreControl.getEntityNameAttribute(entityAttribute, entityInstance);
1274
1275            if(entityNameAttribute == null) {
1276                coreControl.createEntityNameAttribute(entityAttribute, nameAttribute, entityInstance, createdBy);
1277            } else {
1278                handleExecutionError(DuplicateEntityNameAttributeException.class, eea, ExecutionErrors.DuplicateEntityNameAttribute.name(),
1279                        entityInstanceLogic.getEntityRefFromEntityInstance(entityInstance),
1280                        entityAttribute.getLastDetail().getEntityAttributeName());
1281            }
1282        }
1283
1284        return entityNameAttribute;
1285    }
1286
1287    public EntityDateDefault createEntityDateDefault(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1288            final Integer dateAttribute, final boolean addMissingAttributes, BasePK createdBy) {
1289        EntityDateDefault entityDateDefault = null;
1290
1291        checkEntityType(eea, entityAttribute, EntityAttributeTypes.DATE);
1292
1293        if(eea == null || !eea.hasExecutionErrors()) {
1294            entityDateDefault = coreControl.getEntityDateDefault(entityAttribute);
1295
1296            if(entityDateDefault == null) {
1297                coreControl.createEntityDateDefault(entityAttribute, dateAttribute, createdBy);
1298
1299                if(addMissingAttributes) {
1300                    new EntityInstancesMissingDateEntityAttributeQuery().execute(entityAttribute).forEach(entityInstanceResult ->
1301                            coreControl.createEntityDateAttribute(entityAttribute.getPrimaryKey(),
1302                                    entityInstanceResult.getEntityInstance(), dateAttribute, createdBy));
1303                }
1304            } else {
1305                handleExecutionError(DuplicateEntityDateDefaultException.class, eea, ExecutionErrors.DuplicateEntityDateDefault.name(),
1306                        entityAttribute.getLastDetail().getEntityAttributeName());
1307            }
1308        }
1309
1310        return entityDateDefault;
1311    }
1312
1313    public void deleteEntityDateDefault(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1314            final BasePK deletedBy) {
1315        checkEntityType(eea, entityAttribute, EntityAttributeTypes.DATE);
1316
1317        if(eea == null || !eea.hasExecutionErrors()) {
1318            var entityDateDefault = coreControl.getEntityDateDefaultForUpdate(entityAttribute);
1319
1320            if(entityDateDefault == null) {
1321                handleExecutionError(UnknownEntityDateDefaultException.class, eea, ExecutionErrors.UnknownEntityDateDefault.name(),
1322                        entityAttribute.getLastDetail().getEntityAttributeName());
1323            } else {
1324                coreControl.deleteEntityDateDefault(entityDateDefault, deletedBy);
1325            }
1326        }
1327    }
1328
1329    public EntityDateAttribute createEntityDateAttribute(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1330            final EntityInstance entityInstance, final Integer dateAttribute, final BasePK createdBy) {
1331        EntityDateAttribute entityDateAttribute = null;
1332
1333        checkEntityType(eea, entityAttribute, entityInstance);
1334
1335        if(eea == null || !eea.hasExecutionErrors()) {
1336            entityDateAttribute = coreControl.getEntityDateAttribute(entityAttribute, entityInstance);
1337
1338            if(entityDateAttribute == null) {
1339                coreControl.createEntityDateAttribute(entityAttribute, entityInstance, dateAttribute, createdBy);
1340            } else {
1341                handleExecutionError(DuplicateEntityDateAttributeException.class, eea, ExecutionErrors.DuplicateEntityDateAttribute.name(),
1342                        entityInstanceLogic.getEntityRefFromEntityInstance(entityInstance),
1343                        entityAttribute.getLastDetail().getEntityAttributeName());
1344            }
1345        }
1346
1347        return entityDateAttribute;
1348    }
1349
1350    public EntityTimeDefault createEntityTimeDefault(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1351            final Long timeAttribute, final boolean addMissingAttributes, BasePK createdBy) {
1352        EntityTimeDefault entityTimeDefault = null;
1353
1354        checkEntityType(eea, entityAttribute, EntityAttributeTypes.TIME);
1355
1356        if(eea == null || !eea.hasExecutionErrors()) {
1357            entityTimeDefault = coreControl.getEntityTimeDefault(entityAttribute);
1358
1359            if(entityTimeDefault == null) {
1360                coreControl.createEntityTimeDefault(entityAttribute, timeAttribute, createdBy);
1361
1362                if(addMissingAttributes) {
1363                    new EntityInstancesMissingTimeEntityAttributeQuery().execute(entityAttribute).forEach(entityInstanceResult ->
1364                            coreControl.createEntityTimeAttribute(entityAttribute.getPrimaryKey(),
1365                                    entityInstanceResult.getEntityInstance(), timeAttribute, createdBy));
1366                }
1367            } else {
1368                handleExecutionError(DuplicateEntityTimeDefaultException.class, eea, ExecutionErrors.DuplicateEntityTimeDefault.name(),
1369                        entityAttribute.getLastDetail().getEntityAttributeName());
1370            }
1371        }
1372
1373        return entityTimeDefault;
1374    }
1375
1376    public void deleteEntityTimeDefault(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1377            final BasePK deletedBy) {
1378        checkEntityType(eea, entityAttribute, EntityAttributeTypes.TIME);
1379
1380        if(eea == null || !eea.hasExecutionErrors()) {
1381            var entityTimeDefault = coreControl.getEntityTimeDefaultForUpdate(entityAttribute);
1382
1383            if(entityTimeDefault == null) {
1384                handleExecutionError(UnknownEntityTimeDefaultException.class, eea, ExecutionErrors.UnknownEntityTimeDefault.name(),
1385                        entityAttribute.getLastDetail().getEntityAttributeName());
1386            } else {
1387                coreControl.deleteEntityTimeDefault(entityTimeDefault, deletedBy);
1388            }
1389        }
1390    }
1391
1392    public EntityTimeAttribute createEntityTimeAttribute(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1393            final EntityInstance entityInstance, final Long timeAttribute, final BasePK createdBy) {
1394        EntityTimeAttribute entityTimeAttribute = null;
1395
1396        checkEntityType(eea, entityAttribute, entityInstance);
1397
1398        if(eea == null || !eea.hasExecutionErrors()) {
1399            entityTimeAttribute = coreControl.getEntityTimeAttribute(entityAttribute, entityInstance);
1400
1401            if(entityTimeAttribute == null) {
1402                coreControl.createEntityTimeAttribute(entityAttribute, entityInstance, timeAttribute, createdBy);
1403            } else {
1404                handleExecutionError(DuplicateEntityTimeAttributeException.class, eea, ExecutionErrors.DuplicateEntityTimeAttribute.name(),
1405                        entityInstanceLogic.getEntityRefFromEntityInstance(entityInstance),
1406                        entityAttribute.getLastDetail().getEntityAttributeName());
1407            }
1408        }
1409
1410        return entityTimeAttribute;
1411    }
1412
1413    public EntityGeoPointDefault createEntityGeoPointDefault(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1414            final Integer latitude, final Integer longitude, final Long elevation, final Long altitude, final boolean addMissingAttributes, BasePK createdBy) {
1415        EntityGeoPointDefault entityGeoPointDefault = null;
1416
1417        checkEntityType(eea, entityAttribute, EntityAttributeTypes.GEOPOINT);
1418
1419        if(eea == null || !eea.hasExecutionErrors()) {
1420            entityGeoPointDefault = coreControl.getEntityGeoPointDefault(entityAttribute);
1421
1422            if(entityGeoPointDefault == null) {
1423                coreControl.createEntityGeoPointDefault(entityAttribute, latitude, longitude, elevation, altitude, createdBy);
1424
1425                if(addMissingAttributes) {
1426                    new EntityInstancesMissingGeoPointEntityAttributeQuery().execute(entityAttribute).forEach(entityInstanceResult ->
1427                            coreControl.createEntityGeoPointAttribute(entityAttribute.getPrimaryKey(),
1428                                    entityInstanceResult.getEntityInstance(), latitude, longitude, elevation, altitude, createdBy));
1429                }
1430            } else {
1431                handleExecutionError(DuplicateEntityGeoPointDefaultException.class, eea, ExecutionErrors.DuplicateEntityGeoPointDefault.name(),
1432                        entityAttribute.getLastDetail().getEntityAttributeName());
1433            }
1434        }
1435
1436        return entityGeoPointDefault;
1437    }
1438
1439    public void deleteEntityGeoPointDefault(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1440            final BasePK deletedBy) {
1441        checkEntityType(eea, entityAttribute, EntityAttributeTypes.GEOPOINT);
1442
1443        if(eea == null || !eea.hasExecutionErrors()) {
1444            var entityGeoPointDefault = coreControl.getEntityGeoPointDefaultForUpdate(entityAttribute);
1445
1446            if(entityGeoPointDefault == null) {
1447                handleExecutionError(UnknownEntityGeoPointDefaultException.class, eea, ExecutionErrors.UnknownEntityGeoPointDefault.name(),
1448                        entityAttribute.getLastDetail().getEntityAttributeName());
1449            } else {
1450                coreControl.deleteEntityGeoPointDefault(entityGeoPointDefault, deletedBy);
1451            }
1452        }
1453    }
1454
1455    public EntityGeoPointAttribute createEntityGeoPointAttribute(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1456            final EntityInstance entityInstance, final Integer latitude, final Integer longitude, final Long elevation, final Long altitude, final BasePK createdBy) {
1457        EntityGeoPointAttribute entityGeoPointAttribute = null;
1458
1459        checkEntityType(eea, entityAttribute, entityInstance);
1460
1461        if(eea == null || !eea.hasExecutionErrors()) {
1462            entityGeoPointAttribute = coreControl.getEntityGeoPointAttribute(entityAttribute, entityInstance);
1463
1464            if(entityGeoPointAttribute == null) {
1465                coreControl.createEntityGeoPointAttribute(entityAttribute, entityInstance, latitude, longitude, elevation, altitude, createdBy);
1466            } else {
1467                handleExecutionError(DuplicateEntityGeoPointAttributeException.class, eea, ExecutionErrors.DuplicateEntityGeoPointAttribute.name(),
1468                        entityInstanceLogic.getEntityRefFromEntityInstance(entityInstance),
1469                        entityAttribute.getLastDetail().getEntityAttributeName());
1470            }
1471        }
1472
1473        return entityGeoPointAttribute;
1474    }
1475
1476    public EntityListItemDefault createEntityListItemDefault(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1477            final EntityListItem entityListItem, final boolean addMissingAttributes, final BasePK createdBy) {
1478        EntityListItemDefault entityListItemDefault = null;
1479
1480        checkEntityType(eea, entityAttribute, EntityAttributeTypes.LISTITEM);
1481
1482        if(eea == null || !eea.hasExecutionErrors()) {
1483            entityListItemDefault = coreControl.getEntityListItemDefault(entityAttribute);
1484
1485            if(entityListItemDefault == null) {
1486                coreControl.createEntityListItemDefault(entityAttribute, entityListItem, createdBy);
1487
1488                if(addMissingAttributes) {
1489                    new EntityInstancesMissingListItemEntityAttributeQuery().execute(entityAttribute).forEach(entityInstanceResult ->
1490                            coreControl.createEntityListItemAttribute(entityAttribute.getPrimaryKey(),
1491                                    entityInstanceResult.getEntityInstance(), entityListItem, createdBy));
1492                }
1493            } else {
1494                handleExecutionError(DuplicateEntityListItemDefaultException.class, eea, ExecutionErrors.DuplicateEntityListItemDefault.name(),
1495                        entityAttribute.getLastDetail().getEntityAttributeName());
1496            }
1497        }
1498
1499        return entityListItemDefault;
1500    }
1501
1502    public void deleteEntityListItemDefault(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1503            final BasePK deletedBy) {
1504        checkEntityType(eea, entityAttribute, EntityAttributeTypes.LISTITEM);
1505
1506        if(eea == null || !eea.hasExecutionErrors()) {
1507            var entityListItemDefault = coreControl.getEntityListItemDefaultForUpdate(entityAttribute);
1508
1509            if(entityListItemDefault == null) {
1510                handleExecutionError(UnknownEntityListItemDefaultException.class, eea, ExecutionErrors.UnknownEntityListItemDefault.name(),
1511                        entityAttribute.getLastDetail().getEntityAttributeName());
1512            } else {
1513                coreControl.deleteEntityListItemDefault(entityListItemDefault, deletedBy);
1514            }
1515        }
1516    }
1517
1518    public EntityListItemAttribute createEntityListItemAttribute(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1519        final EntityInstance entityInstance, final EntityListItem entityListItem, final BasePK createdBy) {
1520        EntityListItemAttribute entityListItemAttribute = null;
1521        
1522        checkEntityType(eea, entityAttribute, entityInstance);
1523        
1524        if(eea == null || !eea.hasExecutionErrors()) {
1525            entityListItemAttribute = coreControl.getEntityListItemAttribute(entityAttribute, entityInstance);
1526
1527            if(entityListItemAttribute == null) {
1528                entityListItemAttribute = coreControl.createEntityListItemAttribute(entityAttribute, entityInstance, entityListItem, createdBy);
1529            } else {
1530                handleExecutionError(DuplicateEntityListItemAttributeException.class, eea, ExecutionErrors.DuplicateEntityListItemAttribute.name(),
1531                        entityInstanceLogic.getEntityRefFromEntityInstance(entityInstance),
1532                        entityAttribute.getLastDetail().getEntityAttributeName());
1533            }
1534        }
1535        
1536        return entityListItemAttribute;
1537    }
1538
1539    public EntityMultipleListItemDefault createEntityMultipleListItemDefault(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1540            final EntityListItem entityListItem, final boolean addMissingAttributes, final BasePK createdBy) {
1541        EntityMultipleListItemDefault entityListItemDefault = null;
1542
1543        checkEntityType(eea, entityAttribute, EntityAttributeTypes.MULTIPLELISTITEM);
1544
1545        if(eea == null || !eea.hasExecutionErrors()) {
1546            entityListItemDefault = coreControl.getEntityMultipleListItemDefault(entityAttribute, entityListItem);
1547
1548            if(entityListItemDefault == null) {
1549                coreControl.createEntityMultipleListItemDefault(entityAttribute, entityListItem, createdBy);
1550
1551                if(addMissingAttributes) {
1552                    new EntityInstancesMissingMultipleListItemEntityAttributeQuery().execute(entityAttribute, entityListItem).forEach(entityInstanceResult ->
1553                            coreControl.createEntityMultipleListItemAttribute(entityAttribute.getPrimaryKey(),
1554                                    entityInstanceResult.getEntityInstance(), entityListItem, createdBy));
1555                }
1556            } else {
1557                handleExecutionError(DuplicateEntityMultipleListItemDefaultException.class, eea, ExecutionErrors.DuplicateEntityMultipleListItemDefault.name(),
1558                        entityAttribute.getLastDetail().getEntityAttributeName(), entityListItem.getLastDetail().getEntityListItemName());
1559            }
1560        }
1561
1562        return entityListItemDefault;
1563    }
1564
1565    public void deleteEntityMultipleListItemDefault(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1566            final EntityListItem entityListItem, final BasePK deletedBy) {
1567        checkEntityType(eea, entityAttribute, EntityAttributeTypes.MULTIPLELISTITEM);
1568
1569        if(eea == null || !eea.hasExecutionErrors()) {
1570            var entityListItemDefault = coreControl.getEntityMultipleListItemDefaultForUpdate(entityAttribute, entityListItem);
1571
1572            if(entityListItemDefault == null) {
1573                handleExecutionError(UnknownEntityMultipleListItemDefaultException.class, eea, ExecutionErrors.UnknownEntityMultipleListItemDefault.name(),
1574                        entityAttribute.getLastDetail().getEntityAttributeName(), entityListItem.getLastDetail().getEntityListItemName());
1575            } else {
1576                coreControl.deleteEntityMultipleListItemDefault(entityListItemDefault, deletedBy);
1577            }
1578        }
1579    }
1580
1581    public EntityMultipleListItemAttribute createEntityMultipleListItemAttribute(final ExecutionErrorAccumulator eea, final EntityAttribute entityAttribute,
1582        final EntityInstance entityInstance, final EntityListItem entityListItem, final BasePK createdBy) {
1583        EntityMultipleListItemAttribute entityMultipleListItemAttribute = null;
1584        
1585        checkEntityType(eea, entityAttribute, entityInstance);
1586        
1587        if(eea == null || !eea.hasExecutionErrors()) {
1588            entityMultipleListItemAttribute = coreControl.getEntityMultipleListItemAttribute(entityAttribute, entityInstance, entityListItem);
1589
1590            if(entityMultipleListItemAttribute == null) {
1591                entityMultipleListItemAttribute = coreControl.createEntityMultipleListItemAttribute(entityAttribute, entityInstance, entityListItem, createdBy);
1592            } else {
1593                handleExecutionError(DuplicateEntityMultipleListItemAttributeException.class, eea, ExecutionErrors.DuplicateEntityMultipleListItemAttribute.name(),
1594                    entityInstanceLogic.getEntityRefFromEntityInstance(entityInstance),
1595                    entityAttribute.getLastDetail().getEntityAttributeName(),
1596                    entityListItem.getLastDetail().getEntityListItemName());
1597            }
1598        }
1599
1600        return entityMultipleListItemAttribute;
1601    }
1602    
1603}