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.util.server.control; 018 019import com.echothree.model.control.core.common.transfer.EntityLockTransfer; 020import com.echothree.model.control.core.server.control.EntityLockControl; 021import com.echothree.model.data.user.common.pk.UserVisitPK; 022import com.echothree.util.common.command.CommandResult; 023import com.echothree.util.common.exception.EntityLockException; 024import com.echothree.util.common.validation.FieldDefinition; 025import com.echothree.util.common.command.EditMode; 026import com.echothree.util.common.form.BaseEdit; 027import com.echothree.util.common.form.BaseEditForm; 028import com.echothree.util.common.form.BaseForm; 029import com.echothree.util.common.form.BaseSpec; 030import com.echothree.util.common.form.ValidationResult; 031import com.echothree.util.common.persistence.BasePK; 032import com.echothree.util.server.persistence.BaseEntity; 033import com.echothree.util.server.persistence.BaseValue; 034import com.echothree.util.server.persistence.Session; 035import com.echothree.util.server.validation.Validator; 036import java.util.List; 037import java.util.concurrent.Future; 038import javax.inject.Inject; 039 040public abstract class BaseEditCommand<S extends BaseSpec, E extends BaseEdit> 041 extends BaseCommand { 042 043 @Inject 044 EntityLockControl entityLockControl; 045 046 private List<FieldDefinition> specFieldDefinitions; 047 private List<FieldDefinition> editFieldDefinitions; 048 protected EditMode editMode = null; 049 protected S spec = null; 050 protected E edit = null; 051 052 protected BaseEditCommand(CommandSecurityDefinition commandSecurityDefinition, 053 List<FieldDefinition> specFieldDefinitions, List<FieldDefinition> editFieldDefinitions) { 054 super(commandSecurityDefinition); 055 056 this.specFieldDefinitions = specFieldDefinitions; 057 this.editFieldDefinitions = editFieldDefinitions; 058 } 059 060 private void initForRun(BaseEditForm<S, E> editForm) { 061 if(editForm != null) { 062 editMode = editForm.getEditMode(); 063 spec = editForm.getSpec(); 064 edit = editForm.getEdit(); 065 } 066 } 067 068 public Future<CommandResult> runAsync(UserVisitPK userVisitPK, BaseEditForm<S, E> editForm) { 069 initForRun(editForm); 070 071 return super.runAsync(userVisitPK); 072 } 073 074 public CommandResult run(UserVisitPK userVisitPK, BaseEditForm<S, E> editForm) { 075 initForRun(editForm); 076 077 return super.run(userVisitPK); 078 } 079 080 protected void setupValidatorForSpec(Validator validator) { 081 // Nothing. 082 } 083 084 protected void setupValidatorForEdit(Validator validator, BaseForm specForm) { 085 // Nothing. 086 } 087 088 protected ValidationResult validateSpec(Validator validator) { 089 return validator.validate(spec, getSpecFieldDefinitions()); 090 } 091 092 protected ValidationResult validateEdit(Validator validator) { 093 return validator.validate(edit, getEditFieldDefinitions()); 094 } 095 096 protected ValidationResult validateLock() { 097 var validator = new Validator(this); 098 099 setupValidatorForSpec(validator); 100 101 return validateSpec(validator); 102 } 103 104 protected void saveResultAfterEditValidatorErrors() { 105 // Nothing. 106 } 107 108 protected ValidationResult validateUpdate() { 109 var validator = new Validator(this); 110 ValidationResult validationResult; 111 BaseForm specForm = spec; 112 113 setupValidatorForSpec(validator); 114 validationResult = validateSpec(validator); 115 116 if(!validationResult.getHasErrors()) { 117 setupValidatorForEdit(validator, specForm); 118 validationResult = validateEdit(validator); 119 120 if(validationResult.getHasErrors()) { 121 saveResultAfterEditValidatorErrors(); 122 } 123 } 124 125 return validationResult; 126 } 127 128 @Override 129 protected ValidationResult validate() { 130 ValidationResult validationResult = null; 131 132 if(editMode.equals(EditMode.LOCK)) { 133 validationResult = validateLock(); 134 } else if(editMode.equals(EditMode.UPDATE)) { 135 validationResult = validateUpdate(); 136 } 137 138 return validationResult; 139 } 140 141 protected List<FieldDefinition> getSpecFieldDefinitions() { 142 return specFieldDefinitions; 143 } 144 145 protected void setSpecFieldDefinitions(List<FieldDefinition> specFieldDefinitions) { 146 this.specFieldDefinitions = specFieldDefinitions; 147 } 148 149 protected List<FieldDefinition> getEditFieldDefinitions() { 150 return editFieldDefinitions; 151 } 152 153 protected void setEditFieldDefinitions(List<FieldDefinition> editFieldDefinitions) { 154 this.editFieldDefinitions = editFieldDefinitions; 155 } 156 157 public EntityLockTransfer getEntityLockTransfer(BaseEntity lockTarget) 158 throws EntityLockException { 159 return entityLockControl.getEntityLockTransfer(getUserVisit(), lockTarget); 160 } 161 162 public EntityLockTransfer getEntityLockTransfer(BasePK lockTarget) 163 throws EntityLockException { 164 return entityLockControl.getEntityLockTransfer(getUserVisit(), lockTarget); 165 } 166 167 public EntityLockTransfer getEntityLockTransfer(BaseValue lockTarget) 168 throws EntityLockException { 169 return entityLockControl.getEntityLockTransfer(getUserVisit(), lockTarget); 170 } 171 172 public boolean lockEntity(BaseEntity lockTarget) 173 throws EntityLockException { 174 return entityLockControl.lockEntity(lockTarget, getPartyPK()) != 0; 175 } 176 177 public boolean lockEntity(BasePK lockTarget) 178 throws EntityLockException { 179 return entityLockControl.lockEntity(lockTarget, getPartyPK()) != 0; 180 } 181 182 public boolean lockEntity(BaseValue lockTarget) 183 throws EntityLockException { 184 return entityLockControl.lockEntity(lockTarget, getPartyPK()) != 0; 185 } 186 187 public boolean lockEntityForUpdate(BaseEntity lockTarget) 188 throws EntityLockException { 189 return entityLockControl.lockEntityForUpdate(lockTarget, getPartyPK()); 190 } 191 192 public boolean lockEntityForUpdate(BasePK lockTarget) 193 throws EntityLockException { 194 return entityLockControl.lockEntityForUpdate(lockTarget, getPartyPK()); 195 } 196 197 public boolean lockEntityForUpdate(BaseValue lockTarget) 198 throws EntityLockException { 199 return entityLockControl.lockEntityForUpdate(lockTarget, getPartyPK()); 200 } 201 202 public boolean unlockEntity(BaseEntity lockTarget) 203 throws EntityLockException { 204 return entityLockControl.unlockEntity(lockTarget, getPartyPK()); 205 } 206 207 public boolean unlockEntity(BasePK lockTarget) 208 throws EntityLockException { 209 return entityLockControl.unlockEntity(lockTarget, getPartyPK()); 210 } 211 212 public boolean unlockEntity(BaseValue lockTarget) 213 throws EntityLockException { 214 return entityLockControl.unlockEntity(lockTarget, getPartyPK()); 215 } 216 217 public boolean isEntityLocked(BaseEntity lockTarget) 218 throws EntityLockException { 219 return entityLockControl.isEntityLocked(lockTarget, getPartyPK()); 220 } 221 222 public boolean isEntityLocked(BasePK lockTarget) 223 throws EntityLockException { 224 return entityLockControl.isEntityLocked(lockTarget, getPartyPK()); 225 } 226 227 public boolean isEntityLocked(BaseValue lockTarget) 228 throws EntityLockException { 229 return entityLockControl.isEntityLocked(lockTarget, getPartyPK()); 230 } 231 232}