001// -------------------------------------------------------------------------------- 002// Copyright 2002-2024 Echo Three, LLC 003// 004// Licensed under the Apache License, Version 2.0 (the "License"); 005// you may not use this file except in compliance with the License. 006// You may obtain a copy of the License at 007// 008// http://www.apache.org/licenses/LICENSE-2.0 009// 010// Unless required by applicable law or agreed to in writing, software 011// distributed under the License is distributed on an "AS IS" BASIS, 012// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013// See the License for the specific language governing permissions and 014// limitations under the License. 015// -------------------------------------------------------------------------------- 016 017package com.echothree.control.user.training.server.command; 018 019import com.echothree.control.user.training.common.edit.TrainingClassQuestionEdit; 020import com.echothree.control.user.training.common.edit.TrainingEditFactory; 021import com.echothree.control.user.training.common.form.EditTrainingClassQuestionForm; 022import com.echothree.control.user.training.common.result.EditTrainingClassQuestionResult; 023import com.echothree.control.user.training.common.result.TrainingResultFactory; 024import com.echothree.control.user.training.common.spec.TrainingClassQuestionSpec; 025import com.echothree.model.control.core.common.MimeTypeUsageTypes; 026import com.echothree.model.control.core.server.logic.MimeTypeLogic; 027import com.echothree.model.control.party.common.PartyTypes; 028import com.echothree.model.control.security.common.SecurityRoleGroups; 029import com.echothree.model.control.security.common.SecurityRoles; 030import com.echothree.model.control.training.server.control.TrainingControl; 031import com.echothree.model.data.core.server.entity.MimeType; 032import com.echothree.model.data.training.server.entity.TrainingClass; 033import com.echothree.model.data.training.server.entity.TrainingClassQuestion; 034import com.echothree.model.data.training.server.entity.TrainingClassQuestionDetail; 035import com.echothree.model.data.training.server.entity.TrainingClassQuestionTranslation; 036import com.echothree.model.data.training.server.entity.TrainingClassSection; 037import com.echothree.model.data.training.server.value.TrainingClassQuestionDetailValue; 038import com.echothree.model.data.training.server.value.TrainingClassQuestionTranslationValue; 039import com.echothree.model.data.user.common.pk.UserVisitPK; 040import com.echothree.util.common.message.ExecutionErrors; 041import com.echothree.util.common.validation.FieldDefinition; 042import com.echothree.util.common.validation.FieldType; 043import com.echothree.util.common.command.EditMode; 044import com.echothree.util.server.control.BaseAbstractEditCommand; 045import com.echothree.util.server.control.CommandSecurityDefinition; 046import com.echothree.util.server.control.PartyTypeDefinition; 047import com.echothree.util.server.control.SecurityRoleDefinition; 048import com.echothree.util.server.persistence.Session; 049import java.util.Arrays; 050import java.util.Collections; 051import java.util.List; 052 053public class EditTrainingClassQuestionCommand 054 extends BaseAbstractEditCommand<TrainingClassQuestionSpec, TrainingClassQuestionEdit, EditTrainingClassQuestionResult, TrainingClassQuestion, TrainingClassQuestion> { 055 056 private final static CommandSecurityDefinition COMMAND_SECURITY_DEFINITION; 057 private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS; 058 private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS; 059 060 static { 061 COMMAND_SECURITY_DEFINITION = new CommandSecurityDefinition(Collections.unmodifiableList(Arrays.asList( 062 new PartyTypeDefinition(PartyTypes.UTILITY.name(), null), 063 new PartyTypeDefinition(PartyTypes.EMPLOYEE.name(), Collections.unmodifiableList(Arrays.asList( 064 new SecurityRoleDefinition(SecurityRoleGroups.TrainingClassQuestion.name(), SecurityRoles.Edit.name()) 065 ))) 066 ))); 067 068 SPEC_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList( 069 new FieldDefinition("TrainingClassName", FieldType.ENTITY_NAME, true, null, null), 070 new FieldDefinition("TrainingClassSectionName", FieldType.ENTITY_NAME, true, null, null), 071 new FieldDefinition("TrainingClassQuestionName", FieldType.ENTITY_NAME, true, null, null) 072 )); 073 074 EDIT_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList( 075 new FieldDefinition("TrainingClassQuestionName", FieldType.ENTITY_NAME, true, null, null), 076 new FieldDefinition("AskingRequired", FieldType.BOOLEAN, true, null, null), 077 new FieldDefinition("PassingRequired", FieldType.BOOLEAN, true, null, null), 078 new FieldDefinition("SortOrder", FieldType.SIGNED_INTEGER, true, null, null), 079 new FieldDefinition("QuestionMimeTypeName", FieldType.MIME_TYPE, false, null, null), 080 new FieldDefinition("Question", FieldType.STRING, false, null, null) 081 )); 082 } 083 084 /** Creates a new instance of EditTrainingClassQuestionCommand */ 085 public EditTrainingClassQuestionCommand(UserVisitPK userVisitPK, EditTrainingClassQuestionForm form) { 086 super(userVisitPK, form, COMMAND_SECURITY_DEFINITION, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS); 087 } 088 089 @Override 090 public EditTrainingClassQuestionResult getResult() { 091 return TrainingResultFactory.getEditTrainingClassQuestionResult(); 092 } 093 094 @Override 095 public TrainingClassQuestionEdit getEdit() { 096 return TrainingEditFactory.getTrainingClassQuestionEdit(); 097 } 098 099 TrainingClassSection trainingClassSection; 100 101 @Override 102 public TrainingClassQuestion getEntity(EditTrainingClassQuestionResult result) { 103 var trainingControl = Session.getModelController(TrainingControl.class); 104 TrainingClassQuestion trainingClassQuestion = null; 105 String trainingClassName = spec.getTrainingClassName(); 106 TrainingClass trainingClass = trainingControl.getTrainingClassByName(trainingClassName); 107 108 if(trainingClass != null) { 109 String trainingClassSectionName = spec.getTrainingClassSectionName(); 110 111 trainingClassSection = trainingControl.getTrainingClassSectionByName(trainingClass, trainingClassSectionName); 112 113 if(trainingClassSection != null) { 114 String trainingClassQuestionName = spec.getTrainingClassQuestionName(); 115 116 if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) { 117 trainingClassQuestion = trainingControl.getTrainingClassQuestionByName(trainingClassSection, trainingClassQuestionName); 118 } else { // EditMode.UPDATE 119 trainingClassQuestion = trainingControl.getTrainingClassQuestionByNameForUpdate(trainingClassSection, trainingClassQuestionName); 120 } 121 122 if(trainingClassQuestion != null) { 123 result.setTrainingClassQuestion(trainingControl.getTrainingClassQuestionTransfer(getUserVisit(), trainingClassQuestion)); 124 } else { 125 addExecutionError(ExecutionErrors.UnknownTrainingClassQuestionName.name(), trainingClassName, trainingClassQuestionName); 126 } 127 } else { 128 addExecutionError(ExecutionErrors.UnknownTrainingClassSectionName.name(), trainingClassName, trainingClassSectionName); 129 } 130 } else { 131 addExecutionError(ExecutionErrors.UnknownTrainingClassName.name(), trainingClassName); 132 } 133 134 return trainingClassQuestion; 135 } 136 137 @Override 138 public TrainingClassQuestion getLockEntity(TrainingClassQuestion trainingClassQuestion) { 139 return trainingClassQuestion; 140 } 141 142 @Override 143 public void fillInResult(EditTrainingClassQuestionResult result, TrainingClassQuestion trainingClassQuestion) { 144 var trainingControl = Session.getModelController(TrainingControl.class); 145 146 result.setTrainingClassQuestion(trainingControl.getTrainingClassQuestionTransfer(getUserVisit(), trainingClassQuestion)); 147 } 148 149 MimeType questionMimeType; 150 151 @Override 152 public void doLock(TrainingClassQuestionEdit edit, TrainingClassQuestion trainingClassQuestion) { 153 var trainingControl = Session.getModelController(TrainingControl.class); 154 TrainingClassQuestionTranslation trainingClassQuestionTranslation = trainingControl.getTrainingClassQuestionTranslation(trainingClassQuestion, getPreferredLanguage()); 155 TrainingClassQuestionDetail trainingClassQuestionDetail = trainingClassQuestion.getLastDetail(); 156 157 edit.setTrainingClassQuestionName(trainingClassQuestionDetail.getTrainingClassQuestionName()); 158 edit.setAskingRequired(trainingClassQuestionDetail.getAskingRequired().toString()); 159 edit.setPassingRequired(trainingClassQuestionDetail.getPassingRequired().toString()); 160 edit.setSortOrder(trainingClassQuestionDetail.getSortOrder().toString()); 161 162 if(trainingClassQuestionTranslation != null) { 163 edit.setQuestionMimeTypeName(trainingClassQuestionTranslation.getQuestionMimeType().getLastDetail().getMimeTypeName()); 164 edit.setQuestion(trainingClassQuestionTranslation.getQuestion()); 165 } 166 } 167 168 @Override 169 public void canUpdate(TrainingClassQuestion trainingClassQuestion) { 170 var trainingControl = Session.getModelController(TrainingControl.class); 171 String trainingClassQuestionName = edit.getTrainingClassQuestionName(); 172 TrainingClassQuestion duplicateTrainingClassQuestion = trainingControl.getTrainingClassQuestionByName(trainingClassSection, trainingClassQuestionName); 173 174 if(duplicateTrainingClassQuestion != null && !trainingClassQuestion.equals(duplicateTrainingClassQuestion)) { 175 addExecutionError(ExecutionErrors.DuplicateTrainingClassQuestionName.name(), trainingClassQuestionName); 176 } else { 177 MimeTypeLogic mimeTypeLogic = MimeTypeLogic.getInstance(); 178 String questionMimeTypeName = edit.getQuestionMimeTypeName(); 179 String question = edit.getQuestion(); 180 181 questionMimeType = mimeTypeLogic.checkMimeType(this, questionMimeTypeName, question, MimeTypeUsageTypes.TEXT.name(), 182 ExecutionErrors.MissingRequiredQuestionMimeTypeName.name(), ExecutionErrors.MissingRequiredQuestion.name(), 183 ExecutionErrors.UnknownQuestionMimeTypeName.name(), ExecutionErrors.UnknownQuestionMimeTypeUsage.name()); 184 } 185 } 186 187 @Override 188 public void doUpdate(TrainingClassQuestion trainingClassQuestion) { 189 var trainingControl = Session.getModelController(TrainingControl.class); 190 var partyPK = getPartyPK(); 191 TrainingClassQuestionDetailValue trainingClassQuestionDetailValue = trainingControl.getTrainingClassQuestionDetailValueForUpdate(trainingClassQuestion); 192 TrainingClassQuestionTranslation trainingClassQuestionTranslation = trainingControl.getTrainingClassQuestionTranslationForUpdate(trainingClassQuestion, getPreferredLanguage()); 193 String question = edit.getQuestion(); 194 195 trainingClassQuestionDetailValue.setTrainingClassQuestionName(edit.getTrainingClassQuestionName()); 196 trainingClassQuestionDetailValue.setAskingRequired(Boolean.valueOf(edit.getAskingRequired())); 197 trainingClassQuestionDetailValue.setPassingRequired(Boolean.valueOf(edit.getPassingRequired())); 198 trainingClassQuestionDetailValue.setSortOrder(Integer.valueOf(edit.getSortOrder())); 199 200 trainingControl.updateTrainingClassQuestionFromValue(trainingClassQuestionDetailValue, partyPK); 201 202 if(trainingClassQuestionTranslation == null && (question != null)) { 203 trainingControl.createTrainingClassQuestionTranslation(trainingClassQuestion, getPreferredLanguage(), questionMimeType, question, partyPK); 204 } else if(trainingClassQuestionTranslation != null && (question == null)) { 205 trainingControl.deleteTrainingClassQuestionTranslation(trainingClassQuestionTranslation, partyPK); 206 } else if(trainingClassQuestionTranslation != null && (question != null)) { 207 TrainingClassQuestionTranslationValue trainingClassQuestionTranslationValue = trainingControl.getTrainingClassQuestionTranslationValue(trainingClassQuestionTranslation); 208 209 trainingClassQuestionTranslationValue.setQuestionMimeTypePK(questionMimeType == null? null: questionMimeType.getPrimaryKey()); 210 trainingClassQuestionTranslationValue.setQuestion(question); 211 trainingControl.updateTrainingClassQuestionTranslationFromValue(trainingClassQuestionTranslationValue, partyPK); 212 } 213 } 214 215}