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.control.user.core.server.command; 018 019import com.echothree.control.user.core.common.edit.CoreEditFactory; 020import com.echothree.control.user.core.common.edit.EntityEntityAttributeEdit; 021import com.echothree.control.user.core.common.form.EditEntityEntityAttributeForm; 022import com.echothree.control.user.core.common.result.CoreResultFactory; 023import com.echothree.control.user.core.common.spec.EntityEntityAttributeSpec; 024import com.echothree.model.control.core.common.EntityAttributeTypes; 025import com.echothree.model.control.core.server.logic.EntityAttributeLogic; 026import com.echothree.model.control.core.server.logic.EntityInstanceLogic; 027import com.echothree.model.control.party.common.PartyTypes; 028import com.echothree.model.data.core.server.entity.EntityEntityAttribute; 029import com.echothree.model.data.user.common.pk.UserVisitPK; 030import com.echothree.util.common.command.BaseResult; 031import com.echothree.util.common.command.EditMode; 032import com.echothree.util.common.message.ExecutionErrors; 033import com.echothree.util.common.validation.FieldDefinition; 034import com.echothree.util.common.validation.FieldType; 035import com.echothree.util.server.control.BaseEditCommand; 036import com.echothree.util.server.control.CommandSecurityDefinition; 037import com.echothree.util.server.control.PartyTypeDefinition; 038import com.echothree.util.server.persistence.PersistenceUtils; 039import java.util.List; 040import javax.enterprise.context.Dependent; 041import javax.inject.Inject; 042 043@Dependent 044public class EditEntityEntityAttributeCommand 045 extends BaseEditCommand<EntityEntityAttributeSpec, EntityEntityAttributeEdit> { 046 047 private final static CommandSecurityDefinition COMMAND_SECURITY_DEFINITION; 048 private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS; 049 private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS; 050 051 static { 052 COMMAND_SECURITY_DEFINITION = new CommandSecurityDefinition(List.of( 053 new PartyTypeDefinition(PartyTypes.UTILITY.name(), null), 054 new PartyTypeDefinition(PartyTypes.EMPLOYEE.name(), null) 055 )); 056 057 SPEC_FIELD_DEFINITIONS = List.of( 058 new FieldDefinition("EntityRef", FieldType.ENTITY_REF, false, null, null), 059 new FieldDefinition("Uuid", FieldType.UUID, false, null, null), 060 new FieldDefinition("EntityAttributeName", FieldType.ENTITY_NAME, false, null, null), 061 new FieldDefinition("EntityAttributeUuid", FieldType.UUID, false, null, null) 062 ); 063 064 EDIT_FIELD_DEFINITIONS = List.of( 065 new FieldDefinition("EntityRefAttribute", FieldType.ENTITY_REF, false, null, null), 066 new FieldDefinition("UuidAttribute", FieldType.UUID, false, null, null) 067 ); 068 } 069 070 @Inject 071 EntityAttributeLogic entityAttributeLogic; 072 073 @Inject 074 EntityInstanceLogic entityInstanceLogic; 075 076 077 /** Creates a new instance of EditEntityEntityAttributeCommand */ 078 public EditEntityEntityAttributeCommand() { 079 super(COMMAND_SECURITY_DEFINITION, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS); 080 } 081 082 @Override 083 protected BaseResult execute() { 084 var result = CoreResultFactory.getEditEntityEntityAttributeResult(); 085 var entityInstance = entityInstanceLogic.getEntityInstance(this, spec); 086 087 if(!hasExecutionErrors()) { 088 var entityAttribute = entityAttributeLogic.getEntityAttribute(this, entityInstance, spec, spec, 089 EntityAttributeTypes.ENTITY); 090 091 if(!hasExecutionErrors()) { 092 EntityEntityAttribute entityEntityAttribute = null; 093 var basePK = PersistenceUtils.getInstance().getBasePKFromEntityInstance(entityInstance); 094 095 if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) { 096 entityEntityAttribute = coreControl.getEntityEntityAttribute(entityAttribute, entityInstance); 097 098 if(entityEntityAttribute != null) { 099 if(editMode.equals(EditMode.LOCK)) { 100 result.setEntityEntityAttribute(coreControl.getEntityEntityAttributeTransfer(getUserVisit(), entityEntityAttribute, entityInstance)); 101 102 if(lockEntity(basePK)) { 103 var edit = CoreEditFactory.getEntityEntityAttributeEdit(); 104 105 result.setEdit(edit); 106 edit.setEntityRefAttribute(entityInstanceLogic.getEntityRefFromEntityInstance(entityEntityAttribute.getEntityInstanceAttribute())); 107 } else { 108 addExecutionError(ExecutionErrors.EntityLockFailed.name()); 109 } 110 } else { // EditMode.ABANDON 111 unlockEntity(basePK); 112 basePK = null; 113 } 114 } else { 115 var entityTypeDetail = entityInstance.getEntityType().getLastDetail(); 116 117 addExecutionError(ExecutionErrors.UnknownEntityEntityAttribute.name(), basePK.getEntityRef(), 118 entityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(), 119 entityTypeDetail.getEntityTypeName(), entityAttribute.getLastDetail().getEntityAttributeName()); 120 } 121 } else if(editMode.equals(EditMode.UPDATE)) { 122 var entityInstanceAttribute = entityAttributeLogic.getEntityInstanceAttribute(this, edit); 123 124 if(!hasExecutionErrors()) { 125 if(coreControl.countEntityAttributeEntityTypesByEntityAttribute(entityAttribute) > 0) { 126 var allowedEntityType = entityInstanceAttribute.getEntityType(); 127 128 if(!coreControl.entityAttributeEntityTypeExists(entityAttribute, allowedEntityType)) { 129 var entityAttributeDetail = entityAttribute.getLastDetail(); 130 var entityTypeDetail = entityAttributeDetail.getEntityType().getLastDetail(); 131 var allowedEntityTypeDetail = allowedEntityType.getLastDetail(); 132 133 addExecutionError(ExecutionErrors.UnknownEntityAttributeEntityType.name(), 134 entityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(), 135 entityTypeDetail.getEntityTypeName(), entityAttributeDetail.getEntityAttributeName(), 136 allowedEntityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(), 137 allowedEntityTypeDetail.getEntityTypeName()); 138 } 139 } 140 141 if(!hasExecutionErrors()) { 142 entityEntityAttribute = coreControl.getEntityEntityAttributeForUpdate(entityAttribute, entityInstance); 143 144 if(!hasExecutionErrors()) { 145 if(lockEntityForUpdate(basePK)) { 146 try { 147 var entityEntityAttributeValue = coreControl.getEntityEntityAttributeValueForUpdate(entityEntityAttribute); 148 149 entityEntityAttributeValue.setEntityInstanceAttributePK(entityInstanceAttribute.getPrimaryKey()); 150 151 coreControl.updateEntityEntityAttributeFromValue(entityEntityAttributeValue, getPartyPK()); 152 } finally { 153 unlockEntity(basePK); 154 basePK = null; 155 } 156 } else { 157 addExecutionError(ExecutionErrors.EntityLockStale.name()); 158 } 159 } else { 160 var entityTypeDetail = entityInstance.getEntityType().getLastDetail(); 161 162 addExecutionError(ExecutionErrors.UnknownEntityEntityAttribute.name(), basePK.getEntityRef(), 163 entityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName(), 164 entityTypeDetail.getEntityTypeName(), entityAttribute.getLastDetail().getEntityAttributeName()); 165 } 166 } 167 } 168 } 169 170 if(basePK != null) { 171 result.setEntityLock(getEntityLockTransfer(basePK)); 172 } 173 174 if(entityEntityAttribute != null) { 175 result.setEntityEntityAttribute(coreControl.getEntityEntityAttributeTransfer(getUserVisit(), entityEntityAttribute, entityInstance)); 176 } 177 } 178 } 179 180 return result; 181 } 182 183}